2010-07-16 3 views
3

J'ai un contrôleur Spring Annonted qui est utilisé pour capturer les informations d'un formulaire et obtenir une liste de résultats de recherche de la base de données.Printemps MVC (Spring 2.5) Question sur Post-Redirect-Get

Voici la définition de la méthode

@RequestMapping(method = RequestMethod.POST, params = {SUBMIT_BTN }) 
public ModelAndView processForm(@ModelAttribute(COMMAND_NAME){ 


    // 1. Load search results using search parameters from form (Contained in a collection of some sort) 


    // 2. Create the ModelAndView 

    // 3. Redirect with RequestView or redirect: to generate a GET. 
} 

Je pense que je dois rediriger avec redirection: depuis que j'ai une liste d'articles dans un magasin de collection à la session. Impossible d'ajouter cela en tant que paramètre de demande d'URL. Fondamentalement, j'essaie d'éviter les problèmes avec le bouton de retour où il est dit que la page a expiré. Je veux implémenter le modèle PRG dans les chaînes.

J'ai du mal à faire la tête pour convertir le POST en GET. Puis-je simplement rediriger ou ai-je besoin de deux méthodes? Merci pour toute l'aide que vous pouvez apporter.

Répondre

6

Le modèle standard est d'avoir une méthode de contrôleur pour gérer le GET, et qui montre le formulaire (ou autre) à l'utilisateur, et un pour gérer le POST, qui est la soumission de formulaire. La méthode POST envoie une redirection après avoir terminé le traitement de la soumission, qui revient à la méthode GET.

@RequestMapping(value="/myapp", method=GET) 
public String showForm(@ModelAttribute(COMMAND_NAME){ 
    return "form.jsp"; 
} 

@RequestMapping(value="/myapp", method=POST) 
public String processForm(@ModelAttribute(COMMAND_NAME){ 
    // do stuff to process for submission 
    return "redirect:/myapp"; 
} 

De retour un nom de vue avec le « redirect: » les forces de préfixe printemps pour envoyer une requête HTTP directe plutôt que d'une demande interne en avant.

Ceci est le même modèle que Spring 2.0 implémenté avec SimpleFormController, mais la nouvelle façon est beaucoup plus transparente.