使用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中。