<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          你未必會(huì),SpringMVC 集成靜態(tài)資源的多種方式 | SpringMVC第11篇

          共 4274字,需瀏覽 9分鐘

           ·

          2021-08-12 00:35

          文末可領(lǐng)取最近剛整理的,后端必備的 200 本書(shū)籍。

          1、本文內(nèi)容

          • 靜態(tài)資源 & jsp 是被誰(shuí)處理的?
          • 如何讓 springmvc 處理所有請(qǐng)求?
          • springmvc 如何處理靜態(tài)資源?
          • springmvc 處理靜態(tài)資源的 2 種方案、區(qū)別、原理詳解
          • 領(lǐng)取后端必備的 200 本書(shū)籍

          2、靜態(tài)資源 & jsp 是被誰(shuí)處理的?

          不知大家是否注意了一個(gè)問(wèn)題,我們將 web 項(xiàng)目發(fā)布到 tomcat 后,可以直接訪問(wèn) jsp 后綴的文件,或者直接訪問(wèn)項(xiàng)目中的靜態(tài)資源(js/css/圖片之類(lèi)的文件),只要路徑寫(xiě)的沒(méi)有問(wèn)題,都可以正常在瀏覽器中顯示,大家是否思考過(guò),是誰(shuí)在處理這個(gè)請(qǐng)求呢?

          tomcat 是一個(gè) servlet 容器,servlet 容器中通常有 servlet 來(lái)處理各種請(qǐng)求,那么當(dāng)我們?cè)L問(wèn)靜態(tài)資源或者 jsp 的時(shí)候,當(dāng)然也是由 servlet 來(lái)處理這些請(qǐng)求的,但是我們并沒(méi)有在 web.xml 中配置由哪個(gè) servlet 來(lái)處理這些請(qǐng)求啊,這是因?yàn)?tomcat 中自動(dòng)幫我們配置了一些默認(rèn)的 servlet 來(lái)處理這類(lèi)的請(qǐng)求。

          tomcat 的安裝目錄中有個(gè) web.xml 文件,位于(apache-tomcat-9.0.46\conf\web.xml),這個(gè)文件相當(dāng)于對(duì)發(fā)布到 tomcat 中的所有 web 項(xiàng)目的默認(rèn)配置,我們來(lái)看一下這個(gè)文件,有幾個(gè)重要的 servlet 配置信息,這些 servlet 可以用來(lái)處理 jsp 后置的文件或者靜態(tài)資源,抽取部分配置如下

          <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 個(gè) servlet

          1. JspServlet 用來(lái)處理 jsp 文件
          2. DefaultServlet 會(huì)處理/開(kāi)頭的請(qǐng)求,這里重點(diǎn)說(shuō)下這個(gè) servlet 的處理邏輯,它會(huì)處理所有其他 servlet 不匹配的請(qǐng)求,當(dāng)一個(gè)請(qǐng)求過(guò)來(lái)之后,會(huì)先去匹配其他的 servlet,當(dāng)找不到匹配的 servlet 的時(shí)候,才會(huì)走 DefaultServlet
          3. 我們可以在項(xiàng)目中的 web.xml 中對(duì) tomcat/config/web.xml 中的配置進(jìn)行覆蓋,即項(xiàng)目中的 web.xml 相對(duì)于 tomcat 中的 web.xml 有更高的優(yōu)先級(jí)。

          3、如何讓 springmvc 處理所有請(qǐng)求?

          如果我們想讓 springmvc 來(lái)處理所有的請(qǐng)求,怎么做呢?只需修改 web.xml 中的配置,將 springmvc 這個(gè) servlet 的 url-pattern 的值設(shè)置為/就可以了,此時(shí)所有的請(qǐng)求都會(huì)被 springmvc 處理,即所有的請(qǐng)求都會(huì)被DispatcherServlet處理。

          4、問(wèn)題來(lái)了:靜態(tài)資源 404 了

          當(dāng)我們將上面 springmvc 的 url-pattern 改為/時(shí),大家可以自己去試試,此時(shí)再訪問(wèn)靜態(tài)資源的時(shí)候,如下圖,會(huì)報(bào) 404,這個(gè)請(qǐng)求被 DispatcherServlet 接收了,但是這個(gè) servlet 默認(rèn)情況下并沒(méi)有處理靜態(tài)資源的能力,即找不到請(qǐng)求的資源,所以才會(huì)報(bào) 404

          springmvc 提供了 2 種解決方案,來(lái)看下。

          5、方案 1:使用

          在 springmvc 的配置文件中添加下面配置

          <mvc:annotation-driven/>
          <mvc:default-servlet-handler/>

          這里說(shuō)一下原理

          1、加入配置后,框架會(huì)創(chuàng)建DefaultServletHttpRequestHandler對(duì)象,這個(gè)對(duì)象會(huì)將請(qǐng)轉(zhuǎn)發(fā)給 tomcat 的 default 這個(gè) servlet 處理,所以靜態(tài)資源就可以正常訪問(wèn)了

          2、注意:配置中的第 1 行也必須加上,如果不加上,@RequestMapping 的請(qǐng)求就無(wú)法處理了

          3、這種用法有個(gè)前提是,web 容器中需要有 default 這個(gè) servlet,且這個(gè) servlet 可以處理靜態(tài)資源

          6、方案 2:使用

          從 spring3.0 版本后,spring 定義了專(zhuān)門(mén)處理靜態(tài)資源訪問(wèn)請(qǐng)求的處理器ResourceHttpRequestHandler,并且添加了標(biāo)簽,用來(lái)處理靜態(tài)資源無(wú)法訪問(wèn)的問(wèn)題。

          需要在 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/"/>
          • mvc:resource 標(biāo)簽用來(lái)指定請(qǐng)求的靜態(tài)資源的 url 和本地地址的映射關(guān)系
          • mapping:用來(lái)指定請(qǐng)求的地址的,比如/imgs/**:可以匹配任何 imgs 開(kāi)頭的 url,如:/imgs/1.jpg、/imgs/2.jpg、/imgs/order/3.jpg
          • location:用來(lái)指定靜態(tài)資源所在項(xiàng)目中的目錄
          • 注意:配置中的第 1 行也必須加上,如果不加上,@RequestMapping 的請(qǐng)求就無(wú)法處理了
          • 這種用法不依賴(lài)于 web 容器,所以比第一種方案要好一些,也建議大家用這種方案。

          上面代碼中配置了 3 行 mvc:resources,可以?xún)?yōu)化下,如下


          <mvc:resources mapping="/static/**" location="/static/"/>
          </mvc:resources mapping=

          7、總結(jié)

          • tomcat 默認(rèn)能夠處理 jsp 和靜態(tài)資源,是因?yàn)?tomcat 中默認(rèn)有 2 個(gè) servlet:default 和 jsp
          • 到此我們已經(jīng)知道如何讓 springmvc 來(lái)處理所有請(qǐng)求了,只需要在 web.xml 中調(diào)整一下 url-pattern 的值為/就可以了
          • 默認(rèn)情況下,springmvc 無(wú)法處理靜態(tài)資源,本文介紹了 2 種方式,大家可以回頭在再去看看,第一種需要依賴(lài)于 web 容器中的 default 這個(gè) servlet,使用上面對(duì) web 容器有依賴(lài)作用;而第 2 種方式是 springmvc 推薦的方式,更好一些,對(duì) web 容器沒(méi)有依賴(lài)
          • 不管用那種方式,都不要忘記了這個(gè)注解,否則咱們自定義的 controller 中的@RequestMapping 就無(wú)效了

          8、案例代碼

          git地址:https://gitee.com/javacode2018/springmvc-series

          9、SpringMVC 系列

          1. SpringMVC 系列第 1 篇:helloword
          2. SpringMVC 系列第 2 篇:@Controller、@RequestMapping
          3. SpringMVC 系列第 3 篇:異常高效的一款接口測(cè)試?yán)?/a>
          4. SpringMVC 系列第 4 篇:controller 常見(jiàn)的接收參數(shù)的方式
          5. SpringMVC 系列第 5 篇:@RequestBody 大解密,說(shuō)點(diǎn)你不知道的
          6. SpringMVC 系列第 6 篇:上傳文件的 4 種方式,你都會(huì)么?
          7. SpringMVC 系列第 7 篇:SpringMVC 返回視圖常見(jiàn)的 5 種方式,你會(huì)幾種?
          8. SpringMVC 系列第 8 篇:返回 json & 通用返回值設(shè)計(jì)
          9. SpringMVC 系列第 9 篇:SpringMVC 返回 null 是什么意思?
          10. SpringMVC 系列第 10 篇:異步處理太強(qiáng)大了,系統(tǒng)性能大幅提升

          10、更多好文章

          1. Spring 高手系列(共 56 篇)
          2. Java 高并發(fā)系列(共 34 篇)
          3. MySql 高手系列(共 27 篇)
          4. Maven 高手系列(共 10 篇)
          5. Mybatis 系列(共 12 篇)
          6. 聊聊 db 和緩存一致性常見(jiàn)的實(shí)現(xiàn)方式
          7. 接口冪等性這么重要,它是什么?怎么實(shí)現(xiàn)?
          8. 泛型,有點(diǎn)難度,會(huì)讓很多人懵逼,那是因?yàn)槟銢](méi)有看這篇文章!

          11、領(lǐng)取后端必備的 200 本書(shū)

          這里幫大家整理 200 本后端必備的書(shū)籍,掃描下面二維碼即可看到書(shū)籍列表,直接領(lǐng)取電子版,也可以點(diǎn)擊【閱讀原文】領(lǐng)取

          瀏覽 72
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲无码中文视频 | 俺来也俺也啪 | 欧美日韩亚州在线观看 | 亚洲黄色在线看 | 玖玖精品视频一区二区三区四区 |