Portlet 參數選項

以下文字轉載自:http://dev2dev.bea.com.cn/techdoc/200403134.html

Portlet 參數選項提供了將應用程序數據與 portlet 關聯到一起的首選方式。 這一特性是基於其用途來個性化portlet的關鍵。在本文中,我們將詳細講述 portlet 參數選項。

Portlet 參數選項提供了將應用程序數據與 portlet 關聯到一起的首選方式。 這一特性是基於其用途來個性化portlet的關鍵。在本文中,我們將詳細講述 portlet 參數選項。

·   什麼是 portlet 參數選項?

指定參數選項

修改參數選項

參數選項的 JSP 標籤

參數選項-實用注意事項

·   定義 Portlet 每個 portlet 都有一個用於顯示數據/內容的 UI,和一段用於處理用戶交互的代碼。

使用 Portlet 一旦創建了portlet ,門戶管理員和(或)終端用戶就可以在各種門戶和桌面的頁面中多次添加相同的 portlet 。然後,門戶管理員和(或)終端用戶可以自定義 portlet 的各種屬性(例如,portlet 的標題)。在這種情況下,門戶管理員和(或)終端用戶要處理 portlet 的特定用途。 就是說,在此過程中,要創建 portlet 實例並定製每一個實例。

正如您從中看出的,portlet 比其他 Web 組件(如 servletJSP 或甚至 Java Page Flow)更易重複使用。一旦創建了一個 portlet ,可以將它多次實例化。

由於可爲portlet 創建多個實例,我們自然期望每個實例的行爲不同,但卻使用相同的代碼和 UI 例如,請看一個用於顯示“股票投資組合”的常見的 portlet 指定一個股票代號的列表,該 portlet 定期從股票報價網站檢索報價,並在 portlet 窗口中顯示這些報價。 通過讓每個用戶更改股票代號的列表和重新加載報價數據的時間間隔,可以讓每個用戶自定義這個 portlet


但是,portlet 需要能夠持久存儲股票代號的列表和檢索的時間間隔,並在用戶自定義這些值時更新它們。 特別是,必須持久管理以下數據:

默認值: portlet 可以指定股票代號的默認列表和合理的檢索時間間隔。無論用戶是誰,這些值都可用於 portlet 的所有用途。用戶甚至可以是匿名的。

自定義的值: 用戶更新特定 portlet 實例的值時,需要 portlet 也能夠存儲這些值。 注意,portlet 還應該將這一數據定義在某個實例內,這樣該自定義纔不會影響 portlet 的其他實例。


Portlet
參數選項提供了將這些數據與 portlet 關聯起來的一個框架。除了具有建多個 portlet 實例的能力之外,WebLogic Portal 8.1 還允許用戶爲 portlet 指定參數選項。

在本文中,我們將分析以下內容:

·   如何關聯 portlet 參數選項和 portlet

·   注意事項

什麼是 Portlet 參數選項?


portlet
參數選項是指定的字符串數據。 例如,股票投資組合 portlet 可能具有以下 portlet 參數選項:

並且值爲“BEAS, MSFT”的參數選項

並且值爲“600” (以秒計算)的參數選項。


可以將多個這種參數選項與 portlet 關聯。 portlet 參數選項具有以下屬性:

名稱: 每個參數選項都有一個名稱。 對於特定 portlet,任何兩個參數選項不能有相同的名稱。

描述: 參數選項的簡要描述。

值: 每個參數選項可以有一個(單值參數選項)或多個值(多值參數選項)。每個值都是 java.lang.String 類型的。

只讀: 用一個布爾值表示特定參數選項的值是否可以被 portlet 更改。


WebLogic Portal 8.1
提供以下特性來管理 portlet 參數選項:

在開發時指定 portlet 參數選項: 構建 portlet 時,可爲每個 portlet的參數選項指定名稱和默認值。 默認情況下,從此 portlet 派生出的所有 portlet 實例將使用開發時指定的值。

讓管理員修改 portlet 參數選項: WebLogic Portal 8.1 允許門戶管理員修改特定實例的參數選項。

portlet 在請求時訪問和修改參數選項: 請求時,portlet 可以通過 javax.portlet.PortletPreferences 對象使用程序來訪問和更新參數選項。 可以爲 portlet 創建編輯頁,以便讓用戶更新參數選項,或更新作爲部分普通 portlet 應用程序流程的參數選項。

Portlet 指定參數選項


參數選項與 portlet 的關聯步驟視構建的 portlet 類型而定。 如果使用 Java Portlet API (參見本文結尾的參考部分),請遵照 Java Portlet 規範中指定的步驟。 對於其他類型的 portlet,如那些使用 Java Page FlowStruts JSP portletWebLogic Workshop 將會幫助您把參數選項添加到 portlet

WebLogic Portal
還允許您通過Portal管理工具創建新的參數選項。 但是,由於 portlet 開發人員更易注意 portlet 是如何使用 portlet 參數選項的,所以在開發時創建 portlet 參數選項更合適。


Java Portlet 指定參數選項

對於使用 Java Portlet API portlet,可以在 portlet 部署描述符中指定參數選項。 對於 web 應用程序中的所有 portlet,部署描述符是portlet.xml,它位於 web 應用程序的目錄WEB-INF中。 下面是一個示例。

    <portlet>

  <description>

      This portlet displays a stock portfolio.</description>

  <portlet-name>portfolioPortlet</portlet-name>

  <portlet-class>portlets.stock.PortfolioPortlet </portlet-class>

  <supports>

      <mime-type>text/html</mime-type>

      <portlet-mode>edit</portlet-mode>

  </supports>

  <portlet-info>

      <title>My Portfolio</title>

  </portlet-info>

  <portlet-preferences>

      <preference>

    <name>stockSymbols</name>

    <value>BEAS, MSFT</value>

      </preference>

      <preference>

    <name>refreshInterval</name>

    <value>600</value>

      </preference>

  </portlet-preferences>

    </portlet>

這個代碼片斷使用兩個參數選項部署股票投資組合 portlet 一個名爲 BEAS, MSFT, 的參數選項,另一個參數選項是 refreshInterval 且值爲 600。不用爲 以粗體顯示的值元素) 

    <portlet>

  <description>

      This portlet displays a stock portfolio.

  </description>

  <portlet-name>portfolioPortlet</portlet-name>

  <portlet-class>portlets.stock.PortfolioPortlet </portlet-class>

  <supports>

      <mime-type>text/html</mime-type>

      <portlet-mode>edit</portlet-mode>

  </supports>

  <portlet-info>

      <title>My Portfolio</title>

  </portlet-info>

  <portlet-preferences>

      <preference>

    <name>stockSymbols</name>

    <value>BEAS</value>

          <value>MSFT</value>

      </preference>

      <preference>

    <name>refreshInterval</name>

    <value>600</value>

      </preference>

  </portlet-preferences>

    </portlet>

如果不允許 portlets 使用程序來更新任何給定參數選項,可以將參數選項標記爲只讀。 例如,如果要防止 portlets 更改

    <portlet>

  <description>

      This portlet displays a stock portfolio.

  </description>

  <portlet-name>portfolioPortlet

  <portlet-class>portlets.stock.PortfolioPortlet

  <supports>

      <mime-type>text/html</mime-type>

      <portlet-mode>edit</portlet-mode>

  </supports>

  <portlet-info>

      <title>My Portfolio</title>

  </portlet-info>

  <portlet-preferences>

      <preference>

    <name>stockSymbols</name>

    <value>BEAS</value>

    <value>MSFT</value>

      </preference>

      <preference>

    <name>refreshInterval</name>

    <value>600</value>

    <read-only>true</read-only>

      </preference>

  </portlet-preferences>

    </portlet>

注意,通過將參數選項標記爲只讀,只能防止 portlet 在請求時更改當前值。 門戶管理員始終可以更改參數選項的值。

爲其他類型的 Portlets 指定參數選項
如果構建其他類型的 portlet (如那些使用 Java Page Flow、或 Strut、或簡單 JSP portlet)WebLogic Workshop 可以幫助您添加參數選項。

以下步驟顯示瞭如何給portlet添加參數選項。 這些步驟上標記有 [1][2] [3]

步驟 1 將“New Preference”控件拖到 portlet 窗口中。

步驟 2 通過展開“Portlet Preferences”選項卡選擇參數選項。

步驟 3 Property Editor中更新參數選項的屬性。


要爲參數選項指定多個值,用相同的名稱創建多個參數選項即可。 要將參數選項標記爲只讀, 可將Modifiable屬性標記爲false

使用參數選項 API 訪問或修改參數選項


在請求時,對於特定的 portlet portlet 參數選項可表示成 javax.portlet.PortletPreferences 接口的實例。 這個接口是Java Portlet API的組成部分。 該接口指定了訪問和修改 portlet 參數選項的方法。

獲取參數選項: portlet 可以使用以下方法訪問它的參數選項。

String getValue(String name、String default)

使用該方法獲取參數選項的第一個值。

String[] getValues(String name, String[] defaults)

使用該方法獲取參數選項的所有值。

boolean isReadOnly(String name)

使用該方法確認是否一個特定的參數選項是隻讀的。

Enumeration getNames()

使用該方法獲取一個所有參數選項名稱的目錄。

Map getMap()

使用該方法獲取參數選項的鏡像。 此鏡像中的鍵是所有參數選項的名稱,其值與getValues(String name, String[] defaults)返回的值相同。


設置參數選項: portlet 可以使用以下方法更改參數選項的值。

void setValue(String name, String value)

使用該方法設置參數選項的值。

void setValues(String name, String[] values)

使用該方法爲參數選項設置多個值。

void store()

使用該方法提交對 portlet 參數選項所作的更改。

void reset(String name)

使用該方法將參數選項的值重新設置爲默認值,或者在沒有默認值時將參數選項刪除。


通過調用 setValue()setValues() reset() 方法更改參數選項後必須調用 store() 明確地將這些更改保存爲永久的。 否則更改將不是永久的。


Java Portlet 獲取或設置 Portlet 參數選項
對於使用 Java Portlet API 編寫的 portlet可以從傳入 portlet 的請求——processAction() 方法內的 javax.portlet.RenderRequest render() 方法內的 javax.portlet.ActionRequest獲得 doEdit() 方法中。

<%@ taglib uri="http://java.sun.com/portlet" prefix="portlet"%>

<%@ page import="javax.portlet.PortletPreferences" %>

<portlet:defineObjects/>

<%

   PortletPreferences prefs = renderRequest.getPreferences();

   String refreshInterval = prefs.getValue("refreshInterval", "600");

   String symbols = prefs.getValue("stockSymbols", "BEAS, MSFT");

%>

<form method="POST" action="">

   <table>

     <tr>

<td>Symbols</td><td><input name="symbols" value="<%=symbols>"/></td>

     </tr>

     <tr>

<td>Refresh Interval</td><td><input name="refreshInterval"

      value="<%=refreshInterval>"/></td>

     </tr>

     <tr>

<td></td>

<td><input type="submit" value="Submit"/></td>

     </tr>

   </table>

 </form>

portlet 在它的processAction() 方法中更新這些參數選項。

public class PortfolioPortlet extends GenericPortlet  {

{

    public void doEdit(RenderRequest renderRequest, RenderResponse renderResponse)

  throws IOException, PortletException 

    {

...

    }

    public void processAction(ActionRequest actionRequest, ActionResponse actionResponse)

  throws PortletException

    {

  String refreshInterval = actionRequest.getParameter(“refreshInterval”);

  String symbols = actionRequest.getParameter(“stockSymbols”);

  PortletPreferences prefs = actionRequest.getPreferences();

  prefs.setValue(“refreshInterval”, refreshInterval);

  prefs.setValue(“stockSymbols”, symbols);

  try {

      prefs.store();

  }

  catch(SecurityException se) {

      // Thrown when the user does not have enough privileges to store preferences.

      // Make sure that the user logged into the portal.

      ...

  }

  catch(catch(IOException ioe) {

      // There is an error storing preferences

      ...   

  }

    }

}

processAction() 中,此 portlet 使用 javax.portlet.ActionRequest 對象獲取參數選項。

爲其他 Portlet 獲取/設置 Portlet 參數選項
也可以從其他類型的 Portlet 訪問和更新 portlet 參數選項。 主要的不同是獲取 javax.portlet.PortletPreferences 對象的實例的方法。

提交階段: portlet 的提交階段 (例如,在與 Page Flow 關聯的 JSP 中,或在與 portlet 關聯的備份文件的 preRender() 方法中)portlet 可以使用 com.bea.netuix.servlets.controls.portlet.PorteltPresentationContext 獲取 portlet 參數選項。

操作階段: portlet 的操作階段 (例如,在 Page Flow 操作中,或在與 portlet 關聯的備份文件的 handlePostbackData() 方法中)portlets 可以使用 com.bea.netuix.servlets.controls.portlet.PortletBackingContext 獲取 portlet 參數選項。


這些類都提供了方法 getPreferences(),它接受 javax.portlet.PortletPreferences 類型的對象。

用於獲取 Portlet 參數選項的 JSP 標籤


WebLogic Portal 8.1
提供了用於訪問 portlet 參數選項的 JSP 標籤庫。 這個標籤庫包括以下 JSP 標籤:

getPreference

使用該標籤獲取 portlet 參數選項的值。

getPreferences

使用該標籤獲取 portlet 參數選項的所有值。 該標籤還可編輯多個值以便用分隔符分開輸出。

forEachPreference

使用該標籤可從頭到尾重複 portlet 的所有參數選項。可以將其他標籤 (getPreference,getPreferences ifModifiable ) 嵌套在該標籤中。

ifModifible

如果指定的 portlet 參數選項不爲只讀,使用該標籤包括該標籤的正文。

其他

如果指定的 portlet 參數選項爲只讀,將該標籤與 ifModifiable 標籤一起使用以包括該標籤的正文。


有關這些標籤的更多信息,請在 http://edocs.bea.com/workshop/docs81/doc/en/portal/taglib/JspWlpOverview.html?skipReload=true#portlet 上參閱有關這些標籤的 WLW 文檔。

Portlet 參數選項實用注意事項


允許用戶存儲 Portlet 參數選項
使用 Portlet 參數選項 API JSP 標籤,可以構建 UI以允許門戶用戶查看和更新 portlet 參數選項。但是,要允許用戶成功更新參數選項,必須滿足以下條件:

必須通過桌面訪問 Portlet 必須通過將要更新的桌面訪問 portlet,以設置 portlet 參數選項。 .portal 文件訪問 Portlets 不能存儲參數選項。 如果通過 .portal 文件訪問 portletportlet 將遇到 java.lang.UnsupportedOperationException

用戶必須通過驗證: 訪問 portlet 的用戶必須通過驗證。如果用戶是匿名的,portlet 將遇到 java.lang.SecurityException


注意,無論用戶是否爲匿名,或是否通過 .portal 文件訪問 portletportlet 始終可以獲得 portlet 參數選項。

存儲任意數據作爲參數選項
要嘗試存儲任意應用程序數據作爲 portlet 參數選項。 例如,考慮一個允許用戶在服務器上加載並存儲文檔的 portlet 我們是否可以將那些文檔存儲爲 portlet 參數選項?

回答是否定的。portlet 參數選項的用途是爲 portlet 實例關聯一些屬性的設定,而無需考慮任何實現特定的 portlet 實例 ID 這些屬性可幫助自定義 portlet 的行爲。 portlet 參數選項的基本實現不是爲存儲任意應用程序數據設計的。

另一種可選方案也很簡單。以下步驟概述了這個過程:

設置:

該參數選項將作爲 portlet 應用程序數據的主鍵。 爲該參數選項指派默認值。

·   portlet 中:

例如,使用序列號生成器),並設置它爲參數選項的值,然後存儲參數選項。

o  現在使用參數選項的值作爲主鍵來存儲應用程序數據。


這個步驟將確保應用程序數據始終在 portlet 實例範圍內。

您可能想知道是否可以通過直接存儲應用程序數據,而不是 portlet 實例 ID 解決相同的問題。現在讓我們分析這個方法。

使用實例 ID 代替參數選項
門戶框架通過在內部生成實例 ID 來維護實例標識。 Portlet 可以通過 com.bea.netuix.servlets.controls.portlet.PorteltPresentationContext com.bea.netuix.servlets.controls.portlet.PorteltBackingContext 上的 getInstanceId() 方法訪問其實例 ID

爲什麼不在數據庫中直接存儲這樣的數據,而是它們的實例 ID 以下原因導致這個方法無效。

首先,門戶框架生成了實例 ID,而portlets 沒有控制何時及如何生成哪些實例 ID 其次,無需 portlet 知識就可隨時更改實例 ID 例如,用戶/管理員通過訪問者/管理工具自定義桌面時,框架可以創建新實例或更改 portlet 的實例 ID 實例 ID 更改後,portlet 將不能從數據庫加載數據。主鍵已經更改,而 portlet 並不能察覺!

而用以上描述的參數選項機制是可以避免這個問題的。

更多參考資料

1. 下載 WebLogic Platform 的最新版本。 檢驗 samplePortal tutorialPortal Web 應用程序以查找有關 portlet 參數選項的示例。

2. 有關 Java Portlet API API 文檔的信息,請參考 http://jcp.org/aboutJava/communityprocess/final/jsr168/index.html Java Portlet API 也同樣指定了 portlet 參數選項。

3. 有關 WebLogic Portal API 文檔的信息,請參考 http://edocs.bea.com/wlp/docs81/index.html

·   什麼是 portlet 參數選項?

指定參數選項

修改參數選項

參數選項的 JSP 標籤

參數選項-實用注意事項

·   定義 Portlet 每個 portlet 都有一個用於顯示數據/內容的 UI,和一段用於處理用戶交互的代碼。

使用 Portlet 一旦創建了portlet ,門戶管理員和(或)終端用戶就可以在各種門戶和桌面的頁面中多次添加相同的 portlet 。然後,門戶管理員和(或)終端用戶可以自定義 portlet 的各種屬性(例如,portlet 的標題)。在這種情況下,門戶管理員和(或)終端用戶要處理 portlet 的特定用途。 就是說,在此過程中,要創建 portlet 實例並定製每一個實例。


正如您從中看出的,portlet 比其他 Web 組件(如 servletJSP

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章