“portlets是一種web組件-就像servlet開發(fā) s-是專為將合成頁面里的內(nèi)容聚集在一起而設(shè)計(jì)的。通常請(qǐng)求一個(gè)portal頁面會(huì)引發(fā)多個(gè)portlets被調(diào)用。每個(gè)portlet都會(huì)生成標(biāo)記段,并與別的portlets生成的標(biāo)記段組合在一起嵌入開發(fā) 到portal頁面的標(biāo)記內(nèi)?!保ㄕ詐ortlet規(guī)范,js r 168)
本文探討了以下內(nèi)容:
1. portal頁面的元素
2. portal是什么?
3. portlets是什么?
4. 開發(fā)“hello world” portlet
5. 在pluto上部署helloworld portlet
6. 如何創(chuàng)建portal頁面
7. 結(jié)束語
8. 資源
portlet規(guī)范將portlet定義為一種“基于java技術(shù)的web組件,由處理請(qǐng)求和生成動(dòng)態(tài)內(nèi)容的portlet容器管理”。這段話聽起來是不是有些費(fèi)解?本文將說明portlets是什么以及能用它們做什么。
圖1顯示了在訪問一個(gè)portal服務(wù)器開發(fā)時(shí)瀏覽器中頁面的樣子。
圖1 典型的portal服務(wù)器開發(fā)的頁面(點(diǎn)擊查看原圖)
如果仔細(xì)查看瀏覽器里的頁面,就會(huì)看到頁面是由不同的“窗口”組成的。一個(gè)窗口用于刷新天氣,另一個(gè)用于新聞,還有一個(gè)用于刷新股價(jià),等等。這里的每一個(gè)窗口都代表了一個(gè)portlets。如果看得再仔細(xì)些,還會(huì)發(fā)現(xiàn)每個(gè)窗口都有一個(gè)標(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)建頁面,接下來每個(gè)用戶會(huì)選擇在他的頁面里有哪些應(yīng)用開發(fā)。例如,如果用戶對(duì)股價(jià)不感興趣而對(duì)體育感興趣,他可以用“體育”窗口替換“股價(jià)”窗口。
portlet技術(shù)需要學(xué)習(xí)許多新概念,本文不可能全都涵蓋,因此本文分為兩部分。在第一部分里我們?cè)敿?xì)說明portals和portlets,并開發(fā)一個(gè)簡(jiǎn)單的“hello world”portlet;在第二部分我們將探討一些高級(jí)主題。
我們將用apache的pluto服務(wù)器開發(fā)(portlet api 1.0規(guī)范的參考實(shí)現(xiàn))來測(cè)試我們的示例portlets,我們還會(huì)花些時(shí)間探討如何安裝和使用pluto服務(wù)器開發(fā)。
portal頁面的元素
圖2顯示了portal頁面的各種元素。
圖2 portal頁面的元素
每個(gè)portlet頁面由一個(gè)或多個(gè)portlet窗口組成,每個(gè)portlet窗口又分為兩部分:一個(gè)是外觀,它決定了portlet窗口的標(biāo)題條、控制和邊界的樣式;另一個(gè)是portlet段,它由portlet應(yīng)用開發(fā)填充。
portal服務(wù)器開發(fā)決定了portal頁面的整體觀感,像標(biāo)識(shí)、標(biāo)題條顏色、控制圖標(biāo)等。通過修改幾個(gè)js p和css模板文件就可以改變portal的整個(gè)觀感。我們將在“如何創(chuàng)建portal頁面”部分對(duì)此做深入討論。
portal是什么?
在了解portlet之前有必要先了解portal。在portlet規(guī)范里是這樣講的:“portal是一種web應(yīng)用開發(fā),通常用來提供個(gè)性化、單次登錄、聚集各個(gè)信息源的內(nèi)容,并作為信息系統(tǒng)開發(fā)表現(xiàn)層的宿主。聚
此文來自: 馬開東博客 轉(zhuǎn)載請(qǐng)注明出處 網(wǎng)址: http://www.makaidong.com
集是指將來自各個(gè)信息源的內(nèi)容集成到一個(gè)web頁面里的活動(dòng)”。 portal的功能可以分為三個(gè)主要方面:
1. portlet容器:portlet容器與servlet開發(fā) 容器非常類似,所有的portlet都部署在portlet容器里,portlet容器控制portlet的生命周期并為其提供必要的資源和環(huán)境信息。portlet容器負(fù)責(zé)初始化和銷毀portlets,向portlets傳送用戶請(qǐng)求并合成響應(yīng)。
2. 內(nèi)容聚集:portlet規(guī)范中規(guī)定portal的主要工作之一是聚集由各種portlet應(yīng)用開發(fā)生成的內(nèi)容,我們將在“如何創(chuàng)建portal頁面”部分對(duì)此做進(jìn)一步討論。
3. 公共服務(wù):portlet服務(wù)器開發(fā)的一個(gè)強(qiáng)項(xiàng)是它所提供的一套公共服務(wù)。這些服務(wù)并不是portlet規(guī)范所要求的,但portal的商業(yè)實(shí)現(xiàn)版本提供了豐富的公共服務(wù)以有別于它們的競(jìng)爭(zhēng)者。在大部分實(shí)現(xiàn)中都有望找到的幾個(gè)公共服務(wù)有:
o 單次登錄:只需登錄portal服務(wù)器開發(fā)一次就可以訪問所有其它的應(yīng)用開發(fā),這意味著你無需再分別登錄每一個(gè)應(yīng)用開發(fā)。例如一旦我登錄了我的intranet網(wǎng)站,我就能訪問mail應(yīng)用開發(fā)、im消息應(yīng)用開發(fā)和其它的intranet應(yīng)用開發(fā),不必再分別登錄這些應(yīng)用開發(fā)。
portal服務(wù)器開發(fā)會(huì)為你分配一個(gè)通行證庫。你只需要在mail應(yīng)用開發(fā)里設(shè)定一次用戶名和密碼,這些信息將以加密的方式存儲(chǔ)在通行證庫中。在你已登錄到intranet網(wǎng)站并要訪問mail應(yīng)用開發(fā)的時(shí)候,portal服務(wù)器開發(fā)會(huì)從通行證庫中讀取你的通行證替你登錄
此文來自: 馬開東博客 轉(zhuǎn)載請(qǐng)注明出處 網(wǎng)址: http://www.makaidong.com
到mail服務(wù)器開發(fā)上。你對(duì)其它應(yīng)用開發(fā)的訪問也將照此處理。此外還有一些公共服務(wù),比如機(jī)器翻譯,是由portal服務(wù)器開發(fā)將portlet生成的內(nèi)容翻譯為用戶要求的語言。大部分的商業(yè)portal服務(wù)器開發(fā)都支持手持設(shè)備訪問并具有針對(duì)不同的瀏覽終端生成不同內(nèi)容的能力。
portlets是什么?
與servlet開發(fā) s類似,portlets是部署在容器內(nèi)用來生成動(dòng)態(tài)內(nèi)容的web組件。從技術(shù)角度講portlet是一個(gè)實(shí)現(xiàn)了javax.portlet.portlet接口的類,它被打包成war文件格式部署到portlet容器里。
portlets在以下方面與servlet開發(fā) s相似:
1. portlets由特定的容器管理。
2. portlets生成動(dòng)態(tài)內(nèi)容。
3. portlet的生命周期由容器管理。
4. portlets通過請(qǐng)求/響應(yīng)模式與web客戶端交互。
portlets在以下方面與servlet開發(fā) s相異:
1. portlets只能生成標(biāo)記段,而不是整個(gè)文檔。
2. portlets沒有可供直接訪問的url地址。不過你還是能夠讓別人通過url訪問到portlet,你可以把包含該portlet的頁面的url發(fā)給他。
3. portlets不能隨意地生成內(nèi)容,這是因?yàn)閜ortlet生成的內(nèi)容最終要成為portal頁面的一部分。如果portal服務(wù)器開發(fā)要求的是html/text類型,那么所有的portlets都應(yīng)生成html/text類型的內(nèi)容。再比方說,如果portal服務(wù)器開發(fā)要求的是wml類型,那么所有的portlets都應(yīng)生成wml類型的內(nèi)容。
portlets還提供了一些附加的功能:
1. 設(shè)置參數(shù)的持久化存儲(chǔ):portlets提供了一個(gè)portletpreferences對(duì)象用來保存用戶的設(shè)置參數(shù)。這些參數(shù)被存入一個(gè)持久化其他數(shù)據(jù)庫 ,這樣服務(wù)器開發(fā)重啟后數(shù)據(jù)依然有效。開發(fā)者不必關(guān)心這些數(shù)據(jù)存儲(chǔ)的具體實(shí)現(xiàn)機(jī)制。
2. 請(qǐng)求處理:portlets提供了更為細(xì)粒度的請(qǐng)求處理。對(duì)于用戶在portlet上動(dòng)作時(shí)向該portlet發(fā)出的請(qǐng)求(一種稱為活躍期的狀態(tài)),或者因用戶在其它portlet上動(dòng)作而引發(fā)的刷新頁面請(qǐng)求,portal服務(wù)器開發(fā)提供了兩種不同的回調(diào)開發(fā)方法 來處理。
3. portlet模式:portlets用模式的概念來表示用戶在做什么。在使用mail應(yīng)用開發(fā)的時(shí)候,你可能會(huì)用它來讀信、寫信或檢查信件――這些都是mail應(yīng)用開發(fā)的預(yù)定功能,portlets通常以view模式提供這些功能。但還有一些活動(dòng),像指定刷新時(shí)間或(重新)設(shè)置用戶名和密碼,這些活動(dòng)允許用戶定制應(yīng)用開發(fā)的行為,因此它們用的是edit模式。mail應(yīng)用開發(fā)的幫助功能用的是help模式。
如果仔細(xì)想想其實(shí)這里面并沒有什么新東西,它們反而大部分都是普通的業(yè)務(wù)需求。portlet規(guī)范的作用在于它提供了一個(gè)抽象層,這才是它對(duì)所有與之相關(guān)的人-最終用戶、開發(fā)者和管理員-的價(jià)值所在。
作為一個(gè)開發(fā)者,我會(huì)將所有與view模式有關(guān)的業(yè)務(wù)邏輯放入doview()開發(fā)方法 ,將與應(yīng)用開發(fā)配置有關(guān)的業(yè)務(wù)邏輯放入doedit()開發(fā)方法 ,將與幫助有關(guān)的邏輯放入dohelp()開發(fā)方法
這就簡(jiǎn)化了管理員對(duì)portlet應(yīng)用開發(fā)的訪問控制管理,因?yàn)樗恍韪淖僷ortlet的訪問權(quán)限就能決定用戶能做什么。例如,如果mail應(yīng)用開發(fā)的一個(gè)用戶能夠在edit模式下設(shè)定用戶名和密碼,那么就可以斷定他具有edit模式訪問權(quán)限。
不妨考慮這樣一種情形:我是一個(gè)intranet網(wǎng)站的管理員,我的公司買了一個(gè)能顯示新聞信息的第三方portlet應(yīng)用開發(fā),該應(yīng)用開發(fā)允許用戶指定跟蹤新聞更新的url地
此文來自: 馬開東博客 轉(zhuǎn)載請(qǐng)注明出處 網(wǎng)址: http://www.makaidong.com
址,我想借助它為用戶顯示公司的內(nèi)部新聞。另一個(gè)需求是我不想讓用戶通過該應(yīng)用開發(fā)來跟蹤任何其它的新聞信息來源。作為管理員,我可以為所有的用戶指定一個(gè)用于內(nèi)部新聞更新的url地址,同時(shí)通過改變portlet應(yīng)用開發(fā)的部署描述符來取消其它人修改該地址的權(quán)限。由于所有的portlet應(yīng)用開發(fā)都具有相似的ui界面,因此采用portlets可使網(wǎng)站對(duì)最終用戶更具吸引力。如果她想閱讀任何一個(gè)應(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ù)整個(gè)屏幕,成為用戶唯一可用的portlet;而在最小化狀態(tài),portlet只顯示為標(biāo)題條。作為開發(fā)者應(yīng)當(dāng)根據(jù)可用空間的大小來定做內(nèi)容。
5. 用戶信息:通常portlets向發(fā)出請(qǐng)求的用戶提供個(gè)性化的內(nèi)容,為了能更加行之有效,portlets需要訪問用戶的屬性信息,如姓名、email、電話等。portlet api為此提供了用戶屬性的概念,開發(fā)者能夠用標(biāo)準(zhǔn)的方式訪問這些屬性,并由管理員負(fù)責(zé)在這些屬性與真實(shí)的用戶信息其他數(shù)據(jù)庫 (通常是ldap服務(wù)器開發(fā))之間建立映射關(guān)系。
我們將在本文的第二部分深入討論這些特點(diǎn)-請(qǐng)求處理、用戶信息和portlet模式。
開發(fā)"hello world" portlet
現(xiàn)在我們就來開發(fā)一個(gè)簡(jiǎn)單的helloworld portlet。
1. 創(chuàng)建一個(gè)名為helloworld的web項(xiàng)目,它與通常的servlet開發(fā) 項(xiàng)目類似,有一個(gè)/web-inf/web.xml文件作為項(xiàng)目的部署描述符。
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"); }}
每個(gè)portlet都要實(shí)現(xiàn)portlet接口,該接口為portlet定義了生命周期開發(fā)方法 。由于不想覆蓋所有這些開發(fā)方法 ,我們只對(duì)genericportlet類進(jìn)行擴(kuò)展,它是一個(gè)實(shí)現(xiàn)了portlet接口的適配器類。genericportlet類提供了所有生命周期開發(fā)方法 的默認(rèn)實(shí)現(xiàn),所以我們只需實(shí)現(xiàn)我們所需要的開發(fā)方法 。
我們?cè)?helloworld portlet里要做的只是顯示“hello portlet”,所以我們將覆蓋genericportlet類的doview()開發(fā)方法 ,該開發(fā)方法 以portletrequest 和 portletresponse作為參數(shù)。在doview()開發(fā)方法 中首先調(diào)用response.setcontenttype()以通知portlet容器該portlet將要生成何種類型的內(nèi)容-如果不這樣做就會(huì)導(dǎo)致illegalstateexception異常。一旦設(shè)置了內(nèi)容的類型,就可以從response對(duì)象中獲得printwriter并開始寫入。
4. 每個(gè)portlet應(yīng)用開發(fā)在/web-inf文件夾中都有一個(gè)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)容超期的時(shí)間。這里面有一點(diǎn)需要注意:你在portlet上的某些動(dòng)作可能會(huì)導(dǎo)致內(nèi)容刷新,這與緩存時(shí)間無關(guān)。
<supports>元素指定對(duì)于給定的<mime-type>有哪些模式可供支持。在示例中我們假定helloworld只能生成text/html類型的內(nèi)容,且只有view模式可支持該內(nèi)容類型。如果要增加對(duì)其它內(nèi)容類型的支持,需要添加新的<support>元素并指定支持該mime類型的模式有哪些。通常portlet對(duì)于text/html類型有view、edit和help模式可供支持,而對(duì)于wml mime類型則只有view模式。
還可以用<supported-locale>元素來指定portlet支持哪些本地化。<title>元素用來指定portlet的標(biāo)題。如果要對(duì)標(biāo)題做國際化處理,可以用元素<resource-bundle>指定資源(比例properties文件)的文件名。在這種情況下,容器將根據(jù)用戶所在的地區(qū)從適當(dāng)?shù)膒roperties文件中選擇標(biāo)題。
5. 每個(gè)portlet應(yīng)用開發(fā)都是一個(gè)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上部署helloworld portlet
pluto尚處于開發(fā)階段的早期,因此還沒有一套易于使用的管理開發(fā)工具。為了能使用pluto服務(wù)器開發(fā),需要將編譯和源代碼兩個(gè)版本都下載。需要注意的是以下說明是針對(duì)windows平臺(tái)的,unix用戶通過修改斜杠符號(hào)和執(zhí)行sh shell腳本(不是bat批命令文件)會(huì)得到類似的結(jié)果。
1. 創(chuàng)建一個(gè)文件夾,比如c:\plutoinstallation。
2. 從pluto的網(wǎng)站下載pluto-1.0.1-rc1.zip和pluto-src-1.0.1-rc1.zip。
3. 將pluto-1.0.1-rc1.zip解壓到c:\plutoinstallation.文件夾,它應(yīng)被解壓到c:\plutoinstallation\pluto-1.0.1-rc1文件夾下。
4. 執(zhí)行c:\plutoinstallation\pluto-1.0.1-rc1\bin\startup.bat啟動(dòng)pluto,現(xiàn)在可以通過地址http://localhost:8080/pluto/portal訪問pluto服務(wù)器開發(fā)。
5. 將pluto-src-1.0.1-rc1.zip解壓到c:\plutoinstallation\plutosrc文件夾。
6. 進(jìn)入c:\plutoinstallation\plutosrc文件夾,執(zhí)行maven distribute:all.,編譯并下載運(yùn)行常規(guī)管理任務(wù)所必需的相關(guān)資源文件。現(xiàn)在可以將helloworldportlet.war作為portlet進(jìn)行安裝了。
7. 首先將helloworldportlet.war文件拷貝到c:\plutoinstallation\portlets目錄,如果沒這個(gè)目錄就創(chuàng)建它。
8. 將c:\plutoinstallation\plutosrc\build.properties.sample更名為build.properties。
9. 編輯build.properties,將maven.tomcat.home指向pluto編譯版的安裝位置,在本例中應(yīng)改為maven.tomcat.home=c:/plutoinstallation/pluto-1.0.1-rc1。
10. 為了安裝portlet,進(jìn)入c:\plutoinstallation\plutosrc\deploy文件夾,執(zhí)行maven deploy -ddeploy=c:\plutoinstallation\portlets\helloworldportlet.war,應(yīng)能看到“build successful”信息。
11. 在c:\plutoinstallation\pluto-1.0.1-rc1\webapps文件夾下,應(yīng)該有一個(gè)helloworldportlet文件夾。
12. 現(xiàn)在進(jìn)入c:\plutoinstallation\pluto-1.0.1-rc1\webapps\helloworld\web-inf\ folder文件夾,打開portlet的web.xml文件,你會(huì)發(fā)現(xiàn)里面自動(dòng)多了幾行,如下所示:
<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ā) >
13. 接下來我們將該portlet加到頁面里。進(jìn)入c:\plutoinstallation\pluto-1.0.1-rc1\webapps\pluto\web-inf\data文件夾,可以看到有兩個(gè)xml文件:pageregis地理信息系統(tǒng) try.xml和portletentityregis地理信息系統(tǒng) try.xml。
14. portletentityregis地理信息系統(tǒng) try.xml包含了portlet的定義,在該文件中加入以下幾行:
<application id="5"> <definition-id>helloworld</definition-id> <portlet id="1"> <definition-id>helloworld.helloworld</definition-id> </portlet></application>
應(yīng)用開發(fā)的<definition-id>應(yīng)為web應(yīng)用開發(fā)所在文件夾的名字,portlet的<definition-id>應(yīng)與web.xml中生成的portlet-guid相一致。
15. pageregis地理信息系統(tǒng) try.xml定義了頁面中包含了哪些portlets,對(duì)該文件做如下改動(dòng):
<fragment name="p2" type="portlet"> <property name="portlet" value="5.1"/></fragment>
16. 執(zhí)行shutdown命令和startup命令重啟pluto服務(wù)器開發(fā),返回到地址http://localhost:8080/pluto/portal并點(diǎn)擊“test link”-此時(shí)頁面中將出現(xiàn)我們的
helloworld portlet。
圖3的右側(cè)顯示了helloworld portlet看上去的樣子。
圖3 portlet的屏幕截圖
如何創(chuàng)建portal頁面
圖4顯示了portal容器如何將分離的portlets組裝為頁面。
圖4 創(chuàng)建portal頁面
大部分的portal服務(wù)器開發(fā)基本上都是部署于應(yīng)用開發(fā)服務(wù)器開發(fā)上的web應(yīng)用開發(fā),通過servlet開發(fā) 來處理訪問portal服務(wù)器開發(fā)的請(qǐng)求。查看一下pluto的安裝目錄就會(huì)發(fā)現(xiàn)pluto不過是一個(gè)部署于tomcat服務(wù)器開發(fā)上的一個(gè)普通web應(yīng)用開發(fā),再看看c:\plutoinstallation\pluto-1.0.1-rc1\webapps\pluto\web-inf\web.xml會(huì)發(fā)現(xiàn)所有發(fā)往pluto服務(wù)器開發(fā)的請(qǐng)求都被映射到org.apache.pluto.portalimpl.servlet開發(fā) 上。
在本文開始部分“portal頁面的元素”中,我們提到portal頁面由兩部分組成。一部分是由頁面中的portlets生成的內(nèi)容,另一部分是由portal服務(wù)器開發(fā)生成的內(nèi)容。
在pluto里,只要用戶發(fā)出請(qǐng)求,就會(huì)由servlet開發(fā) 進(jìn)行控制,根據(jù)用戶所請(qǐng)求的頁面來確定需要顯示的portlets的列表。一旦生成了列表,servlet開發(fā) 就將控制轉(zhuǎn)給這些portlets線程并收集由它們生成的內(nèi)容。
對(duì)于由portal服務(wù)器開發(fā)生成的內(nèi)容(像portal網(wǎng)站的觀感及每個(gè)portlet的外觀和控制之類)則取決于c:\plutoinstallation\pluto-1.0.1-rc1\webapps\pluto\web-inf\aggregation文件夾下的js p文件。rootfragment.js p是主js p文件,它決定了整體的觀感和對(duì)齊方式;它還包含了heads以定義在生成的頁面中的<head>標(biāo)簽里的內(nèi)容。tabnavigation.js p用來選擇在banner中該顯示什么(默認(rèn)情況下在banner顯示列表中也包擴(kuò)了pluto.png圖片)。tabnavigation.js p用來確定portal網(wǎng)站的導(dǎo)航方案。這意味著只需改動(dòng)該文件夾下少量的幾個(gè)js p文件,就能改變整個(gè)portal網(wǎng)站的觀感。
pluto根據(jù)pageregis地理信息系統(tǒng) try.xml中的設(shè)置確定頁面中有多少行,并用rowfragment.js p去填充。columnfragment.js p用來填充每個(gè)欄目。portletfragmentheader.js p用來填充每個(gè)portlet的頁頭,像標(biāo)題條及最大化和最小化控制。footer.js p用來填充js p
聯(lián)系客服