无两者都不错的方法。控制器/业务逻辑不属于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