【问题标题】:Spring 3 : Binding same controller method to multiple form actionSpring 3:将相同的控制器方法绑定到多个表单操作
【发布时间】:2014-01-16 03:01:28
【问题描述】:

我有一个带有 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">

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

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

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

【问题讨论】:

  • 完全不清楚你在问什么。什么是添加帐户电子邮件、添加父电子邮件? com.abcd.AllURLS.user_email 是什么?
  • 已编辑问题。如果您有任何疑问,请告诉我。

标签: spring spring-mvc spring-3


【解决方案1】:

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

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

<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);
}

等等

【讨论】:

    【解决方案2】:

    @RequestMapping 接受数组作为参数(带有 or 语义)。

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

    【讨论】:

    • 使用多种方法不是我的选择。我需要使用相同的方法和值,但不知何故需要支持多种功能。是使用多种方法还是使用相同的方法区分功能?
    • 你认为我为什么建议使用两种方法?再仔细阅读答案。这正是你想要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-07
    • 1970-01-01
    相关资源
    最近更新 更多