第1段. 配置Struts应用
介绍
Struts 为我们提供了一个灵活的框架。它可以以很多不同的方式进行使用,并且可以在多种不同的层面进行定制和扩展。这种灵活性的结果是,许多开发人员不知道如何配置Struts 来适应他们的应用。Struts 应用可以通过web 应用部署描述符web.xml文件和一个或者多个Struts 配置文件 (struts-config.xml)来进行配置。另外,Struts Validator 则通过另外的XML 文件来进行配置。
这一段动作是关于处理Struts配置中的一些通用或者不怎么通用的情景。其中包括创建plug-in 以及一种简单的有效的机制来解决大多数问题。我们还会讨论多个配置文件的使用,以适应团队开发和结果化和分块Web应用本身。最后,我们会讨论Struts内建的扩展支持和定制配置属性的使用。
本段动作是“Struts秘籍”的第一段动作。
第1.8式. 使用XDoclet 产生Struts配置文件
问题
当你修改或者新建一个Action 或ActionForm时,你需要修改对应的Struts 配置文件。
动作要领
使用XDoclet 工具,配合Ant,来处理Java代码中可以自动产生truts-config.xml文件的注解。
动作变化
现在的大多数应用软件系统都有可执行代码文件文本配置文件组成。这种方式可以使你更容易的在各种不同的环境之间移植,并且减少必须针对各种不同部署而修改的代码量。但是它带来了另外一个负担,那就是保持代码和配置文件之间的一致性。
XDoclet 工具,原本开发来是针对EJB的开发,它就可以解决这个问题。通过XDoclet,开发者能够在代码中放置能够描述与代码相关的配置属性的注解,这些注解非常类似于JavaDoc 标签。在构建时,你可以使用定制的Ant 任务,由它来使用XDoclet 从而处理这些标签并产生对应的XML 配置文件。
对Struts来说,XDoclet 可以产生struts-config.xml文件中的下列元素:
另外, XDoclet 还可以创建字段级的Struts Validator 配置,通常是位于validation.xml 文件之中。最后,如果你要映射EJB 实体Bean的属性到Struts ActionForms, XDoclet 可以不产生ActionForm 的Java 源代码。
首先,你需要添加一个任务到你的Ant 的build 脚本文件中,该任务可称为XDoclet 任务。Example 1-9展示了一个为struts-example 应用产生struts-config.xml 文件的Ant任务。
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>
这个目标(target)调用webdoclet 定制Ant任务,它是由XDoclet提供的。此任务可以产生多个Web应用相关的工件,包括 web.xml 文件, struts-config.xml 文件,validation.xml 文件。对Struts 应用来说,你可能不需要产生web.xml 文件;因为对Struts 应用,该文件并不经常改变。在Example 1-9中,webdoclet 任务被用于产生struts-config.xml 文件。
并不是所有的struts-config.xml 文件中的元素都可以或者应该从注解的代码中产生。像全局forward, 全局例外处理,消息资源,插件等都并不和特定的Action 或ActionForm 类相关。
XDoclet 是通过让你在位于特定的目录中的文件中放置静态配置来处理这些事情的。在构建时, XDoclet 将这些文件中代码中产生的元素进行合并。你可以通过mergedir 属性来指定这些静态文件的位置。destdir 属性则指定将创建的文件的存放目录。通常,你需要为这些产生的文件创建一个单独的目录,然后在其成功创建后将它们拷贝到适当的目录中一共打包或者部署。excludedtags 属性指定排除在XDoclet 处理之外的JavaDoc 标签。
|
执行@author和 @version标签是通用的。 |
最后, force 属性强制XDoclet 产生一个新的配置文件。如果这个属性为false, 新文件只有在对应的注解Java代码发生改变时才会产生。
fileset 元素告诉XDoclet 要处理哪些Java 源文件。你可以使用该元素来指示那个源文件包含XDoclet 注解。例如,struts-example 应用使用了两个Struts 配置文件:struts-config.xml 和 struts-config-registration.xml。如Example 1-9所示,你可以通过设置fileset元素来排除包含名称"Registration"的类从而排除放入struts-config-registration.xml 文件中的元素。
strutsconfigxml 元素指示XDoclet 产生struts-config.xml 文件。XDoclet 默认情况下将产生Struts 1.0兼容的配置文件。因此,如果你用Struts1.1你必须指定版本为"1.1"。XDoclet 也使用该属性提供对Struts 1.2 的支持。
一旦你在构建文件中创建了这个target,你就可以添加注解到Action 和ActionForm 类的代码中。对ActionForm, XDoclet 提供了@struts.form 标签来产生form-bean 元素。下面的代码展示了如何在struts-example 应用的SubscriptionForm中使用这个类一级的标签:
/**//**
* 用于用户概要页面的
*
* @struts.form
* name="subscriptionForm"
*/
public final class SubscriptionForm extends ActionForm {
}
在webdoclet target 被执行时,将在struts-config.xml 中产生下面的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 使用你在标签中指定的名称来产生form-bean 元素,并且使用ActionForm 的权限定类名来创建type 属性。这一特征也是XDoclet最大的优点之一。你的类的属性,比如类名、包名、方法名等,对XDoclet 都可使用,就像它们被用于产生Javadocs 一样。XDoclet 将在产生的文件的适当位置使用这些值。
|
如果你修改了一个类的类名或者包名, XDoclet将产生正确的配置元素而不会混淆。虽然IDE 的重构工具也可以处理这种类型的改变,但是使用XDoclet这是另外一种可以集成到现有的Ant构建过程中的解决方案。 |
你可以使用XDoclet 来从Action类中产生action 元素。XDoclet 使用@struts.action 标签来指定action 元素。另外,@struts.action-forward 标签则可以指定嵌套的forward 元素。同时@struts.action-exception标签可以用于产生action特定的宣称性例外处理。struts-example 中的LoginAction.java 类示于下方,其中还包括产生完整的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 {
}
标签中的语法必须严格匹配对应的XML元素的语法。如果你已经有定义了的 struts-config.xml 文件,一个好办法是将struts-config.xml中的XML元素剪切粘贴到Action 类中。使 XDoclet 能够认可这些标签作必要的修改。下面位于LogoffAction.java 文件中的注解展示了如何使用@struts.action-forward 标签:
/**//**
* 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 对产生struts-config.xml 文件大有帮助,它也并不是万能的。某些action 元素并不与任何你创建的Action 类相对应。例如,struts-example 应用中就包含下面的action mapping:
<action path="/tour"
forward="/tour.htm">
</action>
struts-config.xml 文件可以包含全局forwards, 全局例外, controller 元素,消息资源元素以及plug-in 元素。XDoclet 不能产生这些元素。但是它可以和饱含这些配置元素的文件进行合并以产生完整的struts-config.xml 文件。Table 1-5列出了在创建struts-config.xm文件时XDoclet希望在mergedir属性指定的目录中找到的文件清单。
Table 1-5. 可以合并到产生的struts-config.xml文件中的配置文件 |
合并文件 |
用途 |
struts-data-sources.xml |
一个XML 文档,包含可选的data-sources元素 |
struts-forms.xml |
一个XML 未解析的实体,包含form-bean 元素,作为非XDoclet forms的补充 |
global-exceptions.xml |
一个XML 文档,包含可选的global-exceptions 元素 |
global-forwards.xml |
一个XML 文档,包含可选的global-forwards 元素 |
struts-actions.xml |
一个可选的XML 未解析实体,包含action 元素,作为非XDoclet actions的补充 |
struts-controller.xml |
一个XML 文档,包含可选的controller 元素 |
struts-message-resources.xml |
一个可选的XML 未解析实体,包含message-resources元素 |
struts-plugins.xml |
一个可选的XML 未解析实体,包含 plug-in 元素 |
大多数开发者都认为, XDoclet 对Struts 开发并不像他用在EJB 开发那么能干。比如,如果你在struts-config.xml中主要使用动态action forms ,那么从ActionForm 中产生form-bean 元素并不会为你带来任何好处。但是,如果你开发一个具有大量action元素的大型应用,并使用Ant, 那么 XDoclet 则是值得考虑的。XDoclet 也支持其它类型的配置文档,比如Hibernate mappings的生成。
相关招式
第1.7式提供了一个模版Ant build 脚本,你可以在其中添加XDoclet target。
关于XDoclet 的详细信息访问http://xdoclet.sourceforge.net.
你也可以阅读Manning 出版Craig Walls和Norman Richards所著的Xdoclet in Action ,其中包括Xdoclet在Struts, Webwork, JDO, EJB,JMX, SOAP,Web Service 等方面开发的应用。http://www.manning.com/walls
第1.6式. 管理Struts 配置文件
问题
你需要在Struts配置文件中避免拼写和其他低级错误,以及使得编辑和管理它们更容易些。
动作要领
使用Struts Console,或者其他IDE工具来查看、编辑和管理Struts 配置文件。
动作变化
Web应用中最常见的错误原因之一就是拼写错误。总体而言,大多数现代软件包括Struts 都依赖于某种ASCII文本格式的配置文件和部署描述符,通常是XML。使用能够进行校验的XML 编辑器能够有助于减少错误,但是,它却不能消除路径、form-bean名称、类名等的拼写和键入错误。
你可以从http://www.jamesholmes.com下载Stuts Console,它提供了对Struts (struts-config.xml), Validator (validation.xml a和validator-rules.xml), 和Tiles (tiles-defs.xml) 配置文件的图形化编辑。不需要进行手工编辑,你可以使用Struts Console 提供的基于Swing的编辑器进行。除了减少了输入错误, Struts Console 还使你对这些文件有一个直观和总体的视图。你将发现这些特征在你的配置文件开始变得庞大的时候简直是妙不可言。
Struts Console 提供了一个聪明的图形编辑器来处理Struts开发中所用的各种XML配置文件。Figure 1-2是struts-example应用的struts-config.xml文件的视图。
Figure 1-2. Struts Console 中查看Struts 示例应用
Editor tab 表现为两个面板。左边pane 包含一个组成配置文件的元素的树形视图。右边则是图形化编辑窗口。不同的编辑器将取决于所选择的元素。在Figure 1-2中,在视图中选择了/saveSubscription action mapping ,右边则显示了特的配置细节,并可以编辑它。
配置文件的XML源代码可以在一个只读的窗口中显示,可以通过选择Source tab 来打开它。你在图形环境中所作的修改,都可以同步反映在源代码中。当然,除非你保存文件,它不会提交进行保存。
|
因为Struts Console解析和管理实际的XML 数据,当重新保存文件时,它不会在原始文件中包含任何定制格式化和注释信息。 |
Struts Console 不同于常规的XML editor 之处是Struts console 能够理解元素之间如何关联。例如,在Figure 1-2, 有效可用的Form Beans 可以使用下拉列表来显示。点击Form Bean 下拉列表右边的View 按钮将显示选定的Forms 定义。Form Bean 编辑器将显示出来,而左边pane的树形视图将被更新以反映正在查看的Form Bean。
目前, Struts Console Version 4.4.1支持下列文件的编辑和创建:
- 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
除了将它用作一个标准的程序之外,Struts Console 还可以插入到大多数Java IDE中,比如Eclipse, NetBeans, 和IntelliJ IDEA。
使用任何图形编辑器之前,最好是要熟悉和理解Struts 配置文件中的结构和元素的含义。只有这样,你才可以使用工具来隐藏具体的结构而作你想做的事情。这有点类似于你心学习一种编程语言的时候,在依赖于IDE之前,还是最好使用简单的文本编辑器和命令行工具。最然图形化工具能够减少你调试的精力和时间,你也需要理解文件的基本结构,以便能够发生错误是找出具体原因。
相关动作
James Holmes的站点可以下载Struts Console。这个站点还提供其他Struts Console的详细资料。James 还开发其他工具,比如Spring Console。http://www.jamesholmes.com.
Struts 1.2 包括了一个plug-in, 即ModuleConfigVerifier,它用来捕捉应用初始化时发生的配置错误。关于此插件的详细信息,参见http://struts.apache.org/api/org/apache/struts/plugins/ModuleConfigVerifier.html.
MyEclipse 是Eclipse IDE的一个定制化版本。这个漂亮的IDE提供了一个精心裁减的J2EE 应用开发环境。目前,最新的 MyEclipse 已经支持Eclipse 3.0。但是MyEclipse 不是免费的,年订阅费大概是不到$50 。如果你想要一个一站式的IDE,它还是值得的。可访问http://www.myeclipse.com.
Struts Studio 也是一个非常雄心勃勃的开发工具,视图提供商业级的Struts开发工具。可访问,http://www.exadel.com/products_strutsstudio.htm.
另外,M7的Nitrox也是非常优秀个开发工具。www.M7.com
商业IDE几乎全部提供Struts的开发工具和环境,包括:IBM的WebSphere Application Developer Studio, WebSphere Site Developer Studio, Oracle 的JDeveloper , Borland JBuilder, BEA Weblogic Workshop。其中, oracle 和 Bean本身对Struts作了一些扩展和定制化。可以访问个公司的网站获得详细信息。