【问题标题】:Spring mapping form's action to the controllerSpring 将表单的动作映射到控制器
【发布时间】:2012-09-14 05:04:35
【问题描述】:

我是 Spring 框架的新手,我已经使用该方法创建了一个控制器

@RequestMapping("/fetch/{contactId}")
public String getContact(@PathVariable("contactId") Long contactId,
        Map<String, Object> map, HttpServletRequest request,
        HttpServletResponse response) {

    Contact contact = contactService.get(contactId);
    map.put("contact", contact);
    return "contact";
}

当用户单击 jsp 上的链接时,会调用此 fetch 方法来检索联系人详细信息

<td><a href="fetch/${contact.id}" class="edit">Edit</a></td>

然后成功返回联系人对象并显示在屏幕上供用户更改和保存。我的jsp的form标签是这样的

<form:form method="post" action="add.html" commandName="contact"
        id="contact" onsubmit="return validateContact(this)">

现在的问题是,当我尝试将页面提交到同一控制器中的另一个方法时,URL 更改为

/myapp/app/contacts/fetch/add.html

应该是这样的

/myapp/app/contacts/add.html

我知道有些事情我做的不对,但我无法弄清楚到底是什么。感谢您是否有人可以帮助我解决问题

谢谢 AA

【问题讨论】:

    标签: spring


    【解决方案1】:

    使用

    <c:url var="addUrl" value="/contacts/add.html"/>
    <form:form method="post" action="${addUrl}" commandName="contact"
          id="contact" onsubmit="return validateContact(this)">
    

    一般来说,建议在每个应用程序内部使用c:url,而不是在&lt;a&gt; 标签中直接使用url。

    【讨论】:

    • @NimChimpsky c:url 有一些内部 url 重写,例如 seesion 密钥(如果不启用/支持 cookie)。但也有其他一些库侵入了这种重写(我认为 tomcat CSRF-Filter 也使用它)。另一个原因是,它包含了属性的 url 编码。
    • Tomcats:CSRF 过滤器描述:tomcat.apache.org/tomcat-7.0-doc/config/…
    【解决方案2】:
    <form:form method="post" servletRelativeAction="/contacts/add" commandName="contact"
            id="contact" onsubmit="return validateContact(this)">
    

    使用属性 servletRelativeAction 映射到所需的控制器操作。我假设您想要的控制器映射为“/contacts/add”而不是“add.html”。你想点击控制器而不是视图。

    【讨论】:

      【解决方案3】:

      在action 属性中使用/contacts/add.html
      改变

      <form:form method="post" action="add.html" commandName="contact"
              id="contact" onsubmit="return validateContact(this)">
      

      到

      <form:form method="post" action="/contacts/add.html" commandName="contact"
              id="contact" onsubmit="return validateContact(this)">
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-05-09
        • 1970-01-01
        • 1970-01-01
        • 2020-07-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多