引言
Struts 是一個很受歡迎的開放源代碼平臺基礎(chǔ),它是為了使復(fù)雜的 Web 應(yīng)用程序的創(chuàng)建和維護(hù)更加容易而設(shè)計的。Struts 框架支持模型-視圖-控制器(Model-View-Controller,MVC)模型,并且提出了許多重要的應(yīng)用程序設(shè)計和實現(xiàn)需要注意的事項。為了能夠在門戶應(yīng)用程序中實現(xiàn)頁面導(dǎo)航,WebSphere? Portal V5 提供了一些標(biāo)記,在開發(fā)典型 portlet 和 Struts portlet 時可將這些標(biāo)記用于 JavaServer Pages(JSP)。本文重點討論 Struts 框架創(chuàng)建多模塊的能力,并通過一個樣本 Struts portlet 應(yīng)用程序為您介紹如何采用 JSP 實現(xiàn)頁面導(dǎo)航方法。
我們將關(guān)注以下兩種互補(bǔ)的方法:
- 如何使用在 WebSphere Portal 中可用的某一 JSP 標(biāo)記來從 JSP 實現(xiàn)頁面導(dǎo)航
我們將會看到一個樣本應(yīng)用程序,包括開發(fā)環(huán)境和門戶資源的屏幕快照,以及頁面導(dǎo)航方法的代碼樣本。
- 如何使用 Struts portlet 框架中內(nèi)置的多模塊支持來組織 Web 導(dǎo)航方案
我們將會看到一些代碼樣本,它們闡述了如何使用頁面導(dǎo)航特征來執(zhí)行在門戶環(huán)境中轉(zhuǎn)換的多個 Struts 模塊。
本文假定您已基本了解 Struts 應(yīng)用程序,包括如何在 WebSphere Studio Application Developer 中創(chuàng)建 Struts 應(yīng)用程序、如何將 Struts 作為 portlet 進(jìn)行部署,同時也了解 WebSphere Portal 中的門戶資源。(要獲得這些方面的更多信息,請參見參考資料。)
在開發(fā)和部署我們的樣本應(yīng)用程序時用到了以下產(chǎn)品:
- WebSphere Portal V5.x
- WebSphere Application Server v5.x
- 支持 Struts Version 1.1 的 WebSphere Studio Application Developer v5.0.1 (下面稱為 Application Developer)。
本文所講解的用于實現(xiàn)頁面導(dǎo)航的開發(fā)任務(wù)可同時用于標(biāo)準(zhǔn) portlet 和 Struts portlet。
應(yīng)用程序概述
在樣本應(yīng)用程序中,我們將會使用位于三個不同頁面的三個 portlet。當(dāng)用戶選擇其中某一 portlet 中的鏈接時,該用戶會被定向到另一個頁面,其中駐留著另一個 portlet。在整個文章中我們開發(fā)和提到的示例都會利用多 Struts 模塊將 WebSphere Portal 頁面導(dǎo)航標(biāo)記并入門戶環(huán)境中每個模塊本身的 JSP 文件中。圖 1 概括性地展示了樣本應(yīng)用程序?qū)⑷绾喂ぷ?;為了把重點放在理解這些方法上,我們特意簡化了樣本應(yīng)用程序。在本文的后面我們將會提供應(yīng)用程序的細(xì)節(jié)。
圖 1. 樣本應(yīng)用程序的高級視圖

構(gòu)建導(dǎo)航結(jié)構(gòu)
WebSphere Portal 提供了自己的 JSP 標(biāo)記來供 portlet JSP 使用。其中的一個標(biāo)記,<wps:URLGeneration attribute="value"/>,是用于創(chuàng)建到門戶任何地方的頁面鏈接的。我們使用該標(biāo)記中一個屬性,contentNode="id|name",來創(chuàng)建到不同頁面的 URL,以便構(gòu)建導(dǎo)航結(jié)構(gòu)。該屬性利用一個惟一的標(biāo)識符(內(nèi)容節(jié)點的名稱)來指定可以從中找到該 portlet 的頁面。(關(guān)于這一標(biāo)記的更多信息請參見參考資料。)
在 WebSphere Portal 中選擇 Administration => Portal Settings => Custom Unique Names。我們使用 Custom Unique Names 管理 portlet 來獲取為 contentNode 屬性指定的門戶資源的惟一標(biāo)識符。管理員可以使用 Custom Unique Names portlet 來查看惟一標(biāo)識符并為門戶資源分配(讓人易讀的)自定義名稱。圖 2 顯示了這些已配置的樣本頁面的惟一標(biāo)識符和自定義名稱:
Struts_Test
Struts_Receiver
Struts_Receiver_2
圖 2. Custom Unique Names portlet

在這個示例中,WebSphere Portal 分配給這些頁面的惟一標(biāo)識符分別為 6_0_LT、6_0_P1 和 6_0_IP。(您的值可能會有所不同。)在駐留 WebSphere Portal 的另一臺機(jī)器上也創(chuàng)建了同樣的門戶資源 Struts_Test、Struts_Receiver 和 Struts_Receiver_2 portlet 頁面。為了閱讀和工作的方便,我們也為這些樣本頁面配置自定義名稱,并在 JSP 文件中使用這些自定義名稱(而不是惟一標(biāo)記符)。
在 <wps:URLGeneration attribute="value"/> portlet JSP 標(biāo)記主體中,可以使用 <% wpsURL %> 腳本變量將 URL 直接寫入輸出流。在這個示例中,我們使用以下 JSP 代碼來創(chuàng)建從某一 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 標(biāo)記屬于 engine.tld 標(biāo)記庫,這一標(biāo)記庫是由門戶服務(wù)器引擎使用的。為了讓該門戶 JSP 標(biāo)記可用于我們的 JSP 中,我們在 JSP 頁面的最開始位置添加標(biāo)記庫指示 taglib。如以下代碼所示,通過前綴 wps,我們樣本中所有的 engine.tld 標(biāo)記現(xiàn)在就都可用了:
<%@ taglib uri="/WEB-INF/tld/engine.tld" prefix="wps" %>
|
樣本頁面和 portlet 配置
該樣本應(yīng)用程序的頁面導(dǎo)航條包括三個 portlet(這里提供的長名稱有助于強(qiáng)調(diào)頁面導(dǎo)航流程):
請記住,到目前為止所描述的全部任務(wù)均可用于常規(guī) portlet 或 Struts portlet 開發(fā)。接下來我們將使用多 Struts 模塊中的門戶 JSP 標(biāo)記來實現(xiàn)頁面導(dǎo)航。
在 Struts 中使用多模塊支持
Struts Version 1.1 可以讓我們將單個 Struts 應(yīng)用程序拆分為多個模塊,每個模塊都有自己的操作、JSP 頁面和 Struts 配置文件(圖 6)。在 Struts 應(yīng)用程序中實現(xiàn)多 Struts 模塊需要以下幾個步驟:
- 創(chuàng)建獨立的 Struts 配置文件以及每個應(yīng)用程序模塊的 Struts 操作和 JSPs。
- 配置 Web 部署描述符(
web.xml)。
- 從一個模塊轉(zhuǎn)換到另一個模塊。
雖然 Struts 應(yīng)用程序很容易應(yīng)用,但要想在門戶環(huán)境中運行 Struts 應(yīng)用程序的話,您還需要執(zhí)行其他的步驟。(參見參考資料)。
圖 6. Struts 應(yīng)用程序中的多模塊支持

創(chuàng)建獨立的 Struts 模塊和文件
對于我們的樣本應(yīng)用程序,我們創(chuàng)建了四個 Struts 模塊,以及它們自己的 Struts 配置文件、行為和 JSPs。這些 Struts 模塊是:
address
phone-numbers
overview
default.
我們也配置了 web.xml 和 portlet.xml 文件,并使用 default 模塊執(zhí)行從一個模塊到另一個模塊的轉(zhuǎn)換。
接下來,我們將會根據(jù)實現(xiàn)的需要講解我們的文件需要的改動。
在 Struts 模塊中開發(fā)頁面導(dǎo)航
我們在以下三個模塊中實現(xiàn)頁面導(dǎo)航:
overview
address
phone-numbers.
除了存在一些細(xì)微的差別以外,這些模塊中每一個的頁面導(dǎo)航開發(fā)任務(wù)幾乎都是相同的。因此,我們將講解實現(xiàn) overview 模塊的頁面導(dǎo)航的任務(wù),然后再描述一下其他模塊的實現(xiàn)任務(wù)與此的差別。此外,我們還會講解特定于 Struts 模塊的開發(fā)過程,該模塊是為 default 模塊而轉(zhuǎn)換的。在我們的實現(xiàn)中,default 模塊用于將控制權(quán)交給下一個適當(dāng)?shù)哪K;并不需要頁面導(dǎo)航。然而,由于它啟動其他模塊來執(zhí)行模塊轉(zhuǎn)換并且是導(dǎo)航結(jié)構(gòu)的一個主要部分,所以我們這里也將它包括在內(nèi)。
在 Application Developer 中,我們創(chuàng)建一個支持 Struts Version 1.1 的 Web 項目,然后為開發(fā)任務(wù)創(chuàng)建文件,如下面的表 1 所示。
表 1. 開發(fā)構(gòu)件列表

以下是表 1 所示構(gòu)件的簡要描述:
- JSP 文件:
我們開發(fā)了五個 JSP 文件:
- 用于
default 模塊的 index.jsp 和 failure.jsp 文件;
- 用于
address 模塊的 address.jsp 文件;
- 用于
phone-numbers 模塊的 phone-numbers.jsp 文件;
- 用于
overview 模塊的 overview.jsp 文件。
- 操作:
我們在 com.test.strutstest.actions 包中創(chuàng)建四個 Struts 操作。它們的類為:
- DisplayAction
- DisplayAddressInfoAction
- DisplayPhoneInfoAction
- OverviewAction.
- 表單 bean:
我們在 com.test.strutstest.forms 包中創(chuàng)建兩個表單 bean。它們的類為:
UserFormBean
OverviewFormBean.
- 后端 bean 和模型類:
我們在包中使用一個后端 bean 類(UserBean )和一個模型類(UserBeanHelper)。(后端 bean 包含存根數(shù)據(jù),并不與真正后端進(jìn)行通信。)
- Struts 配置文件:
我們開發(fā)了四個 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 應(yīng)用程序作為 portlet 進(jìn)行部署時需要修改 web.xml 和 portlet.xml 文件。
以上的每一個配置文件都包含下列請求處理器(Request Processor):
<controller
processorClass="com.ibm.wps.portlets.struts.WpsRequestProcessor" >
|
圖 7 顯示了在 Application Developer 開發(fā)環(huán)境中開發(fā)構(gòu)件的位置:
圖 7. WebSphere Studio Application Developer 中的開發(fā)構(gòu)件的位置

配置 default 模塊
要想啟動 default 模塊并查看它如何在 Struts 模塊之間進(jìn)行轉(zhuǎn)換,需要執(zhí)行以下步驟:
- Default 模塊是在 WebSphere Portal 調(diào)用
index.jsp 文件時啟動的,這是在 web.xml 文件中的 <welcome-file-list> 標(biāo)記中指定的:
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
|
- 調(diào)用
index.jsp 時,在 logic Struts 標(biāo)記中指定邏輯轉(zhuǎn)發(fā)名 Display:
<logic:forward name="Display"/>
|
- 將
default 模塊的 struts-config.xml 文件中的邏輯 forward name(在此為 Display)定義為全局轉(zhuǎn)發(fā):
<global-forwards>
<forward name="Display" path="/display.do"/>
</global-forwards>
|
- 在
<global-forwards> 部分中,使邏輯全局轉(zhuǎn)發(fā)上下文關(guān)系路徑 path="/ display.do" 與 <action-mappings> 部分中的操作元素的上下文關(guān)系路徑 path="/display" 路徑相匹配。這一匹配可以啟動 DisplayAction 操作。操作映射部分(包括帶有 path 和 type 屬性的 <action> 元素)如下所示:
<action-mappings>
<action path="/display"
type="com.test.strutstest.actions.DisplayAction">
.................................................
</action>
</action-mappings>
|
為了啟用模塊轉(zhuǎn)換,請為 remaining 模塊配置 default 模塊的 struts-config.xml、portlet.xml 和 config.xml 文件:
- 配置
default 模塊的 struts-config.xml 文件。我們使用 DisplayAction 作為我們的操作類和四個邏輯轉(zhuǎn)發(fā):
<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 文件中的四個邏輯轉(zhuǎn)發(fā)名稱中的每一個均要與在 portlet.xml 文件中設(shè)置的 view.forward 配置參數(shù)值相匹配。表 2 顯示了這一映射關(guān)系:
表 2. view.forward 配置值對轉(zhuǎn)發(fā)名稱配置值

- 配置
web.xml 文件來定義不同的模塊。我們使用 config 初始化參數(shù)來將我們的 default 模塊告知操作 servlet;然而,對于其他的每個模塊,我們列出了一個名為 config/module 的初始化參數(shù),其中 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 配置設(shè)置請參見參考資料。)
- 對
web.xml 和 portlet.xml 文件執(zhí)行標(biāo)準(zhǔn)更新來將 Struts 應(yīng)用程序作為 portlet 進(jìn)行部署。(要獲得更多信息請參見參考資料和下載部分的樣本 web.xml 和 portlet.xml 文件。)
正如 default 模塊的 struts-config.xml 文件中的 <action-mapping> 部分所配置的,模塊轉(zhuǎn)換是在 DisplayAction 類中進(jìn)行的。要想確定 WebSphere Portal 調(diào)用的是哪個模塊,可以執(zhí)行以下的步驟:
- 調(diào)用 DisplayAction 類的 execute() 方法時,訪問的是在
portlet.xml 文件中設(shè)置的 view.forward 參數(shù):
PortletSettings portletSettings = request.getPortletSettings();
String viewForward = portletSettings.getAttribute("view.forward");
|
- 對于我們的 portlet 來說,
view.forward 參數(shù)會有以下的值:
表 3. 樣本 portlet 的 view.forward 配置參數(shù)的值

- 如果
viewForward 為空,那么在 execute() 方法中會將這一變量設(shè)置為 failure。
- 已配置的
viewForward 值的轉(zhuǎn)發(fā)映射是從 struts-config.xml 文件檢索的:
ActionForward forward = new ActionForward();
try
{
forward = mapping.findForward(forwardName);
}
catch (Exception e)
{
...........................................
}
|
- execute() 方法中的最后步驟返回 ActionForward(
forward)的實例:
配置其他 struts-config.xml 文件。根據(jù) DisplayAction 類中的模塊確定結(jié)果,如果 view.forward 參數(shù)值為:
address:
default 模塊的 struts-config.xml 文件的 <action-mappings> 部分中匹配的 start 路徑會使 DisplayAddressInfoAction 在 address 模塊中調(diào)用。根據(jù) web.xml 中的配置,這一過程需要使用到 address/struts-config.xml 文件。address/struts-config.xml 文件包含以下的設(shè)置:
<!-- ===== 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 模塊中調(diào)用。根據(jù) web.xml 文件中的配置,這一過程需要使用到 phone-numbers/struts-config.xml 文件。phone-numbers/struts-config.xml 文件包含以下的設(shè)置:
<!-- ===== 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 模塊中調(diào)用。根據(jù) web.xml 文件中的配置,這一過程需要使用到 overview/struts-config.xml 文件。overview/struts-config.xml 包含以下的設(shè)置:
<!-- ===== 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:
根據(jù) default 模塊的 struts-config.xml 文件中的配置,這種參數(shù)值下會啟動 failure.jsp。
到目前為止,我們已經(jīng)創(chuàng)建了表 1 中所列出的文件,并根據(jù)我們的示例需要,對其中的大部分做了修改?,F(xiàn)在我們就可以開始編寫代碼來實現(xiàn)使用 overview 模塊的頁面導(dǎo)航。以下部分將通過具體步驟指導(dǎo)您完成這一過程。
開發(fā) overview 模塊
要想生成 Overview.jsp 文件、OverviewAction 類、OverviewFormBean 類和 overview/struts-config.xml 文件來開發(fā) Overview Struts portlet,請在操作類和 JSP 文件中遵循這些開發(fā)任務(wù):
- 一旦控制權(quán)從
default 模塊轉(zhuǎn)移到 Overview 模塊,OverviewAction 類中的 execute() 方法會執(zhí)行以下這些任務(wù):
- 訪問
OverviewFormBean 表單 bean 并設(shè)置以下屬性:
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");
...................................................
|
- 在正確的作用域內(nèi)存儲該表單 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);
|
- 如果在操作類的處理過程中沒有出現(xiàn)錯誤,那么根據(jù)我們在
overview/struts-config.xml 文件中的配置,轉(zhuǎn)發(fā)名稱 success 會允許啟動 Overview.jsp。
Overview.jsp 顯示兩個鏈接,指向已開發(fā)的其他 portlet——Receive Phone Numbers Request Struts Portlet 和 Receive Address Request Struts Portlet。我們使用頁面導(dǎo)航方法和 Struts 標(biāo)記來實現(xiàn)這一特征:
- 在 JSP 頁面的最開始的地方使用
taglib 指示來使所有的 engine.tld 標(biāo)記可用于剩余的帶有 prefix.wps 的 JSP 頁面。
<%@ taglib uri="/WEB-INF/tld/engine.tld" prefix="wps" %>
|
- 在
<wps:urlGeneration> portlet 標(biāo)記中使用 contentNode 參數(shù)來指定駐留其他 portlet 的頁面的惟一標(biāo)識符或自定義名稱。為了啟動到 Receive Address Request Struts Portlet(位于 Struts_Receiver 頁面)的頁面導(dǎo)航,我們使用了自定義名稱 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:urlGeneration>
|
- 為了啟動到 Receive Phone Numbers Request Struts Portlet(位于
Struts_Receiver_2 頁面)的頁面導(dǎo)航,我們使用自定義名稱 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 標(biāo)記。實現(xiàn)這些標(biāo)記需要以下的步驟:
- 聲明
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 標(biāo)記:如果在用戶會話中有可用的當(dāng)前地點,就會以適當(dāng)?shù)恼Z言屬性來呈現(xiàn) HTML 元素。
<html:form> Struts 標(biāo)記:用于在 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 標(biāo)記將表單字段和 Struts 中的表單 bean 連結(jié)在一起。根據(jù)用于相關(guān)聯(lián)的 ActionMapping 的表單 bean 規(guī)范定位(或生成,如果有必要)表單 bean。我們在 overview/struts-config.xml 文件中定義的表單 bean 為 UserFormBean:
<form-beans>
<form-bean name="overviewFormBean" type="com.test.strutstest.forms.OverviewFormBean"/>
</form-beans>
|
<bean:write> Struts 標(biāo)記的使用:
這一通用標(biāo)記用于從 bean 輸出特性值。在 Overview.jsp 文件中,它顯示 <bean:write> 來顯示在 UserFormBean 表單 bean 中設(shè)置的文本數(shù)據(jù)。我們使用這一標(biāo)記來顯示 UserFormBean 的某些特性,如下所示:
<bean:write name="overviewFormBean" property="addressLinkName" />
<bean:write name="overviewFormBean" property="phoneNumbersLinkName" />
|
開發(fā)其余的模塊
開發(fā) address 和 phone-numbers 模塊與開發(fā) overview 模塊非常類似,不同之處在于:
address 模塊實現(xiàn) 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 模塊實現(xiàn) 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 模塊,我們使用的都是后端 UserBean bean 類和 UserBeanHelper 模型類,這兩個類都需要使用存根數(shù)據(jù)來模擬用戶信息,而存根數(shù)據(jù)是使用我們的模塊類在后端 bean 中設(shè)置的。這兩個模塊都使用同樣的表單 bean。
要在 DisplayAddressInfoAction 類中開發(fā) address 模塊需要做的是:
一旦控制權(quán)從 default 模塊轉(zhuǎn)移到 address 模塊,DisplayAddressInfoAction 類的 execute() 方法就會執(zhí)行以下任務(wù):
- 訪問表單 bean——
UserFormBean,并設(shè)置以下屬性:
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