2012-08-14 7 views
11

Sto utilizzando Spring 3.1. Ho una funzione di controllo che prende in un oggetto di comando (un supporto di dati) inviata attraverso un modulo e fa alcune elaborazioni:Spring-MVC 3.1: Inoltro di una richiesta da una funzione di controller a un'altra

@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 

Alcuni utenti vorrebbe fare di programmazione collegamenti GET per ottenere informazioni dal sito fuori e vorrei piace impostare un altro gestore che gestirà tale richiesta. Creerebbe una nuova istanza di tale oggetto comando (ssdh) e lo popolerà con i parametri inviati tramite la richiesta GET. Quindi lo passerebbe al gestore sopra. Qualcosa di simile a questo:

@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 

La mia domanda è come posso inoltrare la mia portaoggetti comando/dati alla prima funzione di controllo in modo tale che non ho di modificare il codice per la prima funciton controllore in qualche modo?

risposta

17

È possibile utilizzare l'oggetto RedirectAttributes che è stato introdotto in Spring MVC 3.1 e popolarlo con i dati che si desidera conservare per il reindirizzamento. Si chiama 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"; 
} 

Ho scritto alcuni articoli tecnici su come utilizzarlo. Credo che vi darà maggiori dettagli:

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

+0

+1 Grande mi ha aiutato molto – Jayanth

+1

@ danny.lesnik Il collegamento http://www.tikalk.com/java/redirectattributes-new-feature-spring-mvc-31 hai fornito è rotto . Aggiornerai questo con il link di lavoro? – OO7

+0

Perché devo fare questo evento con un forward? – FelipeKunzler

7

Si dovrebbe essere in grado di impostare lo ssdh in un ModelAttribute e semplicemente in avanti indietro, in questo modo, il RequestDispatcher dovrebbe essere in grado di mappare nuovamente al /results handler:

@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

Ho provato questo. La funzione controller che voglio inoltrare per gestire le richieste POST. Quando provo ad inoltrare la funzione nell'esempio sopra, che richiede GET. Ricevo un messaggio di errore che dice che le richieste GET non sono supportate. Suppongo che non possa inoltrare una richiesta GET a una funzione POST. C'è un modo per me di modificare il tipo di richiesta prima di inoltrarlo per farlo finire allo stesso URL? – Steve

+0

Sì, hai ragione, ho letto un po 'sul metodo di richiesta al punto di inoltro - continuerà ad essere lo stesso metodo di richiesta della richiesta originale, quindi in questo caso, poiché stai chiamando/pubresult su HTTP GET , questo verrà mantenuto anche nella richiesta inoltrata: http://stackoverflow.com/questions/4374548/does-jspforward-or-requestdispatcher-forward-use-get- orpost. Non sono sicuro se c'è una soluzione alternativa, se possibile avere lo stesso RequestMethod per entrambi –

Problemi correlati