Vis*_*and 13 java redirect jsp scope servlets
我有一个关于servlet重定向到同一初始页面的问题.以下是场景:假设用户想要购买物品,那么他填写金额并提交.表单将提交给servlet,并根据数据库中的可用数量检查可用数量.因此,如果订购的商品数量超过可用数量,则servlet会重定向到同一页面,但会显示"商品不可用"等消息.所以我的问题是如何实现这个案例.如何使用错误消息重定向到同一初始页面.我不想在这里使用ajax.
以下是我如何将其视为:1.)如果生成错误,我应该设置上下文属性,然后在重定向后再次在初始页面中检查它并显示已设置的消息.
这类活动的最佳做法是什么?
inf*_*k01 39
最常见和推荐的场景(对于Java serlvets/JSP世界中的服务器端验证)是将一些错误消息设置为请求属性(在请求范围内),然后使用表达式语言在JSP中输出此消息(请参阅下面的示例).如果未设置错误消息,则不会显示任何内容.
但是,当在请求中存储错误消息时,您应该将请求转发到初始页面.重定向时设置请求属性是不合适的,因为如果使用重定向,它将是一个完全新的请求,请求属性在请求之间重置.
如果要将请求重定向到引用页面(您提交数据的页面),则可以在会话中(在会话范围内)存储错误消息,即设置会话属性.但在这种情况下,您还需要在提交的请求正确时从会话中删除该属性,否则只要会话存在,就会出现错误消息.
至于上下文属性,它可用于整个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"));
        }
    }
}
相关阅读:
| 归档时间: | 
 | 
| 查看次数: | 74019 次 | 
| 最近记录: |