OpenCms中所有的檔案通常都儲存在資料庫中,這也就是常說的OpenCms VFS(虛擬檔案系統)。也就是說在OpenCms工作區中看到的檔案結構在RFS(真實檔案系統,也就是硬碟上)上並不存在(靜態匯出操作除外),然而,為了JSP能夠正常工作,所有的OpenCms JSP檔案都映射到真實檔案系統中,也就是在硬碟上可以找到。
為了能夠理解這個過程,先讓我們看一下標準的JSP檔案是怎麼被處理的:
- JSP檔案必須存放於Web應用程式的根目錄下;
- JSP檔案必須以“*.jsp”結尾(可以web.xml檔案中進行配置);
- servlet容器接受JSP檔案的請求,被請求的檔案首先被轉化成Java類源碼,副檔名為“.java”。
- 在這個處理過程中,JSP directives(如<%@ include file= "..." %>)也被轉化,轉換成Java源碼。
- 產生的“.java”源碼然後被編譯成實現Servlet介面的類。
- 最後,servlet調用service()方法。
為了使OpenCms能夠做到與servlet容器無關性,它使用了一個簡單的技巧:把JSP從虛擬檔案系統映射到真實檔案系統,如下:
- 所有的OpenCms資源請求都由OpenCms servlet控制,通常映射至/opencms/opencms;
- 一旦OpenCms接到一個JSP資源的請求,它就會把請求的JSP檔案“儲存”到它自己的web應用程式根目錄下的“/WEB-INF/jsp/”下;
- 因為OpenCms中用online和offline區分一個資源的“發布”與“編輯”版本,所以在這個目錄(/WEB-INF/jsp/)下也產生online和offline兩個子目錄;
- 在這兩個目錄下,它把JSP檔案儲存體成帶有完整VFS路徑且以“.jsp”為尾碼的檔案;
- 例如:JSP檔案是在VFS中是“/index.jsp” ,它會被映射為真實檔案系統中的“/WEB-INF/jsp/online/index.jsp.jsp”,這叫做“檔案名稱轉換”的JSP。
- 當OpenCms儲存資源時,JSP directives(<%@ include file= "..." %> 和 <%@ page errorPage= "..."%)所指向的JSP檔案也同樣進行“檔案名稱轉換”處理,即把它們映射到真實檔案系統中;
- 假設我們在web應用目錄有一下檔案叫作“file.jsp”;
- OpenCms servlet調用requestDispatcher("{file.jsp}").include()並且把控制權傳遞到標準的servlet容器。剩下的步驟就和上面描述的標準的JSP處理一樣了。
如何區分
online
和
offline JSP
版本? 其實很簡單:因為OpenCms為online和offline下的不同版本的JSP分別儲存到兩個目錄,這樣servlet容器就把它們當作不同的檔案處理,也就做到了對offline下jsp的修改不會影響到online下的jsp。
注意:online和offline下的JSP有著同樣的web應用上下文,因為這一點,它們共用一個應用程式下下文對象,online和offline JSP頁面訪問的是同一組資料,不謹慎使用會引起未預期的副作用,可以通過嚴格地控制訪問應用程式內容物件來避免這些副作用。
在
OpenCms
靜態匯出中如何使用
JSP
? 使用OpenCms靜態檔案匯出能夠提高網站的效能。OpenCms對JSP檔案的管理也完全支援靜態匯出。當然,JSP通常是使用在動態網頁面中,因此,預設的產生的JSP檔案的匯出屬性預設為false,萬一想要匯出JSP,必須要手動設定JSP的匯出屬性為true。
為了支援到靜態匯出資源的連結,OpenCms中使用了<cms:link>標籤或cms.link方法(<cms:link>用法)。
另外,JSP directives中包含有檔案名稱時,不要使用類似“<jsp:directive.include file="..." />”的文法,而是要使用<%@ include file="..." %>的文法 ,因為OpenCms中不支援對類似“<jsp:directive.include file="..." />”的文法解析,也就是說不能處理這種文法中的JSP檔案,不能夠把它映射到真實檔案系統中。但對其它不包含檔案名稱的這種文法是支援的,如: <jsp:useBean id="..." /> 或 <jsp:setProperty name="..." />,它們可以在OpenCms的JSP中正常使用。
(謝謝關注OpenCms——中文資源第一部落格:http://blog.csdn.net/qianxuncms/,歡迎與作者直接交流,共同進步。MSN:qianxuncms@hotmail.com,QQ:9165456)