第三節(jié) ?什么是Portlet
Portlet是Portal中最重要的組件,負(fù)責(zé)在Portal中呈現(xiàn)信息內(nèi)容,有相應(yīng)的生命周期。通過(guò)自定義Portlet,用戶(hù)很容易定義個(gè)性化的Portal頁(yè)面。Portlet由Portlet容器負(fù)責(zé)管理、處理請(qǐng)求并返回動(dòng)態(tài)頁(yè)面,可以作為Portal的可即插即用的界面組件。
1.3.1? P ortlet
一個(gè)Portlet是以Java技術(shù)為技術(shù)的Web組件,由Portlet容器所管理,專(zhuān)門(mén)處理客戶(hù)的信息請(qǐng)求以及產(chǎn)生各種動(dòng)態(tài)的信息內(nèi)容。Portlet 為可插式的客戶(hù)界面組件,提供呈現(xiàn)層成為一個(gè)信息系統(tǒng)。
這些由Portlet產(chǎn)生的內(nèi)容也被稱(chēng)為片段,而片段是具有一些規(guī)則的標(biāo)記( HTML、XHTML、WML ),而且可以和其他的片段組合而成一個(gè)復(fù)雜的文件。一個(gè)或多個(gè) Portlet 的內(nèi)容聚合而成為一個(gè) Portal 網(wǎng)頁(yè)。而 Portlet 的生命周期是被 Portlet 容器所管理控制的。
客戶(hù)端和Portlet的互動(dòng)是由Portal通過(guò)典型的請(qǐng)求/響應(yīng)方式實(shí)現(xiàn),正常來(lái)說(shuō),客戶(hù)會(huì)和Portlet所產(chǎn)生的內(nèi)容互動(dòng),舉例來(lái)說(shuō),根據(jù)下一步的連接或者是確認(rèn)送出的表單,結(jié)果 Portal將會(huì)接收到Portlet的動(dòng)作,將這個(gè)處理狀況轉(zhuǎn)向到目標(biāo)Portlet。這些Portlet 內(nèi)容的產(chǎn)生可能會(huì)因?yàn)椴煌氖褂谜叨胁煌淖兓耆歉鶕?jù)客戶(hù)對(duì)于這個(gè)Portlet的設(shè)置。
1.3.2 ? P ortlet與Servlet的關(guān)系
Portlet被定義成為一個(gè)新的組件,具有新的明確的界面與行為。為了盡可能與現(xiàn)有的 Servlet 結(jié)合達(dá)到重復(fù)使用的目的,Portlet 的規(guī)范利用了 Servlet 的規(guī)范,許多觀念都很相似的,結(jié)合 Portlet、Servlet 及 Jsp 在同一個(gè)網(wǎng)站系統(tǒng)中,我們稱(chēng)為Portlet 應(yīng)用 。在同一個(gè) Portlet 應(yīng)用 中,他們將分享同一個(gè)類(lèi)加載器(ClassLoader),上下文(Context) 及 Session。
①、Portlet 和 Servlet 的相似之處
@ Portlet 也是 Java 技術(shù)的 web 組件
@ Portlet 也是有特定的 container 在管理
@ Portlet 可以動(dòng)態(tài)產(chǎn)生各種內(nèi)容
@ Portlet 的生命周期由 container 所管理
@ Portlet 和客戶(hù)端的互動(dòng)是通過(guò) request/response 的機(jī)制
②、Portlet 和 Servlet 也有一些不同
@ Portlet 只產(chǎn)生 markup 信息片段,不是完整的網(wǎng)頁(yè)文件。而 Portal 會(huì)將所有的 Portlet markup 信息片段放到一個(gè)完整的 Portal 網(wǎng)頁(yè)。
@ Portlet 不會(huì)和 URL 有直接的關(guān)系
@ 客戶(hù)端必須通過(guò) portal 系統(tǒng)才能和 Portlet 互動(dòng)
@ Portlet 有一些定義好的 request 處理,action request 以及 render request。
@ Portlet 默認(rèn)定義 Portlet modes 及窗口狀態(tài)可以指出在網(wǎng)頁(yè)中該 Portlet 的哪個(gè)功能正在執(zhí)行及現(xiàn)在的 狀態(tài)。
@ Portlet 可以在同一個(gè) portal 網(wǎng)頁(yè)之中存在多個(gè)。
③、Portlet 有一些附加的功能是 Servlet 所沒(méi)有的
@ Portlet 能夠存取及儲(chǔ)存永久配置文件及定制資料。
@ Portlet 可以存取使用者數(shù)據(jù)
@ Portlet 具有 URL 的重寫(xiě)功能在文件中去動(dòng)態(tài)建立連結(jié),允許 portal server 不用去知道如何在網(wǎng)頁(yè)的片 段之中建立連結(jié)及動(dòng)作。
@ Portlet 可以?xún)?chǔ)存臨時(shí)性的數(shù)據(jù)在 Portlet session 之中,擁有兩個(gè)不同的范圍:
application-wide scope 及 Portlet private scope 。
④、Portlet 不具有一些功能, 但是 Servlet 卻有提供
@ Servlet 具有設(shè)置輸出的文字編碼( character set encoding)方式
@ Servlet可以設(shè)置 HTTP 輸出的 header
@ Servlet才能夠接收客戶(hù)對(duì)于 portal 發(fā)出的 URL 請(qǐng)求
1.3.3? P ortlet的生命周期
一個(gè)Portlet有著良好的生命周期管理,定義了怎樣裝載,實(shí)例化和初始化,怎樣響應(yīng)來(lái)自客戶(hù)端的請(qǐng)求及怎樣送出服務(wù)。這個(gè)Portlet生命周期由Portlet接口的init,processAction,render和destroy方法來(lái)表達(dá)。
載入和實(shí)例化:Portlet容器負(fù)責(zé)載入和實(shí)例化Portlet。當(dāng)Portlet容器運(yùn)行Portlet應(yīng)用或者延遲到Portlet需要服務(wù)使用者的請(qǐng)求時(shí),Portlet就會(huì)被載入并實(shí)例化。載入Portlet類(lèi)后,Portlet類(lèi)隨即被實(shí)例化。
初始化:Portlet類(lèi)實(shí)例化后,Portlet容器還需要初始化Portlet。以調(diào)用Portlet去響應(yīng)客戶(hù)端的請(qǐng)求。Portlet容器呼叫Portlet接口中的init方法初始化Portlet。擴(kuò)展自PortletConfig的類(lèi)可以取出定義在部署描述文件中的初始化參數(shù),以及Resource Bundle。
初始化異常:在 Portlet初始化期間,Portlet可能會(huì)丟出 UnavailableException 或 PortletException 異常。此時(shí),Portlet容器不能把 Portlet置入已啟動(dòng)的服務(wù),并且 Portlet容器必需釋放這個(gè) Portlet。 destory方法不能被呼叫,因?yàn)槌跏蓟徽J(rèn)為執(zhí)行失敗。發(fā)生 失敗后,Portlet容器會(huì)嘗試著重新實(shí)例化及初始化 Portlet。這個(gè)異常處理的規(guī)則是:由一個(gè)UnavailableException 指定一個(gè)不能執(zhí)行的最小時(shí)間,當(dāng)此異常發(fā)生時(shí),Portlet容器必需等到指定時(shí)間過(guò)去后才產(chǎn)生并且初始化一個(gè)新的 Portlet。
在初始化過(guò)程中所丟出的 Runtime Exception異常,被當(dāng)作 PortletException 來(lái)處理。
第四節(jié)? Liferay Portal工作原理
Portal系統(tǒng)根據(jù)需要由一個(gè)或者多個(gè)Portal頁(yè)面組成,每個(gè)Portal頁(yè)面包含零個(gè)或者多個(gè)的Portlet。每個(gè)Portlet呈現(xiàn)自己的信息內(nèi)容,以此實(shí)現(xiàn)內(nèi)容聚合。通過(guò)定義每個(gè)Portlet的可用權(quán)限,實(shí)現(xiàn)個(gè)性化的桌面信息定制。