我对Spring MVC的url模式映射的工作方式感到困惑。
当'getServletMappings'返回“ /”时,我可以使用“ http://localhost:8080/hello”得到正确的响应。
但是如果我将其更改为“ / app”并将网址更改为“ http://localhost:8080/app/hello”,则无法正常工作,它将返回404错误。
我误解了吗,我还发现“ / app / *”可以工作(我能理解),但是为什么“ / app”不能?
请检查我的代码:
public class AppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected String[] getServletMappings() {
// works with http://localhost:8080/hello
return new String[] {
"/"
};
// NOT working with http://localhost:8080/app/hello
// return new String[] {
// "/app"
//};
}
}
@RestController
public class HTTPMethodsController {
@RequestMapping("/hello")
public String hello() {
return "Hello SpringMVC.";
}
}
答案 0 :(得分:1)
根据Servlet specification Chapter 12.2,servlet的映射必须使用以下语法:
- 以'/'字符开头并以'/ *'后缀结尾的字符串用于 路径映射。
- 以“ *”开头的字符串用作扩展名映射。
- 空字符串(“”)是一种特殊的URL模式,它精确地映射到应用程序的上下文根,即形式为应用程序的上下文根的请求,即形式为http://host:port/ /的请求。在这种情况下,路径信息为“ /”,而servlet路径和上下文路径为空字符串(“”)。
- 仅包含“ /”字符的字符串表示该服务器的“默认” servlet 应用。在这种情况下,servlet路径是请求URI减去上下文路径,并且路径信息为null。
- 所有其他字符串仅用于完全匹配。
因此,将DispatcherServlet
与URL "/app"
映射会导致servlet容器仅在完全匹配时才将请求路由到该容器,这意味着仅当您将url更改为“ {{3 }}”。这没有余地为目标Spring控制器添加额外的路径(更准确地说:如果您将hello()
映射到@RequestMapping("/app")
控制器方法,则实际上可以使用DispatcherServlet
控制器方法,因为sed -n '/\n/bb;/\\cite{/!b;s//\n/;s/.*\n/\n/;:a;/}/!{N;s/\n//2;ba};s//\n/;D;:b;s/^\([^\n]*\),\s*/\1\n/;P;D' file
会退回到搜索整个网址,但实际上这不是您想要的。
因此,映射“ / app / *”是正确的,或者您也可以将其映射为默认的servlet,并带有“ /”。