﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-WEB2.0开发-随笔分类-Struts</title><link>http://www.blogjava.net/yaominxi/category/11338.html</link><description>心态决定行为，行为决定习惯，习惯决定命运  </description><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 13:57:46 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 13:57:46 GMT</pubDate><ttl>60</ttl><item><title>Struts深度体验之概述</title><link>http://www.blogjava.net/yaominxi/archive/2006/05/20/47173.html</link><dc:creator>ymx</dc:creator><author>ymx</author><pubDate>Sat, 20 May 2006 06:49:00 GMT</pubDate><guid>http://www.blogjava.net/yaominxi/archive/2006/05/20/47173.html</guid><wfw:comment>http://www.blogjava.net/yaominxi/comments/47173.html</wfw:comment><comments>http://www.blogjava.net/yaominxi/archive/2006/05/20/47173.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yaominxi/comments/commentRss/47173.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yaominxi/services/trackbacks/47173.html</trackback:ping><description><![CDATA[
		<a class="bluekey" href="http://www.yesky.com/key/395/395.html" target="_blank">Struts</a>是基于Model 2实现的技术框架，Model 2是经典的MVC（Model，<a class="bluekey" href="http://www.yesky.com/key/1638/206638.html" target="_blank">View</a>，Control）模型的Web应用变体，这个改变主要由于HTTP协议的无状态性引起的。Model 2的目的和MVC一样，也是利用控制器来分离模型和视图，达到不同层间松散耦合的效果，提高系统灵活性、复用性和可维护性。在多数情况下，你可以将Model 2与MVC等同起来。<br /><br />　　图 1表示一个基于Java技术典型的MVC网络应用，从中可以看出M<a class="bluekey" href="http://www.yesky.com/key/1744/206744.html" target="_blank">VC中</a>的各个部分对应于J2EE哪些实现技术。<br /><br /><table width="90%" align="center" border="0"><tbody><tr><td><div align="center"><img src="http://dev.yesky.com/imagelist/05/06/9n2f35z6mivd.jpg" border="0" /><br />图 1 MVC和J2EE技术</div></td></tr></tbody></table><br />　　在利用Model 2之前，我们把所有的表示逻辑和业务逻辑都集中在一起（如我们前两个专题中的<a class="bluekey" href="http://www.yesky.com/key/832/160832.html" target="_blank">login</a>.jsp），有时也称这种应用模式为Model 1，Model 1的主要缺点就是紧耦合，复用性差，维护成本高。<br /><br />　　由于Struts就是基于Model2实现的框架，所以它底层的机制也是MVC，我们通过图 2描述Struts的具体实现：<br /><br /><table width="90%" align="center" border="0"><tbody><tr><td><div align="center"><img src="http://dev.yesky.com/imagelist/05/06/rz5ob9gcgy18.jpg" border="0" /><br />图 2 Struts MVC实现</div></td></tr></tbody></table><br />　　1．框架初始化<br /><br />　　Struts框架总控制器（ActionServlet）完成所有初始化工作。总控制器是一个<a class="bluekey" href="http://www.yesky.com/key/47/170047.html" target="_blank">Servlet</a>，它通过web.xml配置成<a class="bluekey" href="http://www.yesky.com/key/3331/188331.html" target="_blank">自动启动</a>的<a class="bluekey" href="http://www.yesky.com/key/778/778.html" target="_blank">Servlet</a>，读取配置文件（struts-config.xml）的配置信息，为不同的Struts模块初始化相应的ModuleConfig对象。配置文件中的Action映射定义都保存在ActionConfig集合中，配置文件中其他配置信息分别保存在ControlConfig集合、FormBeanConfig集合、ForwardConfig集合和MessageResourcesConfig等集合中。<br /><br />　　要特别指出的是，初始化动作在Web容器启动时自动完成，初始化完成后，它将通过URL匹配映射截获所有以.do结尾的URL请求。<br /><br />　　2．客户端发送一个HTTP请求<br /><br />　　用户通过提交表单或调用URL向Web应用程序器提交一个请求，请求的数据用HTTP协议上传给Web服务器。<br /><br />　　3．总控制器接截获这个请求并实例化Form Bean<br /><br />　　控制器接收HTTP请求，并从ActionConfig中找出对应该请求的Action子类，如果没有对应的Action，控制器直接将请求转发给JSP或者静态页面。如果有对应的Action且这个Action有一个相应的Action Form，ActionForm被实例化并用HTTP请求的数据填充其属性，然后保存在Servlet Context中（request或<a class="bluekey" href="http://www.yesky.com/key/1637/1637.html" target="_blank">session</a>中），这样它们就可以被其它Action对象或者JSP调用。<br /><br />　　此外，还可以在ActionForm填充数据后还可以调用validate()进行数据有效性自检，并且可以返回一个包含所有<a class="bluekey" href="http://www.yesky.com/key/4182/159182.html" target="_blank">错误信息</a>的ActionErrors对象，如果ActionErrors不空，总控制器直接将请求返回到入口页面。<br /><br />　　4．控制器将请求转交给具体的Action处理<br /><br />　　控制器根据配置信息将请求切换到具体的Action，这个Form Bean也一并传给这个Action的<a class="bluekey" href="http://www.yesky.com/key/2481/212481.html" target="_blank">execute</a>()方法。<br /><br />　　5．Action完成具体的业务逻辑操作<br /><br />　　Action很简单，一般只包含一个execute方法，它负责执行相应的业务逻辑，如果需要，它也可能进行相应的数据检查。执行完成之后，返回一个ActionForward对象，控制器通过该ActionForward对象来进行转发工作。<br /><br />　　6．Action返回目标响应对象给总控制器<br /><br />　　Action根据业务处理的不同结果返回一个目标响应对象给总控制器，这个目标响应对象对应一个具体的JSP页面或另外一个Action。<br />　 <br />　　7．总控制器将HTTP请求转换到目标响应对象中。<br /><br />　　总控制器根据业务功能Action返回的目标响应对象，将HTTP请求转换到这个目标响应对象中，一般情况下，它是一个具体的JSP页面。<br /><br />　　8．目标响应对象将结果展现给用户<br />　 <br />　　目标响应对象（JSP）将结果页面展现给用户。<br /><br />　　客户端发送一个HTTP请求，通过Struts框架最后获得一个HTTP响应，这一过程非常重要，它是理解Struts框架的重点。图 2描述了Struts框架的结构，而图 3通过一个活动图更具体描述接受请求直至返回响应的整个过程：<br /><br /><table width="90%" align="center" border="0"><tbody><tr><td><div align="center"><img src="http://dev.yesky.com/imagelist/05/06/u9a67hlx63bg.gif" border="0" /><br />图 3 Struts接受并返回响应的中间过程<br /><strong>Struts1.1新增功能<br /><br /></strong>　　1、多模块的支持<br /><br />　　我们知道，在Struts 1.0中，只能在web.xml中为ActionServlet指定一个Struts配置文件(struts-config.xml)，这对一个只需一两个人开发的小系统当然没有任何问题，但如果一个多人开发的大中型应用程序，问题就产生了。因为许多开发人员可能同时都需要修改Struts配置文件，这样肯定会造成一定程度的资源争夺，可能会出现彼此覆盖的情况，这样势必会影响开发效率并引起开发人员的抱怨。<br /><br />　　在Struts 1.1中，为了解决这个并行开发的问题，提出了两种解决方案：<br /><br />　　·多个配置文件<br /><br />　　支持多个配置文件，是指你能够为ActionServlet同时指定多个xml配置文件，文件之间以逗号分隔，请看下面web.xml中关于多个struts配置文件的声明示例：<br /><br />　　 代码清单 1 多个struts配置文件<br /><br /><table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#dadacf" border="1"><tbody><tr><td>1. ＜servlet＞<br />2. ＜servlet-name＞action＜/servlet-name＞<br />3. ＜servlet-class＞org.apache.struts.action.ActionServlet＜/servlet-class＞<br />4. ＜init-param＞<br />5. ＜param-name＞config＜/param-name＞<br />6. ＜param-value＞<br />7. <b>/WEB-INF/struts-config.xml, /WEB-INF/book-struts-config.xml</b><br />8. ＜/param-value＞<br />9. ＜/init-param＞ <br />10. ＜load-on-startup＞1＜/load-on-startup＞<br />11. ＜/servlet＞</td></tr></tbody></table><br />　　通过这种方法，你可以为每一个模块定义一个配置文件，由于项目一般按模块划分工作，这样就大大地减小了冲突的概率。<br /><br />　　·独立的模块<br /><br />　　但是，多个配置文件存在一个潜在的问题：不同的配置文件之间会产生冲突，因为在ActionServlet初始化的时候多个配置文件还是要合并到一起。比如，在struts-config.xml中配置了一个名为errorDbAccess的＜exception＞，而在book-struts-config.xml中也配置了一个同样的＜exception＞，这样就产生冲突了。<br /><br />　　为了彻底解决这种冲突，Struts 1.1中引进了模块（Module）的概念。一个模块就是一个独立的子系统，对应一个独立的配置文件，ActionServlet将不同模块的配置文件保存在各自独立的ModuleConfig对象中的。<br /><br />　　下面是两个独立模块的配置方式：<br /><br />　　代码清单 2 多模块配置方式<br /><br /><table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#dadacf" border="1"><tbody><tr><td>1. …<br />2. ＜init-param＞<br />3. ＜param-name＞config＜/param-name＞<br />4. ＜param-value＞/WEB-INF/struts-config.xml＜/param-value＞<br />5. ＜/init-param＞<br />6. ＜init-param＞<br />7. ＜param-name＞config/book＜/param-name＞ <br />8. ＜param-value＞/WEB-INF/book-struts-config.xml＜/param-value＞<br />9. ＜/init-param＞<br />10. …</td></tr></tbody></table><br />　　通过这种方式，我们配置了两个模块，一个模块名为config，而另一个名为config/book。 <br /><br />　　·动态ActionForm支持<br /><br />　　ActionForm表示HTTP页面表单的数据，可以将其看成视图页面数据的服务器映射，它负责保存视图中的数据供控制器或者其他视图使用。此外，它还负责数据有效性的验证，所以Struts 1.1文档把它比作HTTP和Action之间的防火墙，这足以体现ActionForm在视图和控制器之间的过滤器作用。 <br /><br />　　由于ActionForm对应于HTTP页面表单，所以随着页面的增多，你的ActionForm将会急聚增加。动态ActionForm（DynaActionForm）即为减少ActionForm的数目被设计出来，利用它你不必创建一个个具体的ActionForm类，只需要在配置文件中配置出所需的虚拟ActionForm，而由Struts框架通过配置文件动态创建这个ActionForm。例如，代码清单 3通过指定＜form-bean＞的type为"org.apache.struts.action.DynaActionForm"来创建一个动态的ActionForm--loginForm。<br /><br />　　代码清单 3 配置一个动态ActionForm<br /><br /><table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#dadacf" border="1"><tbody><tr><td>1. ＜form-beans＞<br />2. ＜form-bean name="bookForm" type="<b>org.apache.struts.action.DynaActionForm</b>"＞ <br />3. ＜form-property name="bookId" type="java.lang.String"/＞<br />4. ＜form-property name="isbn" type="java.lang.String"/＞ <br />5. ＜form-property name="bookName" type="java.lang.String"/＞<br />6. ＜form-property name="author" type="java.lang.String"/＞<br />7. ＜/form-bean＞ <br />8. ＜/form-beans＞</td></tr></tbody></table><br />　　DynaActionForm将属性保存在一个Map对象中，同时提供相应的get(name)和set(name,value)方法，其中参数name是要访问的属性名，而value是一个Object。例如要访问DynaActionForm中bookName的值，可以采用String bookName = (String)get("bookName")方法，由于bookName存储在Map中，所以要进行强制转换。<br /><br />　　由于DynaActionForm通过配置文件产生，并没有一个实体对象类，如果要对动态ActionForm对象进行校验需要使用DynaValidatorForm，它是DynaActionForm的子类，它能够提供动态ActionForm和动态表单输入验证的功能。检验规则在validation.xml配置文件中定义，而这些规则的所对应的实现函数在validator-rules.xml文件中定义。<br /><br />　　·通过配置方式实现异常处理<br /><br />　　Struts1.1允许以配置方式进行异常处理，配置方式可以避免在Action中通过硬编码来处理异常，从而提高应用程序异常处理的灵活性和可维护性。一般情况下，一个异常处理对象可以通过以下步骤实现：<br /><br />　　1．实现org.apache.struts.action.ExceptionHandler的子类，覆盖execute()方法，在该方法中处理异常并且返回一个ActionForward对象。<br /><br />　　2．在配置文件中配置异常处理对象，你可以配置一个全局的处理类或者单独为每个Action配置处理类。<br /><br />　　代码清单 4定义了一个全局的处理类TestExceptionHandler，它被用来处理所有的异常。<br /><br />　　代码清单 4 一个全局宣告式异常处理的配置<br /><br /><table bordercolor="#ffcc66" width="90%" align="center" bgcolor="#dadacf" border="1"><tbody><tr><td>1. …<br />2. ＜global-exceptions＞ <br />3. ＜exception <br />4. handler="com.superAbc.TestExceptionHandler" <br />5. key="error.message" <br />6. path="/fail.jsp" <br />7. scope="request" <br />8. type="java.lang.Exception"/＞<br />9. ＜/global-exceptions＞<br />10. …</td></tr></tbody></table><br />　　type属性定义了匹配的异常，path定义了异常发生后转发的地址，而handler指定在转发前对异常的特殊处理，如果没有提供handler，默认的处理类org.apache.struts.action.ExceptionHandler。<br /></div></td></tr></tbody></table><img src ="http://www.blogjava.net/yaominxi/aggbug/47173.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yaominxi/" target="_blank">ymx</a> 2006-05-20 14:49 <a href="http://www.blogjava.net/yaominxi/archive/2006/05/20/47173.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何使用 Easy Struts 插件</title><link>http://www.blogjava.net/yaominxi/archive/2006/05/20/47171.html</link><dc:creator>ymx</dc:creator><author>ymx</author><pubDate>Sat, 20 May 2006 06:45:00 GMT</pubDate><guid>http://www.blogjava.net/yaominxi/archive/2006/05/20/47171.html</guid><wfw:comment>http://www.blogjava.net/yaominxi/comments/47171.html</wfw:comment><comments>http://www.blogjava.net/yaominxi/archive/2006/05/20/47171.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yaominxi/comments/commentRss/47171.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yaominxi/services/trackbacks/47171.html</trackback:ping><description><![CDATA[
		<p>
				<span class="atitle2">如何使用 Easy Struts 插件</span>
				<br />
		</p>
		<table cellspacing="0" cellpadding="0" border="0">
				<tbody>
						<tr valign="top" align="left">
								<td>
										<p>等级：中级</p>
								</td>
						</tr>
				</tbody>
		</table>
		<p>
				<a href="http://www-900.ibm.com/developerworks/cn/linux/opensource/os-ecstruts/#author1">
						<name />
						<font color="#002c99">Nancy Chen Junhua/FONT&gt;</font>
				</a> (<a href="mailto:nancy_chenjunhua@yahoo.com?cc=&amp;subject=Developing Struts with Easy Struts for Eclipse"><font color="#002c99">nancy_chenjunhua@yahoo.com</font></a>)<br />软件顾问和开发者<br />2004 年 5 月</p>
		<blockquote>本文向您介绍了如何在 Eclipse IDE 中使用 Easy Struts 插件开发 Struts 应用程序。本文首先对 Easy Struts 及其安装配置步骤进行了简介，并通过一个循序渐进的例子介绍了如何构建一个基本的 Struts 应用程序。本文还介绍了增强 Struts 应用程序的各种方法，例如连接数据库，对应用程序进行模块化，内容的国际化和本地化，异常处理和创建自定义插件等等。最后，您将学习如何将自己的 Struts 应用程序部署到 Tomcat Web 服务器上。</blockquote>
		<p>由于 Easy Struts 插件可以管理所有的复杂配置文件，因此您可以将精力集中在程序逻辑的开发上。现在让我们先来看一下 Easy Struts 中可以帮助您构建一个完整的应用程序的 10 个功能：</p>
		<ol xmlns:dw="http://www.ibm.com/developerWorks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
				<li>
						<b>Add Easy Struts support</b>。向项目的 classpath 中添加所有必需的 Struts 库，并创建配置文件和默认的资源属性文件。 
</li>
				<li>
						<b>Easy Form</b>。创建一个具有表单属性的 JSP 文件，以及一个具有表单属性的 getter 方法和 setter 方法的 Form bean，并向配置文件中添加一个 Form bean 的定义。 
</li>
				<li>
						<b>Easy Action</b>。创建一个 Action 类，并向配置文件中添加一个操作映射的定义。 
</li>
				<li>
						<b>Easy Action associated with a form</b>。创建一个具有表单属性的 JSP 文件，一个具有 getter 方法和 setter 方法的 Form bean 类，以及一个 Action 类；并向配置文件中添加一个 Form bean 的定义和一个操作映射的定义。 
</li>
				<li>
						<b>Easy Forward</b>。创建局部转发和全局转发，它们定义了控制应该转向何处。 
</li>
				<li>
						<b>Easy Exception</b>。处理异常。 
</li>
				<li>
						<b>Easy Message resources</b>。创建资源属性文件，这对于内容的国际化和本地化特别重要。 
</li>
				<li>
						<b>Easy Plug-in</b>。创建插件。 
</li>
				<li>
						<b>Easy Datasource</b>。将应用程序连接到一个数据源上。 
</li>
				<li>
						<b>Easy Module</b>。模块化应用程序。 </li>
		</ol>
		<p>在本文中，我们将介绍这 10 个功能中的 8 个（我们将不会介绍功能 2 和 3）。在开始开发 Struts 应用程序之前，您应该首先安装好所有必需的程序和插件，并要了解有关 Java 编程、HTML、JSP 脚本以及 XML 和 XSLT 的基本知识。</p>
		<p>
				<a name="IDAANJIB">
						<span class="atitle2">安装和配置准备</span>
				</a>
				<br />您需要安装 Eclipse 2.1、Struts 1.1、Tomcat Web 服务器和 Easy Struts，同时还要安装 Sysdeo Tomcat plug-ins for Eclipse、MySQL 数据库服务器以及 JDBC driver for MySQL。Eclipse 是一个 IDE 开发环境。Struts 1.1 提供了运行 Struts 应用程序所需要的库。Tomcat 是宿主应用程序的 Web 容器。Sysdeo Tomcat 插件可以让开发人员在 Eclipse 环境中启动或停止 Tomcat Web 服务器。JDBC driver for MySQL 可以将 JDBC 调用转换成 MySQL 所使用的网络协议。安装好这些软件之后，还需要为 Eclipse 配置两个插件。</p>
		<p>
				<a name="IDAINJIB">
						<span class="atitle3">安装</span>
				</a>
				<br />关于在哪里下载以下软件的链接，请参阅 <a href="http://www-900.ibm.com/developerworks/cn/linux/opensource/os-ecstruts/#Resources" xmlns:dw="http://www.ibm.com/developerWorks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no"><font color="#002c99">参考资料</font></a> 部分：</p>
		<ol xmlns:dw="http://www.ibm.com/developerWorks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
				<li>从 Eclipse 的 Web 站点上下载 Eclipse v2.1。您可以通过将其解压到任何一个选定的目录（这个目录在本文中称为<b><i> eclipse_home</i></b>）中来安装它。 
</li>
				<li>从 Apache 的 Web 站点上下载 Struts 1.1。您可以通过将其解压到任何一个选定的目录（这个目录在本文中称为 <b><i>struts_home</i></b>）来安装它。 
</li>
				<li>从 Apache 的 Web 站点上下载 Tomcat Web 服务器。您可以通过将其解压到任何一个选定的目录（这个目录在本文中称为 <b><i>tomcat_home</i></b>）中来安装它。本文假设 Tomcat 的版本是 v4.1.18。 
</li>
				<li>从 Sysdeo 的 Web 站点上下载最新的 Tomcat for Eclipse 插件。您可以通过将其解压到 eclipse_home/eclipse/plugins 目录中来安装它。本文假设 Tomcat for Eclipse 插件的版本是 v2.2。 
</li>
				<li>从 SourceForge 上下载 Easy Struts for Eclipse 插件 v0.。您可以通过将其解压到 eclipse_home/eclipse/plugins 目录中来安装它。 
</li>
				<li>从 Sun 的 Web 站点上下载 J2SE SDK。您可以将其安装到任何一个选定的目录（这个目录在本文中称为 <b><i>java_home</i></b>）中。本文假设 J2SE SDK 的版本是 v1.4.2。 
</li>
				<li>从 MySQL 的 Web 站点上下载 MySQL 数据库。您可以将其安装到任何一个选定的目录中。 
</li>
				<li>从 MySQL 的 Web 站点上下载 JDBC driver for MySQL。您应该先解压下载的文件包，并将 mysql-connector-java-x.x.xx-stable/mysql-connector-java-x.x.xx-stable-bin.jar 拷贝到您的项目工作空间中。后面还需要回到这个步骤。本文假设 JDBC driver for MySQL 的版本是 v3.0。 </li>
		</ol>
		<p>
				<a name="IDAXIJIB">
						<span class="atitle3">配置</span>
				</a>
				<br />
				<b xmlns:dw="http://www.ibm.com/developerWorks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">配置 Sysdeo Tomcat 插件</b>
		</p>
		<p>要配置 Sysdeo Tomcat 插件，执行以下步骤：</p>
		<ol xmlns:dw="http://www.ibm.com/developerWorks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
				<li>启动 Eclipse。 
</li>
				<li>配置 Tomcat 插件。要实现这个功能，请单击“Window”菜单，然后选择“Preferences”菜单项，然后在弹出的菜单中选择“Tomcat”。然后执行以下步骤： 
<ul><li>将“Tomcat version”设置成 Tomcat 的版本号。 
</li><li>将“Tomcat home”设置成 tomcat_home/jakarta-tomcat-4.1.18。 
</li><li>将“Perspective to switch when Tomcat is started”设置成 Java。 
</li><li>在“Tomcat”选项的子选项“JVM Settings” -&gt; “Classpath”中，添加 Jar/Zip for tools.jar，该值应该是 java_home/lib/。这用于编译 JSP 文件。 </li></ul></li>
				<li>为项目的 classpath 引用设置 classpath 变量 TOMCAT_HOME。要完成这一任务，请在与步骤 2 相同的弹出菜单中选择“Java”选项，然后选择“Classpath Variables”子选项，并添加一个新的变量“TOMCAT_HOME”，其路径是 tomcat_home/jakarta-tomcat-4.1.18。 
</li>
				<li>确保“Tomcat”菜单和 3 个工具栏按钮可用。到现在为止，我们应该在 Java 视图中可以看到一个“Tomcat”菜单和 3 个 Tomcat 工具栏按钮（如<a href="http://www-900.ibm.com/developerworks/cn/linux/opensource/os-ecstruts/#figure1" trackclick="no"><font color="#002c99">图 1</font></a> 所示）。如果您没有看到这些内容，回到“Window”菜单中，选择“Customize Perspective...”项，打开选项树，选中“Other”项并选中“Tomcat”子选项。 
</li>
				<li>确保 Sysdeo Tomcat 插件可以正常工作。要验证这一点，请使用菜单或工具条来启动/停止 Tomcat。 </li>
		</ol>
		<p>
				<a name="figure1">
						<b>图 1. Tomcat 工具栏按钮</b>
				</a>
				<br />
				<img alt="Tomcat 工具栏按钮" src="http://www-900.ibm.com/developerworks/cn/linux/opensource/os-ecstruts/tomcatButtons.gif" xmlns:dw="http://www.ibm.com/developerWorks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />
		</p>
		<p>
				<b xmlns:dw="http://www.ibm.com/developerWorks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">配置 Easy Struts 插件</b>
		</p>
		<p>要配置 Easy Struts 插件，请参考 <a href="http://www-900.ibm.com/developerworks/cn/linux/opensource/os-ecstruts/#figure2" xmlns:dw="http://www.ibm.com/developerWorks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no"><font color="#002c99">图 2</font></a> 的内容，并执行以下步骤：</p>
		<ol xmlns:dw="http://www.ibm.com/developerWorks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
				<li>选择一个 Struts 版本。要完成这步操作，请单击“Window”菜单，选择“Preference”项，选择“Easy Struts”选项，并选择“Struts 1.1”选项卡。 
</li>
				<li>添加 JARs。应该为 struts_home\jakarta-struts-1.1\lib 目录中的所有的 .jar 文件都添加“Add JARs”。 
</li>
				<li>添加 TLDs。接下来，为 struts_home\ jakarta-struts-1.1\lib 目录中的所有 .tld 文件添加“Add TLDs”。 </li>
		</ol>
		<p>
				<a name="figure2">
						<b>图 2. 配置 Easy Struts 插件</b>
				</a>
				<br />
				<img alt="配置 Easy Struts 插件" src="http://www-900.ibm.com/developerworks/cn/linux/opensource/os-ecstruts/strutsConfig.gif" xmlns:dw="http://www.ibm.com/developerWorks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />
		</p>
		<p>
				<a name="IDA2GWHB">
						<span class="atitle2">开发 Struts 应用程序</span>
				</a>
				<br />在本节中，我们将介绍使用 Easy Struts 插件构建 Struts 应用程序的基本步骤。首先，您将创建一个 Tomcat 项目。然后，您将添加 Easy Struts 对 Tomcat 项目的支持。接下来，您可以体验一下“Easy Action associated with a form”的功能。之后，您将对前一个步骤中自动生成的源代码进行必要的修改。再之后，您可以测试一下应用程序在 Tomcat Web 服务器上的运行情况。最后，您可以体验一下“Easy Forward”功能。</p>
		<p>
				<a name="IDA3GWHB">
						<span class="atitle3">创建 Tomcat 项目</span>
				</a>
				<br />要创建一个 Tomcat 项目，回到“File”菜单，选择“New”项，并在子菜单中选择“Project”。然后执行以下步骤：</p>
		<ol xmlns:dw="http://www.ibm.com/developerWorks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
				<li>进入“Java”选项，选择“Tomcat Project”并单击“Next”（参见<a href="http://www-900.ibm.com/developerworks/cn/linux/opensource/os-ecstruts/#figure3" trackclick="no"><font color="#002c99">图 3</font></a>）。 
</li>
				<li>填上项目名，并单击“Next”（参见<a href="http://www-900.ibm.com/developerworks/cn/linux/opensource/os-ecstruts/#figure4" trackclick="no"><font color="#002c99">图 4</font></a>）。 
</li>
				<li>选中“Can update server.xml file”。系统会自动更新 Tomcat Web 服务器的 server.xml 文件。现在单击“Finish”就可以完成任务了（参见<a href="http://www-900.ibm.com/developerworks/cn/linux/opensource/os-ecstruts/#figure5" trackclick="no"><font color="#002c99">图 5</font></a>）。 </li>
		</ol>
		<p>创建 Tomcat 项目的结果如 <a href="http://www-900.ibm.com/developerworks/cn/linux/opensource/os-ecstruts/#figure6" xmlns:dw="http://www.ibm.com/developerWorks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no"><font color="#002c99">图 6</font></a> 所示。</p>
		<p>
				<a name="figure3">
						<b>图 3. 创建 Tomcat 项目 - 步骤 1</b>
				</a>
				<br />
				<img alt="创建 Tomcat 项目 - 步骤 1" src="http://www-900.ibm.com/developerworks/cn/linux/opensource/os-ecstruts/tomcatProject1.gif" xmlns:dw="http://www.ibm.com/developerWorks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />
		</p>
		<p>
				<a name="figure4">
						<b>图 4. 创建 Tomcat 项目 - 步骤 2</b>
				</a>
				<br />
				<img alt="创建 Tomcat 项目 - 步骤 2" src="http://www-900.ibm.com/developerworks/cn/linux/opensource/os-ecstruts/tomcatProject2.gif" xmlns:dw="http://www.ibm.com/developerWorks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />
		</p>
		<p>
				<a name="figure5">
						<b>图 5. 创建 Tomcat 项目 - 步骤 3</b>
				</a>
				<br />
				<img alt="创建 Tomcat 项目 - 步骤 3" src="http://www-900.ibm.com/developerworks/cn/linux/opensource/os-ecstruts/tomcatProject3.gif" xmlns:dw="http://www.ibm.com/developerWorks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />
		</p>
		<p>
				<a name="figure6">
						<b>图 6. 创建 Tomcat 项目 - 最终结果</b>
				</a>
				<br />
				<img alt="创建 Tomcat 项目  - 最终结果" src="http://www-900.ibm.com/developerworks/cn/linux/opensource/os-ecstruts/afterTomcat.gif" xmlns:dw="http://www.ibm.com/developerWorks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />
		</p>
		<p>
				<a name="IDA3CWHB">
						<span class="atitle3">添加 Easy Struts 支持</span>
				</a>
				<br />要添加 Easy Struts 对 Tomcat 项目的支持，执行以下两个步骤：</p>
		<ol xmlns:dw="http://www.ibm.com/developerWorks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
				<li>单击“New”工具栏按钮，在“Java”选项下面选择“Easy Struts”自选项，选择“Add Easy Struts support”并单击“Next”，转入下一个步骤（请参看 <a href="http://www-900.ibm.com/developerworks/cn/linux/opensource/os-ecstruts/#figure7" trackclick="no"><font color="#002c99">图 7</font></a> -- 在本文的后文中我们将这个视图称为 <b><i>Easy Struts 功能视图</i></b>）。 
</li>
				<li>设置如 <a href="http://www-900.ibm.com/developerworks/cn/linux/opensource/os-ecstruts/#figure8" trackclick="no"><font color="#002c99">图 8</font></a> 所示的配置。确保选中“Copy Struts binary”和“Copy Struts TLD”。 </li>
		</ol>
		<p>添加 Easy Struts 支持的结果如 <a href="http://www-900.ibm.com/developerworks/cn/linux/opensource/os-ecstruts/#figure9" xmlns:dw="http://www.ibm.com/developerWorks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no"><font color="#002c99">图 9</font></a> 所示。</p>
		<p>
				<a name="figure7">
						<b>图 7. Easy Struts 功能视图</b>
				</a>
				<br />
				<img alt="Easy Struts 功能视图" src="http://www-900.ibm.com/developerworks/cn/linux/opensource/os-ecstruts/addSupport1.gif" xmlns:dw="http://www.ibm.com/developerWorks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />
		</p>
		<p>
		</p>
		<table cellspacing="0" cellpadding="5" width="20%" align="right" border="1">
				<tbody>
						<tr>
								<td background="/developerworks/cn/i/bg-gold.gif">
										<p>
												<a name="IDAGEWHB">
														<b>在图 8 中：</b>
												</a>
												<br />通过请求容器转发它们到活动 servlet，URL 模式块告诉 Struts 处理所有匹配模式 *.do 的请求。 所有其他模式的请求都不是 Struts 处理的。</p>
										<p>Default 应用程序资源将在 WEB-INF/classes/base package/ 目录中创建。</p>
								</td>
						</tr>
				</tbody>
		</table>
		<p>
				<a name="figure8">
						<b>图 8. 添加 Easy Struts 支持</b>
				</a>
				<br />
				<img alt="添加 Easy Struts 支持" src="http://www-900.ibm.com/developerworks/cn/linux/opensource/os-ecstruts/addSupport2.gif" xmlns:dw="http://www.ibm.com/developerWorks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />
		</p>
		<p>
				<a name="figure9">
						<b>图 9. 添加 Easy Struts 支持 - 最终结果</b>
				</a>
				<br />
				<img alt="添加 Easy Struts 支持 - 最终结果" src="http://www-900.ibm.com/developerworks/cn/linux/opensource/os-ecstruts/afterSupport.gif" xmlns:dw="http://www.ibm.com/developerWorks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />
		</p>
		<p>
				<a href="http://www-900.ibm.com/developerworks/cn/linux/opensource/os-ecstruts/#figure7" xmlns:dw="http://www.ibm.com/developerWorks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no">
						<font color="#002c99">图 7</font>
				</a> 显示了 Easy Struts 所提供的 10 个功能。我们已经看过了“Add Easy Struts Support”的功能。在本文的其余部分中，我们将介绍一下剩下的 7 个功能（“Easy Action” 和 “Easy Form”功能不介绍)。在本节的后续部分中，我们将使用“Easy Action associated with a form”功能和“Easy Forward”功能来构建一个简单却又完整的 Struts 应用程序。下一节将介绍“Easy Message resources”、“Easy Plug In”、“Easy Datasource”、“Easy Exception”和“Easy Module”功能。</p>
		<p>
				<a name="IDANFWHB">
						<span class="atitle3">使用 Easy Action Associated with a Form 功能</span>
				</a>
				<br />回到 Easy Struts 功能视图，选择“Easy Action associated with a form”，并执行以下步骤来配置表单：</p>
		<ol xmlns:dw="http://www.ibm.com/developerWorks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
				<li>在 Use case 中输入内容；Form 名和 Form 类型都会根据系统的 Use case 自动生成。您可以手工修改 Form 名和 Form 类型（参见 <a href="http://www-900.ibm.com/developerworks/cn/linux/opensource/os-ecstruts/#figure10" trackclick="no"><font color="#002c99">图 10</font></a>）。 
</li>
				<li>在 Form 属性部分中单击“Add”；使用如<a href="http://www-900.ibm.com/developerworks/cn/linux/opensource/os-ecstruts/#figure11" trackclick="no"><font color="#002c99"> 图 11</font></a> 所示的视图添加表单属性。例如，我们按照图中所示的一样视图添加一个文本输入域：该域名为“tel”，值为“tel”，类型为 int。我们将“tel”的初值设置为 0。在设置“Type”时，我们可以直接输入，也可以使用“Browse”功能来选择。对于“JSP input type”的设置，我们也是既可以直接输入，也可以从下拉列表中选择。Struts 系统会在 Form bean 类中为每个表单属性生成一对getter 方法和setter 方法。因此，对于一个选择列表来说，您应该只创建一个 <select>即可，而不用创建所有的 <option selected="">。</option></select></li>
				<li>由于您正在开发一个 Web 应用程序，因此请选中前两个检查框。 
</li>
				<li>单击“Next”继续。 </li>
		</ol>
		<p>
				<a name="figure10">
						<b>图 10. 配置表单</b>
				</a>
				<br />
				<img alt="配置表单" src="http://www-900.ibm.com/developerworks/cn/linux/opensource/os-ecstruts/actionForm1.gif" vspace="5" xmlns:dw="http://www.ibm.com/developerWorks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />
		</p>
		<p>
		</p>
		<table cellspacing="0" cellpadding="5" width="30%" align="right" border="1">
				<tbody>
						<tr>
								<td background="/developerworks/cn/i/bg-gold.gif">
										<p>
												<a name="IDAGGWHB">
														<b>注意</b>
												</a>
												<br />
										</p>
										<ul xmlns:dw="http://www.ibm.com/developerWorks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
												<li>表单属性名不能以大写字母开头。否则，系统就会警告您在调用操作时找不到 getter 方法。 
</li>
												<li>表单属性名不能重复。如果您真想使用两个相同的属性名，可以使用空格作为前缀或后缀来解决这个问题。 </li>
										</ul>
								</td>
						</tr>
				</tbody>
		</table>
		<p>
				<a name="figure11">
						<b>图 11. 关系的图形化表示</b>
				</a>
				<br />
				<img alt="关系的图形化表示" src="http://www-900.ibm.com/developerworks/cn/linux/opensource/os-ecstruts/formProperty.gif" xmlns:dw="http://www.ibm.com/developerWorks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />
		</p>
		<p>到现在为止，您应该会看到一些非常类似于 <a href="http://www-900.ibm.com/developerworks/cn/linux/opensource/os-ecstruts/#figure12" xmlns:dw="http://www.ibm.com/developerWorks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no"><font color="#002c99">图 12</font></a> 的内容。默认情况下，输入的值是“/form/owner.jsp”，这意味着 JSP 文件被放在“easyStruts/form”文件夹中。您可以手工修改 JSP 文件的位置，或者 preference 的设置。要修改 preference 的设置，进入“Window”菜单，选择“Preferences”，单击“Easy Struts”选项，选择“Style”选项卡，并将“JSP form location”设置为空。例如，在本文中，我们倾向于将这些 JSP 文件直接保存在 easyStruts （项目名）文件夹中。因此，请将其修改为“/owner.jsp”，如 <a href="http://www-900.ibm.com/developerworks/cn/linux/opensource/os-ecstruts/#figure12" xmlns:dw="http://www.ibm.com/developerWorks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no"><font color="#002c99">图 12</font></a> 所示。</p>
		<p>
				<a href="http://www-900.ibm.com/developerworks/cn/linux/opensource/os-ecstruts/#figure12" xmlns:dw="http://www.ibm.com/developerWorks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no">
						<font color="#002c99">图 12</font>
				</a> 中所显示的操作映射的属性如下：</p>
		<ul xmlns:dw="http://www.ibm.com/developerWorks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
				<li>
						<b>Path</b>。所提交请求的相对路径。路径名必须以“/”开头而且唯一。 
</li>
				<li>
						<b>Type</b>。这个 ActionMapping 正在描述的 Action 类的名字。 
</li>
				<li>
						<b>Attribute</b>。可以访问这个 Form bean 的请求范围或会话范围的属性名，条件是名字与这个 bean 指定的名字不同。 
</li>
				<li>
						<b>Scope</b>。规定与这个映射相关的 Form bean 的值应该可以保存多少位。 
</li>
				<li>
						<b>input</b>。规定如果碰到验证错误时控制流程应该返回到输入表单的相对路径。 
</li>
				<li>
						<b>Validate</b>。如果这个属性被设置为 true，就会对与这个映射关联的表单调用 ActionForm.validate() 方法。 
</li>
				<li>
						<b>Parameter</b>。可用于向由这个映射选择的 Action 传递其他信息。 </li>
		</ul>
		<p>
				<a name="figure12">
						<b>图 12. 配置操作</b>
				</a>
				<br />
				<img alt="配置操作" src="http://www-900.ibm.com/developerworks/cn/linux/opensource/os-ecstruts/actionForm2.gif" xmlns:dw="http://www.ibm.com/developerWorks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />
		</p>
		<p>单击“Next”，您应该可以看到类似于如 <a href="http://www-900.ibm.com/developerworks/cn/linux/opensource/os-ecstruts/#figure13" xmlns:dw="http://www.ibm.com/developerWorks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no"><font color="#002c99">图 13</font></a> 所示的内容。<a href="http://www-900.ibm.com/developerworks/cn/linux/opensource/os-ecstruts/#figure13" xmlns:dw="http://www.ibm.com/developerWorks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no"><font color="#002c99">图 13</font></a> 中所显示的是操作映射属性，如下：</p>
		<ul xmlns:dw="http://www.ibm.com/developerWorks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
				<li>
						<b>Forward</b>。指定要处理这个请求的 servlet 或 JSP 资源的相对路径。ActionMapping 可以使用 findForward() 将控制流程转换到这个 servlet 或 JSP 资源上。 
</li>
				<li>
						<b>Exception</b>。与这个映射相关的 ExceptionHandlers。 </li>
		</ul>
		<p>此处的转发和异常都是本地的，稍后我们会讨论全局转发和全局异常。</p>
		<p>
				<a name="figure13">
						<b>图 13. 配置转发</b>
				</a>
				<br />
				<img alt="配置转发" src="http://www-900.ibm.com/developerworks/cn/linux/opensource/os-ecstruts/actionForm3.gif" xmlns:dw="http://www.ibm.com/developerWorks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />
		</p>
		<p>
		</p>
		<table cellspacing="0" cellpadding="5" width="30%" align="right" border="1">
				<tbody>
						<tr>
								<td background="/developerworks/cn/i/bg-gold.gif">
										<p>
												<a name="IDASZWHB">
														<b>局部转发属性：</b>
												</a>
												<br />
										</p>
										<ul xmlns:dw="http://www.ibm.com/developerWorks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
												<li>name 是唯一的标识符，在操作映射的 findForward() 方法中可以用它来返回这个路径。 
</li>
												<li>contextRelative 标签告诉 Struts 以下信息： 
<ul><li>如果该值被设置为 true，那么路径就被认为是相对于整个 Web 应用的相对路径。 
</li><li>如果该值被设置为 false，那么路径就被认为是相对于一个模块化应用程序的这个模块的相对路径。 </li></ul></li>
												<li>如果 redirect 为 true，那么控制流程就会被转到一个重定向的页中，而不是一个转发的页中。这意味着创建一个新请求。 </li>
										</ul>
								</td>
						</tr>
				</tbody>
		</table>
		<p>在单击“Finish”之后（参见<a href="http://www-900.ibm.com/developerworks/cn/linux/opensource/os-ecstruts/#figure14" xmlns:dw="http://www.ibm.com/developerWorks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no"><font color="#002c99">图 14</font></a>），系统会在 easyStruts/WEB-INF/src/ 目录中生成 com.asprise.struts.form.OwnerForm.java 和 com.asprise.struts.action.OwnerAction.java。同时还会生成另外一个文件：easyStruts/owner.jsp。在接下来的几节中，您将对这三个文件进行一些修改，从而完成整个表单，添加用户输入的验证方法并处理验证错误。</p>
		<p>
				<a name="figure14">
						<b>图 14. 添加转发</b>
				</a>
				<br />
				<img alt="添加转发" src="http://www-900.ibm.com/developerworks/cn/linux/opensource/os-ecstruts/localForward.gif" xmlns:dw="http://www.ibm.com/developerWorks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />
		</p>
		<p>
				<b xmlns:dw="http://www.ibm.com/developerWorks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">修改 ActionForm 类 </b>
				<br xmlns:dw="http://www.ibm.com/developerWorks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />将 ActionForm.java 中的所有“Integer”修改为“int”，这是因为您刚才创建的表单属性“tel”的类型是 java.lang.Integer。然后编写 validate() 方法的代码，对用户输入的表单属性进行验证。validate() 方法的完整代码如 <a href="http://www-900.ibm.com/developerworks/cn/linux/opensource/os-ecstruts/#listing1" xmlns:dw="http://www.ibm.com/developerWorks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no"><font color="#002c99">清单 1</font></a> 所示。</p>
		<p>ActionError（“error.noEmail”）中的“error.noEmail”是资源属性文件中定义的一个关键字，它等价于“</p>
		<li>
				<font color="#ff0000">Enter your email</font> ”。在资源属性文件中，可以使用 代码。ActionErrors 中 add(java.lang.String property, ActionError error) 方法的参数 property 是一个表单属性名。这个 ActionError 只能与一个指定的表单属性相关。例如，如果 email 地址为空，或者只包含空格字符，那么在对表单进行验证时就会显示“Enter your email”消息。如果在 email 地址中没有“@”字符，那么就会显示“Correct your email”消息，这是在资源属性文件中使用“error.wrongEmail”关键字定义的。这两个错误都只与表单属性“email”有关（参见<a href="http://www-900.ibm.com/developerworks/cn/linux/opensource/os-ecstruts/#listing1" xmlns:dw="http://www.ibm.com/developerWorks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no"><font color="#002c99">清单 1</font></a>）。我们稍后再回来介绍。 
<p><a name="listing1"><b>清单 1. OwnerForm.java</b></a><br /></p><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1"><tbody><tr><td><pre><code>
package com.asprise.struts.form;

import javax.servlet.http.HttpServletRequest;
import org.apache.struts.action.ActionErrors;
<span class="boldcode">import org.apache.struts.action.ActionError;</span>
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;

public class OwnerForm extends ActionForm {

   private String email;
   private String greet = "Mr.";
   private String address;
   <span class="boldcode">private int tel = 0;</span>
   private String name;
<span class="boldcode">
   public ActionErrors validate(
      ActionMapping mapping,
      HttpServletRequest request) {

      ActionErrors errors = new ActionErrors();
      if (greet == null || greet.trim().equals("")) {
         errors.add("greet", new ActionError("error.greet"));
      }
      if (name == null || name.trim().equals("")) {
         errors.add("name", new ActionError("error.name"));
      }
      if (address == null || address.trim().equals("")) {
         errors.add("address", new ActionError("error.address"));
      }
      if (email == null || email.trim().equals("")) {
         errors.add("email", new ActionError("error.noEmail"));
      }
      else if (email.indexOf("@")==-1) {
         errors.add("email", new ActionError("error.wrongEmail"));
      }
      if (tel==0) {
         errors.add("tel", new ActionError("error.tel"));
      }
      return errors;
      }
      </span>...

   public String getEmail() {
      return email;
   }

   public void setEmail(String email) {
      this.email = email;
   }
   ...
}
</code></pre></td></tr></tbody></table><p>在资源属性文件中可以使用 代码。资源属性文件的内容是一些键-值对（参见<a href="http://www-900.ibm.com/developerworks/cn/linux/opensource/os-ecstruts/#listing2" xmlns:dw="http://www.ibm.com/developerWorks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no"><font color="#002c99">清单 2</font></a>）。在源代码文件中可以调用这些关键字。在每个资源属性文件中系统都需要 errors.header 和 errors.footer 这两个关键字。</p><a name="listing2"><b>清单 2. ApplicationResources.properties</b></a><br /><table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1"><tbody><tr><td><pre><code>
errors.header=<h4>Validation Error(s)</h4><ul>
errors.footer=</ul><hr />

error.greet=<li>Choose your greet
error.name=</li><li>Enter your name
error.address=</li><li>Enter your address
error.tel=</li><li>Enter your contact number
error.wrongEmail=</li><li>Correct your email
error.noEmail=</li><li>Enter your email
</li></code></pre></td></tr></tbody></table></li>
		<p>
				<b xmlns:dw="http://www.ibm.com/developerWorks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">修改 Action 类 </b>
				<br xmlns:dw="http://www.ibm.com/developerWorks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />OwnerAction 类会在局部转发路径“success”中简单地显示一条诸如“Thank you, Miss Nancy Chen”之类的消息。请修改 OwenerAction 类的 execute() 方法来实现您的逻辑，（每个 action 类都必须实现 execute() 方法）。参见<a href="http://www-900.ibm.com/developerworks/cn/linux/opensource/os-ecstruts/#listing3" xmlns:dw="http://www.ibm.com/developerWorks/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" trackclick="no"><font color="#002c99">清单 3</font></a>，它会将控制流程转向 success.jsp。</p>
		<a name="listing3">
				<b>清单 3. OwnerAction.java</b>
		</a>
		<br />
		<table cellspacing="0" cellpadding="5" width="100%" bgcolor="#cccccc" border="1">
				<tbody>
						<tr>
								<td>
										<pre>
												<code>
public class OwnerAction extends Action {

   public ActionForward execute(
      ActionMapping mapping,
      ActionForm form,
      HttpServletRequest request,
      HttpServletResponse response)
      throws Exception {

      OwnerForm ownerForm = (OwnerForm) form;
      <span class="boldcode">
      String greet = ownerForm.getGreet();
      String name = ownerForm.getName();
      request.setAttribute("name", name);
      request.setAttribute("greet", greet);

      // Forward control to the specified success target
</span></code>
										</pre>
								</td>
						</tr>
				</tbody>
		</table>
		<p>
		</p>
		<p class="diaryFoot">- 作者： <a title="desertapple" onclick="window.open('/control/postMessage.b?receiverName=desertapple&amp;receiver=9604','发送短消息','width=310,height=265')" href="javascript:void(0);">desertapple</a> 2005年04月1日, 星期五 20:08 </p>
<img src ="http://www.blogjava.net/yaominxi/aggbug/47171.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yaominxi/" target="_blank">ymx</a> 2006-05-20 14:45 <a href="http://www.blogjava.net/yaominxi/archive/2006/05/20/47171.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>我的struts开发工具、插件 </title><link>http://www.blogjava.net/yaominxi/archive/2006/04/05/39345.html</link><dc:creator>ymx</dc:creator><author>ymx</author><pubDate>Wed, 05 Apr 2006 04:33:00 GMT</pubDate><guid>http://www.blogjava.net/yaominxi/archive/2006/04/05/39345.html</guid><wfw:comment>http://www.blogjava.net/yaominxi/comments/39345.html</wfw:comment><comments>http://www.blogjava.net/yaominxi/archive/2006/04/05/39345.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yaominxi/comments/commentRss/39345.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yaominxi/services/trackbacks/39345.html</trackback:ping><description><![CDATA[
		<p>所谓工欲成其事,必先利其器。罗列一下本人在实际开发中所使用到的和struts有关的东东：<br /><strong><font color="#000080">1.IDE - Eclipse2.1.2 + 语言包</font></strong>。偶比较怀旧(也可以说是懒)，新版本一直没有去download.<br /><strong><font color="#000080">2.tomcatPlugin_v3.0</font></strong>(2003.7.27) 在tomcat下Jsp或Servlet的图形化调试插件。它的调试原理针对jsp文件所产 生的java文件， 不要幻想可以对jsp文件直接debug了，这样的东东我还没见过。 首选的tomcat版本是5.x,对于 4.x 得加一个补丁(jasperDebugPatch) 至 <tomcat 4.x="" home="">/common/classes，才能正常调试。 全面支持eclipse的各版本。 <a href="http://www.sysdeo.com/eclipse/tomcatPlugin.html">http://www.sysdeo.com/eclipse/tomcatPlugin.html</a><br /><strong><font color="#000080">3.easystruts 0.7</font></strong>,当然是方便struts的开发了,好象不支持eclipse3.0, <a href="http://sourceforge.net/projects/">http://sourceforge.net/projects/</a><br /><strong><font color="#000080">4.struts-console-4.7</font></strong> 又一个辅助开发 Struts 的工具，可以单独作为 Swing 运行，也可以嵌入到多个流行的 Java IDE 进行无缝集成，当然少不了eclipse了。它的功能为：可视化地编辑 JSP 标签、Struts/Validator/Tiles 配置文件，特别是 struts-config.xml 这个配置文件。<br />  <a href="http://www.jamesholmes.com/struts/console/index.html">http://www.jamesholmes.com/struts/console/index.html</a><br /><font color="#000080"><strong>5.RBManager 0.7</strong></font> 用来管理 Struts 中国际化资源文件的一个工具。原是 IBM 开源的，现在归到 ICU ( International Components for Unicode)了.比较大的项目，资源文件用这种工具来管理非常必要了。<br />  将那个bat文件的内容更改为：java -classpath RBManager.jar;lib\xerces.jar com.ibm.rbm.RBManager(土法)   IBM DW 中国有一篇文章谈到这个工具的使用，我就是看了这篇文章才找到这个好帮手的。<br />  <a href="http://oss.software.ibm.com/icu4j/demo_tools/RBManager.html">http://oss.software.ibm.com/icu4j/demo_tools/RBManager.html</a><br /><strong><font color="#000080">6.StrutsTestCase v2.1.2</font></strong> sf.net 的一个开源项目，Struts 测试框架，用于 Struts 程序的测试。<br />  支持 Cactus 1.6.1 、JUnit 3.8.1，别告诉我你还不知道什么是Junit哟。<br />  <a href="http://strutstestcase.sourceforge.net/">http://strutstestcase.sourceforge.net/</a><br />  <br /><strong><font color="#000080">7.几个开源例子。</font></strong>这个不是工具啦，<a href="http://struts.sourceforge.net/">http://struts.sourceforge.net/</a>  <br />  作为 sf.net 的一个开源项目，有一些 Struts 的示例(推荐Struts Spring), 以及一些扩展与补充。入门的同学可以去研究一下，一方面通过示例来学习，另一方面有些扩充可以用到实际项目中，以提高效率。 </tomcat></p>
		<p>后记：构架一个良好的Web应用，struts仅仅是一部分，它是属于表示层(The Presentation Layer) 的,在持久层(persistence Layer),可供使用的framework有 hibernate、iBatis(这个我实践过一个项目),在业务组件层(business Layer),有spring(强烈推荐)和PicoContainer可以用来以Ioc的方式组织bean，减少依赖关系。<br />      设计良好的分层更有利于维护和单元测试(大牛们大都这么说滴)。<br /></p>
<img src ="http://www.blogjava.net/yaominxi/aggbug/39345.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yaominxi/" target="_blank">ymx</a> 2006-04-05 12:33 <a href="http://www.blogjava.net/yaominxi/archive/2006/04/05/39345.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>