前提知識:Servlet容器如Tomcat暇番, Jetty等要映射請求苦掘,都是只能通過Servlet來響應(yīng)處理的。像jsp頁面其本質(zhì)也是轉(zhuǎn)化為Servlet來響應(yīng)的驮瞧。因此靜態(tài)資源的響應(yīng)也是需要通過Servlet的腊敲。
方式1 就是利用容器自身的默認Servlet击喂, 以Tomcat為例,如下圖有一個默認的Servlet碰辅,名稱就是default(也可以在tomcat的配置文件中修改為其他名稱懂昂,是在tomcat的目錄/conf/web.xml中配置的)。
我們只需要在web項目的web.xml中配置靜態(tài)文件是由此Servlet來映射即可没宾。
default是容器的默認servlet的名稱凌彬,示例為tomcat容器,其他容器根據(jù)實際情況來循衰,如果tomcat配置文件修改了默認servlet名稱饿序,則也要修改為實際的。
<!-- 使用Servlet容器的默認Servlet來處理靜態(tài)資源的訪問 -->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.jpg</url-pattern>
<url-pattern>*.css</url-pattern>
<url-pattern>*.js</url-pattern>
</servlet-mapping>
方式2:在spring-mvc.xml 即mvc子容器配置文件中配置如下
<!--靜態(tài)資源訪問-->
<mvc:default-servlet-handler/>
在配置文件中配置<mvc:default-servlet-handler />后羹蚣,會在Spring MVC上下文中定義一個org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler,它會像一個檢查員乱凿,對進入DispatcherServlet的URL進行篩查顽素,如果發(fā)現(xiàn)是靜態(tài)資源的請求,就將該請求轉(zhuǎn)由Web應(yīng)用服務(wù)器默認的Servlet處理徒蟆,如果不是靜態(tài)資源的請求胁出,才由DispatcherServlet繼續(xù)處理。
一般Web應(yīng)用服務(wù)器默認的Servlet名稱是"default"段审,因此DefaultServletHttpRequestHandler可以找到它全蝶。如果你所有的Web應(yīng)用服務(wù)器的默認Servlet名稱不是"default",則需要通過default-servlet-name屬性顯示指定:
<mvc:default-servlet-handler
default-servlet-name="所使用的Web服務(wù)器默認使用的Servlet名稱" />
方式3
在項目的spring-mvc.xml文件中配置
<mvc:resources mapping="/images/**" location="/images/" />
<mvc:resources mapping="/js/**" location="/js/" />
<mvc:resources mapping="/css/**" location="/css/" />
<mvc:resources location="/,classpath:/META-INF/publicResources/" mapping="/resources/**"/>
因為上面的location屬性節(jié)點是Resource資源, 因此可以使用classpath這類寫法抑淫。
<mvc:resources />更進一步绷落,由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 />完全打破了這個限制捐下。
其次,<mvc:resources />依據(jù)當前著名的Page Speed堂氯、YSlow等瀏覽器優(yōu)化原則對靜態(tài)資源提供優(yōu)化蔑担。你可以通過cacheSeconds屬性指定靜態(tài)資源在瀏覽器端的緩存時間,一般可將該時間設(shè)置為一年咽白,以充分利用瀏覽器端的緩存啤握。在輸出靜態(tài)資源時,會根據(jù)配置設(shè)置好響應(yīng)報文頭的Expires 和 Cache-Control值晶框。
在接收到靜態(tài)資源的獲取請求時排抬,會檢查請求頭的Last-Modified值,如果靜態(tài)資源沒有發(fā)生變化授段,則直接返回303相應(yīng)狀態(tài)碼蹲蒲,提示客戶端使用瀏覽器緩存的數(shù)據(jù),而非將靜態(tài)資源的內(nèi)容輸出到客戶端侵贵,以充分節(jié)省帶寬届搁,提高程序性能。