通常opencms的文件存放在數(shù)據(jù)庫(kù)中,也就是所謂的
Virtual File System (VFS)。這意味著在本地文件系統(tǒng)中不存在和OpenCms workplace的explorer視圖的相同的文件結(jié)構(gòu)。然而,為了讓jsp文件正常工作,opencms中所有的jsp文件“鏡象”到了本地文件系統(tǒng)中。
讓我們首先看一下一個(gè)“標(biāo)準(zhǔn)”的jsp文件是如何被處理的:
- jsp文件必須存在于web應(yīng)用的目錄中。
- 文件的后綴必須是.jsp(你可以通過(guò)配置web.xml對(duì)此做修改)。
- 當(dāng)servlet容器接收到針對(duì)web應(yīng)用的jsp文件的請(qǐng)求時(shí),被請(qǐng)求的jsp文件首先要轉(zhuǎn)換成java源文件,即.java文件。
- 在轉(zhuǎn)換的過(guò)程中,jsp標(biāo)簽(如<%@ include file= "..." %>)被解析并轉(zhuǎn)換成java代碼。
- 轉(zhuǎn)換的java文件實(shí)現(xiàn)Servlet接口,并被編譯為class文件。
- 最后,調(diào)用class的service()方法。
為了使opencms獨(dú)立于servlet容器,它使用了一個(gè)小技巧-將jsp文件從VFS中鏡象到本地文件系統(tǒng),方法如下:
- 對(duì)opencms所有資源的請(qǐng)求都由opencms Servlet來(lái)處理,該servlet一般映射為
/opencms/opencms。
- 當(dāng)opencms收到對(duì)jsp資源的請(qǐng)求時(shí),它將被請(qǐng)求jsp文件的內(nèi)容導(dǎo)入到opencms web應(yīng)用的根目錄的一個(gè)子目錄
/WEB-INF/jsp
中。
- 因?yàn)閛pencms的資源分為Online和offline,
/WEB-INF/jsp中存在子目錄online和offline和此對(duì)應(yīng)。
- 在此目錄中,被導(dǎo)出的jsp文件擁有完整的VFS路徑結(jié)構(gòu)和.jsp后綴。例如,你的文件在VFS中是"/index.jsp",被導(dǎo)出后它將是WEB-INF/jsp/online/index.jsp.jsp文件(譯者注:目前opencms6.2.1可以判斷導(dǎo)出的文件是否存在jsp后綴,而不是傻傻的直接添加)。我們可以將這個(gè)叫做jsp的“轉(zhuǎn)換文件名”。
- 當(dāng)opencms導(dǎo)出資源時(shí),會(huì)使用一個(gè)簡(jiǎn)單的解析器對(duì)jsp文件內(nèi)容進(jìn)行預(yù)處理,以查找引用其他jsp文件的表情,最明顯的是<%@ include file= "..." %> 和 <%@ page errorPage= "..."%>
如果發(fā)現(xiàn)這樣的標(biāo)簽,目標(biāo)文件名將會(huì)被這個(gè)資源在真是文件系統(tǒng)的轉(zhuǎn)換文件名替換。
- 現(xiàn)在在web應(yīng)用的目錄下我們已經(jīng)有了一個(gè)jsp文件,我們叫他"{file.jsp}"
- Opencms servlet(它仍然是控制器)現(xiàn)在調(diào)用requestDispatcher("{file.jsp}").include(),然后將控制權(quán)轉(zhuǎn)交給標(biāo)準(zhǔn)的servlet容器。
然后按上面所述的標(biāo)準(zhǔn)jsp處理步驟進(jìn)行處理。需要注意的是,在這個(gè)過(guò)程中,opencms仍然使用Request和Response包裝器(Wrappers)來(lái)生成FlexCache條目。