web應用常見的資源存方式 在WEB-INF下新建lib,存放要使用的jar包 在WEB-INF下新建jsp文件夾,存放jsp文件。首頁除外,首頁就放到web下。 在web下,或WEB-INF下,新建css、js、image文件夾,存放相關文件。 WEB-INF目錄是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的實例,就會載入靜態資源,靜態資源一直在記憶體中,響應快、但吃伺服器記憶體。
方式一是請求這個靜態資源時才載入,用完就釋放,速度慢、但記憶體占用少。