2011-08-18 80 views
1

我正在實現一個JSP,它需要運行jsp之前必須驗證的幾個參數。在JSP中驗證參數的最佳做法是什麼?

  1. 建議:使用 Taglibraries
  2. 建議驗證JSP中的參數:在過濾器

你覺得呢預解析參數?

編輯

謝謝你的很好的答案,但我不知道會是什麼的情況下,最好的做法你提供像谷歌圖表API服務,你不能指望這些參數進行檢查通過表單發送之前。 例如: https://chart.googleapis.com/chart?cht= & CHD = & CHS = & ... additional_parameters ...

回答

6

無兩者都不錯的方法。控制器/業務邏輯不屬於JSP(標籤)。過濾器幾乎是好的,但它不夠具體。這項工作應該由一個servlet完成。您將表單提交給servlet進行後處理,對嗎?這聽起來像你還沒有這樣做,答案本來是非常簡單的。

our servlets tag wiki page中,您可以找到一個hello world示例,它提供了一個使用JSP和Servlet來後處理表單提交的好方法。以下是相關的摘錄:

<input id="name" name="name" value="${fn:escapeXml(param.name)}"> 
<span class="error">${messages.name}</span> 

String name = request.getParameter("name"); 
if (name == null || name.trim().isEmpty()) { 
    messages.put("name", "Please enter name"); 
} 

// ... 

request.getRequestDispatcher("/WEB-INF/hello.jsp").forward(request, response); 

此外,存在MVC框架,從而消除所有的樣板(複製/重複)servlet代碼爲這種使用情況下,例如如JSF,Spring MVC,Wicket,Stripes,Struts2等。例如JSF它看起來就像這樣:

<h:inputText id="name" value="#{bean.name}" required="true" requiredMessage="Please enter name" /> 
<h:message for="name" /> 

就是這樣。 JSF的FacesServlet控制器servlet將驗證它是否已填充並在給定位置顯示(可配置)消息,而不需要定製Java代碼。你甚至可以將它移動到模型中,JSF也對JSR303 bean驗證也有透明的支持。例如。

<h:inputText id="name" value="#{bean.name}" /> 
<h:message for="name" /> 

@NotNull(message="Please enter name") 
private String name; 

更新按您編輯:

謝謝大家了很好的答案,但我想知道什麼是最好的做法如果你正在提供像谷歌圖表API的服務,你不能指望參數在發送之前通過表單檢查。例如:https://chart.googleapis.com/chart?cht=&chd=&chs=&...additional_parameters ...

只需使用一個servlet即可。唯一的區別是,您必須執行doGet()而不是doPost()的作業,並在必要時返回HTTP 400上的錯誤:)再次檢查our servlets tag wiki page以更好地理解其目的。或者更進一步,使用一個web服務框架,例如JAX-WS或JAX-RS,它們透明地執行此項工作,就像MVC框架對HTML頁面所做的那樣。

+0

非常好的答案,只是檢查了維基,它幫助了很多。也很喜歡你的答案...但有一點讓我有點困惑。 Web服務框架不像jax-ws或jax-rs應該提供SOAP,JSON或XML嗎?他們也可以提供HTML嗎? ps對評論點擊返回意外編輯感到抱歉 – Zounadire

+0

他們也可以提供HTML,但這不是他們唯一的意圖。您提到Google圖表API爲例。這是一個返回圖片的web服務。 – BalusC

+0

好的,現在我明白了:)謝謝。 – Zounadire

5

使用MVC框架(Spring MVC的,條紋,搭片2等),並在驗證控制器類的參數。每個MVC框架都支持參數驗證,並且您可以清楚地區分問題。

例子: Spring MVC的自動註冊JSR-303風格的參數驗證(如果你有一個JSR-303供應商,例如Hibernate的驗證器,在classpath)when using mvc:annotation-driven

+0

+1你們沒有一個建議是一個好地方。你應該分開你的觀點和你的邏輯。邏輯就是驗證應該發生的地方,當然有些東西是無效的,當然更新視圖。 –

+0

@Amir我想你的意思是「沒有任何OP的建議是一個好地方」 –

+0

對不起。我以爲我正在給OP寫評論。 D'oh –

相關問題