我正在实现一个JSP,它需要一些必须在运行jsp之前验证的参数。
您怎么看?
修改
感谢您提供了很好的答案,但我想知道如果您提供像Google图表API这样的服务,那么最好的做法是什么,在这种情况下,您不能指望在发送表单之前检查参数。 例: https://chart.googleapis.com/chart?cht=&安培; CHD =安培; CHS =安培; ... ... additional_parameters
答案 0 :(得分:8)
两者都不是好方法。控制器/业务逻辑不属于JSP(标记)。过滤器几乎是好的,但它不够具体。这项工作应该由servlet完成。您正在将表单提交给servlet进行后期处理,对吧?听起来你还没有这样做,否则答案就会很简单。
在our servlets tag wiki page中,您可以找到一个hello world示例,说明如何使用带有Servlet的JSP来对表单提交进行后处理。以下是相关摘录:
<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等。例如{{3}它看起来像这样:
<h:inputText id="name" value="#{bean.name}" required="true" requiredMessage="Please enter name" />
<h:message for="name" />
这就是全部。 JSF的FacesServlet
控制器servlet将验证它是否已填入并在给定位置显示(可配置)消息,而无需任何自定义Java代码。您甚至可以将其移至模型,JSF也对JSR303 bean验证提供透明支持。 E.g。
<h:inputText id="name" value="#{bean.name}" />
<h:message for="name" />
与
@NotNull(message="Please enter name")
private String name;
更新:
感谢您提供了良好的答案,但我想知道如果您提供像Google图表API这样的服务,那么最好的做法是什么,在这种情况下,您不能指望参数在表单之前被表单检查发送。例如:JSF ...
以同样的方式使用servlet。唯一的区别是你要在doGet()
而不是doPost()
中实现这项工作,并在必要时在错误时返回HTTP 400 :)再次检查https://chart.googleapis.com/chart?cht=&chd=&chs=&...additional_parameters以更好地了解其目的。或者更进一步,使用Web服务框架,例如JAX-WS或JAX-RS,它们像MVC框架一样透明地完成这项工作。
答案 1 :(得分:5)
使用MVC框架(Spring MVC,Stripes,Struts 2等)并验证控制器类中的参数。每个MVC框架都支持参数验证,您可以清楚地分离关注点。
示例: Spring MVC自动注册JSR-303样式参数验证(如果你有一个JSR-303提供程序,例如Hibernate-Validator,在类路径上)when using mvc:annotation-driven