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


 

 web應用常見的資源存方式

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

 

 


 

 

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

 

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

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

 

 

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

 

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

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

 

總得留個頁面作為網站入口吧,入口的index.jsp直接放在web下,用戶可以直接訪問。

 

 


 

 

lib的存放

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

 

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

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

 

如果我們是在web下新建lib存放jar包,或者在項目下新建lib存放jar包,

部署項目時,會把所有的jar包拷貝到輸出目錄的  項目\WEB-INF\lib里,並會把我們新建的lib文件夾拷貝到輸出目錄的 項目下,這一步就多余了,沒必要。

 

 如果部署時,jar包拷貝不全,參考:

https://www.cnblogs.com/chy18883701161/p/12240317.html

 

 


 

 

靜態資源配置

我們在web.xml中使用DispatcherServlet攔截所有請求,所有的請求都轉交給controller處理。

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

而DispatcherServlet又找不到對應的controller來處理這些請求,即使路徑是對的,在瀏覽器中f12->Network,看到狀態碼是404、或者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>里配置多個規則。

麻煩且移植性差。

 

 


 

 

 

方式一、三更靈活,可以指定要加載的靜態資源,方式二是加載項目中所有的靜態資源。

 

方式二、三響應靜態資源更快,因為web服務器啟動時就會創建默認Servlet的實例,就會加載靜態資源,靜態資源一直在內存中,響應快、但吃服務器內存。

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM