将Spring表单的action映射到控制器

6

我是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 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

3个回答

8

使用

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

通常情况下,在每个应用程序内部使用c:url而不是直接在<a>标签中使用URL是推荐的做法。


1
@NimChimpsky,c:url具有一些内部URL重写功能,例如用于会话密钥(如果未启用/支持cookie)。但是,一些其他库也会利用这种重写(我认为Tomcat CSRF-Filter也使用它)。另一个原因是它包含了属性的URL编码。 - Ralph
Tomcats: CSRF 过滤器描述:http://tomcat.apache.org/tomcat-7.0-doc/config/filter.html#CSRF_Prevention_Filter - Ralph

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

使用属性servletRelativeAction来映射到所需的控制器操作。我假设您所需的控制器已映射为'/contacts/add'而不是'add.html'。您希望访问控制器而不是视图。

0

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)">

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接