Java充电社
专辑
博文
联系我
本人继续续收门徒,亲手指导
SpringMVC教程
-> 如何集成静态资源?
1、Helloword
2、@Controller、@RequestMapping
3、接口测试利器
4、如何接受请求中的参数?
5、@RequestBody接收Json格式数据
6、多文件上传
7、返回页面常见的5种方式
8、返回json格式数据 & 通用返回值设计
9、SpringMVC返回null是什么意思?
10、异步处理请求
11、如何集成静态资源?
12、拦截器怎么用?
13、统一异常处理
14、实战篇:通用返回值 & 异常处理设计
15、全注解的方式 & 原理解析
16、源码解析SpringMVC处理请求的流程
17、源码解析SpringMVC容器的启动过程
18、RequestBodyAdvice:对@ReuqestBody进行增强
19、ResponseBodyAdvice:对@ResponseBody进行增强
20、RESTful接口详解
21、接口调用利器RestTemplate
22、参数解析器HandlerMethodArgumentResolver解密
23、@RequestParam用法及原理详解
24、@RequestBody原理解密
25、@RequestHeader详解
26、@CookieValue详解
27、@RequestAttribute详解
28、@SessionAttribute详解
29、重定向和转向详解
30、Converter转换器详解
31、跨域问题详解
32、类容协商,颠覆你的认知
33、终章
34、CORS通信
35、浏览器安全策略 & CORS
36、Http中的Content-Type详解
上一篇:异步处理请求
下一篇:拦截器怎么用?
<div style="display:none"></div> ## 1、本文内容 - 静态资源 & jsp 是被谁处理的? - 如何让springmvc处理所有请求? - springmvc如何处理静态资源? - springmvc处理静态资源的2种方案、区别、原理详解 - 领取后端必备的200本书籍 ## 2、静态资源 & jsp 是被谁处理的? 不知大家是否注意了一个问题,我们将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后置的文件或者静态资源,抽取部分配置如下 ```xml <servlet> <servlet-name>default</servlet-name> <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet> <servlet-name>jsp</servlet-name> <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class> <load-on-startup>3</load-on-startup> </servlet> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>jsp</servlet-name> <url-pattern>*.jsp</url-pattern> <url-pattern>*.jspx</url-pattern> </servlet-mapping> ``` > 配置中主要定义了2个servlet > > 1. JspServlet用来处理jsp文件 > 2. DefaultServlet会处理/开头的请求,这里重点说下这个servlet的处理逻辑,它会处理所有其他servlet不匹配的请求,当一个请求过来之后,会先去匹配其他的servlet,当找不到匹配的servlet的时候,才会走DefaultServlet > 3. 我们可以在项目中的web.xml中对tomcat/config/web.xml中的配置进行覆盖,即项目中的web.xml相对于tomcat中的web.xml有更高的优先级。 ## 3、如何让springmvc处理所有请求? 如果我们想让springmvc来处理所有的请求,怎么做呢?只需修改web.xml中的配置,将springmvc这个servlet的url-pattern的值设置为`/`就可以了,此时所有的请求都会被springmvc处理,即所有的请求都会被`DispatcherServlet`处理。 ![](https://itsoku.oss-cn-hangzhou.aliyuncs.com/itsoku/blog/article/222/e5908648-f927-4acd-ac61-84e0c3373c21.png) ## 4、问题来了:静态资源404了 当我们将上面springmvc的url-pattern改为/时,大家可以自己去试试,此时再访问静态资源的时候,如下图,会报404,这个请求被DispatcherServlet 接收了,但是这个servlet默认情况下并没有处理静态资源的能力,即找不到请求的资源,所以才会报404 ![](https://itsoku.oss-cn-hangzhou.aliyuncs.com/itsoku/blog/article/222/24e8fbc9-1576-44f8-aaed-771663d33c51.png) springmvc提供了2种解决方案,来看下。 ## 5、方案2:使用<mvc:default-servlet-handler/> 在springmvc的配置文件中添加下面配置 ```xml <mvc:annotation-driven/> <mvc:default-servlet-handler/> ``` > 这里说一下原理 > > 1、加入<mvc:default-servlet-handler/>配置后,框架会创建`DefaultServletHttpRequestHandler`对象,这个对象会将请转发给tomcat的default这个servlet处理,所以静态资源就可以正常访问了 > > 2、注意:配置中的第1行`<mvc:annotation-driven/>`也必须加上,如果不加上,@RequestMapping的请求就无法处理了 > > 3、这种用法有个前提是,web容器中需要有default这个servlet,且这个servlet可以处理静态资源 ## 6、方案2:使用<mvc:resources/> 从spring3.0版本后,spring定义了专门处理静态资源访问请求的处理器`ResourceHttpRequestHandler`,并且添加了<mvc:resources/>标签,用来处理静态资源无法访问的问题。 需要在springmvc配置文件中添加如下配置 ```xml <mvc:annotation-driven/> <mvc:resources mapping="/imgs/**" location="/static/imgs/"/> <mvc:resources mapping="/css/**" location="/static/css/"/> <mvc:resources mapping="/js/**" location="/static/js/"/> ``` > - mvc:resource 标签用来指定请求的静态资源的url和本地地址的映射关系 > - mapping:用来指定请求的地址的,比如/imgs/**:可以匹配任何以imgs开头的url,如:/imgs/1.jpg、/imgs/2.jpg、/imgs/order/3.jpg > - location:用来指定静态资源所在项目中的目录 > - 注意:配置中的第1行`<mvc:annotation-driven/>`也必须加上,如果不加上,@RequestMapping的请求就无法处理了 > - 这种用法不依赖于web容器,所以比第一种方案要好一些,也建议大家用这种方案。 上面代码中配置了3行mvc:resources,可以优化下,如下 ``` <mvc:annotation-driven/> <mvc:resources mapping="/static/**" location="/static/"/> ``` ## 7、总结 - tomcat默认能够处理jsp和静态资源,是因为tomcat中默认有2个servlet:default和jsp - 到此我们已经知道如何让springmvc来处理所有请求了,只需要在web.xml中调整一下url-pattern的值为/就可以了 - 默认情况下,springmvc无法处理静态资源,本文介绍了2种方式,大家可以回头在再去看看,第一种需要依赖于web容器中的default这个servlet,使用上面对web容器有依赖作用;而第2种方式是springmvc推荐的方式,更好一些,对web容器没有依赖 - 不管用那种方式,都不要忘记了`<mvc:annotation-driven/>`这个注解,否则咱们自定义的controller中的@RequestMapping就无效了 ## 8、案例代码 ```html git地址:https://gitee.com/javacode2018/springmvc-series ``` <a style="display:none" target="_blank" href="https://mp.weixin.qq.com/s/_S1DD2JADnXvpexxaBwLLg" style="color:red; font-size:20px; font-weight:bold">继续收门徒,亲手带,月薪 4W 以下的可以来找我</a> ## 最新资料 1. <a href="https://mp.weixin.qq.com/s?__biz=MzkzOTI3Nzc0Mg==&mid=2247484964&idx=2&sn=c81bce2f26015ee0f9632ddc6c67df03&scene=21#wechat_redirect" target="_blank">尚硅谷 Java 学科全套教程(总 207.77GB)</a> 2. <a href="https://mp.weixin.qq.com/s?__biz=MzkwOTAyMTY2NA==&mid=2247484192&idx=1&sn=505f2faaa4cc911f553850667749bcbb&scene=21#wechat_redirect" target="_blank">2021 最新版 Java 微服务学习线路图 + 视频</a> 3. <a href="https://mp.weixin.qq.com/s?__biz=MzkwOTAyMTY2NA==&mid=2247484573&idx=1&sn=7f3d83892186c16c57bc0b99f03f1ffd&scene=21#wechat_redirect" target="_blank">阿里技术大佬整理的《Spring 学习笔记.pdf》</a> 4. <a href="https://mp.weixin.qq.com/s?__biz=MzkwOTAyMTY2NA==&mid=2247484544&idx=2&sn=c1dfe907cfaa5b9ae8e66fc247ccbe84&scene=21#wechat_redirect" target="_blank">阿里大佬的《MySQL 学习笔记高清.pdf》</a> 5. <a href="https://mp.weixin.qq.com/s?__biz=MzkwOTAyMTY2NA==&mid=2247485167&idx=1&sn=48d75c8e93e748235a3547f34921dfb7&scene=21#wechat_redirect" target="_blank">2021 版 java 高并发常见面试题汇总.pdf</a> 6. <a href="https://mp.weixin.qq.com/s?__biz=MzkwOTAyMTY2NA==&mid=2247485664&idx=1&sn=435f9f515a8f881642820d7790ad20ce&scene=21#wechat_redirect" target="_blank">Idea 快捷键大全.pdf</a> ![](https://itsoku.oss-cn-hangzhou.aliyuncs.com/itsoku/blog/article/1/2883e86e-3eff-404a-8943-0066e5e2b454.png)
#custom-toc-container