日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

opencms的主工作区文件研究

發(fā)布時間:2024/1/17 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 opencms的主工作区文件研究 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

引入:

在我們第一次打開openCMS主工作區(qū)的時候,我們的請求地址是:http://localhost:8080/opencms/opencms/system/workplace/views/workplace.jsp, 它會打開一個類似如下的工作區(qū)界面:


細(xì)心的讀者會發(fā)現(xiàn),此工作區(qū)文件workplace.jsp在整個opencms.war中根本就沒有,那么這個頁面到底來自哪里呢?


解決:

我們做了調(diào)試,當(dāng)請求到達(dá)opencms時候,它最早會進(jìn)入OpenCmsServlet的doGet()方法,它進(jìn)而會去調(diào)用OpenCmsCore的showResource()方法:

protected?void?showResource(HttpServletRequestreq,HttpServletResponse?res)?{CmsObject?cms?=?null;try?{cms?=?initCmsObject(req,?res);….//?user?is?initialized,?now?deliver?the?requested?resourceCmsResource?resource?=?initResource(cms,?cms.getRequestContext().getUri(),req,res);if?(resource?!=?null){//?a?file?was?read,?go?on?process?itm_resourceManager.loadResource(cms,?resource,?req,?res);m_sessionManager.updateSessionInfo(cms,?req);}}?catch?(Throwable?t)?{errorHandling(cms,?req,?res,?t);} }

此方法從宏觀上做了幾件大事:

(1)初始化CMS對象和當(dāng)前用戶配置信息(這個我們沒興趣)

(2)根據(jù)請求URL獲取Resource對象(這應(yīng)該是一個對象ID)。

(3)讓CmsResourceManager載入Resource對象(這應(yīng)該是一個真實頁面)

我們逐個分析。



亮點1: 如何根據(jù)請求URL獲取Resource對象:

對于根據(jù)請求URL獲取Resource對象,可以看到它首先調(diào)用了CmsResource的initResource()方法,而initResource()方法會調(diào)用CmsObject的readDefaultFile方法來從CMS的VFS(虛擬文件系統(tǒng))中獲取指定的Resource. 這個readDefaultFile會根據(jù)請求的資源URI來創(chuàng)建一個UUID,然后獲取資源對象,如果獲取不成功,則直接通過URI來獲取資源對象。這里從調(diào)試過程可以看出,它是直接通過URI來獲取資源對象:

而獲取方式則是通過CmsSecurityManager的readResource()方法,它進(jìn)而會委托CmsDriverManager的readResource()方法來從數(shù)據(jù)庫中獲取Resource對象:

public?CmsResource?readResource(CmsDbContext?dbc,?String?resourcePath,CmsResourceFilter?filter)throwsCmsDataAccessException?{CmsUUID?projectId?=getProjectIdForContext(dbc);//?please?note:?the?filter?will?be?applied?in?the?security?manager?laterCmsResource?resource?=getVfsDriver(dbc).readResource(dbc,?projectId,?resourcePath,filter.includeDeleted());//?context?dates?need?to?be?updatedupdateContextDates(dbc,?resource);//?return?the?resourcereturn?resource; }

從調(diào)試結(jié)果可以看,它會構(gòu)建以下的查詢語句:

SELECT?CMS_OFFLINE_STRUCTURE.STRUCTURE_ID,CMS_OFFLINE_STRUCTURE.RESOURCE_ID,CMS_OFFLINE_STRUCTURE.RESOURCE_PATH,CMS_OFFLINE_STRUCTURE.STRUCTURE_STATE,CMS_OFFLINE_STRUCTURE.DATE_RELEASED,CMS_OFFLINE_STRUCTURE.DATE_EXPIRED,CMS_OFFLINE_STRUCTURE.STRUCTURE_VERSION,CMS_OFFLINE_RESOURCES.RESOURCE_ID,CMS_OFFLINE_RESOURCES.RESOURCE_TYPE,CMS_OFFLINE_RESOURCES.RESOURCE_FLAGS,CMS_OFFLINE_RESOURCES.RESOURCE_STATE,CMS_OFFLINE_RESOURCES.DATE_CREATED,CMS_OFFLINE_RESOURCES.DATE_LASTMODIFIED,CMS_OFFLINE_RESOURCES.USER_CREATED,CMS_OFFLINE_RESOURCES.USER_LASTMODIFIED,CMS_OFFLINE_RESOURCES.PROJECT_LASTMODIFIEDASLOCKED_IN_PROJECT,CMS_OFFLINE_RESOURCES.RESOURCE_SIZE,CMS_OFFLINE_RESOURCES.DATE_CONTENT,CMS_OFFLINE_RESOURCES.SIBLING_COUNT,CMS_OFFLINE_RESOURCES.RESOURCE_VERSION,CMS_OFFLINE_RESOURCES.PROJECT_LASTMODIFIEDFROM?CMS_OFFLINE_STRUCTURE,CMS_OFFLINE_RESOURCES?WHERECMS_OFFLINE_STRUCTURE.RESOURCE_PATH='/system/workplace/views/workplace.jsp'?ANDCMS_OFFLINE_STRUCTURE.RESOURCE_ID=CMS_OFFLINE_RESOURCES.RESOURCE_ID?ORDER?BYCMS_OFFLINE_STRUCTURE.STRUCTURE_STATE?ASC

此查詢的用意是根據(jù)請求的RESOURCE_PATH來查找CMS離線結(jié)構(gòu)表CMS_OFFLINE_STRUCTURE(很好理解,因為這塊是框架層面的,不是對外作為站點內(nèi)容給用戶看的,所以這些資源應(yīng)該是offline的結(jié)構(gòu)資源),獲取對應(yīng)的RESOURCE_ID和其他一些相關(guān)信息:

這樣,我們就獲得了資源ID為9c0a79be-f058-11d8-ba65-db38cc8f19d7 的資源,這就是請求workplace.jsp的資源ID。此資源對象的信息從調(diào)試器中獲知為:

[org.opencms.file.CmsResource,?path:/system/workplace/views/workplace.jsp,?structure?id840ccc67-11b7-11db-91cd-fdbae480bac9,?resource?id:9c0a79be-f058-11d8-ba65-db38cc8f19d7,?type?id:?4,?folder:?false,?flags:?0,?project:00000000-0000-0000-0000-000000000000,?state:?0,?date?created:?Mon?Jun?2716:00:00?CST?2005,?user?created:?c300ba5c-01e8-3727-b305-5dcc9ccae1ee,?datelastmodified:?Mon?Jan?29?18:25:58?CST?2007,?user?lastmodified:c300ba5c-01e8-3727-b305-5dcc9ccae1ee,?date?released:?Thu?Jan?01?08:00:00?CST1970,?date?expired:?Sun?Aug?17?15:12:55?CST?292278994,?date?content:?Sun?Nov?3008:06:18?CST?2014,?size:?1546,?sibling?count:?2,?version:?1]


亮點2:如何根據(jù)Resource對象獲得真實Resource并進(jìn)行渲染:

這就是靠CmsResourceManager的loadResource()方法來做具體的文件讀取,然后通過CmsSessionManager來更新會話了。具體略,其實質(zhì)就是通過剛才的ResourceID查找CMS_CONTENT表獲取對應(yīng)的頁面JSP文件,然后利用合適的加載器來加載。因為fileType是jsp,所以最終使用的加載器是CmsJspLoader.

我們查找數(shù)據(jù)庫CMS_CONTENTS表,果然找到了對應(yīng)的記錄:

將該BLOB打開,我們查看內(nèi)容:


發(fā)現(xiàn)它是用的frameset結(jié)構(gòu),之前會先外部引入一些js 文件,比如explorer.js,ajax.js,top_js.jsp,之后在frameset中,又會先包含top_head.jsp,主體和top_foot.jsp ,而這一切和我們從Firebug的網(wǎng)絡(luò)視圖中看到的是一樣的:


總結(jié):

(1)這些最終請求的資源文件都以BLOB形式存放在數(shù)據(jù)庫中而不是直接在opencms.war中。

(2)從請求URI到資源ID獲取通過查找CMS_OFFLINE_STRUCTURE和CMS_OFFLINE_RESOURCES這兩張表。CmsResource,CmsObject,CmsSecurityManager,CmsDriverManager都參與其中。

(3)從資源ID到真實頁面的JSP文件通過查找CMS_CONTENTS表,CmsResourceManager參與其中。



轉(zhuǎn)載于:https://blog.51cto.com/supercharles888/1584645

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結(jié)

以上是生活随笔為你收集整理的opencms的主工作区文件研究的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。