無兩者都不錯的方法。控制器/業務邏輯不屬於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頁面所做的那樣。
非常好的答案,只是檢查了維基,它幫助了很多。也很喜歡你的答案...但有一點讓我有點困惑。 Web服務框架不像jax-ws或jax-rs應該提供SOAP,JSON或XML嗎?他們也可以提供HTML嗎? ps對評論點擊返回意外編輯感到抱歉 – Zounadire
他們也可以提供HTML,但這不是他們唯一的意圖。您提到Google圖表API爲例。這是一個返回圖片的web服務。 – BalusC
好的,現在我明白了:)謝謝。 – Zounadire