涂 飛,揭金良
(成都理工大學(xué)信息工程學(xué)院,成都610059)
隨著網(wǎng)絡(luò)技術(shù)的不斷發(fā)展以及對網(wǎng)站訪問頻率的快速提高,用戶一直在追求一種快速響應(yīng)、內(nèi)容整合且又能極大地滿足用戶的個性設(shè)置的頁面,尤其在企業(yè)級應(yīng)用中,這種需求更為突出。而傳統(tǒng)的展示方式顯然已經(jīng)不能滿足這個需求。在眾多的技術(shù)專家和科技人員的共同努力下,Portal的提出極大地滿足了這個需求。
在Portal Server的支持下, Portal是一種Web應(yīng)用,通常用來提供個性化、單點登錄和聚集各個信息源的內(nèi)容,并作為信息系統(tǒng)表現(xiàn)層的宿主。聚集是指將來自各個信息源的內(nèi)容集成到一個Web頁面里的活動[1]。并且隨著Portal技術(shù)的不斷發(fā)展,開發(fā)人員也能夠?qū)⑵渑cStruts和JSF等其他作用于表示層的技術(shù)整合到一起。
Portlet 是采用 Java 技術(shù)的 Web 組件,由 Portlet Container 管理,專門處理客戶的請求,產(chǎn)生各種動態(tài)信息。Portlet 為可插式 ( pluggable ) 的客戶界面組件,這些由 Portlet 產(chǎn)生的內(nèi)容也被稱為片段 (fragment),而片段是具有一些規(guī)則的Markup(HTML、XHTML、WML),而且可以和其他的片段組合成一個復(fù)雜的文件[2]。Portlet 中的內(nèi)容與其他 Portlet 的內(nèi)容聚合,成為一個 Portal 網(wǎng)頁,Portlet 的生命周期由 Portlet Container 管理控制??蛻舳撕?Portlet 的互動由 Portal 通過典型的請求/響應(yīng)方式實現(xiàn)。
如圖1,Portal頁面由1個或多個Portlet窗口組成,每個Portlet窗口又分為兩部分:(1)外觀,它決定了Portlet窗口的標(biāo)題條、控制和邊界的樣式。(2)Portlet段,它由Portlet應(yīng)用填充。Portal服務(wù)器決定了Portal頁面的整體觀感,像標(biāo)識、標(biāo)題條顏色和控制圖標(biāo)等。通過修改幾個JSP和CSS模板文件就可以改變Portal的整個觀感。同時,Portlet本身也可被設(shè)定成多種模式,包括查看(View)、編輯(Edit)和幫助(Help),通過對這些模式的設(shè)定和選取,使得用戶能有更好的體驗。同時Portlet還允許每個窗口在被最大化、最小化和正常情況下,顯示不同的內(nèi)容,這就極大地豐富了每個Portlet的現(xiàn)實方式。
圖1 Portal頁面效果示意圖
Portal Server可以生成多種標(biāo)記語言格式的頁面,并支持移動設(shè)備,這些標(biāo)記語言有:適用于臺式計算機和個人數(shù)字助理的HTML、適用于WAP 設(shè)備的 WML,以及適用于 NTT DoCoMo iMode 網(wǎng)絡(luò)中的移動設(shè)備的 cHTML。有了這3種標(biāo)記語言,您可以利用轉(zhuǎn)碼(Transcoding)技術(shù)使Portal在3種標(biāo)記語言間隨意轉(zhuǎn)換。這意味著,即便Portal開發(fā)者并未明確支持移動設(shè)備,Portal也可以輕易地、自動地支持各種移動設(shè)備。門戶網(wǎng)站頁面聚集的子系統(tǒng)支持若干種設(shè)備標(biāo)記語言,能夠以“取出即可用”的方式識別某些瀏覽器和移動設(shè)備的用戶代理簽名。用以支持設(shè)備標(biāo)記語言的框架是開放的和可擴展的,所以要支持其它標(biāo)記語言或新設(shè)備也很容易[2]。這就賦予了Portal強大的生命力和可擴展性,如圖2。
圖2 Portal架構(gòu)圖
Portal的目的是在有效的網(wǎng)絡(luò)環(huán)境下,把各種應(yīng)用系統(tǒng)資源、數(shù)據(jù)資源、信息資源統(tǒng)一集成到一個平臺之下,根據(jù)每個用戶使用特點和角色的不同,形成個性化的應(yīng)用界面,并通過對事件和消息的處理,把用戶有機地聯(lián)系在一起。
Portlet會生成標(biāo)記片段,這些片段配上主題、控制按鈕以及其他裝飾所形成的新的片段就叫做Portlet窗口。而一個Portal頁面就是由Portal整合了這些Portlet,形成一個完整的文件。由于每一個窗口都有一個唯一的Portlet生成并處理相關(guān)的請求,因此在設(shè)計實現(xiàn)Portlet時,我們需要知道Portlet是如何處理用戶的請求以及最終的響應(yīng)的[4]。
Portlet同Servlet相比,有許多相同的地方,如都是基于Web組件的Java技術(shù),都有專門的容器管理,能夠動態(tài)地生成內(nèi)容,都是采用請求/響應(yīng)模式實現(xiàn)服務(wù)器端和客戶端的交互,因此Portlet能夠?qū)崿F(xiàn)MVC模式,如圖3。
圖3 Portlet的MVC框架示意圖
從圖3中,我們能夠看到當(dāng)用戶的請求抵達Portal時,Portal首先將Servlet請求轉(zhuǎn)化成Portlet請求,然后通過調(diào)用Portlet的API,將請求交與Portlet處理,待請求處理完畢之后, Portal再將Portlet轉(zhuǎn)化為Servlet返回給用戶。而Portlet在處理和響應(yīng)請求時也是使用MVC模式對各組件進行分工,各組件功能如下:
(1)模型:在Portlet框架中,對模型并沒有太多的規(guī)定,可以是具體的內(nèi)容、本地應(yīng)用或者Web Service等。與其他的MVC框架一樣,在Portlet中,模型最主要的功能就是提供并處理數(shù)據(jù),實現(xiàn)業(yè)務(wù)邏輯。
(2)視圖:Portlet中也是將JSP作為主要視圖工具,用于接受模型發(fā)出的數(shù)據(jù),更新顯示用戶界面。由于Portlet的特殊作用,因此除了基本的JSTL標(biāo)簽外,Portlet還為用戶設(shè)計提供了專門針對Portlet的標(biāo)簽庫。
(3)控制器:GenericPortlet是Portlet中的核心組件,在MVC的模式中充當(dāng)控制器角色。在Portlet中,GenericPortlet會接受來自視圖層的請求,通過對請求的識別和判斷進行相應(yīng)的頁面處理和轉(zhuǎn)發(fā)。前文已經(jīng)提到,為每一個Portlet設(shè)定了3種模式:查看(View),編輯(Edit)和幫助(Help),在GenericPortlet中,也有相對應(yīng)的3個接口:doView(),doEdit()和doHelp()。在編程時,通過對相關(guān)方法的重寫就能實現(xiàn)所希望的功能。同時GenericPortlet還能根據(jù)每個Portlet的窗口大小變化而展示不同的內(nèi)容[3~4]。
(4)配置文件:Portlet的配置文件分為兩部分:a. JSR-168所要求的Portlet部署描述符Portlet.xml,用于指定Portlet的相關(guān)信息,包括所指定的該Portlet的類,所設(shè)定的模式(查看、編輯或者幫助),所顯示的名稱等消息[1]。b. 服務(wù)于所使用的Portal Server,主要是向Server指定相關(guān)Portlet實例引用關(guān)系,對Portlet的主題進行設(shè)定,在Portal上顯示的位置等布局設(shè)置[4]。
該系統(tǒng)是某著名電氣公司為監(jiān)控其部署在各地的產(chǎn)品線上的眾多產(chǎn)品應(yīng)用狀態(tài)而設(shè)計實現(xiàn)的。這些產(chǎn)品從屬于不同的業(yè)務(wù)模塊,因此在實現(xiàn)時應(yīng)根據(jù)業(yè)務(wù)模塊來分別顯示。而所需要監(jiān)控的狀態(tài)包括產(chǎn)品的總體可靠性、產(chǎn)出性能、以及每個產(chǎn)品應(yīng)用內(nèi)部的各個事務(wù)的執(zhí)行情況。用戶在使用該系統(tǒng)時,既能夠總體地了解當(dāng)前各個業(yè)務(wù)的應(yīng)用運行情況,如某業(yè)務(wù)的所有應(yīng)用中,有多少個應(yīng)用是處于休眠狀態(tài),有多少個是激活狀態(tài),有多少個是處于建造狀態(tài)等, 同時也能夠針對業(yè)務(wù)進行更加詳細(xì)的了解,查看部署在各地的應(yīng)用狀態(tài)的詳細(xì)視圖。因此,所需要實現(xiàn)的系統(tǒng)能夠提供3種查看視圖:各業(yè)務(wù)的全局狀態(tài)圖,業(yè)務(wù)內(nèi)部各個應(yīng)用狀態(tài)的詳細(xì)信息展示圖以及每個應(yīng)用的事物信息展示圖。
3.2.1 Portal Server的選取
要實現(xiàn)基于Portlet 框架的開發(fā)和應(yīng)用的部署,需要有相關(guān)容器來支持。在當(dāng)前流行的Server中,應(yīng)用范圍廣泛的有Liferay Portal、JBoss Portal以及Websphere Portal等。由于各個Portal Server都必須基于JSR-168 Portlet Specification,因此在編碼上相互間的區(qū)別不大,只是使用時可能采取的配置方式不盡相同??紤]到版權(quán)以及后期服務(wù)支持的原因,本系統(tǒng)所使用的服務(wù)器版本是JBoss-Portal-2.6.6。
3.2.2 模型層的實現(xiàn)
模型層是應(yīng)用程序的主體,它用于表示業(yè)務(wù)數(shù)據(jù)和業(yè)務(wù)邏輯,負(fù)責(zé)完成訪問和操縱數(shù)據(jù)庫。根據(jù)控制層的要求,查找相關(guān)的數(shù)據(jù),完成某種業(yè)務(wù)需求,然后通過模型接口,把數(shù)據(jù)上傳到視圖中。在本系統(tǒng)中,針對每一個業(yè)務(wù),都定義了3種值對象:BusinessGlobalInfo,用來記錄該業(yè)務(wù)的全局狀態(tài)信息;Application-DetailInfo,用來記錄每個業(yè)務(wù)內(nèi)各個應(yīng)用狀態(tài)的信息;Transaction-DetailInfo,用來記錄每個應(yīng)用的事務(wù)狀態(tài)。針對每一種值對象,都有一個相應(yīng)的DAO對象,用來從數(shù)據(jù)源獲取數(shù)據(jù)。
3.2.3 控制器的實現(xiàn)
控制器主要負(fù)責(zé)接收客戶端請求,據(jù)此作出相應(yīng)的處理,生成相應(yīng)的頁面并呈現(xiàn)在客戶端Web 瀏覽器上,其位于視圖組件和模型組件之間,將二者有機地聯(lián)系在一起,發(fā)揮著強大的協(xié)調(diào)作用,也使Web 應(yīng)用的業(yè)務(wù)邏輯和表現(xiàn)邏輯分離,提高了Web 系統(tǒng)的可維護性、可擴展性、可移植性和組件的可復(fù)用性。在本例中,針對每一個業(yè)務(wù)都設(shè)計了若干個Portlet類,它們都擴展了Generic-Portlet,并根據(jù)用戶請求的不同,做出相應(yīng)的跳轉(zhuǎn)和顯示。例如我們定義了一個BusinessGlobalPortlet,用來處理有關(guān)顯示全局業(yè)務(wù)狀態(tài)的Portlet窗口的所有時間。若用戶需要對某一個業(yè)務(wù)進行更詳細(xì)的了解,只需最大化該Portlet窗口,此時BusinessGlobalPortlet將會調(diào)用processAction()方法,通過從參數(shù)ActionRequest對象中獲取的窗口變化狀態(tài)來確定當(dāng)前顯示的表示層的頁面效果。
事實上,執(zhí)行所有的與Portlet相關(guān)的動作時,Portlet容器都會先調(diào)用該方法,并在該方法向PortletRequest注入從表示層傳遞來的參數(shù)或者動作信號。然后再通過從Portlet.xml配置文件中讀取出來的對BusinessGlobalPortlet所設(shè)定的模式來確定接下來的是執(zhí)行doView()、doHelp()或者doEdit(),而在本例中,所采用的模式是View,在doView()方法中我們再進行具體的業(yè)務(wù)邏輯運算,并且通過PortletRequestDispatcher來完成頁面的跳轉(zhuǎn)[3~4]。
3.2.4 表示層的實現(xiàn)
由于Portal本身是基于Java的一種技術(shù),因此Portlet也將JSP作為主要的視圖表示方式,因此該系統(tǒng)的表示層就是一堆JSP文件,而這些JSP文件都使用到了Portlet所提供的標(biāo)簽庫,并將被Portlet Server調(diào)用。
3.2.5 配置文件
前文已經(jīng)說到,在Portlet中,配置文件分為兩個部分:(1)對Portlet本身進行定義。(2)為Portal Server提供索引,從而讓Server能夠找到所需要運行、維護的Portlet對象,以及對Portlet窗口布局、顯示效果的設(shè)定。在本例中,我們選取Jboss-portal作為服務(wù)器,因此需根據(jù)Jboss-portal的配置文件的定義方式,為Portal Server指定相應(yīng)的Portlet。具體如下:在portlet.xml中指定Portlet的相關(guān)屬性,包括Portlet名字、對象和模式等,然后再在一個**-Object.xml(在Jbossportal中,是由一個以-Object.xml結(jié)尾的文件來設(shè)置與Server相關(guān)的配置信息)文件中為Server設(shè)定Portlet實例、部署、窗口顯示信息以及其他的一些信息[4]。
基于Portal框架開發(fā)的Web應(yīng)用系統(tǒng),能夠極大地聚集并展示各個應(yīng)用系統(tǒng)的信息,通過統(tǒng)一的Portal入口,用戶省去了登陸各個系統(tǒng)的重復(fù)性操作,從而提高了用戶的工作效率,方便了管理人員作出決策并簡化了工作環(huán)節(jié)、降低了可能的系統(tǒng)安全隱患,因此能快速適應(yīng)新業(yè)務(wù)的需求[2]。正因為這些,現(xiàn)在Portal技術(shù)已經(jīng)被越來越多地采用,為用戶提供了豐富的展示內(nèi)容和新穎的展示方式,并能允許用戶高度化地定制,而且也能夠與其它框架一起結(jié)合使用,從而使得編碼和維護的成本進一步降低。
依據(jù)某公司多業(yè)務(wù)狀態(tài)信息展示需求,本例利用MVC 設(shè)計模式開發(fā)基于Portal 框架的顯示面板,加快了用戶查看各個業(yè)務(wù)狀態(tài)的速度并以此作出相應(yīng)的決策,提高了工作效率,且提供了一種更加友好的展示方式。
[1] Java Community Process. JSR 168: Portlet Specification [EB/OL] .[2009-10-4] . http://www.jcp.org/en/jsr/detail?id=168.
[2] 高加旺. Portal技術(shù)簡介[EB/OL] . [2009-10-7] . http://www.doc88.com/p-566038020.html.
[3] Oracle.JSR-168 javax.portlet API[EB/OL] .[2009-10-4] . http://www.oracle.com/techno. logy/products/webcenter/files/pdk_downloads/wsrp/api/index.html.
[4] JBoss Portal. JBoss Portal 2.6.6 Reference Guide[EB/OL] .[2009-10-10] .http://docs. jbos.s.org/jbportal/v2.6.6/reference.