本文探討了以下內(nèi)容: portlet規(guī)范將portlet定義為一種“基于java技術(shù)的web組件,由處理請求和生成動態(tài)內(nèi)容的portlet容器管理”。這段話聽起來是不是有些費(fèi)解?本文將說明portlets是什么以及能用它們做什么。
如果仔細(xì)查看瀏覽器里的頁面,就會看到頁面是由不同的“窗口”組成的。一個窗口用于刷新天氣,另一個用于新聞,還有一個用于刷新股價,等等。這里的每一個窗口都代表了一個portlets。如果看得再仔細(xì)些,還會發(fā)現(xiàn)每個窗口都有一個標(biāo)題條和一些按鈕,包括最小化和最大化按鈕。 在系統(tǒng)開發(fā)里,這些窗口是相互獨(dú)立開發(fā)、各不同的應(yīng)用開發(fā)。新聞portlet的開發(fā)者創(chuàng)建應(yīng)用開發(fā)并打包成war格式的文件,隨后portal服務(wù)器開發(fā)的管理員在服務(wù)器開發(fā)上部署該war文件并創(chuàng)建頁面,接下來每個用戶會選擇在他的頁面里有哪些應(yīng)用開發(fā)。例如,如果用戶對股價不感興趣而對體育感興趣,他可以用“體育”窗口替換“股價”窗口。 portlet技術(shù)需要學(xué)習(xí)許多新概念,本文不可能全都涵蓋,因此本文分為兩部分。在第一部分里我們詳細(xì)說明portals和portlets,并開發(fā)一個簡單的“hello world”portlet;在第二部分我們將探討一些高級主題。 我們將用apache的pluto服務(wù)器開發(fā)(portlet api 1.0規(guī)范的參考實(shí)現(xiàn))來測試我們的示例portlets,我們還會花些時間探討如何安裝和使用pluto服務(wù)器開發(fā)。 portal頁面的元素 圖2顯示了portal頁面的各種元素。
每個portlet頁面由一個或多個portlet窗口組成,每個portlet窗口又分為兩部分:一個是外觀,它決定了portlet窗口的標(biāo)題條、控制和邊界的樣式;另一個是portlet段,它由portlet應(yīng)用開發(fā)填充。 portal服務(wù)器開發(fā)決定了portal頁面的整體觀感,像標(biāo)識、標(biāo)題條顏色、控制圖標(biāo)等。通過修改幾個js p和css模板文件就可以改變portal的整個觀感。我們將在“如何創(chuàng)建portal頁面”部分對此做深入討論。 portal是什么? 在了解portlet之前有必要先了解portal。在portlet規(guī)范里是這樣講的:“portal是一種web應(yīng)用開發(fā),通常用來提供個性化、單次登錄、聚集各個信息源的內(nèi)容,并作為信息系統(tǒng)開發(fā)表現(xiàn)層的宿主。聚 此文來自: 馬開東博客 轉(zhuǎn)載請注明出處 網(wǎng)址: http://www. 集是指將來自各個信息源的內(nèi)容集成到一個web頁面里的活動”。
portal的功能可以分為三個主要方面: 此文來自: 馬開東博客 轉(zhuǎn)載請注明出處 網(wǎng)址: http://www. 到mail服務(wù)器開發(fā)上。你對其它應(yīng)用開發(fā)的訪問也將照此處理。o個性化:個性化服務(wù)的基本實(shí)現(xiàn)使用戶能從兩方面?zhèn)€性化她的頁面:第一,用戶可以根據(jù)她的自身喜好決定標(biāo)題條的顏色和控制圖標(biāo)。第二,用戶可以決定在她的頁面上有哪些portlets。例如,如果我是個體育迷,我可能會用一個能提供我鐘愛球隊最新信息的portlet來取代股票和新聞portlets。 一些在個性化服務(wù)方面領(lǐng)先的商業(yè)實(shí)現(xiàn)版本允許你建立為用戶顯示什么樣的應(yīng)用開發(fā)所依據(jù)的標(biāo)準(zhǔn)(如收入和興趣)。在這種情況下,可以設(shè)定一些像“對任何收入為x的用戶顯示饋贈商品的portlet”和“對任何收入為x的用戶顯示打折商品的portlet”這樣的商業(yè)規(guī)則。
此外還有一些公共服務(wù),比如機(jī)器翻譯,是由portal服務(wù)器開發(fā)將portlet生成的內(nèi)容翻譯為用戶要求的語言。大部分的商業(yè)portal服務(wù)器開發(fā)都支持手持設(shè)備訪問并具有針對不同的瀏覽終端生成不同內(nèi)容的能力。 portlets是什么? 與servlet開發(fā) s類似,portlets是部署在容器內(nèi)用來生成動態(tài)內(nèi)容的web組件。從技術(shù)角度講portlet是一個實(shí)現(xiàn)了javax.portlet.portlet接口的類,它被打包成war文件格式部署到portlet容器里。 portlets在以下方面與servlet開發(fā) s相似: portlets在以下方面與servlet開發(fā) s相異: portlets還提供了一些附加的功能: 如果仔細(xì)想想其實(shí)這里面并沒有什么新東西,它們反而大部分都是普通的業(yè)務(wù)需求。portlet規(guī)范的作用在于它提供了一個抽象層,這才是它對所有與之相關(guān)的人-最終用戶、開發(fā)者和管理員-的價值所在。 作為一個開發(fā)者,我會將所有與view模式有關(guān)的業(yè)務(wù)邏輯放入doview()開發(fā)方法 ,將與應(yīng)用開發(fā)配置有關(guān)的業(yè)務(wù)邏輯放入doedit()開發(fā)方法 ,將與幫助有關(guān)的邏輯放入dohelp()開發(fā)方法 這就簡化了管理員對portlet應(yīng)用開發(fā)的訪問控制管理,因為他只需改變portlet的訪問權(quán)限就能決定用戶能做什么。例如,如果mail應(yīng)用開發(fā)的一個用戶能夠在edit模式下設(shè)定用戶名和密碼,那么就可以斷定他具有edit模式訪問權(quán)限。 不妨考慮這樣一種情形:我是一個intranet網(wǎng)站的管理員,我的公司買了一個能顯示新聞信息的第三方portlet應(yīng)用開發(fā),該應(yīng)用開發(fā)允許用戶指定跟蹤新聞更新的url地
此文來自: 馬開東博客 轉(zhuǎn)載請注明出處 網(wǎng)址: http://www. 址,我想借助它為用戶顯示公司的內(nèi)部新聞。另一個需求是我不想讓用戶通過該應(yīng)用開發(fā)來跟蹤任何其它的新聞信息來源。作為管理員,我可以為所有的用戶指定一個用于內(nèi)部新聞更新的url地址,同時通過改變portlet應(yīng)用開發(fā)的部署描述符來取消其它人修改該地址的權(quán)限。
由于所有的portlet應(yīng)用開發(fā)都具有相似的ui界面,因此采用portlets可使網(wǎng)站對最終用戶更具吸引力。如果她想閱讀任何一個應(yīng)用開發(fā)的幫助信息,她可以點(diǎn)擊幫助按鈕;她也知道點(diǎn)擊編輯按鈕能讓她進(jìn)入應(yīng)用開發(fā)的配置屏。標(biāo)準(zhǔn)化的用戶界面使你的portlet應(yīng)用開發(fā)更引人。 4. 窗口狀態(tài):窗口狀態(tài)決定了portal頁面上留給portlet生成內(nèi)容的空間。如果點(diǎn)擊最大化按鈕,portlet將占據(jù)整個屏幕,成為用戶唯一可用的portlet;而在最小化狀態(tài),portlet只顯示為標(biāo)題條。作為開發(fā)者應(yīng)當(dāng)根據(jù)可用空間的大小來定做內(nèi)容。 5. 用戶信息:通常portlets向發(fā)出請求的用戶提供個性化的內(nèi)容,為了能更加行之有效,portlets需要訪問用戶的屬性信息,如姓名、email、電話等。portlet api為此提供了用戶屬性的概念,開發(fā)者能夠用標(biāo)準(zhǔn)的方式訪問這些屬性,并由管理員負(fù)責(zé)在這些屬性與真實(shí)的用戶信息其他數(shù)據(jù)庫 (通常是ldap服務(wù)器開發(fā))之間建立映射關(guān)系。 我們將在本文的第二部分深入討論這些特點(diǎn)-請求處理、用戶信息和portlet模式。 開發(fā)"hello world" portlet 現(xiàn)在我們就來開發(fā)一個簡單的helloworld portlet。 2. 在build path里加入portlet-api-1.0.jar文件,該jar文件是pluto發(fā)行包的一部分。 3. 在source文件夾中按如下內(nèi)容創(chuàng)建helloworld.java文件: public class helloworld extends genericportlet{ protected void doview(renderrequest request, renderresponse response) throws portletexception, ioexception { response.setcontenttype("text/html"); response.getwriter().println("hello portlet"); }} 每個portlet都要實(shí)現(xiàn)portlet接口,該接口為portlet定義了生命周期開發(fā)方法 。由于不想覆蓋所有這些開發(fā)方法 ,我們只對genericportlet類進(jìn)行擴(kuò)展,它是一個實(shí)現(xiàn)了portlet接口的適配器類。genericportlet類提供了所有生命周期開發(fā)方法 的默認(rèn)實(shí)現(xiàn),所以我們只需實(shí)現(xiàn)我們所需要的開發(fā)方法 。 我們在 helloworld portlet里要做的只是顯示“hello portlet”,所以我們將覆蓋genericportlet類的doview()開發(fā)方法 ,該開發(fā)方法 以portletrequest 和 portletresponse作為參數(shù)。在doview()開發(fā)方法 中首先調(diào)用response.setcontenttype()以通知portlet容器該portlet將要生成何種類型的內(nèi)容-如果不這樣做就會導(dǎo)致illegalstateexception異常。一旦設(shè)置了內(nèi)容的類型,就可以從response對象中獲得printwriter并開始寫入。 4. 每個portlet應(yīng)用開發(fā)在/web-inf文件夾中都有一個portlet.xml文件,它是portlet應(yīng)用開發(fā)的部署描述符。按以下內(nèi)容創(chuàng)建portlet.xml文件: <portlet> <description>helloworlddescription </description> <portlet-name>helloworld </portlet-name> <display-name>hello world </display-name> <portlet-class>com.test.helloworld </portlet-class> <expiration-cache>-1 </expiration-cache> <supports> <mime-type>text/html</mime-type> <portlet-mode>view </portlet-mode> </supports> <supported-locale>en </supported-locale> <portlet-info> <title>hello world</title> <short-title>hello world </short-title> <keyword s>hello,pluto</keyword s> </portlet-info></portlet> <portlet-name>元素聲明了portlet的名字,<portlet-class>元素指定了portlet的全限定類名,<expiration-cache>元素以秒為單位指定了內(nèi)容超期的時間。這里面有一點(diǎn)需要注意:你在portlet上的某些動作可能會導(dǎo)致內(nèi)容刷新,這與緩存時間無關(guān)。 5. 每個portlet應(yīng)用開發(fā)都是一個web應(yīng)用開發(fā),因此除了portlet.xml文件之外還需要有web.xml文件。 <web-app> <display-name>hello world portlet </display-name> <welcome-file-list <welcome-file>index.js p </welcome-file> </welcome-file-list></web-app> 6. 接下來將這些文件進(jìn)行編譯并打包為war文件。你可以自己完成這些工作,或者下載帶有build.xml 的示例代碼(參見“資源”部分)來創(chuàng)建war文件。 pluto尚處于開發(fā)階段的早期,因此還沒有一套易于使用的管理開發(fā)工具。為了能使用pluto服務(wù)器開發(fā),需要將編譯和源代碼兩個版本都下載。需要注意的是以下說明是針對windows平臺的,unix用戶通過修改斜杠符號和執(zhí)行sh shell腳本(不是bat批命令文件)會得到類似的結(jié)果。 1. 創(chuàng)建一個文件夾,比如c:\plutoinstallation。 <servlet開發(fā) > <servlet開發(fā) -name>helloworld</servlet開發(fā) -name> <display-name>helloworld wrapper</display-name> <description>automated generated portlet wrapper</description> <servlet開發(fā) -class>org.apache.pluto.core.portletservlet開發(fā) </servlet開發(fā) -class> <init-param> <param-name>portlet-class</param-name> <param-value>com.test.helloworld </param-value> </init-param> <init-param> <param-name>portlet-guid</param-name> <param-value>hellopluto.helloworld </param-value> </init-param></servlet開發(fā) > <application id="5"> <definition-id>helloworld</definition-id> <portlet id="1"> <definition-id>helloworld.helloworld</definition-id> </portlet></application> <fragment name="p2" type="portlet"> <property name="portlet" value="5.1"/></fragment> helloworld portlet。 圖3的右側(cè)顯示了helloworld portlet看上去的樣子。
如何創(chuàng)建portal頁面 圖4顯示了portal容器如何將分離的portlets組裝為頁面。
大部分的portal服務(wù)器開發(fā)基本上都是部署于應(yīng)用開發(fā)服務(wù)器開發(fā)上的web應(yīng)用開發(fā),通過servlet開發(fā) 來處理訪問portal服務(wù)器開發(fā)的請求。查看一下pluto的安裝目錄就會發(fā)現(xiàn)pluto不過是一個部署于tomcat服務(wù)器開發(fā)上的一個普通web應(yīng)用開發(fā),再看看c:\plutoinstallation\pluto-1.0.1-rc1\webapps\pluto\web-inf\web.xml會發(fā)現(xiàn)所有發(fā)往pluto服務(wù)器開發(fā)的請求都被映射到org.apache.pluto.portalimpl.servlet開發(fā) 上。 在本文開始部分“portal頁面的元素”中,我們提到portal頁面由兩部分組成。一部分是由頁面中的portlets生成的內(nèi)容,另一部分是由portal服務(wù)器開發(fā)生成的內(nèi)容。 在pluto里,只要用戶發(fā)出請求,就會由servlet開發(fā) 進(jìn)行控制,根據(jù)用戶所請求的頁面來確定需要顯示的portlets的列表。一旦生成了列表,servlet開發(fā) 就將控制轉(zhuǎn)給這些portlets線程并收集由它們生成的內(nèi)容。 對于由portal服務(wù)器開發(fā)生成的內(nèi)容(像portal網(wǎng)站的觀感及每個portlet的外觀和控制之類)則取決于c:\plutoinstallation\pluto-1.0.1-rc1\webapps\pluto\web-inf\aggregation文件夾下的js p文件。rootfragment.js p是主js p文件,它決定了整體的觀感和對齊方式;它還包含了heads以定義在生成的頁面中的<head>標(biāo)簽里的內(nèi)容。tabnavigation.js p用來選擇在banner中該顯示什么(默認(rèn)情況下在banner顯示列表中也包擴(kuò)了pluto.png圖片)。tabnavigation.js p用來確定portal網(wǎng)站的導(dǎo)航方案。這意味著只需改動該文件夾下少量的幾個js p文件,就能改變整個portal網(wǎng)站的觀感。 pluto根據(jù)pageregis地理信息系統(tǒng) try.xml中的設(shè)置確定頁面中有多少行,并用rowfragment.js p去填充。columnfragment.js p用來填充每個欄目。portletfragmentheader.js p用來填充每個portlet的頁頭,像標(biāo)題條及最大化和最小化控制。footer.js p用來填充js p 感謝你的支持,我會 |
|