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


问题内容

对于控制器处理程序方法,我具有以下映射:

@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行为的任何正式文件吗?

添加1一些背景

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

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

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

添加2-一些实验结果

似乎优先级是这样的:

请求到->控制器请求映射->如果控制器中没有有效的映射,请检查静态资源处理程序->如果找不到有效的静态资源,404,糟糕…


问题答案:

WebMvcConfigurationSupport Javadoc描述了HandlerMapping默认情况下(即,通过@EnableWebMvc)注册的bean
及其优先顺序。

映射URL路径时,顺序为:

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

即使您正在构建“纯HTML + JS”应用程序,您仍可能希望将其index.html转换为模板,并利用某些Spring
MVC功能,例如资源处理和静态资源的缓存清除。