<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    kapok

    垃圾桶,嘿嘿,我藏的這么深你們還能找到啊,真牛!

      BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      455 隨筆 :: 0 文章 :: 76 評(píng)論 :: 0 Trackbacks
    [b]Portlet API參考實(shí)現(xiàn)的秘密[/b]

    概要
     在Stefan Hepper和Stephan Hesmer的portlet系列文章的第二部分中,作者把著筆點(diǎn)從Portlet API的基礎(chǔ)概要介紹轉(zhuǎn)移到了Portlet API的參考實(shí)現(xiàn)(RI reference implementation也就是Pluto)的細(xì)節(jié)描述。作者還提供了一系列portlet的實(shí)例來(lái)說(shuō)明怎樣擴(kuò)展Portlet API的標(biāo)準(zhǔn)函數(shù)。
    企業(yè)portal提供商使用可插的用戶接口組件(portlets)向信息系統(tǒng)提供表示層。不幸的是,以前的提供商都只定義了自己的portlet API,在整個(gè)行業(yè)之中互不相容。為了標(biāo)準(zhǔn)化整個(gè)行業(yè)進(jìn)程,Java團(tuán)體發(fā)布了Java規(guī)范要求(JSR)168:Portlet規(guī)范。
    這篇系列文章的第一部分介紹了JSP 168的細(xì)節(jié)。第二部分重點(diǎn)放在portlet API的參考實(shí)現(xiàn)(RI)上,也就是Pluto。此外還提供了一個(gè)portlet的實(shí)例,讀者可以通過(guò)這個(gè)實(shí)例來(lái)學(xué)習(xí)。
    文章第一節(jié)描述了RI的體系結(jié)構(gòu),包括portlet容器的可拆卸性的概念和怎樣在其他項(xiàng)目中重用portlet容器。第二節(jié)介紹了RI的安裝和使用,以及怎樣快速配置portlet。其中文章還包括一個(gè)逐步深入的實(shí)例。
    注意:你可以通過(guò)文章之后的資源鏈接下載原代碼

    Pluto的體系結(jié)構(gòu)
        讓我們先來(lái)看一下Pluto的體系結(jié)構(gòu)和一些基本的概念。我們先簡(jiǎn)要的說(shuō)明portal的參考實(shí)現(xiàn)和portlet容器在整個(gè)portal體系結(jié)構(gòu)中的位置。接下來(lái)我們?cè)诩?xì)節(jié)方面研究Pluto的體系結(jié)構(gòu)。最后,我們看一下在portlet容器里很有趣的:portlet 展開(kāi)。

    關(guān)于portal
           Pluto一般用來(lái)演示Portlet API如何工作以及向開(kāi)發(fā)者提供一個(gè)測(cè)試portlets的實(shí)例平臺(tái)。然而,如果沒(méi)有驅(qū)動(dòng)來(lái)運(yùn)行和測(cè)試portlet容器有點(diǎn)麻煩。Pluto的簡(jiǎn)單portal組件只是架構(gòu)于portlet容器,它只滿足了JSR 168的基本要求。(相比之下,Apache的開(kāi)源項(xiàng)目Jetspeed就要專業(yè)的多。Jetspeed將著重中在了portal本身而非portlet容器之上,并且更多的考慮了其他團(tuán)體的需求。)
    圖一描述了portal的基本體系結(jié)構(gòu)。Portal的網(wǎng)絡(luò)應(yīng)用程序處理客戶端請(qǐng)求,從用戶的當(dāng)前頁(yè)面得到portlets,之后調(diào)用portlet容器以獲得每個(gè)portlet的內(nèi)容。portal使用Portlet 容器的 Invoker API來(lái)訪問(wèn) portlet容器,從 portal看來(lái),portlet 容器的主要接口是支持基于請(qǐng)求的方法調(diào)用 portlets。容器用戶要想獲得portal的相關(guān)信息則必須實(shí)現(xiàn)portlet容器的Provider SPI (Service Provider Interface)的callback接口。最終,portlet容器通過(guò)portlet API調(diào)用所有portlet。

    按此在新窗口瀏覽圖片
     
    圖一:Pluto中的一個(gè)簡(jiǎn)單的portal的結(jié)構(gòu)

    Portlet容器
        
         Portlet容器是portlet的運(yùn)行環(huán)境,也是每個(gè)portal的組成核心。它需要有關(guān)portal本身的信息,且它必須重用自身的公共代碼。因此,portlet容器和其他portal組件是完全分離的。這就是說(shuō),你可以將獨(dú)立的portlet容器嵌入任意的portal,只要你滿足portlet容器的條件,比方說(shuō)實(shí)現(xiàn)所有的SPI。
    Portlet容器的 Invoker API,或者叫入口點(diǎn),扮演了portlet容器的主調(diào)用接口的角色。Portlet容器的Invoker API將portlet容器的生存周期(init,destroy)和基于請(qǐng)求的調(diào)用方法(initPage(),performTitle(),portletService()等等)結(jié)合了起來(lái)。因?yàn)閜ortlet容器最后調(diào)用portlet的方法名有點(diǎn)類似portlet API的主portlet接口,不同的是是否必須要傳遞portlet定義符。正是因?yàn)檫@個(gè)附加的portlet定義符,portlet容器才能正確的調(diào)用portlet。
    除了要用API訪問(wèn)portlet容器之外,portal還必須擴(kuò)展portlet容器定義的SPI。因此,RI引入了容器服務(wù):在容器注冊(cè)過(guò)的可拆卸組件提供基礎(chǔ)功能并且可擴(kuò)充。RI包含如下一些容器內(nèi)的自建服務(wù)(前四個(gè)必須在運(yùn)行portlet容器時(shí)實(shí)現(xiàn),最后一個(gè)是可選的):
    ? 信息提供器:給portlet容器提供portal和portal框架的信息。通過(guò)這個(gè)接口來(lái)獲得信息和存儲(chǔ)portal信息。這些信息包括導(dǎo)航欄里的URL、portlet上下文、portlet模式和窗口狀態(tài)控制。
    ? 工廠管理器:定義了怎么怎樣通過(guò)工廠方法來(lái)獲得一個(gè)具體實(shí)現(xiàn)。(一個(gè)標(biāo)準(zhǔn)的portal應(yīng)該已經(jīng)存在一個(gè)實(shí)現(xiàn)。)
    ? 日志服務(wù):定義了一個(gè)日志工具(一個(gè)標(biāo)準(zhǔn)的portal應(yīng)該已經(jīng)存在一個(gè)實(shí)現(xiàn))。
    ? 配置服務(wù):定義了怎么樣獲得配置參數(shù)(一個(gè)標(biāo)準(zhǔn)的portal應(yīng)該已經(jīng)存在一個(gè)實(shí)現(xiàn))。
    ? 屬性管理器(可選):屬性管理器接口的實(shí)現(xiàn)允許處理JSR168規(guī)范中定義的屬性。
    嚴(yán)格的說(shuō),portlet對(duì)象模型也是SPI中的一部分,只是它在SPI中占有一個(gè)特殊的地位。Portlet對(duì)象模型處理所有的potlet對(duì)象,他由一個(gè)交織在一起的接口集合組成。因此,不能把他和容器服務(wù)分開(kāi)來(lái)考慮。
     
    按此在新窗口瀏覽圖片

    圖二:portlet容器結(jié)構(gòu)
     
    Portlet的部署

       portlet 容器 架構(gòu)在servlet容器之上并且增強(qiáng)了它的功能。為了實(shí)現(xiàn)它,portlet 容器將原始servlet 加入每一個(gè)portlet應(yīng)用程序的war文件中,這一點(diǎn)我們?cè)趫D三3中有所描述。部署portlet組件時(shí),先取得原始的war文件,然后向其中加入一個(gè)新的或者修改原有的web.xml,并且加入一個(gè)servlet作為一個(gè)調(diào)用點(diǎn)來(lái)包裝每個(gè)portlet。之后, portlet的部署器(?這個(gè)原文是Then the portlet deployment passes the modified war file to the application server deployment)會(huì)傳遞一個(gè)修改過(guò)的war文件到應(yīng)用服務(wù)器,將其部署到應(yīng)用服務(wù)器系統(tǒng)。在portlet的調(diào)用過(guò)程中,portlet容器調(diào)用添加進(jìn)去的servlet,作為部署portlet的war文件的入口點(diǎn)。
     
    按此在新窗口瀏覽圖片

    圖三:RI中portlet的部署

    Pluto和WSRP標(biāo)準(zhǔn)

       正像第一部分所描述的那樣,JSR 168與遠(yuǎn)程portlet網(wǎng)絡(luò)服務(wù)(the Web Services for Remote Portlets (WSRP))標(biāo)準(zhǔn)緊密結(jié)合。幾乎同時(shí)形成的這兩種標(biāo)準(zhǔn)發(fā)布了開(kāi)源實(shí)現(xiàn),實(shí)現(xiàn)了在各自的規(guī)范中描述必要的功能。作為共有的目標(biāo),兩種標(biāo)準(zhǔn)努力能夠在一起更好的合作。現(xiàn)在,portlet容器可以很好的運(yùn)行WSRP portlet。
    Pluto可以在一個(gè)portal中運(yùn)行多個(gè)portlet容器。從而Pluto的portlet容器可以被初始化多次。更重要的是,可以用不同的方式來(lái)初始化它。每一個(gè)portlet容器可以使用SPI的不同實(shí)現(xiàn)。

    RI的安裝
     
       你會(huì)發(fā)現(xiàn)Pluto的安裝過(guò)程非常簡(jiǎn)單。執(zhí)行install命令,build目錄/build下的install.bat或者install.sh。接下來(lái)安裝程序會(huì)提示你指定Tomcat的安裝目錄。(注意:在MS windows下文件分隔符不是反斜杠。)
    在這之后,安裝進(jìn)程會(huì)創(chuàng)建RI和所有portlet,安裝portlet到指定的Tomcat目錄。安裝完成后請(qǐng)查看文檔以確定完成了所有必要的手工設(shè)置工作。
    現(xiàn)在可以啟動(dòng)Tomcat,通過(guò)http://localhost:8080/pluto/portal來(lái)訪問(wèn)RI了。
    就是這么簡(jiǎn)單!
     
    怎樣部署portlet
     
          在Pluto中部署portlet和它的安裝一樣的簡(jiǎn)單。只要記住你必須首先安裝了Pluto,它正確的設(shè)置了prepareRun.properties。這是部署過(guò)程所必須的。在命令提示符下轉(zhuǎn)到build目錄,輸入命令deployPortlet.bat , 用portlet war文件做參數(shù),比如:
    deployPortlet.bat C:\pluto\portlets\bookmark_04\driver\bookmark_04.war

    Portlet實(shí)例
         我們來(lái)看一個(gè)portlet的例子,Bookmark。它充分利用了Portlet API并且闡明了我們學(xué)到的概念。我們以一個(gè)簡(jiǎn)單的例子開(kāi)始,我們?cè)诿恳还?jié)一步步擴(kuò)展這個(gè)Bookmark portlet,最后我們將幾乎用到所有的portlet API,把它做成一個(gè)高級(jí)的portlet。
    Bookmark portlet:版本一
    第一個(gè)Bookmark portlet用到了Portlet API中如下的一些特性:
    ? Portlet API 接口The Portlet API interface
    ? Java服務(wù)器頁(yè)面(jsp)JavaServer Pages (JSP) pages
    ? Portlet API標(biāo)簽庫(kù)The Portlet API tag libraries
    ? 部署描述符Deployment descriptors
    第一個(gè)Bookmark portlet的兩個(gè)JSP頁(yè)面分別顯示和編輯模式。每個(gè)JSP頁(yè)面只是簡(jiǎn)單的顯示了portlet的當(dāng)前portlet模式和windwos狀態(tài)。為了顯示這些信息,我們用到了Portlet API標(biāo)簽庫(kù)(只是部分程序代碼,請(qǐng)下載全部代碼,不然很難理解:譯者注):

    public void doView (RenderRequest request,
    RenderResponse response) throws PortletException, IOException {
            response.setContentType("text/html");        
            String jspName = getPortletConfig().getInitParameter("jspView");
    PortletRequestDispatcher rd = 
      getPortletContext().getRequestDispatcher(jspName);
            rd.include(request,response);
        }
    接下來(lái)的代碼是例子中的一個(gè)簡(jiǎn)單的JSP 頁(yè)面(即view.jsp:譯者注):
    <%@ page session="false" %>
    <%@ page import="javax.portlet.*"%>
    <%@ page import="java.util.*"%>
    <%@ taglib uri='/WEB-INF/tld/portlet.tld' prefix='portlet'%>
    <portlet:defineObjects/>

    Hello,<br>
    I am the bookmark portlet.<br>
    <br>
    Current Portlet Mode: <%=portletRequest.getPortletMode()%><br>
    Current Window State: <%=portletRequest.getWindowState()%><br>
    <br>
    Bookmark portlet:版本二
     第二個(gè)Bookmark portlet進(jìn)一步深入了Portlet API 的概念。除了第一例子所使用到的Portlet API 特性,它增加了:
    ? 動(dòng)作處理Action handling
    ? Portlet 參數(shù) Portlet preferences
    ? 驗(yàn)證參數(shù) A preferences validator
    ? 在部署描述符中預(yù)定義參數(shù) Predefined preferences in the deployment descriptor
    在第二個(gè)Bookmark例子里,兩個(gè)新的JSP頁(yè)面替代了版本一中的。首先,edit.jsp允許通過(guò)portlet動(dòng)作添加和刪除書簽。在這個(gè)JSP頁(yè)面中輸入的書簽將作為portlet參數(shù)存放。其次,view.jsp 以超鏈接顯示出作為portlet參數(shù)存放的書簽。
    Bookmark portlet:版本三
     新增用到的特性:
    ? 地區(qū)性部署描述符 Localizable deployment descriptor
    ? 資源包ResourceBundles
    現(xiàn)在部署描述符和JSP頁(yè)面從資源包里(ResourceBundles)獲得可顯示的字符集,他們都可以支持英文和德文了。
    Bookmark portlet:版本四
     最終的這個(gè)portlet例子通過(guò)portlet API傳遞遞交參量(render parameters)示范了導(dǎo)航的概念(the navigational state concept )。在版本四里有七個(gè)書簽,但默認(rèn)一頁(yè)只顯示四個(gè),如圖四所示。通過(guò)點(diǎn)擊next和back的超鏈接,用戶可以導(dǎo)航到向前或者向后的五個(gè)書簽。初始點(diǎn)將被初始化為遞交參量,使得用戶可以使用瀏覽器的刷新、后退和前進(jìn)按鈕。

    按此在新窗口瀏覽圖片
     
     Bookmark portlet版本四的界面

    Portlet復(fù)習(xí)
       
       象你所看到的那樣,portlet規(guī)范的參考實(shí)現(xiàn)包括兩個(gè)部分:portal和portlet容器。Portal作為一個(gè)簡(jiǎn)單的運(yùn)行portlet容器的測(cè)試驅(qū)動(dòng)。Portlet容器作為一個(gè)能迅速使用到其他portal(比如jetspeed)里的普通組件。
        這個(gè)portlet實(shí)例用到了許多portlet API里的很重要的概念。你可以用所有portlet API和servlet API的特性來(lái)擴(kuò)展這個(gè)實(shí)例。比方說(shuō)你可以用一個(gè)servlet在新窗口中輸出其他有用的信息,如一個(gè)打印預(yù)覽。還可以通過(guò)Http會(huì)話與portlet進(jìn)行交互。實(shí)際上,因?yàn)閜ortlet是一個(gè)強(qiáng)大的技術(shù),能用他實(shí)現(xiàn)的功能是無(wú)窮無(wú)盡的。
    posted on 2005-03-29 22:55 笨笨 閱讀(592) 評(píng)論(0)  編輯  收藏 所屬分類: J2EEALLWeblogic Portal
    主站蜘蛛池模板: a级精品九九九大片免费看| 亚洲人JIZZ日本人| 免费国产黄网站在线观看可以下载 | 亚洲成a人片77777老司机| 免费亚洲视频在线观看| 国产成人A在线观看视频免费| 精品四虎免费观看国产高清午夜| 美美女高清毛片视频黄的一免费 | 久久成人永久免费播放| 亚洲av无一区二区三区| 亚洲国产精品综合一区在线| 国产亚洲av片在线观看16女人| 免费国产怡红院在线观看| 成年女人免费v片| 18观看免费永久视频| 叮咚影视在线观看免费完整版| 黄色毛片免费网站| 亚洲av成人一区二区三区观看在线 | 国产亚洲?V无码?V男人的天堂| 国产在线观看免费完整版中文版| 免费做爰猛烈吃奶摸视频在线观看| 91香焦国产线观看看免费| 青柠影视在线观看免费高清 | 国产a视频精品免费观看| 亚在线观看免费视频入口| 热99RE久久精品这里都是精品免费| 一区二区免费在线观看| 特黄aa级毛片免费视频播放| 风间由美在线亚洲一区| 国产成人人综合亚洲欧美丁香花 | 黄色网址免费在线| 看亚洲a级一级毛片| 激情无码亚洲一区二区三区| 亚洲日韩精品无码专区加勒比| 亚洲综合在线一区二区三区| 色老板亚洲视频免在线观| 亚洲人配人种jizz| 亚洲私人无码综合久久网| 亚洲综合激情五月丁香六月| 亚洲最大的成人网站| 国产精品无码亚洲精品2021|