2011-01-07 13 views
26

In Spring Framework, AbstractWizardFormController sembra deprecato. Come implementare moduli di più pagine in Spring MVC Framework. (Non sto utilizzando il webflow)AbstractWizardFormController using Annotated @Controllers

qualsiasi esempio o puntatore potrebbe aiutare a considerare la mia conoscenza limitata in primavera.

risposta

61

Un controllo @Controller è un modo più flessibile per definire un modulo/procedura guidata. Si suppone che si associno i metodi alle richieste in base al percorso/richiesta richiesta/metodo di richiesta. Quindi, invece di definire un elenco di viste ed elaborare la richiesta in base ad alcuni parametri "step" richiesti, è possibile definire i passaggi del wizard come desiderato (anche l'oggetto comando verrà gestito in modo più trasparente). Ecco come puoi emulare una funzionalità classica di AWFC (questo è solo un esempio, c'è molto altro che puoi fare).

@Controller 
@RequestMapping("/wizard.form") 
@SessionAttributes("command") 
public class WizardController { 

    /** 
    * The default handler (page=0) 
    */ 
    @RequestMapping 
    public String getInitialPage(final ModelMap modelMap) { 
     // put your initial command 
     modelMap.addAttribute("command", new YourCommandClass()); 
     // populate the model Map as needed 
     return "initialView"; 
    } 

    /** 
    * First step handler (if you want to map each step individually to a method). You should probably either use this 
    * approach or the one below (mapping all pages to the same method and getting the page number as parameter). 
    */ 
    @RequestMapping(params = "_step=1") 
    public String processFirstStep(final @ModelAttribute("command") YourCommandClass command, 
            final Errors errors) { 
     // do something with command, errors, request, response, 
     // model map or whatever you include among the method 
     // parameters. See the documentation for @RequestMapping 
     // to get the full picture. 
     return "firstStepView"; 
    } 

    /** 
    * Maybe you want to be provided with the _page parameter (in order to map the same method for all), as you have in 
    * AbstractWizardFormController. 
    */ 
    @RequestMapping(method = RequestMethod.POST) 
    public String processPage(@RequestParam("_page") final int currentPage, 
           final @ModelAttribute("command") YourCommandClass command, 
           final HttpServletResponse response) { 
     // do something based on page number 
     return pageViews[currentPage]; 
    } 

    /** 
    * The successful finish step ('_finish' request param must be present) 
    */ 
    @RequestMapping(params = "_finish") 
    public String processFinish(final @ModelAttribute("command") YourCommandClass command, 
           final Errors errors, 
           final ModelMap modelMap, 
           final SessionStatus status) { 
     // some stuff 
     status.setComplete(); 
     return "successView"; 
    } 

    @RequestMapping(params = "_cancel") 
    public String processCancel(final HttpServletRequest request, 
           final HttpServletResponse response, 
           final SessionStatus status) { 
     status.setComplete(); 
     return "canceledView"; 
    } 

} 

Ho provato a variare le firme del metodo in modo da poter avere un'idea della flessibilità che ho menzionato. Naturalmente, c'è molto di più ad esso: si può fare uso del metodo di richiesta (GET o POST) nel @RequestMapping, è possibile definire un metodo annotato con @InitBinder, ecc

EDIT: ho avuto un metodo non mappata che ho risolto (a proposito, devi assicurarti di non avere mappature ambigue - richieste che potrebbero essere mappate su più di un metodo - o richieste non mappate - richieste che non possono essere mappate su alcun metodo). Date anche un'occhiata a @SessionAttributes, @SessionStatus e @ModelAttribute, che sono anche necessari per simulare completamente il comportamento del classico AWFC (ho già modificato il codice per chiarirlo).

+5

+1 Questa è sicuramente una spiegazione migliore di quella fornita dall'app di documentazione/esempio di Spring. Un sacco di gente potrebbe trovare questo utile. – prasopes

+0

sì, davvero molto utile. – false9striker

+1

Questo è utile ma non c'è alcuna spiegazione del metodo 'pageViews'. – djangofan