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中正常使用。
新聞熱點
疑難解答