web-dev-qa-db-ja.com

注釈付き@Controllersを使用したAbstractWizardFormController

Spring Frameworkでは、AbstractWizardFormControllerは非推奨のようです。 SpringMVCフレームワークで複数ページフォームを実装する方法。 (私はwebflowを使用していません)

どんな例やポインタでも、Springでの私の限られた知識を検討するのに役立ちます。

31
Sourabh

@Controllerは、フォーム/ウィザードを定義するためのより柔軟な方法です。要求されたパス/要求パラメーター/要求メソッドに基づいて、メソッドを要求にマップすることになっています。したがって、ビューのリストを定義し、必要な「step」パラメーターに基づいてリクエストを処理する代わりに、ウィザードのステップを必要に応じて定義できます(コマンドオブジェクトはより透過的に処理されます)。従来のAWFC機能をエミュレートする方法は次のとおりです(これは単なる例であり、できることは他にもたくさんあります)。

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

}

私が言及した柔軟性についてのアイデアを得ることができるように、メソッドのシグネチャを変更しようとしました。もちろん、それだけではありません。@RequestMappingでリクエストメソッド(GETまたはPOST)を利用したり、@InitBinderでアノテーションが付けられたメソッドを定義したりできます。

EDIT:私が修正したマッピングされていないメソッドがありました(ちなみに、あいまいなマッピング(複数のメソッドにマッピングされる可能性のあるリクエスト)またはマッピングされていないリクエストがないことを確認する必要がありますリクエスト-どのメソッドにもマッピングできないリクエスト)。また、@ SessionAttributes、@ SessionStatus、および@ModelAttributeも確認してください。これらは、従来のAWFCの動作を完全にシミュレートするためにも必要です(これを明確にするために、コードをすでに編集しました)。

64
Costi Ciudatu