什麼是Portlet

來源:互聯網
上載者:User
Portlets
“Portlets是一種Web組件-就像servlets-是專為將合成頁面裡的內容聚集在一起而設計的。通常請求一個portal頁面會引發多個portlets被調用。每個portlet都會產生標記段,並與別的portlets產生的標記段組合在一起嵌入到portal頁面的標記內。”(摘自Portlet規範,JSR 168)

本文探討了以下內容:
1.        Portal頁面的元素
2.        Portal是什麼。
3.        Portlets是什麼。
4.        開發“Hello World” Portlet
5.        在Pluto上部署HelloWorld Portlet
6.        如何建立Portal頁面
7.        結束語
8.        資源

  Portlet規範將portlet定義為一種“基於Java技術的web組件,由處理請求和產生動態內容的portlet容器管理”。這段話聽起來是不是有些費解。本文將說明portlets是什麼以及能用它們做什麼。


圖1顯示了在訪問一個portal伺服器時瀏覽器中頁面的樣子。


圖1 典型的portal伺服器的頁面(點擊查看原圖)

  如果仔細查看瀏覽器裡的頁面,就會看到頁面是由不同的“視窗”組成的。一個視窗用於重新整理天氣,另一個用於新聞,還有一個用於重新整理股價,等等。這裡的每一個視窗都代表了一個portlets。如果看得再仔細些,還會發現每個視窗都有一個標題條和一些按鈕,包括最小化和最大化按鈕。

  在系統裡,這些視窗是相互獨立開發、各不同的應用。新聞portlet的開發人員建立應用並打包成war格式的檔案,隨後portal伺服器的管理員在伺服器上部署該war檔案並建立頁面,接下來每個使用者會選擇在他的頁面裡有哪些應用。例如,如果使用者對股價不感興趣而對體育感興趣,他可以用“體育”視窗替換“股價”視窗。

  Portlet技術需要學習許多新概念,本文不可能全都涵蓋,因此本文分為兩部分。在第一部分裡我們詳細說明portals和portlets,並開發一個簡單的“Hello World”portlet;在第二部分我們將探討一些進階主題。

  我們將用Apache的Pluto伺服器(Portlet API 1.0規範的參考實現)來測試我們的樣本portlets,我們還會花些時間探討如何安裝和使用Pluto伺服器。

Portal頁面的元素

圖2顯示了Portal頁面的各種元素。


圖2 portal頁面的元素

  每個portlet頁面由一個或多個portlet視窗組成,每個portlet視窗又分為兩部分:一個是外觀,它決定了portlet視窗的標題條、控制和邊界的樣式;另一個是portlet段,它由portlet應用填充。

  Portal伺服器決定了portal頁面的整體觀感,像標識、標題條顏色、控製圖標等。通過修改幾個JSP和css模板檔案就可以改變portal的整個觀感。我們將在“如何建立portal頁面”部分對此做深入討論。

Portal是什麼。

  在瞭解portlet之前有必要先瞭解portal。在Portlet規範裡是這樣講的:“portal是一種web應用,通常用來提供個人化、單次登入、聚集各個資訊源的內容,並作為資訊系統資料表現層的宿主。聚集是指將來自各個資訊源的內容整合到一個web頁面裡的活動”。

  Portal的功能可以分為三個主要方面:
1.        Portlet容器:Portlet容器與servlet容器非常類似,所有的portlet都部署在portlet容器裡,portlet容器控制portlet的生命週期並為其提供必要的資源和環境資訊。Portlet容器負責初始化和銷毀portlets,向portlets傳送使用者請求併合成響應。
2.        內容聚集:Portlet規範中規定portal的主要工作之一是聚集由各種portlet應用產生的內容,我們將在“如何建立Portal頁面”部分對此做進一步討論。
3.        公用服務:portlet伺服器的一個強項是它所提供的一套公用服務。這些服務並不是portlet規範所要求的,但portal的商業實現版本提供了豐富的公用服務以有別於它們的競爭者。在大部分實現中都有望找到的幾個公用服務有:
         o 單次登入:只需登入portal伺服器一次就可以訪問所有其它的應用,這意味著你無需再分別登入每一個應用。例如一旦我登入了我的intranet網站,我就能訪問mail應用、IM訊息應用和其它的intranet應用,不必再分別登入這些應用。
  Portal伺服器會為你分配一個通行證庫。你只需要在mail應用裡設定一次使用者名稱和密碼,這些資訊將以加密的方式儲存在通行證庫中。在你已登入到intranet網站並要訪問mail應用的時候,portal伺服器會從通行證庫中讀取你的通行證替你登入到mail伺服器上。你對其它應用的訪問也將照此處理。
          o個人化:個人化服務的基本實現使使用者能從兩方面個人化她的頁面:第一,使用者可以根據她的自身喜好決定標題條的顏色和控製圖標。第二,使用者可以決定在她的頁面上有哪些portlets。例如,如果我是個體育迷,我可能會用一個能提供我鐘愛球隊最新資訊的portlet來取代股票和新聞portlets。
        一些在個人化服務方面領先的商業實現版本允許你建立為使用者顯示什麼樣的應用所依據的標準(如收入和興趣)。在這種情況下,可以設定一些像“對任何收入為X的使用者顯示饋贈商品的portlet”和“對任何收入為X的使用者顯示打折商品的portlet”這樣的商業規則。

        此外還有一些公用服務,比如機器翻譯,是由portal伺服器將portlet產生的內容翻譯為使用者要求的語言。大部分的商業portal伺服器都支援手持功能訪問並具有針對不同的瀏覽終端產生不同內容的能力。

Portlets是什麼。

  與servlets類似,portlets是部署在容器內用來產生動態內容的web組件。從技術角度講portlet是一個實現了javax.portlet.Portlet介面的類,它被打包成war檔案格式部署到portlet容器裡。

  Portlets在以下方面與servlets相似:
1.        portlets由特定的容器管理。
2.        portlets產生動態內容。
3.        portlet的生命週期由容器管理。
4.        portlets通過請求/響應模式與web用戶端互動。

  Portlets在以下方面與servlets相異:
1.        portlets只能產生標記段,而不是整個文檔。
2.        portlets沒有可供直接存取的URL地址。不過你還是能夠讓別人通過URL訪問到portlet,你可以把包含該portlet的頁面的URL發給他。
3.        portlets不能隨意地產生內容,這是因為portlet產生的內容最終要成為portal頁面的一部分。如果portal伺服器要求的是html/text類型,那麼所有的portlets都應產生html/text類型的內容。再比方說,如果portal伺服器要求的是WML類型,那麼所有的portlets都應產生WML類型的內容。

  portlets還提供了一些附加的功能:
1.        設定參數的持久化儲存:portlets提供了一個PortletPreferences對象用來儲存使用者的設定參數。這些參數被存入一個持久化資料庫,這樣伺服器重啟後資料依然有效。開發人員不必關心這些資料存放區的具體實現機制。
2.        請求處理:portlets提供了更為細粒度的請求處理。對於使用者在portlet上動作時向該portlet發出的請求(一種稱為活躍期的狀態),或者因使用者在其它portlet上動作而引發的重新整理頁面請求,Portal伺服器提供了兩種不同的回調方法來處理。
3.        Portlet模式:portlets用模式的概念來表示使用者在做什麼。在使用mail應用的時候,你可能會用它來讀信、寫信或檢查信件――這些都是mail應用的預定功能,Portlets通常以VIEW模式提供這些功能。但還有一些活動,像指定重新整理時間或(重新)設定使用者名稱和密碼,這些活動允許使用者定製應用的行為,因此它們用的是EDIT模式。Mail應用的協助功能用的是HELP模式。

  如果仔細想想其實這裡面並沒有什麼新東西,它們反而大部分都是普通的業務需求。Portlet規範的作用在於它提供了一個抽象層,這才是它對所有與之相關的人-終端使用者、開發人員和管理員-的價值所在。

  作為一個開發人員,我會將所有與VIEW模式有關的商務邏輯放入doView()方法,將與應用配置有關的商務邏輯放入doEdit()方法,將與協助有關的邏輯放入doHelp()方法

  這就簡化了管理員對portlet應用的存取控制管理,因為他只需改變portlet的存取權限就能決定使用者能做什麼。例如,如果mail應用的一個使用者能夠在EDIT模式下設定使用者名稱和密碼,那麼就可以斷定他具有EDIT模式存取權限。

  不妨考慮這樣一種情形:我是一個intranet網站的管理員,我的公司買了一個能顯示新聞資訊的第三方portlet應用,該應用允許使用者指定跟蹤新聞更新的URL地址,我想藉助它為使用者顯示公司的內部新聞。另一個需求是我不想讓使用者通過該應用來跟蹤任何其它的新聞資訊來源。作為管理員,我可以為所有的使用者指定一個用於內部新聞更新的URL地址,同時通過改變portlet應用的部署描述符來取消其它人修改該地址的許可權。

  由於所有的portlet應用都具有相似的UI介面,因此採用portlets可使網站對終端使用者更具吸引力。如果她想閱讀任何一個應用的協助資訊,她可以點擊協助按鈕;她也知道點擊編輯按鈕能讓她進入應用的配置屏。標準化的使用者介面使你的portlet應用更引人。

4.        視窗狀態:視窗狀態決定了portal頁面上留給portlet產生內容的空間。如果點擊最大化按鈕,portlet將佔據整個螢幕,成為使用者唯一可用的portlet;而在最小化狀態,portlet只顯示為標題條。作為開發人員應當根據可用空間的大小來定做內容。

5.        使用者資訊:通常portlets向發出請求的使用者提供個人化的內容,為了能更加行之有效,portlets需要訪問使用者的屬性資訊,如姓名、email、電話等。Portlet API為此提供了使用者屬性的概念,開發人員能夠用標準的方式訪問這些屬性,並由管理員負責在這些屬性與真實的使用者資訊資料庫(通常是LDAP伺服器)之間建立映射關係。

  我們將在本文的第二部分深入討論這些特點-請求處理、使用者資訊和portlet模式。

開發"Hello World" Portlet

  現在我們就來開發一個簡單的HelloWorld portlet。
1.        建立一個名為HelloWorld的web項目,它與通常的servlet項目類似,有一個/WEB-INF/web.xml檔案作為項目的部署描述符。

2.        在build path裡加入portlet-api-1.0.jar檔案,該jar檔案是Pluto發行包的一部分。

3.        在Source檔案夾中按如下內容建立HelloWorld.java檔案:



  每個portlet都要實現Portlet介面,該介面為portlet定義了生命週期方法。由於不想覆蓋所有這些方法,我們只對GenericPortlet類進行擴充,它是一個實現了Portlet介面的適配器類。GenericPortlet類提供了所有生命週期方法的預設實現,所以我們只需實現我們所需要的方法。

  我們在 HelloWorld portlet裡要做的只是顯示“Hello Portlet”,所以我們將覆蓋GenericPortlet類的doView()方法,該方法以PortletRequest 和 PortletResponse作為參數。在doView()方法中首先調用response.setContentType()以通知portlet容器該portlet將要產生何種類型的內容-如果不這樣做就會導致IllegalStateException異常。一旦設定了內容的類型,就可以從response對象中獲得PrintWriter並開始寫入。

4.        每個portlet應用在/WEB-INF檔案夾中都有一個portlet.xml檔案,它是portlet應用的部署描述符。按以下內容建立portlet.xml檔案:



  <portlet-name>元素宣告了portlet的名字,<portlet-class>元素指定了portlet的全限定類名,<expiration-cache>元素以秒為單位指定了內容超期的時間。這裡面有一點需要注意:你在portlet上的某些動作可能會導致內容重新整理,這與緩衝時間無關。
  <supports>元素指定對於給定的<mime-type>有哪些模式可供支援。在樣本中我們假定HelloWorld只能產生text/html類型的內容,且只有view模式可支援該內容類型。如果要增加對其它內容類型的支援,需要添加新的<support>元素並指定支援該MIME類型的模式有哪些。通常portlet對於text/html類型有VIEW、EDIT和HELP模式可供支援,而對於WML MIME類型則只有VIEW模式。
  還可以用<supported-locale>元素來指定portlet支援哪些本地化。<title>元素用來指定portlet的標題。如果要對標題做國際化處理,可以用元素<resource-bundle>指定資源(比例properties檔案)的檔案名稱。在這種情況下,容器將根據使用者所在的地區從適當的properties檔案中選擇標題。

5.        每個portlet應用都是一個web應用,因此除了portlet.xml檔案之外還需要有web.xml檔案。



6.        接下來將這些檔案進行編譯並打包為war檔案。你可以自己完成這些工作,或者下載帶有build.xml 的範例程式碼(參見“資源”部分)來建立war檔案。
在Pluto上部署HelloWorld Portlet

  Pluto尚處於開發階段的早期,因此還沒有一套便於使用的管理工具。為了能使用Pluto伺服器,需要將編譯和原始碼兩個版本都下載。需要注意的是以下說明是針對Windows平台的,Unix使用者通過修改斜杠符號和執行sh shell指令碼(不是bat批命令檔案)會得到類似的結果。

1.        建立一個檔案夾,比如C:/PlutoInstallation。
2.        從Pluto的網站下載pluto-1.0.1-rc1.zip和pluto-src-1.0.1-rc1.zip。
3.        將pluto-1.0.1-rc1.zip解壓到C:/PlutoInstallation.檔案夾,它應被解壓到C:/PlutoInstallation/pluto-1.0.1-rc1檔案夾下。
4.        執行C:/PlutoInstallation/pluto-1.0.1-rc1/bin/startup.bat啟動Pluto,現在可以通過地址http://localhost:8080/pluto/portal訪問Pluto伺服器。
5.        將pluto-src-1.0.1-rc1.zip解壓到C:/PlutoInstallation/PlutoSrc檔案夾。
6.        進入C:/PlutoInstallation/PlutoSrc檔案夾,執行maven distribute:all.,編譯並下載運行常規管理工作所必需的相關資源檔。現在可以將HelloWorldPortlet.war作為portlet進行安裝了。
7.        首先將HelloWorldPortlet.war檔案拷貝到C:/PlutoInstallation/portlets目錄,如果沒這個目錄就建立它。
8.        將C:/PlutoInstallation/plutosrc/build.properties.sample更名為build.properties。
9.        編輯build.properties,將maven.tomcat.home指向Pluto編譯版的安裝位置,在本例中應改為maven.tomcat.home=C:/PlutoInstallation/pluto-1.0.1-rc1。
10.        為了安裝portlet,進入C:/plutoInstallation/plutosrc/deploy檔案夾,執行maven deploy -Ddeploy=c:/PlutoInstallation/portlets/HelloWorldPortlet.war,應能看到“build successful”資訊。
11.        在C:/PlutoInstallation/pluto-1.0.1-rc1/webapps檔案夾下,應該有一個HelloWorldPortlet檔案夾。
12.        現在進入C:/PlutoInstallation/pluto-1.0.1-rc1/webapps/HelloWorld/WEB-INF/ folder檔案夾,開啟portlet的web.xml檔案,你會發現裡面自動多了幾行,如下所示:


13.        接下來我們將該portlet加到頁面裡。進入C:/PlutoInstallation/pluto-1.0.1-rc1/webapps/pluto/WEB-INF/data檔案夾,可以看到有兩個XML檔案:pageregistry.xml和portletentityregistry.xml。
14.        portletentityregistry.xml包含了portlet的定義,在該檔案中加入以下幾行:


  應用的<definition-id>應為web應用所在檔案夾的名字,portlet的<definition-id>應與web.xml中產生的portlet-guid相一致。
15.        pageregistry.xml定義了頁面中包含了哪些portlets,對該檔案做如下改動:


16.        執行shutdown命令和startup命令重啟Pluto伺服器,返回到地址http://localhost:8080/pluto/portal並點擊“Test Link”-此時頁面中將出現我們的

HelloWorld portlet。

圖3的右側顯示了HelloWorld portlet看上去的樣子。


圖3 portlet的螢幕截圖

如何建立Portal頁面

圖4顯示了portal容器如何將分離的portlets組裝為頁面。


圖4 建立Portal頁面

  大部分的portal伺服器基本上都是部署於應用伺服器上的web應用,通過servlet來處理訪問portal伺服器的請求。查看一下Pluto的安裝目錄就會發現Pluto不過是一個部署於Tomcat伺服器上的一個普通web應用,再看看C:/PlutoInstallation/pluto-1.0.1-rc1/webapps/pluto/WEB-INF/web.xml會發現所有發往Pluto伺服器的請求都被映射到org.apache.pluto.portalImpl.Servlet上。

  在本文開始部分“Portal頁面的元素”中,我們提到portal頁面由兩部分組成。一部分是由頁面中的portlets產生的內容,另一部分是由portal伺服器產生的內容。

  在Pluto裡,只要使用者發出請求,就會由servlet進行控制,根據使用者所請求的頁面來確定需要顯示的portlets的列表。一旦產生了列表,servlet就將控制轉給這些portlets線程並收集由它們產生的內容。

  對於由portal伺服器產生的內容(像portal網站的觀感及每個portlet的外觀和控制之類)則取決於C:/PlutoInstallation/pluto-1.0.1-rc1/webapps/pluto/WEB-INF/aggregation檔案夾下的JSP檔案。RootFragment.jsp是主JSP檔案,它決定了整體的觀感和對齊;它還包含了Heads以定義在產生的頁面中的<HEAD>標籤裡的內容。TabNavigation.jsp用來選擇在banner中該顯示什麼(預設情況下在banner顯示列表中也包擴了pluto.png圖片)。TabNavigation.jsp用來確定portal網站的導航方案。這意味著只需改動該檔案夾下少量的幾個JSP檔案,就能改變整個portal網站的觀感。

  Pluto根據pageregistry.xml中的設定確定頁面中有多少行,並用RowFragment.jsp去填充。ColumnFragment.jsp用來填充每個欄目。PortletFragmentHeader.jsp用來填充每個portlet的頁頭,像標題條及最大化和最小化控制。footer.jsp用來填充JSP的頁尾。如果去看一下portal頁面的HTML代碼就會發現每個portlet視窗無非都是嵌入<TD>標籤的內容塊。

結束語

  任何一種新技術要想獲得成功都應具備以下條件:首先,它能提升現有技術;其次,它能解決現有技術遇到的普遍問題;再次,它能提供多於一個的抽象層(有人說,每抽象出一層,問題就解決一半)。

  由於portlet與現有的應用伺服器架構相容,這對Portlet API來說是一次發展servlet技術的好機會。你可以從portlet裡調用EJB,或者用它啟動和參與由應用伺服器控制的全域性事務。換句話說,在以商業邏輯為核心的領域裡,portlet完全可以做得和servlet一樣好。

  Portlets提供了一個抽象層,現在你不必再擔心用戶端使用了什麼樣的HTTP方法,也不必自己編寫程式去捕獲像點擊按鈕這樣的用戶端事件。最後但絕不是最次要的一點是,portlets以提供像單次登入、個人化等服務的方式解決了servlets不能解決的大部分問題。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.