webentwicklung-frage-antwort-db.com.de

Wie vermeide ich das erneute Übermitteln von JSPs beim Aktualisieren?

Ich schreibe ein Programm, aber ich stoße auf ein Problem: Wenn ich die JSP-Seite aktualisiere, wird die gesamte Seite vom System automatisch erneut übermittelt, und ich weiß nicht, wie ich das vermeiden soll. Kann mir jemand helfen?

18
MemoryLeak

Hier ist eine Erklärung des Problems ...

Durch Klicken auf die Schaltfläche "Abschicken" in einem Formular wird eine Anfrage an den Webserver gesendet, der alle im Formular eingegebenen Daten enthält. Nicht nur die URL, sondern auch die Formulardaten sind Teil der Anfrage, und der Browser erinnert sich an diese Anfrage. Wenn der Benutzer auf "Aktualisieren" klickt, wiederholt der Browser die Anfrage und sendet dieselben URL und form-Daten erneut an den Webserver.

Formulare können jedoch auf zwei verschiedene Arten übermittelt werden, GET oder POST, abhängig vom Attribut "method" des Tags "form". Es gibt eine Konvention, dass eine GET-Anfrage keine Nebenwirkungen hat. Es ruft nur Daten ab, nimmt jedoch keine Änderungen an der Datenbank vor. Wenn dagegen eine Anforderung Daten ändert, sollte sie immer eine POST -Anforderung verwenden. Wie gesagt, das sind nur Konventionen, und es gibt keinen großen technischen Unterschied zwischen ihnen, aber ein sehr wichtiger Unterschied ist, dass Browser den Benutzer warnen, wenn sie versuchen, ein POST zu wiederholen. Es erscheint ein Dialogfenster, in dem der Benutzer gewarnt wird, dass dies dazu führen kann, dass ein Vorgang wiederholt wird, und bestätigt, dass er wirklich erneut einreichen möchte. Der Browser zeigt diese Bestätigung nicht an, wenn eine GET-Anfrage aktualisiert wird.

Verwendet Ihr Formular die GET-Methode, wie von @mk vermutet? Wenn dies der Fall ist, ist die Änderung in POST die einfachste Lösung, da dies zumindest bedeutet, dass der Benutzer gewarnt wird, wenn er versucht, eine Aktualisierung durchzuführen.

Eine bessere Lösung ist jedoch das von @cletus vorgeschlagene POST + REDIRECT + GET-Idiom. Dadurch werden das Datenbank-Update (POST) und die Sicht (GET) in zwei Vorgänge aufgeteilt. Wenn Sie im Browser auf "Aktualisieren" klicken, wird lediglich das GET wiederholt, was keine Nebenwirkungen hat.

19
Todd Owen

Die Idiom, die Sie hier wollen, ist entweder:

  1. POST + REDIRECT + GET ; oder
  2. AJAX-Formulareinreichung.

POST + REDIRECT + GET funktioniert folgendermaßen:

  1. Formulareinreichungen verwenden die Methode POST;
  2. Wenn die JSP oder das (hoffentlich) Servlet den POST empfängt, tut sie alles, was sie tun muss (speichert oder aktualisiert Daten oder was auch immer).
  3. Das Servlet oder die JSP verwenden dann einen Location: HTTP-Header, um den Benutzer zu der wahrscheinlich gleichen URL umzuleiten.

Dies hat den Vorteil, dass Sie beim erneuten Senden des Formulars das Formular nicht erneut senden. Wenn Sie auf die Schaltfläche "Zurück" des Browsers klicken, werden Sie nicht aufgefordert, "Erneut senden?" Dialogbox.

Hier ist ein JSP-Beispiel davon.

Das AJAX Submit bedeutet, dass Sie, anstatt das Formular im herkömmlichen Sinn an den Server zurückzuschicken, eine AJAX -Anforderung mit den Formulardaten an den Server erstellen. Das Submit macht, was es braucht. Durch Klicken auf Neu laden wird die Seite einfach neu geladen. Die Anforderung AJAX wird nicht erneut gesendet.

10
cletus

WENN Sie JSP auf der Serverseite verwenden und ein Controller-Servlet zur Steuerung der Seitenrichtung verwenden. Sie können den Seitenrichtungsmodus einfach von Vorwärts auf Seitenumleitung umstellen. Auf diese Weise können Sie das erneute Senden von Formularen verhindern. das wäre nützlich zu verstehen

grüße!

0
didxga

Verwenden Sie GET nicht zum Senden oder anderweitigen Ändern von Daten. Verwenden Sie stattdessen POST. Sie möchten Ihr Formular ändern, um es zu lesen 

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

Weitere Informationen finden Sie unter http://www.google.com/search?q=get+post .

(Ihre Frage ist auch ein bisschen unklar - bedeutet das Aktualisieren im Browser oder im Container (z. B. Tomcat)? Was meinen Sie damit, die Seite erneut zu übermitteln? Seiten werden nicht übermittelt, Formulare werden verwendet. Welches System? bedeutet, wenn du etwas anderes meinst, lass es uns wissen.)

0
mk.

Es funktioniert mit dem folgenden Skript.

<script>
if ( window.history.replaceState ) {
  window.history.replaceState( null, null, window.location.href );
}
</script>
0
Ganesh Giri

Wir können das Muster Post/Redirect/Get (PRG) verwenden, um das Problem der - Mehrfacheinreichung derselben Daten zu lösen. 

Es funktioniert wie folgt:  

Wenn ein Benutzer zum ersten Mal ein Formular mit der Methode POST oder GET An den Server sendet, wird der Status in der Anwendungsdatenbank aktualisiert. 

Dann senden wir eine Antwortantwort, um die Antwort an den Client zu senden. 

Dann laden wir eine Ansicht mit dem Befehl GET. Es werden keine Daten Gesendet. Da dies eine neue JSP-Seite ist, ist sie vor mehrfachen Einsendungen sicher. Der Code, der die Anforderung verarbeitet, ist idempotent. Also führt Dieselbe Aktion nicht zweimal für dieselbe Anfrage aus. 

 enter image description here

0
Premraj

Hier ist die Lösung

@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