2009-08-23 14 views

Odpowiedz

17

Oto wyjaśnienie problemu ...

Kliknięcie przycisku „Wyślij” na formularzu wysyła żądanie do serwera WWW, który zawiera wszystkie dane wprowadzone w formularzu. Nie tylko adres URL, ale także dane formularza są częścią żądania, a to żądanie jest zapamiętywane przez przeglądarkę. Jeśli użytkownik kliknie przycisk "odśwież", przeglądarka powtórzy żądanie, ponownie wysyłając ten sam adres URL: i do serwera sieciowego.

Jednak formularze można przesyłać na dwa sposoby: GET lub POST, w zależności od atrybutu "method" znacznika "form". Istnieje konwencja, że ​​żądanie GET nie ma skutków ubocznych; pobiera tylko dane, ale nie wprowadza żadnych zmian w bazie danych. Z drugiej strony, jeśli żądanie zmienia dane, powinno zawsze używać żądania POST.Jak już powiedziałem, są to tylko konwencje i nie ma między nimi dużej technicznej różnicy, ale bardzo ważną różnicą jest to, że przeglądarki ostrzegają użytkownika, jeśli próbują powtórzyć POST - kliknięcie "odśwież" spowoduje wyświetlenie okna dialogowego ostrzega użytkownika, że ​​może to spowodować powtórzenie operacji i potwierdzenie, że naprawdę chcą ponownie przesłać. Przeglądarka nie wyświetla tego potwierdzenia podczas odświeżania żądania GET.

Czy twój formularz używa metody GET, jak podejrzewa @mk? Jeśli tak, zmiana na POST jest najprostszym rozwiązaniem, ponieważ oznacza to przynajmniej, że użytkownik zostanie ostrzeżony, jeśli spróbuje odświeżyć.

Ale lepszym rozwiązaniem jest idiom POST + REDIRECT + GET zasugerowany przez @cletus. Powoduje to podzielenie aktualizacji bazy danych (POST) i widoku (GET) na dwie operacje. Kliknięcie przycisku Odśwież na przeglądarce powoduje jedynie powtórzenie polecenia GET, które nie ma żadnych skutków ubocznych.

+0

Przede wszystkim dziękuję bardzo! Piszemy ramy MVC samodzielnie, po przesłaniu tego formularza użyje request.getRequestDispatcher (jspPath + "/" + nextPage) .forward (żądanie, odpowiedź); aby przejść do następnej strony, spowoduje to ponowne zgłoszenie problemu, nadal uważam, że jest to rozwiązanie, aby go rozwiązać, wszelkie zalecenia zostaną docenione. – MemoryLeak

+1

Zamiast metody forward() należy użyć metody response.sendRedirect (jspPath + "/" + nextPage). –

+0

tak, ale obawiam się, że spowoduje to inny problem ... – MemoryLeak

0

Nie należy używać GET do przesyłania lub zmieniania danych w inny sposób. Zamiast tego użyj POST. Będziemy chcieli, aby zmienić formę czytać

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

Zobacz http://www.google.com/search?q=get+post aby uzyskać więcej informacji.

(Twoje pytanie jest również nieco niejasne - masz na myśli odświeżanie w przeglądarce lub w kontenerze (np. Tomcat)? Co masz na myśli, aby ponownie przesłać stronę? Strony nie są wysyłane, formularze do. Który system? domyślałem się, co masz na myśli, jeśli masz na myśli coś innego, daj nam znać)

+0

tak, Twój przypuszczenie jest prawem absolutnym, ponieważ za każdym razem i odśwież stronę, formularz zostanie złożony, i spowodować zduplikowanych rekordów w bazie – MemoryLeak

9

idiom chcesz tu jest albo:.

  1. POST+REDIRECT+GET; lub
  2. Zgłoszenie formularza AJAX.

POST + przekierowanie + Odbierz działa tak:

  1. zgłaszanie formularzy użyciu metody POST;
  2. Gdy serwlet JSP lub (miejmy nadzieję) odbiera POST, robi to, co trzeba (zapisuje lub aktualizuje dane lub cokolwiek innego);
  3. Serwlet lub strona JSP używa nagłówka Location: HTTP do przekierowania użytkownika do prawdopodobnie tego samego adresu URL.

Zaletą tego jest to, że ponowne kliknięcie przycisku nie spowoduje ponownego przesłania formularza. Również, jeśli klikniesz przycisk powrotu do przeglądarki, nie pojawi się pytanie "Prześlij ponownie?" Okno dialogowe.

Oto JSP example tego.

Przesyłanie AJAX oznacza, że ​​zamiast przesłać formularz z powrotem do serwera w tradycyjnym sensie, należy utworzyć żądanie AJAX z powrotem do serwera z danymi formularza. To zgłoszenie robi to, czego potrzebuje. Kliknięcie przeładowania po prostu przeładuje stronę. Nie wyśle ​​ponownie żądania AJAX.

+0

1.POST + REDIRECT + GET, jest bardzo dobry, ale muszę wielokrotnie przesyłać formularz na tej samej stronie, jeśli zawsze przekierowuję na inną stronę, to jest problem, jakieś inne lepsze rozwiązanie? i przy okazji, chcę wiedzieć, dlaczego to ponowne złożenie formularzy się stało? – MemoryLeak

+0

Nie powinno to stanowić problemu. Strona zwrócona przez GET może zawierać ten sam formularz; może to być nawet ta sama strona JSP; Formularz może zostać wypełniony danymi, które właśnie wprowadził użytkownik. Różnica polega na tym, że odświeżenie strony nie zostanie zinterpretowane przez serwer WWW jako przesłanie formularza. –

+0

Sami piszemy ramki MVC, po przesłaniu tego formularza użyjemy request.getRequestDispatcher (jspPath + "/" + nextPage) .forward (request, response); , aby przejść do następnej strony, spowoduje to problem z ponownym przesłaniem formularza, nadal uważam, że jest to rozwiązanie, aby je rozwiązać, wszelkie zalecenia zostaną docenione. – MemoryLeak

0

JEŚLI używasz JSP na serwerze i używasz kontrolera Servlet do kontrolowania kierunku strony. Możesz po prostu zmienić tryb kierunku strony z Przekieruj na Przekierowanie strony. W ten sposób możesz zapobiec ponownemu przesłaniu formularza. this would be userful to understand it

pozdrowienia!

0

Oto rozwiązanie

@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; 
    } 
} 
Powiązane problemy