1. 程式人生 > >關於spring mvc訪問靜態資源,包括html.js

關於spring mvc訪問靜態資源,包括html.js

優雅REST風格的資源URL不希望帶 .html 或 .do 等字尾.由於早期的Spring MVC不能很好地處理靜態資源,所以在web.xml中配置DispatcherServlet的請求對映,往往使用 *.do 、 *.xhtml等方式。這就決定了請求URL必須是一個帶字尾的URL,而無法採用真正的REST風格的URL。


如果將DispatcherServlet請求對映配置為"/",則Spring MVC將捕獲Web容器所有的請求,包括靜態資源的請求,Spring MVC會將它們當成一個普通請求處理,因此找不到對應處理器將導致錯誤。


如何讓Spring框架能夠捕獲所有URL的請求,同時又將靜態資源的請求轉由Web容器處理,是可將DispatcherServlet的請求對映配置為"/"的前提。由於REST是Spring3.0最重要的功能之一,所以Spring團隊很看重靜態資源處理這項任務,給出了堪稱經典的兩種解決方案。


先調整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上下文中定義一個org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler,它會像一個檢查員,對進入DispatcherServlet的URL進行篩查,如果發現是靜態資源的請求,就將該請求轉由Web應用伺服器預設的Servlet處理,如果不是靜態資源的請求,才由DispatcherServlet繼續處理。


一般Web應用伺服器預設的Servlet名稱是"default",因此DefaultServletHttpRequestHandler可以找到它。如果你所有的Web應用伺服器的預設Servlet名稱不是"default",則需要通過default-servlet-name屬性顯示指定:


<mvc:default-servlet-handler default-servlet-name="所使用的Web伺服器預設使用的Servlet名稱" />




架構搭起後 為了實現 對靜態資原始檔的訪問 spring_mvc.xml 新增<mvc:default-servlet-handler /> 但卻再也無法訪問到controller


新增<mvc:annotation-driven />即可,






[html] view plain copy 在CODE上檢視程式碼片派生到我的程式碼片
<!-- 預設的註解對映的支援 -->  
    <mvc:annotation-driven />  
    <!-- 對靜態資原始檔的訪問 方案一 (二選一) -->  
    <mvc:default-servlet-handler />  


特別註明,如果沒有  <mvc:annotation-driven />  , <mvc:default-servlet-handler />  是訪問不了spring mvc URL的


採用<mvc:resources />


<mvc:default-servlet-handler />將靜態資源的處理經由Spring MVC框架交回Web應用伺服器處理。而<mvc:resources />更進一步,由Spring MVC框架自己處理靜態資源,並新增一些有用的附加值功能。


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


其次,<mvc:resources />依據當前著名的Page Speed、YSlow等瀏覽器優化原則對靜態資源提供優化。你可以通過cacheSeconds屬性指定靜態資源在瀏覽器端的快取時間,一般可將該時間設定為一年,以充分利用瀏覽器端的快取。在輸出靜態資源時,會根據配置設定好響應報文頭的Expires 和 Cache-Control值。


在接收到靜態資源的獲取請求時,會檢查請求頭的Last-Modified值,如果靜態資源沒有發生變化,則直接返回303相應狀態碼,提示客戶端使用瀏覽器快取的資料,而非將靜態資源的內容輸出到客戶端,以充分節省頻寬,提高程式效能。


在springMVC-servlet中新增如下配置:


<mvc:resources location="/,classpath:/META-INF/publicResources/" mapping="/resources/**"/>
以上配置將Web根路徑"/"及類路徑下 /META-INF/publicResources/ 的目錄對映為/resources路徑。假設Web根路徑下擁有images、js這兩個資源目錄,在images下面有bg.gif圖片,在js下面有test.js檔案,則可以通過 /resources/images/bg.gif 和 /resources/js/test.js 訪問這二個靜態資源。


假設WebRoot還擁有images/bg1.gif 及 js/test1.js,則也可以在網頁中通過 /resources/images/bg1.gif 及 /resources/js/test1.js 進行引用。


最後一種方法
直接用容器的DefaultServlet來處理靜態資源請求,而不是這樣先通過Spring MVC來轉發呢?(相比效能上會好很多),答案是肯定的。


比如我們將資原始檔都放在resouces目錄下,那麼只需要在web.xml中配置:


     <servlet-mapping>  
        <servlet-name>default</servlet-name>  
        <url-pattern>/resource/*</url-pattern>  
    </servlet-mapping>  
並將它放在所有Servlet的最前面(為了讓它最先匹配),這樣的話效能上應該比較好

相關推薦

關於spring mvc訪問靜態資源包括html.js

優雅REST風格的資源URL不希望帶 .html 或 .do 等字尾.由於早期的Spring MVC不能很好地處理靜態資源,所以在web.xml中配置DispatcherServlet的請求對映,往往使用 *.do 、 *.xhtml等方式。這就決定了請求URL必須是一個帶

Spring MVC訪問靜態資源

一、問題產生 專案中需要使用ECharts畫關係圖譜,EChars網址http://echarts.baidu.com/,在上面的網站下載echartc.js外掛之後,在html裡面引用。 將寫好的HTML和下載的echarts.js放在一個檔案目錄下,然後瀏覽器開啟HTML檔案,可以正常訪

Spring MVC配置靜態資源直接對映到對應的資料夾DispatcherServlet 不處理

<!-- 配置靜態資源,直接對映到對應的資料夾,DispatcherServlet 不處理 --> <mvc:resources mapping="/static/**" locat

Spring MVC實現靜態資源訪問viewcontroller攔截器路徑匹配等配置

spring mvc 定製配置需要配置類繼承 一個webmvcconfigureradapter ,通過重寫這個類的方法,來完成常用的配置 包括靜態資源 , controller ,攔截器,路徑匹配的配置等等 具體程式碼如下 @Component public class WebMv

Spring mvc 增加靜態資源配置mvc:resources後訪問不了註解配置的controller的問題

剛開始沒有配置mvc:resourcescontroller能夠正確訪問,但是由於web.xml使用/攔截了所有的請求,所以靜態資源訪問不上增加mvc:resources之後,靜態資源是能訪問上了,但是註解配置的controller卻又找不到了原因是少了 <mvc:a

spring MVC載入靜態資源(js、圖片、css等)

這裡介紹三種在spring mvc框架中,載入靜態資源的方式: 如果在web.xml中配置了以下攔截,載入不了靜態資源的問題: <!-- 對映所有的請求 -->     <servlet-mapping>  &nb

Spring MVC靜態資源的引用(適用於spring3.04以上版本)

採用<mvc:resources/>標籤即可解決靜態資源的訪問問題,為了方便配置管理,我將專案中所有的靜態資源(js、css、images、)統一放置在一個目錄下:  在你的Spring MVC配置檔案中去增加配置:     

【轉】Spring MVC處理靜態資源

優雅REST風格的資源URL不希望帶 .html 或 .do 等字尾.由於早期的Spring MVC不能很好地處理靜態資源,所以在web.xml中配置DispatcherServlet的請求對映,往往使用 *.do 、 *.xhtml等方式。這就決定了請求URL必須是一個帶字尾的URL,而無法採用真正的RES

spring boot訪問靜態資源出錯

1.寫一個配置類 import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegist

spring boot訪問靜態資源

遇到一個訪問靜態資源的坑,無法直接按照路徑訪問templates下面的資源,經過查詢,需要實現WebMvcConfigurerAdapter。 package com.zkn.learnspringboot.config; import org.sprin

Spring MVC靜態資源對映

一 點睛 Spring MVC的定製配置需要配置類繼承WebMvcConfigurerAdapter類,並在此類使用@EnableWebMvc,來開啟對Spring MVC的配置支援,這樣就可以重寫這個類的方法,完成常用的配置。 程式的靜態檔案(js、css、圖片)等需要

Intellij Idea中Jsp頁面不能訪問靜態資源(圖片、js、css)

tex 文件夾 nbsp 依然 技術分享 很多 路徑 contex mage 最近在學習Spring MVC框架。用Intellij Idea編譯器開發出現了很多因為不了解編譯器配置的問題。 這次是在main.jsp頁面中圖片標簽<img src="images/on

96. Spring Boot之靜態資源版本對映(解決js/css快取問題)

我們在之前有一篇文章中講過【處理靜態資源】,但是在實際開發中,我們會發現我們所瞭解到的知識遠遠不夠我們使用,今天這節就是在實際開發當中對碰到的問題進行一定的講解和解決。        問題的提出:我們對於我們編寫的js和css檔案,經常會做一些改變,由於瀏覽器快取,使用者本

springMVC訪問靜態資源:為什麼圖片/js/css等檔案寫在jsp中是404不能獲取

在SpringMVC中常用的就是Controller與View。但是我們常常會需要訪問靜態資源,如html,js,css,image等。 預設的訪問的URL都會被DispatcherServlet所攔截,但是我們希望靜態資源可以直接訪問。該腫麼辦呢? 在配置檔案

Spring Boot無法訪問靜態資源(cssjs等)的問題

規範專案結構使用官方預設的掃描路徑。畢竟框架的好處就是嚴格按照要求搭好之後幾乎所有的操作都會變得簡單,一句話概括就是一勞永逸 spring boot對靜態資源的預設掃描路徑是:classpath:/staticclasspath:/publicclasspath:/resou

解決Spring MVC DispatcherServlet攔截“/”時,無法訪問靜態資源的問題

方式一:啟用Tomcat的defaultServlet來處理靜態檔案 <!--web.xml--> <servlet-mapping> <servlet-name>default</

spring boot2.0一看就會的超詳細快速入門(七)-訪問靜態資源

常用靜態資源包含 :js、css、圖片、音視訊等 靜態資源路徑:指系統可以直接訪問的路徑,且路徑下的所有檔案都可以被直接讀取 Springboot預設提供靜態資源目錄位置位於classpath下,目錄需要符合以下規則:     /static    /publi

[go-web開發小試驗] 2-靜態資源處理--包括js css html

前言 光是能夠寫出hello world之類的程式還遠遠不夠,網站有前後之分,前端部分會有樣式表,指令碼,html靜態檔案,圖片資源,甚至有音訊視訊多媒體,pdf等等,所以,靜態資源的處理是必不可少的。 這裡提供一個參考實現: Go 語言打包靜態檔案 利用go binda

spring boot mvc系列-靜態資源配置與MappingHandler攔截器

靜態資源配置 Spring Boot 預設將 /** 所有訪問對映到以下目錄: classpath:/static classpath:/public classpath:/resources classpath:/META-INF/resources 如果需要自定義對映目錄,可以繼承WebM

spring boot mybatis 不能訪問靜態資源

使用spring boot 和mybatis 時 使用 <resource> <directory>src/main/java</directory> <includes> <inc