一尘不染

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

jsp

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

  1. 建议:使用Taglibraries验证JSP内部的参数
  2. 建议:在过滤器中预先解析参数

你怎么看?

编辑

谢谢您的好的回答,但是我想知道如果您提供的服务是google chart API这样的服务,而您不能期望参数在发送之前已经过表单检查,那将是最佳做法。例如:
https://chart.googleapis.com/chart
cht =&chd =&chs =&…
additional_parameters …


阅读 275

收藏
2020-06-08

共1个答案

一尘不染

两者都不是好的方法。控制器/业务逻辑不属于JSP(标记)。过滤器几乎不错,但不够具体。该工作应由Servlet完成。您正在将表单提交给Servlet进行后处理,对吧?听起来您还没有这样做,否则答案很简单。

在我们的Servlets标签Wiki页面中,您可以找到一个世界案例,该示例是将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;

*根据您的修改进行 *更新

谢谢您的好的回答,但是我想知道如果您提供的服务是google chart API这样的服务,而您不能期望参数在发送之前已经过表单检查,那将是最佳做法。
示例:https//chart.googleapis.com/chart?cht
=&chd =&chs
=&


additional_parameters

只需以相同的方式使用servlet。唯一的区别是,您必须在其中实施作业,doGet()而不是doPost()在必要时返回HTTP 400:)再次,请检查我们的servlets标记wiki页面,以更好地了解其目的。或者更进一步,请使用Web服务框架,例如JAX-
WS或JAX-RS,它们像MVC框架对HTML页面所做的那样透明地完成此工作。

2020-06-08