﻿<?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-&lt;h3 style="font-family: Comic Sans MS"&gt;&lt;font color="#FA1A0A" size="10"&gt;︻┳═一Java&lt;/font&gt;&lt;/h3&gt;-随笔分类-Webwork</title><link>http://www.blogjava.net/rain1102/category/37665.html</link><description>&lt;br/&gt;&lt;font color="green" style="font-family: 华文行楷;font-size:16px;"&gt;子曰：危邦不入，乱邦不居。天下有道则见，无道则隐。&lt;/font&gt;&lt;font color="#3C1435"&gt;&lt;/font&gt;</description><language>zh-cn</language><lastBuildDate>Fri, 20 Feb 2009 10:09:59 GMT</lastBuildDate><pubDate>Fri, 20 Feb 2009 10:09:59 GMT</pubDate><ttl>60</ttl><item><title>Object Graph Navigation Language--OGNL访问静态方法和类变量</title><link>http://www.blogjava.net/rain1102/archive/2006/12/26/90106.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Tue, 26 Dec 2006 06:56:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2006/12/26/90106.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/90106.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2006/12/26/90106.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/90106.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/90106.html</trackback:ping><description><![CDATA[OGNL支持访问静态属性及静态方法。在OGNL中，可以使用如下形式：@[ClassName]@[Field Or Method]调用静态类变量和方法。类名必须使用完整的包名进行引用。@examples.test.Muppet@OG_MUPPET或者@examples.test.Muppet@OG_MUPPET()。<br />&#160;&#160;&#160;&#160;&#160;&#160; 除了使用标准的OGNL格式调用静态方法和静态属性之外，WebWork还可以不指定完整的包名，而是通过使用vs前缀（vs代表Value Stack，就是值栈）调用保存于值栈中的类的静态属性和静态方法。可以使用vs告知WebWork使用存储于栈顶的类对象，从而代替了包名（@examples.test.Muppet）：@vs@OG_MUPPET或者vs@OG_MUPPET()。<br />　　同时，也可以在vs之后指定一数字，例如vs1，从而指明选择了值栈中更深一层的对象。<img src ="http://www.blogjava.net/rain1102/aggbug/90106.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2006-12-26 14:56 <a href="http://www.blogjava.net/rain1102/archive/2006/12/26/90106.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> 通过PreResultListener在result执行之前获得回调控制</title><link>http://www.blogjava.net/rain1102/archive/2006/12/25/89895.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Mon, 25 Dec 2006 06:30:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2006/12/25/89895.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/89895.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2006/12/25/89895.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/89895.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/89895.html</trackback:ping><description><![CDATA[<p>开发interceptor的时候，了解action已经执行完毕而result还没有开始执行的时间点往往很重要的。譬如在异常处理方面就是如此：在action处理的过程中，由于后台的处理，出现的异常很可能是系统异常；而在result处理的过程中，异常则可能出现在为用户呈现的页面的时候，而不是由于系统问题。<br />下面给出了ExceptionInterceptor的代码，该interceptor会在result开始执行之前与之后以不同的方式处理异常。在result开始执行之前，可以改变用于从action配置中查询result的返回码，而在webwork应用程序中，使用Action.ERROR是一个常用的实践技巧：将Action.ERROR映射至向用户提示错误的页面。所以，需要捕获异常并返回Action.ERROR。在result开始执行之后，来自interceptor的返回码就不再那样重要了，但是仍然可以获得由beforeResult()方法回传给result code，并且可以返回它。在以下离子中需要注意的一点是：由于interceptor必须是无状态的，因此它为每一个ActionInvocation创建一个新的ExceptionHandler，可以保存该ActionInvocation的状态。<br />ExceptionInterceptor：在result前后以不同的方式处理异常<br />/**<br />&#160;* @filename ExceptionInterceptor.java<br />&#160;* @author Rain_zhou<br />&#160;* @version ExceptionInterceptor,下午01:05:50<br />&#160;*/<br />package com.founder.study.forum.interceptor;</p>
		<p>import com.opensymphony.xwork.ActionInvocation;<br />import com.opensymphony.xwork.interceptor.Interceptor;</p>
		<p>/**<br />&#160;* @author Rain_zhou<br />&#160;*<br />&#160;*/<br />public class ExceptionInterceptor implements <font color="#006400">Interceptor</font> {</p>
		<p>&#160;/* (non-Javadoc)<br />&#160; * @see com.opensymphony.xwork.interceptor.Interceptor#destroy()<br />&#160; */<br />&#160;public void destroy() {<br />&#160;&#160;// TODO Auto-generated method stub</p>
		<p>&#160;}</p>
		<p>&#160;/* (non-Javadoc)<br />&#160; * @see com.opensymphony.xwork.interceptor.Interceptor#init()<br />&#160; */<br />&#160;public void init() {<br />&#160;&#160;// TODO Auto-generated method stub</p>
		<p>&#160;}</p>
		<p>&#160;/* (non-Javadoc)<br />&#160; * @see com.opensymphony.xwork.interceptor.Interceptor#intercept(com.opensymphony.xwork.ActionInvocation)<br />&#160; */<br />&#160;public String intercept(ActionInvocation arg0) throws Exception {<br />&#160;&#160;// TODO Auto-generated method stub<br />&#160;&#160;<font color="#006400">ExceptionHandler handler=new ExceptionHandler(arg0);<br />&#160;&#160;return handler.invoke();<br /></font>&#160;}</p>
		<p>}<br /></p>
		<hr />
		<br />/**<br />&#160;* @filename ExceptionHandler.java<br />&#160;* @author Rain_zhou<br />&#160;* @version ExceptionHandler,下午01:07:04<br />&#160;*/<br />package com.founder.study.forum.interceptor;<p>import com.founder.study.forum.helper.NoLimitException;<br />import com.opensymphony.xwork.Action;<br />import com.opensymphony.xwork.ActionInvocation;<br />import com.opensymphony.xwork.interceptor.PreResultListener;</p><p>/**<br />&#160;* @author Rain_zhou<br />&#160;*<br />&#160;*/<br />public class ExceptionHandler implements <font color="#006400">PreResultListener </font>{</p><p><font color="#000000">&#160;private ActionInvocation invocation;<br />&#160;private boolean beforeResult=true;<br />&#160;private String result=Action.ERROR;<br /></font>&#160;<br />&#160;public ExceptionHandler(ActionInvocation invocation){<br />&#160;&#160;this.invocation=invocation;<br />&#160;&#160;invocation.addPreResultListener(this);<br />&#160;}<br />&#160;<br />&#160;String invoke(){<br />&#160;&#160;try{<br />&#160;&#160;&#160;result=invocation.invoke();<br />&#160;&#160;}catch(Exception e){<br />&#160;&#160;&#160;if(beforeResult){<br />&#160;&#160;&#160;&#160;return Action.ERROR;<br />&#160;&#160;&#160;}else{<br />&#160;&#160;&#160;&#160;return result;<br />&#160;&#160;&#160;}<br />&#160;&#160;}<br />&#160;&#160;return result;<br />&#160;}<br />&#160;/* (non-Javadoc)<br />&#160; * @see com.opensymphony.xwork.interceptor.PreResultListener#beforeResult(com.opensymphony.xwork.ActionInvocation, <a title="Java爱好者" href="/rain1102">Java</a>.lang.String)<br />&#160; */<br />&#160;public void beforeResult(ActionInvocation arg0, String arg1) {<br />&#160;&#160;// TODO Auto-generated method stub</p><p>&#160;&#160;beforeResult=false;<br />&#160;&#160;result=arg1;<br />&#160;}</p><p>}<br /><br /></p><img src ="http://www.blogjava.net/rain1102/aggbug/89895.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2006-12-25 14:30 <a href="http://www.blogjava.net/rain1102/archive/2006/12/25/89895.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WebWork中的ComponentManager接口</title><link>http://www.blogjava.net/rain1102/archive/2006/12/25/89857.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Mon, 25 Dec 2006 03:49:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2006/12/25/89857.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/89857.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2006/12/25/89857.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/89857.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/89857.html</trackback:ping><description><![CDATA[WebWork IoC中的主要接口：ComponentManager。这个接口及相关联的实现---DefaultComponentManager负责判断一个对象是否需要某个传递给它的资源，同时也负责管理所有资源的生命周期和依赖。<br />在WebWork 中，每一个作用域（请求、会话或者应用程序）都有一个ComponentManager--Manager（CM）与它相关联。每个CM都会有一个父CM，而在决定如何管理和应用资源的时候，CM将会询问父CM。请求作用域CM有一个会话作用域CM，而会话作用域CM则有一个应用程序作用域CM它自己的父CM。<br />这意味着应用一个对象到请求作用域CM必须保证该对象能够获取属于会话或者应用程序作用域的资源。每个作用域的CM都存放于属性<strong>map</strong>中，该map可以通过ServletRequest对象、HttpSession对象或者ServletContext对象的setAttribute()和getAttribute()方法进行访问。<img src ="http://www.blogjava.net/rain1102/aggbug/89857.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2006-12-25 11:49 <a href="http://www.blogjava.net/rain1102/archive/2006/12/25/89857.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>webwork中的aware接口</title><link>http://www.blogjava.net/rain1102/archive/2006/12/25/89816.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Mon, 25 Dec 2006 01:23:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2006/12/25/89816.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/89816.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2006/12/25/89816.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/89816.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/89816.html</trackback:ping><description><![CDATA[aware接口要求实现类必须实现单一的setter方法，以便将资源应用到实现类中。<br />webwork所支持的通用aware接口列示如下：<br />1、ParametersAware 指明action需要HTTP请求参数map。<br />2、ServletRequestAware 指明action需要ServletRequest对象。<br />3、SessionAware 指明action需要HttpSession对象。<br />4、ApplicationAware 指明action需要ServletContext对象。<img src ="http://www.blogjava.net/rain1102/aggbug/89816.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2006-12-25 09:23 <a href="http://www.blogjava.net/rain1102/archive/2006/12/25/89816.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Acegi简介</title><link>http://www.blogjava.net/rain1102/archive/2006/12/19/88847.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Tue, 19 Dec 2006 08:40:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2006/12/19/88847.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/88847.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2006/12/19/88847.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/88847.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/88847.html</trackback:ping><description><![CDATA[Acegi安全系统，是一个用于Spring Framework的安全框架，能够和目前流行的Web容器无缝集成。它使用了Spring的方式提供了安全和认证安全服务，包括使用Bean Context，拦截器和面向接口的编程方式。因此，Acegi安全系统能够轻松地适用于复杂的安全需求。<br />&#160;&#160;&#160;&#160;&#160;&#160; 安全涉及到两个不同的概念，认证和授权。前者是关于确认用户是否确实是他们所宣称的身份。授权则是关于确认用户是否有允许执行一个特定的操作。<br />&#160;&#160;&#160;&#160;&#160;&#160; 在Acegi安全系统中，需要被认证的用户，系统或代理称为"Principal"。Acegi安全系统和其他的安全系统不同，它并没有角色和用户组的概念。<br />Acegi系统设计<br />&#160;&#160;关键组件<br />&#160;&#160;&#160;&#160;&#160;&#160;Acegi安全系统包含以下七个关键的功能组件：<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;1 Authentication对象，包含了Principal，Credential和Principal的授权信息。同时还可以包含关于发起认证请求的客户的其他信息，如IP地址。<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;2 ContextHolder对象，使用ThreadLocal储存Authentication对象的地方。<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;3 AuthenticationManager，用于认证ContextHolder中的Authentication对象。<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;4 AccessDecissionManager，用于授权一个特定的操作。<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;5 RunAsManager，当执行特定的操作时，用于选择性地替换Authentication对象。<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;6 Secure Object拦截器，用于协调AuthenticationManager，AccessDecissionManager，RunAsManager和特定操作的执行。<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;7 ObjectDefinitionSource，包含了特定操作的授权定义。<br />&#160;&#160;&#160;&#160;&#160;&#160;这七个关键的功能组件的关系如下图所示（图中灰色部分是关键组件）：<br /><br /><br /><strong>安全管理对象</strong><br />&#160;&#160;&#160;&#160;&#160;&#160; Acegi安全系统目前支持两类安全管理对象。<br />&#160;&#160;&#160;&#160;&#160;&#160; 第一类的安全管理对象管理AOP Alliance的MethodInvocation，开发人员可以用它来保护Spring容器中的业务对象。为了使Spring管理的Bean可以作为MethodInvocation来使用，Bean可以通过ProxyFactoryBean和BeanNameAutoProxyCreator来管理，就像在Spring的事务管理一样使用。<br />&#160;&#160;&#160;&#160;&#160;&#160; 第二类是FilterInvocation。它用过滤器（Filter）来创建，并简单地包装了HTTP的ServletRequest，ServletResponse和FilterChain。FilterInvocation可以用来保护HTTP资源。通常，开发人员并不需要了解它的工作机制，因为他们只需要将Filter加入web.xml，Acegi安全系统就可以工作了。<br /><br /><strong>安全配置参数</strong><br />&#160;&#160;&#160;&#160;&#160;&#160; 每个安全管理对象都可以描述数量不限的各种安全认证请求。例如，MethodInvocation对象可以描述带有任意参数的任意方法的调用，而FilterInvocation可以描述任意的HTTP URL。<br />&#160;&#160;&#160;&#160;&#160;&#160; Acegi安全系统需要记录应用于每个认证请求的安全配置参数。例如，对于BankManager.getBalance（int accountNumber）方法和BankManager.approveLoan（int applicationNumber）方法，它们需要的认证请求的安全配置很不相同。<br />&#160;&#160;&#160;&#160;&#160;&#160; 为了保存不同的认证请求的安全配置，需要使用配置参数。从实现的视角来看，配置参数使用ConfigAttribute接口来表示。Acegi安全系统提供了ConfigAttribute接口的一个实现，SecurityConfig，它把配置参数保存为一个字符串。<br />&#160;&#160;&#160;&#160;&#160;&#160; ConfigAttributeDefinition类是ConfigAttribute对象的一个简单的容器，它保存了和特定请求相关的ConfigAttribute的集合。<br />&#160;&#160;&#160;&#160;&#160;&#160; 当安全拦截器收到一个安全认证请求时，需要决定应用哪一个配置参数。换句话说，它需要找出应用于这个请求的ConfigAttributeDefinition对象。这个查找的过程是由ObjectDefinitionSource接口来处理的。这个接口的主要方法是public ConfigAttributeDefinition getAttributes(Object object)，其中Object参数是一个安全管理对象。因为安全管理对象包含有认证请求的详细信息，所以ObjectDefinitionSource接口的实现类可以从中获得所需的详细信息，以查找相关的ConfigAttributeDefiniton对象。<br /><br /><br /><strong>Acegi如何工作</strong><br />&#160;&#160;&#160;&#160;&#160;&#160; 为了说明Acegi安全系统如何工作，我们设想一个使用Acegi的例子。通常，一个安全系统需要发挥作用，它必须完成以下的工作：<br />&#160;&#160;&#160;&#160;&#160;&#160;1 首先，系统从客户端请求中获得Principal和Credential；<br />&#160;&#160;&#160;&#160;&#160;&#160;2 然后系统认证Principal和Credential信息；<br />&#160;&#160;&#160;&#160;&#160;&#160;3 如果认证通过，系统取出Principal的授权信息；<br />&#160;&#160;&#160;&#160;&#160;&#160;4 接下来，客户端发起操作请求；<br />&#160;&#160;&#160;&#160;&#160;&#160;5 系统根据预先配置的参数检查Principal对于该操作的授权；<br />&#160;&#160;&#160;&#160;&#160;&#160;6 如果授权检查通过则执行操作，否则拒绝。<br />&#160;&#160;&#160;&#160;&#160;&#160;那么，Acegi安全系统是如何完成这些工作的呢？首先，我们来看看Acegi安全系统的认证和授权的相关类： <br />&#160;&#160;&#160;&#160;&#160;&#160;安全拦截器的抽象基类，它包含有两个管理类，AuthenticationManager和AccessDecisionManager。AuthenticationManager用于认证ContextHolder中的Authentication对象（包含了Principal，Credential和Principal的授权信息）；AccessDecissionManager则用于授权一个特定的操作。<br /><br />&#160;&#160;&#160;&#160;&#160;&#160;下面来看一个MethodSecurityInterceptor的例子：<br /><pre class="overflow">&#160;&#160;&#160;&#160;&#160;&#160;&lt;bean id="bankManagerSecurity" <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; class="net.sf.acegisecurity.intercept.method.MethodSecurityInterceptor"&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;property name="validateConfigAttributes"&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&lt;value&gt;true&lt;/value&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&lt;/property&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&lt;property name="authenticationManager"&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;ref bean="authenticationManager"/&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&lt;/property&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&lt;property name="accessDecisionManager"&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&lt;ref bean="accessDecisionManager"/&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&lt;/property&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&lt;property name="objectDefinitionSource"&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&lt;value&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; net.sf.acegisecurity.context.BankManager.delete*=<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ROLE_SUPERVISOR,RUN_AS_SERVER<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; net.sf.acegisecurity.context.BankManager.getBalance=<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ROLE_TELLER,ROLE_SUPERVISOR,BANKSECURITY_CUSTOMER,RUN_<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&lt;/value&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&lt;/property&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&lt;/bean&gt; </pre><br />&#160;&#160;&#160;&#160;&#160;&#160;上面的配置文件中，MethodSecurityInterceptor是AbstractSecurityInterceptor的一个实现类。它包含了两个管理器，authenticationManager和accessDecisionManager。这两者的配置如下：<br />&#160;&#160;&#160;&#160;&#160;&#160;<pre class="overflow">&lt;bean id="authenticationDao" class="net.sf.acegisecurity.providers.dao.jdbc.JdbcDaoImpl"&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;property name="dataSource"&gt;&lt;ref bean="dataSource"/&gt;&lt;/property&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&lt;/bean&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&lt;bean id="daoAuthenticationProvider" <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; class="net.sf.acegisecurity.providers.dao.DaoAuthenticationProvider"&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;property name="authenticationDao"&gt;&lt;ref bean="authenticationDao"/&gt;&lt;/property&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&lt;/bean&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&lt;bean id="authenticationManager" class="net.sf.acegisecurity.providers.ProviderManager"&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;property name="providers"&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&lt;list&gt;&lt;ref bean="daoAuthenticationProvider"/&gt;&lt;/list&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/property&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&lt;/bean&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&lt;bean id="roleVoter" class="net.sf.acegisecurity.vote.RoleVoter"/&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&lt;bean id="accessDecisionManager" class="net.sf.acegisecurity.vote.AffirmativeBased"&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;property name="allowIfAllAbstainDecisions"&gt;&lt;value&gt;false&lt;/value&gt;&lt;/property&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;property name="decisionVoters"&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&lt;list&gt;&lt;ref bean="roleVoter"/&gt;&lt;/list&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/property&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&lt;/bean&gt;</pre><br /><br />&#160;&#160;&#160;&#160;&#160;&#160; 准备工作做好了，现在我们来看看Acegi安全系统是如何实现认证和授权机制的。以使用HTTP BASIC认证的应用为例子，它包括下面的步骤：<br />&#160;&#160;&#160;&#160;&#160;&#160; 1. 用户登录系统，Acegi从acegisecurity.ui子系统的安全拦截器（如BasicProcessingFilter）中得到用户的登录信息（包括Principal和Credential）并放入Authentication对象，并保存在ContextHolder对象中；<br />&#160;&#160;&#160;&#160;&#160;&#160; 2. 安全拦截器将Authentication对象交给AuthenticationManager进行身份认证，如果认证通过，返回带有Principal授权信息的Authentication对象。此时ContextHolder对象的Authentication对象已拥有Principal的详细信息；<br />&#160;&#160;&#160;&#160;&#160;&#160; 3. 用户登录成功后，继续进行业务操作；<br />&#160;&#160;&#160;&#160;&#160;&#160; 4. 安全拦截器（bankManagerSecurity）收到客户端操作请求后，将操作请求的数据包装成安全管理对象（FilterInvocation或MethodInvocation对象）；<br />&#160;&#160;&#160;&#160;&#160;&#160; 5. 然后，从配置文件（ObjectDefinitionSource）中读出相关的安全配置参数ConfigAttributeDefinition；<br />&#160;&#160;&#160;&#160;&#160;&#160; 6. 接着，安全拦截器取出ContextHolder中的Authentication对象，把它传递给AuthenticationManager进行身份认证，并用返回值更新ContextHolder的Authentication对象；<br />&#160;&#160;&#160;&#160;&#160;&#160; 7. 将Authentication对象，ConfigAttributeDefinition对象和安全管理对象（secure Object）交给AccessDecisionManager，检查Principal的操作授权；<br />&#160;&#160;&#160;&#160;&#160;&#160; 8. 如果授权检查通过则执行客户端请求的操作，否则拒绝；<br /><br /><strong>AccessDecisionVoter</strong><br />&#160;&#160;&#160;&#160;&#160;&#160; 注意上节的accessDecisionManager是一个AffirmativeBased类，它对于用户授权的投票策略是，只要通过其中的一个授权投票检查，即可通过；它的allowIfAllAbstainDecisions属性值是false，意思是如果所有的授权投票是都是弃权，则通不过授权检查。<br />&#160;&#160;&#160;&#160;&#160;&#160; Acegi安全系统包括了几个基于投票策略的AccessDecisionManager，上节的RoleVoter就是其中的一个投票策略实现，它是AccessDecisionVoter的一个子类。AccessDecisionVoter的具体实现类通过投票来进行授权决策，AccessDecisionManager则根据投票结果来决定是通过授权检查，还是抛出AccessDeniedException例外。<br />&#160;&#160;&#160;&#160;&#160;&#160; AccessDecisionVoter接口共有三个方法：<br />public int vote(Authentication authentication, Object object, ConfigAttributeDefinition config);<br />public boolean supports(ConfigAttribute attribute);<br />public boolean supports(Class clazz);<br />&#160;&#160;&#160;&#160;&#160;&#160; 其中的vote方法返回int返回值，它们是AccessDecisionVoter的三个静态成员属性：ACCESS_ABSTAIN,，ACCESS_DENIED和ACCESS_GRANTED，它们分别是弃权，否决和赞成。<br />&#160;&#160;&#160;&#160;&#160;&#160; Acegi安全系统中，使用投票策略的AccessDecisionManager共有三个具体实现类：AffirmativeBased、ConsensusBased和UnanimousBased。它们的投票策略是，AffirmativeBased类只需有一个投票赞成即可通过；ConsensusBased类需要大多数投票赞成即可通过；而UnanimousBased类需要所有的投票赞成才能通过。<br />&#160;&#160;&#160;&#160;&#160;&#160; RoleVoter类是一个Acegi安全系统AccessDecisionVoter接口的实现。如果ConfigAttribute以ROLE_开头，RoleVoter则进行投票。如果GrantedAuthority的getAutority方法的String返回值匹配一个或多个以ROLE_开头的ConfigAttribute，则投票通过，否则不通过。如果没有以ROLE_开头的ConfigAttribute，RoleVoter则弃权。<br /><br /><strong>安全拦截器</strong><br />&#160;&#160;拦截器如何工作<br />&#160;&#160;MethodInvocation拦截器<br />&#160;&#160;FilterInvocation拦截器<br />认证<br />&#160;&#160;认证请求<br />&#160;&#160;认证管理器<br />&#160;&#160;Authentication Provider<br />授权<br />&#160;&#160;Access Decision Manager<br />&#160;&#160;Voting Decision Manager<br />&#160;&#160;授权管理推荐<br />ContextHolder的用户接口<br />&#160;&#160;用户接口目标<br />&#160;&#160;HTTP会话认证<br />&#160;&#160;HTTP Basic认证<br /><br />1、Log4j的概念<br />&#160;&#160; Log4j中有三个主要的组件，它们分别是Logger、Appender和Layout，Log4j 允许开发人员定义多个Logger，每个Logger拥有自己的名字，Logger之间通过名字来表明隶属关系。有一个Logger称为Root，它永远 存在，且不能通过名字检索或引用，可以通过Logger.getRootLogger()方法获得，其它Logger通过 Logger.getLogger(String name)方法。<br />&#160;&#160; Appender则是用来指明将所有的log信息存放到什么地方，Log4j中支持多种appender，如 console、files、GUI components、NT Event Loggers等，一个Logger可以拥有多个Appender，也就是你既可以将Log信息输出到屏幕，同时存储到一个文件中。<br />&#160;&#160; Layout的作用是控制Log信息的输出方式，也就是格式化输出的信息。<br />&#160;&#160; Log4j中将要输出的Log信息定义了5种级别，依次为DEBUG、INFO、WARN、ERROR和FATAL，当输出时，只有级别高过配置中规定的 级别的信息才能真正的输出，这样就很方便的来配置不同情况下要输出的内容，而不需要更改代码，这点实在是方便啊。<br /><br />2、Log4j的配置文件<br />&#160;&#160;虽然可以不用配置文件，而在程序中实现配置，但这种方法在如今的系统开发中显然是不可取的，能采用配置文件的地方一定一定要用配置文件。Log4j支持两 种格式的配置文件：XML格式和Java的property格式，本人更喜欢后者，首先看一个简单的例子吧，如下：<br /><br /><pre class="overflow"> log4j.rootLogger=debug, stdout, R<br />&#160;&#160;log4j.appender.stdout=org.apache.log4j.ConsoleAppender<br />&#160;&#160;log4j.appender.stdout.layout=org.apache.log4j.PatternLayout<br /><br />&#160;&#160;# Pattern to output the caller's file name and line number.<br />&#160;&#160;log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n<br /><br />&#160;&#160;log4j.appender.R=org.apache.log4j.RollingFileAppender<br />&#160;&#160;log4j.appender.R.File=example.log<br />&#160;&#160;log4j.appender.R.MaxFileSize=100KB<br /><br />&#160;&#160;# Keep one backup file<br />&#160;&#160;log4j.appender.R.MaxBackupIndex=1<br /><br />&#160;&#160;log4j.appender.R.layout=org.apache.log4j.PatternLayout<br />&#160;&#160;log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n</pre>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br /><br />&#160;&#160;首先，是设置root，格式为 log4j.rootLogger=[level],appenderName, ...，其中level就是设置需要输出信息的级别，后面是appender的输出的目的地，appenderName就是指定日志信息输出到哪个地方。您可以同时指定多个输出目的地。配置日志信息输出目的地Appender，其语法为<br />&#160;&#160;log4j.appender.appenderName = fully.qualified.name.of.appender.class<br />&#160;&#160;log4j.appender.appenderName.option1 = value1<br />&#160;&#160;...<br />&#160;&#160;log4j.appender.appenderName.option = valueN<br />Log4j提供的appender有以下几种：<br />&#160;&#160;org.apache.log4j.ConsoleAppender（控制台）<br />&#160;&#160;org.apache.log4j.FileAppender（文件）<br />&#160;&#160;org.apache.log4j.DailyRollingFileAppender（每天产生一个日志文件）<br />&#160;&#160;org.apache.log4j.RollingFileAppender（文件大小到达指定尺寸的时候产生新文件）<br />&#160;&#160;org.apache.log4j.WriterAppender（将日志信息以流格式发送到任意指定的地方）<br />配置日志信息的格式（布局），其语法为：<br />&#160;&#160;log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class<br />&#160;&#160;log4j.appender.appenderName.layout.option1 = value1<br />&#160;&#160;....<br />&#160;&#160;log4j.appender.appenderName.layout.option = valueN<br />Log4j提供的layout有以下几种：<br />&#160;&#160;org.apache.log4j.HTMLLayout（以HTML表格形式布局），<br />&#160;&#160;org.apache.log4j.PatternLayout（可以灵活地指定布局模式），<br />&#160;&#160;org.apache.log4j.SimpleLayout（包含日志信息的级别和信息字符串），<br />&#160;&#160;org.apache.log4j.TTCCLayout（包含日志产生的时间、线程、类别等等信息） <br /><br />3、Log4j在程序中的使用<br />&#160;&#160;要在自己的类中使用Log4j，首先声明一个静态变量Logger logger=Logger.getLog("classname")；在使用之前，用PropertyConfigurator.configure ("配置文件")配置一下，现在就可以使用了，用法如下：logger.debug("debug message")或者logger.info("info message")，看下面一个小例子：<br /><br /><pre class="overflow"> import com.foo.Bar;<br />&#160;&#160;import org.apache.log4j.Logger;<br />&#160;&#160;import org.apache.log4j.PropertyConfigurator;<br />&#160;&#160;public class MyApp {<br />&#160;&#160;&#160;&#160;static Logger logger = Logger.getLogger(MyApp.class.getName());<br />&#160;&#160;&#160;&#160;public static void main(String[] args) {<br />&#160;&#160;&#160;&#160;&#160;&#160;// BasicConfigurator replaced with PropertyConfigurator.<br />&#160;&#160;&#160;&#160;&#160;&#160;PropertyConfigurator.configure(args[0]);<br />&#160;&#160;&#160;&#160;&#160;&#160;logger.info("Entering application.");<br />&#160;&#160;&#160;&#160;&#160;&#160;Bar bar = new Bar();<br />&#160;&#160;&#160;&#160;&#160;&#160;bar.doIt();<br />&#160;&#160;&#160;&#160;&#160;&#160;logger.info("Exiting application.");<br />&#160;&#160;&#160;&#160;}<br />&#160;&#160;}</pre><br /><br /><br />[简介]<br /><br />对于一个典型的Web应用，完善的认证和授权机制是必不可少的，在SpringFramework中，Juergen Hoeller提供的范例JPetStore给了一些这方面的介绍，但还远远不够，Acegi是一个专门为SpringFramework提供安全机制的 项目，全称为Acegi Security System for Spring，当前版本为0.5.1，就其目前提供的功能，应该可以满足绝大多数应用的需求。<br /><br />本文的主要目的是希望能够说明如何在基于Spring构架的Web应用中使用Acegi，而不是详细介绍其中的每个接口、每个类。注意，即使对已经存在的Spring应用，通过下面介绍的步骤，也可以马上享受到Acegi提供的认证和授权。<br /><br />[基础工作]<br />在你的Web应用的lib中添加Acegi下载包中的acegi-security.jar<br /><br />[web.xml]<br />实现认证和授权的最常用的方法是通过filter，Acegi亦是如此，通常Acegi需要在web.xml添加以下5个filter:<br /><br /><pre class="overflow">&lt;filter&gt;<br />&#160;&#160;&lt;filter-name&gt;Acegi Channel Processing Filter&lt;/filter-name&gt;<br />&#160;&#160;&lt;filter-class&gt;net.sf.acegisecurity.util.FilterToBeanProxy&lt;/filter-class&gt;<br />&#160;&#160;&lt;init-param&gt;<br />&#160;&#160;&#160;&#160;&lt;param-name&gt;targetClass&lt;/param-name&gt;<br />&#160;&#160;&#160;&#160;&lt;param-value&gt;net.sf.acegisecurity.securechannel.ChannelProcessingFilter&lt;/param-value&gt;<br />&#160;&#160;&lt;/init-param&gt;<br />&lt;/filter&gt;<br />&lt;filter&gt;<br />&#160;&#160;&lt;filter-name&gt;Acegi Authentication Processing Filter&lt;/filter-name&gt;<br />&#160;&#160;&lt;filter-class&gt;net.sf.acegisecurity.util.FilterToBeanProxy&lt;/filter-class&gt;<br />&#160;&#160;&lt;init-param&gt;<br />&#160;&#160;&#160;&#160;&lt;param-name&gt;targetClass&lt;/param-name&gt;<br />&#160;&#160;&#160;&#160;&lt;param-value&gt;net.sf.acegisecurity.ui.webapp.AuthenticationProcessingFilter&lt;/param-value&gt;<br />&#160;&#160;&lt;/init-param&gt;<br />&lt;/filter&gt;<br />&lt;filter&gt;<br />&#160;&#160;&lt;filter-name&gt;Acegi HTTP BASIC Authorization Filter&lt;/filter-name&gt;<br />&#160;&#160;&lt;filter-class&gt;net.sf.acegisecurity.util.FilterToBeanProxy&lt;/filter-class&gt;<br />&#160;&#160;&lt;init-param&gt;<br />&#160;&#160;&#160;&#160;&lt;param-name&gt;targetClass&lt;/param-name&gt;<br />&#160;&#160;&#160;&#160;&lt;param-value&gt;net.sf.acegisecurity.ui.basicauth.BasicProcessingFilter&lt;/param-value&gt;<br />&#160;&#160;&lt;/init-param&gt;<br />&lt;/filter&gt;<br />&lt;filter&gt;<br />&#160;&#160;&lt;filter-name&gt;Acegi Security System for Spring Auto Integration Filter&lt;/filter-name&gt;<br />&#160;&#160;&lt;filter-class&gt;net.sf.acegisecurity.ui.AutoIntegrationFilter&lt;/filter-class&gt;<br />&lt;/filter&gt;<br />&lt;filter&gt;<br />&#160;&#160;&lt;filter-name&gt;Acegi HTTP Request Security Filter&lt;/filter-name&gt;<br />&#160;&#160;&lt;filter-class&gt;net.sf.acegisecurity.util.FilterToBeanProxy&lt;/filter-class&gt;<br />&#160;&#160;&lt;init-param&gt;<br />&#160;&#160;&#160;&#160;&lt;param-name&gt;targetClass&lt;/param-name&gt;<br />&#160;&#160;&#160;&#160;&lt;param-value&gt;net.sf.acegisecurity.intercept.web.SecurityEnforcementFilter&lt;/param-value&gt;<br />&#160;&#160;&lt;/init-param&gt;<br />&lt;/filter&gt;</pre><br /><br />最先引起迷惑的是net.sf.acegisecurity.util.FilterToBeanProxy，Acegi自己的文档上解释是： &#8220;What&#160;&#160;FilterToBeanProxy does is delegate the Filter's methods through to a bean which is obtained from the <br />Spring application context. This enables the bean to benefit from the Spring application context lifecycle support and configuration flexibility.&#8221;，如希望深究的话，去看看源代码应该不难理解。<br /><br />再下来就是添加filter-mapping了：<br /><pre class="overflow">&lt;filter-mapping&gt;<br />&#160;&#160;&lt;filter-name&gt;Acegi Channel Processing Filter&lt;/filter-name&gt;<br />&#160;&#160;&lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br />&lt;/filter-mapping&gt;<br />&lt;filter-mapping&gt;<br />&#160;&#160;&lt;filter-name&gt;Acegi Authentication Processing Filter&lt;/filter-name&gt;<br />&#160;&#160;&lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br />&lt;/filter-mapping&gt;<br />&lt;filter-mapping&gt;<br />&#160;&#160;&lt;filter-name&gt;Acegi HTTP BASIC Authorization Filter&lt;/filter-name&gt;<br />&#160;&#160;&lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br />&lt;/filter-mapping&gt;<br />&lt;filter-mapping&gt;<br />&#160;&#160;&lt;filter-name&gt;Acegi Security System for Spring Auto Integration Filter&lt;/filter-name&gt;<br />&#160;&#160;&lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br />&lt;/filter-mapping&gt;<br />&lt;filter-mapping&gt;<br />&#160;&#160;&lt;filter-name&gt;Acegi HTTP Request Security Filter&lt;/filter-name&gt;<br />&#160;&#160;&lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br />&lt;/filter-mapping&gt;</pre><br /><br />这里，需要注意以下两点：<br />1) 这几个filter的顺序是不能更改的，顺序不对将无法正常工作；<br />2) 如果你的应用不需要安全传输，如https，则将"Acegi Channel Processing Filter"相关内容注释掉即可；<br />3) 如果你的应用不需要Spring提供的远程访问机制，如Hessian and Burlap，将"Acegi HTTP BASIC Authorization <br />Filter"相关内容注释掉即可。<br /><br />[applicationContext.xml]<br />接下来就是要添加applicationContext.xml中的内容了，从刚才FilterToBeanFactory的解释可以看出，真正的filter都<br />在Spring的applicationContext中管理：<br /><br />1) 首先，你的数据库中必须具有保存用户名和密码的table，Acegi要求table的schema必须如下：<br /><br /><pre class="overflow">CREATE TABLE users (<br />&#160;&#160;&#160;&#160;username VARCHAR(50) NOT NULL PRIMARY KEY,<br />&#160;&#160;&#160;&#160;password VARCHAR(50) NOT NULL,<br />&#160;&#160;&#160;&#160;enabled BIT NOT NULL<br />);<br />CREATE TABLE authorities (<br />&#160;&#160;&#160;&#160;username VARCHAR(50) NOT NULL,<br />&#160;&#160;&#160;&#160;authority VARCHAR(50) NOT NULL<br />);<br />CREATE UNIQUE INDEX ix_auth_username ON authorities ( username, authority );<br />ALTER TABLE authorities ADD CONSTRAINT fk_authorities_users foreign key (username) REFERENCES users<br />(username);</pre><br /><br />2) 添加访问你的数据库的datasource和Acegi的jdbcDao，如下：<br /><br /><pre class="overflow">&lt;bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"&gt;<br />&#160;&#160;&lt;property name="driverClassName"&gt;&lt;value&gt;${jdbc.driverClassName}&lt;/value&gt;&lt;/property&gt;<br />&#160;&#160;&lt;property name="url"&gt;&lt;value&gt;${jdbc.url}&lt;/value&gt;&lt;/property&gt;<br />&#160;&#160;&lt;property name="username"&gt;&lt;value&gt;${jdbc.username}&lt;/value&gt;&lt;/property&gt;<br />&#160;&#160;&lt;property name="password"&gt;&lt;value&gt;${jdbc.password}&lt;/value&gt;&lt;/property&gt;<br />&lt;/bean&gt;<br />&lt;bean id="jdbcDaoImpl" class="net.sf.acegisecurity.providers.dao.jdbc.JdbcDaoImpl"&gt;<br />&#160;&#160;&lt;property name="dataSource"&gt;&lt;ref bean="dataSource"/&gt;&lt;/property&gt;<br />&lt;/bean&gt;</pre><br /><br />3) 添加DaoAuthenticationProvider:<br /><br /><pre class="overflow">&lt;bean id="daoAuthenticationProvider" class="net.sf.acegisecurity.providers.dao.DaoAuthenticationProvider"&gt;<br />&#160;&#160;&lt;property name="authenticationDao"&gt;&lt;ref bean="authenticationDao"/&gt;&lt;/property&gt;<br />&#160;&#160;&lt;property name="userCache"&gt;&lt;ref bean="userCache"/&gt;&lt;/property&gt;<br />&lt;/bean&gt;<br /><br />&lt;bean id="userCache" class="net.sf.acegisecurity.providers.dao.cache.EhCacheBasedUserCache"&gt;<br />&#160;&#160;&lt;property name="minutesToIdle"&gt;&lt;value&gt;5&lt;/value&gt;&lt;/property&gt;<br />&lt;/bean&gt;</pre><br /><br />如果你需要对密码加密，则在daoAuthenticationProvider中加入：&lt;property name="passwordEncoder"&gt;&lt;ref <br />bean="passwordEncoder"/&gt;&lt;/property&gt;，Acegi提供了几种加密方法，详细情况可看包<br />net.sf.acegisecurity.providers.encoding<br /><br />4) 添加authenticationManager:<br /><br /><pre class="overflow">&lt;bean id="authenticationManager" class="net.sf.acegisecurity.providers.ProviderManager"&gt;<br />&#160;&#160;&lt;property name="providers"&gt;<br />&#160;&#160;&#160;&#160;&lt;list&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&lt;ref bean="daoAuthenticationProvider"/&gt;<br />&#160;&#160;&#160;&#160;&lt;/list&gt;<br />&#160;&#160; &lt;/property&gt;<br />&lt;/bean&gt;</pre><br /><br />5) 添加accessDecisionManager:<br /><br /><pre class="overflow">&lt;bean id="accessDecisionManager" class="net.sf.acegisecurity.vote.AffirmativeBased"&gt;<br />&#160;&#160;&lt;property name="allowIfAllAbstainDecisions"&gt;<br />&#160;&#160;&#160;&#160;&lt;value&gt;false&lt;/value&gt;<br />&#160;&#160;&lt;/property&gt;<br />&#160;&#160;&lt;property name="decisionVoters"&gt;<br />&#160;&#160;&#160;&#160;&lt;list&gt;&lt;ref bean="roleVoter"/&gt;&lt;/list&gt;<br />&#160;&#160;&lt;/property&gt;<br />&lt;/bean&gt;<br />&lt;bean id="roleVoter" class="net.sf.acegisecurity.vote.RoleVoter"/&gt;</pre><br /><br />6) 添加authenticationProcessingFilterEntryPoint:<br /><br /><pre class="overflow">&lt;bean id="authenticationProcessingFilterEntryPoint" <br />class="net.sf.acegisecurity.ui.webapp.AuthenticationProcessingFilterEntryPoint"&gt;<br />&#160;&#160;&lt;property name="loginFormUrl"&gt;&lt;value&gt;/acegilogin.jsp&lt;/value&gt;&lt;/property&gt;<br />&#160;&#160;&lt;property name="forceHttps"&gt;&lt;value&gt;false&lt;/value&gt;&lt;/property&gt;<br />&lt;/bean&gt;</pre><br /><br />其中acegilogin.jsp是登陆页面，一个最简单的登录页面如下：<br /><br /><pre class="overflow">&lt;%@ taglib prefix='c' uri='http://java.sun.com/jstl/core' %&gt;<br />&lt;%@ page import="net.sf.acegisecurity.ui.AbstractProcessingFilter" %&gt;<br />&lt;%@ page import="net.sf.acegisecurity.AuthenticationException" %&gt;<br />&lt;html&gt;<br />&#160;&#160;&lt;head&gt;<br />&#160;&#160;&#160;&#160;&lt;title&gt;Login&lt;/title&gt;<br />&#160;&#160;&lt;/head&gt;<br /><br />&#160;&#160;&lt;body&gt;<br />&#160;&#160;&#160;&#160;&lt;h1&gt;Login&lt;/h1&gt;<br />&#160;&#160;&#160;&#160;&lt;form action="&lt;c:url value='j_acegi_security_check'/&gt;" method="POST"&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&lt;table&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&lt;tr&gt;&lt;td&gt;User:&lt;/td&gt;&lt;td&gt;&lt;input type='text' name='j_username'&gt;&lt;/td&gt;&lt;/tr&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&lt;tr&gt;&lt;td&gt;Password:&lt;/td&gt;&lt;td&gt;&lt;input type='password' name='j_password'&gt;&lt;/td&gt;&lt;/tr&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&lt;tr&gt;&lt;td colspan='2'&gt;&lt;input name="submit" type="submit"&gt;&lt;/td&gt;&lt;/tr&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&lt;tr&gt;&lt;td colspan='2'&gt;&lt;input name="reset" type="reset"&gt;&lt;/td&gt;&lt;/tr&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&lt;/table&gt;<br />&#160;&#160;&#160;&#160;&lt;/form&gt;<br />&#160;&#160;&lt;/body&gt;<br />&lt;/html&gt;</pre><br /><br />7) 添加filterInvocationInterceptor:<br /><br /><pre class="overflow">&lt;bean id="filterInvocationInterceptor" <br />class="net.sf.acegisecurity.intercept.web.FilterSecurityInterceptor"&gt;<br />&#160;&#160;&lt;property name="authenticationManager"&gt;<br />&#160;&#160;&#160;&#160;&lt;ref bean="authenticationManager"/&gt;<br />&#160;&#160;&lt;/property&gt;<br />&#160;&#160;&lt;property name="accessDecisionManager"&gt;<br />&#160;&#160;&#160;&#160;&lt;ref bean="accessDecisionManager"/&gt;<br />&#160;&#160;&lt;/property&gt;<br />&#160;&#160;&lt;property name="objectDefinitionSource"&gt;<br />&#160;&#160;&#160;&#160;&lt;value&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON<br />&#160;&#160;&#160;&#160;&#160;&#160;\A/sec/administrator.*\Z=ROLE_SUPERVISOR<br />&#160;&#160;&#160;&#160;&#160;&#160;\A/sec/user.*\Z=ROLE_TELLER<br />&#160;&#160;&#160;&#160;&lt;/value&gt;<br />&#160;&#160;&lt;/property&gt;<br />&lt;/bean&gt;</pre><br /><br />这里请注意，要objectDefinitionSource中定义哪些页面需要权限访问，需要根据自己的应用需求进行修改，我上面给出<br />的定义的意思是这样的：<br />a. CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON意思是在比较请求路径时全部转换为小写<br />b. \A/sec/administrator.*\Z=ROLE_SUPERVISOR意思是只有权限为ROLE_SUPERVISOR才能访问/sec/administrator*的页面<br />c. \A/sec/user.*\Z=ROLE_TELLER意思是只有权限为ROLE_TELLER的用户才能访问/sec/user*的页面<br /><br />8) 添加securityEnforcementFilter:<br /><br /><pre class="overflow">&lt;bean id="securityEnforcementFilter" class="net.sf.acegisecurity.intercept.web.SecurityEnforcementFilter"&gt;<br />&#160;&#160;&lt;property name="filterSecurityInterceptor"&gt;<br />&#160;&#160;&#160;&#160;&lt;ref bean="filterInvocationInterceptor"/&gt;<br />&#160;&#160;&lt;/property&gt;<br />&#160;&#160;&lt;property name="authenticationEntryPoint"&gt;<br />&#160;&#160;&#160;&#160;&lt;ref bean="authenticationProcessingFilterEntryPoint"/&gt;<br />&#160;&#160;&lt;/property&gt;<br />&lt;/bean&gt;</pre><br /><br />9) 添加authenticationProcessingFilter:<br /><br /><pre class="overflow">&lt;bean id="authenticationProcessingFilter" <br />class="net.sf.acegisecurity.ui.webapp.AuthenticationProcessingFilter"&gt;<br />&#160;&#160;&lt;property name="authenticationManager"&gt;<br />&#160;&#160;&#160;&#160;&lt;ref bean="authenticationManager"/&gt;<br />&#160;&#160;&lt;/property&gt;<br />&#160;&#160;&lt;property name="authenticationFailureUrl"&gt;<br />&#160;&#160;&#160;&#160;&lt;value&gt;/loginerror.jsp&lt;/value&gt;<br />&#160;&#160;&lt;/property&gt;<br />&#160;&#160;&lt;property name="defaultTargetUrl"&gt;<br />&#160;&#160;&#160;&#160;&lt;value&gt;/&lt;/value&gt;<br />&#160;&#160;&lt;/property&gt;<br />&#160;&#160;&lt;property name="filterProcessesUrl"&gt;<br />&#160;&#160;&#160;&#160;&lt;value&gt;/j_acegi_security_check&lt;/value&gt;<br />&#160;&#160;&lt;/property&gt;<br />&lt;/bean&gt;</pre><br />其中authenticationFailureUrl是认证失败的页面。<br /><br />10) 如果需要一些页面通过安全通道的话，添加下面的配置:<br /><br /><pre class="overflow">&lt;bean id="channelProcessingFilter" class="net.sf.acegisecurity.securechannel.ChannelProcessingFilter"&gt;<br />&#160;&#160;&lt;property name="channelDecisionManager"&gt;<br />&#160;&#160;&#160;&#160;&lt;ref bean="channelDecisionManager"/&gt;<br />&#160;&#160;&lt;/property&gt;<br />&#160;&#160;&lt;property name="filterInvocationDefinitionSource"&gt;<br />&#160;&#160;&#160;&#160;&lt;value&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON<br />&#160;&#160;&#160;&#160;&#160;&#160;\A/sec/administrator.*\Z=REQUIRES_SECURE_CHANNEL<br />&#160;&#160;&#160;&#160;&#160;&#160;\A/acegilogin.jsp.*\Z=REQUIRES_SECURE_CHANNEL<br />&#160;&#160;&#160;&#160;&#160;&#160;\A/j_acegi_security_check.*\Z=REQUIRES_SECURE_CHANNEL<br />&#160;&#160;&#160;&#160;&#160;&#160;\A.*\Z=REQUIRES_INSECURE_CHANNEL<br />&#160;&#160;&#160;&#160;&lt;/value&gt;<br />&#160;&#160;&lt;/property&gt;<br />&lt;/bean&gt;<br /><br />&lt;bean id="channelDecisionManager" class="net.sf.acegisecurity.securechannel.ChannelDecisionManagerImpl"&gt;<br />&#160;&#160;&lt;property name="channelProcessors"&gt;<br />&#160;&#160;&#160;&#160;&lt;list&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&lt;ref bean="secureChannelProcessor"/&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&lt;ref bean="insecureChannelProcessor"/&gt;<br />&#160;&#160;&#160;&#160;&lt;/list&gt;<br />&#160;&#160;&lt;/property&gt;<br />&lt;/bean&gt;<br />&lt;bean id="secureChannelProcessor" class="net.sf.acegisecurity.securechannel.SecureChannelProcessor"/&gt;<br />&lt;bean id="insecureChannelProcessor" class="net.sf.acegisecurity.securechannel.InsecureChannelProcessor"/&gt;</pre><br /><br />[缺少了什么？]<br />Acegi目前提供了两种"secure object"，分别对页面和方法进行安全认证管理，我这里介绍的只是利用<br />FilterSecurityInterceptor对访问页面的权限控制，除此之外，Acegi还提供了另外一个Interceptor――<br />MethodSecurityInterceptor，它结合runAsManager可实现对对象中的方法的权限控制，使用方法可参看Acegi自带的文档<br />和contact范例。<br /><br />[最后要说的]<br />本来以为只是说明如何使用Acegi而已，应该非常简单，但真正写起来才发现想要条理清楚的理顺所有需要的bean还是很<br />困难的，但愿我没有遗漏太多东西，如果我的文章有什么遗漏或错误的话，还请参看Acegi自带的quick-start范例，但请<br />注意，这个范例是不能直接拿来用的。<br />分析和学习Spring中的jpetstore用户管理 <br />&#160;&#160;存在用户的系统，必然需要用户的登录和认证，今天就通过分析Spring中自带的jpetstore的例子来学习一下如何实现在Spring构架的系统中用户登录。<br />1、首先从注册用户开始，先看看jpetstore-servlet.xml中关于注册用户的bean定义，从定义命名中就可以看出下面这段就是注册用户的：<br />&#160;&#160;<pre class="overflow">&lt;bean name="/shop/newAccount.do" class="org.springframework.samples.jpetstore.web.spring.AccountFormController"&gt;<br />&#160;&#160;&#160;&#160;&lt;property name="petStore"&gt;&lt;ref bean="petStore"/&gt;&lt;/property&gt;<br />&#160;&#160;&#160;&#160;&lt;property name="validator"&gt;&lt;ref bean="accountValidator"/&gt;&lt;/property&gt;<br />&#160;&#160;&#160;&#160;&lt;property name="successView"&gt;&lt;value&gt;index&lt;/value&gt;&lt;/property&gt;<br />&#160;&#160;&lt;/bean&gt;</pre><br />1). formView呢？从AccountFormController的构造函数中得到，原来为EditAccountForm；&#160;&#160;<br />2). EditoAccountForm.jsp中显得非常乱，其实没有多少难理解的地方，最主要的是这个form既是添加新用户的，又是编辑用户信息的，所以显得有点乱糟糟的。<br />2、添加好了新用户，接下来看看如何登录，在jpetstore-servlet中发现这两个相关bean定义，如下：<br />&#160;&#160;<pre class="overflow">&lt;bean name="/shop/signon.do" class="org.springframework.samples.jpetstore.web.spring.SignonController"&gt;<br />&#160;&#160;&#160;&#160;&lt;property name="petStore"&gt;&lt;ref bean="petStore"/&gt;&lt;/property&gt;<br />&#160;&#160;&lt;/bean&gt;<br />&#160;&#160;&lt;bean name="/shop/signonForm.do" class="org.springframework.web.servlet.mvc.ParameterizableViewController"&gt;<br />&#160;&#160;&#160;&#160;&lt;property name="viewName"&gt;&lt;value&gt;SignonForm&lt;/value&gt;&lt;/property&gt;<br />&#160;&#160;&lt;/bean&gt;</pre><br />1). 第二个bean是在运行时用户输入用户名和密码的form，叫做SignonForm，对于这个 ParameterizableViewController，用文档里的话说这是最简单的Controller，其作用就是在运行中指向 Controller而不是直接指向jsp文件，仅此而已。<br />2). SignonForm.jsp，里面就是一个简单的form，其action就是第一个bean，即/shop/signon.do，最需要注意的是 signonForwardAction，其主要作用是forward到需要输入用户名和密码的那个页面上去，这个变量哪里来的呢？看看下面：<br />&#160;&#160;<pre class="overflow">&lt;bean id="secureHandlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"&gt;<br />&#160;&#160;&#160;&#160;&lt;property name="interceptors"&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&lt;list&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&lt;ref bean="signonInterceptor"/&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&lt;/list&gt;<br />&#160;&#160;&#160;&#160;&lt;/property&gt;<br />&#160;&#160;&#160;&#160;&lt;property name="urlMap"&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&lt;map&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&lt;entry key="/shop/editAccount.do"&gt;&lt;ref local="secure_editAccount"/&gt;&lt;/entry&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&lt;entry key="/shop/listOrders.do"&gt;&lt;ref local="secure_listOrders"/&gt;&lt;/entry&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&lt;entry key="/shop/newOrder.do"&gt;&lt;ref local="secure_newOrder"/&gt;&lt;/entry&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&lt;entry key="/shop/viewOrder.do"&gt;&lt;ref local="secure_viewOrder"/&gt;&lt;/entry&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&lt;/map&gt;<br />&#160;&#160;&#160;&#160;&lt;/property&gt;<br />&#160;&#160;&lt;/bean&gt;</pre><br />&#160;&#160;原来，上面的signonInterceptor实现了preHandle，因此在请求上面的map页面时，首先要经过这个Interceptor，看看 SignonInterceptor的源码，原来在其中为signon.jsp赋予一个signonForwardAction对象，呵呵，总算明白了。<br />3). 接下来去学习一下SignonController，其主体部分中可以看出，首先取出用户输入的username和password，然后到数据库中验证 有没有这个用户，如果没有这个用户，返回各错误页面；如果成功，首先生成一个UserSession对象，在request的session加入这个 userSession，注意这部分代码中给出了PagedListHolder分页的简单使用方法，关于分页显示，以后再学习吧。<br />3、登录成功后，就可以根据不同的用户设施不同的行为了，取得用户信息，无非就是从session取出userSession即可。<img src ="http://www.blogjava.net/rain1102/aggbug/88847.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2006-12-19 16:40 <a href="http://www.blogjava.net/rain1102/archive/2006/12/19/88847.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WSH(webwork+spring+hibernate)+mysql</title><link>http://www.blogjava.net/rain1102/archive/2006/12/19/88796.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Tue, 19 Dec 2006 06:55:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2006/12/19/88796.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/88796.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2006/12/19/88796.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/88796.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/88796.html</trackback:ping><description><![CDATA[<p>
				<font color="#006400">web.xml</font>
				<br />&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />&lt;!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "<a href="http://java.sun.com/dtd/web-app_2_3.dtd">http://java.sun.com/dtd/web-app_2_3.dtd</a>"&gt;<br />&lt;web-app&gt;<br />&#160;&#160;&#160; &lt;display-name&gt;Third Team&lt;/display-name&gt;</p>
		<p>&lt;!--&#160; &#160;&lt;filter&gt;<br />&#160;&#160;&lt;filter-name&gt;Set Character Encoding&lt;/filter-name&gt;<br />&#160;&#160;&lt;filter-class&gt;com.founder.study.forum.helper.FilterChar&lt;/filter-class&gt;<br />&#160;&#160;&lt;init-param&gt;<br />&#160;&#160;&#160;&lt;param-name&gt;encoding&lt;/param-name&gt;<br />&#160;&#160;&#160;&lt;param-value&gt;UTF-8&lt;/param-value&gt;<br />&#160;&#160;&lt;/init-param&gt;<br />&#160;&lt;/filter&gt;--&gt;<br />&#160;&#160;&#160; &lt;filter&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;filter-name&gt;webwork&lt;/filter-name&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;filter-class&gt;com.opensymphony.webwork.dispatcher.FilterDispatcher&lt;/filter-class&gt;<br />&#160;&#160;&#160; &lt;/filter&gt;<br />&lt;!--&#160;&#160; &lt;filter&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;filter-name&gt;sitemesh&lt;/filter-name&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;filter-class&gt;com.opensymphony.module.sitemesh.filter.PageFilter&lt;/filter-class&gt;<br />&#160;&#160;&#160; &lt;/filter&gt;</p>
		<p>&#160;&#160;&#160; &lt;filter-mapping&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;filter-name&gt;sitemesh&lt;/filter-name&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br />&#160;&#160;&#160; &lt;/filter-mapping&gt; <br />&#160;&lt;filter-mapping&gt;<br />&#160;&#160;&lt;filter-name&gt;Set Character Encoding&lt;/filter-name&gt;<br />&#160;&#160;&lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br />&#160;&lt;/filter-mapping&gt;--&gt;<br />&#160;&#160;&#160; &lt;filter-mapping&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;filter-name&gt;webwork&lt;/filter-name&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br />&#160;&#160;&#160; &lt;/filter-mapping&gt;</p>
		<p>&#160;&#160;&#160; &lt;listener&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;listener-class&gt;org.springframework.web.context.ContextLoaderListener&lt;/listener-class&gt;<br />&#160;&#160;&#160; &lt;/listener&gt;</p>
		<p>&#160;&#160;&#160; &lt;welcome-file-list&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;welcome-file&gt;index.jsp&lt;/welcome-file&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;welcome-file&gt;default.jsp&lt;/welcome-file&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;welcome-file&gt;index.html&lt;/welcome-file&gt;<br />&#160;&#160;&#160; &lt;/welcome-file-list&gt;<br />&#160;&#160;&#160; &lt;!--<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; This typically isn't required, as the taglib is included in webwork.jar.<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; If you really need a taglib configuration within web.xml, copy webwork/src/java/META-INF/taglib.tld<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; to the WEB-INF directory as webwork.tld.<br />&#160;&#160;&#160;&#160; --&gt;<br />&#160;&#160;&#160; &lt;taglib&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;taglib-uri&gt;webwork&lt;/taglib-uri&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;taglib-location&gt;/WEB-INF/lib/webwork-2.2.4.jar&lt;/taglib-location&gt;<br />&#160;&#160;&#160; &lt;/taglib&gt;<br />&#160;&#160;&#160; &lt;!-- &lt;taglib&gt;<br />&#160;&#160;&lt;taglib-uri&gt;sitemesh-decorator&lt;/taglib-uri&gt;<br />&#160;&#160;&lt;taglib-location&gt;/WEB-INF/sitemesh-decorator.tld&lt;/taglib-location&gt; <br />&#160;&lt;/taglib&gt;<br />&#160;&lt;taglib&gt; <br />&#160;&#160;&lt;taglib-uri&gt;sitemesh-page&lt;/taglib-uri&gt;<br />&#160;&#160;&lt;taglib-location&gt;/WEB-INF/sitemesh-page.tld&lt;/taglib-location&gt;<br />&#160;&lt;/taglib&gt;--&gt;<br />&lt;/web-app&gt;<br /><br /><font color="#006400">xwork.xml<br /><font color="#000000">&lt;!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.1.1//EN" "</font><a href="http://www.opensymphony.com/xwork/xwork-1.1.1.dtd"><font color="#000000">http://www.opensymphony.com/xwork/xwork-1.1.1.dtd</font></a></font><font color="#000000">"&gt;</font></p>
		<p>
				<font color="#006400">
						<font color="#000000">&lt;xwork&gt;<br />&#160;&lt;include file="webwork-default.xml" /&gt;<br />&#160;&#160;&#160; <br />&#160;&lt;package name="default" extends="webwork-default"&gt;<br />&#160;&#160;&#160;&#160; <br />&#160;&#160;&#160;&#160; &lt;interceptors&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;interceptor-stack name="modelParamsStack"&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;interceptor-ref name="model-driven" /&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;interceptor-ref name="params" /&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/interceptor-stack&gt;<br />&#160;&#160;&#160;&#160; &lt;/interceptors&gt;<br />&#160;&#160;&#160;&#160; <br />&#160;&#160;<br />&#160;&lt;/package&gt;<br />&lt;/xwork&gt;<br /></font>
						<br />
				</font>
				<font color="#006400">webwork.properties<br /></font>
				<font color="#000000">webwork.objectFactory = spring<br />webwork.devMode = true<br />webwork.tag.altSyntax=true<br />webwork.locale=zh_CN<br />webwork.i18n.encoding=UTF-8<br />webwork.custom.i18n.resources=com.founder.study.forum.resource.ApplicationResources<br /><br /></font>
				<font color="#006400">jdbc.properties<br /></font>
				<font color="#000000"># Properties file with JDBC-related settings.<br /># Applied by PropertyPlaceholderConfigurer from "applicationContext-*.xml".<br /># Targeted at system administrators, to avoid touching the context XML files.</font>
		</p>
		<p>
				<font color="#000000">jdbc.driverClassName=org.gjt.mm.mysql.Driver<br />jdbc.url=jdbc:mysql://localhost:3306/forum?useUnicode=true&amp;characterEncoding=utf-8<br />jdbc.username=root<br />jdbc.password=root</font>
		</p>
		<p>
				<br />
				<font color="#000000">hibernate.dialect=org.hibernate.dialect.MySQLDialect<br />hibernate.show_sql=true<br />hibernate.hbm2ddl.auto=update<br /><br /><font color="#006400">applicationContext.xml</font><br /></font>
		</p>
		<p>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />&lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "<a href="http://www.springframework.org/dtd/spring-beans.dtd">http://www.springframework.org/dtd/spring-beans.dtd</a>"&gt;</p>
		<p>&lt;beans default-autowire="byName"&gt;<br />&lt;!-- JDBC Config /author Jerome_mao--&gt;<br />&#160;&lt;bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"&gt;<br />&#160;&#160;&lt;property name="location" value="/WEB-INF/jdbc.properties" /&gt;<br />&#160;&lt;/bean&gt;<br />&lt;!-- Config DateSource /author Jerome_mao--&gt;<br />&#160;&lt;bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"&gt;<br />&#160;&#160;&lt;property name="driverClassName" value="${jdbc.driverClassName}" /&gt;<br />&#160;&#160;&lt;property name="url" value="${jdbc.url}" /&gt;<br />&#160;&#160;&lt;property name="username" value="${jdbc.username}" /&gt;<br />&#160;&#160;&lt;property name="password" value="${jdbc.password}" /&gt;<br />&#160;&lt;/bean&gt;</p>
		<p>&lt;bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean" singleton="true"&gt;<br />&#160;&lt;property name="dataSource"&gt;<br />&#160;&#160;&lt;ref local="dataSource" /&gt;<br />&#160;&lt;/property&gt;<br />&#160; &#160;&lt;property name="mappingResources"&gt;<br />&#160;&#160;&lt;list&gt;<br />&#160;&#160;&#160;&lt;value&gt;com/founder/study/forum/model/Threadgroups.hbm.xml&lt;/value&gt;<br />&#160;&#160;&#160;&lt;value&gt;com/founder/study/forum/model/User.hbm.xml&lt;/value&gt;<br />&#160;&#160;&#160;&lt;value&gt;com/founder/study/forum/model/Userrole.hbm.xml&lt;/value&gt;<br />&#160;&#160;&lt;/list&gt;<br />&#160;&lt;/property&gt; <br />&lt;property name="hibernateProperties"&gt;<br />&#160;&#160;&lt;props&gt;<br />&#160;&#160;&#160;&lt;prop key="hibernate.dialect"&gt;${hibernate.dialect}&lt;/prop&gt;<br />&#160;&#160;&#160;&lt;prop key="hibernate.show_sql"&gt;${hibernate.show_sql}&lt;/prop&gt;<br />&lt;!-- &#160;&#160;&lt;prop key="hibernate.hbm2ddl.auto"&gt;${hibernate.hbm2ddl.auto}&lt;/prop&gt;--&gt;<br />&#160;&#160;&lt;/props&gt;<br />&lt;/property&gt;&#160;<br />&lt;/bean&gt;<br />&#160;<br />&#160;&lt;!-- Hibernate transaction processing /author Jerome_mao--&gt;<br />&lt;bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"&gt;<br />&#160;&lt;property name="sessionFactory"&gt;<br />&#160;&#160;&lt;ref local="sessionFactory" /&gt;<br />&#160;&lt;/property&gt;<br />&lt;/bean&gt;</p>
		<p>&lt;!-- commerce logic service config --&gt;<br />&lt;!-- User Service&#160; /author Jerome_mao--&gt;<br />&lt;bean id="userService" class="com.founder.study.forum.service.impl.UserServiceImpl"&gt;<br />&#160;&lt;property name="userDAO"&gt;<br />&#160;&#160;&lt;ref bean="userDAO"/&gt;<br />&#160;&lt;/property&gt;<br />&lt;/bean&gt;<br />&lt;!-- Data persistent layer&#160; --&gt;<br />&lt;!-- User login&#160;&#160; /author Jerome_mao --&gt;<br />&lt;bean id="userDAO" class="com.founder.study.forum.dao.hibernate.UserDAOHibernate"&gt;<br />&#160;&lt;property name="sessionFactory"&gt;<br />&#160;&#160;&lt;ref local="sessionFactory" /&gt;<br />&#160;&lt;/property&gt;<br />&lt;/bean&gt;<br />&lt;bean id="forumService" class="com.founder.study.forum.service.impl.ForumServiceImpl"&gt;<br />&#160; &lt;property name="forumTypeDAO"&gt;<br />&#160;&#160;&#160; &lt;ref local="forumTypeDAO"/&gt;<br />&#160; &lt;/property&gt;<br />&lt;/bean&gt;<br />&lt;bean id="forumTypeDAO" class="com.founder.study.forum.dao.hibernate.ForumTypeDAOHibernate"&gt;<br />&#160; &lt;property name="sessionFactory"&gt;<br />&#160;&#160;&#160; &lt;ref local="sessionFactory"/&gt;<br />&#160; &lt;/property&gt;<br />&lt;/bean&gt;<br />&lt;bean id="messageService" class="com.founder.study.forum.service.impl.MessageServiceImpl"&gt;<br />&#160; &lt;property name="messageTypeDAO"&gt;<br />&#160;&#160;&#160; &lt;ref local="messageTypeDAO"/&gt;<br />&#160; &lt;/property&gt;<br />&lt;/bean&gt;<br />&lt;bean id="messageTypeDAO" class="com.founder.study.forum.dao.hibernate.MessageTypeDAOHibernate"&gt;<br />&#160;&#160; &lt;property name="sessionFactory"&gt;<br />&#160;&#160;&#160;&#160; &lt;ref local="sessionFactory"/&gt;<br />&#160;&#160; &lt;/property&gt;<br />&lt;/bean&gt;<br />&lt;bean id="adminService" class="com.founder.study.forum.service.impl.AdminServiceImpl"&gt;<br />&#160; &lt;property name="adminDAO"&gt;<br />&#160;&#160;&#160; &lt;ref local="adminDAO"/&gt;<br />&#160; &lt;/property&gt;<br />&lt;/bean&gt;<br />&lt;bean id="adminDAO" class="com.founder.study.forum.dao.hibernate.AdminDAOHibernate"&gt;<br />&#160;&#160; &lt;property name="sessionFactory"&gt;<br />&#160;&#160;&#160;&#160; &lt;ref local="sessionFactory"/&gt;<br />&#160;&#160; &lt;/property&gt;<br />&lt;/bean&gt;<br />&lt;/beans&gt;<br /></p><img src ="http://www.blogjava.net/rain1102/aggbug/88796.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2006-12-19 14:55 <a href="http://www.blogjava.net/rain1102/archive/2006/12/19/88796.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>配置浏览器（webwork－－config-browser.xml）</title><link>http://www.blogjava.net/rain1102/archive/2006/12/19/88681.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Tue, 19 Dec 2006 01:39:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2006/12/19/88681.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/88681.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2006/12/19/88681.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/88681.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/88681.html</trackback:ping><description><![CDATA[第一<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">、将webwork-configbrowser.jar文件放入WEB-INF/lib目录.<br />第二<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">、在xwork.xml中增加:&lt;include file="config-browser.xml"/&gt;<br />第三<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 12.0pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">、在velocity.properties中添加velocimacro.library属性.<br />&#160;&#160;&#160;&#160;&#160; velocimacro.library=webwork.vm,tigris-macros.vm<br />最后,启动服务器,浏览<a href="http://localhost:8080/config-browser/actionNames.action">http://localhost:8080/config-browser/actionNames.action</a></span></span></span><img src ="http://www.blogjava.net/rain1102/aggbug/88681.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2006-12-19 09:39 <a href="http://www.blogjava.net/rain1102/archive/2006/12/19/88681.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WebWork - webwork-default.xml</title><link>http://www.blogjava.net/rain1102/archive/2006/12/19/88671.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Tue, 19 Dec 2006 00:58:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2006/12/19/88671.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/88671.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2006/12/19/88671.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/88671.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/88671.html</trackback:ping><description><![CDATA[<p k2xpr="0" wicpm="0">A base configuration file named webwork-default.xml is included in the webwork jar file. This file may be included at the top of your xwork.xml file to include the standard configuration settings without having to copy them, like so:</p>
		<div class="code">
				<div class="codeContent">
						<pre class="code-xml" k2xpr="0" wicpm="6">
								<span class="code-tag" k2xpr="0" wicpm="0">&lt;!DOCTYPE xwork PUBLIC <span class="code-quote" k2xpr="0" wicpm="0">"-//OpenSymphony Group//XWork 1.0//EN"</span><span class="code-quote" k2xpr="0" wicpm="0">"http://www.opensymphony.com/xwork/xwork-1.0.dtd"</span>&gt;</span>
								<span class="code-tag" k2xpr="0" wicpm="0">&lt;xwork&gt;</span>
								<span class="code-tag" k2xpr="0" wicpm="2">&lt;include file=<span class="code-quote" k2xpr="0" wicpm="0">"webwork-default.xml"</span>/&gt;</span>
								<span class="code-tag" k2xpr="0" wicpm="2">&lt;package name=<span class="code-quote" k2xpr="0" wicpm="0">"default"</span> extends=<span class="code-quote" k2xpr="0" wicpm="0">"webwork-default"</span>&gt;</span>
    ...
    <span class="code-tag" k2xpr="0" wicpm="0">&lt;/package&gt;</span><span class="code-tag" k2xpr="0" wicpm="0">&lt;/xwork&gt;</span></pre>
				</div>
		</div>
		<p k2xpr="0" wicpm="0">The contents of webwork-default.xml are here:</p>
		<div class="code">
				<div class="codeContent">
						<pre class="code-xml">
								<span class="code-tag" k2xpr="0" wicpm="0">&lt;!DOCTYPE xwork PUBLIC <span class="code-quote" k2xpr="0" wicpm="0">"-//OpenSymphony Group//XWork 1.1.1//EN"</span><span class="code-quote" k2xpr="0" wicpm="0">"http://www.opensymphony.com/xwork/xwork-1.1.1.dtd"</span>&gt;</span>
								<span class="code-tag" k2xpr="0" wicpm="0">&lt;xwork&gt;</span>
								<span class="code-tag" k2xpr="0" wicpm="0">&lt;package name=<span class="code-quote" k2xpr="0" wicpm="0">"webwork-default"</span>&gt;</span>
								<span class="code-tag" k2xpr="0" wicpm="0">&lt;result-types&gt;</span>
								<span class="code-tag" k2xpr="0" wicpm="4">&lt;result-type name=<span class="code-quote" k2xpr="0" wicpm="0">"chain"</span> class=<span class="code-quote" k2xpr="0" wicpm="0">"com.opensymphony.xwork.ActionChainResult"</span>/&gt;</span>
								<span class="code-tag" k2xpr="0" wicpm="6">&lt;result-type name=<span class="code-quote" k2xpr="0" wicpm="0">"dispatcher"</span> class=<span class="code-quote" k2xpr="0" wicpm="0">"com.opensymphony.webwork.dispatcher.ServletDispatcherResult"</span> default=<span class="code-quote" k2xpr="0" wicpm="0">"true"</span>/&gt;</span>
								<span class="code-tag" k2xpr="0" wicpm="4">&lt;result-type name=<span class="code-quote" k2xpr="0" wicpm="0">"freemarker"</span> class=<span class="code-quote" k2xpr="0" wicpm="0">"com.opensymphony.webwork.views.freemarker.FreemarkerResult"</span>/&gt;</span>
								<span class="code-tag" k2xpr="0" wicpm="4">&lt;result-type name=<span class="code-quote" k2xpr="0" wicpm="0">"httpheader"</span> class=<span class="code-quote" k2xpr="0" wicpm="0">"com.opensymphony.webwork.dispatcher.HttpHeaderResult"</span>/&gt;</span>
								<span class="code-tag" k2xpr="0" wicpm="4">&lt;result-type name=<span class="code-quote" k2xpr="0" wicpm="0">"jasper"</span> class=<span class="code-quote" k2xpr="0" wicpm="0">"com.opensymphony.webwork.views.jasperreports.JasperReportsResult"</span>/&gt;</span>
								<span class="code-tag" k2xpr="0" wicpm="4">&lt;result-type name=<span class="code-quote" k2xpr="0" wicpm="0">"redirect"</span> class=<span class="code-quote" k2xpr="0" wicpm="0">"com.opensymphony.webwork.dispatcher.ServletRedirectResult"</span>/&gt;</span>
								<span class="code-tag" k2xpr="0" wicpm="4">&lt;result-type name=<span class="code-quote" k2xpr="0" wicpm="0">"redirect-action"</span> class=<span class="code-quote" k2xpr="0" wicpm="0">"com.opensymphony.webwork.dispatcher.ServletActionRedirectResult"</span>/&gt;</span>
								<span class="code-tag" k2xpr="0" wicpm="4">&lt;result-type name=<span class="code-quote" k2xpr="0" wicpm="0">"stream"</span> class=<span class="code-quote" k2xpr="0" wicpm="0">"com.opensymphony.webwork.dispatcher.StreamResult"</span>/&gt;</span>
								<span class="code-tag" k2xpr="0" wicpm="4">&lt;result-type name=<span class="code-quote" k2xpr="0" wicpm="0">"tiles"</span> class=<span class="code-quote" k2xpr="0" wicpm="0">"com.opensymphony.webwork.views.tiles.TilesResult"</span>/&gt;</span>
								<span class="code-tag" k2xpr="0" wicpm="4">&lt;result-type name=<span class="code-quote" k2xpr="0" wicpm="0">"velocity"</span> class=<span class="code-quote" k2xpr="0" wicpm="0">"com.opensymphony.webwork.dispatcher.VelocityResult"</span>/&gt;</span>
								<span class="code-tag" k2xpr="0" wicpm="4">&lt;result-type name=<span class="code-quote" k2xpr="0" wicpm="0">"<a class="kLink" oncontextmenu="return false;" id="KonaLink0" onmouseover="adlinkMouseOver(event,this,0);" style="POSITION: static; TEXT-DECORATION: underline! important" onclick="adlinkMouseClick(event,this,0);" onmouseout="adlinkMouseOut(event,this,0);" href="http://www.opensymphony.com/webwork/wikidocs/webwork-default.xml.html#" target="_top"><font style="FONT-WEIGHT: 400; FONT-SIZE: 11px; COLOR: blue! important; FONT-FAMILY: Courier; POSITION: static" color="blue"><span class="kLink" style="FONT-WEIGHT: 400; FONT-SIZE: 11px; COLOR: blue! important; FONT-FAMILY: Courier; POSITION: relative">xslt</span></font></a>"</span> class=<span class="code-quote" k2xpr="0" wicpm="0">"com.opensymphony.webwork.views.xslt.XSLTResult"</span>/&gt;</span>
								<span class="code-tag" k2xpr="0" wicpm="4">&lt;result-type name=<span class="code-quote" k2xpr="0" wicpm="0">"plaintext"</span> class=<span class="code-quote" k2xpr="0" wicpm="0">"com.opensymphony.webwork.dispatcher.PlainTextResult"</span> /&gt;</span>
								<span class="code-tag">
										<span class="code-comment" k2xpr="0" wicpm="0">&lt;!-- Results necessary when using 'browse server' and 'upload' feature of Richtexteditor --&gt;</span>
								</span>
								<span class="code-tag" k2xpr="0" wicpm="4">&lt;result-type name=<span class="code-quote" k2xpr="0" wicpm="0">"richtexteditorGetFolders"</span> class=<span class="code-quote" k2xpr="0" wicpm="0">"com.opensymphony.webwork.views.jsp.ui.RichtexteditorGetFoldersResult"</span> /&gt;</span>
								<span class="code-tag" k2xpr="0" wicpm="4">&lt;result-type name=<span class="code-quote" k2xpr="0" wicpm="0">"richtexteditorGetFoldersAndFiles"</span> class=<span class="code-quote" k2xpr="0" wicpm="0">"com.opensymphony.webwork.views.jsp.ui.RichtexteditorGetFoldersAndFilesResult"</span> /&gt;</span>
								<span class="code-tag" k2xpr="0" wicpm="4">&lt;result-type name=<span class="code-quote" k2xpr="0" wicpm="0">"richtexteditorCreateFolder"</span> class=<span class="code-quote" k2xpr="0" wicpm="0">"com.opensymphony.webwork.views.jsp.ui.RichtexteditorCreateFolderResult"</span> /&gt;</span>
								<span class="code-tag" k2xpr="0" wicpm="4">&lt;result-type name=<span class="code-quote" k2xpr="0" wicpm="0">"richtexteditorFileUpload"</span> class=<span class="code-quote" k2xpr="0" wicpm="0">"com.opensymphony.webwork.views.jsp.ui.RichtexteditorFileUploadResult"</span> /&gt;</span>
								<span class="code-tag" k2xpr="0" wicpm="0">&lt;/result-types&gt;</span>
								<span class="code-tag" k2xpr="0" wicpm="0">&lt;interceptors&gt;</span>
								<span class="code-tag" k2xpr="0" wicpm="4">&lt;interceptor name=<span class="code-quote" k2xpr="0" wicpm="0">"alias"</span> class=<span class="code-quote" k2xpr="0" wicpm="0">"com.opensymphony.xwork.interceptor.AliasInterceptor"</span>/&gt;</span>
								<span class="code-tag" k2xpr="0" wicpm="4">&lt;interceptor name=<span class="code-quote" k2xpr="0" wicpm="0">"autowiring"</span> class=<span class="code-quote" k2xpr="0" wicpm="0">"com.opensymphony.xwork.spring.interceptor.ActionAutowiringInterceptor"</span>/&gt;</span>
								<span class="code-tag" k2xpr="0" wicpm="4">&lt;interceptor name=<span class="code-quote" k2xpr="0" wicpm="0">"chain"</span> class=<span class="code-quote" k2xpr="0" wicpm="0">"com.opensymphony.xwork.interceptor.ChainingInterceptor"</span>/&gt;</span>
								<span class="code-tag" k2xpr="0" wicpm="4">&lt;interceptor name=<span class="code-quote" k2xpr="0" wicpm="0">"component"</span> class=<span class="code-quote" k2xpr="0" wicpm="0">"com.opensymphony.xwork.interceptor.component.ComponentInterceptor"</span>/&gt;</span>
								<span class="code-tag" k2xpr="0" wicpm="4">&lt;interceptor name=<span class="code-quote" k2xpr="0" wicpm="0">"conversionError"</span> class=<span class="code-quote" k2xpr="0" wicpm="0">"com.opensymphony.webwork.interceptor.WebWorkConversionErrorInterceptor"</span>/&gt;</span>
								<span class="code-tag" k2xpr="0" wicpm="4">&lt;interceptor name=<span class="code-quote" k2xpr="0" wicpm="0">"createSession"</span> class=<span class="code-quote" k2xpr="0" wicpm="0">"com.opensymphony.webwork.interceptor.CreateSessionInterceptor"</span> /&gt;</span>
								<span class="code-tag" k2xpr="0" wicpm="4">&lt;interceptor name=<span class="code-quote" k2xpr="0" wicpm="0">"debugging"</span> class=<span class="code-quote" k2xpr="0" wicpm="0">"com.opensymphony.webwork.interceptor.debugging.DebuggingInterceptor"</span> /&gt;</span>
								<span class="code-tag" k2xpr="0" wicpm="4">&lt;interceptor name=<span class="code-quote" k2xpr="0" wicpm="0">"external-ref"</span> class=<span class="code-quote" k2xpr="0" wicpm="0">"com.opensymphony.xwork.interceptor.ExternalReferencesInterceptor"</span>/&gt;</span>
								<span class="code-tag" k2xpr="0" wicpm="4">&lt;interceptor name=<span class="code-quote" k2xpr="0" wicpm="0">"execAndWait"</span> class=<span class="code-quote" k2xpr="0" wicpm="0">"com.opensymphony.webwork.interceptor.ExecuteAndWaitInterceptor"</span>/&gt;</span>
								<span class="code-tag" k2xpr="0" wicpm="4">&lt;interceptor name=<span class="code-quote" k2xpr="0" wicpm="0">"exception"</span> class=<span class="code-quote" k2xpr="0" wicpm="0">"com.opensymphony.xwork.interceptor.ExceptionMappingInterceptor"</span>/&gt;</span>
								<span class="code-tag" k2xpr="0" wicpm="4">&lt;interceptor name=<span class="code-quote" k2xpr="0" wicpm="0">"fileUpload"</span> class=<span class="code-quote" k2xpr="0" wicpm="0">"com.opensymphony.webwork.interceptor.FileUploadInterceptor"</span>/&gt;</span>
								<span class="code-tag" k2xpr="0" wicpm="4">&lt;interceptor name=<span class="code-quote" k2xpr="0" wicpm="0">"i18n"</span> class=<span class="code-quote" k2xpr="0" wicpm="0">"com.opensymphony.xwork.interceptor.I18nInterceptor"</span>/&gt;</span>
								<span class="code-tag" k2xpr="0" wicpm="4">&lt;interceptor name=<span class="code-quote" k2xpr="0" wicpm="0">"logger"</span> class=<span class="code-quote" k2xpr="0" wicpm="0">"com.opensymphony.xwork.interceptor.LoggingInterceptor"</span>/&gt;</span>
								<span class="code-tag" k2xpr="0" wicpm="4">&lt;interceptor name=<span class="code-quote" k2xpr="0" wicpm="0">"model-driven"</span> class=<span class="code-quote" k2xpr="0" wicpm="0">"com.opensymphony.xwork.interceptor.ModelDrivenInterceptor"</span>/&gt;</span>
								<span class="code-tag" k2xpr="0" wicpm="4">&lt;interceptor name=<span class="code-quote" k2xpr="0" wicpm="0">"params"</span> class=<span class="code-quote" k2xpr="0" wicpm="0">"com.opensymphony.xwork.interceptor.ParametersInterceptor"</span>/&gt;</span>
								<span class="code-tag" k2xpr="0" wicpm="4">&lt;interceptor name=<span class="code-quote" k2xpr="0" wicpm="0">"prepare"</span> class=<span class="code-quote" k2xpr="0" wicpm="0">"com.opensymphony.xwork.interceptor.PrepareInterceptor"</span>/&gt;</span>
								<span class="code-tag" k2xpr="0" wicpm="4">&lt;interceptor name=<span class="code-quote" k2xpr="0" wicpm="0">"static-params"</span> class=<span class="code-quote" k2xpr="0" wicpm="0">"com.opensymphony.xwork.interceptor.StaticParametersInterceptor"</span>/&gt;</span>
								<span class="code-tag" k2xpr="0" wicpm="4">&lt;interceptor name=<span class="code-quote" k2xpr="0" wicpm="0">"scope"</span> class=<span class="code-quote" k2xpr="0" wicpm="0">"com.opensymphony.webwork.interceptor.ScopeInterceptor"</span>/&gt;</span>
								<span class="code-tag" k2xpr="0" wicpm="4">&lt;interceptor name=<span class="code-quote" k2xpr="0" wicpm="0">"servlet-config"</span> class=<span class="code-quote" k2xpr="0" wicpm="0">"com.opensymphony.webwork.interceptor.ServletConfigInterceptor"</span>/&gt;</span>
								<span class="code-tag" k2xpr="0" wicpm="4">&lt;interceptor name=<span class="code-quote" k2xpr="0" wicpm="0">"sessionAutowiring"</span> class=<span class="code-quote" k2xpr="0" wicpm="0">"com.opensymphony.webwork.spring.interceptor.SessionContextAutowiringInterceptor"</span>/&gt;</span>
								<span class="code-tag" k2xpr="0" wicpm="4">&lt;interceptor name=<span class="code-quote" k2xpr="0" wicpm="0">"timer"</span> class=<span class="code-quote" k2xpr="0" wicpm="0">"com.opensymphony.xwork.interceptor.TimerInterceptor"</span>/&gt;</span>
								<span class="code-tag" k2xpr="0" wicpm="4">&lt;interceptor name=<span class="code-quote" k2xpr="0" wicpm="0">"token"</span> class=<span class="code-quote" k2xpr="0" wicpm="0">"com.opensymphony.webwork.interceptor.TokenInterceptor"</span>/&gt;</span>
								<span class="code-tag" k2xpr="0" wicpm="4">&lt;interceptor name=<span class="code-quote" k2xpr="0" wicpm="0">"token-session"</span> class=<span class="code-quote" k2xpr="0" wicpm="0">"com.opensymphony.webwork.interceptor.TokenSessionStoreInterceptor"</span>/&gt;</span>
								<span class="code-tag" k2xpr="0" wicpm="4">&lt;interceptor name=<span class="code-quote" k2xpr="0" wicpm="0">"validation"</span> class=<span class="code-quote" k2xpr="0" wicpm="0">"com.opensymphony.xwork.validator.ValidationInterceptor"</span>/&gt;</span>
								<span class="code-tag" k2xpr="0" wicpm="4">&lt;interceptor name=<span class="code-quote" k2xpr="0" wicpm="0">"<a class="kLink" oncontextmenu="return false;" id="KonaLink1" onmouseover="adlinkMouseOver(event,this,1);" style="POSITION: static; TEXT-DECORATION: underline! important" onclick="adlinkMouseClick(event,this,1);" onmouseout="adlinkMouseOut(event,this,1);" href="http://www.opensymphony.com/webwork/wikidocs/webwork-default.xml.html#" target="_top"><font style="FONT-WEIGHT: 400; FONT-SIZE: 11px; COLOR: blue! important; FONT-FAMILY: Courier; POSITION: static" color="blue"><span class="kLink" style="FONT-WEIGHT: 400; FONT-SIZE: 11px; COLOR: blue! important; FONT-FAMILY: Courier; POSITION: relative">workflow</span></font></a>"</span> class=<span class="code-quote" k2xpr="0" wicpm="0">"com.opensymphony.xwork.interceptor.DefaultWorkflowInterceptor"</span>/&gt;</span>
								<span class="code-tag">
										<span class="code-comment" k2xpr="0" wicpm="0">&lt;!-- Basic stack --&gt;</span>
								</span>
								<span class="code-tag" k2xpr="0" wicpm="0">&lt;interceptor-stack name=<span class="code-quote">"basicStack"</span>&gt;</span>
								<span class="code-tag">&lt;interceptor-ref name=<span class="code-quote">"exception"</span>/&gt;</span>
								<span class="code-tag">&lt;interceptor-ref name=<span class="code-quote">"servlet-config"</span>/&gt;</span>
								<span class="code-tag">&lt;interceptor-ref name=<span class="code-quote">"prepare"</span>/&gt;</span>
								<span class="code-tag">&lt;interceptor-ref name=<span class="code-quote">"static-params"</span>/&gt;</span>
								<span class="code-tag">&lt;interceptor-ref name=<span class="code-quote">"params"</span>/&gt;</span>
								<span class="code-tag">&lt;interceptor-ref name=<span class="code-quote">"conversionError"</span>/&gt;</span>
								<span class="code-tag">&lt;/interceptor-stack&gt;</span>
								<span class="code-tag">
										<span class="code-comment">&lt;!-- Sample validation and workflow stack --&gt;</span>
								</span>
								<span class="code-tag">&lt;interceptor-stack name=<span class="code-quote">"validationWorkflowStack"</span>&gt;</span>
								<span class="code-tag">&lt;interceptor-ref name=<span class="code-quote">"basicStack"</span>/&gt;</span>
								<span class="code-tag">&lt;interceptor-ref name=<span class="code-quote">"validation"</span>/&gt;</span>
								<span class="code-tag">&lt;interceptor-ref name=<span class="code-quote">"workflow"</span>/&gt;</span>
								<span class="code-tag">&lt;/interceptor-stack&gt;</span>
								<span class="code-tag">
										<span class="code-comment">&lt;!-- Sample file upload stack --&gt;</span>
								</span>
								<span class="code-tag">&lt;interceptor-stack name=<span class="code-quote">"fileUploadStack"</span>&gt;</span>
								<span class="code-tag">&lt;interceptor-ref name=<span class="code-quote">"fileUpload"</span>/&gt;</span>
								<span class="code-tag">&lt;interceptor-ref name=<span class="code-quote">"basicStack"</span>/&gt;</span>
								<span class="code-tag">&lt;/interceptor-stack&gt;</span>

            &lt;!-- Sample WebWork Inversion of Control stack
                 Note: WebWork's IoC is deprecated - please
                 look at alternatives such as Spring --&gt;
            <span class="code-tag">&lt;interceptor-stack name=<span class="code-quote">"componentStack"</span>&gt;</span><span class="code-tag">&lt;interceptor-ref name=<span class="code-quote">"component"</span>/&gt;</span><span class="code-tag">&lt;interceptor-ref name=<span class="code-quote">"basicStack"</span>/&gt;</span><span class="code-tag">&lt;/interceptor-stack&gt;</span><span class="code-tag"><span class="code-comment">&lt;!-- Sample model-driven stack  --&gt;</span></span><span class="code-tag">&lt;interceptor-stack name=<span class="code-quote">"modelDrivenStack"</span>&gt;</span><span class="code-tag">&lt;interceptor-ref name=<span class="code-quote">"model-driven"</span>/&gt;</span><span class="code-tag">&lt;interceptor-ref name=<span class="code-quote">"basicStack"</span>/&gt;</span><span class="code-tag">&lt;/interceptor-stack&gt;</span><span class="code-tag"><span class="code-comment">&lt;!-- Sample action chaining stack --&gt;</span></span><span class="code-tag">&lt;interceptor-stack name=<span class="code-quote">"chainStack"</span>&gt;</span><span class="code-tag">&lt;interceptor-ref name=<span class="code-quote">"chain"</span>/&gt;</span><span class="code-tag">&lt;interceptor-ref name=<span class="code-quote">"basicStack"</span>/&gt;</span><span class="code-tag">&lt;/interceptor-stack&gt;</span><span class="code-tag"><span class="code-comment">&lt;!-- Sample i18n stack --&gt;</span></span><span class="code-tag">&lt;interceptor-stack name=<span class="code-quote">"i18nStack"</span>&gt;</span><span class="code-tag">&lt;interceptor-ref name=<span class="code-quote">"i18n"</span>/&gt;</span><span class="code-tag">&lt;interceptor-ref name=<span class="code-quote">"basicStack"</span>/&gt;</span><span class="code-tag">&lt;/interceptor-stack&gt;</span>

            &lt;!-- Sample execute and wait stack.
                 Note: execAndWait should always be the *last* interceptor. --&gt;
            <span class="code-tag">&lt;interceptor-stack name=<span class="code-quote">"executeAndWaitStack"</span>&gt;</span><span class="code-tag">&lt;interceptor-ref name=<span class="code-quote">"basicStack"</span>/&gt;</span><span class="code-tag">&lt;interceptor-ref name=<span class="code-quote">"execAndWait"</span>/&gt;</span><span class="code-tag">&lt;/interceptor-stack&gt;</span>

            &lt;!-- An example of the params-prepare-params trick. This stack
                 is exactly the same as the defaultStack, except that it
                 includes one extra interceptor before the prepare interceptor:
                 the params interceptor.

                 This is useful for when you wish to apply parameters directly
                 to an object that you wish to load externally (such as a DAO
                 or database or service layer), but can't load that object
                 until at least the ID parameter has been loaded. By loading
                 the parameters twice, you can retrieve the object in the
                 prepare() method, allowing the second params interceptor to
                 apply the values on the object. --&gt;
            <span class="code-tag">&lt;interceptor-stack name=<span class="code-quote">"paramsPrepareParamsStack"</span>&gt;</span><span class="code-tag">&lt;interceptor-ref name=<span class="code-quote">"exception"</span>/&gt;</span><span class="code-tag">&lt;interceptor-ref name=<span class="code-quote">"alias"</span>/&gt;</span><span class="code-tag">&lt;interceptor-ref name=<span class="code-quote">"params"</span>/&gt;</span><span class="code-tag">&lt;interceptor-ref name=<span class="code-quote">"servlet-config"</span>/&gt;</span><span class="code-tag">&lt;interceptor-ref name=<span class="code-quote">"prepare"</span>/&gt;</span><span class="code-tag">&lt;interceptor-ref name=<span class="code-quote">"i18n"</span>/&gt;</span><span class="code-tag">&lt;interceptor-ref name=<span class="code-quote">"chain"</span>/&gt;</span><span class="code-tag">&lt;interceptor-ref name=<span class="code-quote">"model-driven"</span>/&gt;</span><span class="code-tag">&lt;interceptor-ref name=<span class="code-quote">"fileUpload"</span>/&gt;</span><span class="code-tag">&lt;interceptor-ref name=<span class="code-quote">"static-params"</span>/&gt;</span><span class="code-tag">&lt;interceptor-ref name=<span class="code-quote">"params"</span>/&gt;</span><span class="code-tag">&lt;interceptor-ref name=<span class="code-quote">"conversionError"</span>/&gt;</span><span class="code-tag">&lt;interceptor-ref name=<span class="code-quote">"validation"</span>&gt;</span><span class="code-tag">&lt;param name=<span class="code-quote">"excludeMethods"</span>&gt;</span>input,back,cancel<span class="code-tag">&lt;/param&gt;</span><span class="code-tag">&lt;/interceptor-ref&gt;</span><span class="code-tag">&lt;interceptor-ref name=<span class="code-quote">"workflow"</span>&gt;</span><span class="code-tag">&lt;param name=<span class="code-quote">"excludeMethods"</span>&gt;</span>input,back,cancel<span class="code-tag">&lt;/param&gt;</span><span class="code-tag">&lt;/interceptor-ref&gt;</span><span class="code-tag">&lt;/interceptor-stack&gt;</span>

            &lt;!-- A complete stack with all the common interceptors in place.
                 Generally, this stack should be the one you use, though it
                 may do more than you need. Also, the ordering can be
                 switched around (ex: if you wish to have your servlet-related
                 objects applied before prepare() is called, you'd need to move
                 servlet-config interceptor up.

                 This stack also excludes from the normal validation and workflow
                 the method names input, back, and cancel. These typically are
                 associated with requests that should not be validated.
                 --&gt;
            <span class="code-tag">&lt;interceptor-stack name=<span class="code-quote">"defaultStack"</span>&gt;</span><span class="code-tag">&lt;interceptor-ref name=<span class="code-quote">"exception"</span>/&gt;</span><span class="code-tag">&lt;interceptor-ref name=<span class="code-quote">"alias"</span>/&gt;</span><span class="code-tag">&lt;interceptor-ref name=<span class="code-quote">"servlet-config"</span>/&gt;</span><span class="code-tag">&lt;interceptor-ref name=<span class="code-quote">"prepare"</span>/&gt;</span><span class="code-tag">&lt;interceptor-ref name=<span class="code-quote">"i18n"</span>/&gt;</span><span class="code-tag">&lt;interceptor-ref name=<span class="code-quote">"chain"</span>/&gt;</span><span class="code-tag">&lt;interceptor-ref name=<span class="code-quote">"debugging"</span>/&gt;</span><span class="code-tag">&lt;interceptor-ref name=<span class="code-quote">"model-driven"</span>/&gt;</span><span class="code-tag">&lt;interceptor-ref name=<span class="code-quote">"fileUpload"</span>/&gt;</span><span class="code-tag">&lt;interceptor-ref name=<span class="code-quote">"static-params"</span>/&gt;</span><span class="code-tag">&lt;interceptor-ref name=<span class="code-quote">"params"</span>/&gt;</span><span class="code-tag">&lt;interceptor-ref name=<span class="code-quote">"conversionError"</span>/&gt;</span><span class="code-tag">&lt;interceptor-ref name=<span class="code-quote">"validation"</span>&gt;</span><span class="code-tag">&lt;param name=<span class="code-quote">"excludeMethods"</span>&gt;</span>input,back,cancel,browse<span class="code-tag">&lt;/param&gt;</span><span class="code-tag">&lt;/interceptor-ref&gt;</span><span class="code-tag">&lt;interceptor-ref name=<span class="code-quote">"workflow"</span>&gt;</span><span class="code-tag">&lt;param name=<span class="code-quote">"excludeMethods"</span>&gt;</span>input,back,cancel,browse<span class="code-tag">&lt;/param&gt;</span><span class="code-tag">&lt;/interceptor-ref&gt;</span><span class="code-tag">&lt;/interceptor-stack&gt;</span>

            &lt;!-- The completeStack is here for backwards compatibility for
                 applications that still refer to the defaultStack by the
                 old name --&gt;
            <span class="code-tag">&lt;interceptor-stack name=<span class="code-quote">"completeStack"</span>&gt;</span><span class="code-tag">&lt;interceptor-ref name=<span class="code-quote">"defaultStack"</span>/&gt;</span><span class="code-tag">&lt;/interceptor-stack&gt;</span><span class="code-tag">&lt;/interceptors&gt;</span><span class="code-tag">&lt;default-interceptor-ref name=<span class="code-quote">"defaultStack"</span>/&gt;</span><span class="code-tag">&lt;/package&gt;</span><span class="code-tag">&lt;/xwork&gt;</span></pre>
				</div>
		</div>
		<p>This file defines all of the default bundled results and interceptors and many interceptor stacks which you can use either as-is or as a basis for your own application-specific interceptor stacks. <b>Notice the name of the package is "webwork-default"</b>.</p><img src ="http://www.blogjava.net/rain1102/aggbug/88671.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2006-12-19 08:58 <a href="http://www.blogjava.net/rain1102/archive/2006/12/19/88671.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>webwok中property-driven与model-driven</title><link>http://www.blogjava.net/rain1102/archive/2006/12/14/87801.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Thu, 14 Dec 2006 12:17:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2006/12/14/87801.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/87801.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2006/12/14/87801.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/87801.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/87801.html</trackback:ping><description><![CDATA[<a>本文的前提是，你愿意将页面数据封装为一个对象（是否封装还得看实际情况，如果页面数据特别少也没这个必要）。<br /><br />封装页面数据是否使用ModelDrivenInterceptor有时候还真与个人使用习惯有点关系<br /><br />看下面的实现<span style="COLOR: rgb(255,0,0)">action1</span>:<br /><br />public class VoteAction implements Action, <span style="COLOR: rgb(255,0,0)">ModelDriven </span>{<br />。。。。。<br />&#160;&#160; /**<br />&#160;&#160;&#160;&#160; * 封装请求传入的信息<br />&#160;&#160;&#160;&#160; */<br />&#160;&#160;&#160; private Vote vote = new Vote();<br />。。。。。<br />/**<br />&#160;&#160;&#160;&#160; *<br />&#160;&#160;&#160;&#160; * @author weip<br />&#160;&#160;&#160;&#160; * @time 19:36:40 2006-5-14<br />&#160;&#160;&#160;&#160; * @return Object<br />&#160;&#160;&#160;&#160; */<br />&#160;&#160;&#160; public Object getModel() {<br /><br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; return vote;<br />&#160;&#160;&#160; }<br />}<br />一个使用ModelDrivenInterceptor的action<br /><br />还有另一种实现<span style="COLOR: rgb(255,0,0)">action2</span><br /><br />public class VoteAction implements Action{<br />。。。。。<br />&#160;&#160; /**<br />&#160;&#160;&#160;&#160; * 封装请求传入的信息<br />&#160;&#160;&#160;&#160; */<br />&#160;&#160;&#160; private Vote vote = new Vote();<br />。。。。。<br />/**<br />&#160;&#160;&#160;&#160; *<br />&#160;&#160;&#160;&#160; * @author weip<br />&#160;&#160;&#160;&#160; * @time 19:36:40 2006-5-14<br />&#160;&#160;&#160;&#160; * @return Object<br />&#160;&#160;&#160;&#160; */<br />&#160;&#160;&#160; public Object getVote () {<br /><br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; return vote;<br />&#160;&#160;&#160; }<br />}<br /><br />action1和action2效果完全一样，只不过实现起来还是有少许差别<br /><span style="COLOR: rgb(255,0,0)">1） action1 需要配置ModelDrivenInterceptor，且实现ModelDriven 接口（如果没有实现此接口，那么配置ModelDrivenInterceptor没有任何意义），页面的传值很简单&lt;input type="text" name="type" /&gt;</span><br style="COLOR: rgb(255,0,0)" /><span style="COLOR: rgb(255,0,0)">这样就可以将type的值注入到vote的type属性</span><br /><span style="COLOR: rgb(0,0,255)">2）action2不需要配置ModelDrivenInterceptor，但页面传值稍微麻烦一点</span><br style="COLOR: rgb(0,0,255)" /><span style="COLOR: rgb(0,0,255)">&lt;input type="text" name="vote.type" /&gt;</span><br /><br />如果使用form提交也无所谓，但如果使用url的方式就很累了。到底如何选择就要看情况了，好像也无关紧要</a><img src ="http://www.blogjava.net/rain1102/aggbug/87801.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2006-12-14 20:17 <a href="http://www.blogjava.net/rain1102/archive/2006/12/14/87801.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>优雅的解决web布局的问题 -- sitemesh的使用</title><link>http://www.blogjava.net/rain1102/archive/2006/12/14/87799.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Thu, 14 Dec 2006 12:12:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2006/12/14/87799.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/87799.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2006/12/14/87799.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/87799.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/87799.html</trackback:ping><description><![CDATA[<p>webwork的开发团队opensymphony提供了一种优雅的解决页面布局的方法sitemesh。<br />sitemesh应用Decorator模式，用filter截取request和response,把页面组件head,content,banner<br />结合为一个完整的视图。通常我们都是用include标签在每个jsp页面中来不断的包含各种header, <br />stylesheet, scripts and footer，现在，在sitemesh的帮助下，我们可以开心的删掉他们了</p>
		<p>下边是创建一个简单实例的步骤：<br />1，新建一个标准的web工程叫sitemesh<br />在WebRoot下新建一个index.jsp,内容如下<br /></p>
		<div style="BORDER-RIGHT: rgb(204,204,204) 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: rgb(204,204,204) 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: rgb(204,204,204) 1px solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: rgb(204,204,204) 1px solid; BACKGROUND-COLOR: rgb(238,238,238)">
				<span style="COLOR: rgb(0,128,128)">1</span>
				<a href="/Images/OutliningIndicators/None.gif" target="_blank">
						<img onmousewheel="return bbimg(this)" title="点击在新窗口查看原始图片" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" onload="java_script_:if(this.width&gt;500)this.width=500" align="top" border="0" />
				</a>
				<span style="COLOR: rgb(0,0,0)">&lt;%</span>
				<span style="COLOR: rgb(0,0,0)">@&#160;page&#160;contentType</span>
				<span style="COLOR: rgb(0,0,0)">=</span>
				<span style="COLOR: rgb(0,0,0)">"</span>
				<span style="COLOR: rgb(0,0,0)">text/html;&#160;charset=utf-8</span>
				<span style="COLOR: rgb(0,0,0)">"</span>
				<span style="COLOR: rgb(0,0,0)">%&gt;</span>
				<span style="COLOR: rgb(0,0,0)">
						<br />
				</span>
				<span style="COLOR: rgb(0,128,128)">2</span>
				<span style="COLOR: rgb(0,0,0)">
						<a href="/Images/OutliningIndicators/None.gif" target="_blank">
								<img onmousewheel="return bbimg(this)" title="点击在新窗口查看原始图片" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" onload="java_script_:if(this.width&gt;500)this.width=500" align="top" border="0" />
						</a>
				</span>
				<span style="COLOR: rgb(0,0,255)">this</span>
				<span style="COLOR: rgb(0,0,0)">&#160;is&#160;index.jsp.<br /></span>
				<span style="COLOR: rgb(0,128,128)">3</span>
				<span style="COLOR: rgb(0,0,0)">
						<a href="/Images/OutliningIndicators/None.gif" target="_blank">
								<img onmousewheel="return bbimg(this)" title="点击在新窗口查看原始图片" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" onload="java_script_:if(this.width&gt;500)this.width=500" align="top" border="0" />
						</a>it</span>
				<span style="COLOR: rgb(0,0,0)">'</span>
				<span style="COLOR: rgb(0,0,0)">s&#160;a&#160;simple&#160;page&#160;</span>
		</div>
		<p>接着在webRoot下新建几个目录<br />style2<br />login<br />shared<br />在login下建立目录style3<br />然後把index.jsp分别复制到style2，login/style3,shared下<br />现在访问下边的链接:<br /><a href="http://localhost:8080/sitemesh/index.jsp">http://localhost:8080/sitemesh/index.jsp</a><br /><a href="http://localhost:8080/sitemesh/style2/index.jsp">http://localhost:8080/sitemesh/style2/index.jsp</a><br /><a href="http://localhost:8080/sitemesh/login/style3/index.jsp">http://localhost:8080/sitemesh/login/style3/index.jsp</a><br /><a href="http://localhost:8080/sitemesh/shared/index.jsp">http://localhost:8080/sitemesh/shared/index.jsp</a><br />得到的结果是一样的，那我们如何让这四个相同的index.jsp有不同的样式呢。除了每个里边加入include<br />还有个解决办法，就是sitemesh<br />2,在<a href="http://www.opensymphony.com">http://www.opensymphony.com</a><a href="http://www.opensymphony.sourceforge.net"></a>下载sitemesh-2.2.1.jar,sitemesh-decorator.tld,sitemesh-page.tld<br />三个文件。<br />复制sitemesh.jar到WEB-INF/lib下，<br />复制sitemesh-decorator.tld,sitemesh-page.tld到WEB-INF下<br />把下边这部分加入web.xml<br />------------------------------------------------------------------------------<br />&lt;filter&gt;<br />&#160; &lt;filter-name&gt;sitemesh&lt;/filter-name&gt;<br />&#160; &lt;filter-class&gt;com.opensymphony.module.sitemesh.filter.PageFilter&lt;/filter-class&gt;<br />&lt;/filter&gt;</p>
		<p>&lt;filter-mapping&gt;<br />&#160; &lt;filter-name&gt;sitemesh&lt;/filter-name&gt;<br />&#160; &lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br />&lt;/filter-mapping&gt;</p>
		<p>&lt;taglib&gt;<br />&#160; &lt;taglib-uri&gt;sitemesh-decorator&lt;/taglib-uri&gt;<br />&#160; &lt;taglib-location&gt;/WEB-INF/sitemesh-decorator.tld&lt;/taglib-location&gt;<br />&lt;/taglib&gt;</p>
		<p>&lt;taglib&gt;<br />&#160; &lt;taglib-uri&gt;sitemesh-page&lt;/taglib-uri&gt;<br />&#160; &lt;taglib-location&gt;/WEB-INF/sitemesh-page.tld&lt;/taglib-location&gt;<br />&lt;/taglib&gt;<br />--------------------------------------------------------------------------------<br />在WEB-INF下建立一个decorators.xml，内容如下<br />excludes代表不使用的部分<br />其它三个是匹配url，使用style<br />--------------------------------------------------------------------------<br />&lt;decorators defaultdir="/decorators"&gt;<br />&#160;&#160;&#160; &lt;excludes&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;pattern&gt;/shared/*&lt;/pattern&gt;&#160;&#160;&#160; <br />&#160;&#160;&#160; &lt;/excludes&gt;<br />&#160;&#160;&#160; &lt;decorator name="style1" page="style1.jsp"&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;pattern&gt;/*&lt;/pattern&gt;<br />&#160;&#160;&#160; &lt;/decorator&gt;<br />&#160;&#160;&#160; &lt;decorator name="style2" page="style2.jsp"&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;pattern&gt;/style2/*&lt;/pattern&gt;<br />&#160;&#160;&#160; &lt;/decorator&gt;<br />&#160;&#160;&#160; <br />&#160;&#160;&#160; &lt;decorator name="style3" page="style3.jsp"&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;pattern&gt;/*/style3/*&lt;/pattern&gt;<br />&#160;&#160;&#160; &lt;/decorator&gt;<br />&lt;/decorators&gt;<br />--------------------------------------------------------------------------<br />在WebRoot下新建一个目录decorators<br />然後在下边建立三个jsp文件,内容如下<br />------------------------------------------------------------------<br />&lt;%@ page contentType="text/html; charset=utf-8"%&gt;<br />&lt;%@ taglib uri="sitemesh-decorator" prefix="decorator" %&gt;<br />&lt;html&gt;<br />&#160; &lt;head&gt;<br />&#160;&#160;&#160; &lt;title&gt;&lt;decorator:title default="装饰器页面..." /&gt;&lt;/title&gt;<br />&#160;&#160;&#160; &lt;decorator:head /&gt;<br />&#160; &lt;/head&gt;<br />&#160; &lt;body&gt;<br />&#160;&#160;&#160; &lt;p&gt;&lt;font color="red"&gt;this is style2's header&lt;/font&gt;&lt;/p&gt;<br />&#160;&#160;&#160; &lt;hr&gt;<br />&#160;&#160;&#160; &lt;decorator:body /&gt;<br />&#160;&#160;&#160; &lt;hr&gt;<br />&#160;&#160;&#160; &lt;p&gt;&lt;font color="red"&gt;this is style1's footer&lt;/font&gt;&lt;/p&gt;<br />&#160; &lt;/body&gt;<br />&lt;/html&gt;<br />------------------------------------------------------------------</p>
		<p>&lt;%@ page contentType="text/html; charset=utf-8"%&gt;<br />&lt;%@ taglib uri="sitemesh-decorator" prefix="decorator" %&gt;</p>
		<p>&lt;html&gt;<br />&#160; &lt;head&gt;<br />&#160;&#160;&#160; &lt;title&gt;&lt;decorator:title default="装饰器页面..." /&gt;&lt;/title&gt;<br />&#160;&#160;&#160; &lt;decorator:head /&gt;<br />&#160; &lt;/head&gt;<br />&#160; &lt;body&gt;<br />&#160;&#160;&#160; &lt;p&gt;&lt;font color="green"&gt;this is style2's header&lt;/font&gt;&lt;/p&gt;<br />&#160;&#160;&#160; &lt;hr&gt;<br />&#160;&#160;&#160; &lt;decorator:body /&gt;<br />&#160;&#160;&#160; &lt;hr&gt;<br />&#160;&#160;&#160; &lt;p&gt;&lt;font color="green"&gt;this is style2's footer&lt;/font&gt;&lt;/p&gt;<br />&#160; &lt;/body&gt;<br />&lt;/html&gt;</p>
		<p>------------------------------------------------------------------<br />&lt;%@ page contentType="text/html; charset=utf-8"%&gt;<br />&lt;%@ taglib uri="sitemesh-decorator" prefix="decorator" %&gt;</p>&lt;html&gt;<br />&#160; &lt;head&gt;<br />&#160;&#160;&#160; &lt;title&gt;&lt;decorator:title default="装饰器页面..." /&gt;&lt;/title&gt;<br />&#160;&#160;&#160; &lt;decorator:head /&gt;<br />&#160; &lt;/head&gt;<br />&#160; &lt;body&gt;<br />&#160;&#160;&#160; &lt;p&gt;&lt;font color="blue"&gt;this is style3's header&lt;/font&gt;&lt;/p&gt;<br />&#160;&#160;&#160; &lt;hr&gt;<br />&#160;&#160;&#160; &lt;decorator:body /&gt;<br />&#160;&#160;&#160; &lt;hr&gt;<br />&#160;&#160;&#160; &lt;p&gt;&lt;font color="blue"&gt;this is style3's footer&lt;/font&gt;&lt;/p&gt;<br />&#160; &lt;/body&gt;<br />&lt;/html&gt;<br />------------------------------------------------------------------<br />再次访问<br /><a href="http://localhost:8080/sitemesh/index.jsp">http://localhost:8080/sitemesh/index.jsp</a><br /><a href="http://localhost:8080/sitemesh/style2/index.jsp">http://localhost:8080/sitemesh/style2/index.jsp</a><br /><a href="http://localhost:8080/sitemesh/login/style3/index.jsp">http://localhost:8080/sitemesh/login/style3/index.jsp</a><br /><a href="http://localhost:8080/sitemesh/shared/index.jsp">http://localhost:8080/sitemesh/shared/index.jsp</a><br />看到变化了吧。这只是个简单的展示，仔细思考一下你的需求，你能作出更好的布局方式。<br />sitemesh真不错。重要是学习简单20分种就搞定了<img src ="http://www.blogjava.net/rain1102/aggbug/87799.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2006-12-14 20:12 <a href="http://www.blogjava.net/rain1102/archive/2006/12/14/87799.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WebWork教程- Interceptor(拦截器)</title><link>http://www.blogjava.net/rain1102/archive/2006/12/14/87781.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Thu, 14 Dec 2006 11:16:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2006/12/14/87781.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/87781.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2006/12/14/87781.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/87781.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/87781.html</trackback:ping><description><![CDATA[<div style="MARGIN: 17pt 0cm 16.5pt">
				<strong>
						<font size="6">
								<span style="FONT-SIZE: 9pt; LINE-HEIGHT: 240%">WebWork</span>
								<span style="FONT-SIZE: 9pt; LINE-HEIGHT: 240%">教程</span>
								<span style="FONT-SIZE: 9pt; LINE-HEIGHT: 240%">- Interceptor(</span>
								<span style="FONT-SIZE: 9pt; LINE-HEIGHT: 240%">拦截器</span>
								<span style="FONT-SIZE: 9pt; LINE-HEIGHT: 240%">)</span>
						</font>
				</strong>
		</div>
		<div>
				<span style="FONT-SIZE: 9pt">Interceptor</span>
				<span style="FONT-SIZE: 9pt">（拦截器）将</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">共用的行为独立出来，在</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">执行前后运行。这也就是我们所说的</span>
				<span style="FONT-SIZE: 9pt">AOP</span>
				<span style="FONT-SIZE: 9pt">（</span>
				<span style="FONT-SIZE: 9pt">Aspect Oriented Programming</span>
				<span style="FONT-SIZE: 9pt">，面向切面编程），它是分散关注的编程方法，它将通用需求功能从不相关类之中分离出来；同时，能够使得很多类共享一个行为，一旦行为发生变化，不必修改很多类，只要修改这个行为就可以。</span>
		</div>
		<div>&#160;</div>
		<div>
				<span style="FONT-SIZE: 9pt">Interceptor</span>
				<span style="FONT-SIZE: 9pt">将很多功能从我们的</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">中独立出来，大量减少了我们</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">的代码，独立出来的行为具有很好的重用性。</span>
				<span style="FONT-SIZE: 9pt">XWork</span>
				<span style="FONT-SIZE: 9pt">、</span>
				<span style="FONT-SIZE: 9pt">WebWork</span>
				<span style="FONT-SIZE: 9pt">的许多功能都是有</span>
				<span style="FONT-SIZE: 9pt">Interceptor</span>
				<span style="FONT-SIZE: 9pt">实现，可以在配置文件中组装</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">用到的</span>
				<span style="FONT-SIZE: 9pt">Interceptor</span>
				<span style="FONT-SIZE: 9pt">，它会按照你指定的顺序，在</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">执行前后运行。</span>
				<span style="FONT-SIZE: 9pt">Interceptor</span>
				<span style="FONT-SIZE: 9pt">在框架中的应用如下图所示</span>
		</div>
		<div>&#160;</div>
		<div>&#160;</div>
		<div>
				<span style="FONT-SIZE: 9pt">当你提交对</span>
				<span style="FONT-SIZE: 9pt">Aciton</span>
				<span style="FONT-SIZE: 9pt">（默认是</span>
				<span style="FONT-SIZE: 9pt">.action</span>
				<span style="FONT-SIZE: 9pt">结尾的</span>
				<span style="FONT-SIZE: 9pt">Url</span>
				<span style="FONT-SIZE: 9pt">）的请求时，</span>
				<span style="FONT-SIZE: 9pt">ServletDispatcher</span>
				<span style="FONT-SIZE: 9pt">会根据你的请求，去调度并执行相应的</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">。在</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">执行之前，调用被</span>
				<span style="FONT-SIZE: 9pt"> Interceptor</span>
				<span style="FONT-SIZE: 9pt">截取，</span>
				<span style="FONT-SIZE: 9pt">Interceptor</span>
				<span style="FONT-SIZE: 9pt">在</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">执行前后运行。</span>
		</div>
		<div>&#160;</div>
		<div>
				<span style="FONT-SIZE: 9pt">我们在用户注册的例子中就使用了取得</span>
				<span style="FONT-SIZE: 9pt">Request</span>
				<span style="FONT-SIZE: 9pt">请求参数的拦截器，配置文件中</span>
				<span style="FONT-SIZE: 9pt">&lt;interceptor-ref name="params"/&gt;</span>
				<span style="FONT-SIZE: 9pt">将拦截器</span>
				<span style="FONT-SIZE: 9pt">params</span>
				<span style="FONT-SIZE: 9pt">组装到</span>
				<span style="FONT-SIZE: 9pt">RegisterAction</span>
				<span style="FONT-SIZE: 9pt">中。&#8220;</span>
				<span style="FONT-SIZE: 9pt">params</span>
				<span style="FONT-SIZE: 9pt">&#8221;在我们的</span>
				<span style="FONT-SIZE: 9pt">webwork-default.xml</span>
				<span style="FONT-SIZE: 9pt">配置文件中有定义，</span>
				<span style="FONT-SIZE: 9pt">webwork-default.xml</span>
				<span style="FONT-SIZE: 9pt">中拦截器的定义如下：</span>
		</div>
		<div>&#160;</div>
		<div>
				<span style="FONT-SIZE: 9pt">&lt;interceptors&gt;</span>
		</div>
		<div>
				<span style="FONT-SIZE: 9pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;interceptor name="timer" class="com.opensymphony.xwork.interceptor.TimerInterceptor"/&gt;</span>
		</div>
		<div>
				<span style="FONT-SIZE: 9pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;interceptor name="logger" class="com.opensymphony.xwork.interceptor.LoggingInterceptor"/&gt;</span>
		</div>
		<div>
				<span style="FONT-SIZE: 9pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;interceptor name="chain" class="com.opensymphony.xwork.interceptor.ChainingInterceptor"/&gt;</span>
		</div>
		<div>
				<span style="FONT-SIZE: 9pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;interceptor name="static-params" class="com.opensymphony.xwork.interceptor.StaticParametersInterceptor"/&gt;</span>
		</div>
		<div>
				<span style="FONT-SIZE: 9pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;interceptor name="params" class="com.opensymphony.xwork.interceptor.ParametersInterceptor"/&gt;</span>
		</div>
		<div>
				<span style="FONT-SIZE: 9pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;interceptor name="model-driven" class="com.opensymphony.xwork.interceptor.ModelDrivenInterceptor"/&gt;</span>
		</div>
		<div>
				<span style="FONT-SIZE: 9pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;interceptor name="component" class="com.opensymphony.xwork.interceptor.component.ComponentInterceptor"/&gt;</span>
		</div>
		<div>
				<span style="FONT-SIZE: 9pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;interceptor name="token" class="com.opensymphony.webwork.interceptor.TokenInterceptor"/&gt;</span>
		</div>
		<div>
				<span style="FONT-SIZE: 9pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;interceptor name="token-session" class="com.opensymphony.webwork.interceptor.TokenSessionStoreInterceptor"/&gt;</span>
		</div>
		<div>
				<span style="FONT-SIZE: 9pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;interceptor name="validation" class="com.opensymphony.xwork.validator.ValidationInterceptor"/&gt;</span>
		</div>
		<div>
				<span style="FONT-SIZE: 9pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;interceptor name="workflow" class="com.opensymphony.xwork.interceptor.DefaultWorkflowInterceptor"/&gt;</span>
		</div>
		<div>
				<span style="FONT-SIZE: 9pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;interceptor name="servlet-config" class="com.opensymphony.webwork.interceptor.ServletConfigInterceptor"/&gt;</span>
		</div>
		<div>
				<span style="FONT-SIZE: 9pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;interceptor name="prepare" class="com.opensymphony.xwork.interceptor.PrepareInterceptor"/&gt;</span>
		</div>
		<div>
				<span style="FONT-SIZE: 9pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;interceptor name="conversionError" class="com.opensymphony.webwork.interceptor.WebWorkConversionErrorInterceptor"/&gt;</span>
		</div>
		<div>
				<span style="FONT-SIZE: 9pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;interceptor-stack name="defaultStack"&gt;</span>
		</div>
		<div>
				<span style="FONT-SIZE: 9pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;interceptor-ref name="static-params"/&gt;</span>
		</div>
		<div>
				<span style="FONT-SIZE: 9pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;interceptor-ref name="params"/&gt;</span>
		</div>
		<div>
				<span style="FONT-SIZE: 9pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;interceptor-ref name="conversionError"/&gt;</span>
		</div>
		<div>
				<span style="FONT-SIZE: 9pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/interceptor-stack&gt;</span>
		</div>
		<div>
				<span style="FONT-SIZE: 9pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;interceptor-stack name="validationWorkflowStack"&gt;</span>
		</div>
		<div>
				<span style="FONT-SIZE: 9pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;interceptor-ref name="defaultStack"/&gt;</span>
		</div>
		<div>
				<span style="FONT-SIZE: 9pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;interceptor-ref name="validation"/&gt;</span>
		</div>
		<div>
				<span style="FONT-SIZE: 9pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;interceptor-ref name="workflow"/&gt;</span>
		</div>
		<div>
				<span style="FONT-SIZE: 9pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/interceptor-stack&gt;</span>
		</div>
		<div>
				<span style="FONT-SIZE: 9pt">&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/interceptors&gt;</span>
		</div>
		<div>
				<span style="FONT-SIZE: 9pt">这些都时有框架提供的默认的</span>
				<span style="FONT-SIZE: 9pt">Interceptor</span>
				<span style="FONT-SIZE: 9pt">，下面我来看看</span>
				<span style="FONT-SIZE: 9pt">Interceptor</span>
				<span style="FONT-SIZE: 9pt">使用的步骤：</span>
		</div>
		<div style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt">
				<span style="FONT-SIZE: 9pt">1、<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&#160;&#160; </span></span>
				<span style="FONT-SIZE: 9pt">创建一个自己需要的</span>
				<span style="FONT-SIZE: 9pt">Interceptor</span>
				<span style="FONT-SIZE: 9pt">类，它必需实现</span>
				<span style="FONT-SIZE: 9pt">
						<br />com.opensymphony.xwork.interceptor.Interceptor</span>
				<span style="FONT-SIZE: 9pt">接口，具体的开发见下面的</span>
				<span style="FONT-SIZE: 9pt">Interceptor</span>
				<span style="FONT-SIZE: 9pt">的原理。</span>
		</div>
		<div style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt">
				<span style="FONT-SIZE: 9pt">2、<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&#160;&#160; </span></span>
				<span style="FONT-SIZE: 9pt">在配置文件（</span>
				<span style="FONT-SIZE: 9pt">xwork..xml</span>
				<span style="FONT-SIZE: 9pt">）中申明这个</span>
				<span style="FONT-SIZE: 9pt">Interceptor</span>
				<span style="FONT-SIZE: 9pt">类，它放在标签</span>
				<span style="FONT-SIZE: 9pt">&lt;interceptor /&gt;</span>
				<span style="FONT-SIZE: 9pt">中，同是</span>
				<span style="FONT-SIZE: 9pt">&lt;interceptor /&gt;</span>
				<span style="FONT-SIZE: 9pt">标签嵌入在</span>
				<span style="FONT-SIZE: 9pt">&lt;interceptors /&gt;</span>
				<span style="FONT-SIZE: 9pt">标签内部。</span>
		</div>
		<div style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt">
				<span style="FONT-SIZE: 9pt">3、<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&#160;&#160; </span></span>
				<span style="FONT-SIZE: 9pt">创建</span>
				<span style="FONT-SIZE: 9pt">Interceptor</span>
				<span style="FONT-SIZE: 9pt">栈，使用标签：</span>
				<span style="FONT-SIZE: 9pt">&lt;interceptor-stack&#160;/&gt;</span>
				<span style="FONT-SIZE: 9pt">，</span>
				<span style="FONT-SIZE: 9pt">让一组</span>
				<span style="FONT-SIZE: 9pt">Interceptor</span>
				<span style="FONT-SIZE: 9pt">可以按次序调用。（可选）</span>
		</div>
		<div style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt">
				<span style="FONT-SIZE: 9pt">4、<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&#160;&#160; </span></span>
				<span style="FONT-SIZE: 9pt">指定</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">所要用到的</span>
				<span style="FONT-SIZE: 9pt">Interceptor</span>
				<span style="FONT-SIZE: 9pt">（前面申明过的），可以用</span>
				<span style="FONT-SIZE: 9pt">&lt;interceptor-ref /&gt;</span>
				<span style="FONT-SIZE: 9pt">或</span>
				<span style="FONT-SIZE: 9pt">&lt;default-interceptor-ref /&gt;</span>
				<span style="FONT-SIZE: 9pt">标签。前面的标签指定某个</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">所用到的</span>
				<span style="FONT-SIZE: 9pt">Interceptor</span>
				<span style="FONT-SIZE: 9pt">，如果</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">没有被用</span>
				<span style="FONT-SIZE: 9pt">&lt;interceptor-ref /&gt;</span>
				<span style="FONT-SIZE: 9pt">指定</span>
				<span style="FONT-SIZE: 9pt">Interceptor</span>
				<span style="FONT-SIZE: 9pt">，它将使用</span>
				<span style="FONT-SIZE: 9pt">&lt;default-interceptor-ref /&gt;</span>
				<span style="FONT-SIZE: 9pt">指定的</span>
				<span style="FONT-SIZE: 9pt">Interceptor</span>
				<span style="FONT-SIZE: 9pt">。</span>
		</div>
		<div>
				<span style="FONT-SIZE: 9pt">框架中给我们提供了很多实用的</span>
				<span style="FONT-SIZE: 9pt">Interceptor</span>
				<span style="FONT-SIZE: 9pt">，它的定义上面已经给出，它的具体功能如下：</span>
		</div>
		<div style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt">
				<span style="FONT-SIZE: 9pt">l<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span></span>
				<span style="FONT-SIZE: 9pt">timer</span>
				<span style="FONT-SIZE: 9pt">：记录</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">执行的时间，并做为日志信息输出；</span>
		</div>
		<div style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt">
				<span style="FONT-SIZE: 9pt">l<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span></span>
				<span style="FONT-SIZE: 9pt">logger</span>
				<span style="FONT-SIZE: 9pt">：在日志信息中输出要执行的</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">信息；</span>
		</div>
		<div style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt">
				<span style="FONT-SIZE: 9pt">l<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span></span>
				<span style="FONT-SIZE: 9pt">chain</span>
				<span style="FONT-SIZE: 9pt">：将前一个执行结束的</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">属性设置到当前的</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">中。它被用在</span>
				<span style="FONT-SIZE: 9pt">ResultType</span>
				<span style="FONT-SIZE: 9pt">为&#8220;</span>
				<span style="FONT-SIZE: 9pt">chain</span>
				<span style="FONT-SIZE: 9pt">&#8221;指定结果的</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">中，该结果</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">对象会从</span>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">OgnlValueStack</span>
				<span style="FONT-SIZE: 9pt">中获得前一个</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">对应的属性，它实现</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">链之间的数据传递；</span>
		</div>
		<div style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt">
				<span style="FONT-SIZE: 9pt">l<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span></span>
				<span style="FONT-SIZE: 9pt">static-params</span>
				<span style="FONT-SIZE: 9pt">：将</span>
				<span style="FONT-SIZE: 9pt">xwork.xml</span>
				<span style="FONT-SIZE: 9pt">配置文件里定义的</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">参数，设置到对应的</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">中。</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">参数使用</span>
				<span style="FONT-SIZE: 9pt">&lt;param /&gt;</span>
				<span style="FONT-SIZE: 9pt">标签，是</span>
				<span style="FONT-SIZE: 9pt">&lt;action /&gt;</span>
				<span style="FONT-SIZE: 9pt">标签的直接子元素。我们这里定义的</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">类必需实现</span>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">com.opensymphony.xwork.config.entities</span>
				<span style="FONT-SIZE: 9pt">.<span style="BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial"> Parameterizable</span></span>
				<span style="FONT-SIZE: 9pt">接口；</span>
		</div>
		<div style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt">
				<span style="FONT-SIZE: 9pt">l<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span></span>
				<span style="FONT-SIZE: 9pt">params</span>
				<span style="FONT-SIZE: 9pt">：将</span>
				<span style="FONT-SIZE: 9pt">Request</span>
				<span style="FONT-SIZE: 9pt">请求的参数设置到相应</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">对象的属性中，用户注册例子用到过这个拦截器；</span>
		</div>
		<div style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt">
				<span style="FONT-SIZE: 9pt">l<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span></span>
				<span style="FONT-SIZE: 9pt">model-driven</span>
				<span style="FONT-SIZE: 9pt">：如果</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">实现</span>
				<span style="FONT-SIZE: 9pt">ModelDriven</span>
				<span style="FONT-SIZE: 9pt">接口，它将</span>
				<span style="FONT-SIZE: 9pt">getModel()</span>
				<span style="FONT-SIZE: 9pt">取得的模型对象存入</span>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">OgnlValueStack</span>
				<span style="FONT-SIZE: 9pt">中；</span>
		</div>
		<div style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt">
				<span style="FONT-SIZE: 9pt">l<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span></span>
				<span style="FONT-SIZE: 9pt">component</span>
				<span style="FONT-SIZE: 9pt">：激活组件功能支持，让注册过的组件在当前</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">中可用，即为</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">提供</span>
				<span style="FONT-SIZE: 9pt">IoC</span>
				<span style="FONT-SIZE: 9pt">（依赖倒转控制）框架的支持；</span>
		</div>
		<div style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt">
				<span style="FONT-SIZE: 9pt">l<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span></span>
				<span style="FONT-SIZE: 9pt">token</span>
				<span style="FONT-SIZE: 9pt">：核对当前</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">请求（</span>
				<span style="FONT-SIZE: 9pt">request</span>
				<span style="FONT-SIZE: 9pt">）的有效标识，防止重复提交</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">请求</span>
				<span style="FONT-SIZE: 9pt">(request)</span>
				<span style="FONT-SIZE: 9pt">。</span>
		</div>
		<div style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt">
				<span style="FONT-SIZE: 9pt">l<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span></span>
				<span style="FONT-SIZE: 9pt">token-session</span>
				<span style="FONT-SIZE: 9pt">：功能同上，但是当提交无效的</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">请求标识时，它会将请求数据保存到</span>
				<span style="FONT-SIZE: 9pt">session</span>
				<span style="FONT-SIZE: 9pt">中。</span>
		</div>
		<div style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt">
				<span style="FONT-SIZE: 9pt">l<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span></span>
				<span style="FONT-SIZE: 9pt">validation</span>
				<span style="FONT-SIZE: 9pt">：实现使用</span>
				<span style="FONT-SIZE: 9pt">xml</span>
				<span style="FONT-SIZE: 9pt">配置文件（</span>
				<span style="FONT-SIZE: 9pt">{Action}-validation.xml</span>
				<span style="FONT-SIZE: 9pt">）对</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">属性值进行验证，详细请看后面介绍的验证框架。</span>
		</div>
		<div style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt">
				<span style="FONT-SIZE: 9pt">l<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span></span>
				<span style="FONT-SIZE: 9pt">workflow</span>
				<span style="FONT-SIZE: 9pt">：调用</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">类的验证功能，假设</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">使用</span>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">ValidationAware</span>
				<span style="FONT-SIZE: 9pt">实现验证（</span>
				<span style="FONT-SIZE: 9pt">ActionSupport</span>
				<span style="FONT-SIZE: 9pt">提供此功能），如果验证没有通过，</span>
				<span style="FONT-SIZE: 9pt">workflow</span>
				<span style="FONT-SIZE: 9pt">会将请求返回到</span>
				<span style="FONT-SIZE: 9pt">input</span>
				<span style="FONT-SIZE: 9pt">视图（</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">的</span>
				<span style="FONT-SIZE: 9pt">&lt;result /&gt;</span>
				<span style="FONT-SIZE: 9pt">中定义的）。</span>
		</div>
		<div style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt">
				<span style="FONT-SIZE: 9pt">l<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span></span>
				<span style="FONT-SIZE: 9pt">servlet-config</span>
				<span style="FONT-SIZE: 9pt">：提供</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">直接对</span>
				<span style="FONT-SIZE: 9pt">HttpServletRequest</span>
				<span style="FONT-SIZE: 9pt">或</span>
				<span style="FONT-SIZE: 9pt">HttpServletResponse</span>
				<span style="FONT-SIZE: 9pt">等</span>
				<span style="FONT-SIZE: 9pt">JavaServlet api</span>
				<span style="FONT-SIZE: 9pt">的访问，</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">要实现相应的接口，例如：</span>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">ServletRequestAware</span>
				<span style="FONT-SIZE: 9pt">或</span>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">ServletResponseAware</span>
				<span style="FONT-SIZE: 9pt">等</span>
				<span style="FONT-SIZE: 9pt">。如果必需要提供对</span>
				<span style="FONT-SIZE: 9pt">JavaServlet api</span>
				<span style="FONT-SIZE: 9pt">的访问，我们建议使用</span>
				<span style="FONT-SIZE: 9pt">ServletActionContext</span>
				<span style="FONT-SIZE: 9pt">，在前面</span>
				<span style="FONT-SIZE: 9pt">ActionContext</span>
				<span style="FONT-SIZE: 9pt">章节中有介绍。</span>
		</div>
		<div style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt">
				<span style="FONT-SIZE: 9pt">l<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span></span>
				<span style="FONT-SIZE: 9pt">prepare</span>
				<span style="FONT-SIZE: 9pt">：在</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">执行之前调用</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">的</span>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">prepare()</span>
				<span style="FONT-SIZE: 9pt">方法，这个方法是用来准备</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">执行之前要做的工作。它要求我们的</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">必需实现</span>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">com.opensymphony.xwork</span>
				<span style="FONT-SIZE: 9pt">.<span style="BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial"> Preparable</span></span>
				<span style="FONT-SIZE: 9pt">接口</span>
		</div>
		<div>
				<span style="FONT-SIZE: 9pt">conversionError</span>
				<span style="FONT-SIZE: 9pt">：用来处理框架进行类型转化</span>
				<span style="FONT-SIZE: 9pt">(Type Conversion)</span>
				<span style="FONT-SIZE: 9pt">时的出错信息。它将存储在</span>
				<span style="FONT-SIZE: 9pt">ActionContext</span>
				<span style="FONT-SIZE: 9pt">中的类型转化（</span>
				<span style="FONT-SIZE: 9pt">Type Conversion</span>
				<span style="FONT-SIZE: 9pt">）错误信息转化成相应的</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">字段的错误信息，保存在堆栈中。根据需要，可以将这些错误信息在视图中显示出来。</span>
		</div>
		<div>&#160;</div>
		<div style="MARGIN: 13pt 0cm">
				<strong>
						<font size="4">
								<a name="_Toc75838948">
										<span style="FONT-SIZE: 9pt; LINE-HEIGHT: 173%">Interceptor</span>
								</a>
								<span>
										<span style="FONT-SIZE: 9pt; LINE-HEIGHT: 173%">的原理</span>
								</span>
						</font>
				</strong>
		</div>
		<div>
				<span style="FONT-SIZE: 9pt">下面我们来看看</span>
				<span style="FONT-SIZE: 9pt">Interceptor</span>
				<span style="FONT-SIZE: 9pt">是如何实现在</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">执行前后调用的：</span>
		</div>
		<div>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">和</span>
				<span style="FONT-SIZE: 9pt">Interceptor</span>
				<span style="FONT-SIZE: 9pt">在框架中的执行，是由</span>
				<span style="FONT-SIZE: 9pt">ActionInvocation</span>
				<span style="FONT-SIZE: 9pt">对象调用的。它是用方法：</span>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">String invoke() <strong>throws</strong> Exception;</span>
				<span style="FONT-SIZE: 9pt">来实现的，它首先会依次调用</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">对应的</span>
				<span style="FONT-SIZE: 9pt">Interceptor</span>
				<span style="FONT-SIZE: 9pt">，执行完成所有的</span>
				<span style="FONT-SIZE: 9pt">Interceptor</span>
				<span style="FONT-SIZE: 9pt">之后，再去调用</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">的方法，代码如下：</span>
		</div>
		<div align="left">
				<strong>
						<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">if</span>
				</strong>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial"> (interceptors.hasNext()) {</span>
		</div>
		<div style="TEXT-INDENT: 21pt" align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">Interceptor interceptor = (Interceptor) interceptors.next();</span>
		</div>
		<div style="TEXT-INDENT: 21pt" align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">resultCode = interceptor.intercept(<strong>this</strong>);</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">} <strong>else</strong> {</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160; &#160;<strong>if</strong> (proxy.getConfig().getMethodName() == <strong>null</strong>) {</span>
		</div>
		<div style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: 21pt" align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">resultCode = getAction().execute();</span>
		</div>
		<div style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: 21pt" align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">} <strong>else</strong> {</span>
		</div>
		<div style="TEXT-INDENT: 21pt" align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160;&#160;&#160;&#160;&#160; resultCode = invokeAction(getAction(), proxy.getConfig());</span>
		</div>
		<div style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: 21pt" align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">}</span>
		</div>
		<div style="TEXT-INDENT: 21pt">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">}</span>
		</div>
		<div>
				<span style="FONT-SIZE: 9pt">它会在拦截器栈中遍历</span>
				<span style="FONT-SIZE: 9pt">Interceptor</span>
				<span style="FONT-SIZE: 9pt">，调用</span>
				<span style="FONT-SIZE: 9pt">Interceptor</span>
				<span style="FONT-SIZE: 9pt">的</span>
				<span style="FONT-SIZE: 9pt">方法：</span>
				<span style="FONT-SIZE: 9pt">
						<br />
				</span>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">String intercept(ActionInvocation invocation) <strong>throws</strong> Exception;</span>
				<span style="FONT-SIZE: 9pt">。</span>
		</div>
		<div>
				<span style="FONT-SIZE: 9pt">我们一直都提到，</span>
				<span style="FONT-SIZE: 9pt">Interceptor</span>
				<span style="FONT-SIZE: 9pt">是在</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">前后执行，可是从上面的代码我们看到的却是执行完所有</span>
				<span style="FONT-SIZE: 9pt">Interceptor</span>
				<span style="FONT-SIZE: 9pt">的</span>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">intercept</span>
				<span style="FONT-SIZE: 9pt">()</span>
				<span style="FONT-SIZE: 9pt">方法之后再去调用我们的</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">。&#8220;在</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">前后执行&#8221;是如何实现的呢？我们来看看抽象类</span>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">AroundInterceptor</span>
				<span style="FONT-SIZE: 9pt">的</span>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">intercept</span>
				<span style="FONT-SIZE: 9pt">（）</span>
				<span style="FONT-SIZE: 9pt">实现：</span>
		</div>
		<div align="left">
				<strong>
						<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">public</span>
				</strong>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial"> String intercept(ActionInvocation invocation) <strong>throws</strong> Exception {</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160;&#160;&#160;&#160;&#160; String result = <strong>null</strong>;</span>
		</div>
		<div align="left">&#160;</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160;&#160;&#160;&#160;&#160; before(invocation);</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160;&#160;&#160;&#160;&#160; result = invocation.invoke();</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160;&#160;&#160;&#160;&#160; after(invocation, result);</span>
		</div>
		<div align="left">&#160;</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <strong>return</strong> result;</span>
		</div>
		<div>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160; }</span>
		</div>
		<div>
				<span style="FONT-SIZE: 9pt">原来在</span>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">intercept</span>
				<span style="FONT-SIZE: 9pt">()</span>
				<span style="FONT-SIZE: 9pt">方法又对</span>
				<span style="FONT-SIZE: 9pt">ActionInvocation</span>
				<span style="FONT-SIZE: 9pt">的</span>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">invoke()</span>
				<span style="FONT-SIZE: 9pt">方法进行递归调用，</span>
				<span style="FONT-SIZE: 9pt">ActionInvocation</span>
				<span style="FONT-SIZE: 9pt">循环嵌套在</span>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">intercept</span>
				<span style="FONT-SIZE: 9pt">()</span>
				<span style="FONT-SIZE: 9pt">中，一直到语句</span>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">result = invocation.invoke();</span>
				<span style="FONT-SIZE: 9pt">执行结束，即：</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">执行完并返回结果</span>
				<span style="FONT-SIZE: 9pt">result</span>
				<span style="FONT-SIZE: 9pt">，这时</span>
				<span style="FONT-SIZE: 9pt">Interceptor</span>
				<span style="FONT-SIZE: 9pt">对象会按照刚开始执行的逆向顺序依次执行结束。这样</span>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">before</span>
				<span style="FONT-SIZE: 9pt">（）</span>
				<span style="FONT-SIZE: 9pt">方法将在</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">执行前调用，</span>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">after</span>
				<span style="FONT-SIZE: 9pt">（）</span>
				<span style="FONT-SIZE: 9pt">方法在</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">执行之后运行</span>
		</div><img src ="http://www.blogjava.net/rain1102/aggbug/87781.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2006-12-14 19:16 <a href="http://www.blogjava.net/rain1102/archive/2006/12/14/87781.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WebWork教程－验证框架</title><link>http://www.blogjava.net/rain1102/archive/2006/12/14/87780.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Thu, 14 Dec 2006 11:13:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2006/12/14/87780.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/87780.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2006/12/14/87780.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/87780.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/87780.html</trackback:ping><description><![CDATA[<div style="MARGIN: 13pt 0cm">
				<strong>
						<font size="5">
								<span style="FONT-SIZE: 9pt; LINE-HEIGHT: 173%">验证框架</span>
						</font>
				</strong>
		</div>
		<div>
				<span style="FONT-SIZE: 9pt">WebWork</span>
				<span style="FONT-SIZE: 9pt">提供了在</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">执行之前，对输入数据的验证功能，它使用了其核心</span>
				<span style="FONT-SIZE: 9pt">XWork</span>
				<span style="FONT-SIZE: 9pt">的验证框架。提供了如下功能：</span>
		</div>
		<div style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt">
				<span style="FONT-SIZE: 9pt">1、<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&#160;&#160; </span></span>
				<span style="FONT-SIZE: 9pt">可配置的验证文件。它的验证文件是一个独立的</span>
				<span style="FONT-SIZE: 9pt">XML</span>
				<span style="FONT-SIZE: 9pt">配置文件，对验证的添加、修改只需更改配置文件，无需编译任何的</span>
				<span style="FONT-SIZE: 9pt">Class</span>
				<span style="FONT-SIZE: 9pt">。</span>
		</div>
		<div style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt">
				<span style="FONT-SIZE: 9pt">2、<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&#160;&#160; </span></span>
				<span style="FONT-SIZE: 9pt">验证文件和被验证的对象完全解藕。验证对象是普通的</span>
				<span style="FONT-SIZE: 9pt">JavaBean</span>
				<span style="FONT-SIZE: 9pt">就可以了（可以是</span>
				<span style="FONT-SIZE: 9pt">FormBean</span>
				<span style="FONT-SIZE: 9pt">、域对象等），它们不需实现任何额外的方法或继承额外的类。</span>
		</div>
		<div style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt">
				<span style="FONT-SIZE: 9pt">3、<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&#160;&#160; </span></span>
				<span style="FONT-SIZE: 9pt">多种不同的验证方式。因为它验证功能是可以继承的，所以可以用多种不同的方式指定验证文件，比如：通过父类的</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">、通过</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">、通过</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">的方法、通过</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">所使用的对象，等等。</span>
		</div>
		<div style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt">
				<span style="FONT-SIZE: 9pt">4、<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&#160;&#160; </span></span>
				<span style="FONT-SIZE: 9pt">强大的表达式验证。它使用了</span>
				<span style="FONT-SIZE: 9pt">OGNL</span>
				<span style="FONT-SIZE: 9pt">的表达式语言，提供强大的表达式验证功能。</span>
		</div>
		<div style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt">
				<span style="FONT-SIZE: 9pt">5、<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&#160;&#160; </span></span>
				<span style="FONT-SIZE: 9pt">同时支持服务器端和客户端验证。</span>
		</div>
		<div style="MARGIN: 13pt 0cm">
				<strong>
						<font size="4">
								<a name="_Toc76287482">
										<span style="FONT-SIZE: 9pt; LINE-HEIGHT: 173%">为用户注册添加验证功能</span>
								</a>
						</font>
				</strong>
		</div>
		<div>
				<span style="FONT-SIZE: 9pt">下面我们来看看如何为用户注册添加验证功能：</span>
		</div>
		<div style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt">
				<strong>
						<span style="FONT-SIZE: 9pt">1、<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&#160;&#160; </span></span>
				</strong>
				<strong>
						<span style="FONT-SIZE: 9pt">注册我们的验证类型</span>
				</strong>
		</div>
		<div style="TEXT-INDENT: 22.5pt">
				<span style="FONT-SIZE: 9pt">WebWork</span>
				<span style="FONT-SIZE: 9pt">为不同的验证要求提供不同的验证类型。一个验证类型，一般是有一个类来提供。这个类必须实现接口：</span>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">com.opensymphony.xwork.validator.Validator</span>
				<span style="FONT-SIZE: 9pt">，但我们在写自己的验证类型时，无需直接实现</span>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">Validator</span>
				<span style="FONT-SIZE: 9pt">接口，它有抽象类可供直接使用如</span>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">ValidatorSupport</span>
				<span style="FONT-SIZE: 9pt">、</span>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">FieldValidatorSupport</span>
				<span style="FONT-SIZE: 9pt">等。</span>
		</div>
		<div style="TEXT-INDENT: 22.5pt">
				<span style="FONT-SIZE: 9pt">验证类型在使用之前，必须要在</span>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">ValidatorFactory</span>
				<span style="FONT-SIZE: 9pt">（</span>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">com.opensymphony.xwork.validator</span>
				<span style="FONT-SIZE: 9pt">.<span style="BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial"> ValidatorFactory</span></span>
				<span style="FONT-SIZE: 9pt">）中</span>
				<span style="FONT-SIZE: 9pt">注册。可以有二种方法实现验证类型的注册。一、写程序代码进行注册，它使用</span>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">ValidatorFactory</span>
				<span style="FONT-SIZE: 9pt">类的静态方法：</span>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">registerValidator(String name, String className)</span>
				<span style="FONT-SIZE: 9pt">。</span>
				<span style="FONT-SIZE: 9pt">二、使用配置文件</span>
				<span style="FONT-SIZE: 9pt">validators.xml</span>
				<span style="FONT-SIZE: 9pt">进行注册，要求把文件</span>
				<span style="FONT-SIZE: 9pt">validators.xml</span>
				<span style="FONT-SIZE: 9pt">放到</span>
				<span style="FONT-SIZE: 9pt">ClassPath</span>
				<span style="FONT-SIZE: 9pt">的跟目录中（</span>
				<span style="FONT-SIZE: 9pt">/WEB-INF/classes</span>
				<span style="FONT-SIZE: 9pt">）。但在实际开发中，一般都使用第二中注册方法。我们的验证类型注册如下：</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&lt;validators&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160; &lt;validator name="required" class="com.opensymphony.xwork.validator.validators.RequiredFieldValidator"/&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160; &#160;&lt;validator name="requiredstring" class="com.opensymphony.xwork.validator.validators.RequiredStringValidator"/&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160; &lt;validator name="int" class="com.opensymphony.xwork.validator.validators.IntRangeFieldValidator"/&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160; &lt;validator name="date" class="com.opensymphony.xwork.validator.validators.DateRangeFieldValidator"/&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160; &lt;validator name="expression" class="com.opensymphony.xwork.validator.validators.ExpressionValidator"/&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160; &lt;validator name="fieldexpression" class="com.opensymphony.xwork.validator.validators.FieldExpressionValidator"/&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160; &lt;validator name="email" class="com.opensymphony.xwork.validator.validators.EmailValidator"/&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160; &lt;validator name="url" class="com.opensymphony.xwork.validator.validators.URLValidator"/&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160; &lt;validator name="visitor" class="com.opensymphony.xwork.validator.validators.VisitorFieldValidator"/&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160; &lt;validator name="conversion" class="com.opensymphony.xwork.validator.validators.ConversionErrorFieldValidator"/&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160; &lt;validator name="stringlength" class="com.opensymphony.xwork.validator.validators.StringLengthFieldValidator"/&gt;</span>
		</div>
		<div>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&lt;/validators&gt;</span>
		</div>
		<div style="TEXT-INDENT: 18pt">
				<span style="FONT-SIZE: 9pt">注册验证类型的配置文件非常简单。它使用标签</span>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&lt;validator</span>
				<span style="FONT-SIZE: 9pt">&gt;</span>
				<span style="FONT-SIZE: 9pt">提供名－值对的形式注册。这样我们的验证文件就可以直接引用它的名字。</span>
		</div>
		<div style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt">
				<strong>
						<span style="FONT-SIZE: 9pt">2、<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&#160;&#160; </span></span>
				</strong>
				<strong>
						<span style="FONT-SIZE: 9pt">开启</span>
				</strong>
				<strong>
						<span style="FONT-SIZE: 9pt">Action</span>
				</strong>
				<strong>
						<span style="FONT-SIZE: 9pt">的验证功能</span>
				</strong>
		</div>
		<div>
				<span style="FONT-SIZE: 9pt">&#160;</span>
				<span style="FONT-SIZE: 9pt">如果</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">要使用验证框架的验证功能，它必须在配置文件中指定拦截器&#8220;</span>
				<span style="FONT-SIZE: 9pt">validation</span>
				<span style="FONT-SIZE: 9pt">&#8221;，它的定义如下：</span>
		</div>
		<div>
				<span style="FONT-SIZE: 9pt">&lt;interceptor name="validation" class="com.opensymphony.xwork.validator.ValidationInterceptor"/&gt;</span>
				<span style="FONT-SIZE: 9pt">。</span>
		</div>
		<div>
				<span style="FONT-SIZE: 9pt">我们的验证文件必须以</span>
				<span style="FONT-SIZE: 9pt">ActionName-validation.xml</span>
				<span style="FONT-SIZE: 9pt">格式命名，它必须被放置到与这个</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">相同的包中。你也可以为这个</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">通过别名的方式指定验证文件，它的命名格式为：</span>
				<span style="FONT-SIZE: 9pt">ActionName-aliasname-validation.xml</span>
				<span style="FONT-SIZE: 9pt">。&#8220;</span>
				<span style="FONT-SIZE: 9pt">ActionName </span>
				<span style="FONT-SIZE: 9pt">&#8221;是我们</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">的类名；&#8220;</span>
				<span style="FONT-SIZE: 9pt">aliasname</span>
				<span style="FONT-SIZE: 9pt">&#8221;是我们在配置文件（</span>
				<span style="FONT-SIZE: 9pt">xwork.xml</span>
				<span style="FONT-SIZE: 9pt">）中定义这个</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">所用到的名称。这样，同一个</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">类，在配置文件中的不同定义就可以对应不同的验证文件。验证框架也会根据</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">的继承结构去查找</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">的父类验证文件，如果找到它会去执行这个父类的验证。</span>
		</div>
		<div>&#160;</div>
		<div style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt">
				<strong>
						<span style="FONT-SIZE: 9pt">3、<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&#160;&#160; </span></span>
				</strong>
				<strong>
						<span style="FONT-SIZE: 9pt">实现我们的验证文件：</span>
				</strong>
				<strong>
						<span style="FONT-SIZE: 9pt">RegisterActionSupport-validation.xml</span>
				</strong>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&lt;!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.dtd"&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&lt;validators&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160; &lt;field name="user.username"&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160; &lt;field-validator type="requiredstring"&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;message&gt;You must enter a value for username.&lt;/message&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/field-validator&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160; &lt;/field&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160; &lt;field name="user.password"&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160; &lt;field-validator type="requiredstring"&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;message&gt;You must enter a value for password.&lt;/message&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/field-validator&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;field-validator type="fieldexpression"&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;param name="expression"&gt;user.password == verifyPassword&lt;/param&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;message&gt;Passwords don't match.&lt;/message&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/field-validator&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160; &lt;/field&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160; &lt;field name="user.email"&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160; &lt;field-validator type="email"&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;message&gt;You must enter a valid email.&lt;/message&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/field-validator&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160; &lt;/field&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160; &lt;field name="user.age"&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160; &lt;field-validator type="int"&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;param name="min"&gt;6&lt;/param&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;param name="max"&gt;100&lt;/param&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;message&gt;Age must be between ${min} and ${max}, current value is ${user.age}.&lt;/message&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160;&#160;&#160;&#160; &#160;&lt;/field-validator&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160; &lt;/field&gt;</span>
		</div>
		<div>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&lt;/validators&gt;</span>
		</div>
		<div>
				<span style="FONT-SIZE: 9pt">说明：</span>
		</div>
		<div>
				<span style="FONT-SIZE: 9pt">1</span>
				<span style="FONT-SIZE: 9pt">）、</span>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&lt;field</span>
				<span style="FONT-SIZE: 9pt">&gt;</span>
				<span style="FONT-SIZE: 9pt">标签代表一个字段，它的属性&#8220;</span>
				<span style="FONT-SIZE: 9pt">name</span>
				<span style="FONT-SIZE: 9pt">&#8221;和页面输入框的&#8220;</span>
				<span style="FONT-SIZE: 9pt">name</span>
				<span style="FONT-SIZE: 9pt">&#8221;属性必需完全一致，其实它也就是我们的表达式语言。</span>
		</div>
		<div>
				<span style="FONT-SIZE: 9pt">2</span>
				<span style="FONT-SIZE: 9pt">）、</span>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&lt;field-validator</span>
				<span style="FONT-SIZE: 9pt">&gt;</span>
				<span style="FONT-SIZE: 9pt">标签定义我们的验证规则，</span>
				<span style="FONT-SIZE: 9pt">type</span>
				<span style="FONT-SIZE: 9pt">属性的值就是就是我们前面定义的验证类型。</span>
		</div>
		<div>
				<span style="FONT-SIZE: 9pt">3</span>
				<span style="FONT-SIZE: 9pt">）、验证文件中，字段的数据是通过表达式语言从我们的值堆栈（</span>
				<span style="FONT-SIZE: 9pt">OgnlValueStack</span>
				<span style="FONT-SIZE: 9pt">）中取得，一般是</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">或</span>
				<span style="FONT-SIZE: 9pt">Model</span>
				<span style="FONT-SIZE: 9pt">对象。例如：我们的字段&#8220;</span>
				<span style="FONT-SIZE: 9pt">user.age</span>
				<span style="FONT-SIZE: 9pt">&#8221;，它会通过</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">的</span>
				<span style="FONT-SIZE: 9pt">getUser().getAge()</span>
				<span style="FONT-SIZE: 9pt">来取得用户输入的年龄，再来根据验证的类型&#8220;</span>
				<span style="FONT-SIZE: 9pt">int</span>
				<span style="FONT-SIZE: 9pt">&#8221;和最大值最小值的参数来判断输入的数据是否能通过验证。</span>
		</div>
		<div>
				<span style="FONT-SIZE: 9pt">4</span>
				<span style="FONT-SIZE: 9pt">）、不管验证是否通过，我们的</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">都会执行，但如果验证没有通过，它不会调用</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">的</span>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">execute()</span>
				<span style="FONT-SIZE: 9pt">方法。</span>
		</div>
		<div>&#160;</div>
		<div style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt">
				<strong>
						<span style="FONT-SIZE: 9pt">4、<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&#160;&#160; </span></span>
				</strong>
				<strong>
						<span style="FONT-SIZE: 9pt">显示</span>
				</strong>
				<strong>
						<span style="FONT-SIZE: 9pt">Action</span>
				</strong>
				<strong>
						<span style="FONT-SIZE: 9pt">的验证错误信息</span>
				</strong>
		</div>
		<div>
				<span style="FONT-SIZE: 9pt">如果用户输入的数据验证没有通过，我们需重新返回输入页面，并给出错误信息提示。拦截器栈&#8220;</span>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">validationWorkflowStack</span>
				<span style="FONT-SIZE: 9pt">&#8221;为我们实现了这个功能。它首先验证用户输入的数据，如果验证没有通过将不执行我们</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">的</span>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">execute()</span>
				<span style="FONT-SIZE: 9pt">方法，而是将请求重新返回到输入页面。</span>
		</div>
		<div>
				<span style="FONT-SIZE: 9pt">我们的</span>
				<span style="FONT-SIZE: 9pt">xwork.xml</span>
				<span style="FONT-SIZE: 9pt">配置文件如下：</span>
		</div>
		<div style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: 21pt" align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&lt;action name="registerSupport" class="example.register.RegisterActionSupport"&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;result name="success" type="dispatcher"&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;param name="location"&gt;/register-result.jsp&lt;/param&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/result&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;<font color="#ff0000">result name="input" type="dispatcher"&gt;</font></span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">
						<font color="#ff0000">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;param name="location"&gt;/registerSupport.jsp&lt;/param&gt;</font>
				</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">
						<font color="#ff0000">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/result&gt;</font>
				</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;interceptor-ref name="validationWorkflowStack"/&gt;</span>
		</div>
		<div>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/action&gt;</span>
		</div>
		<div>&#160;</div>
		<div>
				<span style="FONT-SIZE: 9pt">通过接口</span>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">ValidationAware</span>
				<span style="FONT-SIZE: 9pt">，</span>
				<span style="FONT-SIZE: 9pt">我们可以获得类级别或字段级别的验证错误信息，这个错误信息也就是我们验证文件中</span>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&lt;message&gt;</span>
				<span style="FONT-SIZE: 9pt">标签里的数据。</span>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">ActionSupport</span>
				<span style="FONT-SIZE: 9pt">类已实现了此接口，这样在应用中我们的</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">只要继承</span>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">ActionSupport</span>
				<span style="FONT-SIZE: 9pt">类就可以了。</span>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">RegisterActionSupport</span>
				<span style="FONT-SIZE: 9pt">.java</span>
				<span style="FONT-SIZE: 9pt">代码如下：</span>
		</div>
		<div align="left">
				<strong>
						<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">package</span>
				</strong>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial"> example.register;</span>
		</div>
		<div align="left">&#160;</div>
		<div align="left">
				<strong>
						<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">import</span>
				</strong>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial"> com.opensymphony.xwork.ActionSupport;</span>
		</div>
		<div align="left">&#160;</div>
		<div align="left">
				<div align="left">
						<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">
						</span>
				</div>
				<strong>
						<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">public</span>
				</strong>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">
						<strong>class</strong> RegisterActionSupport <strong>extends</strong> ActionSupport {</span>
		</div>
		<div align="left">&#160;</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160; <strong>private</strong> User user= <strong>new</strong> User();</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160; <strong>private</strong> String verifyPassword;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160; </span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160; <strong>public</strong> User getUser(){</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <strong>return</strong><strong>this</strong>.user;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160; }</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160; </span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160; <strong>public</strong> String execute(){</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160;&#160;&#160;&#160;&#160; //</span>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">在这里调用用户注册的业务逻辑，比如：将注册信息存储到数据库</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <strong>return</strong> SUCCESS;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160; }</span>
		</div>
		<div align="left">&#160;</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160; <strong>public</strong> String getVerifyPassword(){</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <strong>return</strong><strong>this</strong>.verifyPassword;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160; }</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160; </span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160; <strong>public</strong><strong>void</strong> setVerifyPassword(String verPassword){</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160;&#160;&#160;&#160;&#160; <strong>this</strong>.verifyPassword = verPassword;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160; }</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">}</span>
		</div>
		<div>
				<span style="FONT-SIZE: 9pt">我们</span>
				<span style="FONT-SIZE: 9pt">WebWork</span>
				<span style="FONT-SIZE: 9pt">的</span>
				<span style="FONT-SIZE: 9pt">UI</span>
				<span style="FONT-SIZE: 9pt">标签库直接提供了验证错误信息显示功能。如果字段级别的验证没有通过，它会在输入框上方显示验证文件定义的错误提示信息。我们将用户输入的页面更改如下：</span>
		</div>
		<div>
				<span style="FONT-SIZE: 9pt">registerSupport.jsp</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&lt;%@ taglib uri="webwork" prefix="ww" %&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&lt;html&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&lt;head&gt;&lt;title&gt;Register Example&lt;/title&gt;&lt;/head&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&lt;body&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&lt;table border=0 width=97%&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&lt;tr&gt;&lt;td align="left"&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160; &lt;ww:form name="'test'" action="'/example/registerSupport.action'" method="'POST'"&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;ww:textfield label="'Username'" name="'user.username'" required="true"/&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;ww:textfield label="'Password'" name="'user.password'" required="true"/&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;ww:textfield label="'VerifyPassword'" name="'verifyPassword'" required="true"/&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&lt;ww:textfield label="'Email'" name="'user.email'" required="true"/&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;ww:textfield label="'Age'" name="'user.age'" required="true"/&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;ww:submit value="'Submit'"/&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/ww:form&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&lt;/td&gt;&lt;/tr&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&lt;/table&gt;</span>
		</div>
		<div align="left">
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&lt;/body&gt;</span>
		</div>
		<div>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">&lt;/html&gt;</span>
		</div>
		<div style="TEXT-INDENT: 22.5pt">
				<span style="FONT-SIZE: 9pt">我们上面的例子使用的是服务器端验证。</span>
				<span style="FONT-SIZE: 9pt">WebWork</span>
				<span style="FONT-SIZE: 9pt">也为我们提供了方便的客户端验证。它将验证自动生成</span>
				<span style="FONT-SIZE: 9pt">JavaScript</span>
				<span style="FONT-SIZE: 9pt">脚本。如果要使用客户端验证只需改变相应的验证类型就可以了（输入页面的表单必需使用</span>
				<span style="FONT-SIZE: 9pt">&lt;ww:form&gt;</span>
				<span style="FONT-SIZE: 9pt">标签，并设置属性&#8220;</span>
				<span style="FONT-SIZE: 9pt">validate="true"</span>
				<span style="FONT-SIZE: 9pt">&#8221;）。具体的验证类型可以在</span>
				<span style="FONT-SIZE: 9pt">WebWork</span>
				<span style="FONT-SIZE: 9pt">的包</span>
				<span style="FONT-SIZE: 9pt; BACKGROUND: white 0% 50%; moz-background-clip: -moz-initial; moz-background-origin: -moz-initial; moz-background-inline-policy: -moz-initial">com.opensymphony.webwork.validators</span>
				<span style="FONT-SIZE: 9pt">中找到。</span>
		</div><img src ="http://www.blogjava.net/rain1102/aggbug/87780.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2006-12-14 19:13 <a href="http://www.blogjava.net/rain1102/archive/2006/12/14/87780.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WebWork－ActionContext(Action上下文)</title><link>http://www.blogjava.net/rain1102/archive/2006/12/13/87573.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Wed, 13 Dec 2006 11:44:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2006/12/13/87573.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/87573.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2006/12/13/87573.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/87573.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/87573.html</trackback:ping><description><![CDATA[<div style="MARGIN: 13pt 0cm">
				<strong>
						<font size="5">
								<a name="_Toc75838940">
										<span style="FONT-SIZE: 9pt; LINE-HEIGHT: 173%">ActionContext</span>
								</a>
								<span>
										<span style="FONT-SIZE: 9pt; LINE-HEIGHT: 173%">介绍</span>
								</span>
						</font>
				</strong>
		</div>
		<div>
				<span style="FONT-SIZE: 9pt">在</span>
				<span style="FONT-SIZE: 9pt">Web</span>
				<span style="FONT-SIZE: 9pt">应用程序开发中，除了将请求参数自动设置到</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">的字段中，我们往往也需要在</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">里直接获取请求</span>
				<span style="FONT-SIZE: 9pt">(Request)</span>
				<span style="FONT-SIZE: 9pt">或会话（</span>
				<span style="FONT-SIZE: 9pt">Session</span>
				<span style="FONT-SIZE: 9pt">）的一些信息</span>
				<span style="FONT-SIZE: 9pt">, </span>
				<span style="FONT-SIZE: 9pt">甚至需要直接对</span>
				<span style="FONT-SIZE: 9pt">JavaServlet Http</span>
				<span style="FONT-SIZE: 9pt">的请求（</span>
				<span style="FONT-SIZE: 9pt">HttpServletRequest</span>
				<span style="FONT-SIZE: 9pt">）、响应</span>
				<span style="FONT-SIZE: 9pt">(HttpServletResponse)</span>
				<span style="FONT-SIZE: 9pt">操作。</span>
		</div>
		<div>
				<span style="FONT-SIZE: 9pt">我们需要在</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">中取得</span>
				<span style="FONT-SIZE: 9pt">request</span>
				<span style="FONT-SIZE: 9pt">请求参数&#8220;</span>
				<span style="FONT-SIZE: 9pt">username</span>
				<span style="FONT-SIZE: 9pt">&#8221;的值：</span>
		</div>
		<div style="TEXT-INDENT: 21pt">
				<span style="FONT-SIZE: 9pt">ActionContext context = ActionContext.getContext();</span>
		</div>
		<div style="TEXT-INDENT: 21pt">
				<span style="FONT-SIZE: 9pt">Map params = context.getParameters();</span>
		</div>
		<div style="TEXT-INDENT: 21pt">
				<span style="FONT-SIZE: 9pt">String username = (String) params.get(&#8220;username&#8221;);</span>
		</div>
		<div>
				<span style="FONT-SIZE: 9pt">ActionContext</span>
				<span style="FONT-SIZE: 9pt">（</span>
				<span style="FONT-SIZE: 9pt">com.opensymphony.xwork.ActionContext</span>
				<span style="FONT-SIZE: 9pt">）是</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">执行时的上下文，上下文可以看作是一个容器（其实我们这里的容器就是一个</span>
				<span style="FONT-SIZE: 9pt">Map</span>
				<span style="FONT-SIZE: 9pt">而已），它存放放的是</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">在执行时需要用到的对象</span>
		</div>
		<div>&#160;</div>
		<div>
				<span style="FONT-SIZE: 9pt">一般情况，我们的</span>
				<span style="FONT-SIZE: 9pt">ActionContext</span>
				<span style="FONT-SIZE: 9pt">都是通过：</span>
				<span style="FONT-SIZE: 9pt">ActionContext context = (ActionContext) actionContext.get();</span>
				<span style="FONT-SIZE: 9pt">来获取的。我们再来看看这里的</span>
				<span style="FONT-SIZE: 9pt">actionContext</span>
				<span style="FONT-SIZE: 9pt">对象的创建：</span>
				<span style="FONT-SIZE: 9pt">static ThreadLocal actionContext = new ActionContextThreadLocal();</span>
				<span style="FONT-SIZE: 9pt">，</span>
				<span style="FONT-SIZE: 9pt">ActionContextThreadLocal</span>
				<span style="FONT-SIZE: 9pt">是实现</span>
				<span style="FONT-SIZE: 9pt">ThreadLocal</span>
				<span style="FONT-SIZE: 9pt">的一个内部类。</span>
				<span style="FONT-SIZE: 9pt">ThreadLocal</span>
				<span style="FONT-SIZE: 9pt">可以命名为&#8220;线程局部变量&#8221;，它为每一个使用该变量的线程都提供一个变量值的副本，使每一个线程都可以独立地改变自己的副本，而不会和其它线程的副本冲突。这样，我们</span>
				<span style="FONT-SIZE: 9pt">ActionContext</span>
				<span style="FONT-SIZE: 9pt">里的属性只会在对应的当前请求线程中可见，从而保证它是线程安全的。</span>
		</div>
		<div>&#160;</div>
		<div>&#160;</div>
		<div>
				<span style="FONT-SIZE: 9pt">下面我们看看怎么通过</span>
				<span style="FONT-SIZE: 9pt">ActionContext</span>
				<span style="FONT-SIZE: 9pt">取得我们的</span>
				<span style="FONT-SIZE: 9pt">HttpSession</span>
				<span style="FONT-SIZE: 9pt">：</span>
		</div>
		<div style="TEXT-INDENT: 4.5pt">
				<span style="FONT-SIZE: 9pt">Map session = ActionContext.getContext().getSession()</span>
				<span style="FONT-SIZE: 9pt">；</span>
		</div>
		<div>&#160;</div>
		<div style="MARGIN: 13pt 0cm">
				<strong>
						<font size="5">
								<a name="_Toc75838941">
										<span style="FONT-SIZE: 9pt; LINE-HEIGHT: 173%">ServletActionContext</span>
								</a>
						</font>
				</strong>
		</div>
		<div style="TEXT-INDENT: 18pt">
				<span style="FONT-SIZE: 9pt">ServletActionContext</span>
				<span style="FONT-SIZE: 9pt">（</span>
				<span style="FONT-SIZE: 9pt">com.opensymphony.webwork. ServletActionContext</span>
				<span style="FONT-SIZE: 9pt">），这个类直接继承了我们上面介绍的</span>
				<span style="FONT-SIZE: 9pt">ActionContext</span>
				<span style="FONT-SIZE: 9pt">，它提供了直接与</span>
				<span style="FONT-SIZE: 9pt">JavaServlet</span>
				<span style="FONT-SIZE: 9pt">相关对象访问的功能，它可以取得的对象有：</span>
		</div>
		<div style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt">
				<span style="FONT-SIZE: 9pt">1、<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&#160;&#160; </span></span>
				<span style="FONT-SIZE: 9pt">javax.servlet.http.HttpServletRequest</span>
				<span style="FONT-SIZE: 9pt">：</span>
				<span style="FONT-SIZE: 9pt">HTTPservlet</span>
				<span style="FONT-SIZE: 9pt">请求对象</span>
		</div>
		<div style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt">
				<span style="FONT-SIZE: 9pt">2、<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&#160;&#160; </span></span>
				<span style="FONT-SIZE: 9pt">javax.servlet.http.HttpServletResponse;</span>
				<span style="FONT-SIZE: 9pt">：</span>
				<span style="FONT-SIZE: 9pt">HTTPservlet</span>
				<span style="FONT-SIZE: 9pt">相应对象</span>
		</div>
		<div style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt">
				<span style="FONT-SIZE: 9pt">3、<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&#160;&#160; </span></span>
				<span style="FONT-SIZE: 9pt">javax.servlet.ServletContext</span>
				<span style="FONT-SIZE: 9pt">：</span>
				<span style="FONT-SIZE: 9pt">Servlet </span>
				<span style="FONT-SIZE: 9pt">上下文信息</span>
		</div>
		<div style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt">
				<span style="FONT-SIZE: 9pt">4、<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&#160;&#160; </span></span>
				<span style="FONT-SIZE: 9pt">javax.servlet.ServletConfig</span>
				<span style="FONT-SIZE: 9pt">：</span>
				<span style="FONT-SIZE: 9pt">Servlet</span>
				<span style="FONT-SIZE: 9pt">配置对象</span>
		</div>
		<div style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt">
				<span style="FONT-SIZE: 9pt">5、<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&#160;&#160; </span></span>
				<span style="FONT-SIZE: 9pt">javax.servlet.jsp.PageContext</span>
				<span style="FONT-SIZE: 9pt">：</span>
				<span style="FONT-SIZE: 9pt">Http</span>
				<span style="FONT-SIZE: 9pt">页面上下文</span>
		</div>
		<div style="TEXT-INDENT: 18pt">&#160;</div>
		<div style="TEXT-INDENT: 18pt">&#160;</div>
		<div style="TEXT-INDENT: 18pt">
				<span style="FONT-SIZE: 9pt">下面我们看看几个简单的例子，让我们了解如何从</span>
				<span style="FONT-SIZE: 9pt">ServletActionContext</span>
				<span style="FONT-SIZE: 9pt">里取得</span>
				<span style="FONT-SIZE: 9pt">JavaServlet</span>
				<span style="FONT-SIZE: 9pt">的相关对象：</span>
		</div>
		<div style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt">
				<strong>
						<span style="FONT-SIZE: 9pt">1、<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&#160;&#160; </span></span>
				</strong>
				<span style="FONT-SIZE: 9pt">取得</span>
				<span style="FONT-SIZE: 9pt">HttpServletRequest</span>
				<span style="FONT-SIZE: 9pt">对象：</span>
		</div>
		<div style="MARGIN: 0cm 0cm 0pt 39pt">
				<span style="FONT-SIZE: 9pt">HttpServletRequest request = ServletActionContext. getRequest();</span>
		</div>
		<div style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt">
				<strong>
						<span style="FONT-SIZE: 9pt">2、<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&#160;&#160; </span></span>
				</strong>
				<span style="FONT-SIZE: 9pt">取得</span>
				<span style="FONT-SIZE: 9pt">HttpSession</span>
				<span style="FONT-SIZE: 9pt">对象：</span>
		</div>
		<div style="MARGIN: 0cm 0cm 0pt 39pt">
				<span style="FONT-SIZE: 9pt">HttpSession session = ServletActionContext. getRequest().getSession();</span>
		</div>
		<div>&#160;</div>
		<div>
				<span style="FONT-SIZE: 9pt">ServletActionContext</span>
				<span style="FONT-SIZE: 9pt">和</span>
				<span style="FONT-SIZE: 9pt">ActionContext</span>
				<span style="FONT-SIZE: 9pt">有着一些重复的功能，在我们的</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">中，该如何去抉择呢？我们遵循的原则是：如果</span>
				<span style="FONT-SIZE: 9pt">ActionContext</span>
				<span style="FONT-SIZE: 9pt">能够实现我们的功能，那最好就不要使用</span>
				<span style="FONT-SIZE: 9pt">ServletActionContext</span>
				<span style="FONT-SIZE: 9pt">，让我们的</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">尽量不要直接去访问</span>
				<span style="FONT-SIZE: 9pt">JavaServlet</span>
				<span style="FONT-SIZE: 9pt">的相关对象。在使用</span>
				<span style="FONT-SIZE: 9pt">ActionContext</span>
				<span style="FONT-SIZE: 9pt">时有一点要注意：不要在</span>
				<span style="FONT-SIZE: 9pt">Action</span>
				<span style="FONT-SIZE: 9pt">的构造函数里使用</span>
				<span style="FONT-SIZE: 9pt">ActionContext.getContext()</span>
				<span style="FONT-SIZE: 9pt">，因为这个时候</span>
				<span style="FONT-SIZE: 9pt">ActionContext</span>
				<span style="FONT-SIZE: 9pt">里的一些值也许没有设置，这时通过</span>
				<span style="FONT-SIZE: 9pt">ActionContext</span>
				<span style="FONT-SIZE: 9pt">取得的值也许是</span>
				<span style="FONT-SIZE: 9pt">null</span>
				<span style="FONT-SIZE: 9pt">。</span>
		</div><img src ="http://www.blogjava.net/rain1102/aggbug/87573.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2006-12-13 19:44 <a href="http://www.blogjava.net/rain1102/archive/2006/12/13/87573.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WebWork介绍－Action篇</title><link>http://www.blogjava.net/rain1102/archive/2006/12/13/87539.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Wed, 13 Dec 2006 09:28:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2006/12/13/87539.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/87539.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2006/12/13/87539.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/87539.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/87539.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Action								简介																		Action				在				MVC				模式中担任控制部分的角色				, 				在				WebWork				中使用的最多				,				用于接收页面参数，起到对				HttpRequest				判断处理作用。每个请求的动作都对应于一个相应的	...&nbsp;&nbsp;<a href='http://www.blogjava.net/rain1102/archive/2006/12/13/87539.html'>阅读全文</a><img src ="http://www.blogjava.net/rain1102/aggbug/87539.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2006-12-13 17:28 <a href="http://www.blogjava.net/rain1102/archive/2006/12/13/87539.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>webwork中文件上传实现</title><link>http://www.blogjava.net/rain1102/archive/2006/12/13/87534.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Wed, 13 Dec 2006 09:16:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2006/12/13/87534.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/87534.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2006/12/13/87534.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/87534.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/87534.html</trackback:ping><description><![CDATA[<a>
				<font size="4">
						<span style="COLOR: rgb(51,153,102)">step1:</span>
				</font>
				<br />页面定义如下<br />&#160;&#160;&#160; <span style="COLOR: rgb(255,0,0)">&lt;form action="upload.do" enctype="multipart/form-data" method="post"&gt;</span><br style="COLOR: rgb(255,0,0)" /><span style="COLOR: rgb(255,0,0)">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;input type="file" name="doc"/&gt;</span><br />&#160;&#160;&#160; &#160;&#160; &#160;&#160; &#160;&#160; ......................... 省略<br />&#160;&#160; &lt;/form&gt;<br /><br /><font style="COLOR: rgb(51,153,102)" size="4">step2</font><br />&#160;&#160;&#160; action 如下<br />&#160;&#160;&#160; public class UploadAction extends ActionSupport {<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; .....................................<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; private File doc;//<span style="COLOR: rgb(255,0,0)">doc与页面取一样的名字</span><br /><br />&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160; public void setDoc(File doc) {<br />&#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160;&#160; this.doc = doc; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br /><br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; //当然还可以使用以下的咚咚<br />&#160; /*<br />&#160;&#160;&#160; &#160;* public void setDocContentType(String docContentType) {<br />&#160;&#160;&#160; &#160;* this.docContentType = docContentType; }<br />&#160;&#160;&#160; &#160;* <br />&#160;&#160;&#160; &#160;*//**<br />&#160;&#160;&#160; &#160;&#160;&#160; &#160;* <br />&#160;&#160;&#160; &#160;&#160;&#160; &#160;* @author weip<br />&#160;&#160;&#160; &#160;&#160;&#160; &#160;* @time 0:23:24 2006-5-11<br />&#160;&#160;&#160; &#160;&#160;&#160; &#160;* @param docFileName<br />&#160;&#160;&#160; &#160;&#160;&#160; &#160;*/<br />&#160;&#160;&#160; /*<br />&#160;&#160;&#160; &#160;* public void setDocFileName(String docFileName) { this.docFileName =<br />&#160;&#160;&#160; &#160;* docFileName; }<br />&#160;&#160;&#160; &#160;*/<br /><br />&#160;&#160;&#160; /**<br />&#160;&#160;&#160; &#160;* <br />&#160;&#160;&#160; &#160;*/<br />&#160;&#160;&#160; /*<br />&#160;&#160;&#160; &#160;* private String docContentType;<br />&#160;&#160;&#160; &#160;* <br />&#160;&#160;&#160; &#160;*//**<br />&#160;&#160;&#160; &#160;&#160;&#160; &#160;* <br />&#160;&#160;&#160; &#160;&#160;&#160; &#160;*/<br />&#160;&#160;&#160; /*<br />&#160;&#160;&#160; &#160;* private String docFileName;<br />&#160;&#160;&#160; &#160;*/<br /><br />.............................................................<br /><br />&#160;&#160; }<br /><br /><span style="COLOR: rgb(255,0,0)">当程序进入到action当中时,你可以开始处理上面代码中的doc,此时文件已上传到服务器中的一个临时目录(同时被注入到action中就是你看到的 doc),此临时目录由webwork.properties指定,你必须将此文件拷贝到你需要的目录,否则action执行完毕,此文件会被删除,准确说是拦截器的后处理删除了临时文件,这一段结论的前提是你使用拦截器处理上传</span><br /><br /><font style="COLOR: rgb(51,153,102)" size="4">step3</font><br />处理配置文件,配置拦截器<br /><br />&lt;action name="upload" class="com.mofile.baby.web.action.signup.UploadAction"&gt;<br />&#160;&#160;&#160; &#160;&#160;&#160; &#160;&#160; <br />&#160;&#160;&#160; &#160;&#160;&#160; &#160;&#160;&#160; &lt;result name="success" type="freemarker"&gt;/page/signup/uploadfile.htm&lt;/result&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <span style="COLOR: rgb(255,0,0)">&lt;interceptor-ref name="fileUpload"/&gt;</span><br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;interceptor-ref name="defaultWebStack"/&gt;<br />&#160;&#160;&#160; &#160;&#160;&#160; &#160; <br />&#160; &lt;/action&gt;<br /><br /><font style="COLOR: rgb(51,153,102)" size="4">step4</font><br />对于webwork.properties的一些处理<br />webwork in action上推荐使用<span style="COLOR: rgb(255,0,0)">webwork.multipart.parser=jakarta</span>而不是默认的 pell,如果使用前者,不要忘了在你的lib中加入<span style="COLOR: rgb(255,0,0)">commons-fileupload.jar<br /><br /><br style="COLOR: rgb(0,0,255)" /><span style="COLOR: rgb(0,0,255)"><font size="4">需要注意的问题:</font><br />你在使用</span></span><span style="COLOR: rgb(0,0,255)">fileUpload传拦截器的时候应该避免使用execAndWait拦截器,否则很有可能会出现空指针,因为</span><span style="COLOR: rgb(255,0,0)"><span style="COLOR: rgb(0,0,0)"><span style="COLOR: rgb(0,0,255)">execAndWait拦截器会在另一个线程处理action,而原来的线程会删掉临时文件,所以当你在action中处理文件的时候很有可能文件已被删掉,虽然这并非一定会出现,但毕竟不安全</span></span></span></a><img src ="http://www.blogjava.net/rain1102/aggbug/87534.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2006-12-13 17:16 <a href="http://www.blogjava.net/rain1102/archive/2006/12/13/87534.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>webwork.properties</title><link>http://www.blogjava.net/rain1102/archive/2006/12/12/87328.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Tue, 12 Dec 2006 11:28:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2006/12/12/87328.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/87328.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2006/12/12/87328.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/87328.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/87328.html</trackback:ping><description><![CDATA[<pre class="code-none">### Webwork default properties
###(can be overridden by a webwork.properties file in the root of the classpath)
###

### Specifies the Configuration used to configure webwork
### one could extend com.opensymphony.webwork.config.Configuration
### to build one's customize way of getting the configurations parameters into webwork
# webwork.configuration=com.opensymphony.webwork.config.DefaultConfiguration

### This can be used to set your default locale and encoding scheme
# webwork.locale=en_US
webwork.i18n.encoding=UTF-8

### if specified, the default object factory can be overridden here
### Note: short-hand notation is supported in some cases, such as "spring"
###       Alternatively, you can provide a com.opensymphony.xwork.ObjectFactory subclass name here  
# webwork.objectFactory = spring

### specifies the autoWiring logic when using the SpringObjectFactory.
### valid values are: name, type, auto, and constructor (name is the default)
webwork.objectFactory.spring.autoWire = name

### indicates to the webwork-spring integration if Class instances should be cached
### this should, until a future Spring release makes it possible, be left as true
### unless you know exactly what you are doing!
### valid values are: true, false (true is the default)
webwork.objectFactory.spring.useClassCache = true

### if specified, the default object type determiner can be overridden here
### Note: short-hand notation is supported in some cases, such as "tiger" or "notiger"
###       Alternatively, you can provide a com.opensymphony.xwork.util.ObjectTypeDeterminer implementation name here
### Note: if you have the xwork-tiger.jar within your classpath, GenericsObjectTypeDeterminer is used by default
###       To disable tiger support use the "notiger" property value here.
#webwork.objectTypeDeterminer = tiger
#webwork.objectTypeDeterminer = notiger

### Parser to handle HTTP POST requests, encoded using the MIME-type multipart/form-data
# webwork.multipart.parser=cos
# webwork.multipart.parser=pell
webwork.multipart.parser=jakarta
# uses javax.servlet.context.tempdir by default
webwork.multipart.saveDir=
webwork.multipart.maxSize=2097152

### Load custom property files (does not override webwork.properties!)
# webwork.custom.properties=application,com/webwork/extension/custom

### How request URLs are mapped to and from actions
webwork.mapper.class=com.opensymphony.webwork.dispatcher.mapper.DefaultActionMapper

### Used by the DefaultActionMapper
### You may provide a comma separated list, e.g. webwork.action.extension=action,jnlp,do
webwork.action.extension=action

### Used by FilterDispatcher
### If true than WW serves static content from inside its jar. 
### If false than the static content must be available at &lt;context_path&gt;/webwork
webwork.serve.static=true

### use alternative syntax that requires %{} in most places
### to evaluate expressions for String attributes for tags
webwork.tag.altSyntax=true

### when set to true, WebWork will act much more friendly for developers. This
### includes:
### - webwork.i18n.reload = true
### - webwork.configuration.xml.reload = true
### - raising various debug or ignorable problems to errors
###   For example: normally a request to foo.action?someUnknownField=true should
###                be ignored (given that any value can come from the web and it
###                should not be trusted). However, during development, it may be
###                useful to know when these errors are happening and be told of
###                them right away.
webwork.devMode = false

### when set to true, resource bundles will be reloaded on _every_ request.
### this is good during development, but should never be used in production
webwork.i18n.reload=false

### Standard UI theme
### Change this to reflect which path should be used for JSP control tag templates by default
webwork.ui.theme=xhtml
webwork.ui.templateDir=template
#sets the default template type. Either ftl, vm, or jsp
webwork.ui.templateSuffix=ftl

### Configuration reloading
### This will cause the configuration to reload xwork.xml when it is changed
webwork.configuration.xml.reload=false

### Location of velocity.properties file.  defaults to velocity.properties
# webwork.velocity.configfile = velocity.properties

### Comma separated list of VelocityContext classnames to chain to the WebWorkVelocityContext
# webwork.velocity.contexts =

### used to build URLs, such as the UrlTag
webwork.url.http.port = 80
webwork.url.https.port = 443

### possible values are: none, get or all
webwork.url.includeParams = get

### Load custom default resource bundles
# webwork.custom.i18n.resources=testmessages,testmessages2

### workaround for some app servers that don't handle HttpServletRequest.getParameterMap()
### often used for WebLogic, Orion, and OC4J
webwork.dispatcher.parametersWorkaround = false

### configure the Freemarker Manager class to be used
### Allows user to plug-in customised Freemarker Manager if necessary
### MUST extends off com.opensymphony.webwork.views.freemarker.FreemarkerManager
#webwork.freemarker.manager.classname=com.opensymphony.webwork.views.freemarker.FreemarkerManager

### See the WebWorkBeanWrapper javadocs for more information
webwork.freemarker.wrapper.altMap=true

### configure the XSLTResult class to use stylesheet caching.
### Set to true for developers and false for production.
webwork.xslt.nocache=false</pre><img src ="http://www.blogjava.net/rain1102/aggbug/87328.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2006-12-12 19:28 <a href="http://www.blogjava.net/rain1102/archive/2006/12/12/87328.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>webwork+spring+hibernate架构目录结构</title><link>http://www.blogjava.net/rain1102/archive/2006/12/11/86877.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Mon, 11 Dec 2006 05:21:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2006/12/11/86877.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/86877.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2006/12/11/86877.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/86877.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/86877.html</trackback:ping><description><![CDATA[<table cellspacing="0" cellpadding="0" width="500" border="0">
				<tbody>
						<tr>
								<td width="10">
								</td>
								<td width="490">
										<span class="oblog_text">
												<p class="MsoNormal">
														<span lang="EN-US">
																<span>&#160;&#160;&#160;&#160;&#160;转自<a href="/black_zerg/archive/2005/05/30/5327.html">http://www.blogjava.net/black_zerg/archive/2005/05/30/5327.html</a>&#160; </span>
														</span>
												</p>
												<table class="MsoTableGrid" style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse" cellspacing="0" cellpadding="0" border="1">
														<tbody>
																<tr>
																		<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; WIDTH: 213.05pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" valign="top" width="284">
																				<p class="MsoNormal">
																						<span lang="EN-US">
																								<img style="CURSOR: pointer" onclick="javascript:window.open(this.src);" src="http://www.blogjava.net/images/blogjava_net/black_zerg/1560/o_image002.jpg" width="200" onload="javascript:if(this.width&gt;1000){this.resized=true;this.style.width=1000;}" border="0" />
																						</span>
																				</p>
																		</td>
																		<td style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 213.05pt; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid" valign="top" width="284">
																				<p class="MsoNormal">
																						<span lang="EN-US">
																								<span>&#160;&#160;&#160;&#160;&#160;&#160; </span>
																						</span>
																						<span style="FONT-FAMILY: 宋体">在</span>
																						<span lang="EN-US">src</span>
																						<span style="FONT-FAMILY: 宋体">目录下为</span>
																						<span lang="EN-US">
																								<a title="Java爱好者" href="/rain1102">Java</a>
																						</span>
																						<span style="FONT-FAMILY: 宋体">源码</span>
																				</p>
																				<p class="MsoNormal">
																						<b>
																								<span lang="EN-US">dao<span>&#160;&#160;&#160; </span></span>
																						</b>
																						<b>
																								<span style="FONT-FAMILY: 宋体">负责数据访问对象的定义和实现</span>
																								<span lang="EN-US">
																										<?xml:namespace prefix = o /?>
																										<o:p>
																										</o:p>
																								</span>
																						</b>
																				</p>
																				<p class="MsoNormal">
																						<span lang="EN-US">
																								<span>&#160;</span>
																						</span>
																						<span style="FONT-FAMILY: 宋体">其中</span>
																						<span lang="EN-US">Dao</span>
																						<span style="FONT-FAMILY: 宋体">结尾为接口，</span>
																						<span lang="EN-US">Impl</span>
																						<span style="FONT-FAMILY: 宋体">结尾为实现。目前一般用</span>
																						<span lang="EN-US">hibernate</span>
																						<span style="FONT-FAMILY: 宋体">做实现。<br /></span>
																						<b>
																								<span lang="EN-US">domain </span>
																						</b>
																						<b>
																								<span style="FONT-FAMILY: 宋体">实体对象<br /><br /></span>
																						</b>
																						<b>
																								<span lang="EN-US">logic<span>&#160;&#160; </span></span>
																						</b>
																						<b>
																								<span style="FONT-FAMILY: 宋体">针对实体对象封装的逻辑</span>
																								<span lang="EN-US">
																										<o:p>
																										</o:p>
																								</span>
																						</b>
																				</p>
																				<p class="MsoNormal">
																						<b>
																								<span lang="EN-US">
																										<span>&#160;</span>
																								</span>
																						</b>
																						<span style="FONT-FAMILY: 宋体">这里</span>
																						<span lang="EN-US">service</span>
																						<span style="FONT-FAMILY: 宋体">是外观接口，</span>
																						<span lang="EN-US">serviceimpl</span>
																						<span style="FONT-FAMILY: 宋体">是实现，考虑目前情况简单，并没有进一步分离逻辑，业务逻辑都在</span>
																						<span lang="EN-US">impl</span>
																						<span style="FONT-FAMILY: 宋体">中完成。</span>
																				</p>
																				<p class="MsoNormal">
																						<b>
																								<span lang="EN-US">web<span>&#160;&#160;&#160; </span></span>
																						</b>
																						<b>
																								<span style="FONT-FAMILY: 宋体">界面相关的</span>
																								<span lang="EN-US">
																										<a title="Java爱好者" href="/rain1102">Java</a>
																								</span>
																						</b>
																						<b>
																								<span style="FONT-FAMILY: 宋体">类</span>
																								<span lang="EN-US">
																										<o:p>
																										</o:p>
																								</span>
																						</b>
																				</p>
																				<p class="MsoNormal">
																						<span lang="EN-US">
																								<span>&#160;</span>
																								<span style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 0cm; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 0cm; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid">common</span>
																						</span>
																						<span style="FONT-FAMILY: 宋体">是一些常用类，如处理中文问题的</span>
																						<span lang="EN-US">filter.</span>
																				</p>
																				<p class="MsoNormal">
																						<span lang="EN-US">
																								<span>&#160;</span>
																								<span style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 0cm; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 0cm; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid">displaytag</span>
																						</span>
																						<span style="FONT-FAMILY: 宋体">中放了</span>
																						<span lang="EN-US">displaytag</span>
																						<span style="FONT-FAMILY: 宋体">相关的类，多为</span>
																						<span lang="EN-US">wrapper.</span>
																				</p>
																				<p class="MsoNormal">
																						<span lang="EN-US">
																								<span>&#160;</span>
																								<span style="BORDER-RIGHT: windowtext 1pt solid; PADDING-RIGHT: 0cm; BORDER-TOP: windowtext 1pt solid; PADDING-LEFT: 0cm; PADDING-BOTTOM: 0cm; BORDER-LEFT: windowtext 1pt solid; PADDING-TOP: 0cm; BORDER-BOTTOM: windowtext 1pt solid">webwork</span>
																						</span>
																						<span style="FONT-FAMILY: 宋体">中都是对应的</span>
																						<span lang="EN-US">action</span>
																						<span style="FONT-FAMILY: 宋体">，</span>
																				</p>
																				<p class="MsoNormal" style="TEXT-INDENT: 10.5pt">
																						<span style="FONT-FAMILY: 宋体">其中</span>
																						<span lang="EN-US"> BaseAction</span>
																						<span style="FONT-FAMILY: 宋体">是基本的抽象类，基本后续开发应继承此类</span>
																				</p>
																				<p class="MsoNormal" style="TEXT-INDENT: 10.5pt">
																						<span lang="EN-US">CrudAction</span>
																						<span style="FONT-FAMILY: 宋体">是为了一般的</span>
																						<span lang="EN-US">Crud</span>
																						<span style="FONT-FAMILY: 宋体">工作而作的一个抽象类，可以继承用来简化工作。</span>
																				</p>
																				<p class="MsoNormal" style="TEXT-INDENT: 10.5pt">
																						<span style="FONT-FAMILY: 宋体">而</span>
																						<span lang="EN-US">CaseDispatcher</span>
																						<span style="FONT-FAMILY: 宋体">负责菜单点击后分发到相关</span>
																						<span lang="EN-US">Action</span>
																						<span style="FONT-FAMILY: 宋体">，同时处理权限和</span>
																						<span lang="EN-US">session</span>
																						<span style="FONT-FAMILY: 宋体">工作。<br />&#160; </span>
																						<span style="FONT-FAMILY: 宋体">其他</span>
																						<span lang="EN-US">action</span>
																						<span style="FONT-FAMILY: 宋体">按模块进行了组织</span>
																				</p>
																		</td>
																</tr>
																<tr>
																		<td style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: 1pt solid; WIDTH: 213.05pt; PADDING-TOP: 0cm; BORDER-BOTTOM: 1pt solid" valign="top" width="284">
																				<p class="MsoNormal">
																						<span lang="EN-US">
																								<img style="CURSOR: pointer" onclick="javascript:window.open(this.src);" src="http://www.blogjava.net/images/blogjava_net/black_zerg/1560/o_image004.jpg" width="200" onload="javascript:if(this.width&gt;1000){this.resized=true;this.style.width=1000;}" border="0" />
																						</span>
																				</p>
																		</td>
																		<td style="BORDER-RIGHT: 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: medium none; WIDTH: 213.05pt; PADDING-TOP: 0cm; BORDER-BOTTOM: 1pt solid" valign="top" width="284">
																				<p class="MsoNormal">
																						<span style="FONT-FAMILY: 宋体">左边是</span>
																						<span lang="EN-US">webroot</span>
																						<span style="FONT-FAMILY: 宋体">的结构</span>
																				</p>
																				<p class="MsoNormal">
																						<span lang="EN-US">
																								<o:p>&#160;</o:p>
																						</span>
																				</p>
																				<p class="MsoNormal">
																						<span lang="EN-US">
																								<o:p>&#160;</o:p>
																						</span>
																				</p>
																				<p class="MsoNormal">
																						<span style="FONT-FAMILY: 宋体">重要的配置文件有：</span>
																				</p>
																				<p class="MsoNormal">
																						<b>
																								<span lang="EN-US">Spring<o:p></o:p></span>
																						</b>
																				</p>
																				<p class="MsoNormal" style="TEXT-INDENT: 5.25pt">
																						<span lang="EN-US">applicationContext.xml</span>
																				</p>
																				<p class="MsoNormal" style="TEXT-INDENT: 5.25pt">
																						<span lang="EN-US">applicationContext-db.xml</span>
																				</p>
																				<p class="MsoNormal">
																						<b>
																								<span lang="EN-US">Webwork<o:p></o:p></span>
																						</b>
																				</p>
																				<p class="MsoNormal" style="TEXT-INDENT: 5.25pt">
																						<span lang="EN-US">xwork.xml</span>
																				</p>
																				<p class="MsoNormal" style="TEXT-INDENT: 5.25pt">
																						<span lang="EN-US">webwork.properties</span>
																				</p>
																				<p class="MsoNormal">
																						<b>
																								<span lang="EN-US">i18n<o:p></o:p></span>
																						</b>
																				</p>
																				<p class="MsoNormal">
																						<span lang="EN-US">
																								<span>&#160;</span>labels.properties</span>
																				</p>
																				<p class="MsoNormal">
																						<b>
																								<span lang="EN-US">log4j<o:p></o:p></span>
																						</b>
																				</p>
																				<p class="MsoNormal">
																						<span lang="EN-US">
																								<span>&#160;</span>log4j.properties</span>
																				</p>
																				<p class="MsoNormal">
																						<b>
																								<span lang="EN-US">displaytag<o:p></o:p></span>
																						</b>
																				</p>
																				<p class="MsoNormal">
																						<span lang="EN-US">
																								<span>&#160;</span>displaytag.properties</span>
																				</p>
																				<p class="MsoNormal">
																						<b>
																								<span lang="EN-US">dbConnect<o:p></o:p></span>
																						</b>
																				</p>
																				<p class="MsoNormal">
																						<span lang="EN-US">
																								<span>&#160;</span>jdbc.properties</span>
																				</p>
																		</td>
																</tr>
														</tbody>
												</table>
												<p class="MsoNormal">
														<span lang="EN-US">
																<o:p>&#160;</o:p>
														</span>
												</p>
												<p class="MsoNormal">
														<span style="FONT-FAMILY: 宋体">关于一些技术难点和细节：</span>
												</p>
												<p class="MsoNormal" style="MARGIN-LEFT: 18pt; TEXT-INDENT: -18pt">
														<span lang="EN-US">
																<span>1．<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&#160; </span></span>
														</span>
														<span style="FONT-FAMILY: 宋体">各框架连接：</span>
														<span lang="EN-US">spring</span>
														<span style="FONT-FAMILY: 宋体">到</span>
														<span lang="EN-US">hibernate</span>
														<span style="FONT-FAMILY: 宋体">使用</span>
														<span lang="EN-US">spring</span>
														<span style="FONT-FAMILY: 宋体">的</span>
														<span lang="EN-US">hibernate</span>
														<span style="FONT-FAMILY: 宋体">支持。</span>
														<span lang="EN-US">Spring</span>
														<span style="FONT-FAMILY: 宋体">到</span>
														<span lang="EN-US">webwork</span>
														<span style="FONT-FAMILY: 宋体">使用</span>
														<span lang="EN-US">autoware</span>
														<span style="FONT-FAMILY: 宋体">的拦截机制自动装配。</span>
												</p>
												<p class="MsoNormal" style="MARGIN-LEFT: 18pt; TEXT-INDENT: -18pt">
														<span lang="EN-US">
																<span>2．<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&#160; </span></span>
														</span>
														<span style="FONT-FAMILY: 宋体">列表的问题，采用</span>
														<span lang="EN-US">displaytag</span>
														<span style="FONT-FAMILY: 宋体">。功能强大，使用简洁，可实现排序和数据导出。</span>
												</p>
												<p class="MsoNormal" style="MARGIN-LEFT: 18pt; TEXT-INDENT: -18pt">
														<span lang="EN-US">
																<span>3．<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&#160; </span></span>
														</span>
														<span style="FONT-FAMILY: 宋体">数据下载，使用</span>
														<span lang="EN-US">displaytag</span>
														<span style="FONT-FAMILY: 宋体">自带的</span>
														<span lang="EN-US">excel</span>
														<span style="FONT-FAMILY: 宋体">下载</span>
												</p>
												<p class="MsoNormal" style="MARGIN-LEFT: 18pt; TEXT-INDENT: -18pt">
														<span lang="EN-US">
																<span>4．<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&#160; </span></span>
														</span>
														<span style="FONT-FAMILY: 宋体">文件上传，使用</span>
														<span lang="EN-US">webwork</span>
														<span style="FONT-FAMILY: 宋体">提供的解决方案，用拦截机制实现。</span>
												</p>
												<p class="MsoNormal" style="MARGIN-LEFT: 18pt; TEXT-INDENT: -18pt">
														<span lang="EN-US">
																<span>5．</span>
														</span>
														<span lang="EN-US">jsp</span>
														<span style="FONT-FAMILY: 宋体">代码组织方面，我们使用</span>
														<span lang="EN-US">taglib</span>
														<span style="FONT-FAMILY: 宋体">和</span>
														<span lang="EN-US">css</span>
														<span style="FONT-FAMILY: 宋体">技术使</span>
														<span lang="EN-US">jsp</span>
														<span style="FONT-FAMILY: 宋体">中页面逻辑减少到最小，一般情况完全可以不使用</span>
														<span lang="EN-US">&lt;% %&gt;</span>
														<span style="FONT-FAMILY: 宋体">的</span>
														<span lang="EN-US">script</span>
														<span style="FONT-FAMILY: 宋体">段</span>
														<span style="FONT-FAMILY: 宋体">。同时我们使用两个</span>
														<span lang="EN-US">include</span>
														<span style="FONT-FAMILY: 宋体">来包含常用的</span>
														<span lang="EN-US">taglib</span>
														<span style="FONT-FAMILY: 宋体">定义，</span>
														<span lang="EN-US">js</span>
														<span style="FONT-FAMILY: 宋体">引用和</span>
														<span lang="EN-US">html</span>
														<span style="FONT-FAMILY: 宋体">结构，使</span>
														<span lang="EN-US">jsp</span>
														<span style="FONT-FAMILY: 宋体">代码非常简洁。</span>
												</p>
												<p class="MsoNormal" style="MARGIN-LEFT: 18pt; TEXT-INDENT: -18pt">
														<span lang="EN-US">
																<span>6．<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&#160; </span></span>
														</span>
														<span style="FONT-FAMILY: 宋体">中文问题</span>
														<span style="FONT-FAMILY: 宋体">我们使用</span>
														<span lang="EN-US">filter</span>
														<span style="FONT-FAMILY: 宋体">来解决页面</span>
														<span lang="EN-US">gbk</span>
														<span style="FONT-FAMILY: 宋体">到</span>
														<span lang="EN-US">
																<a title="Java爱好者" href="/rain1102">Java</a>
														</span>
														<span style="FONT-FAMILY: 宋体">程序</span>
														<span lang="EN-US">unicode</span>
														<span style="FONT-FAMILY: 宋体">的转换，同时通过正确的设置数据库连接</span>
														<span lang="EN-US">url</span>
														<span style="FONT-FAMILY: 宋体">完成和数据库之间的交互。</span>
												</p>
												<p class="MsoNormal" style="MARGIN-LEFT: 18pt; TEXT-INDENT: -18pt">
														<span lang="EN-US">
																<span>7．<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&#160; </span></span>
														</span>
														<span lang="EN-US">I18n</span>
														<span style="FONT-FAMILY: 宋体">国际化。我们要求在</span>
														<span lang="EN-US">jsp</span>
														<span style="FONT-FAMILY: 宋体">代码中不出现中文，所有提示信息都通过资源文件</span>
														<span lang="EN-US">labels.properties</span>
														<span style="FONT-FAMILY: 宋体">来完成。页面中可以使用</span>
														<span lang="EN-US">jstl</span>
														<span style="FONT-FAMILY: 宋体">或</span>
														<span lang="EN-US">webwork</span>
														<span style="FONT-FAMILY: 宋体">标签来调用。</span>
												</p>
												<p class="MsoNormal" style="MARGIN-LEFT: 18pt; TEXT-INDENT: -18pt">
														<span lang="EN-US">
																<span>8．<span style="FONT: 7pt 'Times New Roman'; font-size-adjust: none; font-stretch: normal">&#160; </span></span>
														</span>
														<span style="FONT-FAMILY: 宋体">界面验证问题。使用</span>
														<span lang="EN-US">webwork</span>
														<span style="FONT-FAMILY: 宋体">的</span>
														<span lang="EN-US">validate</span>
														<span style="FONT-FAMILY: 宋体">机制用</span>
														<span lang="EN-US">xml</span>
														<span style="FONT-FAMILY: 宋体">定义，或在</span>
														<span lang="EN-US">action</span>
														<span style="FONT-FAMILY: 宋体">中代码判断。</span>
												</p>
										</span>
								</td>
						</tr>
				</tbody>
		</table><img src ="http://www.blogjava.net/rain1102/aggbug/86877.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2006-12-11 13:21 <a href="http://www.blogjava.net/rain1102/archive/2006/12/11/86877.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>