【问题标题】:SpringMVC: The precedence of @RequestMapping and Static Resource servingSpringMVC:@RequestMapping 和静态资源服务的优先级
【发布时间】: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

【问题讨论】:

    标签: spring spring-mvc web-development-server


    【解决方案1】:

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

    映射URL路径时,顺序为:

    1. 带注释的控制器方法
    2. 直接查看姓名
    3. 控制器 bean 名称
    4. 处理静态资源请求
    5. 将请求转发到默认 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 启动另一个线程。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-13
    • 2014-07-02
    • 2016-02-24
    相关资源
    最近更新 更多