Spring MVC Servlet映射,“ / xxx”和“ / xxx / *”之间的区别

时间:2019-10-02 18:02:30

标签: java spring-mvc servlet-mapping

我对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.";
   }
}

1 个答案:

答案 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,并带有“ /”。