请求映射问题 - spring mvc
request mapping issue - spring mvc
我在 spring-mvc 中遇到请求映射问题:
有两个 url 可以看到 uploadPage.jsp
的响应
http://localhost:8080/dms/files/?module=abc
http://localhost:8080/dms/files?module=abc
uploadPage.jsp
中的表单已成功提交url1,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";
}
}
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>
是的,你的 url 映射在你的情况下是错误的 从你的控制器中删除下面的行以从 url 2
中获取输出
@RequestMapping(value = "/files")
因为您在控制器级别给出了 url 模式,所以 spring 容器首先在控制器级别检查 url 模式
如果它在控制器找到正确的 url 模式,那么它将搜索任何进一步的 url 模式
这里是你的情况
url 2. http://localhost:8080/dms/upload
将直接搜索 url 模式以 upload
开头的资源,但 spring 容器找不到正确的映射
这就是为什么它不会给你理想的输出
您在 JSP 中遇到了与亲属 URL 相关的常见问题。这就是为什么规则通常总是使用绝对 URLs.
的原因
当您第一次使用 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">
我在 spring-mvc 中遇到请求映射问题:
有两个 url 可以看到 uploadPage.jsp
http://localhost:8080/dms/files/?module=abc
http://localhost:8080/dms/files?module=abc
uploadPage.jsp
中的表单已成功提交url1,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";
}
}
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>
是的,你的 url 映射在你的情况下是错误的 从你的控制器中删除下面的行以从 url 2
中获取输出@RequestMapping(value = "/files")
因为您在控制器级别给出了 url 模式,所以 spring 容器首先在控制器级别检查 url 模式 如果它在控制器找到正确的 url 模式,那么它将搜索任何进一步的 url 模式
这里是你的情况
url 2. http://localhost:8080/dms/upload
将直接搜索 url 模式以 upload
开头的资源,但 spring 容器找不到正确的映射
这就是为什么它不会给你理想的输出
您在 JSP 中遇到了与亲属 URL 相关的常见问题。这就是为什么规则通常总是使用绝对 URLs.
的原因当您第一次使用 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">