我对 Spring MVC 的 url 模式映射的工作原理感到困惑。当'getServletMappings'返回“/”时,我可以通过“ http://localhost:8080/hello ”得到正确的响应。但如果我将其更改为“/app”并将 url 更改为“ 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" //}; }}@RestControllerpublic class HTTPMethodsController { @RequestMapping("/hello") public String hello() { return "Hello SpringMVC."; }}
1 回答
噜噜哒
TA贡献1784条经验 获得超7个赞
根据Servlet规范第12.2章,Servlet的映射必须使用以下语法:
以“/”字符开头并以“/*”后缀结尾的字符串用于路径映射。
以“*”开头的字符串。前缀用作扩展映射。
空字符串(“”)是一种特殊的URL模式,它精确映射到应用程序的上下文根,即表单应用程序上下文根的请求,即表单http://host:port //的请求。在本例中,路径信息为“/”,servlet 路径和上下文路径为空字符串 (“”)。
仅包含“/”字符的字符串表示应用程序的“默认”servlet。在这种情况下,Servlet 路径是请求 URI 减去上下文路径,并且路径信息为空。
所有其他字符串仅用于精确匹配。
DispatcherServlet
因此,使用 URL进行映射"/app"
,会导致 servlet 容器仅在完全匹配时才将请求路由到它,这意味着仅当您将 url 更改为“ http://localhost:8080/app ”时。这就没有空间添加额外的路径来定位特定的 Spring 控制器(更准确地说:hello()
如果您映射它,您实际上可以命中您的控制器方法@RequestMapping("/app")
,因为DispatcherServlet
回退到使用整个 url 进行搜索,但实际上这不是您想要的)。
因此映射“/app/*”是正确的,或者您也可以将其映射为带有“/”的默认 servlet,如您所注意到的。
添加回答
举报
0/150
提交
取消