Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Servlet重定向到带有错误消息的同一页面_Java_Jsp_Servlets_Redirect_Scope - Fatal编程技术网

Java Servlet重定向到带有错误消息的同一页面

Java Servlet重定向到带有错误消息的同一页面,java,jsp,servlets,redirect,scope,Java,Jsp,Servlets,Redirect,Scope,我有一个关于servlet重定向到同一初始页面的问题。 以下是场景: 假设一个用户想要购买一个项目,他填写金额并提交。表单被提交到servlet,并根据数据库中的可用数量检查可用数量。因此,如果订购的项目数量超过可用项目数量,servlet将重定向到同一页面,但会显示类似“item is unavailable”的消息。 所以我的问题是如何实施这个案例。如何重定向到带有错误消息的同一初始页面。我不想在这里使用ajax 我是这样认为的: 1.)如果生成错误,我应该设置上下文属性,然后在重新定向后在

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

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


此类事件的最佳实践是什么?

最常见和推荐的场景(对于Java serlvets/JSP world中的服务器端验证)是将一些错误消息设置为请求属性(在请求范围内),然后使用在JSP中输出此消息(参见下面的示例)。如果未设置错误消息,则不会显示任何内容

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

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

至于上下文属性,它意味着整个web应用程序(应用程序范围)和所有用户都可以使用,而且它的寿命与web应用程序的寿命一样长,这在您的情况下几乎没有用处。如果将错误消息设置为应用程序属性,则所有用户都会看到该消息,而不仅仅是提交错误数据的用户


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

web.xml


测试应用
订单Servlet
com.example.TestOrderServlet
订单Servlet
/MakeOrder.do

order.jsp


测试页
测试页
${errorMessage}
输入金额:


选项№1:将错误消息设置为请求属性
package.com.example;
导入javax.servlet.http.HttpServlet;
导入javax.servlet.http.HttpServletRequest;
导入javax.servlet.http.HttpServletResponse;
导入javax.servlet.ServletException;
导入java.io.IOException;
公共类TestOrderServlet扩展了HttpServlet{
受保护的void doPost(HttpServletRequest请求、HttpServletResponse响应)
抛出ServletException、IOException{
整数金额=0;
试一试{
amount=Integer.parseInt(request.getParameter(“itemAmount”);
}捕获(数字格式){
//做点什么
}
如果((金额>0)和(&(金额<100)){//金额是可以的
request.getRequestDispatcher(“/index.jsp”).forward(请求,响应);
}else{//无效金额
//将某些错误消息设置为请求属性。
如果(金额100){
request.setAttribute(“errorMessage”,“订购的物品数量太大。当前可用物品不超过100件。”);
}
//使用forward返回order.jsp页面
request.getRequestDispatcher(“/order.jsp”).forward(请求,响应);
}
}
}

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

package.com.example;
导入javax.servlet.http.HttpServlet;
导入javax.servlet.http.HttpServletRequest;
导入javax.servlet.http.HttpServletResponse;
导入javax.servlet.ServletException;
导入java.io.IOException;
公共类TestOrderServlet扩展了HttpServlet{
受保护的void doPost(HttpServletRequest请求、HttpServletResponse响应)
抛出ServletException、IOException{
整数金额=0;
试一试{
amount=Integer.parseInt(request.getParameter(“itemAmount”);
}捕获(数字格式){
//做点什么
}
如果((金额>0)和(&(金额<100)){//金额是可以的
//如果会话没有使用指定名称绑定对象,removeAttribute()方法将不执行任何操作。
request.getSession().removeAttribute(“errorMessage”);
request.getRequestDispatcher(“/index.jsp”).forward(请求,响应);
}else{//无效金额
//将某些错误消息设置为会话属性。
如果(金额100){
request.getSession().setAttribute(“errorMessage”,“订购的项目数量太大。当前可用的项目不超过100个。”);
}
//使用重定向返回到referer页面
sendRedirect(request.getHeader(“Referer”);
}
}
}

相关阅读:


将鼠标放在放置在问题上的标签上,直到出现一个黑框,然后单击其中的信息链接。这个问题在第一个Hello World示例中已经讨论了很长时间了。我确实会被重定向回我的登录页面,但如果我
<?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>
<!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);
        }
    }
}
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"));
        }
    }
}