java AbstractWizardFormController 使用 Annotated @Controllers
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/4623667/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
AbstractWizardFormController using Annotated @Controllers
提问by Sourabh
In Spring Framework , AbstractWizardFormController
seems deprecated. How to implement multiple pages form in the Spring MVC Framework. (I am not using webflow)
在 Spring Framework 中,AbstractWizardFormController
似乎已弃用。Spring MVC框架中如何实现多页面表单。(我没有使用 webflow)
any example or pointer would help considering my limited knowledge in Spring.
考虑到我对 Spring 的有限知识,任何示例或指针都会有所帮助。
回答by Costi Ciudatu
A @Controller is a more flexible way to define a form / wizard. You are supposed to map methods to requests based on requested path / request parameters / request method. So instead of defining a list of views and processing the request based on some required "step" parameter, you can define the steps of your wizard as you wish (also the command object will be handled more transparently). Here's how you can get to emulate a classic AWFC functionality (this is only meant to be an example, there's a lot more you can do).
@Controller 是一种更灵活的方式来定义表单/向导。您应该根据请求的路径/请求参数/请求方法将方法映射到请求。因此,您可以根据需要定义向导的步骤,而不是定义视图列表并根据某些必需的“步骤”参数处理请求(命令对象的处理也会更加透明)。以下是模拟经典 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";
}
}
I tried to vary the method signatures so that you can get an idea about the flexibility I mentioned. Of course, there's a lot more to it: you can make use of request method (GET or POST) in the @RequestMapping
, you can define a method annotated with @InitBinder
, etc.
我试图改变方法签名,以便您可以了解我提到的灵活性。当然,它还有很多:您可以在 中使用请求方法(GET 或 POST)@RequestMapping
,您可以定义一个带有 注释的方法@InitBinder
,等等。
EDIT:I had an unmapped method which I fixed (by the way, you need to make sure you don't have ambiguous mappings -- requests that could be mapped to more than one method -- or unmapped requests -- requests that cannot be mapped to any method). Also have a look at @SessionAttributes, @SessionStatus and @ModelAttribute, which are also needed for fully simulating the behaviour of the classic AWFC (I edited the code already to make this clear).
编辑:我修复了一个未映射的方法(顺便说一句,您需要确保没有模糊的映射——可以映射到多个方法的请求——或未映射的请求——不能被映射的请求映射到任何方法)。还可以查看@SessionAttributes、@SessionStatus 和@ModelAttribute,它们也是完全模拟经典 AWFC 行为所必需的(我已经编辑了代码以说明这一点)。