简体   繁体   English

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

[英]Servlet redirect to same page with error message

I have a question about servlet redirection to the same initial page. 我有一个关于servlet重定向到同一初始页面的问题。 The following is the scenario: Suppose a user want to buy an item, so he fills in the amount and submits it. 以下是场景:假设用户想要购买物品,那么他填写金额并提交。 The form is submitted to a servlet and the quantity available is checked against the available in the database. 表单将提交给servlet,并根据数据库中的可用数量检查可用数量。 So if the amount of items ordered is more than the available the servlet redirects to the same page but with a message like "item is unavailable". 因此,如果订购的商品数量超过可用数量,则servlet会重定向到同一页面,但会显示“商品不可用”等消息。 So my question is how to implement this case. 所以我的问题是如何实现这个案例。 How to redirect to the same initial page with an error message. 如何使用错误消息重定向到同一初始页面。 I don't want to use ajax here. 我不想在这里使用ajax。

Here is how I have thought of it as : 1.)should I set a context attribute if error is generated and then check it again in initial page after re-direction and show the message that has been set. 以下是我如何将其视为:1。)如果生成错误,我应该设置上下文属性,然后在重定向后再次在初始页面中检查它并显示已设置的消息。

What are the best practices for this kind of events? 这类活动的最佳做法是什么?

The most common and recommended scenario (for the server side validation in Java serlvets/JSP world) is setting some error message as a request attribute (in the request scope ) and then outputting this message in a JSP using Expression Language (see the example below). 最常见和推荐的场景(对于Java serlvets / JSP世界中的服务器端验证)是将一些错误消息设置为请求属性 (在请求范围内 ),然后使用表达式语言在JSP中输出此消息(请参阅下面的示例)。 When the error message is not set - nothing will be shown. 如果未设置错误消息,则不会显示任何内容。

But when storing an error message in a request, you should forward a request to the initial page. 但是,当在请求中存储错误消息时,您应该将请求转发到初始页面。 Setting a request attribute is not suitable when redirecting, because if you use a redirect it will be a totally NEW request and request attributes are reset between requests . 重定向时设置请求属性是不合适的,因为如果使用重定向,它将是一个完全新的请求, 请求属性在请求之间重置

If you want to redirect a request to the referring page (the one from which you submitted data) then you can store an error message in a session (in the session scope ), ie set a session attribute . 如果要将请求重定向到引用页面(您提交数据的页面),则可以在会话中(在会话范围内 )存储错误消息,即设置会话属性 But in this case, you also need to remove that attribute from the session when the submitted request is correct , because otherwise an error message will be available as long as the session lives. 但在这种情况下,您还需要在提交的请求正确时从会话中删除该属性 ,否则只要会话存在,就会出现错误消息。

As for the context attribute it is meant to be available to the whole web application ( application scope ) and for ALL users, plus it lives as long as the web application lives, which is hardly useful in your case. 至于上下文属性,它可用于整个Web应用程序( 应用程序范围 )和所有用户,并且只要Web应用程序存在,它就会存在,这对您的情况几乎没有用。 If you set an error message as an application attribute it will be visible to ALL users , not only to the one that submitted the wrong data. 如果将错误消息设置为应用程序属性,则所有用户都可以看到它 ,而不仅仅是提交错误数据的用户。


OK, here is a primitive example. 好的,这是一个原始的例子。

web.xml 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 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>


Option №1: setting an error message as a request attribute 选项№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);
        }
    }
}


Option №2: setting an error message as a session attribute 选项№2:将错误消息设置为会话属性

TestOrderServlet.java 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"));
        }
    }
}

Related reading: 相关阅读:

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM