web-dev-qa-db-fra.com

Redirection de servlet vers la même page avec un message d'erreur

J'ai une question sur la redirection de servlet vers la même page initiale. Voici le scénario: Supposons qu'un utilisateur veuille acheter un article, afin qu'il remplisse le montant et le soumette. Le formulaire est soumis à une servlet et la quantité disponible est comparée à celle disponible dans la base de données. Donc, si le nombre d'articles commandés est supérieur à celui disponible, la servlet redirige vers la même page mais avec un message comme "l'article n'est pas disponible". Ma question est donc de savoir comment mettre en œuvre ce cas. Comment rediriger vers la même page initiale avec un message d'erreur. Je ne veux pas utiliser ajax ici.

Voici comment je l'ai pensé: 1.) dois-je définir un attribut de contexte si une erreur est générée, puis le vérifier à nouveau dans la page initiale après la redirection et afficher le message qui a été défini.

Quelles sont les meilleures pratiques pour ce type d'événements?

13
Vishal Anand

Le scénario le plus courant et recommandé (pour la validation côté serveur dans Java serlvets/JSP world) définit un message d'erreur en tant qu'attribut de demande (dans le portée de la demande) puis sortir ce message dans un JSP en utilisant Expression Language (voir l'exemple ci-dessous). Lorsque le message d'erreur n'est pas défini, rien ne s'affiche.

Mais lorsque vous stockez un message d'erreur dans une demande, vous devez transmettre une demande à la page initiale. La définition d'un attribut de requête ne convient pas lors de la redirection, car si vous utilisez une redirection, elle sera totalement [~ # ~] nouvelle [~ # ~] les attributs request et request sont réinitialisés entre les requêtes .

Si vous souhaitez rediriger une demande vers la page de référence (celle à partir de laquelle vous avez soumis des données), vous pouvez stocker un message d'erreur dans une session (dans le portée de la session), c'est-à-dire définir un attribut de session . Mais dans ce cas, vous devez également supprimer cet attribut de la session lorsque la demande soumise est correcte , car sinon un message d'erreur sera disponible aussi longtemps pendant la session.

Quant à l'attribut de contexte , il est censé être disponible pour l'ensemble de l'application Web ( portée de l'application) et pour TOUS utilisateurs, en plus il vit aussi longtemps que l'application Web vit, ce qui n'est guère utile dans votre cas. Si vous définissez un message d'erreur en tant qu'attribut d'application , il sera visible par TOUS les utilisateurs , pas seulement par celui qui a soumis les mauvaises données.


OK, voici un exemple primitif.

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>


Option №1: définir un message d'erreur comme attribut de demande

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: définir un message d'erreur comme attribut de session

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

Lecture connexe:

39
informatik01