AbstractWizardFormController utilisant des @Controllers annotés

Dans le Cadre du Printemps , AbstractWizardFormController semble obsolète. Comment implémenter le formulaire plusieurs pages dans le Framework Spring MVC. (Je n'utilise pas webflow)

Tout exemple ou pointeur aiderait compte tenu de mes connaissances limitées au printemps.

27
demandé sur Jeff Atwood 2011-01-07 11:12:33

1 réponses

Un @ Controller est un moyen plus flexible de définir un formulaire / Assistant. Vous êtes censé mapper les méthodes aux requêtes en fonction du chemin demandé / des paramètres de requête / de la méthode de requête. Ainsi, au lieu de définir une liste de vues et de traiter la requête en fonction d'un paramètre "étape" requis, vous pouvez définir les étapes de votre assistant comme vous le souhaitez (l'objet command sera également géré de manière plus transparente). Voici comment vous pouvez émuler une fonctionnalité AWFC classique (ceci est uniquement destiné à être un exemple, il y a beaucoup plus que vous pouvez faire).

@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";
    }

}

J'ai essayé de varier les signatures de méthode afin que vous puissiez avoir une idée de la flexibilité que j'ai mentionnée. Bien sûr, il y a beaucoup plus: vous pouvez utiliser la méthode request (GET ou POST) dans le @RequestMapping, vous pouvez définir une méthode annotée avec @InitBinder, etc.

EDIT: j'avais une méthode non mappée que j'ai corrigée (en passant, vous devez vous assurer que vous n'avez pas de mappages Ambigus-les requêtes qui pourraient être mappées à plus d'un requête non mappée-requêtes qui ne peuvent être mappées à aucune méthode). Jetez également un oeil à @SessionAttributes, @SessionStatus et @ModelAttribute, qui sont également nécessaires pour simuler complètement le comportement de L'AWFC classique (j'ai déjà édité le code pour le préciser).

62
répondu Costi Ciudatu 2011-01-07 13:23:47