Servlet重定向到同一页面,并显示错误消息

我有一个关于servlet重定向到同一初始页面的问题。 以下是场景:假设用户想要购买物品,那么他填写金额并提交。 表单将提交给servlet,并根据数据库中的可用数量检查可用数量。 因此,如果订购的商品数量超过可用商品数量,则servlet会重定向到同一页面,但会显示“商品不可用”等消息。 所以我的问题是如何实现这个案例。 如何使用错误消息重定向到相同的初始页面。 我不想在这里使用ajax。

以下是我如何将其视为:1。)如果生成错误,我应该设置上下文属性,然后在重定向后再次在初始页面中再次检查它并显示已设置的消息。

这类活动的最佳做法是什么?

最常见和推荐的方案(对于Java serlvets / JSP世界中的服务器端validation)是将一些错误消息设置为请求属性 (在请求范围内 ),然后使用表达式语言在JSP中输出此消息(请参阅下面的示例)。 如果未设置错误消息,则不会显示任何内容。

但是,当在请求中存储错误消息时,您应该将请求转发到初始页面。 重定向时设置请求属性是不合适的,因为如果使用重定向,它将是一个完全新的请求, 请求属性在请求之间重置

如果要将请求重定向到引用页面(您提交数据的页面),则可以在会话中(在会话范围内 )存储错误消息,即设置会话属性 。 但在这种情况下,您还需要在提交的请求正确时从会话中删除该属性 ,否则只要会话存在,就会出现错误消息。

至于上下文属性,它可用于整个Web应用程序( 应用程序范围 )和所有用户,并且只要Web应用程序存在,它就会存在,这对您的情况几乎没有用。 如果将错误消息设置为应用程序属性,则所有用户都可以看到它 ,而不仅仅是提交错误数据的用户。


好的,这是一个原始的例子。

web.xml中

   Test application  Order Servlet com.example.TestOrderServlet   Order Servlet /MakeOrder.do   

order.jsp

    Test Page    

Test page

${errorMessage}

Enter amount:

选项№1:将错误消息设置为请求属性

 package com.example; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.ServletException; import java.io.IOException; public class TestOrderServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { int amount = 0; try { amount = Integer.parseInt(request.getParameter("itemAmount")); } catch (NumberFormatException e) { // do something or whatever } if ((amount > 0) && (amount < 100)) { // an amount is OK request.getRequestDispatcher("/index.jsp").forward(request, response); } else { // invalid amount // Set some error message as a request attribute. if (amount <= 0) { request.setAttribute("errorMessage", "Please submit an amount of at least 1"); } if (amount > 100){ request.setAttribute("errorMessage", "Amount of items ordered is too big. No more than 100 is currently available."); } // get back to order.jsp page using forward request.getRequestDispatcher("/order.jsp").forward(request, response); } } } 

选项№2:将错误消息设置为会话属性

TestOrderServlet.java

 package com.example; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.ServletException; import java.io.IOException; public class TestOrderServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { int amount = 0; try { amount = Integer.parseInt(request.getParameter("itemAmount")); } catch (NumberFormatException e) { // do something or whatever } if ((amount > 0) && (amount < 100)) { // an amount is OK // If the session does not have an object bound with the specified name, the removeAttribute() method does nothing. request.getSession().removeAttribute("errorMessage"); request.getRequestDispatcher("/index.jsp").forward(request, response); } else { // invalid amount // Set some error message as a Session attribute. if (amount <= 0) { request.getSession().setAttribute("errorMessage", "Please submit an amount of at least 1"); } if (amount > 100){ request.getSession().setAttribute("errorMessage", "Amount of items ordered is too big. No more than 100 is currently available."); } // get back to the referer page using redirect response.sendRedirect(request.getHeader("Referer")); } } } 

相关阅读:

  • 如何选择合适的bean范围?
  • java.lang.IllegalStateException:响应提交后无法转发