2012-08-14 10 views
11

Estoy usando Spring 3.1. Tengo una función de controlador que tiene en un objeto de comando (un soporte de datos) enviados a través de un formulario y hace algún procesamiento:Spring-MVC 3.1: Reenviar una solicitud de una función de controlador a otra

@RequestMapping(value = "/results", method = RequestMethod.POST) 
public String toResultsScreen(@ModelAttribute("ssdh") SearchScreenDataHolder ssdh, 
            BindingResult bindingResult,  
            ModelMap model,     
            HttpSession session) { 

    if (bindingResult.hasErrors()) { 
     logger.debug("Error returning to /search screen"); 
     return "search"; 
    } 

    netView = "results"; 

    // do stuff 

    return nextView;   

} // end function 

algún usuario quisiera hacer mediante programación Enlaces para obtener información del sitio hacia fuera y me gustaría configurar otro controlador que pueda manejar esa solicitud. Crearía una nueva instancia de ese objeto de comando (ssdh) y lo poblaría con los parámetros enviados a través de la solicitud GET. Luego se lo pasaría al manejador de arriba. Algo como esto:

@RequestMapping(value = "/pubresult") 
public String toPublicResultsScreen(ModelMap model,  
            HttpSession session,    
            @RequestParam (required=true) String LNAME, 
            @RequestParam (required=false)String FNAME){ 

    Search search = new Search(usertype); 

    // Capture the search parameters sent by HTTP 
    ssdh.setLast_name(LNAME); 
    ssdh.setFirst_name(FNAME); 

    // To Do: "forward this data holder, ssdh to the controller function quoted first 

    return nextView;   

} // end function 

Mi pregunta es ¿cómo puedo enviar mi objeto del contenedor de datos/órdenes a la primera función del controlador de tal manera que no tengo para alterar el código para la primera Funciton controlador de alguna manera?

Respuesta

17

Puede usar el objeto RedirectAttributes que se introdujo en Spring MVC 3.1 y rellenarlo con los datos que desea conservar para la redirección. Llamado patrón PRG (POST/Redirect/GET).

@RequestMapping(value="/saveUserDetails.action", method=RequestMethod.POST) 
public String greetingsAction(@Validated User user,RedirectAttributes redirectAttributes){ 
    //setting attributes 
    redirectAttributes.addFlashAttribute("firstName", user.getFirstName()); 
    redirectAttributes.addFlashAttribute("lastName", user.getLastName()) 
    return "redirect:success.html"; 
} 

Escribí un artículo técnico sobre cómo usarlo. Creo que va a dar más detalles:

http://www.tikalk.com/java/redirectattributes-new-feature-spring-mvc-31

+0

+1 Gran me ha ayudado mucho – Jayanth

+1

@ danny.lesnik El enlace http://www.tikalk.com/java/redirectattributes-new-feature-spring-mvc-31 que nos ha proporcionado se rompe . ¿Lo actualizará con un enlace de trabajo? – OO7

+0

¿Por qué tengo que hacer este evento con un reenvío? – FelipeKunzler

7

Usted debe ser capaz de establecer el SSDH en un ModelAttribute y simplemente hacia adelante que hacia atrás, de esta manera, la RequestDispatcher debe ser capaz de asignar de nuevo a la /results manejador:

@RequestMapping(value = "/pubresult") 
public String toPublicResultsScreen(ModelMap model,  
            HttpSession session,    
            @RequestParam (required=true) String LNAME, 
            @RequestParam (required=false)String FNAME, Model model){ 

    Search search = new Search(usertype); 
    // Capture the search parameters sent by HTTP 
    ssdh.setLast_name(LNAME); 
    ssdh.setFirst_name(FNAME); 
    model.addAttribute("ssdh", ssdh); 

    return "forward:/results";   

} 
+0

Probé esto. La función del controlador que deseo reenviar para manejar las solicitudes POST. Cuando trato de reenviar desde la función en el ejemplo anterior, que hace las solicitudes GET. Aparece un mensaje de error que dice que las solicitudes GET no son compatibles. Supongo que no puedo reenviar una solicitud GET a una función POST. ¿Hay alguna manera de que cambie el tipo de solicitud antes de reenviar para que termine en la misma URL? – Steve

+0

Sí, tiene razón, leí un poco sobre el método de solicitud en el punto de reenvío - seguirá siendo el mismo método de solicitud que la solicitud original, por lo que en este caso, ya que está llamando/pubresult a través de HTTP GET , esto también se mantendrá en la solicitud reenviada: http://stackoverflow.com/questions/4374548/does-jspforward-or-requestdispatcher-forward-use-get-or-post. No estoy seguro de si hay una solución, si es posible, tengo el mismo método de solicitud para ambos –

Cuestiones relacionadas