Servlet的重定向与错误信息相同的页面(Servlet redirect to same pag

2019-07-19 02:22发布

我有一个关于servlet的重定向到相同的初始页面的问题。 下面是场景:假设一个用户想要购买的物品,所以他填写金额并提交。 该表单提交到一个servlet和可用的数量在数据库中对现有的检查。 所以,如果订货的商品的数量大于可用更多的servlet重定向到相同的页面,但包含“产品无法使用”的消息。 所以我的问题是如何实现这种情况。 如何重定向到相同的初始页面错误信息。 我不想在这里使用AJAX。

这里是我想到的是:1.)我应该设置一个上下文属性如果产生错误,然后再次检查它在初始页面重新方向后显示,已设置的消息。

什么是这类事件的最佳做法?

Answer 1:

最常见的和推荐的方案(在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>


选项№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"));
        }
    }
}

相关阅读:

  • 如何选择合适的豆范围是什么?
  • java.lang.IllegalStateException:无法向前后反应一直致力于


文章来源: Servlet redirect to same page with error message