2011-08-18 85 views
1

我正在实现一个JSP,它需要运行jsp之前必须验证的几个参数。在JSP中验证参数的最佳做法是什么?

  1. 建议:使用 Taglibraries
  2. 建议验证JSP中的参数:在过滤器

你觉得呢预解析参数?

编辑

谢谢你的很好的答案,但我不知道会是什么的情况下,最好的做法你提供像谷歌图表API服务,你不能指望这些参数进行检查通过表单发送之前。 例如: https://chart.googleapis.com/chart?cht= & CHD = & CHS = & ... additional_parameters ...

回答

6

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

+0

非常好的答案,只是检查了维基,它帮助了很多。也很喜欢你的答案...但有一点让我有点困惑。 Web服务框架不像jax-ws或jax-rs应该提供SOAP,JSON或XML吗?他们也可以提供HTML吗? ps对评论点击返回意外编辑感到抱歉 – Zounadire

+0

他们也可以提供HTML,但这不是他们唯一的意图。您提到Google图表API为例。这是一个返回图片的web服务。 – BalusC

+0

好的,现在我明白了:)谢谢。 – Zounadire

5

使用MVC框架(Spring MVC的,条纹,搭片2等),并在验证控制器类的参数。每个MVC框架都支持参数验证,并且您可以清楚地区分问题。

例子: Spring MVC的自动注册JSR-303风格的参数验证(如果你有一个JSR-303供应商,例如Hibernate的验证器,在classpath)when using mvc:annotation-driven

+0

+1你们没有一个建议是一个好地方。你应该分开你的观点和你的逻辑。逻辑就是验证应该发生的地方,当然有些东西是无效的,当然更新视图。 –

+0

@Amir我想你的意思是“没有任何OP的建议是一个好地方” –

+0

对不起。我以为我正在给OP写评论。 D'oh –

相关问题