请求映射问题 - spring mvc

时间:2015-07-16 08:21:10

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

我正面临中请求映射的问题,因为:
我有两个网址可以看到uploadPage.jsp

的响应
  1. http://localhost:8080/dms/files/?module=abc
  2. http://localhost:8080/dms/files?module=abc
  3. uploadPage.jsp中的表单已成功提交,网址为 1 ,浏览器中的网址显示为http://localhost:8080/dms/files/upload
    但是对于网址 2 ,浏览器网址错误为http://localhost:8080/dms/upload

    此网址映射有什么问题?

    控制器

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

    JSP uploadPage.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 个答案:

答案 0 :(得分:0)

JSP中的相对URL存在常见问题。这就是规则通常始终使用绝对URL的原因。

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

但是当您使用http://localhost:8080/dms/files?module=abc时,<sf:form action="upload" method="post" ...会向http://localhost:8080/dms/upload发帖并向您显示错误。

如果你想摆脱这个问题,最简单的方法是在<sf:form标签中使用绝对URL,或者手动预先设置上下文路径

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

或使用(Spring&gt; 3.2.3)servletRelativeAction属性:

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

答案 1 :(得分:-1)

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

@RequestMapping(value = "/files")

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

在你的情况下

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

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