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