﻿<?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-kangdy-随笔分类-Structs</title><link>http://www.blogjava.net/kangdy/category/47762.html</link><description>我就像AK47里打出去的子弹。目标TMD永远在前方。我只能TMD拼命向前。</description><language>zh-cn</language><lastBuildDate>Sat, 07 Jan 2012 12:59:02 GMT</lastBuildDate><pubDate>Sat, 07 Jan 2012 12:59:02 GMT</pubDate><ttl>60</ttl><item><title>(转载)关于paramsPrepareParamsStack</title><link>http://www.blogjava.net/kangdy/archive/2011/11/16/363973.html</link><dc:creator>AK47</dc:creator><author>AK47</author><pubDate>Wed, 16 Nov 2011 07:39:00 GMT</pubDate><guid>http://www.blogjava.net/kangdy/archive/2011/11/16/363973.html</guid><wfw:comment>http://www.blogjava.net/kangdy/comments/363973.html</wfw:comment><comments>http://www.blogjava.net/kangdy/archive/2011/11/16/363973.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kangdy/comments/commentRss/363973.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kangdy/services/trackbacks/363973.html</trackback:ping><description><![CDATA[原帖地址： <div><a href="http://hi.baidu.com/%CC%AB%C6%BD%D1%F31986/blog/item/110b13b1384e805e08230259.html">http://hi.baidu.com/%CC%AB%C6%BD%D1%F31986/blog/item/110b13b1384e805e08230259.html</a><br /><fieldset><legend>转贴</legend><p> paramsPrepareParamsStack在Struts 2.0中是一个很奇妙的interceptor  stack，以至于很多人疑问为何不将其设置为默认的interceptor  stack。paramsPrepareParamsStack主要解决了ModelDriven和Preparable的配合问题，<span style="color: #ff0000;">从字面上理解来说， 这个stack的拦截器调用的顺序为：首先params，然后prepare，接下来modelDriven，最后再params。Struts  2.0的设计上要求modelDriven在params之前调用，而业务中prepare要负责准备model，准备model又需要参数，这就需要在 prepare之前运行params拦截器设置相关参数，这个也就是创建paramsPrepareParamsStack的原因。</span>流程如下：<br /> &nbsp;&nbsp; <span style="color: #008000;"> 1. params拦截器首先给action中的相关参数赋值，如id&nbsp;&nbsp; </span><br /><span style="color: #008000;"> &nbsp;&nbsp;  2. prepare拦截器执行prepare方法，prepare方法中会根据参数，如id，去调用业务逻辑，设置model对象</span><br /><span style="color: #008000;"> &nbsp;&nbsp;  3. modelDriven拦截器将model对象压入value stack，这里的model对象就是在prepare中创建的</span><br /><span style="color: #008000;"> &nbsp;&nbsp;  4. params拦截器再将参数赋值给model对象</span><br /><span style="color: #008000;"> &nbsp;&nbsp;  5. action的业务逻辑执行 依据此stack，一个action的代码通常如下</span>： <br /></p><p><div>public class UserAction extends ActionSupport implements ModelDriven, Preparable {<br />&nbsp;&nbsp; &nbsp;private User user;<br />&nbsp;&nbsp; &nbsp;private int id;<br />&nbsp;&nbsp; &nbsp;private UserService service; // user business service<br /><br />&nbsp;&nbsp; &nbsp;public void setId(int id) {<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;this.id = id;<br />&nbsp;&nbsp; &nbsp;}<br /><br />&nbsp;&nbsp; &nbsp;/**<br />&nbsp;&nbsp; &nbsp; * create a new user if none exists, otherwise load the user with the<br />&nbsp;&nbsp; &nbsp; * specified id<br />&nbsp;&nbsp; &nbsp; */<br />&nbsp;&nbsp; &nbsp;public void prepare() throws Exception {<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if (id == 0) {<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;user = new User();<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;} else {<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;user = service.findUserById(id);<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br />&nbsp;&nbsp; &nbsp;}<br /><br />&nbsp;&nbsp; &nbsp;public Object getModel() {<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return user;<br />&nbsp;&nbsp; &nbsp;}<br /><br />&nbsp;&nbsp; &nbsp;/**<br />&nbsp;&nbsp; &nbsp; * create or update the user and then view the created user<br />&nbsp;&nbsp; &nbsp; */<br />&nbsp;&nbsp; &nbsp;public String update() {<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;if (id == 0) {<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;service.create(user);<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;} else {<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;service.update(user);<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;}<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return "redirect";<br />&nbsp;&nbsp; &nbsp;}<br /><br />&nbsp;&nbsp; &nbsp;/**<br />&nbsp;&nbsp; &nbsp; * delete the user and go to a default home page<br />&nbsp;&nbsp; &nbsp; */<br />&nbsp;&nbsp; &nbsp;public String delete() {<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;service.deleteById(id);<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return "home";<br />&nbsp;&nbsp; &nbsp;}<br /><br />&nbsp;&nbsp; &nbsp;/**<br />&nbsp;&nbsp; &nbsp; * show the page allowing the user to view the existing data<br />&nbsp;&nbsp; &nbsp; */<br />&nbsp;&nbsp; &nbsp;public String view() {<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return "view";<br />&nbsp;&nbsp; &nbsp;}<br /><br />&nbsp;&nbsp; &nbsp;/**<br />&nbsp;&nbsp; &nbsp; * show the page allowing the user to view the existing data and change the<br />&nbsp;&nbsp; &nbsp; * values<br />&nbsp;&nbsp; &nbsp; */<br />&nbsp;&nbsp; &nbsp;public String edit() {<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;return "input";<br />&nbsp;&nbsp; &nbsp;}</div><br /> 在上述代码中，edit和view都不需要根据id再为界面准备数据，因为prepare方法已经准备好了model，这些方法很简单。对于update 方法，prepare首先会从数据库中加载数据，然后params拦截器会将参数值付给model，在update直接更新就可以，不会出现数据被乱更新 的情况。象Hibernate框架，会判断哪些字段更新了，然后进行更新，性能也不会损失。<br /> 通过paramsPrepareParamsStack可以让流程更明确，代码更简洁，也更利于大家的交流。</p></fieldset></div><img src ="http://www.blogjava.net/kangdy/aggbug/363973.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kangdy/" target="_blank">AK47</a> 2011-11-16 15:39 <a href="http://www.blogjava.net/kangdy/archive/2011/11/16/363973.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(转载) Struts 2杂谈（1）：ValueStack对象的传送带机制</title><link>http://www.blogjava.net/kangdy/archive/2011/11/11/363543.html</link><dc:creator>AK47</dc:creator><author>AK47</author><pubDate>Fri, 11 Nov 2011 09:21:00 GMT</pubDate><guid>http://www.blogjava.net/kangdy/archive/2011/11/11/363543.html</guid><wfw:comment>http://www.blogjava.net/kangdy/comments/363543.html</wfw:comment><comments>http://www.blogjava.net/kangdy/archive/2011/11/11/363543.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kangdy/comments/commentRss/363543.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kangdy/services/trackbacks/363543.html</trackback:ping><description><![CDATA[<div><strong>Struts 2杂谈（1）：ValueStack对象的传送带机</strong>制</div>作者：<strong>nokiaguy</strong>&nbsp; 原文地址：<a href="http://blog.csdn.net/nokiaguy/article/details/4684750">http://blog.csdn.net/nokiaguy/article/details/4684750</a><br /><fieldset><legend>转贴</legend><div>&nbsp;&nbsp; 众所周知，Strut  2的Action类通过属性可以获得所有相关的值，如请求参数、Action配置参数、向其他Action传递属性值（通过chain结果）等等。要获得 这些参数值，我们要做的唯一一件事就是在Action类中声明与参数同名的属性，在Struts  2调用Action类的Action方法（默认是execute方法）之前，就会为相应的Action属性赋值。<br /> &nbsp;&nbsp;&nbsp; 要完成这个功能，有很大程度上，Struts  2要依赖于ValueStack对象。这个对象贯穿整个Action的生命周期（每个Action类的对象实例会拥有一个ValueStack对象）。当 Struts  2接收到一个.action的请求后，会先建立Action类的对象实例，并且将Action类的对象实例压入ValueStack对象中（实际 上，ValueStack对于相当一个栈），而ValueStack类的setValue和findValue方法可以设置和获得Action对象的属性 值。Struts  2中的某些拦截器正是通过ValueStack类的setValue方法来修改Action类的属性值的。如params拦截器用于将请求参数值映射到相 应成Action类的属性值。在params拦截器中在获得请求参数值后，会使用setValue方法设置相应的Action类的属性。<br /> &nbsp;&nbsp;&nbsp; 从这一点可以看出，<span style="color: #008000;">ValueStack对象就象一个传送带，当客户端请求.action时，Struts  2在创建相应用Action对象后就将Action对象放到了ValueStack传送带上，然后ValueStack传送带会带着Action对象经过 若干拦截器，在每一拦截器中都可以通过ValueStack对象设置和获得Action对象中的属性值。实际上，这些拦截器就相当于流水线作业。如果要对 Action对象进行某项加工，再加一个拦截器即可，当不需要进行这项工作时，直接将该拦截器去掉即可。</span><br /> &nbsp;&nbsp;&nbsp; 下面我们使用一个例子来演示这个过程。在这个例子中实现了一个拦截器，该拦截器的功能是将一个属性文件中的key-value对映射成相应的属性的值。如下面是一个属性文件的内容：<br /> <br /> &nbsp;&nbsp;&nbsp; name = 超人<br /> &nbsp;&nbsp;&nbsp; price = 10000<br /> <br /> &nbsp;&nbsp;&nbsp; 我们可以在Action类中定义name和price属性，在Action中引用这个拦截器后，就会自动为属性赋值。<br /> &nbsp;&nbsp;&nbsp; 在使用该拦截器有如下规则：<br /> &nbsp;&nbsp;&nbsp; 1.&nbsp; 拦截器读取的属性文件路径由path参数指定。<br /> &nbsp;&nbsp;&nbsp; 2.&nbsp; 属性文件的编码格式由encoding参数指定，默认值是UTF-8。<br /> &nbsp;&nbsp;&nbsp; 3.&nbsp; 如果某个key中包含有&#8220;.&#8221;（该符号不能出现在标识符中），则有如下处理方法：<br /> &nbsp;&nbsp;&nbsp; （1）将Action类的属性名定义为去掉&#8220;.&#8221;的key。例如，key为person.name，而属性名可定义为personname。<br /> &nbsp;&nbsp;&nbsp; （2）将Action类的属性名定义为将&#8220;.&#8221;替换成其他字符的表示符号。例如，key为person.name，而属性名可定义为person_name，其中&#8220;_&#8221;由separator参数指定。<br /> &nbsp;&nbsp;&nbsp; 4.&nbsp; 如果key太长，也可以直接使用Action参数进行映射，例如，key为country.person.name，可做如下映射：<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param name="countrypersonname"&gt;name&lt;/param&gt;<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 要注意的是，name属性值不能包含&#8220;.&#8221;，因此，应将key值中的&#8220;.&#8221;去掉。现在就可以直接在Action类中定义名为name的属性的，name属性的值会与key值相同。<br /> &nbsp;&nbsp;&nbsp; 5.&nbsp; 上面所有的规则可以同时使用。<br /> <br /> 拦截器的源代码：<br /> <br /> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><span style="color: #0000ff;">package</span><span style="color: #000000;">&nbsp;interceptors;<br /> <br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.util.Enumeration;<br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.util.Map;<br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.util.Properties;<br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.io.InputStream;<br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.io.FileInputStream;<br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;com.opensymphony.xwork2.ActionContext;<br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;com.opensymphony.xwork2.ActionInvocation;<br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;com.opensymphony.xwork2.config.entities.ActionConfig;<br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;com.opensymphony.xwork2.interceptor.AbstractInterceptor;<br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;com.opensymphony.xwork2.util.ValueStack;<br /> <br /> </span><span style="color: #0000ff;">public</span>&nbsp;<span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;PropertyInterceptor&nbsp;</span><span style="color: #0000ff;">extends</span><span style="color: #000000;">&nbsp;AbstractInterceptor<br /> {<br /> &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span>&nbsp;<span style="color: #0000ff;">static</span>&nbsp;<span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;String&nbsp;DEFAULT_PATH_KEY&nbsp;</span><span style="color: #000000;">=</span>&nbsp;<span style="color: #000000;">"</span><span style="color: #000000;">path</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br /> &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span>&nbsp;<span style="color: #0000ff;">static</span>&nbsp;<span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;String&nbsp;DEFAULT_ENCODING_KEY&nbsp;</span><span style="color: #000000;">=</span>&nbsp;<span style="color: #000000;">"</span><span style="color: #000000;">encoding</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br /> &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span>&nbsp;<span style="color: #0000ff;">static</span>&nbsp;<span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;String&nbsp;DEFAULT_SEPARATOR_KEY&nbsp;</span><span style="color: #000000;">=</span>&nbsp;<span style="color: #000000;">"</span><span style="color: #000000;">separator</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br /> <br /> &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">protected</span><span style="color: #000000;">&nbsp;String&nbsp;pathKey&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;DEFAULT_PATH_KEY;<br /> &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">protected</span><span style="color: #000000;">&nbsp;String&nbsp;encodingKey&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;DEFAULT_ENCODING_KEY;<br /> &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">protected</span><span style="color: #000000;">&nbsp;String&nbsp;separatorKey&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;DEFAULT_SEPARATOR_KEY;<br /> <br /> &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span>&nbsp;<span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setPathKey(String&nbsp;pathKey)&nbsp;<br /> &nbsp;&nbsp;&nbsp;&nbsp;{<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.pathKey&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;pathKey;<br /> &nbsp;&nbsp;&nbsp;&nbsp;}<br /> <br /> &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span>&nbsp;<span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setEncodingKey(String&nbsp;encodingKey)<br /> &nbsp;&nbsp;&nbsp;&nbsp;{<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.encodingKey&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;encodingKey;<br /> &nbsp;&nbsp;&nbsp;&nbsp;}<br /> <br /> &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span>&nbsp;<span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setSeparatorKey(String&nbsp;separatorKey)<br /> &nbsp;&nbsp;&nbsp;&nbsp;{<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.separatorKey&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;separatorKey;<br /> &nbsp;&nbsp;&nbsp;&nbsp;}<br /> <br /> &nbsp;&nbsp;&nbsp;&nbsp;@Override<br /> &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;intercept(ActionInvocation&nbsp;invocation)&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;Exception<br /> &nbsp;&nbsp;&nbsp;&nbsp;{<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ActionConfig&nbsp;config&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;invocation.getProxy().getConfig();<br /> <br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Map</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">String,&nbsp;String</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;parameters&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;config.getParams();<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(parameters.containsKey(pathKey))<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;path&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;parameters.get(pathKey);<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;encoding&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;parameters.get(encodingKey);<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;separator&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;parameters.get(separatorKey);<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(encoding&nbsp;</span><span style="color: #000000;">==</span>&nbsp;<span style="color: #0000ff;">null</span><span style="color: #000000;">)<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;encoding&nbsp;</span><span style="color: #000000;">=</span>&nbsp;<span style="color: #000000;">"</span><span style="color: #000000;">UTF-8</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(separator&nbsp;</span><span style="color: #000000;">==</span>&nbsp;<span style="color: #0000ff;">null</span><span style="color: #000000;">)<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;separator&nbsp;</span><span style="color: #000000;">=</span>&nbsp;<span style="color: #000000;">""</span><span style="color: #000000;">;<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;path&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;invocation.getAction().getClass().getResource(path)<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.getPath();<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Properties&nbsp;properties&nbsp;</span><span style="color: #000000;">=</span>&nbsp;<span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Properties();<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InputStream&nbsp;is&nbsp;</span><span style="color: #000000;">=</span>&nbsp;<span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;FileInputStream(path);<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;java.io.Reader&nbsp;reader&nbsp;</span><span style="color: #000000;">=</span>&nbsp;<span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;java.io.InputStreamReader(is,&nbsp;encoding);<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;properties.load(reader);<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ActionContext&nbsp;ac&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;invocation.getInvocationContext();<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ValueStack&nbsp;stack&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;ac.getValueStack();<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(stack.hashCode());<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Enumeration&nbsp;names&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;properties.propertyNames();<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(names.hasMoreElements())<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;&nbsp;下面会使用setValue方法修改ValueStack对象中的相应属性值</span><span style="color: #008000;"><br /> </span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;name&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;names.nextElement().toString();<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">!</span><span style="color: #000000;">name.contains(</span><span style="color: #000000;">"</span><span style="color: #000000;">.</span><span style="color: #000000;">"</span><span style="color: #000000;">))<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stack.setValue(name,&nbsp;properties.get(name));&nbsp;<br /> <br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;newName&nbsp;</span><span style="color: #000000;">=</span>&nbsp;<span style="color: #0000ff;">null</span><span style="color: #000000;">;<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newName&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;parameters.get(name.replaceAll(</span><span style="color: #000000;">"</span><span style="color: #000000;">//.</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">""</span><span style="color: #000000;">));<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(newName&nbsp;</span><span style="color: #000000;">!=</span>&nbsp;<span style="color: #0000ff;">null</span><span style="color: #000000;">)<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stack.setValue(newName,&nbsp;properties.get(name));<br /> <br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">!</span><span style="color: #000000;">separator.equals(</span><span style="color: #000000;">""</span><span style="color: #000000;">))<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newName&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;name.replaceAll(</span><span style="color: #000000;">"</span><span style="color: #000000;">//.</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">""</span><span style="color: #000000;">);<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stack.setValue(newName,&nbsp;properties.get(name));<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newName&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;name.replaceAll(</span><span style="color: #000000;">"</span><span style="color: #000000;">//.</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;separator);<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stack.setValue(newName,&nbsp;properties.get(name));<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;invocation.invoke();<br /> &nbsp;&nbsp;&nbsp;&nbsp;}<br /> }<br /> </span></div> <br /> 用于测试的Action类的源代码：<br /> <br /> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><span style="color: #0000ff;">package</span><span style="color: #000000;">&nbsp;actions;<br /> <br /> </span><span style="color: #0000ff;">public</span>&nbsp;<span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;MyAction<br /> {<br /> &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;String&nbsp;name;<br /> &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;Integer&nbsp;price;<br /> &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;String&nbsp;log4jappenderstdout;<br /> &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;String&nbsp;log4j_rootLogger;<br /> &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;String&nbsp;conversionPattern;<br /> <br /> &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;getName()<br /> &nbsp;&nbsp;&nbsp;&nbsp;{<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;name;<br /> &nbsp;&nbsp;&nbsp;&nbsp;}<br /> <br /> &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span>&nbsp;<span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setName(String&nbsp;name)<br /> &nbsp;&nbsp;&nbsp;&nbsp;{<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.name&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;name;<br /> &nbsp;&nbsp;&nbsp;&nbsp;}<br /> <br /> &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Integer&nbsp;getPrice()<br /> &nbsp;&nbsp;&nbsp;&nbsp;{<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;price;<br /> &nbsp;&nbsp;&nbsp;&nbsp;}<br /> <br /> &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span>&nbsp;<span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setPrice(Integer&nbsp;price)<br /> &nbsp;&nbsp;&nbsp;&nbsp;{<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.price&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;price;<br /> &nbsp;&nbsp;&nbsp;&nbsp;}<br /> <br /> &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;getLog4jappenderstdout()<br /> &nbsp;&nbsp;&nbsp;&nbsp;{<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;log4jappenderstdout;<br /> &nbsp;&nbsp;&nbsp;&nbsp;}<br /> <br /> &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span>&nbsp;<span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setLog4jappenderstdout(String&nbsp;log4jappenderstdout)<br /> &nbsp;&nbsp;&nbsp;&nbsp;{<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.log4jappenderstdout&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;log4jappenderstdout;<br /> &nbsp;&nbsp;&nbsp;&nbsp;}<br /> <br /> &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;getLog4j_rootLogger()<br /> &nbsp;&nbsp;&nbsp;&nbsp;{<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;log4j_rootLogger;<br /> &nbsp;&nbsp;&nbsp;&nbsp;}<br /> <br /> &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span>&nbsp;<span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setLog4j_rootLogger(String&nbsp;log4j_rootLogger)<br /> &nbsp;&nbsp;&nbsp;&nbsp;{<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.log4j_rootLogger&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;log4j_rootLogger;<br /> &nbsp;&nbsp;&nbsp;&nbsp;}<br /> <br /> &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;getConversionPattern()<br /> &nbsp;&nbsp;&nbsp;&nbsp;{<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;conversionPattern;<br /> &nbsp;&nbsp;&nbsp;&nbsp;}<br /> <br /> &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span>&nbsp;<span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;setConversionPattern(String&nbsp;conversionPattern)<br /> &nbsp;&nbsp;&nbsp;&nbsp;{<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.conversionPattern&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;conversionPattern;<br /> &nbsp;&nbsp;&nbsp;&nbsp;}<br /> <br /> &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;execute()<br /> &nbsp;&nbsp;&nbsp;&nbsp;{<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">name:</span><span style="color: #000000;">"</span>&nbsp;<span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;name);<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">price:</span><span style="color: #000000;">"</span>&nbsp;<span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;price);<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">log4jappenderstdout:</span><span style="color: #000000;">"</span>&nbsp;<span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;log4jappenderstdout);<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">log4j_rootLogger:</span><span style="color: #000000;">"</span>&nbsp;<span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;log4j_rootLogger);<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">conversionPattern:</span><span style="color: #000000;">"</span>&nbsp;<span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;conversionPattern);<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span>&nbsp;<span style="color: #0000ff;">null</span><span style="color: #000000;">;<br /> &nbsp;&nbsp;&nbsp;&nbsp;}<br /> }<br /> </span></div> <br /> Action类的配置代码如：<br /> <br /> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><span style="color: #0000ff;">&lt;?</span><span style="color: #ff00ff;">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"&nbsp;</span><span style="color: #0000ff;">?&gt;</span><span style="color: #000000;"><br /> </span><span style="color: #0000ff;">&lt;!</span><span style="color: #ff00ff;">DOCTYPE&nbsp;struts&nbsp;PUBLIC<br /> &nbsp;&nbsp;&nbsp;&nbsp;"-//Apache&nbsp;Software&nbsp;Foundation//DTD&nbsp;Struts&nbsp;Configuration&nbsp;2.1//EN"<br /> &nbsp;&nbsp;&nbsp;&nbsp;"http://struts.apache.org/dtds/struts-2.1.dtd"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br /> </span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">struts</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br /> &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">package&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="struts"</span><span style="color: #ff0000;">&nbsp;extends</span><span style="color: #0000ff;">="struts-default"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br /> <br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">interceptors</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">interceptor&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="property"</span><span style="color: #ff0000;"><br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class</span><span style="color: #0000ff;">="interceptors.PropertyInterceptor"</span>&nbsp;<span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">interceptor-stack&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="myStack"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">interceptor-ref&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="defaultStack"</span>&nbsp;<span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">interceptor-ref&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="property"</span>&nbsp;<span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">interceptor-stack</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">interceptors</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">action&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="test"</span><span style="color: #ff0000;">&nbsp;class</span><span style="color: #0000ff;">="actions.MyAction"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">interceptor-ref&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="myStack"</span>&nbsp;<span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">param&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="path"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">/</span>log4j<span style="color: #000000;">.properties</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">param</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">param&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="encoding"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">UTF-8</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">param</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">param&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="separator"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">_</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">param</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">param&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="log4jappenderstdoutlayoutConversionPattern"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conversionPattern<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">param</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br /> <br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">action</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br /> &nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">package</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br /> </span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">struts</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br /> </span></div> <br /> &nbsp; 请将log4j.properties文件复制到WEB-INF/classes目录，并在该文件中加入name和price属性。<br /> <br /> 测试结果：<br /> <br /> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><span style="color: #000000;">name:中国<br /> price:</span><span style="color: #000000;">34</span><span style="color: #000000;"><br /> log4jappenderstdout:org.apache.log4j.ConsoleAppender<br /> log4j_rootLogger:error</span><span style="color: #000000;">,</span><span style="color: #000000;">&nbsp;stdout<br /> conversionPattern:%d{ABSOLUTE}&nbsp;%5p&nbsp;%c{</span><span style="color: #000000;">1</span><span style="color: #000000;">}:%L&nbsp;-&nbsp;%m%n</span></div> <br /> &nbsp;&nbsp;&nbsp;  由于property拦截器在defaultStack后引用，因此，在该拦截器中设置的属性值是最终结果，如果将property拦截器放在 defaultStack前面（将两个&lt;interceptor-ref&gt;元素掉换一下），就可以通过同名胜Action配置参数或请求参数 来干预最终究输出结果了。 </div></fieldset><img src ="http://www.blogjava.net/kangdy/aggbug/363543.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kangdy/" target="_blank">AK47</a> 2011-11-11 17:21 <a href="http://www.blogjava.net/kangdy/archive/2011/11/11/363543.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(转贴)Struts2数据传输的背后机制：ValueStack（值栈）</title><link>http://www.blogjava.net/kangdy/archive/2011/11/11/363537.html</link><dc:creator>AK47</dc:creator><author>AK47</author><pubDate>Fri, 11 Nov 2011 08:19:00 GMT</pubDate><guid>http://www.blogjava.net/kangdy/archive/2011/11/11/363537.html</guid><wfw:comment>http://www.blogjava.net/kangdy/comments/363537.html</wfw:comment><comments>http://www.blogjava.net/kangdy/archive/2011/11/11/363537.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kangdy/comments/commentRss/363537.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kangdy/services/trackbacks/363537.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: （转）Struts2数据传输的背后机制：ValueStack（值栈）原文地址 ：http://blog.csdn.net/li_tengfei/article/details/6098134转载     1.&nbsp;&nbsp;&nbsp;&nbsp; 数据传输背后机制：ValueStack(值栈) &nbsp; 在这一切的背后，是因为有了ValueStack（值栈）！ &nbsp; Valu...&nbsp;&nbsp;<a href='http://www.blogjava.net/kangdy/archive/2011/11/11/363537.html'>阅读全文</a><img src ="http://www.blogjava.net/kangdy/aggbug/363537.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kangdy/" target="_blank">AK47</a> 2011-11-11 16:19 <a href="http://www.blogjava.net/kangdy/archive/2011/11/11/363537.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>structs2配置UrlRewriteFilter </title><link>http://www.blogjava.net/kangdy/archive/2011/11/09/363318.html</link><dc:creator>AK47</dc:creator><author>AK47</author><pubDate>Wed, 09 Nov 2011 09:22:00 GMT</pubDate><guid>http://www.blogjava.net/kangdy/archive/2011/11/09/363318.html</guid><wfw:comment>http://www.blogjava.net/kangdy/comments/363318.html</wfw:comment><comments>http://www.blogjava.net/kangdy/archive/2011/11/09/363318.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kangdy/comments/commentRss/363318.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kangdy/services/trackbacks/363318.html</trackback:ping><description><![CDATA[<fieldset><legend>转载</legend>每个网页或请求都是一个url地址，一般，这个地址可能是.do,.page,.action之类的并加上'?'号、'&amp;'号查询串等构成的一个长长的的url。很urgly。 <br /> <br />一般的url----------------------------------------------------------较好的url <br />http://www.xxx.net/user/profile.do?id=20001&nbsp;&nbsp; ====&gt; http://www.xxx.net/user/20001 <br />http://www.xxx.net/forum/board.do?name=java&nbsp;&nbsp; ====&gt; http://www.xxx.net/forum/java <br />http://www.xxx.net/forum/thread.do?id=29923&nbsp;&nbsp; ====&gt; http://www.xxx.net/thread/29923 <br /> <br />后者明显较为直观和漂亮。 <br /> <br />使用url rewrite可以很好的改善这个状况。网站url rewrite应用是非常广泛的，良好的url设计给用户带来的非常好的体验，同时也能吸引搜索引擎的注意。</fieldset>原文地址：<a href="http://www.iteye.com/topic/53834">http://www.iteye.com/topic/53834</a><br /><strong style="color: #ff0000;">使用方式：</strong> <br /><strong style="color: #339966;">1 配置web.xml文件</strong><strong style="color: #339966;"><br /></strong><strong style="color: #000000;">样例：</strong><br /><div>&nbsp;&nbsp;&nbsp; &lt;listener&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;listener-class&gt;org.springframework.web.context.ContextLoaderListener&lt;/listener-class&gt;<br />&nbsp;&nbsp; &nbsp;&lt;/listener&gt;<br />&nbsp;&nbsp; &nbsp;&lt;filter&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;filter-name&gt;encodingFilter&lt;/filter-name&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;filter-class&gt;org.springframework.web.filter.CharacterEncodingFilter&lt;/filter-class&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;init-param&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;param-name&gt;encoding&lt;/param-name&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;param-value&gt;UTF-8&lt;/param-value&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/init-param&gt;<br />&nbsp;&nbsp; &nbsp;&lt;/filter&gt;<br />&nbsp;&nbsp; &nbsp;&lt;filter-mapping&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;filter-name&gt;encodingFilter&lt;/filter-name&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br />&nbsp;&nbsp; &nbsp;&lt;/filter-mapping&gt;<br />&nbsp;&nbsp; &nbsp;&lt;filter&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;filter-name&gt;osivFilter&lt;/filter-name&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;filter-class&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;org.springframework.orm.hibernate3.support.OpenSessionInViewFilter&lt;/filter-class&gt;<br />&nbsp;&nbsp; &nbsp;&lt;/filter&gt;<br />&nbsp;&nbsp; &nbsp;&lt;listener&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;listener-class&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;org.springframework.web.context.request.RequestContextListener&lt;/listener-class&gt;<br />&nbsp;&nbsp; &nbsp;&lt;/listener&gt;<br />&nbsp;&nbsp; &nbsp;&lt;filter-mapping&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;filter-name&gt;osivFilter&lt;/filter-name&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br />&nbsp;&nbsp; &nbsp;&lt;/filter-mapping&gt;<br /><div><span style="color: #008000;">&nbsp;&nbsp;&nbsp; </span><span style="color: #339966;">&lt;!--配置UrlRewriteFilter过滤器--&gt;</span></div><span style="color: #339966;">&nbsp;&nbsp;&nbsp; &lt;filter&gt;</span><br /><span style="color: #339966;">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;filter-name&gt;UrlRewriteFilter&lt;/filter-name&gt;</span><br /><span style="color: #339966;">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;filter-class&gt;org.tuckey.web.filters.urlrewrite.UrlRewriteFilter&lt;/filter-class&gt;</span><br /><span style="color: #339966;">&nbsp;&nbsp; &nbsp;&lt;/filter&gt;</span><span style="color: #008000;"></span><br /><span style="color: #339966;">&nbsp;&nbsp; &nbsp;&lt;filter-mapping&gt;</span><br /><span style="color: #339966;">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;filter-name&gt;UrlRewriteFilter&lt;/filter-name&gt;</span><br /><span style="color: #339966;">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;url-pattern&gt;*.html&lt;/url-pattern&gt;</span><br /><span style="color: #339966;">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;dispatcher&gt;REQUEST&lt;/dispatcher&gt;</span><br /><span style="color: #339966;">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;dispatcher&gt;FORWARD&lt;/dispatcher&gt;</span><br /><span style="color: #339966;">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;dispatcher&gt;INCLUDE&lt;/dispatcher&gt;</span><br /><span style="color: #339966;">&nbsp;&nbsp; &nbsp;&lt;/filter-mapping&gt;</span><br />&nbsp;&nbsp; &nbsp;&lt;filter&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;filter-name&gt;struts-prepare&lt;/filter-name&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;filter-class&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;org.apache.struts2.dispatcher.ng.filter.StrutsPrepareFilter&lt;/filter-class&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;init-param&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;param-name&gt;actionPackages&lt;/param-name&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;param-value&gt;com.secneo.action.*.*&lt;/param-value&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/init-param&gt;<br />&nbsp;&nbsp; &nbsp;&lt;/filter&gt;<br />&nbsp;&nbsp; &nbsp;&lt;filter&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;filter-name&gt;struts2&lt;/filter-name&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;filter-class&gt;org.apache.struts2.dispatcher.FilterDispatcher&lt;/filter-class&gt;<br />&nbsp;&nbsp; &nbsp;&lt;/filter&gt;<br /><br />&nbsp;&nbsp; &nbsp;&lt;filter&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;filter-name&gt;struts-execute&lt;/filter-name&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;filter-class&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;org.apache.struts2.dispatcher.ng.filter.StrutsExecuteFilter&lt;/filter-class&gt;<br />&nbsp;&nbsp; &nbsp;&lt;/filter&gt;<br />&nbsp;&nbsp; &nbsp;&lt;filter&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;filter-name&gt;struts-cleanup&lt;/filter-name&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;filter-class&gt;org.apache.struts2.dispatcher.ActionContextCleanUp&lt;/filter-class&gt;<br />&nbsp;&nbsp; &nbsp;&lt;/filter&gt;<br />&nbsp;&nbsp; &nbsp;&lt;filter-mapping&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;filter-name&gt;struts2&lt;/filter-name&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;url-pattern&gt;*.jsp&lt;/url-pattern&gt;<br />&nbsp;&nbsp; &nbsp;&lt;/filter-mapping&gt;<br /><span style="color: #008000;">&nbsp;&nbsp;&nbsp; </span><span style="color: #339966;">&lt;!--在structs2中使用UrlRewriteFilter过滤器--&gt;</span><br /><span style="color: #339966;">&nbsp;&nbsp;&nbsp; &lt;filter-mapping&gt;</span><br /><span style="color: #339966;">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;filter-name&gt;struts2&lt;/filter-name&gt;</span><br /><span style="color: #339966;">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;url-pattern&gt;*.action&lt;/url-pattern&gt;</span><br /><span style="color: #339966;">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;dispatcher&gt;REQUEST&lt;/dispatcher&gt;</span><br /><span style="color: #339966;">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;dispatcher&gt;FORWARD&lt;/dispatcher&gt;</span><br /><span style="color: #339966;">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;dispatcher&gt;INCLUDE&lt;/dispatcher&gt;</span><br /><span style="color: #339966;">&nbsp;&nbsp; &nbsp;&lt;/filter-mapping&gt;</span><br />&nbsp;&nbsp; &nbsp;&lt;filter-mapping&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;filter-name&gt;struts2&lt;/filter-name&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;url-pattern&gt;*.tld&lt;/url-pattern&gt;<br />&nbsp;&nbsp; &nbsp;&lt;/filter-mapping&gt;<br />&nbsp;&nbsp; &nbsp;&lt;filter-mapping&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;filter-name&gt;struts2&lt;/filter-name&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;url-pattern&gt;*.tag&lt;/url-pattern&gt;<br />&nbsp;&nbsp; &nbsp;&lt;/filter-mapping&gt;<br /><br />&nbsp;&nbsp; &nbsp;&lt;filter-mapping&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;filter-name&gt;struts-prepare&lt;/filter-name&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;url-pattern&gt;*.jsp&lt;/url-pattern&gt;<br />&nbsp;&nbsp; &nbsp;&lt;/filter-mapping&gt;<br />&nbsp;&nbsp; &nbsp;&lt;filter-mapping&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;filter-name&gt;struts-prepare&lt;/filter-name&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;url-pattern&gt;*.action&lt;/url-pattern&gt;<br />&nbsp;&nbsp; &nbsp;&lt;/filter-mapping&gt;<br />&nbsp;&nbsp; &nbsp;&lt;filter-mapping&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;filter-name&gt;struts-prepare&lt;/filter-name&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;url-pattern&gt;*.tld&lt;/url-pattern&gt;<br />&nbsp;&nbsp; &nbsp;&lt;/filter-mapping&gt;<br /><br />&nbsp;&nbsp; &nbsp;&lt;filter-mapping&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;filter-name&gt;struts-execute&lt;/filter-name&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;url-pattern&gt;*.jsp&lt;/url-pattern&gt;<br />&nbsp;&nbsp; &nbsp;&lt;/filter-mapping&gt;<br />&nbsp;&nbsp; &nbsp;&lt;filter-mapping&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;filter-name&gt;struts-execute&lt;/filter-name&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;url-pattern&gt;*.action&lt;/url-pattern&gt;<br />&nbsp;&nbsp; &nbsp;&lt;/filter-mapping&gt;<br />&nbsp;&nbsp; &nbsp;&lt;filter-mapping&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;filter-name&gt;struts-execute&lt;/filter-name&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;url-pattern&gt;*.tld&lt;/url-pattern&gt;<br />&nbsp;&nbsp; &nbsp;&lt;/filter-mapping&gt;<br /><br />&nbsp;&nbsp; &nbsp;&lt;filter-mapping&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;filter-name&gt;struts-cleanup&lt;/filter-name&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;url-pattern&gt;*.jsp&lt;/url-pattern&gt;<br />&nbsp;&nbsp; &nbsp;&lt;/filter-mapping&gt;<br />&nbsp;&nbsp; &nbsp;&lt;filter-mapping&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;filter-name&gt;struts-cleanup&lt;/filter-name&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;url-pattern&gt;*.action&lt;/url-pattern&gt;<br />&nbsp;&nbsp; &nbsp;&lt;/filter-mapping&gt;<br />&nbsp;&nbsp; &nbsp;&lt;filter-mapping&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;filter-name&gt;struts-cleanup&lt;/filter-name&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;url-pattern&gt;*.tld&lt;/url-pattern&gt;<br />&nbsp;&nbsp; &nbsp;&lt;/filter-mapping&gt;<br />&nbsp;&nbsp; &nbsp;&lt;listener&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;listener-class&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;org.springframework.web.util.IntrospectorCleanupListener&lt;/listener-class&gt;<br />&nbsp;&nbsp; &nbsp;&lt;/listener&gt;</div><strong style="color: #339966;">2&nbsp; 在WEB-INF目录下添加urlrewrite.xml 文件，根据具体需要写规则</strong><span style="color: #339966;">。</span><br /><strong>样例：</strong><br /><div><span>&lt;?xml version="1.0" encoding="utf-8"?&gt;</span><br /><span>&lt;urlrewrite&gt;</span><br /><span>&nbsp;&nbsp; &nbsp;&lt;rule&gt;</span><br /><span>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;from&gt;^/(.*).html$&lt;/from&gt;</span><br /><span>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;to type="forward"&gt;/$1.action&lt;/to&gt;</span><br /><span>&nbsp;&nbsp; &nbsp;&lt;/rule&gt;</span><br /><span>&nbsp;&nbsp; &nbsp;&lt;rule&gt;</span><br /><span>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;from&gt;^/(.*).html?(.*)$&lt;/from&gt;</span><br /><span>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;to type="forward"&gt;/$1.action?$2&lt;/to&gt;</span><br /><span>&nbsp;&nbsp; &nbsp;&lt;/rule&gt;</span><br /><span>&lt;/urlrewrite&gt;</span></div><img src ="http://www.blogjava.net/kangdy/aggbug/363318.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kangdy/" target="_blank">AK47</a> 2011-11-09 17:22 <a href="http://www.blogjava.net/kangdy/archive/2011/11/09/363318.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>structs2 filter的执行顺序</title><link>http://www.blogjava.net/kangdy/archive/2011/11/09/363301.html</link><dc:creator>AK47</dc:creator><author>AK47</author><pubDate>Wed, 09 Nov 2011 07:44:00 GMT</pubDate><guid>http://www.blogjava.net/kangdy/archive/2011/11/09/363301.html</guid><wfw:comment>http://www.blogjava.net/kangdy/comments/363301.html</wfw:comment><comments>http://www.blogjava.net/kangdy/archive/2011/11/09/363301.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kangdy/comments/commentRss/363301.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kangdy/services/trackbacks/363301.html</trackback:ping><description><![CDATA[<div>根据servlet2.3规范filter执行是按照web.xml配置的filter-mapping先后顺序进行执行。<br />所以自己配置的过滤器放在structs2的过滤器之前。</div><img src ="http://www.blogjava.net/kangdy/aggbug/363301.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kangdy/" target="_blank">AK47</a> 2011-11-09 15:44 <a href="http://www.blogjava.net/kangdy/archive/2011/11/09/363301.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>structs2拦截器</title><link>http://www.blogjava.net/kangdy/archive/2011/11/08/363205.html</link><dc:creator>AK47</dc:creator><author>AK47</author><pubDate>Tue, 08 Nov 2011 10:35:00 GMT</pubDate><guid>http://www.blogjava.net/kangdy/archive/2011/11/08/363205.html</guid><wfw:comment>http://www.blogjava.net/kangdy/comments/363205.html</wfw:comment><comments>http://www.blogjava.net/kangdy/archive/2011/11/08/363205.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kangdy/comments/commentRss/363205.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kangdy/services/trackbacks/363205.html</trackback:ping><description><![CDATA[<strong>深入struct2拦截器</strong>&nbsp; 这篇文章很好，细致讲解了structs2和拦截器的原理。<br /><div><a href="http://zhanghong.iteye.com/blog/452465">http://zhanghong.iteye.com/blog/452465</a><br /><fieldset><legend>转载</legend><span>在每次对你的 Action的 execute()方法请求时，系统会生成一个 ActionInvocation对象，这个对象保存了 action和你所配置的所有的拦截器以及一些状态信息。比如你的应用使用的是 defaultStack，系统将会以拦截器栈配置的顺序将每个拦截器包装成一个个 InterceptorMapping(包含拦截器名字和对应的拦截器对象 )组成一个 Iterator保存在 ActionInvocation中。在执行 ActionInvocation的 invoke()方法时会对这个 Iterator进行迭代，每次取出一个 InterceptorMapping，然后执行对应 Interceptor的 intercept(ActionInVocation inv)方法，而 intercept(ActionInInvocation inv)方法又包含当前的 ActionInInvcation对象作为参数，而在每个拦截器中又会调用 inv的 invoke()方法，这样就会进入下一个拦截器执行了，这样直到最后一个拦截器执行完，然后执行 Action的 execute()方法 (假设你没有配置访问方法，默认执行 Action的 execute()方法 )。在执行完 execute()方法取得了 result后又以相反的顺序走出拦截器栈，这时可以做些清理工作。最后系统得到了一个 result，然后根据 result的类型做进一步操作。</span></fieldset><br /><div><strong>配置拦截器：</strong>Struts2中提供了大量的拦截器，多个拦截器可以组成一个拦截器栈，系统配置了一个默认的拦截器栈 defaultStack，具体包括那些拦截器以及顺序可以在struts-default.xml中找到。<br />1) <br />&lt;package name="default" extends="struts-default"&gt;<br />&nbsp;&nbsp; &lt;interceptors&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor name="timer" class=".."/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor name="logger" class=".."/&gt;<br />&nbsp;&nbsp; &lt;/interceptors&gt;<br /><br />&nbsp;&nbsp; &lt;action name="login"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="tutorial.Login"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="timer"/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="logger"/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result name="input"&gt;login.jsp&lt;/result&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result name="success"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type="redirectAction"&gt;/secure/home&lt;/result&gt;<br />&nbsp;&nbsp; &lt;/action&gt;<br />&lt;/package&gt;<br /><br />2)<br />&lt;package name="default" extends="struts-default"&gt;<br />&nbsp;&nbsp; &lt;interceptors&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor name="timer" class=".."/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor name="logger" class=".."/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-stack name="myStack"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="timer"/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="logger"/&gt;<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="defaultStack"/&gt;&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/interceptor-stack&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/interceptors&gt;<br /><br />&lt;action name="login"<br />&nbsp;&nbsp;&nbsp;&nbsp; class="tutuorial.Login"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="myStack"/&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result name="input"&gt;login.jsp&lt;/result&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result name="success"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type="redirectAction"&gt;/secure/home&lt;/result&gt;<br />&lt;/action&gt;<br />&lt;/package&gt;<br /><br /><strong>拦截器执行顺序：</strong><br />&lt;interceptor-stack name="xaStack"&gt;<br />&nbsp; &lt;interceptor-ref name="thisWillRunFirstInterceptor"/&gt;<br />&nbsp; &lt;interceptor-ref name="thisWillRunNextInterceptor"/&gt;<br />&nbsp; &lt;interceptor-ref name="followedByThisInterceptor"/&gt;<br />&nbsp; &lt;interceptor-ref name="thisWillRunLastInterceptor"/&gt;<br />&lt;/interceptor-stack&gt;<br /><br />执行顺序：<br />thisWillRunFirstInterceptor<br />&nbsp; thisWillRunNextInterceptor<br />&nbsp;&nbsp;&nbsp; followedByThisInterceptor<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; thisWillRunLastInterceptor<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MyAction1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MyAction2 (chain)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MyPreResultListener<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MyResult (result)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; thisWillRunLastInterceptor<br />&nbsp;&nbsp;&nbsp; followedByThisInterceptor<br />&nbsp; thisWillRunNextInterceptor<br />thisWillRunFirstInterceptor<br /><br /><br /><strong>自定义拦截器:</strong>必须实现 com.opensymphony.xwork2.interceptor.Interceptor 也可以继承 AbstractInterceptor<br /><br /><span style="color: #ff0000;">拦截器要保证线程安全。因为structs2中拦截器会在请求间共享</span></div></div><img src ="http://www.blogjava.net/kangdy/aggbug/363205.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kangdy/" target="_blank">AK47</a> 2011-11-08 18:35 <a href="http://www.blogjava.net/kangdy/archive/2011/11/08/363205.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(转贴)struts2 工作原理图</title><link>http://www.blogjava.net/kangdy/archive/2011/11/08/363179.html</link><dc:creator>AK47</dc:creator><author>AK47</author><pubDate>Tue, 08 Nov 2011 07:10:00 GMT</pubDate><guid>http://www.blogjava.net/kangdy/archive/2011/11/08/363179.html</guid><wfw:comment>http://www.blogjava.net/kangdy/comments/363179.html</wfw:comment><comments>http://www.blogjava.net/kangdy/archive/2011/11/08/363179.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kangdy/comments/commentRss/363179.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kangdy/services/trackbacks/363179.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 原贴地址：http://blog.csdn.net/qjyong/article/details/1795833转贴     最近学习struts2，其实它就是webwork2.2的升级版，现附上原理图  上图来源于Struts2官方站点，是Struts 2 的整体结构。一个请求在Struts2框架中的处理大概分为以下几个步骤1 客户端初始化一个指向Servlet容器（例如Tomcat）的请求2 ...&nbsp;&nbsp;<a href='http://www.blogjava.net/kangdy/archive/2011/11/08/363179.html'>阅读全文</a><img src ="http://www.blogjava.net/kangdy/aggbug/363179.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kangdy/" target="_blank">AK47</a> 2011-11-08 15:10 <a href="http://www.blogjava.net/kangdy/archive/2011/11/08/363179.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Structs的线程安全问题</title><link>http://www.blogjava.net/kangdy/archive/2009/10/29/300201.html</link><dc:creator>AK47</dc:creator><author>AK47</author><pubDate>Thu, 29 Oct 2009 08:26:00 GMT</pubDate><guid>http://www.blogjava.net/kangdy/archive/2009/10/29/300201.html</guid><wfw:comment>http://www.blogjava.net/kangdy/comments/300201.html</wfw:comment><comments>http://www.blogjava.net/kangdy/archive/2009/10/29/300201.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/kangdy/comments/commentRss/300201.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/kangdy/services/trackbacks/300201.html</trackback:ping><description><![CDATA[<p>以前做过Structs 的项目,可是一直没做太深的研究,尤其是关于线程安全的<br />
在网上搜了一下很多这方面的资料,引用了一些,总结了一下:</p>
<fieldset><legend>总结：</legend>Struts1 Action是单例模式并且必须是线程安全的，因为仅有Action的一个实例来处理所有的请求。单例策略限制了Struts1 Action能作的事，并且要在开发时特别小心。Action资源必须是线程安全的或同步的。<br />
Struts2 Action可以使用原型模式scope=prototype,这样对象为每一个请求产生一个实例，因此没有线程安全问题。（实际上，servlet容器给每个请求产生许多可丢弃的对象，并且不会导致性能和垃圾回收问题）</fieldset>
<p>&nbsp;</p>
<p>这篇文章对什么是线程安全的代码和如何使用线程安全的代码做了详细阐述<br />
<a href="http://hi.baidu.com/niujunkai/blog/item/021964adc130660a4a36d6ab.html">http://hi.baidu.com/niujunkai/blog/item/021964adc130660a4a36d6ab.html</a><br />
下面是它内容的引用:</p>
<fieldset><legend>引用:</legend>
<p>1.什么是线程安全的代码<br />
在多线程环境下能正确执行的代码就是线程安全的。<br />
安全的意思是能正确执行，否则后果是程序执行错误，可能出现各种异常情况。</p>
<p>2.如何编写线程安全的代码<br />
很多书籍里都详细讲解了如何这方面的问题，他们主要讲解的是如何同步线程对共享资源的使用的问题。主要是对synchronized关键字的各种用法，以及锁的概念。Java1.5中也提供了如读写锁这类的工具类。这些都需要较高的技巧，而且相对难于调试。</p>
<p>但是，线程同步是不得以的方法,是比较复杂的,而且会带来性能的损失。等效的代码中，不需要同步在编写容易度和性能上会更好些。<br />
我这里强调的是什么代码是始终为线程安全的、是不需要同步的。如下:<br />
1)常量始终是线程安全的，因为只存在读操作。<br />
2)对构造器的访问(new 操作)是线程安全的，因为每次都新建一个实例，不会访问共享的资源。<br />
3)最重要的是:局部变量是线程安全的。因为每执行一个方法，都会在独立的空间创建局部变量，它不是共享的资源。局部变量包括方法的参数变量。<br />
struts user guide里有：<br />
Only Use Local Variables - The most important principle that aids in thread-safe coding is to use only local variables, not instance variables , in your Action class.<br />
译:只使用用局部变量。--编写线程安全的代码最重要的原则就是，在Action类中只使用局部变量，不使用实例变量。</p>
<p><br />
总结：<br />
在Java的Web服务器环境下开发，要注意线程安全的问题。最简单的实现方式就是在Servlet和Struts Action里不要使用类变量、实例变量，但可以使用类常量和实例常量。如果有这些变量，可以将它们转换为方法的参数传入，以消除它们。<br />
注意一个容易混淆的地方：被Servlet或Action调用的类中(如值对象、领域模型类)中是否可以安全的使用实例变量？如果你在每次方法调用时<br />
新建一个对 象，再调用它们的方法，则不存在同步问题---因为它们不是多个线程共享的资源，只有共享的资源才需要同步---而Servlet和Action的实例对于多个线程是共享 的。<br />
换句话说，Servlet和Action的实例会被多个线程同时调用，而过了这一层,如果在你自己的代码中没有另外启动线程，且每次调用后续业务对象时都是先 新建一个实例再调用，则都是线程安全的。</p>
</fieldset>
<p>&nbsp;</p>
<p>如果想加深理解servlet的多线程可以读读此文，阐述的很详细。<br />
<a href="http://hi.baidu.com/platon/blog/item/64a20ff3f96e7fce0b46e031.html">http://hi.baidu.com/platon/blog/item/64a20ff3f96e7fce0b46e031.html</a></p><img src ="http://www.blogjava.net/kangdy/aggbug/300201.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/kangdy/" target="_blank">AK47</a> 2009-10-29 16:26 <a href="http://www.blogjava.net/kangdy/archive/2009/10/29/300201.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>