引言
Struts 是一個(gè)很受歡迎的開放源代碼平臺(tái)基礎(chǔ),它是為了使復(fù)雜的 Web 應(yīng)用程序的創(chuàng)建和維護(hù)更加容易而設(shè)計(jì)的。Struts 框架支持模型-視圖-控制器(Model-View-Controller,MVC)模型,并且提出了許多重要的應(yīng)用程序設(shè)計(jì)和實(shí)現(xiàn)需要注意的事項(xiàng)。為了能夠在門戶應(yīng)用程序中實(shí)現(xiàn)頁面導(dǎo)航,WebSphere? Portal V5 提供了一些標(biāo)記,在開發(fā)典型 portlet 和 Struts portlet 時(shí)可將這些標(biāo)記用于 JavaServer Pages(JSP)。本文重點(diǎn)討論 Struts 框架創(chuàng)建多模塊的能力,并通過一個(gè)樣本 Struts portlet 應(yīng)用程序?yàn)槟榻B如何采用 JSP 實(shí)現(xiàn)頁面導(dǎo)航方法。
我們將關(guān)注以下兩種互補(bǔ)的方法:
- 如何使用在 WebSphere Portal 中可用的某一 JSP 標(biāo)記來從 JSP 實(shí)現(xiàn)頁面導(dǎo)航
我們將會(huì)看到一個(gè)樣本應(yīng)用程序,包括開發(fā)環(huán)境和門戶資源的屏幕快照,以及頁面導(dǎo)航方法的代碼樣本。
- 如何使用 Struts portlet 框架中內(nèi)置的多模塊支持來組織 Web 導(dǎo)航方案
我們將會(huì)看到一些代碼樣本,它們闡述了如何使用頁面導(dǎo)航特征來執(zhí)行在門戶環(huán)境中轉(zhuǎn)換的多個(gè) Struts 模塊。
本文假定您已基本了解 Struts 應(yīng)用程序,包括如何在 WebSphere Studio Application Developer 中創(chuàng)建 Struts 應(yīng)用程序、如何將 Struts 作為 portlet 進(jìn)行部署,同時(shí)也了解 WebSphere Portal 中的門戶資源。(要獲得這些方面的更多信息,請(qǐng)參見參考資料。)
在開發(fā)和部署我們的樣本應(yīng)用程序時(shí)用到了以下產(chǎn)品:
- WebSphere Portal V5.x
- WebSphere Application Server v5.x
- 支持 Struts Version 1.1 的 WebSphere Studio Application Developer v5.0.1 (下面稱為 Application Developer)。
本文所講解的用于實(shí)現(xiàn)頁面導(dǎo)航的開發(fā)任務(wù)可同時(shí)用于標(biāo)準(zhǔn) portlet 和 Struts portlet。
應(yīng)用程序概述
在樣本應(yīng)用程序中,我們將會(huì)使用位于三個(gè)不同頁面的三個(gè) portlet。當(dāng)用戶選擇其中某一 portlet 中的鏈接時(shí),該用戶會(huì)被定向到另一個(gè)頁面,其中駐留著另一個(gè) portlet。在整個(gè)文章中我們開發(fā)和提到的示例都會(huì)利用多 Struts 模塊將 WebSphere Portal 頁面導(dǎo)航標(biāo)記并入門戶環(huán)境中每個(gè)模塊本身的 JSP 文件中。圖 1 概括性地展示了樣本應(yīng)用程序?qū)⑷绾喂ぷ?;為了把重點(diǎn)放在理解這些方法上,我們特意簡(jiǎn)化了樣本應(yīng)用程序。在本文的后面我們將會(huì)提供應(yīng)用程序的細(xì)節(jié)。
圖 1. 樣本應(yīng)用程序的高級(jí)視圖
構(gòu)建導(dǎo)航結(jié)構(gòu)
WebSphere Portal 提供了自己的 JSP 標(biāo)記來供 portlet JSP 使用。其中的一個(gè)標(biāo)記,<wps:URLGeneration attribute="value"/>
,是用于創(chuàng)建到門戶任何地方的頁面鏈接的。我們使用該標(biāo)記中一個(gè)屬性,contentNode="id|name"
,來創(chuàng)建到不同頁面的 URL,以便構(gòu)建導(dǎo)航結(jié)構(gòu)。該屬性利用一個(gè)惟一的標(biāo)識(shí)符(內(nèi)容節(jié)點(diǎn)的名稱)來指定可以從中找到該 portlet 的頁面。(關(guān)于這一標(biāo)記的更多信息請(qǐng)參見參考資料。)
在 WebSphere Portal 中選擇 Administration => Portal Settings => Custom Unique Names。我們使用 Custom Unique Names 管理 portlet 來獲取為 contentNode
屬性指定的門戶資源的惟一標(biāo)識(shí)符。管理員可以使用 Custom Unique Names portlet 來查看惟一標(biāo)識(shí)符并為門戶資源分配(讓人易讀的)自定義名稱。圖 2 顯示了這些已配置的樣本頁面的惟一標(biāo)識(shí)符和自定義名稱:
Struts_Test
Struts_Receiver
Struts_Receiver_2
圖 2. Custom Unique Names portlet
在這個(gè)示例中,WebSphere Portal 分配給這些頁面的惟一標(biāo)識(shí)符分別為 6_0_LT
、6_0_P1
和 6_0_IP
。(您的值可能會(huì)有所不同。)在駐留 WebSphere Portal 的另一臺(tái)機(jī)器上也創(chuàng)建了同樣的門戶資源 Struts_Test
、Struts_Receiver
和 Struts_Receiver_2
portlet 頁面。為了閱讀和工作的方便,我們也為這些樣本頁面配置自定義名稱,并在 JSP 文件中使用這些自定義名稱(而不是惟一標(biāo)記符)。
在 <wps:URLGeneration attribute="value"/>
portlet JSP 標(biāo)記主體中,可以使用 <% wpsURL %>
腳本變量將 URL 直接寫入輸出流。在這個(gè)示例中,我們使用以下 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 中,我們?cè)?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)航條包括三個(gè) portlet(這里提供的長(zhǎng)名稱有助于強(qiáng)調(diào)頁面導(dǎo)航流程):
請(qǐng)記住,到目前為止所描述的全部任務(wù)均可用于常規(guī) portlet 或 Struts portlet 開發(fā)。接下來我們將使用多 Struts 模塊中的門戶 JSP 標(biāo)記來實(shí)現(xiàn)頁面導(dǎo)航。
在 Struts 中使用多模塊支持
Struts Version 1.1 可以讓我們將單個(gè) Struts 應(yīng)用程序拆分為多個(gè)模塊,每個(gè)模塊都有自己的操作、JSP 頁面和 Struts 配置文件(圖 6)。在 Struts 應(yīng)用程序中實(shí)現(xiàn)多 Struts 模塊需要以下幾個(gè)步驟:
- 創(chuàng)建獨(dú)立的 Struts 配置文件以及每個(gè)應(yīng)用程序模塊的 Struts 操作和 JSPs。
- 配置 Web 部署描述符(
web.xml
)。
- 從一個(gè)模塊轉(zhuǎn)換到另一個(gè)模塊。
雖然 Struts 應(yīng)用程序很容易應(yīng)用,但要想在門戶環(huán)境中運(yùn)行 Struts 應(yīng)用程序的話,您還需要執(zhí)行其他的步驟。(參見參考資料)。
圖 6. Struts 應(yīng)用程序中的多模塊支持
創(chuàng)建獨(dú)立的 Struts 模塊和文件
對(duì)于我們的樣本應(yīng)用程序,我們創(chuàng)建了四個(gè) Struts 模塊,以及它們自己的 Struts 配置文件、行為和 JSPs。這些 Struts 模塊是:
address
phone-numbers
overview
default
.
我們也配置了 web.xml
和 portlet.xml
文件,并使用 default
模塊執(zhí)行從一個(gè)模塊到另一個(gè)模塊的轉(zhuǎn)換。
接下來,我們將會(huì)根據(jù)實(shí)現(xiàn)的需要講解我們的文件需要的改動(dòng)。
在 Struts 模塊中開發(fā)頁面導(dǎo)航
我們?cè)谝韵氯齻€(gè)模塊中實(shí)現(xiàn)頁面導(dǎo)航:
overview
address
phone-numbers
.
除了存在一些細(xì)微的差別以外,這些模塊中每一個(gè)的頁面導(dǎo)航開發(fā)任務(wù)幾乎都是相同的。因此,我們將講解實(shí)現(xiàn) overview
模塊的頁面導(dǎo)航的任務(wù),然后再描述一下其他模塊的實(shí)現(xiàn)任務(wù)與此的差別。此外,我們還會(huì)講解特定于 Struts 模塊的開發(fā)過程,該模塊是為 default
模塊而轉(zhuǎn)換的。在我們的實(shí)現(xiàn)中,default
模塊用于將控制權(quán)交給下一個(gè)適當(dāng)?shù)哪K;并不需要頁面導(dǎo)航。然而,由于它啟動(dòng)其他模塊來執(zhí)行模塊轉(zhuǎn)換并且是導(dǎo)航結(jié)構(gòu)的一個(gè)主要部分,所以我們這里也將它包括在內(nèi)。
在 Application Developer 中,我們創(chuàng)建一個(gè)支持 Struts Version 1.1 的 Web 項(xiàng)目,然后為開發(fā)任務(wù)創(chuàng)建文件,如下面的表 1 所示。
表 1. 開發(fā)構(gòu)件列表
以下是表 1 所示構(gòu)件的簡(jiǎn)要描述:
- JSP 文件:
我們開發(fā)了五個(gè) JSP 文件:
- 用于
default
模塊的 index.jsp
和 failure.jsp
文件;
- 用于
address
模塊的 address.jsp
文件;
- 用于
phone-numbers
模塊的 phone-numbers.jsp
文件;
- 用于
overview
模塊的 overview.jsp
文件。
- 操作:
我們?cè)?com.test.strutstest.actions
包中創(chuàng)建四個(gè) Struts 操作。它們的類為:
- DisplayAction
- DisplayAddressInfoAction
- DisplayPhoneInfoAction
- OverviewAction.
- 表單 bean:
我們?cè)?com.test.strutstest.forms
包中創(chuàng)建兩個(gè)表單 bean。它們的類為:
UserFormBean
OverviewFormBean
.
- 后端 bean 和模型類:
我們?cè)诎惺褂靡粋€(gè)后端 bean 類(UserBean )和一個(gè)模型類(UserBeanHelper)。(后端 bean 包含存根數(shù)據(jù),并不與真正后端進(jìn)行通信。)
- Struts 配置文件:
我們開發(fā)了四個(gè) struts-config.xml
文件,每個(gè)模塊使用一個(gè):
- 用于
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)行部署時(shí)需要修改 web.xml
和 portlet.xml
文件。
以上的每一個(gè)配置文件都包含下列請(qǐng)求處理器(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 模塊
要想啟動(dòng) default
模塊并查看它如何在 Struts 模塊之間進(jìn)行轉(zhuǎn)換,需要執(zhí)行以下步驟:
- Default 模塊是在 WebSphere Portal 調(diào)用
index.jsp
文件時(shí)啟動(dòng)的,這是在 web.xml
文件中的 <welcome-file-list>
標(biāo)記中指定的:
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
|
- 調(diào)用
index.jsp
時(shí),在 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"
路徑相匹配。這一匹配可以啟動(dòng) DisplayAction 操作。操作映射部分(包括帶有 path
和 type
屬性的 <action>
元素)如下所示:
<action-mappings>
<action path="/display"
type="com.test.strutstest.actions.DisplayAction">
.................................................
</action>
</action-mappings>
|
為了啟用模塊轉(zhuǎn)換,請(qǐng)為 remaining 模塊配置 default
模塊的 struts-config.xml
、portlet.xml
和 config.xml
文件:
- 配置
default
模塊的 struts-config.xml
文件。我們使用 DisplayAction 作為我們的操作類和四個(gè)邏輯轉(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
文件中的四個(gè)邏輯轉(zhuǎn)發(fā)名稱中的每一個(gè)均要與在 portlet.xml
文件中設(shè)置的 view.forward
配置參數(shù)值相匹配。表 2 顯示了這一映射關(guān)系:
表 2. view.forward 配置值對(duì)轉(zhuǎn)發(fā)名稱配置值
- 配置
web.xml
文件來定義不同的模塊。我們使用 config
初始化參數(shù)來將我們的 default
模塊告知操作 servlet;然而,對(duì)于其他的每個(gè)模塊,我們列出了一個(gè)名為 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è)置請(qǐng)參見參考資料。)
- 對(duì)
web.xml
和 portlet.xml
文件執(zhí)行標(biāo)準(zhǔn)更新來將 Struts 應(yīng)用程序作為 portlet 進(jìn)行部署。(要獲得更多信息請(qǐng)參見參考資料和下載部分的樣本 web.xml
和 portlet.xml
文件。)
正如 default
模塊的 struts-config.xml
文件中的 <action-mapping>
部分所配置的,模塊轉(zhuǎn)換是在 DisplayAction 類中進(jìn)行的。要想確定 WebSphere Portal 調(diào)用的是哪個(gè)模塊,可以執(zhí)行以下的步驟:
- 調(diào)用 DisplayAction 類的 execute() 方法時(shí),訪問的是在
portlet.xml
文件中設(shè)置的 view.forward
參數(shù):
PortletSettings portletSettings = request.getPortletSettings();
String viewForward = portletSettings.getAttribute("view.forward");
|
- 對(duì)于我們的 portlet 來說,
view.forward
參數(shù)會(huì)有以下的值:
表 3. 樣本 portlet 的 view.forward 配置參數(shù)的值
- 如果
viewForward
為空,那么在 execute() 方法中會(huì)將這一變量設(shè)置為 failure
。
- 已配置的
viewForward
值的轉(zhuǎn)發(fā)映射是從 struts-config.xml
文件檢索的:
ActionForward forward = new ActionForward();
try
{
forward = mapping.findForward(forwardName);
}
catch (Exception e)
{
...........................................
}
|
- execute() 方法中的最后步驟返回 ActionForward(
forward
)的實(shí)例:
配置其他 struts-config.xml
文件。根據(jù) DisplayAction 類中的模塊確定結(jié)果,如果 view.forward
參數(shù)值為:
address:
default
模塊的 struts-config.xml
文件的 <action-mappings>
部分中匹配的 start
路徑會(huì)使 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
路徑會(huì)使 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
路徑會(huì)使 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ù)值下會(huì)啟動(dòng) failure.jsp
。
到目前為止,我們已經(jīng)創(chuàng)建了表 1 中所列出的文件,并根據(jù)我們的示例需要,對(duì)其中的大部分做了修改。現(xiàn)在我們就可以開始編寫代碼來實(shí)現(xiàn)使用 overview
模塊的頁面導(dǎo)航。以下部分將通過具體步驟指導(dǎo)您完成這一過程。
開發(fā) overview 模塊
要想生成 Overview.jsp
文件、OverviewAction 類、OverviewFormBean 類和 overview/struts-config.xml
文件來開發(fā) Overview
Struts portlet,請(qǐng)?jiān)诓僮黝惡?JSP 文件中遵循這些開發(fā)任務(wù):
- 一旦控制權(quán)從
default
模塊轉(zhuǎn)移到 Overview
模塊,OverviewAction 類中的 execute() 方法會(huì)執(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)存儲(chǔ)該表單 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
中查找映射并返回一個(gè) ActionForward
類型的對(duì)象:
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)錯(cuò)誤,那么根據(jù)我們?cè)?
overview/struts-config.xml
文件中的配置,轉(zhuǎn)發(fā)名稱 success
會(huì)允許啟動(dòng) Overview.jsp
。
Overview.jsp
顯示兩個(gè)鏈接,指向已開發(fā)的其他 portlet——Receive Phone Numbers Request Struts Portlet 和 Receive Address Request Struts Portlet。我們使用頁面導(dǎo)航方法和 Struts 標(biāo)記來實(shí)現(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)識(shí)符或自定義名稱。為了啟動(dòng)到 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>
|
- 為了啟動(dòng)到 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)記。實(shí)現(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)記:如果在用戶會(huì)話中有可用的當(dāng)前地點(diǎn),就會(huì)以適當(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。我們?cè)?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
模塊實(shí)現(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
模塊實(shí)現(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.
對(duì)于 address
和 phone-numbers
模塊,我們使用的都是后端 UserBean bean 類和 UserBeanHelper 模型類,這兩個(gè)類都需要使用存根數(shù)據(jù)來模擬用戶信息,而存根數(shù)據(jù)是使用我們的模塊類在后端 bean 中設(shè)置的。這兩個(gè)模塊都使用同樣的表單 bean。
要在 DisplayAddressInfoAction 類中開發(fā) address
模塊需要做的是:
一旦控制權(quán)從 default
模塊轉(zhuǎn)移到 address
模塊,DisplayAddressInfoAction 類的 execute() 方法就會(huì)執(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);
...................................................
|
- 在正確的作用域中存儲(chǔ)該表單 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