Spring 3:将相同的控制器方法绑定到多个表单操作

时间:2014-01-16 03:01:29

标签: spring spring-mvc spring-3

我有一个带有RequestMapping.PUT的控制器方法,并且有一个URI

@RequestMapping(value = "/add/email", method = RequestMethod.POST)
public String addNewAccountEmail(@Valid @ModelAttribute EmailClass emailObject, BindingResult bindingResult, Model model) {
    return displayForm(model);
}

我的表格如下:

<form:form id="add-user-email" action="/add/email" name="manageUserAddEmail" method="post" modelAttribute="accountEmail">

我希望更多表单指向相同的操作,但需要在 addNewAccountEmail 方法中执行不同的操作。那么我怎样才能在Spring中实现这一目标?基本上任何可以让我区分功能的参数或某种方式我可以有多个方法具有相同的RequestMapping URL和方法?

我只能使用RequestMethod.POST,因为我对其他方法也有类似的要求。

基本上我不希望在调用操作时在浏览器中更改URL,这就是为什么我希望所有表单操作都指向相同的操作URL。

2 个答案:

答案 0 :(得分:2)

您可以使用相同的控制器方法指出所有表单,然后通过查找特定于表单的请求参数来区分该方法中的表单特定功能。

每个表单都需要添加自己的请求参数来识别它 - 例如:

<input type="hidden" name="form1_param" value="1"/>

然后,您可以通过检查HttpServletRequest

来改变方法内部的行为
@RequestMapping(value = "/add/email", method = RequestMethod.POST, )
public String addNewAccountEmail(@Valid @ModelAttribute EmailClass emailObject, BindingResult bindingResult, Model model, HttpServletRequest request) {

    if (request.getParameter("form1_param") != null) { // identifies 1st form
        // Do something
    } else if (request.getParameter("form2_param") != null) { // indentifies 2nd form
        // Do something else
    }

    ...
}

将多个控制器方法映射到同一路径但在RequestMapping中指定不同的参数 - 以区分不同的形式会更清晰。

@RequestMapping(value = "/add/email", params="form1_param", method = RequestMethod.POST)
public String addNewAccountEmail1(@Valid @ModelAttribute EmailClass emailObject, BindingResult bindingResult, Model model) {

    // Do something specific for form1
    return displayForm(model);
}

还有:

@RequestMapping(value = "/add/email", params="form2_param", method = RequestMethod.POST)
public String addNewAccountEmail2(@Valid @ModelAttribute EmailClass emailObject, BindingResult bindingResult, Model model) {

    // Do something specific for form2
    return displayForm(model);
}

答案 1 :(得分:1)

@RequestMapping接受数组作为参数(使用语义)。

@RequestMapping(
    value = "/add/email",
    method = { RequestMethod.POST, RequestMethod.PUT } )
相关问题