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

smw*_*dia 5 spring spring-mvc web-development-server

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

@RequestMapping(value = "login.html")
public String doLogin(Model model) {
    return "login";
}
Run Code Online (Sandbox Code Playgroud)

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

public void addResourceHandlers(ResourceHandlerRegistry registry) {
     registry.addResourceHandler("*.html").addResourceLocations(("/static/"));
}
Run Code Online (Sandbox Code Playgroud)

那么假设我正在访问login.html,哪一个会优先?有关于这种by-design行为的官方文件吗?

ADD 1 一些背景

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

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

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

ADD 2 -- 一些实验结果

看起来优先级是这样的:

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

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

我把问题移到这里:

SpringMVC 中的静态资源服务

Bri*_*zel 2

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

映射 URL 路径时,顺序为:

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

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