在JSP中验证参数的最佳实践是什么?

时间:2011-08-18 14:50:32

标签: java validation jsp

我正在实现一个JSP,它需要一些必须在运行jsp之前验证的参数。

  1. 建议:使用验证JSP内部的参数 Taglibraries
  2. 建议:预先解析过滤器中的参数
  3. 您怎么看?

    修改

    感谢您提供了很好的答案,但我想知道如果您提供像Google图表API这样的服务,那么最好的做法是什么,在这种情况下,您不能指望在发送表单之前检查参数。 例: https://chart.googleapis.com/chart?cht=&安培; CHD =安培; CHS =安培; ... ... additional_parameters

2 个答案:

答案 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