我对 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
	提交
		取消
	