web-dev-qa-db-fra.com

Comment éviter de resoumettre dans jsp lors de l'actualisation?

J'écris un programme, mais je rencontre un problème: Lorsque je rafraîchit la page jsp, le système va automatiquement soumettre à nouveau la page entière. moi ?

18
MemoryLeak

Voici une explication du problème ...

En cliquant sur le bouton "Soumettre" d'un formulaire, une requête est envoyée au serveur Web, qui inclut toutes les données entrées dans le formulaire. Non seulement l'URL, mais également les données de formulaire font partie de la demande, et le navigateur enregistre cette demande. Si l'utilisateur clique sur "Actualiser", le navigateur répète la demande en renvoyant à nouveau les mêmes URL et au serveur Web.

Mais les formulaires peuvent être soumis de deux manières différentes, GET ou POST, en fonction de l'attribut "method" de la balise "form". Il existe une convention selon laquelle une demande GET n'a pas d'effets secondaires; il récupère uniquement les données mais n'apporte aucune modification à la base de données. En revanche, si une requête modifie des données, elle doit toujours utiliser une requête POST. Comme je le disais, ce ne sont que des conventions, et il n'y a pas beaucoup de différence technique entre elles, mais une différence très importante est que les navigateurs avertiront l'utilisateur s'ils essayent de répéter un POST - un clic sur "rafraîchir" apparaît une boîte de dialogue avertissant l'utilisateur que cela peut entraîner la répétition d'une opération et confirmant qu'il souhaite réellement soumettre à nouveau. Le navigateur n’affiche pas cette confirmation lors de l’actualisation d’une requête GET.

Votre formulaire utilise-t-il la méthode GET, comme suspecté par @mk? Si tel est le cas, le changer en POST est la solution la plus simple, car cela signifie au moins que l'utilisateur est averti s'il tente d'actualiser.

Mais une meilleure solution est l’idiome POST + REDIRECT + GET suggéré par @cletus. Cela divise la mise à jour de la base de données (POST) et la vue (GET) en deux opérations. En cliquant sur Actualiser dans le navigateur, vous répétez simplement l'opération GET, qui n'a aucun effet secondaire.

19
Todd Owen

L'idiome que vous voulez ici est soit:

  1. POST + REDIRECT + GET ; ou
  2. Soumission de formulaire AJAX.

POST + REDIRECT + GET fonctionne comme ceci:

  1. Les soumissions de formulaire utilisent la méthode POST;
  2. Lorsque le JSP ou (espérons-le) servlet reçoit le POST, il fait tout ce qu'il doit faire (enregistre ou met à jour des données ou autre);
  3. Le servlet ou le JSP utilise ensuite un en-tête Location: HTTP pour rediriger l'utilisateur vers ce qui est probablement cette même URL.

L'avantage de ceci est que cliquer sur recharger ne renverra pas le formulaire. De plus, si vous cliquez sur le bouton Précédent du navigateur, vous ne recevrez pas de message "Soumettre à nouveau?" boite de dialogue.

Voici un exemple de JSP of this.

AJAX submit signifie qu'au lieu de renvoyer le formulaire au serveur au sens traditionnel, vous créez une demande AJAX vers le serveur avec les données du formulaire. Ce soumettre fait ce dont il a besoin. Cliquer sur recharger rechargera simplement la page. Il ne renverra pas la demande AJAX.

10
cletus

SI vous utilisez JSP au niveau du serveur et utilisez un servlet de contrôleur pour contrôler la direction de la page. Vous pouvez simplement changer le mode de direction de la page de redirection à redirection de page. De cette façon, vous pouvez empêcher la soumission de formulaire. cela serait utile à comprendre

cordialement!

0
didxga

N'utilisez pas GET pour soumettre ou modifier des données. Utilisez POST à la place. Vous voudrez changer votre formulaire pour lire 

<form action="test.jsp" method="get">

Voir http://www.google.com/search?q=get+post pour plus d'informations.

(Votre question est également un peu obscure. Voulez-vous dire rafraîchir dans le navigateur ou dans le conteneur (Tomcat, par exemple)? Qu'entendez-vous par renvoyer la page? Les pages ne sont pas soumises, les formulaires le sont. Quel système? J'ai deviné ce que vous signifiait, si vous vouliez dire autre chose, laissez-nous savoir.)

0
mk.

Nous pouvons utiliser Publier/Rediriger/Obtenir (PRG) modèle pour résoudre le problème de la soumission multiple de mêmes données. 

Cela fonctionne comme suit: 

La première fois qu'un utilisateur soumet un formulaire au serveur par la méthode POST ou GET , Nous mettons à jour l'état dans la base de données de l'application. 

Ensuite, nous envoyons une réponse de redirection pour envoyer une réponse au client. 

Ensuite, nous chargeons une vue en utilisant la commande GET. Il n'y a pas de données est Envoyé dans ceci. Etant donné qu’il s’agit d’une nouvelle page JSP, il est protégé de plusieurs fichiers Soumis. Le code qui traite la demande est idempotent. Donc, il Ne fait pas la même action deux fois pour la même demande. 

 enter image description here

0
Premraj

Voici la solution

@RequestMapping(value="masterrulescreation")
protected ModelAndView masterrules(HttpServletRequest request, HttpServletResponse     response) throws Exception {
    try {   

        if(request.getParameter("ruleCode")!=null && request.getParameter("ruleCode")!="") //check the primary key is not null ,if goes for submission
        {
        request.setCharacterEncoding("UTF-8");

        String xxx=request.getParameter("xxx");
        S
        boolean result=object.method(xxx);
        String message="";//reurning a messgae is sucess
        if(result==true)
        {
            message="Data Saved successfully";
        }
        else
        {
            message="Error while saving data";  
        }

        return  (new ModelAndView(getMasterrulescreation(),"message",message));
        }
        else //if no value in primary key redirect fresh page 
        {
            return  (new ModelAndView(getMasterrulescreation()));
        }
    }
    catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}   
0
alex john