2014-11-24 75 views
0

我试图根据从表示中分离逻辑的原则来使用JSP和servlet来执行表单处理,但是现在看起来相当不合常理。在servlet中验证的JSP表格

到目前为止,我有一个简单的JSP页面,一个表单和一个jsp:usebean将请求参数存入Java对象。 我使用JST'if'来检查调用方法。如果它是GET,则显示该页面,如果它是POST,则转发到验证的servlet。

想法是,servlet执行处理,然后在数据不正确时重定向到表单。

问题是,如果servlet进程发布,然后重定向到表单,那么表单将在无限循环中再次调用servlet,因此我需要在转发之前将请求方法更改为“GET”。

另一个可能在于先调用一个servlet,然后调用该JSP文件作为视图。但是这是一个很好的特性,并且在servlet中通过调用request.getParameter()来手动实现对象的实例化,这也意味着大量的重复操作。到参数名称,因此首先使用JSP的必要性。我可以使用JSP,然后转发到servlet,然后转到“视图”JSP,但对于JSP的单个“特性”来说,这看起来有点乏味。所以尽管付出了很多努力,我仍然在寻找一个完美的解决方案。

在维护“无代码重复”原则的同时,人们在实践中如何应用“无代码JSP”的原则?转发时是否可以更改请求方式?是否有可能在Java代码中模拟?用现代标准来完成这个简单用例丑陋的JSP“方式”是什么?我可能会使用很多解决方法,但我试图尽可能地遵守标准。

回答

0

使用servlet作为控制器。这意味着,用户从不会看到.jsp扩展名或JSP的任何其他映射URL。用户总是被发送到servlet的URL。然后,servlet根据需要转发到JSP。实际上,你会希望将你的jsp放在WEB-INF中,以使用户无法通过除控制器(即servlet)之外的其他方式到达那里。

正向这里以正确的技术意义上被使用,这意味着它通过执行到JSP 背景但servlet的URL停留在地址栏(这是一个非常重定向不同)。这确保了如果用户点击刷新,servlet仍然在控制执行流程。

好的。现在为您的逻辑:

如果请求是POST和验证是好的,那么servlet处理它。

如果验证失败或请求是GET,则servlet将转发到JSP。

您将不得不摆脱jsp:useBean,因为它与servlet不兼容。请参阅servlets info page的底部。

至于代码重复,我想你的意思是在servlet中调用request.getParameter(),然后将其移动到request.setAttribute(),然后在转发后读取JSP中的属性。那么,如果你真的在使用一个bean,你应该把所有的参数放到这个bean中,并将这个bean设置成request.setAttribute(),这样你就不会再从JSP中的同一个地方读取参数了,因为你会看到bean没有请求参数....所以它没有代码重复。(这也说明你更换过时的jsp:useBean的使用)

所以让我们从servlet的信息页面这个例子。在servlet:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    // Preprocess request: load list of products for display in JSP. 
    List<Product> products = productService.list(); 
    request.setAttribute("products", products); 
    request.getRequestDispatcher("/WEB-INF/products.jsp").forward(request, response); 
} 

在JSP:

 <c:forEach items="${products}" var="product"> 
      <tr> 
       <td>${product.id}</td> 
       <td><c:out value="${product.name}" /></td> 
       <td><c:out value="${product.description}" /></td> 
       <td><fmt:formatNumber value="${product.price}" type="currency" /></td> 
      </tr> 
     </c:forEach> 

查看的servlet是如何创建一个名为products一个对象,并把它放在请求属性?你会做同样的事情,但在这里,而不是一个列表,它会是你的bean是什么类型。而同样在EL在JSP访问它时:你会访问你的bean的方法:在servlet的request.setAttribute("myBean", beanObj);${myBean.memberName}在JSP中。