2011-03-08 34 views
13

Tengo una forma que presente el usuario nombre y apellido usando la POST signin.htmlCómo pasar datos entre solicitudes de Post/Redirect/Get pattern en Spring MVC?

@RequestMapping(value="/signin.html",method = RequestMethod.POST) 
public ModelAndView submit(@Valid User user){ 
    ModelAndView mv = new ModelAndView("redirect:signin.html"); 
    //Business logic with user account 
    return mv; 
} 

Con el fin de resolver el doble problema que estoy presentar volver a dirigir a la misma asignación mediante petición GET.

@RequestMapping(value="/signin.html",method = RequestMethod.GET) 
public ModelAndView submitPRG(){ 
    ModelAndView mv = new ModelAndView("submitted"); 
    mv.addObject("message", "Submitted Correctly"); 
    return mv; 
} 

De esta manera resuelvo el problema de enviar dos veces.

Tengo algunas preguntas:

1) ¿Cómo puedo saber que GET solicitud en /signin.html procedentes de redirección y no ha sido solicitada por el usuario en el navegador? Simplemente me gustaría cerrar la opción para que el usuario explore http://server/signin.html y aparezca el mensaje "Enviado correctamente". Sé que puedo agregar algo como /signin.html?submitted=true, pero me gustaría hacerlo más limpio.

2) ¿hay alguna manera de pasar el objeto ModelAndView de submit() a submitPRG()?

O simplemente, ¿hay alguna otra forma de utilizar PRG en este caso?

Respuesta

4

¿Cómo puedo saber que GET solicitud en /signin.html procedentes de redirección y no fue solicitada por el usuario en el navegador?

  • Puede almacenar un marcador en su sesión de
  • Tome un vistazo al árbitro en la cabecera HTTP

Yo recomendaría el uso de algún tipo de mensajería basada en sesión para el "Enviado Correctamente "mensaje. Esto a veces se llama "flash". StackExchange los utiliza todo el tiempo (los mensajes que aparecen en la parte superior de la pantalla).

Gracias de antemano, pero ¿cómo puedo obtener referente de HttpServletRequest?

HttpServletRequest.getHeader("Referer") 
+1

Gracias de antemano, pero ¿cómo puedo obtener referencia de HttpServletRequest? –

17

El comportamiento que desea se denomina "alcance de flash". Por lo general, se implementa almacenando el mensaje que se mostrará después de redirigir en la sesión.

El equipo de Spring se compromete a implementarlo en Spring 3.1 (SPR-6464). Mientras tanto, puedes echar un vistazo a la implementación del alcance de flash en la muestra mvc-showcase, es bastante fácil, así que puedes hacerlo tú mismo.

El enfoque alternativo es agregar datos requeridos como parámetros para redirigir la URL. Tenga en cuenta que si su método de envío guarda el objeto modelo para que posteriormente pueda accederse mediante algún identificador, tiene sentido redirigir a la página que muestra ese objeto (es decir, /users.html?userId=... en lugar de /signin.html) y mostrar el mensaje "Enviado correctamente" en ese página del alcance del flash.

Por lo tanto, el osciloscopio se usa generalmente para pasar mensajes, no objetos de modelo.

+2

usted tiene que ser un poco cuidadoso uso de flash, sin embargo, ya que su consistencia temporal no es estrictamente garantizada.de los documentos de primavera: http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/mvc.html#mvc-flash-attributes Es probable que no sea un problema, pero es al menos algo de lo que debes estar consciente. – sanimalp

Cuestiones relacionadas