程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 使用Struts portlet在門戶應用程序中實現頁面導航

使用Struts portlet在門戶應用程序中實現頁面導航

編輯:關於JAVA

引言

Struts 是一個很受歡迎的開放源代碼平台基礎,它是為了使復雜的Web 應用程序的創建 和維護更加容易而設計的。Struts 框架支持模型-視圖-控制器(Model-View-Controller,MVC)模型, 並且提出了許多重要的應用程序設計和實現需要注意的事項。為了能夠在門戶應用程序中實現頁面導航, WebSphere®Portal V5 提供了一些標記,在開發典型 portlet 和 Struts portlet 時可將這些標記 用於 JavaServer Pages(JSP)。本文重點討論Struts 框架創建多模塊的能力,並通過一個樣本 Struts portlet 應用程序為您介紹如何采用 JSP 實現頁面導航方法。

我們將關注以下兩種互補的方法:

如何使用在 WebSphere Portal 中可用的某一 JSP 標記來從 JSP 實現頁面導航
我們將會 看到一個樣本應用程序,包括開發環境和門戶資源的屏幕快照,以及頁面導航方法的代碼樣本。

如何使用 Struts portlet框架中內置的多模塊支持來組織 Web 導航方案
我們將會看到一些代碼 樣本,它們闡述了如何使用頁面導航特征來執行在門戶環境中轉換的多個Struts 模塊。

本文假定 您已基本了解 Struts 應用程序,包括如何在 WebSphere StudioApplication Developer 中創建 Struts 應用程序、如何將 Struts 作為 portlet 進行部署,同時也了解 WebSpherePortal 中的門戶資源。

在開發和部署我們的樣本應用程序時用到了以下產品:

WebSphere Portal V5.x

WebSphere Application Server v5.x

支持 Struts Version 1.1 的 WebSphere Studio Application Developer v5.0.1 (下面稱為 Application Developer)。

本文所講解的 用於實現頁面導航的開發任務可同時用於標准 portlet 和 Struts portlet。

應用程序概述

在樣本應用程序中,我們將會使用位於三個不同頁面的三個 portlet。當用戶選擇其中某一 portlet 中的鏈接時,該用戶會被定向到另一個頁面,其中駐留著另一個 portlet。在整個文章中我們開發和提到 的示例都會利用多 Struts 模塊將 WebSpherePortal 頁面導航標記並入門戶環境中每個模塊本身的 JSP 文件中。圖 1 概括性地展示了樣本應用程序將如何工作;為了把重點放在理解這些方法上,我們特意簡 化了樣本應用程序。在本文的後面我們將會提供應用程序的細節。

圖 1. 樣本應用程序的高級視圖

構建導航結構

WebSpherePortal 提供了自己的 JSP 標記來供 portlet JSP 使用。其中的一個標記, <wps:URLGeneration attribute="value"/> ,是用於創建到門戶任何地方的頁面鏈接的。我們使 用該標記中一個屬性, contentNode="id|name" ,來創建到不同頁面的URL,以便構建導航結構。該屬性 利用一個惟一的標識符(內容節點的名稱)來指定可以從中找到該 portlet 的頁面。

在 WebSphere Portal 中選擇 Administration => Portal Settings => Custom Unique Names 。我們使用Custom Unique Names 管理 portlet 來獲取為 contentNode 屬性指定的門戶資源的惟一標識 符。管理員可以使用 Custom Unique Names portlet來查看惟一標識符並為門戶資源分配(讓人易讀的) 自定義名稱。圖 2 顯示了這些已配置的樣本頁面的惟一標識符和自定義名稱:

Struts_Test

Struts_Receiver

Struts_Receiver_2

圖 2. Custom Unique Names portlet

在這個示例中,WebSphere Portal 分配給這些頁面的惟一標識符分別為 6_0_LT 、 6_0_P1 和 6_0_IP 。(您的值可能會有所不同。)在駐留 WebSphere Portal 的另一台機器上也創建了同樣的門戶 資源 Struts_Test 、 Struts_Receiver 和 Struts_Receiver_2 portlet 頁面。為了閱讀和工作的方便 ,我們也為這些樣本頁面配置自定義名稱,並在JSP 文件中使用這些自定義名稱(而不是惟一標記符)。

在 <wps:URLGeneration attribute="value"/> portlet JSP標記主體中,可以使用 <% wpsURL %> 腳本變量將 URL 直接寫入輸出流。在這個示例中,我們使用以下JSP 代碼來創建從某一 JSP 頁面到 Struts Receiver 頁面的鏈接:

<wps:urlGeneration contentNode="Struts_Receiver_Page">
      <A HREF="<%wpsURL.write(out);%>"style="text-decoration:none" >
      Any text</a>
</wps:urlGeneration>

<wps:URLGeneration attribute="value"/> portlet JSP標記屬於 engine.tld 標記庫,這一 標記庫是由門戶服務器引擎使用的。為了讓該門戶 JSP 標記可用於我們的JSP 中,我們在 JSP 頁面的最 開始位置添加標記庫指示 taglib 。如以下代碼所示,通過前綴 wps ,我們樣本中所有的 engine.tld 標記現在就都可用了:

<%@ taglib uri="/WEB-INF/tld/engine.tld" prefix="wps" %>

樣本頁面和 portlet 配置

該樣本應用程序的頁面導航條包括三個portlet(這裡提供的長名稱有助於強調頁面導航流程):

Overview Struts Portlet:

顯示了兩個用於將用戶請示定向到包含電話號碼或地址信息的頁面上 的鏈接,它位於 Struts_Test 頁面(自定義名稱: Struts_Test_Page ),如圖3 所示:

圖 3. Struts_Test 頁面中的 Overview Struts Portlet

Receive Phone Numbers Request Struts Portlet:

顯示用戶的電話號碼,位於 Struts_Receiver_2 頁面(自定義名稱: Struts_Receiver_2_Page ),如圖4 所示:

圖 4. Struts_Receiver_2 頁面中的 Receive Phone Numbers Request Struts Portlet

Receive Address Request Struts Portlet:

顯示用戶地址信息,位於頁面(自定義名稱: Struts_Receiver_Page ),如圖 5 所示:

圖 5. Struts_Receiver 頁面中的 Receive Address Request Struts Portlet

請記住,到目前為止所描述的全部任務均可用於常規 portlet 或 Struts portlet 開發。接下來我們 將使用多 Struts模塊中的門戶 JSP 標記來實現頁面導航。

在 Struts 中使用多模塊支持

Struts Version 1.1可以讓我們將單個 Struts 應用程序拆分為多個模塊,每個模塊都有自己的操作 、JSP 頁面和 Struts 配置文件(圖 6)。在 Struts應用程序中實現多 Struts 模塊需要以下幾個步驟 :

創建獨立的 Struts 配置文件以及每個應用程序模塊的 Struts 操作和 JSPs。

配置 Web 部署描述符( web.xml )。

從一個模塊轉換到另一個模塊。

雖然 Struts 應用程序很容易應用,但要想在門戶環境中運行 Struts應用程序的話,您還需要執行其 他的步驟。

圖 6. Struts 應用程序中的多模塊支持

創建獨立的 Struts 模塊和文件

對於我們的樣本應用程序,我們創建了四個 Struts 模塊,以及它們自己的 Struts 配置文件、行為 和 JSPs。這些 Struts 模塊是:

address

phone-numbers

overview

default
.

我們也配置了 web.xml 和 portlet.xml 文件,並使用 default 模塊執行從一個模塊到另一個模塊的 轉換。

接下來,我們將會根據實現的需要講解我們的文件需要的改動。

在 Struts 模塊中開發頁面導航

我們在以下三個模塊中實現頁面導航:

overview

address

phone-numbers
.

除了存在一些細微的差別以外,這些模塊中每一個的頁面導航開發任務幾乎都是相同的。因此,我們 將講解實現 overview 模塊的頁面導航的任務,然後再描述一下其他模塊的實現任務與此的差別。此外, 我們還會講解特定於 Struts 模塊的開發過程,該模塊是為 default 模塊而轉換的。在我們的實現中, default 模塊用於將控制權交給下一個適當的模塊;並不需要頁面導航。然而,由於它啟動其他模塊來執 行模塊轉換並且是導航結構的一個主要部分,所以我們這裡也將它包括在內。

在 Application Developer 中,我們創建一個支持 Struts Version 1.1 的 Web項目,然後為開發任 務創建文件,如下面的表 1 所示。

表 1. 開發構件列表

以下是表 1 所示構件的簡要描述:

JSP文件:

我們開發了五個 JSP 文件:

用於 default 模塊的 index.jsp 和 failure.jsp 文件;

用於 address 模塊的 address.jsp 文件;

用於 phone-numbers 模塊的 phone-numbers.jsp 文件;

用於 overview 模塊的 overview.jsp 文件。

操作:

我們在 com.test.strutstest.actions 包中創建四個 Struts 操作。它們的類為:

DisplayAction

DisplayAddressInfoAction

DisplayPhoneInfoAction

OverviewAction.

表單 bean:

我們在 com.test.strutstest.forms 包中創建兩個表單 bean。它們的類為:

UserFormBean

OverviewFormBean
.

後端 bean 和模型類:

我們在包中使用一個後端 bean 類(UserBean )和一個模型類 (UserBeanHelper)。(後端 bean包含存根數據,並不與真正後端進行通信。)

Struts 配置文件:

我們開發了四個 struts-config.xml 文件,每個模塊使用一個:

用於 default 模塊的 WEB-INF/struts-config.xml

用於 address 模塊的 WEB-INF/address/struts-config.xml

用於 phone-numbers 模塊的 WEB-INF/phone-numbers/struts-config.xml

用於 overview 模塊的 WEB-INF/overview/struts-config.xml 。

其他配置文件:

在將 Struts 應用程序作為 portlet 進行部署時需要修改 web.xml 和 portlet.xml 文件。

以上的每一個配置文件都包含下列請求處理器(Request Processor):

<controller
   processorClass="com.ibm.wps.portlets.struts.WpsRequestProcessor" >

圖 7 顯示了在 Application Developer開發環境中開發構件的位置:

圖 7. WebSphere Studio Application Developer中的開發構件的位置

配置 default 模塊

要想啟動 default 模塊並查看它如何在 Struts 模塊之間進行轉換,需要執行以下步驟:

Default 模塊是在 WebSphere Portal 調用 index.jsp 文件時啟動的,這是在 web.xml 文件中的 <welcome-file-list> 標記中指定的:

<welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
</welcome-file-list>

調用 index.jsp 時,在 logic Struts 標記中指定邏輯轉發名 Display : <logic:forward name="Display"/>

將 default 模塊的 struts-config.xml 文件中的邏輯 forward name (在此為 Display )定義為全 局轉發: <global-forwards>
    <forward name="Display"  path="/display.do"/>
</global-forwards>

在 <global-forwards> 部分中,使邏輯全局轉發上下文關系路徑 path ="/ display.do" 與 <action-mappings> 部分中的操作元素的上下文關系路徑 path="/display" 路徑相匹配。這一匹 配可以啟動 DisplayAction操作。操作映射部分(包括帶有 path 和 type 屬性的 <action> 元素 )如下所示: <action-mappings>
   <action path="/display"

       type="com.test.strutstest.actions.DisplayAction">
         .................................................
   </action>
</action-mappings>

為了啟用模塊轉換,請為 remaining 模塊配置 default 模塊的 struts-config.xml 、 portlet.xml 和 config.xml 文件:

配置 default 模塊的 struts-config.xml 文件。我們使用 DisplayAction作為我們的操作類和四個 邏輯轉發:

<action-mappings>
    <action path="/display"
      type="com.test.strutstest.actions.DisplayAction">
         <forward name="failure"
           contextRelative="true"
           path="/failure.jsp"/>
         <forward name="address"
           contextRelative="true"
           path="/address/start.do"/>
         <forward name="phone-numbers"
           contextRelative="true"
           path="/phone-numbers/start.do"/>
         <forward name="overview"
           contextRelative="true"
           path="/overview/start.do"/>
    </action>
</action-mappings>

配置 portlet.xml 文件,使之符合 default 模塊的 struts-config.xml 文件中的配置。特別是,在 default 模塊的 struts-config.xml 文件中的四個邏輯轉發名稱中的每一個均要與在 portlet.xml 文件 中設置的 view.forward 配置參數值相匹配。表 2 顯示了這一映射關系:

表 2. view.forward配置值對轉發名稱配置值

配置 web.xml 文件來定義不同的模塊。我們使用 config 初始化參數來將我們的 default 模塊告知 操作servlet;然而,對於其他的每個模塊,我們列出了一個名為 config/module 的初始化參數,其中 module 是我們的模塊名稱。例如:

可以這樣定義 default 模塊:

<init-param>
    <param-name>config</param-name>
    <param-value>WEB-INF/struts-config.xml</param-value>
</init-param>

可以這樣定義其他模塊:

<init-param>
    <param-name>config/address</param-name>   <param-value>WEB- INF/address/struts-config.xml
    </param-value>
</init-param>
<init-param>
    <param-name>config/phone-numbers</param-name>
    <param-value>WEB-INF/phone-numbers/struts-config.xml
    </param-value>
</init-param>
<init-param>
    <param-name>config/overview</param-name>
    <param-value>WEB-INF/overview/struts-config.xml
    </param-value>
</init-param>

對 web.xml 和 portlet.xml 文件執行標准更新來將 Struts 應用程序作為 portlet 進行部署。

正如 default 模塊的 struts-config.xml 文件中的 <action-mapping> 部分所配置的,模塊 轉換是在 DisplayAction 類中進行的。要想確定 WebSphere Portal 調用的是哪個模塊,可以執行以下 的步驟:

調用 DisplayAction 類的 execute() 方法時,訪問的是在 portlet.xml 文件中設置的 view.forward 參數:

PortletSettings portletSettings = request.getPortletSettings();
String viewForward = portletSettings.getAttribute("view.forward");

對於我們的 portlet 來說, view.forward 參數會有以下的值:
表 3. 樣本 portlet 的 view.forward 配置參數的值

如果 viewForward 為空,那麼在 execute() 方法中會將這一變量設置為 failure 。

已配置的 viewForward 值的轉發映射是從 struts-config.xml 文件檢索的:

ActionForward forward = new ActionForward();
try
{
    forward = mapping.findForward(forwardName);
}
catch (Exception e)
{
    ...........................................
}

execute() 方法中的最後步驟返回 ActionForward( forward )的實例:

return (forward);

配置其他 struts-config.xml 文件。根據 DisplayAction 類中的模塊確定結果,如果 view.forward 參數值為:

address:

default

模塊的 struts-config.xml 文件的 <action-mappings> 部分中匹配的 start 路徑會使 DisplayAddressInfoAction 在 address 模塊中調用。根據 web.xml 中的配置,這一過 程需要使用到 address/struts-config.xml 文件。address/struts-config.xml 文件包含以下的設置:

<!-- ===== Global Forward Definitions ===== -->
<global-forwards>
    <forward name="start" path="/start.do"/>
</global-forwards>
<!-- ===== Action Mapping Definitions ===== -->
<action-mappings>
    <action path="/start"
         type="com.test.strutstest.actions.DisplayAddressInfoAction"
         name="userFormBean"
         scope="request">
      <forward name="success" path="/address.jsp"/>
    </action
</action-mappings>

phone-numbers:

default

模塊的 struts-config.xml 文件的 <action-mappings> 部分中匹配的 start 路徑會使 DisplayPhoneInfoAction 在 phone-numbers 模塊中調用。根據 web.xml 文件中的配置 ,這一過程需要使用到 phone-numbers/struts-config.xml 文件。phone-numbers/struts-config.xml 文件包含以下的設置:

<!-- ===== Global Forward Definitions ===== -->
<global-forwards>
    <forward name="start" path="/start.do"/>
</global-forwards>
<!-- ===== Action Mapping Definitions ===== -->
<action-mappings>
    <action path="/start"
      type="com.test.strutstest.actions.DisplayPhoneInfoAction"
      name="userFormBean"
      scope="request">
      <forward name="success" path="/phone-numbers.jsp"/>
    </action
</action-mappings>

overview:

default

模塊的 struts-config.xml 文件的 <action-mappings> 部分中匹配的 start 路徑會使 OverviewAction 在 overview 模塊中調用。根據 web.xml 文件中的配置,這一過程需要使用 到 overview/struts-config.xml 文件。overview/struts-config.xml 包含以下的設置:

<!-- ===== Global Forward Definitions ===== -->
<global-forwards>
    <forward name="start" path="/start.do"/>
</global-forwards>
<!-- ===== Action Mapping Definitions ===== -->
<action-mappings>
    <action path="/start"
      type="com.test.strutstest.actions.OverviewAction"
      name="overviewFormBean"
      scope="request">
      <forward name="success" path="/Overview.jsp"/>
    </action>
</action-mappings>

failure:

根據 default 模塊的 struts-config.xml 文件中的配置,這種參數值下會啟動 failure.jsp 。

到目前為止,我們已經創建了表 1 中所列出的文件,並根據我們的示例需要,對其中的大部分做了修 改。現在我們就可以開始編寫代碼來實現使用 overview 模塊的頁面導航。以下部分將通過具體步驟指導 您完成這一過程。

開發 overview 模塊

要想生成 Overview.jsp 文件、OverviewAction 類、OverviewFormBean 類和 overview/struts- config.xml 文件來開發 Overview Struts portlet,請在操作類和 JSP 文件中遵循這些開發任務:

一旦控制權從 default 模塊轉移到 Overview 模塊,OverviewAction 類中的 execute() 方法會執行 以下這些任務:

訪問 OverviewFormBean 表單 bean 並設置以下屬性:

try
{
String forwardName = null;
if (form == null)
{
    form = (ActionForm) request.getAttribute("overviewFormBean");
}
//Set-up form bean fields
OverviewFormBean formBean = (OverviewFormBean) form;
formBean.setPhoneNumbersLinkName("List Phone Numbers");
formBean.setAddressLinkName("Address Information");
...................................................

在正確的作用域內存儲該表單 bean:

try
{
    //Store the bean in the correct scope
    if ("request".equals(mapping.getScope()))
        request.setAttribute(mapping.getName(), formBean);
    else
        session.setAttribute(mapping.getName(), formBean);
}
catch (Exception e)
{
        ..................................
}

在 overview/struts-config.xml 中查找映射並返回一個 ActionForward 類型的對象:

String forwardName = null;
ActionForward forward = new ActionForward();
.......................................//If no errors occur then look for  "success"
try
{
    forward = mapping.findForward(forwardName);
    if (forward != null)
    {
    .....................................
    }
else
    .....................................
}
catch(Exception e)
{
    ...................................
}
return (forward);

如果在操作類的處理過程中沒有出現錯誤,那麼根據我們在 overview/struts-config.xml 文件中的 配置,轉發名稱 success 會允許啟動 Overview.jsp 。

Overview.jsp 顯示兩個鏈接,指向已開發的其他 portlet--Receive Phone Numbers Request Struts Portlet 和Receive Address Request Struts Portlet。我們使用頁面導航方法和 Struts 標記來實現這 一特征:

在 JSP 頁面的最開始的地方使用 taglib 指示來使所有的 engine.tld 標記可用於剩余的帶有 prefix.wps 的 JSP 頁面。

<%@ taglib uri="/WEB-INF/tld/engine.tld" prefix="wps" %>

在 <wps:urlGeneration> portlet 標記中使用 contentNode 參數來指定駐留其他 portlet 的 頁面的惟一標識符或自定義名稱。為了啟動到 Receive Address Request Struts Portlet(位於 Struts_Receiver 頁面)的頁面導航,我們使用了自定義名稱 Struts_Receiver_Page :

<wps:urlGeneration contentNode="Struts_Receiver_Page">
    <A HREF="<%wpsURL.write(out);%>"style="text-decoration:none" >
    <bean:write name="overviewFormBean" property="addressLinkName" /></a>
</wps:urlGen
eration>

為了啟動到 Receive Phone Numbers Request Struts Portlet(位於 Struts_Receiver_2 頁面)的 頁面導航,我們使用自定義名稱 Struts_Receiver_2_Page :

<wps:urlGeneration contentNode="Struts_Receiver_2_Page">
    <A HREF="<%wpsURL.write(out);%>"style="text-decoration:none" >
    <bean:write name="overviewFormBean"
    property="phoneNumbersLinkName" /></a>
</wps:urlGeneration>

這樣我們就從 My Pages 和惟一名稱列表獲得了頁面的自定義名稱,如圖 2 所示。

在 overview 模塊中,我們使用 <bean:write> 、 <html:html> 和 <html:form> Struts 標記。實現這些標記需要以下的步驟:

聲明 html 和 bean 前綴:

<%@ taglib uri="/WEB-INF/tld/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/tld/struts-bean.tld" prefix="bean" %>

<html:html> Struts 標記:如果在用戶會話中有可用的當前地點,就會以適當的語言屬性來呈 現 HTML 元素。

<html:form> Struts 標記:用於在 Struts 中的所有 HTML 表單處理。form 元素必須始終包 含 action 屬性。action 屬性必須符合 struts-config.xml 中的有效操作。在 Overview.jsp 文件中, 我們使用 form 元素和它的 action 屬性:

<html:form action="/start">

start 屬性映射 overview/struts-config.xml 文件中的下列操作:

<action-mappings>
    <action path="/start"
      type="com.test.strutstest.actions.OverviewAction"
      name="overviewFormBean"
      scope="request">
    <forward name="success" path="/Overview.jsp"/>
    </action>
</action-mappings>

Struts 標記將表單字段和 Struts 中的表單 bean 連結在一起。根據用於相關聯的 ActionMapping 的表單bean 規范定位(或生成,如果有必要)表單 bean。我們在 overview/struts-config.xml 文件中 定義的表單 bean 為 UserFormBean :

<form-beans>
    <form-bean name="overviewFormBean"  type="com.test.strutstest.forms.OverviewFormBean"/>
    </form-beans>

<bean:write> Struts 標記的使用:

這一通用標記用於從 bean 輸出特性值。在 Overview.jsp 文件中,它顯示 <bean:write> 來 顯示在 UserFormBean 表單 bean 中設置的文本數據。我們使用這一標記來顯示 UserFormBean 的某些特 性,如下所示:

<bean:write name="overviewFormBean" property="addressLinkName" />
<bean:write name="overviewFormBean" property="phoneNumbersLinkName" />

開發其余的模塊

開發 address 和 phone-numbers 模塊與開發 overview 模塊非常類似,不同之處在於:

address 模塊實現 Receive Address Request Struts Portlet 使用的是:

address.jsp

DisplayAddressInfoAction class

UserFormBean form bean class

UserBean backend bean class

UserBeanHelper model class

address/struts-config.xml file.

phone-numbers 模塊實現 Receive Phone Numbers Request Struts Portlet 使用的是:

phone-numbers.jsp

DisplayPhoneInfoAction class

UserFormBean form bean class

UserBean backend bean class

UserBeanHelper model class

phone-numbers/struts-config.xml.

對於 address 和 phone-numbers 模塊,我們使用的都是後端 UserBeanbean 類和 UserBeanHelper 模型類,這兩個類都需要使用存根數據來模擬用戶信息,而存根數據是使用我們的模塊類在後端 bean中 設置的。這兩個模塊都使用同樣的表單 bean。

要在 DisplayAddressInfoAction 類中開發 address 模塊需要做的是:

一旦控制權從 default 模塊轉移到 address 模塊,DisplayAddressInfoAction類的 execute() 方法 就會執行以下任務:

訪問表單 bean-- UserFormBean ,並設置以下屬性:

try
{
    String forwardName = null;
if (form == null)
{
      form = (ActionForm) request.getAttribute("userFormBean");
}
    //Set-up form bean fields
    UserFormBean formBean = (UserFormBean) form;
    setFormBean(formBean);
    ...................................................

在正確的作用域中存儲該表單 bean:

try
{
    ........................................
    //Store the bean in the correct scope
    if ("request".equals(mapping.getScope()))
      request.setAttribute(mapping.getName(), formBean);
    else
      session.setAttribute(mapping.getName(), formBean);
}
catch (Exception e)
{
    ..................................
}

在 address/struts-config.xml 中查找映射,並返回一個 ActionForward 類型的對象:

String forwardName = null;
ActionForward forward = new ActionForward();
.......................................
//If no errors occur then look for "success"
try
{
    forward = mapping.findForward(forwardName);
    if (forward != null)
      {
      .....................................
      }
    else
      .....................................
}
catch(Exception e){
      ...................................
}
return (forward);

調用 setFormBean(UserFormBean formBean) 。這一方法獲得該模型的單個實例:

UserBeanHelper userBeanHelper = UserBeanHelper.getInstance();

這一實例植入後端數據,設置 UserFormBean 的實例對象,並使用以下方法調用返回該對象:

UserFormBean userFormBean = userBeanHelper.getUserFormBean();

這一方法和適當的 getter 和 setter 方法一同設置 formBean 的屬性,如下所示,其中使用從模型 返回的對象實例:

public void setFormBean(UserFormBean formBean)
{
    UserBeanHelper userBeanHelper = UserBeanHelper.getInstance();
    UserFormBean userFormBean = userBeanHelper.getUserFormBean();
    //These two parameters are just text values to be displayed on the  browser
    formBean.setAddress("Address");
    formBean.setUserName("UserName");
    //Setting the formBean object attributes with data obtained from the  backend
    formBean.setAddressValues(userFormBean.getAddressValues());
    formBean.setUserNameValues(userFormBean.getUserNameValues());
}

如果在操作類處理過程中沒有出現錯誤,那麼轉發名稱 success 會根據我們在 address/struts- config.xml 文件中的配置啟動待啟動的 address.jsp 文件。

經過適當的修改,以上的步驟可重復用於開發 phone-number 模塊。

頁面導航

用於 Receive Address Request Struts Portlet 和 Receive Phone Numbers RequestStruts Portlet 的 address.jsp 和 phone-numbers.jsp 文件都是使用 Overview Struts Portlet 和 Struts 標記執行頁面導航的:

在 JSP 頁面的最前端使用 taglib 標記庫指示來使所有的 engine.tld 標記可用於剩余的帶有 prefix.wps 的JSP 頁面。

<%@ taglib uri="/WEB-INF/tld/engine.tld" prefix="wps" %>

使用 <wps:urlGeneration> portlet 標記中的 contentNode 參數來調用到 Overview Struts Portlet的頁面導航。這需要指定 Overview Struts Portlet 所在的 Struts_Test頁面的自定義名稱或惟 一標記符。我們使用的是自定義名稱 Struts_Test_Page,它是從 My Pages 和惟一名稱列表中獲得的, 如圖 2 所示。

<wps:urlGeneration contentNode="Struts_Test_Page">
    <A href="<%wpsURL.write(out);%>" style="text-decoration: none">
    <B>Go to Overview Struts Portlet</B></A>
</wps:urlGeneration></TD>

在我們的實現中, address.jsp 和 phone-numbers.jsp 文件中均使用 <logic:iterate> Struts 標記。這一標記遍歷了集合中的元素,它可以是一個屬性,也可以是一個屬性的特性:

聲明 logic 前綴:

<%@ taglib uri="/WEB-INF/tld/struts-logic.tld" prefix="logic" %>

使用 <logic:iterate> Struts 標記;我們在 UserFormBean 操作表單中使用 userNameValues 字符串組。以下代碼顯示了在該操作表單中設置的用戶名稱:

<logic:iterate id="test" name="userFormBean"
    property="userNameValues" indexId="index">

建立開發環境和安裝樣本代碼

要想在 Application Developer 中創建自己的開發環境,請使用在 為 WebSphere Portal4.2 開發 Struts 應用程序和 用 WebSphere Studio V5 編寫一個簡單的 Struts 應用程序中提供的信息。您需要 將 下載部分的 StrutsTest.war 文件導入Application Developer,並使用它所有的 JAR 文件。在 WebSphere Portal中安裝樣本代碼不需要任何特殊的安裝步驟;您可以使用所包含的 WAR 文件,也可以 使用一個新的 WAR 文件,願意用哪一個都可以。

結束語

本文通過一個portlet 標記描述由 WebSphere Portal提供的頁面導航特征,同時也描述由 Struts 門 戶框架所提供的多模塊支持。在我們的樣本實現中,我們創建了應用程序所在的門戶頁面,然後將 portlet JSP 標記合並在適當的 JSP 中。我們在JSP 中使用頁面的自定義名稱而不是由門戶服務器分配 的惟一標記符,這使我們的 JSP 部署相對獨立。

雖然我們的示例並不是一個很復雜的應用程序,但 Struts所提供的框架能夠很好地處理大而復雜的應 用程序流。多模塊支持為每個支持並行開發的模塊提供單個的文件組,同時也提供更好的文件組織,多模 塊支持可以與 WebSphere Portal JSP標記提供的頁面導航方法一起協調工作。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved