一般的動靜分類會使用Apache+tomcat或者Nginx+tomcat的方式進行實現,Nginx+tomcat的方式配置較爲簡單,而且Nginx處理併發性能也更強;此處僅使用tomcat進行簡單的動靜分離處理。
tomcat、jboss、jetty等容器提供了一個默認的servlet:default,該servlet將靜態資源的映射從/改爲/static,該servlet在jboss中的定義位置爲:${jboss_home}/server/default/deployers/jbossweb.deployer/web.xml;在tomcat中的定義位置:${tomcat_home}/conf/web.xml。
默認的servlet是既服務於靜態資源又服務於目錄列表(如果允許目錄列表的話)的servlet。它在$CATALINA_HOME/conf/web.xml中被全局聲明。默認形式的聲明是這樣的: $CATALINA_HOME/conf/web.xml
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>
org.apache.catalina.servlets.DefaultServlet
</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
...
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
因此在默認的情況下,默認servlet在webapp啓動時被裝載,目錄列表可被使用,日誌調試功能被關掉。
DefaultServlet允許以下初始化參數:
debug | 日誌級別。如果你不是tomcat開發人員,這對你沒有什麼用處。目前,有用的值是0, 1, 11, 1000。 |
---|---|
listings | 如果沒有歡迎文件,要不要顯示目錄列表?值可以是true 或 false。 歡迎文件是servlet api的一部分。 警告:列表顯示包含太多記錄的目錄是非常消耗服務性能的 . 大量請求訪問大目錄列表會吃掉服務器大部分的資源. |
readmeFile | 如果允許目錄列表,可能有一個readme文件和這個列表在一起。這個文件包含HTML被插入。默認值是null。 |
globalXsltFile | 如果你希望定製你的目錄列表顯示效果,你可以使用一個XSL轉換(transformation)。這個值是一個可用於所有目錄列表的絕對路徑文件名。它可以被每個webapp 重新自定義使用,或者通過在你局部webapp的web.xml文件裏聲明默認servlet取消使用。這個xml文件的格式在下面有顯示。 |
localXsltFile | 你還可以在每個目錄通過配置localXsltFile 定製你的目錄列表。它應該是在產生列表的目錄裏的一個相對路徑文件名。它覆蓋 。如果這個值存在,但是文件不存在,那麼就使用globalXsltFile。如果globalXsltFile也不存在,那麼默認的目錄列表就會被顯示出來。 |
input | 在讀取用於服務的資源時的輸入緩衝容量(in bytes)。[2048] |
output | 在讀取用於服務的資源時的輸出緩衝容量(in bytes)。[2048] |
readonly | 這個上下文否"read only",因此如PUT 和 DELETE的HTTP命令將被拒絕執行? [true] |
fileEncoding | 文件編碼用於讀取靜態資源時. [平臺默認值] |
sendfileSize | 如果連接器支持 sendfile, 這個參數表示sendfile將用到的最小文件大小(以KB爲單位) . 使用負數 可以禁止使用sendfile. [48] |
那麼在實際應當當中,我們的應用的一些靜態資源就可以交給該servlet去處理,以減輕服務器壓力,節省資源。比如我們把對靜態資源的訪問路徑從/變更爲/static,如訪問http://localhot/style.css改成http://localhost/static/style.css,然後再應用的web.xml文件中增加如下配置代碼:
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/static/*</url-pattern>
</servlet-mapping>
以此來實現簡單的動靜分離。