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

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

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

    Junky's IT Notebook

    統計

    留言簿(8)

    積分與排名

    WebSphere Studio

    閱讀排行榜

    評論排行榜

    輕松進行Java Portlets--開發基于JSR 168的開發和部署(轉)

    作者:Prakash Malani


      Portlet是生成片段(遵守特定規范的標記語言(如HTML、XML)的片段)的Web組件。片段再合成一個完整的文檔。本文介紹了關于Java Portlet的Java Specification Request (JSR) 168規范。它說明了如何使用BEA WebLogic Workshop 8.1 SP2來創建Java Portlet,以及如何將這些portlet部署到BEA WebLogic Portal 8.1 Sp2上。我將介紹一些關鍵概念,如門戶、桌面和portlet,并詳細描述多種portlet模式和窗口狀態。我還將介紹如何使用Workshop來設計、實現、配置和執行portlet。


      JSR 168定義了有關Java Portlet的規范。門戶是一個Web應用程序和一個portlet的聚合。Portlet容器運行portlet,并管理它們的生命周期。JSR 168定義了portlet與portlet容器之間的契約,它沒有定義portlet容器與門戶之間的契約。門戶的實現留給了門戶供應商。

      BEA WebLogic門戶
      BEA WebLogic Portal (8.1 SP2)的當前版本支持不同類型的portlet:JSP/HTML portlet、Java PageFlow portlet、Struts portlet和Java portlet,將來還會支持其他portlet,如Web Services for Remote Portlets (WSRP)。我們將著重介紹Java portlet。

      WebLogic Portal提供了JSR 168中未描述的門戶功能,包括但不限于:書和頁面中portlet的組織、多渠道支持和使用skin、skeleton和shell定制。

      為了能夠繼續下去,在進行下一部分之前,請先完成以下內容:
       ·使用WebLogic Domain Configuration Wizard創建一個門戶域(如JSR168PortalDomain)。
       ·使用WebLogic Workshop創建一個使用上面所建立域的門戶應用程序(如JSR168PortalApp)。
       ·在門戶應用程序內創建一個門戶Web項目(如JSR168PortalWebProject)。
       ·在門戶Web項目中創建一個WebLogic Portal .portal文件(如JSR168.portal)。
       ·啟動服務器實例。

      創建您的第一個Java Portlet
      下面的步驟描述了如何創建您的第一個JSR 168 portlet。
      ·在門戶Web項目(如JSR168PortalWebProject)中,使用WebLogic Workshop為portlet(入FirstPortlet)創建一個新文件夾。
      ·在新文件夾內使用Wizard通過創建相應的.portlet文件創建一個新portlet(如Firstportlet)。
      ·選擇portlet類型為Java Portlet。
      ·指定標題(如First)。
      ·指定定義標簽(如first)。
      ·指定類名稱(如com.malani.examples.portlets.jsr168.FirstPortlet)。
      ·打開門戶(如JSR168.portal)。
      ·將portlet(如Firstportlet)拖放到門戶中的頁面上(如JSR168.portal)。
      ·運行.portal文件進行測試。

      您的第一個JSR 168 portlet已經成功運行了!但向導在背后作了些什么呢?
      ·它創建了一個特定于WebLogic Workshop和WebLogic Portal的.portlet文件。.portlet文件構成了與特定于Workshop和WebLogic Portal的.portal文件的契約。
      ·向導創建了一個.java文件(如com.malani.examples.portlets.jsr168.FirstPortlet.java),該文件放置在WEB-INF/src目錄中。
      ·向導創建了一個WEB-INF/portlet.xml配置文件,并為portlet在文件中插入了一個條目。該portlet的條目看上去如下:

    <portlet>
    <description>Description goes here</description>
    <portlet-name>first</portlet-name>
    <portlet-class>com.malani.examples.portlets.jsr168.FirstPortlet
    </portlet-class>
    <portlet-info>
    <title>First</title>
    </portlet-info>
    </portlet>


      Java Portlet類
      在該示例中,向導生成的Portlet Java文件擴展了javax.portlet.GenericPortlet類。GenericPortlet類實現了javax.portlet.Portlet接口。圖1是一個Unified Modeling Language (UML)類圖,描述了這些關系。通過直接實現portlet接口,可以編寫一個portlet。然而,GenericPortlet是一個創建portlet的更方便方法。首先,我們看一下portlet生命周期、portlet模式和window狀態。


    圖 1

      Portlet生命周期
      為了成功地創建portlet,您必須遵照portlet生命周期。javax.portlet.Portlet接口中的方法定義了該生命周期,這些生命周期方法是init()、render()、processAction()和destroy()。當部署portlet的實例時調用init()方法。它用于獲得所需的任何昂貴資源(如后臺連接),并執行其他一次性活動。當portlet的實例被撤銷部署時,使用destroy()方法來釋放這些資源。

      Portlet規范清晰區別render請求和動作請求。圖2描述了portlet請求和響應的一個UML類圖。門戶頁面上的render請求會導致對所頁面上的每個portlet上調用render()方法,當用戶在特定portlet上調用某個動作(通常是HTML表單提交)時,將會調用該portlet的processAction()方法。這樣,用戶的動作請求轉換為processAction()方法的一次調用和render()方法的多次調用。


    圖 2

      圖3是一個序列圖,說明了調用processAction()方法的效果,以及為同一頁面上的portlet進行后續render()方法的調用。關于更多信息,請參閱關于處理動作的一節。


    圖 3

      有兩種重載的init()方法,一個沒有參數,另一個有一個javax.portlet.PortletConfig類的實例。注意:關于init(PortletConfig)有一個特殊的caveat。調用super.init(aPortletConfig)失敗將導致一個NullPointerException。所包含的源代碼示例中的Init portlet說明了這種行為(源代碼可以在www.sys-con.com/weblogic/source.cfm中找到)。

      Portlet模式
      JSR 168定義了三種Portlet模式:VIEW、EDIT和HELP。一個portlet實例在任何時候都可以恰巧在一種 portlet模式下。其他自定義portlet模式(如配置和源)都是可能的。VIEW模式是默認的模式。Portlet規范建議EDIT模式允許portlet用戶定制portlet實例,以及HELP模式顯示關于portlet的用法信息。Portlet必須支持VIEW模式,但在portlet中對EDIT模式和HELP模式的支持是可選的。例如,portlet First portlet示例不支持EDIT模式和HELP模式。

      window狀態
      JSR 168定義了三種Window狀態:NORMAL、MINIMIZED和MAXIMIZED。Portlet實例任何時候都可以恰好是一種window狀態。其他自定義window狀態(如半頁)也是可能的。在NORMAL狀態下,portlet占了屏幕區的一小部分。屏幕狀態與其他portlet共享。在MINIMIZED狀態下,portlet的內容被隱藏。在MAXIMIZED狀態下,portlet的內容占屏幕區的大部分。其他共享同一頁面的portlet在MAXIMIZED狀態下被隱藏。例如,portlet First示例支持所有三種window狀態。

      GenericPortlet類
      您創建的大多數portlet將會擴展javax.portlet.GenericPortlet類,而不是直接實現javax.portlet.Portlet接口。GenericPortlet類實現了render()方法。如果portlet的window狀態被最小化,那么render()方法不能做任何事情。如果portlet的window狀態不是最小化,那么render()方法設置在portlet.xml文件中指定的標題,并調用doDispatch()方法。根據Portlet模式, doDispatch()方法適當地調用doView()、doEdit()和doHelp()方法。這樣,由于GenericPortlet類幫助實現render()方法,并且提供doView()、doEdit()和doHelp()方法來覆蓋,因此GenericPortlet類比Portlet接口更便于擴展。

      考慮一下First portlet示例。FirstPortlet類擴展了GenericPortlet,FirstPortlet改寫了doView()方法。

    public void doView(RenderRequest request, RenderResponse response)
    throws PortletException, IOException
    {
    response.setContentType("text/html");
    response.getWriter().write("<p>Hello World</p>");
    }


      注意:調用setContentType()方法前調用getWriter()方法會導致java.lang.IllegalStateException。

      實現Portlet模式
      VIEW模式是強制的,但EDIT和HELP模式是可選的。為了實現EDIT和HELP portlet模式,需要在portlet類中實現適當的doEdit()和doHelp()方法。請參考包含在源代碼示例(本文的源代碼可以在www.sys-con.com/wldj/sourcec.cfm找到)中的portlet Mode。此外,必須在portlet.xml中如下配置各模式:

    <supports>
    <mime-type>text/html</mime-type>
    <portlet-mode>edit</portlet-mode>
    <portlet-mode>help</portlet-mode>
    </supports>


      注意:修改portlet.xml配置文件,但不實現portlet類中的相應方法,會導致javax.portlet.PortletException。

      實現window狀態
      JSR 168沒有描述禁用window狀態支持的方法。然而,WebLogic Portal實現了對它們的禁用。為了禁用portlet對window狀態的支持,需要在weblogic-portlet.xml文件中排除window狀態:

    <portlet>
    <portlet-name>state</portlet-name>
    <supports>
    <mime-type>text/html</mime-type>
    <excluded-window-state>minimized</excluded-window-state>
    <excluded-window-state>maximized</excluded-window-state>
    </supports>
    </portlet>


      請參考源代碼示例中的portlet State。

      包含JavaServer Pages (JSPs)
      考慮portlet First的doView()方法,該方法獲得了Writer的實例,并直接輸出HTML片段。由于多種原因(如為了達到Java邏輯與HTML視圖表現的分離),往往不推薦輸出直接的HTML片段。推薦的方法是使用JSP來顯示視圖。portlet類中的方法執行業務邏輯、設置render參數以及包含JSP。為了包含一個特定的JSP,應首先獲得PortletContext。從PortletContext實例中,通過調用getRequestDispatcher()方法獲得一個PortletRequestDispatcher的實例。通過調用include()方法來包含JSP。例如:

    // execute the necessary logic here...
    PortletRequestDispatcher aDispatcher =
    getPortletContext().getRequestDispatcher(
    "/IncludePortlet/includeView.jsp"
    );
    aDispatcher.include(aRequest, aResponse);


      注意:在執行render()方法時,portlet可能只使用一個PortletRequestDispatcher對象。
      請參考包含在源代碼中的portlet Include。JSP頁面(如includeView.jsp)不包含根HTML標簽(如<html>、<title>和<body>),因為這些標簽由門戶框架提供。JSP頁面只包含顯示portlet所必需的HTML片段。

      處理動作
      在一個標準的Web應用程序中,一個HTML表單提交將導致執行一些業務邏輯。業務處理的結果,要么作為屬性而被設置在請求或會話中并轉發,要么包含到下一個JSP。

      在一個JSR 168 portlet中,一個HTML表單的動作URL應該是什么樣呢?JSR 168定義了一個JSP標簽庫,稱為portlet taglib。HTML表單的動作URL可以使用actionURL portlet標簽生成。例如(請參考favoriteColorEdit.jsp文件):

    <form action="<portlet:actionURL/>" method="post">
    ...
    </form>


      提交該HTML表單將會導致調用portlet的processAction(ActionRequest aRequest, ActionResponse aResponse)方法。像通常一樣,可以通過調用request對象的getParameter()方法來獲得表單參數。注意:通過提交表單調用動作,但portlet中卻沒有processAction()方法,將會導致javax.portlet.PortletException。

      processAction()方法設置response對象中的值。不要使用ActionRequest或ActionResponse對象的setAttribute()方法。值不會從processAction()傳遞到render()方法,而且在JSP中是不可用的。相反要使用ActionResponse對象的setRenderParameter()方法。這些render參數將對所有后續render請求可用,這一點與典型的Web應用程序請求屬性很不相同。典型的Web application請求屬性只對于一個請求可用。另一方面,render請求參數對于許多后續render請求可用。render參數保持可用直到值被動作的重新執行顯式地修改或刪除。

      考慮portlet FavoriteColor。它在VIEW模式顯示了一個用戶偏好的顏色,但是可以在EDIT模式下更改。在EDIT模式下提交偏好的顏色選擇將調用processAction()方法。該方法獲得偏好的顏色請求參數,并將其設置為render參數。這樣,偏好的的顏色render參數將在所有后續render請求中都可用。

      所呈現的參數是怎樣顯示在JSP上的呢?應使用來自portlet標簽庫的defineObjects標簽來定義portlet對象。該標簽使renderRequest、renderResponse和portletConfig portlet對象在頁面中可用。參數通過調用renderRequest對象的getParameter()方法來顯示。請參考與所包含的源代碼示例中的favoriteColorView.jsp。

      portlet FavoriteColor也展示了其他概念。第一個是如何在processAction()方法中用編程的方法改變portlet模式。調用ActionResponse對象的setPortletMode()方法來修改portlet模式。第二個概念是如何使用一個HTML鏈接來修改portlet模式。該鏈接使用來自portlet標簽庫的renderURL標簽生成。根據希望的portlet模式指定portletMode屬性的值。請參考源代碼示例中的FavoriteColorPortlet類和favoriteColorView.jsp頁面。

      Portlet Preferences
      Portlet Preferences(Portlet首選項)是portlet的基本配置數據。一個preference是一個“名稱和值”對。名稱的類型是一個字符串,而值的類型是字符串或字符串數組。Portlet Preference不適于存儲任意數據。portlet容器為portlet preferences提供持久性。在WebLogic Portal中,preference的持久性只在下面兩個條件都為真時才起作用:
      ·門戶運行在桌面中,而不是DOT門戶模式。
      ·用戶已經登錄。

      桌面與DOT門戶模式
      在WebLogic Workshop中創建.portal文件時,像書、頁面和portlet等項都可以被拖放到.portal文件中,.portal文件能夠直接從Workshop內運行。然而,某些功能,如preferences的存儲,在這種DOT門戶模式下運行時是不可用的(DOT門戶模式也稱為單文件模式(Single File Mode))。

      其他模式稱為桌面模式。創建一個門戶時使用Portal Administrator。在門戶內,一個桌面被創建。像圖書、頁面和portlet等項被創建,并放置在桌面中。在這種模式下,某些功能,像preferences的存儲,是可用的(桌面模式也被稱為流模式(Streamed Mode))。

    在繼續討論前,先創建一個桌面:
      啟動Portal Administration(譬如,http://localhost:7001/JSR168PortalAppAdmin/)。一種啟動Portal Administration的方法是直接從Workshop中啟動。選擇Portal菜單,選中Portal Administration菜單項。
      ·登錄進Portal Administration。
      ·創建一個新門戶(譬如,JSR168)。
      ·在門戶中,創建一個新桌面(如d1)。
      ·將LoginPortlet添加到桌面的一個頁面中。
      ·將ContactPortlet添加到桌面的一個文件中。

      Portlet Preferences示例
      Contact portlet演示了Portlet Preferences。Portlet Preferences可以是靜態的或動態的。靜態 preferences與portlet一起在portal.xml文件中指定。例如,ContactPortlet具有一個成為contact-preference的 preferences。contact-preference的默認值也被指定:

    <portlet-preferences>
    <preference>
    <name>contact-preference</name>
    <value>Email</value>
    </preference>
    </portlet-preferences>


      動態 preferences不在portlet.xml配置文件中預定義。當portlet運行時,這些preferences被存儲和讀取。在運行期間,一個javax.portlet.PortletPreferences接口的實例包含這些preferences。該實例通過調用PortletRequest對象的getPreferences()方法獲得。特定preferences的值通過調用preferences實例上的getValue()方法來獲得。

      調用preferences實例的setValue()方法會更新一個preferences值。然而,需要一個額外的步驟來提交這些修改。preferences實例的store()方法被調用來使preferences持久化。preferences只能在processAction()方法中進行修改。如果在processAction()方法中沒有調用store()方法,任何對preferences實例的修改都會被丟棄。注意:就如前面提到的,如果用戶沒有登錄或門戶處于DOT門戶模式,那么調用store()方法將會導致一個運行時異常。

      在portlet和servlet之間有很多相似點。然而,它們也存在著重要區別。portlet規范建立在servlet規范之上。portlet容器存在于servlet容器中。就像servlet部署在一個Web應用程序中,portlet也是如此。Servlet和Web應用程序使用portlet.xml文件進行配置。一個servlet具有顯式的生命周期:init()、doGet()、doPost()等。類似地,一個portlet也具有顯式的生命周期:doView()、doEdit()、processAction()等。servlet和portlet類的方法必須以安全線程的方式編碼。

      然而,也存在著重要的區別。Servlet被允許進行include、forward和redirect操作;然而portlet只被允許進行include操作。Servlet能夠呈現一個完整的頁面,但portlet只提交頁面片段。portlet具有嚴格定義的portlet模式和Window狀態,這方面不像servlet。Portlet具有更正式的請求,對render請求和動作請求進行處理,它們也具有preferences。portlet并不是servlet!

      結束語
      本文通過使用一個簡單的向導描述portlet的創建而開始,并說明了portlet的生命周期以及portlet類實現的內部工作方式,描述了portlet.xml配置文件和相應的weblogic-portlet.xml配置文件的結構和語義。對各種概念,如portlet模式和window狀態,本文也進行了解釋。本文演示了portlet標簽庫的用法和portlet中的表單處理。最后,我介紹了如何使用portletpreferences。理解了本文所介紹的這些知識和概念,您就可以在創建和部署自己的強大portlet的道路上前進了。

      致謝
      感謝Subbu Allamaraju、Max Cooper、Steve Ditlinger、David Lu、Roshni Malani和Alex Toussaint,他們仔細閱讀了這篇文章,并提供了有價值的反饋意見。

      參考資料
      · 要討論這篇文章、并提問問題,從這里開始: www.bartssandbox.com。需要免費成員資格。
      · 下載、閱讀JSR 168:www.jcp.org/en/jsr/detail?id=168
      · WebLogic Portal文檔的起始點:e-docs.bea.com/wlp/docs81/index.html
      · 建立Workshop Help的Java Portlet部分:e-docs.bea.com/workshop/docs81/doc/en/core/index.html
      · 用WebLogic Portal 8.1開發JSR 168 Portlet:dev2dev.bea.com/products/wlportal81/articles/JSR168.jsp
      · Web Services for Remote Portlets (WSRP)規范:www.oasis-open.org/committees/tc_home.php?wg_abbrev=wsrp
      · 嘗試一下WSRP:dev2dev.bea.com/codelibrary/code/wsrp_supportkit.jsp
      · Single File Mode和Streamed Rendering Mode:單擊這里!
      · 有關Portlet規范上的文章:
    - 介紹Portlet規范,第1部分:
    www.javaworld.com/javaworld/jw-08-2003/jw-0801-portlet_p.html
    -介紹Portlet規范,第2部分:
    www.javaworld.com/javaworld/jw-09-2003/jw-0905-portlet2_p.html
      · 對JSR 168白皮書的介紹:單擊這里!
      · Java Passion Portlet演講筆記:www.javapassion.com/j2eeadvanced/Portlet4.pdf

      源代碼
      源代碼-Zip文件
      英文原文:http://www.sys-con.com/story/?storyid=45565&DE=1

     作者簡介
    icon
    Prakash Malani
    Prakash Malani 在架構、設計和開發軟件方面經驗豐富。他在許多應用領域從事過軟件開發,比如娛樂、金融、零售、醫學、通信和交互式電視。他喜歡實踐和研究先進的技術,比如Java 2 Enterprise Edition (J2EE)、Unified Modeling Language (UML)和eXtensible Markup Language (XML)。他還在加利福尼亞州立理工大學波莫那校區等機構講授最佳實踐和設計模式。他在業界的著名出版物上發表過許多文章,比如JavaWorld和WebLogic Developers Journal。當前,他正在幫助組織Los Angeles BEA Users Group (LABEAUG)。
    dot dot dot

    dot
      作者其它文章

    posted on 2007-06-15 10:39 junky 閱讀(703) 評論(0)  編輯  收藏 所屬分類: portal

    主站蜘蛛池模板: 亚洲五月六月丁香激情| 91禁漫免费进入| 亚洲成A人片在线播放器| 亚洲va久久久噜噜噜久久| 国产免费人成视频在线观看| **aaaaa毛片免费同男同女| 福利免费在线观看| 免费精品国产自产拍在线观看| 亚洲人成7777影视在线观看| 亚洲av色福利天堂| 亚洲伊人久久大香线蕉综合图片| 无码视频免费一区二三区| 97视频免费在线| 最近中文字幕2019高清免费| a毛片免费全部在线播放**| 人妻免费久久久久久久了| 亚洲欧美日韩中文二区| 亚洲中字慕日产2021| 亚洲黄色在线播放| 亚洲成AV人片在线观看WWW| 亚洲精品国产成人片| 日韩一卡2卡3卡4卡新区亚洲| 免费国产成人午夜私人影视| 天天拍拍天天爽免费视频| 无码一区二区三区AV免费| 在线a免费观看最新网站| 日本免费一区二区三区| 国产免费无码一区二区| a级特黄毛片免费观看| 中文字幕一区二区三区免费视频| 国产精品偷伦视频免费观看了| 无码的免费不卡毛片视频| 日韩免费码中文在线观看| 香蕉视频免费在线| 全黄A免费一级毛片| xxxxx做受大片在线观看免费| 一个人看的www在线免费视频 | 在线jlzzjlzz免费播放| 国产男女性潮高清免费网站| 性做久久久久免费观看| 日批日出水久久亚洲精品tv|