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

Posted

技术标签:

【中文标题】SpringMVC:@RequestMapping 和静态资源服务的优先级【英文标题】:SpringMVC: The precedence of @RequestMapping and Static Resource serving 【发布时间】:2016-03-09 04:13:26 【问题描述】:

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

@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 来查看我的应用程序。由于我不知道如何从控制器方法返回 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 -- 一些实验结果

好像优先级是这样的:

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

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

我把问题移到这里:

Static resource serving in SpringMVC

【问题讨论】:

【参考方案1】:

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

映射URL路径时,顺序为:

    带注释的控制器方法 直接查看姓名 控制器 bean 名称 处理静态资源请求 将请求转发到默认 servlet

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

【讨论】:

感谢您的回答。我是 Spring 新手,我不想过早跳到 Spring Boot。你能详细说明一下turning index.html into a template吗? Spring 团队向有经验的开发者和新手推荐 Spring Boot docs.spring.io/spring/docs/current/spring-framework-reference/… 。至于您的其他问题,我认为它们与您的第一个问题正交,属于单独的 SO 线程。请记住,这对其他人也应该有用,而不是让读者因内容和多个问题而不知所措。 知道了。准备好我的话后,我将为我的ADD 3 启动另一个线程。

以上是关于SpringMVC:@RequestMapping 和静态资源服务的优先级的主要内容,如果未能解决你的问题,请参考以下文章

SpringMVC— “@RequestMapping注解及其属性”

SpringMVC— “@RequestMapping注解及其属性”

SpringMVC— “@RequestMapping注解及其属性”

SpringMVC— “@RequestMapping注解及其属性”

SpringMVC--@RequestMapping注解标注方法解析

springmvc注解@RequestMapping