Pluto是一個(gè)滿足Portlet API規(guī)范的Portlet容器的實(shí)現(xiàn)
Pluto是一個(gè)滿足Portlet API規(guī)范的Portlet容器的實(shí)現(xiàn),它為開發(fā)者提供了一個(gè)運(yùn)行 portlets的工作平臺(tái)。然而,如果沒有一個(gè)驅(qū)動(dòng)器(driver),也就是Portal,的支持的話, 運(yùn)行和測(cè)試Portlet容器將非常之麻煩。Pluto本身也提供了一個(gè)簡單的Portal模塊,該模塊僅 僅是為了滿足Portlet容器和JSR 168的需要而寫的。如果你需要一個(gè)成熟的Portal,請(qǐng)參考 Jetspeed項(xiàng)目。Jetspeed項(xiàng)目關(guān)注的是Portal本身,而不是Portlet容器。
圖1是Portal的基本體系結(jié)構(gòu)圖。Portal Web Application處理客戶的請(qǐng)求,從客戶的當(dāng)前 頁中提取出portlets,然后調(diào)用portlet容器來獲得每一個(gè)portlet的內(nèi)容。Portal通過 Portlet容器的Invoker API來訪問portlet容器。這些API是portlet容器的主要調(diào)用接口, 它們?yōu)镻ortal提供了一些基于請(qǐng)求的方法來調(diào)用portlet。容器的使用者(即Portal,譯者 注)必須實(shí)現(xiàn)portlet容器的Container Provider SPI(Service Provider Interface)回調(diào)接口,來為portlet容器提供與Portal相關(guān)的信息。最后,portlet容器通 過Portlet API調(diào)用所有的portlets。
圖1:一個(gè)集成了Pluto的簡單Portal
Portlet容器
Portlet容器是portlets的運(yùn)行時(shí)環(huán)境,也是每一個(gè)Portal的核心組件。Portlet容器需要獲 取有關(guān)Portal本身的一些信息,還必須重用Portal的一些基本代碼。因此,Portlet容器可以 保證自己與其它的Portal組件之間是完全分開的。也就是說,你可以把一個(gè)獨(dú)立的Portlet容器 插入到任何一個(gè)Portal中去,只要它可以滿足Portlet容器的要求,比如實(shí)現(xiàn)了所有的SPI。
Portlet容器的Invoker API(也被稱為進(jìn)入點(diǎn))是Portlet容器的主要調(diào)用接口。這些API包 含Portlet容器的生命周期控制方法(init(),destroy())和基于請(qǐng)求的調(diào)用方法 (initPage(),performTitle(),portletService()等等)。由于Portlet容器最終是 去調(diào)用一個(gè)portlet,故這些方法的簽名和Portlet API的主要portlet接口很類似,除了一個(gè) 須額外傳入的portlet ID。Portlet容器可以通過這個(gè)額外傳入的portlet ID參數(shù)來決定調(diào)用 哪一個(gè)portlet。
除了可以使用Invoker API來調(diào)用Portlet容器外,Portal還必須實(shí)現(xiàn)Portlet容器定義的SPI。 因此,參考實(shí)現(xiàn)引入了“容器服務(wù)”的概念:容器服務(wù)用來定義一些能夠在容器中注冊(cè)的可插的組件, 這些組件要么提供一些基本的功能,要么對(duì)容器進(jìn)行擴(kuò)展。Pluto參考實(shí)現(xiàn)定義了下面這些內(nèi)建的 容器服務(wù)(前四個(gè)是運(yùn)行Portlet容器所必須實(shí)現(xiàn)的,而第五個(gè)則是可選的):
- Information Provider(信息提供者):為Portlet容器提供關(guān)于Portal及 其框架的信息。通過該接口只能夠獲得一些已知的或存在Portal中的信息。這些信息包括帶 導(dǎo)航狀態(tài)(navigational state)的URL生成、portlet上下文(portlet context)、 portlet模式(portlet mode)和窗口狀態(tài)(window state)控制。
- Factory Manager(工廠管理者):定義了如何通過工廠獲得一個(gè)實(shí)現(xiàn)(一般的 Portal應(yīng)該已經(jīng)實(shí)現(xiàn)了這樣的接口)。
- Log Service(日志服務(wù)):定義了輸出日志的方法(一般的Portal應(yīng)該已經(jīng)實(shí) 現(xiàn)了這樣的接口)。
- Config Service(配置服務(wù)):定義了如何獲得配置值(一般的Portal應(yīng)該已 經(jīng)實(shí)現(xiàn)了這樣的接口)。
- Property Manager(屬性管理者,可選):該服務(wù)讓Portal可以獲得JSR 168 規(guī)范中定義的屬性的值。
嚴(yán)格的說,Portlet Object Model(Portlet對(duì)象模型)也是一個(gè)SPI,但與其它的SPI相比, 它處在一個(gè)特殊的位置上。因此我們不把它看成是容器服務(wù)的一部分,因?yàn)樗幚硭械膒ortlet 對(duì)象,并包含了一些混雜的接口。
圖2:Portlet容器的體系結(jié)構(gòu)
Portlet的部署
Portlet容器是構(gòu)建在Servlet容器之上的,所以它可以重用Servlet容器的許多功能。為了達(dá)到 這一點(diǎn),portlet容器必須把一些servlet的屬性注入到每一個(gè)portlet應(yīng)用的war文件中,如 圖3所示。Portlet組件的部署器將在原先的war文件中注入一個(gè)新的或者修改過的web.xml,再 為每個(gè)portlet注入一個(gè)servlet包裹器,以此作為調(diào)用點(diǎn)。然后,portlet部署器將把這個(gè)修 改過的war文件傳給應(yīng)用服務(wù)器的部署器,以此來把它部署到應(yīng)用服務(wù)器的系統(tǒng)中。當(dāng)一個(gè) portlet被調(diào)用時(shí),portlet容器將調(diào)用注入的servlet包裹器,把這作為被部署的portlet的 war文件的進(jìn)入點(diǎn)。
圖3:參考實(shí)現(xiàn)中portlet的部署
Pluto和WSRP標(biāo)準(zhǔn)
JSR 168規(guī)范和Web Service for Remote Portlets(WSRP)標(biāo)準(zhǔn)有高度的一致性。這兩 個(gè)同時(shí)出現(xiàn)的標(biāo)準(zhǔn)都發(fā)布了開放源碼的實(shí)現(xiàn),它們的實(shí)現(xiàn)都完成了在相應(yīng)的規(guī)范中定義的所有必要 功能。這兩個(gè)標(biāo)準(zhǔn)都把能很好的互相協(xié)作作為它們共同的目標(biāo)。因此,WSRP portlets在 portlet容器中既可以作為消費(fèi)者運(yùn)行,也可以作為生產(chǎn)者運(yùn)行。
Pluto項(xiàng)目必須支持在一個(gè)Portal中運(yùn)行多個(gè)portlet容器。因此,Pluto Portlet容器可以 被多次初始化。更重要的是,它可以以不同的方式運(yùn)行,每個(gè)portlet容器都使用一個(gè)不同的SPI 實(shí)現(xiàn)。
posted on 2007-03-23 10:37 朱巖 閱讀(373) 評(píng)論(0) 編輯 收藏 所屬分類: Portal文章