﻿<?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-SeanChang's Blog</title><link>http://www.blogjava.net/Bug/</link><description>记录...</description><language>zh-cn</language><lastBuildDate>Sun, 26 Apr 2026 14:04:42 GMT</lastBuildDate><pubDate>Sun, 26 Apr 2026 14:04:42 GMT</pubDate><ttl>60</ttl><item><title>DDL,DML,DCL,TCL</title><link>http://www.blogjava.net/Bug/archive/2009/11/23/303356.html</link><dc:creator>seanchang</dc:creator><author>seanchang</author><pubDate>Mon, 23 Nov 2009 08:35:00 GMT</pubDate><guid>http://www.blogjava.net/Bug/archive/2009/11/23/303356.html</guid><wfw:comment>http://www.blogjava.net/Bug/comments/303356.html</wfw:comment><comments>http://www.blogjava.net/Bug/archive/2009/11/23/303356.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Bug/comments/commentRss/303356.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Bug/services/trackbacks/303356.html</trackback:ping><description><![CDATA[特此一记，省得忘。 <br />
<br />
1.DDL （Data Definition Language ）数据库定义语言 statements are used to define the database structure or schema. <br />
DDL不需要commit. <br />
CREATE <br />
ALTER <br />
DROP <br />
TRUNCATE <br />
COMMENT <br />
RENAME <br />
<br />
2.DML （Data Manipulation Language）数据操纵语言 statements are used for managing data within schema objects. <br />
需要commit. <br />
SELECT <br />
INSERT <br />
UPDATE <br />
DELETE <br />
MERGE <br />
CALL <br />
EXPLAIN PLAN <br />
LOCK TABLE <br />
<br />
3.DCL（Data Control Language）数据库控制语言&nbsp; 授权，角色控制等 <br />
GRANT 授权 <br />
REVOKE 取消授权 <br />
<br />
4.TCL（Transaction Control Language）事务控制语言 <br />
SAVEPOINT 设置保存点 <br />
ROLLBACK&nbsp; 回滚 <br />
SET TRANSACTION 
<img src ="http://www.blogjava.net/Bug/aggbug/303356.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Bug/" target="_blank">seanchang</a> 2009-11-23 16:35 <a href="http://www.blogjava.net/Bug/archive/2009/11/23/303356.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring原理</title><link>http://www.blogjava.net/Bug/archive/2009/11/20/303068.html</link><dc:creator>seanchang</dc:creator><author>seanchang</author><pubDate>Fri, 20 Nov 2009 08:24:00 GMT</pubDate><guid>http://www.blogjava.net/Bug/archive/2009/11/20/303068.html</guid><wfw:comment>http://www.blogjava.net/Bug/comments/303068.html</wfw:comment><comments>http://www.blogjava.net/Bug/archive/2009/11/20/303068.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Bug/comments/commentRss/303068.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Bug/services/trackbacks/303068.html</trackback:ping><description><![CDATA[<p>spring的最大作用ioc/di,将类与类的依赖关系写在配置文件中，<br />
程序在运行时根据配置文件动态加载依赖的类，<br />
降低的类与类之间的藕合度。<br />
它的原理是在applicationContext.xml加入bean标签，<br />
在bean标签中通过class属性说明具体类名，<br />
通过property标签说明该类的属性名，<br />
通过constructor-args说明构造子的参数。<br />
其一切都是返射，当通过applicationContext.getBean("id名称")得到一个类实例时，<br />
就是以bean标签的类名、属性名、构造子的参数为准，<br />
通过反射实例对象，唤起对象的set方法设置属性值，<br />
通过构造子的newInstance实例化得到对象。<br />
正因为spring一切都是反射，反射比直接调用的处理速度慢，<br />
所以这也是spring的一个问题。</p>
<p>spring第二大作用就是aop，其机理来自于代理模式，<br />
代理模式有三个角色分别是通用接口、代理、真实对象代理、<br />
真实对象实现的是同一接口，将真实对象作为代理的一个属性，<br />
向客户端公开的是代理，当客户端调用代理的方法时，<br />
代理找到真实对象，调用真实对象方法，<br />
在调用之前之后提供相关的服务，如事务、安全、日志。<br />
其名称分别是代理、真实对象、装备、关切点、连接点。 </p>
<br />
主要是可扩展性。如果现在你的客户觉得访问效率太低，程序不用hibernate了， <br />
要使用jdbc，比如:UserDaoHibernateImpl(原来),现在修改为UserDaoJdbcImpl. <br />
这个时候你要怎么办？直接去修改源代码？你原来不用接口进行引用，肯定是new 了一个 <br />
UserDaoHibernateImpl出来，如果多个地方都用到，你不但要去修改源代码，还要修改很多地方， <br />
而是用spring的依赖注入呢，你只需要修改下配置，把bean的class属性给修改下，换下配置什么的 <br />
就可以了，降低后期维护成本<br />
<br />
因为web应用大了，servletClass多了，所以用到struts来减轻我们的负担，使得模块更清晰，和更利于复用和管理。 <br />
因为web应用大了，表、字段多了，写sql语句会写死人，且比较容易出错，所以用到hibernate来获得它给我们的面向对象操作数据库的服务，省去了写n多sql的烦心事，且使我们的程序更加面向对象 <br />
因为逻辑和组件模块多了，因为层多了，于是我们考虑整一个spring，一来包装hibernate，提供更简便的服务接口及更易于管理的事务服务，二来代理了我们的服务层和dao层，使得这两层与实际的控制单元的关系变成ioc框架来管理，任何一方的修改都不会牵扯到双方都要修改的问题。总之spring就是把杂乱的dao、service、action给串了起来，变成了一个个可在程序外控制的模块，使其可以自由的组合在一起，即可获得想要的服务也不用烦他们之间的关系。<br />
<br />
<font size="3"><a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#67;&#111;&#112;&#121;&#82;&#105;&#103;&#104;&#116;&#64;&#66;&#85;&#71;">CopyRight@</font>BUG</a> 
<img src ="http://www.blogjava.net/Bug/aggbug/303068.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Bug/" target="_blank">seanchang</a> 2009-11-20 16:24 <a href="http://www.blogjava.net/Bug/archive/2009/11/20/303068.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts framework的工作原理和组件</title><link>http://www.blogjava.net/Bug/archive/2009/11/19/302992.html</link><dc:creator>seanchang</dc:creator><author>seanchang</author><pubDate>Thu, 19 Nov 2009 14:59:00 GMT</pubDate><guid>http://www.blogjava.net/Bug/archive/2009/11/19/302992.html</guid><wfw:comment>http://www.blogjava.net/Bug/comments/302992.html</wfw:comment><comments>http://www.blogjava.net/Bug/archive/2009/11/19/302992.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Bug/comments/commentRss/302992.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Bug/services/trackbacks/302992.html</trackback:ping><description><![CDATA[<p>Struts framework的工作原理和组件</p>
<p>&nbsp;</p>
<p>对于Struts 如何控制、处理客户请求，让我们通过对struts的四个核心组件介绍来具体说明。这几个组件就是：ActionServlet。Action Classes，Action Mapping（此处包括ActionForward），ActionFrom Bean。</p>
<p>&nbsp;</p>
<p>Struts ActionServlet控制器对象</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ActionServlet继承自javax.servlet.http.HttpServlet类，其在Struts framework中扮演的角色是中心控制器。它提供一个中心位置来处理全部的终端请求。控制器ActionServlet主要负责将HTTP的客户请求信息组装后，根据配置文件的指定描述，转发到适当的处理器。</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 按照Servelt的标准，所有得Servlet必须在web配置文件（web.xml）声明。同样，ActoinServlet必须在Web Application配置文件（web.xml）中描述，有关配置信息如下。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">servlet</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">servlet-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">action</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">servlet-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">servlet-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">org.apache.struts.action.ActionServlet</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">servlet-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">servlet</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><br />
<img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /></span></div>
<p>&nbsp;</p>
<p>全部的请求URI以*.do的模式存在并映射到这个servlet，其配置如下：</p>
<p>&nbsp;</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #008080">&nbsp;1</span><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">servlet-mapping</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><br />
</span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;<br />
</span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><br />
</span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">servlet-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">action</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">servlet-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><br />
</span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;<br />
</span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><br />
</span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">url-pattern</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">*.do</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">url-pattern</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">10</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><br />
</span><span style="color: #008080">11</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;<br />
</span><span style="color: #008080">12</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><br />
</span><span style="color: #008080">13</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">servlet-mapping</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">14</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><br />
</span><span style="color: #008080">15</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /></span></div>
<p>&nbsp;</p>
<p>一个该模式的请求URI符合如下格式： </p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; http://www.my_site_name.com/mycontext/actionName.do</p>
<p>&nbsp;<br />
中心控制器为所有的表示层请求提供了一个集中的访问点。这个控制器提供的抽象概念减轻了开发者建立公共应用系统服务的困难，如管理视图、会话及表单数据。它也提供一个通用机制如错误及异常处理，导航，国际化，数据验证，数据转换等。</p>
<p><br />
当用户向服务器端提交请求的时候，实际上信息是首先发送到控制器ActionServlet，一旦控制器获得了请求，其就会将请求信息传交给一些辅助类（help classes）处理。这些辅助类知道如何去处理与请求信息所对应的业务操作。在Struts中，这个辅助类就是org.apache.struts.action.Action。通常开发者需要自己继承Aciton类，从而实现自己的Action实例。</p>
<p>&nbsp;</p>
<p>Struts Action Classes </p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ActionServlet把全部提交的请求都被控制器委托到RequestProcessor对象。RequestProcessor使用struts-config.xml文件检查请求URI找到动作Action标示符。</p>
<p>&nbsp;</p>
<p>一个Action 类的角色，就像客户请求动作和业务逻辑处理之间的一个适配器（Adaptor），其功能就是将请求与业务逻辑分开。这样的分离，使得客户请求和Action类之间可以有多个点对点的映射。而且Action类通常还提供了其它的辅助功能，比如：认证（authorization）、日志（logging）和数据验证（validation）。</p>
<p>&nbsp;</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #008080">1</span><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;ActionForward&nbsp;execute(ActionMapping&nbsp;mapping,ActionFormform,javax.servlet.ServletRequestrequest,javax.servlet.ServletResponse&nbsp;response)throwsjava.io.IOException,javax.servlet.ServletException<br />
</span><span style="color: #008080">2</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><br />
</span><span style="color: #008080">3</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /></span></div>
<p>&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Action最为常用的是execute（）方法。（注意，以前的perform方法在struts1.1中已经不再支持），还有一个execute（）方法，请参考apidoc，在此不在说明。</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当Controller收到客户的请求的时候，在将请求转移到一个Action实例时，如果这个实例不存在，控制器会首先创建，然后会调用这个Action实例的execute（）方法。Struts Framework为应用系统中的每一个Action类只创建一个实例。因为所有的用户都使用这一个实例，所以你必须确定你的Action 类运行在一个多线程的环境中。下图显示了一个execute（）方法如何被访问：</p>
<p><br />
Action实例的execute()方法</p>
<p>&nbsp;</p>
<p>注意，客户自己继承的Action子类，必须重写execute（）方法，因为Action类在默认情况下是返回null的。</p>
<p>&nbsp;</p>
<p>Struts Action Mapping</p>
<p>&nbsp;</p>
<p>上面讲到了一个客户请求是如何被控制器转发和处理的，但是，控制器如何知道什么样的信息转发到什么样的Action类呢？这就需要一些与动作和请求信息相对应的映射配置说明。在struts 中，这些配置映射信息是存储在特定的XML文件（比如struts-config.xml）。&nbsp; </p>
<p>&nbsp;</p>
<p>这些配置信息在系统启动的时候被读入内存，供struts framework在运行期间使用。在内存中，每一个&lt;action&gt;元素都与org.apache.struts.action.ActionMapping类的一个实例对应。下表就显示了一个登陆的配置映射。</p>
<p>&nbsp;</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #008080">&nbsp;1</span><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">action-mappings</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><br />
</span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;<br />
</span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><br />
</span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">action&nbsp;&nbsp;</span><span style="color: #ff0000">path</span><span style="color: #0000ff">="/logonAction"</span><span style="color: #ff0000"><br />
</span><span style="color: #008080">&nbsp;6</span><span style="color: #ff0000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><br />
</span><span style="color: #008080">&nbsp;7</span><span style="color: #ff0000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;<br />
</span><span style="color: #008080">&nbsp;8</span><span style="color: #ff0000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><br />
</span><span style="color: #008080">&nbsp;9</span><span style="color: #ff0000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type</span><span style="color: #0000ff">="com.test.LogonAction"</span><span style="color: #ff0000"><br />
</span><span style="color: #008080">10</span><span style="color: #ff0000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><br />
</span><span style="color: #008080">11</span><span style="color: #ff0000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;<br />
</span><span style="color: #008080">12</span><span style="color: #ff0000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><br />
</span><span style="color: #008080">13</span><span style="color: #ff0000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name</span><span style="color: #0000ff">="LogonForm"</span><span style="color: #ff0000"><br />
</span><span style="color: #008080">14</span><span style="color: #ff0000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><br />
</span><span style="color: #008080">15</span><span style="color: #ff0000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;<br />
</span><span style="color: #008080">16</span><span style="color: #ff0000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><br />
</span><span style="color: #008080">17</span><span style="color: #ff0000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scope</span><span style="color: #0000ff">="request"</span><span style="color: #ff0000"><br />
</span><span style="color: #008080">18</span><span style="color: #ff0000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><br />
</span><span style="color: #008080">19</span><span style="color: #ff0000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;<br />
</span><span style="color: #008080">20</span><span style="color: #ff0000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><br />
</span><span style="color: #008080">21</span><span style="color: #ff0000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;input</span><span style="color: #0000ff">="logoncheck.jsp"</span><span style="color: #ff0000"><br />
</span><span style="color: #008080">22</span><span style="color: #ff0000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><br />
</span><span style="color: #008080">23</span><span style="color: #ff0000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;<br />
</span><span style="color: #008080">24</span><span style="color: #ff0000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><br />
</span><span style="color: #008080">25</span><span style="color: #ff0000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />validate</span><span style="color: #0000ff">="false"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">26</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><br />
</span><span style="color: #008080">27</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;<br />
</span><span style="color: #008080">28</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><br />
</span><span style="color: #008080">29</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">forward&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="welcome"</span><span style="color: #ff0000">&nbsp;path</span><span style="color: #0000ff">="/welcome.jsp"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">30</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><br />
</span><span style="color: #008080">31</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;<br />
</span><span style="color: #008080">32</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><br />
</span><span style="color: #008080">33</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">forward&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="failure"</span><span style="color: #ff0000">&nbsp;path</span><span style="color: #0000ff">="/logon_failure.jsp&nbsp;"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">34</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><br />
</span><span style="color: #008080">35</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;<br />
</span><span style="color: #008080">36</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><br />
</span><span style="color: #008080">37</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">action</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">38</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><br />
</span><span style="color: #008080">39</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;<br />
</span><span style="color: #008080">40</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><br />
</span><span style="color: #008080">41</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">action-mappings</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">42</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><br />
</span><span style="color: #008080">43</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;<br />
</span><span style="color: #008080">44</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><br />
</span><span style="color: #008080">45</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><br />
</span><span style="color: #008080">46</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;<br />
</span><span style="color: #008080">47</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><br />
</span><span style="color: #008080">48</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;<br />
</span><span style="color: #008080">49</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><br />
</span><span style="color: #008080">50</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;<br />
</span><span style="color: #008080">51</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><br />
</span><span style="color: #008080">52</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><br />
</span><span style="color: #008080">53</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">form-beans</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">54</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><br />
</span><span style="color: #008080">55</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;<br />
</span><span style="color: #008080">56</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><br />
</span><span style="color: #008080">57</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">form-bean&nbsp;&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="LoginForm"</span><span style="color: #ff0000"><br />
</span><span style="color: #008080">58</span><span style="color: #ff0000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><br />
</span><span style="color: #008080">59</span><span style="color: #ff0000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;<br />
</span><span style="color: #008080">60</span><span style="color: #ff0000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><br />
</span><span style="color: #008080">61</span><span style="color: #ff0000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />type</span><span style="color: #0000ff">="com.test.LoginForm"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">62</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><br />
</span><span style="color: #008080">63</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;<br />
</span><span style="color: #008080">64</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><br />
</span><span style="color: #008080">65</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">form-beans</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">66</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><br />
</span><span style="color: #008080">67</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /></span></div>
<p>&nbsp;</p>
<p>上面的配置表示：当可以通过/logonAction.do（此处假设配置的控制器映射为*.do）提交请求信息的时候，控制器将信息委托com.test.LogonAction处理。调用LogonAction实例的execute()方法。同时将Mapping实例和所对应的LogonForm Bean信息传入。其中name=LogonForm，使用的form-bean元素所声明的ActionForm Bean。有关form-bean的申明如下显示。</p>
<p>使用ActionForward导航</p>
<p>元素&lt;forward&gt;则表示了当Action实例的execute()方法运行完毕或，控制器根据Mapping可将响应信息转到适当的地方。如上面现实，如果客户登陆成功，则调用welcome forward，将成功信息返回到/welcome.jsp页面。在你的execute()方法的结尾可以使用下面的实例代码而返回welcome forward。当然你的welcome forward必须在action元素属性中定义，正如上面所声明的那样。</p>
<p>&nbsp;</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;(mapping.findForward(</span><span style="color: #000000">"</span><span style="color: #000000">welcome</span><span style="color: #000000">"</span><span style="color: #000000">));</span></div>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ActionForward对象是配置对象。这些配置对象拥有独一无二的标识以允许它们按照有意义的名称如&#8220;success&#8221;，&#8220;failure&#8221;等来检索。ActionForward对象封装了向前进的URL路径且被请求处理器用于识别目标视图。ActionForward对象建立自&lt;forward&gt;元素位于struts-config.xml。下面是一个Struts中&lt;forward&gt;元素例子，属于&lt;action&gt;元素范围。</p>
<p>&nbsp;</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #008080">&nbsp;1</span><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">action&nbsp;</span><span style="color: #ff0000">path</span><span style="color: #0000ff">="/editCustomerProfile"</span><span style="color: #ff0000"><br />
</span><span style="color: #008080">&nbsp;2</span><span style="color: #ff0000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><br />
</span><span style="color: #008080">&nbsp;3</span><span style="color: #ff0000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />type</span><span style="color: #0000ff">="packageName.EditCustomerProfileAction"</span><span style="color: #ff0000"><br />
</span><span style="color: #008080">&nbsp;4</span><span style="color: #ff0000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><br />
</span><span style="color: #008080">&nbsp;5</span><span style="color: #ff0000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />name</span><span style="color: #0000ff">="customerProfileForm"</span><span style="color: #ff0000">&nbsp;scope</span><span style="color: #0000ff">="request"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><br />
</span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">forward&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="success"</span><span style="color: #ff0000">&nbsp;path</span><span style="color: #0000ff">="/MainMenu.jsp"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><br />
</span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">forward&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="failure"</span><span style="color: #ff0000">&nbsp;path</span><span style="color: #0000ff">="/CustomerService.jsp"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">10</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><br />
</span><span style="color: #008080">11</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">action</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">12</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><br />
</span><span style="color: #008080">13</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /></span></div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 基于执行请求处理器的execute(&#8230;)方法的结果，当传递一个值匹配指定于&lt;forward&gt;元素中name属性的值的时候，下一个视图可以在execute(&#8230;)方法中被开发者用方便的方法org.apache.struts.action.ActionMapping.findForward(&#8230;)选择。ActionMapping.findForward(&#8230;)方法既从它的本地范围又从全局范围提供一个ActionForward对象，该对象返回至RequestProcessor以RequestDispatcher.forward(&#8230;)或response.sendRedirect(&#8230;)调用下一个视图。当&lt;forward&gt;元素有redirect=&#8220;false&#8221;属性或redirect属性不存在的时候，RequestDispatcher.forward(&#8230;)被执行；当redirect=&#8220;true&#8221;是，将调用sendRedirect(&#8230;)方法。下例举例说明了redirect属性的用法：</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #008080">1</span><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">forward&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="success"</span><span style="color: #ff0000">&nbsp;path</span><span style="color: #0000ff">="/Catalog.jsp"</span><span style="color: #ff0000">&nbsp;redirect</span><span style="color: #0000ff">="true"</span><span style="color: #0000ff">/&gt;</span></div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>如果redirect=true, URL建立如/contextPath/path因为HttpServletResponse.sendRedirect(&#8230;)中解释URL采用&#8221;/&#8221;开头相对于servlet容器根目录。</p>
<p>&nbsp;</p>
<p>如果redirect=false, URI建立如/path因为ServletContext.getRequestDisptacher(&#8230;)采用虚拟目录相关URL。</p>
<p>&nbsp;</p>
<p><br />
&nbsp;</p>
<p><br />
在此稍稍说一下有关global-forwards的概念。其在配置文件中描述了整个应用系统可以使用的ActionForward，而不是仅仅是一个特定的Action。</p>
<p>&nbsp;</p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #008080">1</span><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">global-forwards</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">2</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><br />
</span><span style="color: #008080">3</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">forward&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="logout"</span><span style="color: #ff0000">&nbsp;path</span><span style="color: #0000ff">="/logout.do"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">4</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><br />
</span><span style="color: #008080">5</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">forward&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="error"</span><span style="color: #ff0000">&nbsp;&nbsp;path</span><span style="color: #0000ff">="/error.jsp"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">6</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" /><br />
</span><span style="color: #008080">7</span><span style="color: #000000"><img alt="" align="top" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">global-forwards</span><span style="color: #0000ff">&gt;</span></div>
<p>&nbsp;</p>
<p><br />
Struts ActionForm Bean捕获表单数据</p>
<p>&nbsp;</p>
<p>在上面讲解ActionServlet，Action Classes和Action Mapping的时候，我们都提到了ActionForm Bean的概念。一个应用系统的消息转移（或者说状态转移）的非持久性数据存储，是由ActionForm Bean的负责保持的。</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ActionForm派生的对象用于保存请求对象的参数，因此它们和用户紧密联系。</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一个ActionForm类被RequestProcessor建立。这是发生在已完成向前进到一个URL，该URL为映射到控制器servlet而不是JSP和相应的动作映射指定的表单属性的。在这个情况下，如果没有在指定的活动范围内找到，RequestProcessor将尝试寻找可能导致创建一个新ActionForm对象的表单bean。该ActionForm对象在指定的活动范围内被用&lt;action&gt;元素的name属性找到；</p>
<p>&nbsp;</p>
<p>RequestProcessor将随后重新安排表单属性，用请求时参数填充表单，随即调用表单对象的validate(&#8230;)方法以履行服务器端用户输入验证。仅当ActionMapping对象中validate属性被设为true时，validate(&#8230;)方法被调用；这就是默认的行为。request.getParameterValues(parameterName)被用于得到一个String[]对象，它用来表单填充；验证的结果应该是一个ActionErrors对象，用org.apache.struts.taglib.html.ErrorsTag来显示验证错误给用户。ActionForm也可以被用于为当前用户保存即将被一个视图引用的中间模型状态。<br />
</p>
<p>当一个表单对象被RequestProcessor找到，它被传递到请求处理器的execute(&#8230;)方法。一个ActionForm对象也可以被请求处理器建立。表单对象建立目的是提供中间模型状态给使用请求范围JSP；这将确保对象不会在有效性过期后仍然存在。默认的，所有的表单都被保存为会话范围。会话中表单对象脱离有效性的存在可能导致浪费内存，同样的，请求处理器必须跟踪保存在会话中的表单对象的生命周期。一个好的捕获表单数据的实践是为横跨多用户交互的相关表单用一个单独的表单bean。表单bean也可以在反馈的时候用来储存能够被自定义标签改变的中间模型状态。在视图中标签用法避免结合Java代码，因此要成一个好的任务划分，web生产组主要处理标志，而应用开发组主要处理Java代码。标签因素退出访问中间模型状态的逻辑；当访问嵌套的对象或当通过聚集列举时这个逻辑可能很复杂。</p>
<p>&nbsp;</p>
<p>注意：在struts1.1中，ActionForm的校验功能，逐渐被剥离出来（当然依然可以使用）。使用了validator framework对整个应用系统的表单数据验证进行统一管理。相信信息请参考：http://home.earthlink.net/~dwinterfeldt</p>
<p>&nbsp;</p>
<p>在ActionForm的使用中，Struts提倡使用到值对象（Value Object）。这样将客户或开发人员，对数据状态与对象状态能够更加清晰的理解和使用。</p>
<p>对于每一个客户请求，Struts framework在处理ActionForm的时候，一般需要经历如下几个步骤：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;（１）检查Action的映射，确定Action中已经配置了对ActionForm的映射</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （２）根据name属性，查找form bean的配置信息</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （３）检查Action的formbean的使用范围，确定在此范围下，是否已经有此form bean的实例。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （４）假如当前范围下，已经存在了此form bean的实例，而是对当前请求来说，是同一种类型的话，那么就重用。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （５）否则，就重新构建一个form bean的实例</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （６）form bean的reset()方法备调用</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （７）调用对应的setter方法，对状态属性赋值</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （８）如果validatede的属性北设置为true，那么就调用form bean的validate()方法。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （9）如果validate（）方法没有返回任何错误，控制器将ActionForm作为参数，传给Action实例的execute（）方法并执行。</p>
<p><br />
注意：直接从ActionFrom类继承的reset()和validate()方法，并不能实现什么处理功能，所以有必要自己重新覆盖。</p>
<p>Struts的其他组件</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Struts framework本身提供了很多可扩展的组件或sub framework，方便的开发人员在其构架上构建web层的应用系统。比如upload,collections ,logging等等。让我们来看看两个比较重要的组件：validationg framework和struts taglib。有关其他组件请参考Struts用户手册（<a href="http://jakarta.apache.org/struts/userGuide">http://jakarta.apache.org/struts/userGuide</a>）。</p>
<p>Validation Framework for Struts</p>
<p>在struts1.1中，新增了validation framework。增加了对form数据提交的验证。将原本需要在ActionFrom Bean的validate（）进行的验证通过配置文件的描述进行验证。</p>
<p>有关其详细信息，请参考http://home.earthlink.net/~dwinterfeldt 。个人建议对于小型应用系统可以采用这种配置方式，但是对于应用系统中有大量web层表单应用的系统，并且业务需求变动比较大的，使用validation framework 可能会加重开发难度、系统维护难度。可以借鉴validation framework的Javascript Validator Tag。 </p>
<p>&nbsp;<br />
Struts TagLib</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; struts提供了一组可扩展的自定义标签库（TagLib），可以简化创建用户界面的过程。目前包括：Bean Tags，HTML Tags，Logic Tags，Nested Tags，Template Tags　这几个Taglib。有关Struts Taglib的结构和使用，可以参考前面有关Cutomer Tag Lib的介绍，有关起详细资料，请参考</p>
<p>BeanUtils </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个组件的全称是Bean Introspection Utilites。是属于Jakarta Commons项目组的。主要是帮助构建javabean的属性操作的（getter,setter），已经提供一种动态定义和访问bean的属性。有关详细信息，请参考。</p>
<p><a href="http://jakarta.apache.org/commons/beanutils.html">http://jakarta.apache.org/commons/beanutils.html</a></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果各位对这方面有很兴趣，可以参考一些有关java反射（Reflectio）方面的资料。</p>
<p>Collections</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个组件主要是提供了一些集合或列表对象，在原有的java collections framework的基础上进行了扩展。详细资料请参考：</p>
<p>http://jakarta.apache.org/commons/collections.html 以及</p>
<p>http://cvs.apache.org/viewcvs/~checkout~/jakarta-commons/collections/STATUS.html?rev=1.13</p>
<p>&nbsp;Digester </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个组件翻译成中文的意思是&#8220;汇编&#8221;。其主要功能是根据xml配置文件，初始化系统的一些java类对象。Digester帮助你指定XML与java对象之间映射模型，而且允许客户话定制映射规则（rules）。详细资料请参考 <br />
<br />
本文来自CSDN博客，转载请标明出处：http://blog.csdn.net/fasttalk/archive/2005/03/19/323752.aspx</p>
<img src ="http://www.blogjava.net/Bug/aggbug/302992.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Bug/" target="_blank">seanchang</a> 2009-11-19 22:59 <a href="http://www.blogjava.net/Bug/archive/2009/11/19/302992.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>