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注解及其属性”