2009-08-23 18 views

risposta

17

Ecco una spiegazione del problema ...

Facendo clic sul pulsante "Invia" in un modulo invia una richiesta al server web, che include tutti i dati inseriti nel modulo. Non solo l'URL ma anche i dati del modulo fanno parte della richiesta e questa richiesta viene ricordata dal browser. Se l'utente fa clic su "Aggiorna", il browser ripete la richiesta, inviando di nuovo lo stesso URL e il modulo al server Web.

Ma i moduli possono essere inviati in due modi diversi, GET o POST, a seconda dell'attributo "metodo" del tag "form". C'è una convenzione secondo la quale una richiesta GET non ha effetti collaterali; recupera solo i dati ma non apporta alcuna modifica al database. D'altra parte, se una richiesta modifica i dati, dovrebbe sempre utilizzare una richiesta POST.Come ho detto, queste sono solo convenzioni e non c'è molta differenza tecnica tra di esse, ma una differenza molto importante è che i browser avvertiranno l'utente se tentano di ripetere un POST - facendo clic su "Aggiorna" verrà visualizzata una finestra di dialogo avvertendo l'utente che ciò potrebbe causare la ripetizione di un'operazione e confermando che desidera veramente inviarla di nuovo. Il browser non mostra questa conferma quando si aggiorna una richiesta GET.

Il modulo utilizza il metodo GET, come sospettato da @mk? Se è così, cambiarlo in POST è la soluzione più semplice, dal momento che questo significherà almeno che l'utente è avvisato se tenta di aggiornare.

Ma una soluzione migliore è l'idioma POST + REDIRECT + GET suggerito da @cletus. Questo divide l'aggiornamento del database (POST) e la vista (GET) in due operazioni. Facendo clic su Aggiorna nel browser, semplicemente si ripete il GET, che non ha effetti collaterali.

+0

Prima di tutto, grazie mille! Scriviamo noi stessi un framework MVC, quando inviamo questo modulo userà request.getRequestDispatcher (jspPath + "/" + nextPage) .forward (richiesta, risposta); per indirizzare alla pagina successiva, ciò causerà un nuovo problema di forma, sono ancora considerato una soluzione per risolverlo, qualsiasi raccomandazione sarà apprezzata. – MemoryLeak

+1

Invece del metodo forward(), è necessario utilizzare response.sendRedirect (jspPath + "/" + nextPage). –

+0

sì, ma temo che causerà altri problemi ... – MemoryLeak

0

Non utilizzare GET per inviare o modificare in altro modo i dati. Usa invece il POST. Ti consigliamo di modificare il modulo per leggere

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

Vedi http://www.google.com/search?q=get+post per maggiori informazioni.

(La tua domanda è anche un po 'oscura - intendi l'aggiornamento nel browser o nel contenitore (ad es. Tomcat)? Cosa intendi inviare di nuovo la pagina? Le pagine non vengono inviate, i moduli fanno. ho indovinato quello che volevi dire, se si intende qualcos'altro, fatecelo sapere)

+0

sì, la tua ipotesi è diritto assoluto, dal momento che ogni volta che aggiorna la pagina, sarà presentato il modulo, e il risultato in record duplicati nel database – MemoryLeak

9

L'idioma che si vuole qui è uno:.

  1. POST+REDIRECT+GET; oppure
  2. Invio modulo AJAX.

POST + REDIRECT + GET funziona così:

  1. invio di moduli utilizzano il metodo POST;
  2. Quando il JSP o (si spera) servlet riceve il POST, fa tutto ciò che deve fare (salva o aggiorna i dati o qualsiasi altra cosa);
  3. Il servlet o JSP utilizza quindi un'intestazione Location: HTTP per reindirizzare l'utente a quello che probabilmente è lo stesso URL.

Il vantaggio di questo è che facendo clic su Ricarica non si invia nuovamente il modulo. Inoltre, se fai clic sul pulsante Indietro del browser, non ti verrà chiesto "Invia di nuovo?" la finestra di dialogo.

Questo è un JSP example di questo.

L'invio AJAX significa che invece di inviare nuovamente il modulo al server nel senso tradizionale, si crea una richiesta AJAX sul server con i dati del modulo. Quella presentazione fa quello che serve. Cliccando su ricarica ricaricherai semplicemente la pagina. Non rinvierà la richiesta AJAX.

+0

1.POST + REDIRECT + OTTENERE, è molto buono, ma ho bisogno di inviare il modulo nella stessa pagina molte volte, se reindirizzamento sempre a un'altra pagina, è un problema, qualsiasi altra soluzione migliore? e, a proposito, voglio sapere, perché questo nuovo invio di moduli è successo? – MemoryLeak

+0

Non dovrebbe essere un problema. La pagina restituita da GET può includere lo stesso modulo; può anche essere la stessa pagina JSP; il modulo può anche essere popolato con i dati che l'utente ha appena inserito. La differenza è che l'aggiornamento della pagina non verrà interpretato dal server Web come invio del modulo. –

+0

Scriviamo noi stessi un framework MVC, quando inviamo questo modulo utilizzerà request.getRequestDispatcher (jspPath + "/" + nextPage) .forward (richiesta, risposta); per dirigere alla pagina successiva, questo causerà il problema di risentire la forma, io sono ancora in considerazione una soluzione per risolverlo, eventuali raccomandazioni saranno apprezzate. – MemoryLeak

0

SE si utilizza JSP sul lato server e si utilizza un servlet del controller per controllare l'orientamento della pagina. Puoi semplicemente cambiare la modalità di direzione della pagina da Forward a Page Redirection. In questo modo puoi impedire il reinvio del modulo. this would be userful to understand it

saluti!

0

Ecco la soluzione

@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; 
    } 
} 
Problemi correlati