使用SpringMVC時,web應用的資源路徑問題

 

 web應用常見的資源存方式

  • 在WEB-INF下新建lib,存放要使用的jar包
  • 在WEB-INF下新建jsp文件夾,存放jsp文件。首頁除外,首頁就放到web下。
  • 在web下,或WEB-INF下,新建css、js、image文件夾,存放相關文件。

 

 


 

 

WEB-INF目錄是web應用的安全目錄,裏面的資源不能被瀏覽器直接訪問。css

 

web下的靜態資源(html、css、js、圖片等)都不能被瀏覽器直接訪問,html

直接放到web下,或者放到WEB-INF下,都是同樣的。前端

 

 

web下的動態資源(jsp)能夠被瀏覽器直接訪問,好比瀏覽器直接訪問web下的首頁index.jsp,這是能夠的。web

 

若是把jsp放到WEB-INF下,那jsp受到WEB-INF的保護,瀏覽器就不能直接訪問。瀏覽器

SpringMVC提倡由controller處理請求,調用視圖來響應,用戶不能直接訪問視圖,因此把jsp放到WEB-INF下。安全

 

總得留個頁面做爲網站入口吧,入口的index.jsp直接放在web下,用戶能夠直接訪問。服務器

 

 


 

 

lib的存放

部署項目時,會把jar包拷貝到輸出目錄的 WEB-INF\lib 下。mvc

 

在WEB-INF下新建文件夾lib,把所需的jar包放到lib下,app

部署項目時,會把全部的jar包都拷貝到輸出目錄的  項目\WEB-INF\lib 裏。jsp

 

若是咱們是在web下新建lib存放jar包,或者在項目下新建lib存放jar包,

部署項目時,會把全部的jar包拷貝到輸出目錄的  項目\WEB-INF\lib裏,並會把咱們新建的lib文件夾拷貝到輸出目錄的 項目下,這一步就多餘了,不必。

 

 若是部署時,jar包拷貝不全,參考:

http://www.javashuo.com/article/p-abfcljrk-hc.html

 

 


 

 

靜態資源配置

咱們在web.xml中使用DispatcherServlet攔截全部請求,全部的請求都轉交給controller處理。

就是說,前端頁面的<img />要加載圖片、<script src="">要加載js腳本、<link />要加載的樣式表,這些請求都會被DispatcherServlet攔截,

而DispatcherServlet又找不到對應的controller來處理這些請求,即便路徑是對的,在瀏覽器中f12->Network,看到狀態碼是40四、或者400(因爲找不到所需的資源而引發的錯誤)。

 

咱們須要配置一下靜態資源,讓DispatcherServlet放行某些靜態資源的請求。

有3種配置方式。

 

 


 

 

配置方式一:配置資源映射(最經常使用)

    <mvc:resources mapping="/js/**" location="/js/**" />
    <mvc:resources mapping="/css/**" location="/css/**" />
    <mvc:resources mapping="/image/**" location="/image/**" />

location是實際地址,mapping是映射地址。通常咱們不改路徑,只是讓DispatcherServlet放行。

<mvc:resources />是以文件夾爲單位配置的,最小單位只能是文件夾,不能是文件。

能夠寫上**表示該文件夾下的全部東西,也能夠缺省**。

 

這種方式能夠放行對靜態資源的請求、對WEB-INF下資源的請求、對動態資源(jsp)的請求。

 

 


 

 

配置方式二:配置默認的ServletHandler

<mvc:default-servlet-handler default-servlet-name="default" />

配置web服務器默認的ServletHandler,DIspatcher攔截到靜態資源後,找不到對應的controller來處理,會交給web服務器默認的ServletHandler來處理。

默認的ServletHandler會調用web服務器的默認Serlvet來處理,web服務器的默認Servlet的處理方式都是直接放行(返回該資源做爲響應)。

但不一樣的web服務器,默認Servlet的name是不一樣的:

  • Tomcat、Jetty、Jboss、GlassFish的默認Servlet的name是default
  • Resin的是resin-file
  • WebLogic的是FileServlet
  • WebSphere的是SimpleFileServlet

更換web服務器時,須要修改default-servlt-name,配置簡單但項目移植性差。

 

 


 

 

配置方式三:在web.xml中配置默認Servlet的映射

    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.js</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.css</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>*.jpg</url-pattern>
    </servlet-mapping>

使用多個<filter-mapping>,不能一個<filter-mapping>裏配置多個<url-pattern>,也不能在一個<url-pattern>裏配置多個規則。

麻煩且移植性差。

 

 


 

 

 

方式1、三更靈活,能夠指定要加載的靜態資源,方式二是加載項目中全部的靜態資源。

 

方式2、三響應靜態資源更快,由於web服務器啓動時就會建立默認Servlet的實例,就會加載靜態資源,靜態資源一直在內存中,響應快、但吃服務器內存。

方式一是請求這個靜態資源時才加載,用完就釋放,速度慢、但內存佔用少。

相關文章
相關標籤/搜索