2009-08-23 42 views

Respuesta

17

He aquí una explicación del problema ...

Al hacer clic en el botón "enviar" en un formulario envía una solicitud al servidor web, que incluye todos los datos introducidos en el formulario. No solo la URL, sino también los datos del formulario forman parte de la solicitud, y el navegador recuerda esta solicitud. Si el usuario hace clic en "actualizar", el navegador repite la solicitud, enviando la misma URL y datos de formulario al servidor web de nuevo.

Pero los formularios se pueden enviar de dos formas diferentes, GET o POST, dependiendo del atributo "método" de la etiqueta "formulario". Existe una convención de que una solicitud GET no tiene efectos secundarios; solo recupera datos pero no realiza ningún cambio en la base de datos. Por otro lado, si una solicitud cambia los datos, siempre debe usar una solicitud POST.Como ya he dicho, estos son sólo convenciones, y no hay mucha diferencia técnica entre ellos, pero una diferencia muy importante es que los navegadores advertirá al usuario si tratan de repetir un POST - clic en "refrescar" se abrirá un cuadro de diálogo advirtiendo al usuario que esto puede causar que se repita una operación y confirmando que realmente desea volver a enviarla. El navegador no muestra esta confirmación al actualizar una solicitud GET.

¿Su formulario utiliza el método GET, como sospecha @mk? Si es así, cambiarlo a POST es la solución más simple, ya que al menos esto significará que se advertirá al usuario si intenta actualizar.

Pero una mejor solución es la expresión POST + REDIRECT + GET sugerida por @cletus. Esto divide la actualización de la base de datos (POST) y la vista (GET) en dos operaciones. Al hacer clic en Actualizar en el navegador, simplemente se repite el GET, que no tiene efectos secundarios.

+0

Antes que nada, ¡muchas gracias! Escribimos un framework MVC nosotros mismos, cuando envíe este formulario utilizará request.getRequestDispatcher (jspPath + "/" + nextPage) .forward (solicitud, respuesta); para dirigir a la página siguiente, esto causará un problema de formulario de reenvío, todavía considero una solución para resolverlo, cualquier recomendación será apreciada. – MemoryLeak

+1

En lugar del método forward(), es necesario utilizar response.sendRedirect (JspPath + "/" + nextPage). –

+0

sí, pero me temo que causará otro problema ... – MemoryLeak

0

No utilice GET para enviar o cambiar datos. Use POST en su lugar. Usted querrá cambiar su forma de leer

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

Ver http://www.google.com/search?q=get+post para obtener más información.

(Su pregunta tampoco está clara, ¿quiere decir refrescante en el navegador o en el contenedor (por ejemplo, Tomcat)? ¿Qué quiere decir volver a enviar la página? Las páginas no se envían, los formularios lo hacen. supuse que lo que quería decir, si nos referimos otra cosa, avísenos)

+0

sí, su conjetura es correcta absoluta, ya que cada vez que actualiza la página, se envía el formulario, y el resultado en los registros duplicados en la base de datos – MemoryLeak

9

El idioma que usted quiere aquí es o bien:.

  1. POST+REDIRECT+GET; o
  2. Envío de formulario AJAX.

la POST + REDIRECT + GET funciona así:

  1. envíos de formularios utilizan el método POST;
  2. Cuando el JSP o (afortunadamente) servlet recibe el POST, hace lo que tiene que hacer (guarda o actualiza datos o lo que sea);
  3. El servlet o JSP luego utiliza un encabezado Ubicación: HTTP para redirigir al usuario a lo que probablemente sea la misma URL.

El beneficio de esto es que al hacer clic en volver a cargar no se volverá a enviar el formulario. Además, si hace clic en el botón de retroceso del navegador, no aparecerá el mensaje "¿enviar de nuevo?". caja de diálogo.

Aquí hay un JSP example de esto.

El envío de AJAX significa que en lugar de enviar el formulario de regreso al servidor en el sentido tradicional, crea una solicitud de AJAX de regreso al servidor con los datos del formulario. Ese envío hace lo que necesita hacer. Al hacer clic en recargar, simplemente volverás a cargar la página. No reenviará la solicitud de AJAX.

+0

1.POST + + REDIRECT GET, es muy bueno, pero necesito enviar el formulario en la misma página muchas veces, si siempre lo redirecciono a otra página, ¿hay algún problema, alguna otra solución mejor? y, por cierto, quiero saber, ¿por qué sucedió este reenvío de formularios? – MemoryLeak

+0

No debería ser un problema. La página devuelta por GET puede incluir el mismo formulario; incluso puede ser la misma página JSP; el formulario se puede llenar con los datos que el usuario acaba de ingresar. La diferencia es que refrescar la página no será interpretado por el servidor web como el envío del formulario. –

+0

Escribimos un framework MVC nosotros mismos, cuando envíe este formulario usará request.getRequestDispatcher (jspPath + "/" + nextPage) .forward (solicitud, respuesta); para dirigir a la página siguiente, esto hará que vuelva a enviar formulario problema, todavía estoy considero una solución para resolverlo, será apreciado ninguna recomendación. – MemoryLeak

0

SI está utilizando JSP en el servidor y utilizando un controlador Servlet para controlar la dirección de la página. Simplemente puede cambiar el modo de dirección de la página de Reenviar a Redirección de página. De esta forma puede evitar que se vuelva a enviar el Formulario. this would be userful to understand it

respetos!

0

Aquí está la solución

@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; 
    } 
} 
Cuestiones relacionadas