【问题标题】:request mapping issue - spring mvc请求映射问题 - spring mvc
【发布时间】:2015-07-16 08:21:10
【问题描述】:

我在 中遇到了请求映射问题:
我可以通过两个网址看到uploadPage.jsp 的回复

  1. http://localhost:8080/dms/files/?module=abc
  2. http://localhost:8080/dms/files?module=abc

uploadPage.jsp中的表单成功提交了url 1,浏览器中的url显示为http://localhost:8080/dms/files/upload
但是对于 url 2,浏览器 url 错误为http://localhost:8080/dms/upload

这个url映射有什么问题?

控制器

package dms.spring.controller;

import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;

import dms.pojo.CrmDms;

@Controller
@RequestMapping(value = "/files")
public class FileUploadController
{
    @RequestMapping(method = RequestMethod.GET)
    public String index( HttpServletRequest webRequest, ModelMap map )
    {
        String module = webRequest.getParameter( "module" );
        CrmDms crmDms = new CrmDms();
        crmDms.setModule( module );
        map.put( CrmDms.class.getSimpleName(), crmDms );
        return "uploadPage";
    }

    @RequestMapping(value = "/upload", method = RequestMethod.POST)
    public String uploadFile( @ModelAttribute(value = "CrmDms") CrmDms crmDms,
                              @RequestParam(value = "document") MultipartFile file,
                              ModelMap modelMap )
    {
        System.out.println( crmDms.getModule() );
        return "successPage";
    }
}

JSPuploadPage.jsp):

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<%@taglib uri="http://www.springframework.org/tags/form" prefix="sf"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
</head>
<body>
  <div id="main-wrapper">
    <sf:form action="upload" method="post" commandName="CrmDms">
      <sf:input path="module" />
      <input type="submit" value="Submit">
    </sf:form>
  </div>
</body>
</html>

【问题讨论】:

  • 这是 2 个不同的资源 /files 不是 /files/。问题是您在 action 属性中使用了相对 URL,而不是 absolute URL。请改用绝对 URL。您应该发帖到/dms/files/upload 而不是upload。使用 URL 标签(spring 或 plain)创建正确的 URL。 &lt;sf:url value="/files/upload" var="actionUrl" /&gt; 然后在您的表单元素中使用 action="${actionUrl}"

标签: spring-mvc java spring jsp spring-mvc request-mapping


【解决方案1】:

JSP 中的相对 URL 存在一个常见问题。这就是为什么规则通常总是使用绝对 URL 的原因。

当您第一次使用 http://localhost:8080/dms/files/?module=abc 时,&lt;sf:form action="upload" method="post" ... 会按预期发布到 http://localhost:8080/dms/files/upload 并由您的控制器正确处理。

但是当你使用http://localhost:8080/dms/files?module=abc 时,&lt;sf:form action="upload" method="post" ... 会发布到http://localhost:8080/dms/upload 并给你错误。

如果你想摆脱这个问题,最简单的方法是在&lt;sf:form 标签中使用绝对 URL,或者在上下文路径前添加 手动

<sf:url var="upload" value="/files/upload"/>
<sf:form action="${upload}" method="post" commandName="CrmDms">

或使用 (Spring > 3.2.3) servletRelativeAction 属性:

<sf:form servletRelativeAction="/files/upload" method="post" commandName="CrmDms">

【讨论】:

  • servletRelativeAction 看起来很有希望。
【解决方案2】:

是的,您的 url 映射在您的情况下是错误的 从您的控制器中删除以下行以从 url 2 获取输出

@RequestMapping(value = "/files")

因为您在控制器级别提供了一个 url 模式,所以 spring 容器首先在控制器级别检查 url 模式 如果它在控制器上找到正确的 url 模式,那么它将搜索任何进一步的 url 模式

在你的情况下

url 2. http://localhost:8080/dms/upload

将直接搜索具有以upload 开头的url 模式的资源,但spring 容器找不到正确的映射 这就是为什么它不会给你想要的输出

【讨论】:

  • 你真的确定这是 OP 所期望的吗?现在 URL http://localhost:8080/dms/files/?module=abc 会发生什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-24
  • 1970-01-01
  • 2012-09-14
  • 1970-01-01
  • 2011-12-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多