我尝试使用JSP和servlet根据逻辑与表示分离的原则来执行表单处理,但目前看起来相当违反直觉。
到目前为止,我有一个简单的JSP页面,其中包含一个表单和一个jsp:usebean,用于将请求参数转换为java对象。 我使用JST'如果'检查调用方法。如果它是GET,我显示页面,如果是POST,我转发到验证servlet。
这个想法是servlet执行处理,然后在数据不正确时重定向到表单。
问题是,如果servlet进程发布,然后重定向到表单,那个表单将在无限循环中再次调用servlet,所以我需要将请求方法更改为" GET"转发之前。
另一种可能是首先调用servlet,然后将JSP文件作为视图调用。但这是一个很好的功能,并且在servlet中进行操作需要手动通过调用request.getParameter()来实现对象,这也意味着很多重复。参数名称,因此首先使用JSP的必要性。我可以使用JSP,然后转发到servlet,然后转到"视图" JSP,但对于单个"功能而言似乎有点单调乏味#34; JSP。因此,尽管付出了很多努力,我仍然在寻找一个简洁的解决方案。
人们如何应用" JSP中没有代码的原则"在实践中,同时保持"没有代码重复"原则 ?转发时是否可以更改请求方法?是否可以在Java代码中进行模拟?是JSP"方式"完成这个简单的用例只是丑陋的现代标准?我可能会使用很多变通方法,但我会尽可能地坚持标准。
答案 0 :(得分:1)
将servlet用作控制器。意思是,用户永远不会看到.jsp扩展名或JSP的任何其他映射URL。用户始终被发送到servlet的URL。然后servlet根据需要转发到JSP。实际上,您需要将jsp放在WEB-INF
中,以使用户无法通过控制器(即servlet)以其他方式到达那里。
这里的转发是以其正确的技术意义使用的,这意味着它将执行传递给后台的 em ,但是servlet的URL保留在地址栏中(这与重定向)。这确保了如果用户点击刷新,则servlet仍在控制执行流程。
确定。现在为你的逻辑:
如果请求是POST并且验证是Ok,那么servlet会处理它。
如果验证失败或请求是GET,则servlet转发到JSP。
你必须摆脱jsp:useBean,因为它与servlet不兼容。请参阅servlets info page的底部。
关于代码重复,我想你的意思是在servlet中调用request.getParameter()
,然后将其移动到request.setAttribute()
,然后在转发后读取JSP中的属性。好吧,如果你真的使用bean,你应该将所有参数放入bean并将bean设置为request.setAttribute()
,这样你就不会再在JSP中读取相同位置的参数了,因为你&#39 ; ll正在查看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的任何类型。在JSP中使用EL访问它时也是如此:您可以通过以下方式访问bean:servlet中的request.setAttribute("myBean", beanObj);
和JSP中的${myBean.memberName}
。