<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    cuiyi's blog(崔毅 crazycy)

    記錄點(diǎn)滴 鑒往事之得失 以資于發(fā)展
    數(shù)據(jù)加載中……

    SpringMVC+MyBatis - 6 SpringMVC Restful風(fēng)格下的靜態(tài)資源

          優(yōu)雅REST風(fēng)格的資源URL不希望帶 .html 或 .do 等后綴.由于早期的Spring MVC不能很好地處理靜態(tài)資源,所以在web.xml中配置DispatcherServlet的請求映射,往往使用 *.do 、 *.xhtml等方式。這就決定了請求URL必須是一個(gè)帶后綴的URL,而無法采用真正的REST風(fēng)格的URL。

         如果將DispatcherServlet請求映射配置為"/",則Spring MVC將捕獲Web容器所有的請求,包括靜態(tài)資源的請求,Spring MVC會將它們當(dāng)成一個(gè)普通請求處理,因此找不到對應(yīng)處理器將導(dǎo)致錯(cuò)誤。

        如何讓Spring框架能夠捕獲所有URL的請求,同時(shí)又將靜態(tài)資源的請求轉(zhuǎn)由Web容器處理,是可將DispatcherServlet的請求映射配置為"/"的前提。由于REST是Spring3.0最重要的功能之一,所以Spring團(tuán)隊(duì)很看重靜態(tài)資源處理這項(xiàng)任務(wù),給出了堪稱經(jīng)典的兩種解決方案。

    先調(diào)整web.xml中的DispatcherServlet的配置,使其可以捕獲所有的請求:

         <servlet>
            <servlet-name>springMVC</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet-mapping>
            <servlet-name>springMVC</servlet-name>
            <url-pattern>/</url-pattern>
        </servlet-mapping>

    通過上面url-pattern的配置,所有URL請求都將被Spring MVC的DispatcherServlet截獲。


    采用<mvc:default-servlet-handler />

    在springMVC-servlet.xml中配置<mvc:default-servlet-handler />后,會在Spring MVC上下文中定義一個(gè)org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler,它會像一個(gè)檢查員,對進(jìn)入DispatcherServlet的URL進(jìn)行篩查,如果發(fā)現(xiàn)是靜態(tài)資源的請求,就將該請求轉(zhuǎn)由Web應(yīng)用服務(wù)器默認(rèn)的Servlet處理,如果不是靜態(tài)資源的請求,才由DispatcherServlet繼續(xù)處理。

    一般Web應(yīng)用服務(wù)器默認(rèn)的Servlet名稱是"default",因此DefaultServletHttpRequestHandler可以找到它。如果你所有的Web應(yīng)用服務(wù)器的默認(rèn)Servlet名稱不是"default",則需要通過default-servlet-name屬性顯示指定:

    <mvc:resources location="/,classpath:/META-INF/publicResources/" mapping="/resources/**"/>


    采用<mvc:resources />

    <mvc:default-servlet-handler />將靜態(tài)資源的處理經(jīng)由Spring MVC框架交回Web應(yīng)用服務(wù)器處理。而<mvc:resources />更進(jìn)一步,由Spring MVC框架自己處理靜態(tài)資源,并添加一些有用的附加值功能。

    首先,<mvc:resources />允許靜態(tài)資源放在任何地方,如WEB-INF目錄下、類路徑下等,你甚至可以將JavaScript等靜態(tài)文件打到JAR包中。通過location屬性指定靜態(tài)資源的位置,由于location屬性是Resources類型,因此可以使用諸如"classpath:"等的資源前綴指定資源位置。傳統(tǒng)Web容器的靜態(tài)資源只能放在Web容器的根路徑下,<mvc:resources />完全打破了這個(gè)限制。

    其次,<mvc:resources />依據(jù)當(dāng)前著名的Page Speed、YSlow等瀏覽器優(yōu)化原則對靜態(tài)資源提供優(yōu)化。你可以通過cacheSeconds屬性指定靜態(tài)資源在瀏覽器端的緩存時(shí)間,一般可將該時(shí)間設(shè)置為一年,以充分利用瀏覽器端的緩存。在輸出靜態(tài)資源時(shí),會根據(jù)配置設(shè)置好響應(yīng)報(bào)文頭的Expires 和 Cache-Control值。

    在接收到靜態(tài)資源的獲取請求時(shí),會檢查請求頭的Last-Modified值,如果靜態(tài)資源沒有發(fā)生變化,則直接返回303相應(yīng)狀態(tài)碼,提示客戶端使用瀏覽器緩存的數(shù)據(jù),而非將靜態(tài)資源的內(nèi)容輸出到客戶端,以充分節(jié)省帶寬,提高程序性能。

    在springMVC-servlet中添加如下配置:

    <mvc:resources location="/,classpath:/META-INF/publicResources/" mapping="/resources/**"/>
    以上配置將Web根路徑"/"及類路徑下 /META-INF/publicResources/ 的目錄映射為/resources路徑。假設(shè)Web根路徑下?lián)碛衖mages、js這兩個(gè)資源目錄,在images下面有bg.gif圖片,在js下面有test.js文件,則可以通過 /resources/images/bg.gif 和 /resources/js/test.js 訪問這二個(gè)靜態(tài)資源。

    假設(shè)WebRoot還擁有images/bg1.gif 及 js/test1.js,則也可以在網(wǎng)頁中通過 /resources/images/bg1.gif 及 /resources/js/test1.js 進(jìn)行引用。

    摘錄于http://www.cnblogs.com/fangqi/archive/2012/10/28/2743100.html

    posted on 2014-07-12 23:31 crazycy 閱讀(3967) 評論(0)  編輯  收藏 所屬分類: JavaEE技術(shù)

    主站蜘蛛池模板: 亚洲1234区乱码| tom影院亚洲国产一区二区| 日本一区二区三区免费高清在线| 免费人成视频在线| 亚洲国产成人九九综合| 国产成人精品免费视频动漫| 亚洲不卡视频在线观看| 国产在线a免费观看| 亚洲午夜无码久久| 国产色爽女小说免费看| 偷自拍亚洲视频在线观看| 亚洲第一黄色网址| 久久精品免费大片国产大片| 精品久久香蕉国产线看观看亚洲| 国产在线观看免费视频软件| 91久久亚洲国产成人精品性色| 国产乱子精品免费视观看片| 亚洲妇女熟BBW| 亚洲AV成人潮喷综合网| 99精品视频在线观看免费| 亚洲嫩草影院久久精品| 操美女视频免费网站| 日韩精品无码永久免费网站| 亚洲国产另类久久久精品小说 | 高潮毛片无遮挡高清免费视频| 全黄性性激高免费视频| 国产美女视频免费观看的网站| 亚洲AV美女一区二区三区| 18禁网站免费无遮挡无码中文 | 免费看黄的成人APP| 亚洲免费黄色网址| 亚洲?v女人的天堂在线观看| 久久er国产精品免费观看2| 亚洲mv国产精品mv日本mv| 亚洲国产综合精品中文字幕 | 久久国产精品免费网站| ass亚洲**毛茸茸pics| 亚洲最大av无码网址| 亚洲日本在线免费观看| 免费无遮挡无遮羞在线看| 91亚洲国产在人线播放午夜|