我有一个关于将servlet重定向到同一初始页面的问题。场景如下:假设用户想要购买一件商品,那么他填写了金额并提交了。将该表单提交给Servlet,并根据数据库中的可用数量检查可用数量。因此,如果订购的商品数量大于可用商品数量,则servlet重定向到同一页面,但显示诸如“商品不可用”之类的消息。所以我的问题是如何实施这种情况。如何使用错误消息重定向到同一初始页面。我不想在这里使用ajax。
这是我的想法:1.)如果发生错误,我应该设置一个上下文属性,然后在重定向后在初始页面中再次检查它并显示已设置的消息。
此类活动的最佳做法是什么?
最常见和推荐的方案(用于Java脚本/ JSP世界中的服务器端验证)是将一些错误消息设置为 请求属性 (在 请求范围内),然后使用表达式语言在JSP中输出此消息(请参见下面的示例))。未设置错误消息时-将不会显示任何内容。
但是在请求中存储错误消息时,应将 请求转发 到初始页面。重定向时,设置请求属性是不合适的,因为如果使用重定向,它将是 全新 请求,并且 请求之间的请求属性会重置 。
如果要将 请求重定向 到引荐页(从中提交数据 的请求 ),则可以在会话中(在 会话范围内 )存储错误消息,即设置 会话属性 。但是在这种情况下, 当提交的请求正确时 ,您还需要 从会话中删除该属性 ,因为否则,只要会话存在,就会显示一条错误消息。
至于 context属性, 它意味着整个Web应用程序( 应用程序范围 )和所有用户都可以使用,此外,它只要Web应用程序存在就可以使用,这在您的情况下几乎没有用。如果将错误消息设置为应用程序属性 ,则 该错误消息将对所有用户可见 ,而不仅仅是提交错误数据的用户。
好的,这是一个原始示例。
web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <display-name>Test application</display-name> <servlet> <servlet-name>Order Servlet</servlet-name> <servlet-class>com.example.TestOrderServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>Order Servlet</servlet-name> <url-pattern>/MakeOrder.do</url-pattern> </servlet-mapping> </web-app>
order.jsp
<!DOCTYPE html> <html> <head> <title>Test Page</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> </head> <body> <h1>Test page</h1> <form action="MakeOrder.do" method="post"> <div style="color: #FF0000;">${errorMessage}</div> <p>Enter amount: <input type="text" name="itemAmount" /></p> <input type="submit" value="Submit Data" /> </form> </body> </html>
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); } } }
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")); } } }