mvc:default-servlet-handler标签的作用

最近在复习 Spring MVC 的时候,通过官方的文档弄清楚了一个以前不太理解的标签,写出来分享一下。

在开发 RESTful 架构的 URI 时,我们都会在web.xml中将前端控制器的映射请求设置为"/"
mvc:default-servlet-handler标签的作用_第1张图片

关于配置成"/",在 Spring 的官方文档中这样描述:

The caveat to overriding the “/” Servlet mapping is that the RequestDispatcher for the default Servlet must be retrieved by name rather than by path.

大概意思是默认 Servlet 的 RequestDispatcher 必须通过名称而不是路径来检索。 换句话说就是 Spring MVC 将接收到的所有请求都看作是一个普通的请求,包括对于静态资源的请求。这样以来,所有对于静态资源的请求都会被看作是一个普通的后台控制器请求,导致请求找不到而报 404 异常错误。查看 tomcat 的日志会报一个警告:
这里写图片描述

对于这个问题 Spring MVC 在全局配置文件中提供了一个标签。在 WEB 容器启动的时候会在上下文中定义一个 DefaultServletHttpRequestHandler,它会对DispatcherServlet的请求进行处理,如果该请求已经作了映射,那么会接着交给后台对应的处理程序,如果没有作映射,就交给 WEB 应用服务器默认的 Servlet 处理,从而找到对应的静态资源,只有再找不到资源时才会报错。

一般 WEB 应用服务器默认的 Servlet 都是 default。如果默认 Servlet 用不同名称自定义配置,或者在缺省 Servlet 名称未知的情况下使用了不同的 Servlet 容器,则必须显式提供默认 Servlet 的名称,如下:

<mvc:default-servlet-handler default-servlet-name="myCustomDefaultServlet"/>

你可能感兴趣的:(Spring)