当前位置: 代码迷 >> java >> 请求映射问题-Spring MVC
  详细解决方案

请求映射问题-Spring MVC

热度:107   发布时间:2023-07-26 14:28:57.0

我在的请求映射面临如下问题:
我可以通过两个URL查看uploadPage.jsp的响应

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

已成功为URL 1提交了uploadPage.jsp的表单,并且在浏览器中将该URL显示为http://localhost:8080/dms/files/upload
但是对于URL 2 ,浏览器URL为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";
    }
}

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>

您在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> 3.2.3) servletRelativeAction属性:

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

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

@RequestMapping(value = "/files")

因为您已经在控制器级别提供了网址格式,所以Spring容器首先在控制器级别检查了网址格式,如果它在控制器上找到了正确的网址格式,那么之后它将搜索其他网址格式

在这里你的情况

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

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

  相关解决方案