web-dev-qa-db-ja.com

エラーメッセージが表示された同じページへのサーブレットリダイレクト

同じ初期ページへのサーブレットのリダイレクトについて質問があります。シナリオは次のとおりです。ユーザーがアイテムを購入する場合、金額を入力して送信します。フォームがサーブレットに送信され、使用可能な量がデータベースで使用可能な量と照合されます。そのため、注文したアイテムの量が利用可能な量より多い場合、サーブレットは同じページにリダイレクトしますが、「item is unavailable」のようなメッセージが表示されます。私の質問は、このケースを実装する方法です。エラーメッセージを表示して同じ初期ページにリダイレクトする方法。ここではajaxを使いたくありません。

1.)エラーが発生した場合はコンテキスト属性を設定し、リダイレクト後に最初のページで再度確認し、設定されているメッセージを表示する必要があります。

この種のイベントのベストプラクティスは何ですか?

13
Vishal Anand

最も一般的で推奨されるシナリオ(Java serlvets/JSP worldでのサーバー側の検証)の場合、エラーメッセージをrequest attributerequest scope)そして Expression Language を使用してこのメ​​ッセージをJSPに出力します(以下の例を参照)。エラーメッセージが設定されていない場合-何も表示されません。

ただし、リクエストにエラーメッセージを保存する場合は、最初のページにリクエストを転送する必要があります。リダイレクトを使用する場合、完全に[〜#〜] new [〜#〜]リクエストになり、リクエスト属性は次の間にリセットされます。要求

リクエストのリダイレクトを参照ページ(データを送信したページ)にリダイレクトする場合は、エラーメッセージをセッションに保存できます(sessionスコープ)、つまりセッション属性を設定します。ただし、この場合は、送信されたリクエストが正しいときにセッションからその属性を削除するも必要です。そうしないと、セッションが存続している限りエラーメッセージが表示されます。

context attributeに関しては、Webアプリケーション全体(application scope)およびすべてのユーザーが利用できることを意図しています。さらに、 Webアプリケーションは存続しますが、これはほとんど役に立ちません。エラーメッセージをアプリケーション属性として設定した場合間違ったデータを送信したユーザーだけでなく、すべてのユーザーに表示されます


OK、これは基本的な例です。

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

関連資料:

39
informatik01