文末可领取最近刚整理的,后端必备的 200 本书籍。
不知大家是否注意了一个问题,我们将 web 项目发布到 tomcat 后,可以直接访问 jsp 后缀的文件,或者直接访问项目中的静态资源(js/css/图片之类的文件),只要路径写的没有问题,都可以正常在浏览器中显示,大家是否思考过,是谁在处理这个请求呢?
tomcat 是一个 servlet 容器,servlet 容器中通常有 servlet 来处理各种请求,那么当我们访问静态资源或者 jsp 的时候,当然也是由 servlet 来处理这些请求的,但是我们并没有在 web.xml 中配置由哪个 servlet 来处理这些请求啊,这是因为 tomcat 中自动帮我们配置了一些默认的 servlet 来处理这类的请求。
tomcat 的安装目录中有个 web.xml 文件,位于(apache-tomcat-9.0.46\conf\web.xml),这个文件相当于对发布到 tomcat 中的所有 web 项目的默认配置,我们来看一下这个文件,有几个重要的 servlet 配置信息,这些 servlet 可以用来处理 jsp 后置的文件或者静态资源,抽取部分配置如下
<servlet>
<servlet-name>defaultservlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServletservlet-class>
<load-on-startup>1load-on-startup>
servlet>
<servlet>
<servlet-name>jspservlet-name>
<servlet-class>org.apache.jasper.servlet.JspServletservlet-class>
<load-on-startup>3load-on-startup>
servlet>
<servlet-mapping>
<servlet-name>defaultservlet-name>
<url-pattern>/url-pattern>
servlet-mapping>
<servlet-mapping>
<servlet-name>jspservlet-name>
<url-pattern>*.jspurl-pattern>
<url-pattern>*.jspxurl-pattern>
servlet-mapping>
配置中主要定义了 2 个 servlet
如果我们想让 springmvc 来处理所有的请求,怎么做呢?只需修改 web.xml 中的配置,将 springmvc 这个 servlet 的 url-pattern 的值设置为/
就可以了,此时所有的请求都会被 springmvc 处理,即所有的请求都会被DispatcherServlet
处理。
当我们将上面 springmvc 的 url-pattern 改为/时,大家可以自己去试试,此时再访问静态资源的时候,如下图,会报 404,这个请求被 DispatcherServlet 接收了,但是这个 servlet 默认情况下并没有处理静态资源的能力,即找不到请求的资源,所以才会报 404
springmvc 提供了 2 种解决方案,来看下。
在 springmvc 的配置文件中添加下面配置
<mvc:annotation-driven/>
<mvc:default-servlet-handler/>
这里说一下原理 1、加入配置后,框架会创建
DefaultServletHttpRequestHandler
对象,这个对象会将请转发给 tomcat 的 default 这个 servlet 处理,所以静态资源就可以正常访问了 2、注意:配置中的第 1 行也必须加上,如果不加上,@RequestMapping 的请求就无法处理了 3、这种用法有个前提是,web 容器中需要有 default 这个 servlet,且这个 servlet 可以处理静态资源
从 spring3.0 版本后,spring 定义了专门处理静态资源访问请求的处理器ResourceHttpRequestHandler
,并且添加了标签,用来处理静态资源无法访问的问题。
需要在 springmvc 配置文件中添加如下配置
<mvc:annotation-driven/>
<mvc:resources mapping="/imgs/**" location="/static/imgs/"/>
<mvc:resources mapping="/css/**" location="/static/css/"/>
<mvc:resources mapping="/js/**" location="/static/js/"/>
上面代码中配置了 3 行 mvc:resources,可以优化下,如下
<mvc:resources mapping="/static/**" location="/static/"/>
</mvc:resources mapping=
git地址:https://gitee.com/javacode2018/springmvc-series