SpringMVC:@RequestMapping和静态资源服务的优先级

SpringMVC: The precedence of @RequestMapping and Static Resource serving

我有以下控制器处理程序方法的映射:

@RequestMapping(value = "login.html")
public String doLogin(Model model) {
    return "login";
}

我对静态 *.html 资源有以下配置:

public void addResourceHandlers(ResourceHandlerRegistry registry) {
     registry.addResourceHandler("*.html").addResourceLocations(("/static/"));
}

所以假设我正在访问 login.html,哪个优先? 关于 by-design 行为的任何官方文件?

ADD 1 一些背景

我想使用纯 HTML+JS 来查看我的应用程序。由于我不知道如何从控制器方法 return 和 HTML(有人说这是不可能的),我决定使用 static resource handler 来提供静态 HTML。但似乎我仍然需要为我的 Web 应用程序配置一个映射到根路径 / 的处理程序方法。虽然我已经在/static/路径下放了一个index.html。即,我必须有这个:

@RequestMapping(value = "/")
public String welcome(Model model) {
    return "redirect:index.html"; //must prefix with "redirect:"
}

否则,当我点击http://mysite/时,我会得到一个404错误。

ADD 2 -- 部分实验结果

好像优先级是这样的:

request comes -> Controller request mapping -> If no valid mapping in controller, check static resource handler -> if no valid static resource found, 404, Oops...

添加 3 - 3 个可能的选项来提供静态资源。

我把问题移到了这里:

Static resource serving in SpringMVC

The WebMvcConfigurationSupport Javadoc 描述了默认注册的 HandlerMapping 个 bean(即 @EnableWebMvc)及其优先顺序。

映射URL个路径时,顺序为:

  1. 带注释的控制器方法
  2. 直接查看名字
  3. 控制器 bean 名称
  4. 服务于静态资源请求
  5. 将请求转发到默认 servlet

即使您正在构建 "pure HTML+JS" 应用程序,您也可能希望将其 index.html 转换为模板并利用一些 Spring MVC 功能,例如资源处理和为您的静态资源清除缓存。看看this Devoxx talk.