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).
fonte
2011-01-07 10:14:19
+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
sì, davvero molto utile. – false9striker
Questo è utile ma non c'è alcuna spiegazione del metodo 'pageViews'. – djangofan