第1段. 配置Struts應(yīng)用
介紹
Struts 為我們提供了一個靈活的框架。它可以以很多不同的方式進(jìn)行使用,并且可以在多種不同的層面進(jìn)行定制和擴(kuò)展。這種靈活性的結(jié)果是,許多開發(fā)人員不知道如何配置Struts 來適應(yīng)他們的應(yīng)用。Struts 應(yīng)用可以通過web 應(yīng)用部署描述符web.xml文件和一個或者多個Struts 配置文件 (struts-config.xml)來進(jìn)行配置。另外,Struts Validator 則通過另外的XML 文件來進(jìn)行配置。
這一段動作是關(guān)于處理Struts配置中的一些通用或者不怎么通用的情景。其中包括創(chuàng)建plug-in 以及一種簡單的有效的機(jī)制來解決大多數(shù)問題。我們還會討論多個配置文件的使用,以適應(yīng)團(tuán)隊(duì)開發(fā)和結(jié)果化和分塊Web應(yīng)用本身。最后,我們會討論Struts內(nèi)建的擴(kuò)展支持和定制配置屬性的使用。
本段動作是“Struts秘籍”的第一段動作。
第1.8式. 使用XDoclet 產(chǎn)生Struts配置文件
問題
當(dāng)你修改或者新建一個Action 或ActionForm時(shí),你需要修改對應(yīng)的Struts 配置文件。
動作要領(lǐng)
使用XDoclet 工具,配合Ant,來處理Java代碼中可以自動產(chǎn)生truts-config.xml文件的注解。
動作變化
現(xiàn)在的大多數(shù)應(yīng)用軟件系統(tǒng)都有可執(zhí)行代碼文件文本配置文件組成。這種方式可以使你更容易的在各種不同的環(huán)境之間移植,并且減少必須針對各種不同部署而修改的代碼量。但是它帶來了另外一個負(fù)擔(dān),那就是保持代碼和配置文件之間的一致性。
XDoclet 工具,原本開發(fā)來是針對EJB的開發(fā),它就可以解決這個問題。通過XDoclet,開發(fā)者能夠在代碼中放置能夠描述與代碼相關(guān)的配置屬性的注解,這些注解非常類似于JavaDoc 標(biāo)簽。在構(gòu)建時(shí),你可以使用定制的Ant 任務(wù),由它來使用XDoclet 從而處理這些標(biāo)簽并產(chǎn)生對應(yīng)的XML 配置文件。
對Struts來說,XDoclet 可以產(chǎn)生struts-config.xml文件中的下列元素:
另外, XDoclet 還可以創(chuàng)建字段級的Struts Validator 配置,通常是位于validation.xml 文件之中。最后,如果你要映射EJB 實(shí)體Bean的屬性到Struts ActionForms, XDoclet 可以不產(chǎn)生ActionForm 的Java 源代碼。
首先,你需要添加一個任務(wù)到你的Ant 的build 腳本文件中,該任務(wù)可稱為XDoclet 任務(wù)。Example 1-9展示了一個為struts-example 應(yīng)用產(chǎn)生struts-config.xml 文件的Ant任務(wù)。
Example 1-9. Webdoclet Ant target
<target name="webdoclet" depends="init">
<taskdef
name="webdoclet"
classname="xdoclet.modules.web.WebDocletTask"
classpathref="project.class.path"/>
<webdoclet
mergedir="${merge.dir}"
destdir="${generated.xml.dir}"
excludedtags="@version,@author"
force="${xdoclet.force}">
<fileset dir="${src.dir}">
<exclude name="**/*Registration*.java"/>
<include name="**/*.java"/>
</fileset>
<strutsconfigxml
version="1.1"/>
</webdoclet>
</target>

這個目標(biāo)(target)調(diào)用webdoclet 定制Ant任務(wù),它是由XDoclet提供的。此任務(wù)可以產(chǎn)生多個Web應(yīng)用相關(guān)的工件,包括 web.xml 文件, struts-config.xml 文件,validation.xml 文件。對Struts 應(yīng)用來說,你可能不需要產(chǎn)生web.xml 文件;因?yàn)閷truts 應(yīng)用,該文件并不經(jīng)常改變。在Example 1-9中,webdoclet 任務(wù)被用于產(chǎn)生struts-config.xml 文件。
并不是所有的struts-config.xml 文件中的元素都可以或者應(yīng)該從注解的代碼中產(chǎn)生。像全局forward, 全局例外處理,消息資源,插件等都并不和特定的Action 或ActionForm 類相關(guān)。
XDoclet 是通過讓你在位于特定的目錄中的文件中放置靜態(tài)配置來處理這些事情的。在構(gòu)建時(shí), XDoclet 將這些文件中代碼中產(chǎn)生的元素進(jìn)行合并。你可以通過mergedir 屬性來指定這些靜態(tài)文件的位置。destdir 屬性則指定將創(chuàng)建的文件的存放目錄。通常,你需要為這些產(chǎn)生的文件創(chuàng)建一個單獨(dú)的目錄,然后在其成功創(chuàng)建后將它們拷貝到適當(dāng)?shù)哪夸浿幸还泊虬蛘卟渴稹xcludedtags 屬性指定排除在XDoclet 處理之外的JavaDoc 標(biāo)簽。
|
執(zhí)行@author和 @version標(biāo)簽是通用的。 |
最后, force 屬性強(qiáng)制XDoclet 產(chǎn)生一個新的配置文件。如果這個屬性為false, 新文件只有在對應(yīng)的注解Java代碼發(fā)生改變時(shí)才會產(chǎn)生。
fileset 元素告訴XDoclet 要處理哪些Java 源文件。你可以使用該元素來指示那個源文件包含XDoclet 注解。例如,struts-example 應(yīng)用使用了兩個Struts 配置文件:struts-config.xml 和 struts-config-registration.xml。如Example 1-9所示,你可以通過設(shè)置fileset元素來排除包含名稱"Registration"的類從而排除放入struts-config-registration.xml 文件中的元素。
strutsconfigxml 元素指示XDoclet 產(chǎn)生struts-config.xml 文件。XDoclet 默認(rèn)情況下將產(chǎn)生Struts 1.0兼容的配置文件。因此,如果你用Struts1.1你必須指定版本為"1.1"。XDoclet 也使用該屬性提供對Struts 1.2 的支持。
一旦你在構(gòu)建文件中創(chuàng)建了這個target,你就可以添加注解到Action 和ActionForm 類的代碼中。對ActionForm, XDoclet 提供了@struts.form 標(biāo)簽來產(chǎn)生form-bean 元素。下面的代碼展示了如何在struts-example 應(yīng)用的SubscriptionForm中使用這個類一級的標(biāo)簽:

/**//**
* 用于用戶概要頁面的
*
* @struts.form
* name="subscriptionForm"
*/


public final class SubscriptionForm extends ActionForm
{

}

在webdoclet target 被執(zhí)行時(shí),將在struts-config.xml 中產(chǎn)生下面的form-beans 元素:
<!-- ========== Form Bean Definitions =================================== -->
<form-beans>
<form-bean
name="subscriptionForm"
type="org.apache.struts.webapp.example.SubscriptionForm"
/>

<!--
If you have non XDoclet forms, define them in a file called
struts-forms.xml and place it in your merge directory.
-->
</form-beans>

XDoclet 使用你在標(biāo)簽中指定的名稱來產(chǎn)生form-bean 元素,并且使用ActionForm 的權(quán)限定類名來創(chuàng)建type 屬性。這一特征也是XDoclet最大的優(yōu)點(diǎn)之一。你的類的屬性,比如類名、包名、方法名等,對XDoclet 都可使用,就像它們被用于產(chǎn)生Javadocs 一樣。XDoclet 將在產(chǎn)生的文件的適當(dāng)位置使用這些值。
|
如果你修改了一個類的類名或者包名, XDoclet將產(chǎn)生正確的配置元素而不會混淆。雖然IDE 的重構(gòu)工具也可以處理這種類型的改變,但是使用XDoclet這是另外一種可以集成到現(xiàn)有的Ant構(gòu)建過程中的解決方案。 |
你可以使用XDoclet 來從Action類中產(chǎn)生action 元素。XDoclet 使用@struts.action 標(biāo)簽來指定action 元素。另外,@struts.action-forward 標(biāo)簽則可以指定嵌套的forward 元素。同時(shí)@struts.action-exception標(biāo)簽可以用于產(chǎn)生action特定的宣稱性例外處理。struts-example 中的LoginAction.java 類示于下方,其中還包括產(chǎn)生完整的action元素所需的注解:

/**//**
* Implementation of <strong>Action</strong> that validates a user logon.
*
* @struts.action
* path="/logon"
* name="logonForm"
* scope="session"
* input="logon"
*
* @struts.action-exception
* key="expired.password"
* type="org.apache.struts.webapp.example.ExpiredPasswordException"
* path="/changePassword.jsp"
*/

public final class LogonAction extends Action
{

}

標(biāo)簽中的語法必須嚴(yán)格匹配對應(yīng)的XML元素的語法。如果你已經(jīng)有定義了的 struts-config.xml 文件,一個好辦法是將struts-config.xml中的XML元素剪切粘貼到Action 類中。使 XDoclet 能夠認(rèn)可這些標(biāo)簽作必要的修改。下面位于LogoffAction.java 文件中的注解展示了如何使用@struts.action-forward 標(biāo)簽:

/**//**
* Implementation of <strong>Action</strong> that processes a
* user logoff.
*
* @struts.action
* path="/logoff"
*
* @struts.action-forward
* name="success"
* path="/index.jsp"
*/


public final class LogoffAction extends Action
{

}


雖然XDoclet 對產(chǎn)生struts-config.xml 文件大有幫助,它也并不是萬能的。某些action 元素并不與任何你創(chuàng)建的Action 類相對應(yīng)。例如,struts-example 應(yīng)用中就包含下面的action mapping:
<action path="/tour"
forward="/tour.htm">
</action>

struts-config.xml 文件可以包含全局forwards, 全局例外, controller 元素,消息資源元素以及plug-in 元素。XDoclet 不能產(chǎn)生這些元素。但是它可以和飽含這些配置元素的文件進(jìn)行合并以產(chǎn)生完整的struts-config.xml 文件。Table 1-5列出了在創(chuàng)建struts-config.xm文件時(shí)XDoclet希望在mergedir屬性指定的目錄中找到的文件清單。
Table 1-5. 可以合并到產(chǎn)生的struts-config.xml文件中的配置文件 |
合并文件 |
用途 |
struts-data-sources.xml |
一個XML 文檔,包含可選的data-sources元素 |
struts-forms.xml |
一個XML 未解析的實(shí)體,包含form-bean 元素,作為非XDoclet forms的補(bǔ)充 |
global-exceptions.xml |
一個XML 文檔,包含可選的global-exceptions 元素 |
global-forwards.xml |
一個XML 文檔,包含可選的global-forwards 元素 |
struts-actions.xml |
一個可選的XML 未解析實(shí)體,包含action 元素,作為非XDoclet actions的補(bǔ)充 |
struts-controller.xml |
一個XML 文檔,包含可選的controller 元素 |
struts-message-resources.xml |
一個可選的XML 未解析實(shí)體,包含message-resources元素 |
struts-plugins.xml |
一個可選的XML 未解析實(shí)體,包含 plug-in 元素 |
大多數(shù)開發(fā)者都認(rèn)為, XDoclet 對Struts 開發(fā)并不像他用在EJB 開發(fā)那么能干。比如,如果你在struts-config.xml中主要使用動態(tài)action forms ,那么從ActionForm 中產(chǎn)生form-bean 元素并不會為你帶來任何好處。但是,如果你開發(fā)一個具有大量action元素的大型應(yīng)用,并使用Ant, 那么 XDoclet 則是值得考慮的。XDoclet 也支持其它類型的配置文檔,比如Hibernate mappings的生成。
相關(guān)招式
第1.7式提供了一個模版Ant build 腳本,你可以在其中添加XDoclet target。
關(guān)于XDoclet 的詳細(xì)信息訪問http://xdoclet.sourceforge.net.
你也可以閱讀Manning 出版Craig Walls和Norman Richards所著的Xdoclet in Action ,其中包括Xdoclet在Struts, Webwork, JDO, EJB,JMX, SOAP,Web Service 等方面開發(fā)的應(yīng)用。http://www.manning.com/walls
第1.6式. 管理Struts 配置文件
問題
你需要在Struts配置文件中避免拼寫和其他低級錯誤,以及使得編輯和管理它們更容易些。
動作要領(lǐng)
使用Struts Console,或者其他IDE工具來查看、編輯和管理Struts 配置文件。
動作變化
Web應(yīng)用中最常見的錯誤原因之一就是拼寫錯誤。總體而言,大多數(shù)現(xiàn)代軟件包括Struts 都依賴于某種ASCII文本格式的配置文件和部署描述符,通常是XML。使用能夠進(jìn)行校驗(yàn)的XML 編輯器能夠有助于減少錯誤,但是,它卻不能消除路徑、form-bean名稱、類名等的拼寫和鍵入錯誤。
你可以從http://www.jamesholmes.com下載Stuts Console,它提供了對Struts (struts-config.xml), Validator (validation.xml a和validator-rules.xml), 和Tiles (tiles-defs.xml) 配置文件的圖形化編輯。不需要進(jìn)行手工編輯,你可以使用Struts Console 提供的基于Swing的編輯器進(jìn)行。除了減少了輸入錯誤, Struts Console 還使你對這些文件有一個直觀和總體的視圖。你將發(fā)現(xiàn)這些特征在你的配置文件開始變得龐大的時(shí)候簡直是妙不可言。
Struts Console 提供了一個聰明的圖形編輯器來處理Struts開發(fā)中所用的各種XML配置文件。Figure 1-2是struts-example應(yīng)用的struts-config.xml文件的視圖。
Figure 1-2. Struts Console 中查看Struts 示例應(yīng)用

Editor tab 表現(xiàn)為兩個面板。左邊pane 包含一個組成配置文件的元素的樹形視圖。右邊則是圖形化編輯窗口。不同的編輯器將取決于所選擇的元素。在Figure 1-2中,在視圖中選擇了/saveSubscription action mapping ,右邊則顯示了特的配置細(xì)節(jié),并可以編輯它。
配置文件的XML源代碼可以在一個只讀的窗口中顯示,可以通過選擇Source tab 來打開它。你在圖形環(huán)境中所作的修改,都可以同步反映在源代碼中。當(dāng)然,除非你保存文件,它不會提交進(jìn)行保存。

|
因?yàn)镾truts Console解析和管理實(shí)際的XML 數(shù)據(jù),當(dāng)重新保存文件時(shí),它不會在原始文件中包含任何定制格式化和注釋信息。 |
Struts Console 不同于常規(guī)的XML editor 之處是Struts console 能夠理解元素之間如何關(guān)聯(lián)。例如,在Figure 1-2, 有效可用的Form Beans 可以使用下拉列表來顯示。點(diǎn)擊Form Bean 下拉列表右邊的View 按鈕將顯示選定的Forms 定義。Form Bean 編輯器將顯示出來,而左邊pane的樹形視圖將被更新以反映正在查看的Form Bean。
目前, Struts Console Version 4.4.1支持下列文件的編輯和創(chuàng)建:
- Struts 配置文件( Struts 1.2, 1.1, 和 1.0); 即, struts-config.xml
- Tiles 配置文件;即tiles-defs.xml
- Validator 配置文件( Struts 1.1, 和 1.0);即, validator-rules.xml, validation.xml
- JSP Tag Library Descriptor (TLD) (JSP Version 1.2, 1.1);即, struts-html.tld
除了將它用作一個標(biāo)準(zhǔn)的程序之外,Struts Console 還可以插入到大多數(shù)Java IDE中,比如Eclipse, NetBeans, 和IntelliJ IDEA。
使用任何圖形編輯器之前,最好是要熟悉和理解Struts 配置文件中的結(jié)構(gòu)和元素的含義。只有這樣,你才可以使用工具來隱藏具體的結(jié)構(gòu)而作你想做的事情。這有點(diǎn)類似于你心學(xué)習(xí)一種編程語言的時(shí)候,在依賴于IDE之前,還是最好使用簡單的文本編輯器和命令行工具。最然圖形化工具能夠減少你調(diào)試的精力和時(shí)間,你也需要理解文件的基本結(jié)構(gòu),以便能夠發(fā)生錯誤是找出具體原因。
相關(guān)動作
James Holmes的站點(diǎn)可以下載Struts Console。這個站點(diǎn)還提供其他Struts Console的詳細(xì)資料。James 還開發(fā)其他工具,比如Spring Console。http://www.jamesholmes.com.
Struts 1.2 包括了一個plug-in, 即ModuleConfigVerifier,它用來捕捉應(yīng)用初始化時(shí)發(fā)生的配置錯誤。關(guān)于此插件的詳細(xì)信息,參見http://struts.apache.org/api/org/apache/struts/plugins/ModuleConfigVerifier.html.
MyEclipse 是Eclipse IDE的一個定制化版本。這個漂亮的IDE提供了一個精心裁減的J2EE 應(yīng)用開發(fā)環(huán)境。目前,最新的 MyEclipse 已經(jīng)支持Eclipse 3.0。但是MyEclipse 不是免費(fèi)的,年訂閱費(fèi)大概是不到$50 。如果你想要一個一站式的IDE,它還是值得的。可訪問http://www.myeclipse.com.
Struts Studio 也是一個非常雄心勃勃的開發(fā)工具,視圖提供商業(yè)級的Struts開發(fā)工具。可訪問,http://www.exadel.com/products_strutsstudio.htm.
另外,M7的Nitrox也是非常優(yōu)秀個開發(fā)工具。www.M7.com
商業(yè)IDE幾乎全部提供Struts的開發(fā)工具和環(huán)境,包括:IBM的WebSphere Application Developer Studio, WebSphere Site Developer Studio, Oracle 的JDeveloper , Borland JBuilder, BEA Weblogic Workshop。其中, oracle 和 Bean本身對Struts作了一些擴(kuò)展和定制化。可以訪問個公司的網(wǎng)站獲得詳細(xì)信息。