﻿<?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-java 友人帮-文章分类-SSH2 --Struts2</title><link>http://www.blogjava.net/jzone/category/40407.html</link><description>java web, java wap ..My laboratory..</description><language>zh-cn</language><lastBuildDate>Wed, 08 Sep 2010 19:46:23 GMT</lastBuildDate><pubDate>Wed, 08 Sep 2010 19:46:23 GMT</pubDate><ttl>60</ttl><item><title>OGNL功用！！！</title><link>http://www.blogjava.net/jzone/articles/331427.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Wed, 08 Sep 2010 12:34:00 GMT</pubDate><guid>http://www.blogjava.net/jzone/articles/331427.html</guid><description><![CDATA[&nbsp;<span style="font-size: 10pt; font-family: 微软雅黑">访问值栈中的action的普通属性:username = &lt;s:property value="username"/&gt;&nbsp;&nbsp;&nbsp; </span>
<p><span style="font-size: 10pt; font-family: 微软雅黑">访问值栈中对象的普通属性(get set方法)：</span></p>
<p><span style="font-size: 10pt; font-family: 微软雅黑">&lt;s:property value="user.age"/&gt; </span></p>
<p><span style="font-size: 10pt; font-family: 微软雅黑">&lt;s:property value="user['age']"/&gt;</span></p>
<p><span style="font-size: 10pt; font-family: 微软雅黑">&lt;s:property value="user[""age""]"/&gt;</span></p>
<p><span style="font-size: 10pt; font-family: 微软雅黑">wrong: &lt;%--&lt;s:property value="user[age]"/&gt;--%&gt;&nbsp;&nbsp; </span></p>
<p><span style="font-size: 10pt; font-family: 微软雅黑">访问值栈中对象的普通属性(get set方法):</span></p>
<p><span style="font-size: 10pt; font-family: 微软雅黑">&nbsp;&lt;s:property value="cat.friend.name"/&gt;&nbsp;&nbsp; </span></p>
<p><span style="font-size: 10pt; font-family: 微软雅黑">访问值栈中对象的普通方法：&lt;s:property value="password.length()"/&gt;&nbsp;&nbsp; </span></p>
<p><span style="font-size: 10pt; font-family: 微软雅黑">访问值栈中对象的普通方法：&lt;s:property value="cat.miaomiao()" /&gt;&nbsp;&nbsp; </span></p>
<p><span style="font-size: 10pt; font-family: 微软雅黑">访问值栈中action的普通方法：&lt;s:property value="m()" /&gt; </span></p>
<p><span style="font-size: 10pt; font-family: 微软雅黑">访问静态方法：&lt;s:property value="@com.bjsxt.struts2.ognl.S@s()"/&gt;&nbsp;&nbsp; </span></p>
<p><span style="font-size: 10pt; font-family: 微软雅黑">访问静态属性：&lt;s:property value="@com.bjsxt.struts2.ognl.S@STR"/&gt;&nbsp;&nbsp; </span></p>
<p><span style="font-size: 10pt; font-family: 微软雅黑">访问Math类的静态方法：&lt;s:property value="@@max(2,3)" /&gt;&nbsp;&nbsp; </span></p>
<p><span style="font-size: 10pt; font-family: 微软雅黑">访问普通类的构造方法：</span></p>
<p><span style="font-size: 10pt; font-family: 微软雅黑">&lt;s:property value="new com.bjsxt.struts2.ognl.User(8)"/&gt; </span></p>
<p><span style="font-size: 10pt; font-family: 微软雅黑">访问List:&lt;s:property value="users"/&gt;&nbsp;&nbsp; </span></p>
<p><span style="font-size: 10pt; font-family: 微软雅黑">访问List中某个元素:&lt;s:property value="users[1]"/&gt;&nbsp;&nbsp; </span></p>
<p><span style="font-size: 10pt; font-family: 微软雅黑">访问List中元素某个属性的集合:&lt;s:property value="users.{age}"/&gt;&nbsp;&nbsp; </span></p>
<p><span style="font-size: 10pt; font-family: 微软雅黑">访问List中元素某个属性的集合中的特定值:</span></p>
<p><span style="font-size: 10pt; font-family: 微软雅黑">&lt;s:property value="users.{age}[0]"/&gt;</span></p>
<p><span style="font-size: 10pt; font-family: 微软雅黑">&lt;s:property value="users[0].age"/&gt;&nbsp;&nbsp; </span></p>
<p><span style="font-size: 10pt; font-family: 微软雅黑">访问Set:&lt;s:property value="dogs"/&gt;&nbsp;&nbsp; </span></p>
<p><span style="font-size: 10pt; font-family: 微软雅黑">访问Set中某个元素:&lt;s:property value="dogs[1]"/&gt;</span></p>
<p><span style="font-size: 10pt; font-family: 微软雅黑">&lt;!--set</span><span style="font-size: 10pt; font-family: 微软雅黑">是没有顺序的，所以取下标值是没有意义的--&gt;&nbsp;&nbsp;</span></p>
<p><span style="font-size: 10pt; font-family: 微软雅黑">访问Map:&lt;s:property value="dogMap"/&gt;&nbsp;&nbsp; </span></p>
<p><span style="font-size: 10pt; font-family: 微软雅黑">访问Map中某个元素:&lt;s:property value="dogMap.dog101"/&gt;</span></p>
<p><span style="font-size: 10pt; font-family: 微软雅黑">&lt;s:property value="dogMap['dog101']"/&gt;</span></p>
<p><span style="font-size: 10pt; font-family: 微软雅黑">&lt;s:property value="dogMap[""dog101""]"/&gt;&lt;!--</span><span style="font-size: 10pt; font-family: 微软雅黑">取出key为dog101的值--&gt;&nbsp;&nbsp; </span></p>
<p><span style="font-size: 10pt; font-family: 微软雅黑">访问Map中所有的key:&lt;s:property value="dogMap.keys"/&gt;&nbsp;&nbsp; </span></p>
<p><span style="font-size: 10pt; font-family: 微软雅黑">访问Map中所有的value:&lt;s:property value="dogMap.values"/&gt;&nbsp;&nbsp; </span></p>
<p><span style="font-size: 10pt; font-family: 微软雅黑">访问容器的大小：&lt;s:property value="dogMap.size()"/&gt;</span></p>
<p><span style="font-size: 10pt; font-family: 微软雅黑">&lt;s:property value="users.size"/&gt; &lt;!--</span><span style="font-size: 10pt; font-family: 微软雅黑">不加ku9ohao也可以访问--&gt; </span></p>
<p><span style="font-size: 10pt; font-family: 微软雅黑">投影(过滤)：&lt;s:property value="users.{?#this.age==1}[0]"/&gt;&lt;!--格式固定，this指循环过程中的每一个对象。取出users里age等于1的集合里面的第一个元素--&gt;&nbsp;&nbsp; </span></p>
<p><span style="font-size: 10pt; font-family: 微软雅黑">投影：&lt;s:property value="users.{^#this.age&gt;1}.{age}"/&gt;&lt;!--^指第一个元素--&gt;&nbsp;&nbsp; </span></p>
<p><span style="font-size: 10pt; font-family: 微软雅黑">投影：&lt;s:property value="users.{$#this.age&gt;1}.{age}"/&gt;&lt;!--$指结尾的元素--&gt;&nbsp;&nbsp; </span></p>
<p><span style="font-size: 10pt; font-family: 微软雅黑">投影：&lt;s:property value="users.{$#this.age&gt;1}.{age} == null"/&gt;&lt;!--查看age&gt;1的user的age是否为空--&gt;</span></p>
<p><span style="font-size: 10pt; font-family: 微软雅黑">&nbsp;[]:&lt;s:property value="[0].username"/&gt;&nbsp;&nbsp; </span></p>
<p><span style="font-size: 10pt; font-family: 微软雅黑">&lt;!--</span><span style="font-size: 10pt; font-family: 微软雅黑">指value stack栈顶的那个Action，因为action在栈顶。0值value stack从上往下数的第几0个元素 --&gt;&nbsp;&nbsp; </span></p>
<p><span style="font-size: 10pt; font-family: 微软雅黑">&lt;!--[0]</span><span style="font-size: 10pt; font-family: 微软雅黑">代表action的位置，而不是action那个对象，[0]代表从0往下数到栈底的对象的集合。--&gt;&nbsp;&nbsp; </span></p>
<p><span style="font-size: 10pt; font-family: 微软雅黑">&lt;!--[0].username</span><span style="font-size: 10pt; font-family: 微软雅黑">，如果有多个action，在第一个action里找不到[0].username，会往下找--&gt;&nbsp;&nbsp; </span></p>
<img src ="http://www.blogjava.net/jzone/aggbug/331427.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzone/" target="_blank">Gavin.lee</a> 2010-09-08 20:34 <a href="http://www.blogjava.net/jzone/articles/331427.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2中解决一个表单多种提交</title><link>http://www.blogjava.net/jzone/articles/322934.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Sun, 06 Jun 2010 16:50:00 GMT</pubDate><guid>http://www.blogjava.net/jzone/articles/322934.html</guid><description><![CDATA[<a href="http://www.blogjava.net/nokiaguy/archive/2008/04/16/193287.html">http://www.blogjava.net/nokiaguy/archive/2008/04/16/193287.html</a>
<p><span style="font-size: 10pt; color: blue; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; color: maroon; font-family: 'Courier New'">s:form&nbsp;</span><span style="font-size: 10pt; color: red; font-family: 'Courier New'">action</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'">="submit.action"</span>&nbsp;<span style="font-size: 10pt; color: blue; font-family: 'Courier New'">&gt;</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'"><br />
</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; color: maroon; font-family: 'Courier New'">s:textfield&nbsp;</span><span style="font-size: 10pt; color: red; font-family: 'Courier New'">name</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'">="param"</span><span style="font-size: 10pt; color: red; font-family: 'Courier New'">&nbsp;label</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'">="</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'">content</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'">"/&gt;</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;<br />
</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; color: maroon; font-family: 'Courier New'">s:submit&nbsp;</span><span style="font-size: 10pt; color: red; font-family: 'Courier New'">name</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'">="method1"</span><span style="font-size: 10pt; color: red; font-family: 'Courier New'">&nbsp;value</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'">="</span><span style="font-size: 10pt; color: blue; font-family: 宋体">方法一</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'">"</span><span style="font-size: 10pt; color: red; font-family: 'Courier New'">&nbsp;&nbsp;method</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'">="method1"/&gt;</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'"><br />
</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; color: maroon; font-family: 'Courier New'">s:submit&nbsp;</span><span style="font-size: 10pt; color: red; font-family: 'Courier New'">name</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'">=" method1"</span><span style="font-size: 10pt; color: red; font-family: 'Courier New'">&nbsp;value</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'">="</span><span style="font-size: 10pt; color: blue; font-family: 宋体">方法二</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'">"</span><span style="font-size: 10pt; color: red; font-family: 'Courier New'">&nbsp;method</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'">="method1"</span>&nbsp;<span style="font-size: 10pt; color: blue; font-family: 'Courier New'">/&gt;</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'">&lt;/</span><span style="font-size: 10pt; color: maroon; font-family: 'Courier New'">s:form</span><span style="font-size: 10pt; color: blue; font-family: 'Courier New'">&gt;</span></p>
<img src ="http://www.blogjava.net/jzone/aggbug/322934.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzone/" target="_blank">Gavin.lee</a> 2010-06-07 00:50 <a href="http://www.blogjava.net/jzone/articles/322934.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2验证错误信息的两个经典方法-addFieldError&amp;addActionError</title><link>http://www.blogjava.net/jzone/articles/322603.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Thu, 03 Jun 2010 03:45:00 GMT</pubDate><guid>http://www.blogjava.net/jzone/articles/322603.html</guid><description><![CDATA[<span style="font-size: 11pt; color: black; font-family: 宋体">这两个方法都是</span><span style="font-size: 11pt; color: black; font-family: 'Courier New'">ActionSupport</span><span style="font-size: 11pt; color: black; font-family: 宋体">类实现的方法，应用中我们都会继承</span><span style="font-size: 11pt; color: black; font-family: 'Courier New'">ActionSupport</span><span style="font-size: 11pt; color: black; font-family: 宋体">类，在</span><span style="font-size: 11pt; color: black; font-family: 'Courier New'">ActionSupport</span><span style="font-size: 11pt; color: black; font-family: 宋体">类中实现了一个</span><span style="font-size: 11pt; color: black; font-family: 'Courier New'">hasErrors()</span><span style="font-size: 11pt; color: black; font-family: 宋体">方法，该方法会判断是否存在这两种级别</span><span style="font-size: 11pt; color: black; font-family: 'Courier New'">(Action</span><span style="font-size: 11pt; color: black; font-family: 宋体">级和</span><span style="font-size: 11pt; color: black; font-family: 'Courier New'">Field</span><span style="font-size: 11pt; color: black; font-family: 宋体">级</span><span style="font-size: 11pt; color: black; font-family: 'Courier New'">)</span><span style="font-size: 11pt; color: black; font-family: 宋体">的</span><span style="font-size: 11pt; color: black; font-family: 'Courier New'">error</span><span style="font-size: 11pt; color: black; font-family: 宋体">，所以当我们需要报错时，我们可以方便的应用：如</span>
<p><span style="font-size: 11pt; color: black; font-family: 'Courier New'">try {</span></p>
<p><span style="font-size: 11pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp; XXX</span></p>
<p><span style="font-size: 11pt; color: black; font-family: 'Courier New'">} catch (Exception e) {</span></p>
<p><span style="font-size: 11pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp; Super.addFieldError(&#8220;username&#8221;, &#8220;</span><span style="font-size: 11pt; color: black; font-family: 宋体">输入有误</span><span style="font-size: 11pt; color: black; font-family: 'Courier New'">&#8221;);</span></p>
<p><span style="font-size: 11pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp; </span><span style="font-size: 11pt; color: black; font-family: 宋体">或者：</span></p>
<p><span style="font-size: 11pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp; Super.addActionError(&#8220;</span><span style="font-size: 11pt; color: black; font-family: 宋体">输入有误</span><span style="font-size: 11pt; color: black; font-family: 'Courier New'">&#8221;);</span></p>
<p><span style="font-size: 11pt; color: black; font-family: 'Courier New'">}</span></p>
<p><span style="font-size: 11pt; color: black; font-family: 宋体">感兴趣可以研究一下源码，使用时我们只需要在页面显示这些错误就</span><span style="font-size: 11pt; color: black; font-family: 'Courier New'">OK</span><span style="font-size: 11pt; color: black; font-family: 宋体">。</span></p>
<p><span style="font-size: 11pt; color: black; font-family: 宋体">如：</span></p>
<p><span style="font-size: 11pt; color: black; font-family: 'Courier New'">&lt;s:fielderror&gt;</span></p>
<p><span style="font-size: 11pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp; &lt;s:param&gt;username&lt;/s:param&gt;</span></p>
<p><span style="font-size: 11pt; color: black; font-family: 'Courier New'">&lt;/s:fielderror&gt;</span></p>
<p><span style="font-size: 11pt; color: black; font-family: 宋体">或者</span></p>
<p><span style="font-size: 11pt; color: black; font-family: 'Courier New'">&lt;s:actionerror/&gt;</span></p>
<p><span style="font-size: 11pt; color: black; font-family: 宋体">但是在实际应用中，</span><span style="font-size: 11pt; color: black; font-family: 'Courier New'">fielderror</span><span style="font-size: 11pt; color: black; font-family: 宋体">我们比较倾向于有针对性的错误信息输出，因为</span><span style="font-size: 11pt; color: black; font-family: 'Courier New'">fielderror</span><span style="font-size: 11pt; color: black; font-family: 宋体">它本身就是个</span><span style="font-size: 11pt; color: black; font-family: 'Courier New'">Map</span><span style="font-size: 11pt; color: black; font-family: 宋体">，可以详细指定错误的字段</span><span style="font-size: 11pt; color: black; font-family: 'Courier New'">-</span><span style="font-size: 11pt; color: black; font-family: 宋体">原因。而且在表单提交时更合适，只要对应了</span><span style="font-size: 11pt; color: black; font-family: 'Courier New'">error</span><span style="font-size: 11pt; color: black; font-family: 宋体">字段和提交属性的字段。</span><span style="font-size: 11pt; color: black; font-family: 'Courier New'">Struts2</span><span style="font-size: 11pt; color: black; font-family: 宋体">会为我们自动表格排版</span><span style="font-size: 11pt; color: black; font-family: 'Courier New'">(</span><span style="font-size: 11pt; color: black; font-family: 宋体">没试验</span><span style="font-size: 11pt; color: black; font-family: 'Courier New'">)</span></p>
<p><span style="font-size: 11pt; font-family: 宋体">修改主题</span><span style="font-size: 11pt; font-family: 'Courier New'">:&lt;s:form theme="simple"&gt; </span><span style="font-size: 11pt; font-family: 宋体">不能显示错误信息</span><span style="font-size: 11pt; font-family: 'Courier New'">,</span><span style="font-size: 11pt; font-family: 宋体">不能自动添加表格排版</span><span style="font-size: 11pt; font-family: 'Courier New'">,根据需要自己发挥</span><span style="font-size: 11pt; font-family: 'Courier New'"><br />
<strong><span style="font-size: 11pt; font-family: 宋体"></p>
<p><strong><span style="font-size: 11pt; font-family: 宋体">注：我们只需要进行设置</span></strong><strong><span style="font-size: 11pt; font-family: 'Courier New'">error</span></strong><strong><span style="font-size: 11pt; font-family: 宋体">的默认</span></strong><strong><span style="font-size: 11pt; font-family: 'Courier New'">input</span></strong><strong><span style="font-size: 11pt; font-family: 宋体">，</span></strong><strong><span style="font-size: 11pt; font-family: 'Courier New'">Struts2</span></strong><strong><span style="font-size: 11pt; font-family: 宋体">会为我们自动进行视图转发，</span></strong><strong><span style="font-size: 11pt; font-family: 'Courier New'">&lt;result name=&#8221;input&#8221;&gt;/input.jsp&lt;/result&gt;</span></strong></p>
</span></strong></span>
<img src ="http://www.blogjava.net/jzone/aggbug/322603.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzone/" target="_blank">Gavin.lee</a> 2010-06-03 11:45 <a href="http://www.blogjava.net/jzone/articles/322603.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2 Result-type（封装Action层到View层的跳转逻辑）</title><link>http://www.blogjava.net/jzone/articles/322222.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Sat, 29 May 2010 09:36:00 GMT</pubDate><guid>http://www.blogjava.net/jzone/articles/322222.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Struts2将Result列为一个独立的层次，可以说是整个Struts2的Action层架构设计中的另外一个精华所在。Result之所以成为一个层次，其实是为了解决MVC框架中，如何从Control层转向View层这样一个问题而存在的 &nbsp;在struts2-core.jar/struts-default.xml中，我们可以找到关于result-type的一些配置信息，从中...&nbsp;&nbsp;<a href='http://www.blogjava.net/jzone/articles/322222.html'>阅读全文</a><img src ="http://www.blogjava.net/jzone/aggbug/322222.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzone/" target="_blank">Gavin.lee</a> 2010-05-29 17:36 <a href="http://www.blogjava.net/jzone/articles/322222.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Struts2中以IOC和非IOC方式获取session&amp;request</title><link>http://www.blogjava.net/jzone/articles/322218.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Sat, 29 May 2010 08:55:00 GMT</pubDate><guid>http://www.blogjava.net/jzone/articles/322218.html</guid><description><![CDATA[<p><span style="font-size: 10pt; font-family: 宋体">在</span><span style="font-size: 10pt; font-family: 'Courier New'">struts1</span><span style="font-size: 10pt; font-family: 宋体">中，获得到系统的</span><span style="font-size: 10pt; font-family: 'Courier New'">request</span><span style="font-size: 10pt; font-family: 宋体">或者</span><span style="font-size: 10pt; font-family: 'Courier New'">session</span><span style="font-size: 10pt; font-family: 宋体">对象非常方便，都是按照形参传递的，但是在</span><span style="font-size: 10pt; font-family: 'Courier New'">struts2</span><span style="font-size: 10pt; font-family: 宋体">中，</span><span style="font-size: 10pt; font-family: 'Courier New'">request</span><span style="font-size: 10pt; font-family: 宋体">和</span><span style="font-size: 10pt; font-family: 'Courier New'">session</span><span style="font-size: 10pt; font-family: 宋体">都被隐藏了</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">struts</span><span style="font-size: 10pt; font-family: 宋体">提供两种方式访问</span><span style="font-size: 10pt; font-family: 'Courier New'">session</span><span style="font-size: 10pt; font-family: 宋体">和</span><span style="font-size: 10pt; font-family: 'Courier New'">request</span><span style="font-size: 10pt; font-family: 宋体">，其中比较常用的是利用</span><span style="font-size: 10pt; font-family: 'Courier New'">SPRING</span><span style="font-size: 10pt; font-family: 宋体">里面所说的</span><span style="font-size: 10pt; font-family: 'Courier New'">IOC</span><span style="font-size: 10pt; font-family: 宋体">即控制反转</span></p>
<p><strong><span style="font-size: 10pt; font-family: 'Courier New'">IOC</span><span style="font-size: 10pt; font-family: 宋体">方式：</span></strong></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">action</span><span style="font-size: 10pt; font-family: 宋体">类实现</span><span style="font-size: 10pt; font-family: 'Courier New'">ServletRequestAware</span><span style="font-size: 10pt; font-family: 宋体">接口，并新建一个</span><span style="font-size: 10pt; font-family: 'Courier New'">HttpServletRequest request</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">public class UserLoginAction extends ActionSupport implements ServletRequestAware {</span></p>
<p style="text-indent: 21pt"><span style="font-size: 10pt; font-family: 'Courier New'">public void setServletRequest(HttpServletRequest request) {</span></p>
<p style="text-indent: 21pt"><span style="font-size: 10pt; font-family: 'Courier New'">this.request=request;</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">}</span></p>
<p><span style="font-size: 10pt; font-family: 宋体">然后可以生成的</span><span style="font-size: 10pt; font-family: 'Courier New'">request</span><span style="font-size: 10pt; font-family: 宋体">得到对象，如</span><span style="font-size: 10pt; font-family: 'Courier New'">request.getRemoteAddr()</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">action</span><span style="font-size: 10pt; font-family: 宋体">类实现</span><span style="font-size: 10pt; font-family: 'Courier New'">SessionAware</span><span style="font-size: 10pt; font-family: 宋体">接口，并创建一个</span><span style="font-size: 10pt; font-family: 'Courier New'">MAP</span><span style="font-size: 10pt; font-family: 宋体">对象</span><span style="font-size: 10pt; font-family: 'Courier New'">session</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">public class UserLoginAction extends ActionSupport implements ServletRequestAware,SessionAware{</span></p>
<p style="text-indent: 21pt"><span style="font-size: 10pt; font-family: 'Courier New'">public void setServletRequest(HttpServletRequest request) {</span></p>
<p style="text-indent: 21pt"><span style="font-size: 10pt; font-family: 'Courier New'">this.request=request;</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">}</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">public void setSession(Map session) {</span></p>
<p style="text-indent: 21pt"><span style="font-size: 10pt; font-family: 'Courier New'">this.session=session;&nbsp;</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">}</span></p>
<p><strong><span style="font-size: 10pt; font-family: 宋体">非</span><span style="font-size: 10pt; font-family: 'Courier New'">Ioc</span><span style="font-size: 10pt; font-family: 宋体">方式</span></strong></p>
<p><span style="font-size: 10pt; font-family: 宋体">这种方式主要是利用了</span><span style="font-size: 10pt; font-family: 'Courier New'">com.opensymphony.xwork2.ActionContext</span><span style="font-size: 10pt; font-family: 宋体">类以及</span><span style="font-size: 10pt; font-family: 'Courier New'">org.apache.struts2.ServletActionContext</span><span style="font-size: 10pt; font-family: 宋体">类，具体的方法如下所示。</span></p>
<p><span style="font-size: 10pt; font-family: 宋体">获得</span><span style="font-size: 10pt; font-family: 'Courier New'">request</span><span style="font-size: 10pt; font-family: 宋体">对象：</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">A. HttpServletRequest request = ServletActionContext.getRequest (); </span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">B</span><span style="font-size: 10pt; font-family: 宋体">．</span><span style="font-size: 10pt; font-family: 'Courier New'">ActionContext ct = ActionContext.getContext()</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;&nbsp; HttpServletRequest request = </span><span style="font-size: 10pt; font-family: 'Courier New'">(HttpServletRequest)ct.get(ServletActionContext. HTTP_REQUEST ); </span></p>
<p><span style="font-size: 10pt; font-family: 宋体">获得</span><span style="font-size: 10pt; font-family: 'Courier New'">session</span><span style="font-size: 10pt; font-family: 宋体">对象：</span></p>
<p><span style="font-size: 10pt; font-family: 宋体">在</span><span style="font-size: 10pt; font-family: 'Courier New'">Struts2</span><span style="font-size: 10pt; font-family: 宋体">中底层的</span><span style="font-size: 10pt; font-family: 'Courier New'">session</span><span style="font-size: 10pt; font-family: 宋体">都被封装成了</span><span style="font-size: 10pt; font-family: 'Courier New'">Map</span><span style="font-size: 10pt; font-family: 宋体">类型，我们称之为</span><span style="font-size: 10pt; font-family: 'Courier New'">SessionMap</span><span style="font-size: 10pt; font-family: 宋体">，而平常我们所说的</span><span style="font-size: 10pt; font-family: 'Courier New'">session</span><span style="font-size: 10pt; font-family: 宋体">则是指</span><span style="font-size: 10pt; font-family: 'Courier New'">HttpSession</span><span style="font-size: 10pt; font-family: 宋体">对象，具体的获得方法如下所示。</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">A</span><span style="font-size: 10pt; font-family: 宋体">．</span><span style="font-size: 10pt; font-family: 'Courier New'">Map session = ActionContext.getSession();</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">B</span><span style="font-size: 10pt; font-family: 宋体">．</span><span style="font-size: 10pt; font-family: 'Courier New'">Map session = (Map)ActionContext.getContext().get(ActionContext.SESSION);</span></p>
<p><span style="font-size: 10pt; font-family: 宋体">得到这个</span><span style="font-size: 10pt; font-family: 'Courier New'">SessionMap</span><span style="font-size: 10pt; font-family: 宋体">之后我们就可以对</span><span style="font-size: 10pt; font-family: 'Courier New'">session</span><span style="font-size: 10pt; font-family: 宋体">进行读写了，如果我们想得到原始的</span><span style="font-size: 10pt; font-family: 'Courier New'">HttpSession</span><span style="font-size: 10pt; font-family: 宋体">可以首先得到</span><span style="font-size: 10pt; font-family: 'Courier New'">HttpServletRequest</span><span style="font-size: 10pt; font-family: 宋体">对象，然后通过</span><span style="font-size: 10pt; font-family: 'Courier New'">request.getSession()</span><span style="font-size: 10pt; font-family: 宋体">来取得原始的</span><span style="font-size: 10pt; font-family: 'Courier New'">HttpSession</span><span style="font-size: 10pt; font-family: 宋体">对象。一般情况下</span><span style="font-size: 10pt; font-family: 'Courier New'">SessionMap</span><span style="font-size: 10pt; font-family: 宋体">已经可以完成所有的工作，我们不必再去碰底层的</span><span style="font-size: 10pt; font-family: 'Courier New'">session</span><span style="font-size: 10pt; font-family: 宋体">了。</span></p>
<img src ="http://www.blogjava.net/jzone/aggbug/322218.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzone/" target="_blank">Gavin.lee</a> 2010-05-29 16:55 <a href="http://www.blogjava.net/jzone/articles/322218.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>采用url链接形式提交action（非s:from方式提交）</title><link>http://www.blogjava.net/jzone/articles/322215.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Sat, 29 May 2010 08:14:00 GMT</pubDate><guid>http://www.blogjava.net/jzone/articles/322215.html</guid><description><![CDATA[<p><span style="font-size: 10pt; font-family: 宋体">在我们日常开发中，并不是都适合</span><span style="font-size: 10pt; font-family: 'Courier New'">form</span><span style="font-size: 10pt; font-family: 宋体">提交，如在无线网络领域，使用</span><span style="font-size: 10pt; font-family: 'Courier New'">form</span><span style="font-size: 10pt; font-family: 宋体">提交会导致部分手机无法解析该标签，这时候，我们可爱的</span><span style="font-size: 10pt; font-family: 'Courier New'">url</span><span style="font-size: 10pt; font-family: 宋体">链接提交就会得到更广泛的应用了</span></p>
<p><strong><span style="font-size: 10pt; font-family: 'Courier New'">1. </span></strong><strong><span style="font-size: 10pt; font-family: 宋体">标准的</span></strong><strong><span style="font-size: 10pt; font-family: 'Courier New'">WML1.0</span></strong><strong><span style="font-size: 10pt; font-family: 宋体">表单提交格式</span></strong></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; background: silver; color: #3f7f7f; font-family: 'Courier New'">anchor</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span><span style="font-size: 10pt; color: black; font-family: 宋体">提交</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">go</span><span style="font-size: 10pt; font-family: 'Courier New'"> <span style="color: #7f007f">href</span><span style="color: black">=</span>"<span style="color: teal">&lt;</span><span style="color: #3f7f7f">s:url</span> <span style="color: #7f007f">value</span><span style="color: black">=</span><em><span style="color: #2a00ff">'/wap/postParams.action</span></em><span style="color: teal">/&gt;</span>" <span style="color: #7f007f">method</span><span style="color: black">=</span><em><span style="color: #2a00ff">"get"</span></em><span style="color: teal">&gt;</span></span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">postfield</span><span style="font-size: 10pt; font-family: 'Courier New'"> <span style="color: #7f007f">name</span><span style="color: black">=</span><em><span style="color: #2a00ff">"param1"</span></em> <span style="color: #7f007f">value</span><span style="color: black">=</span><em><span style="color: #2a00ff">"$(param1)"</span></em> <span style="color: teal">/&gt;</span></span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">postfield</span><span style="font-size: 10pt; font-family: 'Courier New'"> <span style="color: #7f007f">name</span><span style="color: black">=</span><em><span style="color: #2a00ff">"param2"</span></em> <span style="color: #7f007f">value</span><span style="color: black">=</span><em><span style="color: #2a00ff">"$(param2)"</span></em> <span style="color: teal">/&gt;</span></span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">postfield</span><span style="font-size: 10pt; font-family: 'Courier New'"> <span style="color: #7f007f">name</span><span style="color: black">=</span><em><span style="color: #2a00ff">"struts.token.name"</span></em> <span style="color: #7f007f">value</span><span style="color: black">=</span><em><span style="color: #2a00ff">"struts.token"</span></em><span style="color: teal">/&gt;</span></span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">postfield</span><span style="font-size: 10pt; font-family: 'Courier New'"> <span style="color: #7f007f">name</span><span style="color: black">=</span><em><span style="color: #2a00ff">"struts.token"</span></em> <span style="color: #7f007f">value</span><span style="color: black">=</span>"<span style="color: black">${sessionScope['struts.token'] }</span>"<span style="color: teal">/&gt;</span></span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;/</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">go</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span></p>
<p><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;/</span><span style="font-size: 10pt; background: silver; color: #3f7f7f; font-family: 'Courier New'">anchor</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span></p>
<p><strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'">2. </span></strong><strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&lt;a href=&#8221;&#8221;&gt;&lt;/a&gt;</span></strong><strong><span style="font-size: 10pt; color: black; font-family: 宋体">和</span></strong><strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&lt;s:url /&gt;</span></strong><strong><span style="font-size: 10pt; color: black; font-family: 宋体">完成链接效果</span></strong></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; background: silver; color: #3f7f7f; font-family: 'Courier New'">a</span><span style="font-size: 10pt; font-family: 'Courier New'"> <span style="color: #7f007f">href</span><span style="color: black">=</span>'</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; <span style="color: teal">&lt;</span><span style="color: #3f7f7f">s:url</span> <span style="color: #7f007f">action</span><span style="color: black">=</span><em><span style="color: #2a00ff">"postParams"</span></em><span style="color: teal">&gt;</span></span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: teal">&lt;</span><span style="color: #3f7f7f">s:param</span> <span style="color: #7f007f">name</span><span style="color: black">=</span><em><span style="color: #2a00ff">"param1"</span></em> <span style="color: #7f007f">value</span><span style="color: black">=</span><em><span style="color: #2a00ff">"#stu.id"</span></em> <span style="color: teal">/&gt;</span></span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: teal">&lt;</span><span style="color: #3f7f7f">s:param</span> <span style="color: #7f007f">name</span><span style="color: black">=</span><em><span style="color: #2a00ff">"struts.token.name"</span></em> <span style="color: #7f007f">value</span><span style="color: black">=</span><em><span style="color: #2a00ff">"struts.token"</span></em> <span style="color: teal">/&gt;</span></span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: teal">&lt;</span><span style="color: #3f7f7f">s:param</span> <span style="color: #7f007f">name</span><span style="color: black">=</span><em><span style="color: #2a00ff">"struts.token"</span></em> <span style="color: #7f007f">value</span><span style="color: black">=</span>"<span style="color: black">${sessionScope['struts.token']}</span>" <span style="color: teal">/&gt;</span></span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; <span style="color: teal">&lt;/</span><span style="color: #3f7f7f">s:url</span><span style="color: teal">&gt;</span>'<span style="color: teal">&gt;</span></span></p>
<p><span style="font-size: 10pt; color: black; font-family: 宋体">提交</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;/</span><span style="font-size: 10pt; background: silver; color: #3f7f7f; font-family: 'Courier New'">a</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span></p>
<p><strong><span style="font-size: 10pt; font-family: 'Courier New'">3</span></strong><strong><span style="font-size: 10pt; font-family: 宋体">．</span></strong><strong><span style="font-size: 10pt; font-family: 'Courier New'">&lt;s:a /&gt; </span></strong><strong><span style="font-size: 10pt; font-family: 宋体">和</span></strong><strong><span style="font-size: 10pt; font-family: 'Courier New'"> &lt;s:url /&gt;</span></strong><strong><span style="font-size: 10pt; font-family: 宋体">一起完成链接提交</span></strong></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; background: silver; color: #3f7f7f; font-family: 'Courier New'">s:url</span><span style="font-size: 10pt; font-family: 'Courier New'"> <span style="color: #7f007f">id</span><span style="color: black">=</span><em><span style="color: #2a00ff">"toUrl"</span></em> <span style="color: #7f007f">action</span><span style="color: black">=</span><em><span style="color: #2a00ff">"postParams"</span></em> <span style="color: #7f007f">namespace</span><span style="color: black">=</span><em><span style="color: #2a00ff">"/wap"</span></em><span style="color: teal">&gt;</span></span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">s:param</span><span style="font-size: 10pt; font-family: 'Courier New'"> <span style="color: #7f007f">name</span><span style="color: black">=</span><em><span style="color: #2a00ff">"param1"</span></em> <span style="color: #7f007f">value</span><span style="color: black">=</span><em><span style="color: #2a00ff">"%{param1}"</span></em><span style="color: teal">/&gt;</span></span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">s:param</span><span style="font-size: 10pt; font-family: 'Courier New'"> <span style="color: #7f007f">name</span><span style="color: black">=</span><em><span style="color: #2a00ff">"param2"</span></em> <span style="color: #7f007f">value</span><span style="color: black">=</span><em><span style="color: #2a00ff">"%{param2}"</span></em> <span style="color: teal">/&gt;</span></span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">s:param</span><span style="font-size: 10pt; font-family: 'Courier New'"> <span style="color: #7f007f">name</span><span style="color: black">=</span><em><span style="color: #2a00ff">"struts.token.name"</span></em> <span style="color: #7f007f">value</span><span style="color: black">=</span><em><span style="color: #2a00ff">"struts.token"</span></em> <span style="color: teal">/&gt;</span></span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">s:param</span><span style="font-size: 10pt; font-family: 'Courier New'"> <span style="color: #7f007f">name</span><span style="color: black">=</span><em><span style="color: #2a00ff">"struts.token"</span></em> <span style="color: #7f007f">value</span><span style="color: black">=</span>"<span style="color: black">${sessionScope['struts.token'] }</span>"<span style="color: teal">/&gt;</span></span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;/</span><span style="font-size: 10pt; background: silver; color: #3f7f7f; font-family: 'Courier New'">s:url</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span></p>
<p><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">s:a</span><span style="font-size: 10pt; font-family: 'Courier New'"> <span style="color: #7f007f">href</span><span style="color: black">=</span><em><span style="color: #2a00ff">"%{toUrl}"</span></em><span style="color: teal">&gt;</span></span><span style="font-size: 10pt; color: black; font-family: 宋体">提交</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;/</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">s:a</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span></p>
<p><span style="font-size: 10pt; font-family: 宋体">以上这三个方法在无线互联网开发过程中都是很实用的，具体的要看个人爱好，当然，如果你做</span><span style="font-size: 10pt; font-family: 'Courier New'">WEB</span><span style="font-size: 10pt; font-family: 宋体">开发，你也可以直接用</span><span style="font-size: 10pt; font-family: 'Courier New'">&lt;s:form /&gt;</span></p>
 <img src ="http://www.blogjava.net/jzone/aggbug/322215.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzone/" target="_blank">Gavin.lee</a> 2010-05-29 16:14 <a href="http://www.blogjava.net/jzone/articles/322215.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>回顾Struts2 工作流</title><link>http://www.blogjava.net/jzone/articles/322181.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Fri, 28 May 2010 15:33:00 GMT</pubDate><guid>http://www.blogjava.net/jzone/articles/322181.html</guid><description><![CDATA[Struts2 处理流程概要：<br />
一个请求在Struts2框架中的处理大概分为以下几个步骤<br />
1 客户端初始化一个指向Servlet容器（例如Tomcat）的请求<br />
2 这个请求经过一系列的过滤器（Filter）（这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器，这个过滤器对于Struts2和其他框架的集成很有帮助，例如：SiteMesh Plugin）<br />
3 接着FilterDispatcher被调用，FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action<br />
4 如果ActionMapper决定需要调用某个Action，FilterDispatcher把请求的处理交给ActionProxy<br />
5 ActionProxy通过Configuration Manager询问框架的配置文件，找到需要调用的Action类<br />
6 ActionProxy创建一个ActionInvocation的实例。<br />
7 ActionInvocation实例使用命名模式来调用，在调用Action的过程前后，涉及到相关拦截器（Intercepter）的调用。<br />
8一旦Action执行完毕，ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是（但不总是，也可能是另外的一个Action链）一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2框架中继承的标签。在这个过程中需要涉及到ActionMapper，在上述过程中所有的对象（Action，Results，Interceptors，等）都是通过ObjectFactory来创建的。<br />
<br />
过滤器介绍（Filter）<br />
FilterDispatcher（注：我所使用的2.1.8版本中过滤器也升级到了StrutsPrepareAndExecuteFilter）<br />
org.apache.struts2.dispatcher.FilterDispatcher的四个功能（必须）<br />
struts2.0的主要Filter，负责四个方面的功能。具体：<br />
（1）执行Actions<br />
过滤器通过ActionMapper对象，来判断是否应该被映射到Action.如果mapper对象指示他应该被映射，过滤链将会被终止，然后Action被调用。这一点非常重要，如果同时使用SiteMesh filter，则SiteMesh filter应该放到该过滤器前，否则Action的输出将不会被装饰。<br />
（2）清除ActionContext<br />
过滤器为了确保内存溢出，会自动的清除ActionContext。这可能会存在一些问题，在和其它的框架集成时，例如SiteMesh。ActionContextCleanUp提供了怎么处理这些问题的一些信息。<br />
（3）维护静态内容<br />
过滤器也会维护在Struts2中使用的一些公共的静态的内容，例如JavaScript文件，CSS文件等。搜索/struts/*范围内的请求，然后将/struts/后面的值映射到一些struts的公共包中，也可以在你的类路径中搜索。<br />
（4）清除ActionContext中的内容。<br />
Finally{ActionContextCleanUp.cleanUp(req);} <br />
<br />
ActionContextCleanUp<br />
org.apache.struts2.dispatcher.ActionContextCleanUp（可选）<br />
可选过滤器，这个过滤器对于Struts2和其他框架的集成很有帮助，例如：SiteMesh Plugin。该过滤器用来与FilterDispatcher协同工作以便于集成SiteMesh. 通常, 排列过滤器并保证SiteMesh排在第一位, 而让FilterDispatcher排在第二位看起来是最佳方案. 然而, 你可能希望在SiteMesh修饰器中使用WebWork的特性, 包括value stack, 但由于FilterDispatcher将清除ActionContext, 因此修饰器就访问不到想要的数据了. <br />
<br />
WEB.XML配置顺序<br />
在WebWork的架构中, 标准的过滤器链(filter-chain)一般以 ActionContextCleanUp 开始, 后面跟着其他需要的过滤器. 最后, 由 FilterDispatcher 处理请求, 通常是将请求传递给ActionMapper. ActionContextCleanUp 的首要用途是为集成SiteMesh服务的. 他会通知FilterDispatcher在正确的时间清除请求. 否则, ActionContext将在SiteMesh修饰器访问数据之前被清除.<br />
在不使用SiteMesh的时候,为了使用WebWork,我们只需要在web.xml配置FilterDispatcher一个过滤器即可,阅读一下FilterDispatcher的JavaDoc和源码,我们可以看到它调用了:<br />
finally {&nbsp;&nbsp; ActionContextCleanUp.cleanUp(req); } <br />
而且JavaDoc中也提到看ActionContextCleanUp的文档,那我们就去看吧(我没看所以...)<br />
在ActionContextCleanUp中,有这样的代码:<br />
req.setAttribute(CLEANUP_PRESENT, Boolean.TRUE); <br />
如果FilterDispatcher检测到这个属性,就不会清除ActionContext中的内容了,而由ActionContextCleanUp后续的代码来清除,保证了一系列的Filter访问正确的ActionContext.文档中提到,如果用到SiteMesh的Filter或者其他类似Filter,那么设置顺序是:<br />
1 ActionContextCleanUp filter <br />
2 SiteMesh filter <br />
3 FilterDispatcher <br />
<br />
Struts 2 中使用的模式--CHAIN OF RESPONSIBILITY(职责链)<br />
　　适用性：<br />
　　1.有多个对象可以处理统一请求，但是，那个对象处理要到运行时刻决定。<br />
　　2.希望在不明确接收者的情况下，向多个对象中的一个提交一个请求。<br />
　　3.可处理一个请求的对象集合应该被动态指定。<br />
　　思考：<br />
　　既然要向未知的接收者提交请求，那么就需要统一的提交界面，也就是说，所有接收者应该实现一个公共接口，来接收请求，当然Delegate可以改变这一状况。一个典型的应用环境就是GUI系统中的事件处理方法。例如，我们可以定义一个OnClick的界面，然后OnClick可以是实际接收对象的一个方法代理:<br />
　　OnClick ＝ someObj.doClick;<br />
　　最重要的是，OnClick和someObj.doClick之间的关系是可以动态改变的。另外，这个doClick可以向一个对象集合分发该事件，该集合也是可以动态变化的，这时它的静态结构和观察员模式很相似，但是职责链模式并不需要将事件递交给每一个接收者。观察员模式关心的是如何观察到模型的变化，职责链模式关心的是如何递交出事件。这两者还都需要关心如何接收到相应的事件，尽管接收的行为并不一样。<br />
　　职责链模式需要关心每一个事件都应该被合适的一个或多个接收者处理（HOOK模式）。例如，在一个消息分派的过程中，我们需要考虑如何增减消息处理过程，以处理相关的消息，通常这些处理过程都是各不相同的行为，并且反过来可能对发送者有影响。观察员模式一般而言，应该是无扰的。<br />
　　接收者常常是通过Composite模式来组织的。<br />
　　COMMAND(命令)<br />
　　适用性：<br />
　　1.Command模式是回调函数的一个面向对象的替代品。<br />
　　2.Command对象可以有和初始请求无关的生存期<br />
　　3.支持取消操作<br />
　　4.支持修改日志<br />
　　5.用构建在原语操作上的高层操作构造一个系统。<br />
　　思考：<br />
　　COMMAND模式总是会关联到一个触发者。通常，它提供的是一个非常简单的接口。COMMAND对象一般而言是一个相对高级的对象，他通常可以完成一个相对完整的概念操作，好像是完成了一个事务一样。因为COMMAND比较高级，那么其内部可以安排一些相对底层的支持，例如日志活动。很多COMMAND对象也是同时提供撤销操作。<br />
　　如果COMMAND应用于事务系统，并且，一个COMMAND对象对应于一个事务的话，要小心撤销语意。一般而言，不应该撤销一个事务系统中已经完成的事务。而是通过另一个反向的事务来冲抵。例如一个帐务系统，对于错误的记帐流水事务，在向系统提交以前，可以简单撤销（这可以在Command对象的撤销操作中实现，也可以简单放弃）。对于提交以后，则应该提供一个反向的撤销流水事务（不建议在撤销操作中实现），这样系统最终记录两个事务，并且后一个事务可以冲销前一个事务。进一步，如果发现历史帐务流水记录有错，一般的财务逻辑是需要用红字冲正，就更不应该采用撤销的手段了。<br />
　　职责链的接收者，可以实现为COMMAND对象，当然，这并不必要。
<img src ="http://www.blogjava.net/jzone/aggbug/322181.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzone/" target="_blank">Gavin.lee</a> 2010-05-28 23:33 <a href="http://www.blogjava.net/jzone/articles/322181.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA脚本取得struts2 OgnlValueStack中的值</title><link>http://www.blogjava.net/jzone/articles/321637.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Sat, 22 May 2010 15:56:00 GMT</pubDate><guid>http://www.blogjava.net/jzone/articles/321637.html</guid><description><![CDATA[<p>1 利用脚本获取传入值： </p>
<p>在struts2中action传递给jsp中的数据是保存在OgnlValueStack中的，所以在jsp页面中如果想利用脚本而不是sturts标签获取传入值的话，尽量使用OgnlValueStack的值获得，例如： </p>
<p>&lt;%...OgnlValueStack stack = (OgnlValueStack) request.getAttribute("struts.valueStack"); </p>
<p>Article article = (Article)(stack.findValue("article"));%&gt; </p>
<p>2 sturts2标签自动转换Html标签 </p>
<p>在使用struts2标签&lt;s:property value=""&gt;来显示传递值的时候，会将字符串中的html标签转换，所以可以利用java脚本直接获取传入值，使用方式见第一条<br />
</p>
<img src ="http://www.blogjava.net/jzone/aggbug/321637.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzone/" target="_blank">Gavin.lee</a> 2010-05-22 23:56 <a href="http://www.blogjava.net/jzone/articles/321637.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SSH2 主要知识点+SSH2的jar包详解</title><link>http://www.blogjava.net/jzone/articles/321578.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Fri, 21 May 2010 14:00:00 GMT</pubDate><guid>http://www.blogjava.net/jzone/articles/321578.html</guid><description><![CDATA[<p>以下为我下载的传智播客视频里SSH视频的目录，感觉总结的挺好，SSH2学习中一直由这套视频伴随着我<br />
</p>
<p>SSH2要点：<br />
Struts2.1.8 要点：<br />
01&nbsp;struts2及struts2开发环境的搭建<br />
02&nbsp;第一个struts2应用开发<br />
03&nbsp;解决struts2配置文件无提示问题<br />
04&nbsp;Action名称的搜索顺序<br />
05&nbsp;Action配置的各项默认值<br />
06&nbsp;result配置的各种视图转发类型<br />
07&nbsp;为Action属性注入值<br />
08&nbsp;指定Struts2处理的请求后缀、常量定义、常用常量<br />
09&nbsp;Struts2的处理流程与Action的管理方式<br />
10&nbsp;为应用指定多个配置文件<br />
11&nbsp;动态方法调用和使用通配符定义action<br />
12&nbsp;请求参数接收与采用复合类型接收请求参数及解决中文参数乱码问题<br />
13&nbsp;自定义类型转换器<br />
14&nbsp;全局类型转换器<br />
15&nbsp;访问或添加request、session、application属性<br />
16&nbsp;文件上传<br />
17&nbsp;多文件上传<br />
18&nbsp;自定义拦截器<br />
19&nbsp;对Action中所有方法进行输入校验<br />
20&nbsp;对action指定方法进行校验<br />
21&nbsp;输入校验的流程<br />
22&nbsp;基于XML配置方式实现对action的所有方法进行校验<br />
23&nbsp;基于XML配置方式实现对指定action方法校验与基于XML配置校验的一些特点<br />
24&nbsp;配置国际化全局资源文件、输出国际化信息<br />
25&nbsp;输出带有占位符的国际化信息<br />
26&nbsp;配置包范围国际化资源文件<br />
27&nbsp;配置Action范围国际化资源文件<br />
28&nbsp;ognl表达式<br />
29&nbsp;struts2常用标签解说<br />
30&nbsp;防止表单重复提交</p>
<p>Spring2.5 要点：<br />
01&nbsp;全面阐释Spring及其各项功能<br />
02&nbsp;搭建与测试Spring的开发环境&nbsp;<br />
03&nbsp;编码剖析Spring管理Bean的原理&nbsp;<br />
04&nbsp;Spring的三种实例化Bean的方式&nbsp;<br />
05&nbsp;配置Spring管理的bean的作用域&nbsp;<br />
06&nbsp;Spring管理的Bean的生命周期&nbsp;<br />
07&nbsp;编码剖析Spring依赖注入的原理&nbsp;<br />
08&nbsp;编码剖析Spring装配基本属性的原理&nbsp;<br />
09&nbsp;Spring如何装配各种集合类型的属性&nbsp;<br />
10&nbsp;使用构造器装配属性&nbsp;<br />
11&nbsp;用@Resource注解完成属性装配&nbsp;<br />
12&nbsp;编码剖析@Resource注解的实现原理&nbsp;<br />
13&nbsp;@Autowire注解与自动装配&nbsp;<br />
14&nbsp;让Spring自动扫描和管理Bean&nbsp;<br />
15&nbsp;使用JDK中的Proxy技术实现AOP功能&nbsp;<br />
16&nbsp;使用CGLIB实现AOP功能与AOP概念解释&nbsp;<br />
17&nbsp;使用Spring的注解方式实现AOP入门&nbsp;<br />
18&nbsp;使用Spring的注解方式实现AOP的细节&nbsp;<br />
19&nbsp;使用Spring配置文件实现AOP&nbsp;<br />
20&nbsp;aspectj的切入点语法定义细节&nbsp;<br />
21&nbsp;搭建和配置Spring与jdbc整合的环境&nbsp;<br />
22&nbsp;Spring集成的jdbc编码和事务管理&nbsp;<br />
23&nbsp;使用Spring注解方式管理事务与传播行为详解&nbsp;<br />
24&nbsp;使用Spring配置文件实现事务管理&nbsp;<br />
25&nbsp;搭建和配置Spring与Hibernate整合的环境&nbsp;<br />
26&nbsp;Spring集成的Hibernate编码与测试&nbsp;<br />
27&nbsp;Struts与Spring集成方案1(Struts集成Spring)&nbsp;<br />
28&nbsp;Struts与Spring集成方案2(Spring集成Struts)&nbsp;<br />
29&nbsp;为Spring集成的Hibernate配置二级缓存&nbsp;<br />
30&nbsp;Spring提供的CharacterEncoding和OpenSessionInView功能&nbsp;<br />
31&nbsp;使用Spring集成JPA&nbsp;<br />
32&nbsp;Struts+Spring+JPA集成&nbsp;<br />
33&nbsp;使用Spring集成Struts2&nbsp;</p>
<p>Hibernate3.3要点：<br />
01&nbsp;hibernate介绍与动手入门体验<br />
02&nbsp;hibernate入门案例的细节分析<br />
03&nbsp;hibernate入门案例的代码优化<br />
04&nbsp;Session接口及get|load|persist方法<br />
05&nbsp;实体对象的三种状态与saveOrUpdate方法<br />
06&nbsp;完善HibernateUtil类及hql查询入门<br />
07&nbsp;实体类或属性名与数据库关键字冲突问题<br />
08&nbsp;hql的命名参数与Query接口的分页查询<br />
09&nbsp;Criteria查询方式<br />
10&nbsp;使用Hibernate完成CRUD实验的步骤说明<br />
11&nbsp;完成CRUD实验并回顾和补充细节知识（上）<br />
12&nbsp;完成CRUD实验并回顾和补充细节知识（下）<br />
13&nbsp;总结分析第一天的讲解内容<br />
14&nbsp;多对一关联关系的映射与原理分析<br />
15&nbsp;多对一关联关系的检索与原理分析<br />
16&nbsp;保存多对一关联关系的更进一步分析<br />
17&nbsp;一对多关联关系的映射与原理分析<br />
18&nbsp;一对一主键关联关系的映射与原理分析<br />
19&nbsp;一对一主键关联关系的检索<br />
20&nbsp;一对一外键关联关系的映射与原理分析<br />
21&nbsp;多对多关联关系的映射与原理分析<br />
22&nbsp;多对多关联关系的检索<br />
23&nbsp;组件关联关系的映射与原理分析<br />
24&nbsp;关联关系的总结<br />
25&nbsp;Hibernate中使用的集合类型<br />
26&nbsp;关联关系的级联操作<br />
27&nbsp;inverse属性的作用与原理分析<br />
28&nbsp;分析有序集合与多对多中的inverse属性<br />
29&nbsp;继承关系_整个继承树映射到一张表<br />
30&nbsp;继承关系_每个类映射到一张表<br />
31&nbsp;继承关系_鉴别器与内连接相结合<br />
32&nbsp;继承关系_每个具体类映射一张独立表<br />
33&nbsp;load方法的懒加载及原理分析<br />
34&nbsp;一对一的懒加载分析<br />
35&nbsp;一对多和多对多的懒加载分析<br />
36&nbsp;多对一与一对一的懒加载原理分析<br />
37&nbsp;懒加载的一些扩充细节<br />
38&nbsp;缓存的原理与模拟分析<br />
39&nbsp;hibernate的内部缓存分析<br />
40&nbsp;hibernate的二级缓存配置与分析<br />
41&nbsp;hibernate二级缓存的扩充细节<br />
42&nbsp;分布式缓存的分析与研讨<br />
43&nbsp;事务与事务边界的相关知识<br />
44&nbsp;OpenSessionInView模式的代码分析<br />
45&nbsp;OpenSessionInView的时序图与缺点分析<br />
46&nbsp;事务中的悲观锁与乐观锁<br />
47&nbsp;串讲hibernate配置文件中的配置项<br />
48&nbsp;串讲hibernate映射文件中的配置项<br />
49&nbsp;Hibernate映射类型<br />
50&nbsp;Session与SessionFactory的多线程问题<br />
51&nbsp;Session的内部缓存管理与批量更新<br />
52&nbsp;Hql与Criteria查询的补充知识<br />
53&nbsp;iterate查询与N+1此查询问题<br />
54&nbsp;Hibernate的拦截器与监听器<br />
55&nbsp;本地sql查询与命名查询<br />
56&nbsp;Hiberante的最佳实践<br />
<br />
jar作用的详解：<br />
</p>
<p>spring.jar 是包含有完整发布模块的单个jar 包。但是不包括mock.jar, aspects.jar, spring- </p>
<p>portlet.jar, and spring-hibernate2.jar。 </p>
<p>spring-src.zip就是所有的源代码压缩包。 </p>
<p>除了spring.jar 文件，Spring 还包括有其它21个独立的jar 包，各自包含着对应的Spring组件，用户可以根据自己的需要来选择组合自己的jar 包，而不必引入整个spring.jar 的所有类文件。 </p>
<p>spring-core.jar <br />
这个jar 文件包含Spring 框架基本的核心工具类。Spring 其它组件要都要使用到这个包里的类，是其</p>
<p>它组件的基本核心，当然你也可以在自己的应用系统中使用这些工具类。外部依赖Commons Logging， (Log4J)。 </p>
<p>spring-beans.jar <br />
这个jar 文件是所有应用都要用到的，它包含访问配置文件、创建和管理bean 以及进行Inversion of Control / Dependency Injection（IoC/DI）操作相关的所有类。如果应用只需基本的IoC/DI 支持，引入spring-core.jar 及spring-beans.jar 文件就可以了。 <br />
外部依赖spring-core，(CGLIB)。 </p>
<p>spring-aop.jar <br />
这个jar 文件包含在应用中使用Spring 的AOP 特性时所需的类和源码级元数据支持。使用基于AOP 的Spring特性，如声明型事务管理（Declarative Transaction Management），也要在应用里包含这个jar包。 <br />
外部依赖spring-core， (spring-beans，AOP Alliance， CGLIB，Commons Attributes)。 </p>
<p>spring-context.jar <br />
这个jar 文件为Spring 核心提供了大量扩展。可以找到使用Spring ApplicationContext特性时所需的全部类，JDNI 所需的全部类，instrumentation组件以及校验Validation 方面的相关类,外部依赖spring-beans, (spring-aop)。 </p>
<p>spring-dao.jar <br />
这个jar 文件包含Spring DAO、Spring Transaction 进行数据访问的所有类。为了使用声明型事务支持，还需在自己的应用里包含spring-aop.jar。外部依赖spring-core，(spring-aop， spring-context， JTA API)。 </p>
<p>spring-jdbc.jar <br />
这个jar 文件包含对Spring 对JDBC 数据访问进行封装的所有类。外部依赖spring-beans，spring-dao。 </p>
<p>spring-support.jar <br />
这个jar 文件包含支持UI模版（Velocity，FreeMarker，JasperReports），邮件服务，脚本服务(JRuby)，缓存Cache（EHCache），任务计划Scheduling（uartz）方面的类。外部依赖spring-context, (spring-jdbc, Velocity, FreeMarker, JasperReports, BSH, Groovy, JRuby, Quartz, EHCache) </p>
<p>spring-web.jar <br />
这个jar 文件包含Web 应用开发时，用到Spring 框架时所需的核心类，包括自动载入Web Application Context 特性的类、Struts 与JSF 集成类、文件上传的支持类、Filter 类和大量工具辅助类。外部依赖spring-context, Servlet API, (JSP API, JSTL, Commons FileUpload, COS)。 </p>
<p>spring-webmvc.jar <br />
这个jar 文件包含Spring MVC 框架相关的所有类。包括框架的Servlets，Web MVC框架，控制器和视图支持。当然，如果你的应用使用了独立的MVC 框架，则无需这个JAR 文件里的任何类。外部依赖spring-web, (spring-support，Tiles，iText，POI)。 </p>
<p>spring-portlet.jar <br />
spring自己实现的一个类似Spring MVC的框架。包括一个MVC框架和控制器。外部依赖spring-web， Portlet API，(spring-webmvc)。 </p>
<p>spring-struts.jar <br />
Struts框架支持，可以更方便更容易的集成Struts框架。外部依赖spring-web，Struts。 </p>
<p>spring-remoting.jar <br />
这个jar 文件包含支持EJB、远程调用Remoting（RMI、Hessian、Burlap、Http Invoker、JAX-RPC）方面的类。外部依赖spring-aop， (spring-context，spring-web，Hessian，Burlap，JAX-RPC，EJB API)。 </p>
<p>spring-jmx.jar <br />
这个jar包提供了对JMX 1.0/1.2的支持类。外部依赖spring-beans，spring-aop， JMX API。 </p>
<p>spring-jms.jar <br />
这个jar包提供了对JMS 1.0.2/1.1的支持类。外部依赖spring-beans，spring-dao，JMS API。 </p>
<p>spring-jca.jar <br />
对JCA 1.0的支持。外部依赖spring-beans，spring-dao， JCA API。 </p>
<p>spring-jdo.jar <br />
对JDO 1.0/2.0的支持。外部依赖spring-jdbc， JDO API， (spring-web)。 </p>
<p>spring-jpa.jar <br />
对JPA 1.0的支持。外部依赖spring-jdbc， JPA API， (spring-web)。 </p>
<p>spring-hibernate2.jar <br />
对Hibernate 2.1的支持，已经不建议使用。外部依赖spring-jdbc，Hibernate2，(spring-web)。 </p>
<p>spring-hibernate3.jar <br />
对Hibernate 3.0/3.1/3.2的支持。外部依赖spring-jdbc，Hibernate3，(spring-web)。 </p>
<p>spring-toplink.jar <br />
对TopLink框架的支持。外部依赖spring-jdbc，TopLink。 </p>
<p>spring-ibatis.jar <br />
对iBATIS SQL Maps的支持。外部依赖spring-jdbc，iBATIS SQL Maps。另外的两个包。 </p>
<p>spring-mock.jar <br />
这个jar 文件包含Spring 一整套mock 类来辅助应用的测试。Spring 测试套件使用了其中大量mock 类，这样测试就更加简单。模拟HttpServletRequest 和HttpServletResponse 类在Web 应用单元测试是很方便的。并且提供了对JUnit的支持。外部依赖spring-core。 </p>
<p>spring-aspects.jar <br />
提供对AspectJ的支持，以便可以方便的将面向方面的功能集成进IDE中，比如Eclipse AJDT。外部依赖。WEAVER JARS (dist/weavers)说明。 </p>
<p>spring-agent.jar <br />
Spring的InstrumentationSavingAgent (为InstrumentationLoadTimeWeaver)，一个设备代理包，可以参考JDK1.5的Instrumentation功能获得更多信息。外部依赖none (for use at JVM startup: "-javaagent:spring-agent.jar")。 </p>
<p>spring-tomcat-weaver.jar <br />
扩展Tomcat的ClassLoader，使其可以使用instrumentation（设备）类。外部依赖none (for deployment into Tomcat's "server/lib" directory)。如果需要使用JSP语言作为Spring's web MVC tags的参数，则需要JSP 2.0的支持。或者选择Jakarta的JSTL (standard.jar)。如何选择这些发布包，决定选用哪些发布包其实相当简单。如果你正在构建Web 应用并将全程使用Spring，那么最好就使用单个全部的spring.jar 文件；如果你的应用仅仅用到简单的Inversion of Control / Dependency Injection（IoC/DI）容器，那么只需spring-core.jar与spring-beans.jar 即可；如果你对发布的大小要求很高，那么就得精挑细选了，只取包含自己所需特性的jar 文件了。采用独立的发布包你可以避免包含自己的应用不需要的全部类。当然你可以采用其它的一些工具来设法令整个应用包变小，节省空间的重点在于准确地找出自己所需的 Spring 依赖类，然后合并所需的类与包就可以了。Eclispe 有个插件叫ClassPathHelper 可以帮你找找所依赖的类 </p>
<p>&nbsp;</p>
<p>Hibernate一共包括了23个jar包，令人眼花缭乱。下载Hibernate，例如2.0.3稳定版本，解压缩，可以看到 </p>
<p>一个hibernate2.jar和lib目录下有22个jar包： </p>
<p>hibernate2.jar: <br />
Hibernate的库，没有什么可说的，必须使用的jar包 </p>
<p>cglib-asm.jar: <br />
CGLIB库，Hibernate用它来实现PO字节码的动态生成，非常核心的库，必须使用的jar包 </p>
<p>dom4j.jar: <br />
dom4j是一个Java的XML API，类似于jdom，用来读写XML文件的。dom4j是一个非常非常优秀的Java XML API，具有性能优异、功能强大和极端易用使用的特点，同时它也是一个开放源代码的软件，可以在SourceForge上找到它。在IBM developerWorks上面可以找到一篇文章，对主流的Java XML API进行 的性能、功能和易用性的评测，dom4j无论在那个方面都是非常出色的。我早在将近两年之前就开始使 用dom4j，直到现在。如今你可以看到越来越多的Java软件都在使用dom4j来读写XML，特别值得一提的 是连Sun的JAXM也在用dom4j。这是必须使用的jar包，Hibernate用它来读写配置文件。 </p>
<p>odmg.jar: <br />
ODMG是一个ORM的规范，Hibernate实现了ODMG规范，这是一个核心的库，必须使用的jar包。 </p>
<p>commons-collections.jar： <br />
Apache Commons包中的一个，包含了一些Apache开发的集合类，功能比java.util.*强大。必须使用的jar包。 </p>
<p>commons-beanutils.jar： <br />
Apache Commons包中的一个，包含了一些Bean工具类类。必须使用的jar包。 </p>
<p>commons-lang.jar: <br />
Apache Commons包中的一个，包含了一些数据类型工具类，是java.lang.*的扩展。必须使用的jar包。 </p>
<p>commons-logging.jar: <br />
Apache Commons包中的一个，包含了日志功能，必须使用的jar包。这个包本身包含了一个Simple Logger，但是功能很弱。在运行的时候它会先在CLASSPATH找log4j，如果有，就使用log4j，如果没有，就找JDK1.4带的java.util.logging，如果也找不到就用Simple Logger。commons-logging.jar的出现是一个历史的的遗留的遗憾，当初Apache极力游说Sun把log4j加入JDK1.4，然而JDK1.4项目小组已经 接近发布JDK1.4产品的时间了，因此拒绝了Apache的要求，使用自己的java.util.logging，这个包的功能比log4j差的很远，性能也一般。 后来Apache就开发出来了commons-logging.jar用来兼容两个logger。因此用commons-logging.jar 写的log程序，底层的Logger是可以切换的，你可以选择log4j，java.util.logging或者它自带的 Simple Logger。不过我仍然强烈建议使用log4j，因为log4j性能很高，log输出信息时间几乎等于 System.out，而处理一条log平均只需要5us。你可以在Hibernate的src目录下找到Hibernate已经为你准备好了的log4j的配置文件，你只需要到Apache 网站去下载log4j就可以了。commons-logging.jar也是必须的jar包。 使用Hibernate必须的jar包就是以上的这几个，剩下的都是可选的。 </p>
<p>ant.jar: <br />
Ant编译工具的jar包，用来编译Hibernate源代码的。如果你不准备修改和编译Hibernate源代码，那么就没有什么用，可选的jar包 </p>
<p>optional.jar： <br />
Ant的一个辅助包。 </p>
<p>c3p0.jar： <br />
C3PO是一个数据库连接池，Hibernate可以配置为使用C3PO连接池。如果你准备用这个连接池，就需要这个jar包。 </p>
<p>proxool.jar： <br />
也是一个连接池，同上。 </p>
<p>commons-pool.jar, commons-dbcp.jar: <br />
DBCP数据库连接池，Apache的Jakarta组织开发的，Tomcat4的连接池也是DBCP。实际上Hibernate自己也实现了一个非常非常简单的数据库连接池，加上上面3个，你实际上可以在 Hibernate上选择4种不同的数据库连接池，选择哪一个看个人的偏好，不过DBCP可能更通用一些。另外强调一点，如果在EJB中使用Hibernate，一定要用App Server的连接池，不要用以上4种连接池，否则容器管理事务不起作用。 </p>
<p>connector.jar: <br />
JCA 规范，如果你在App Server上把Hibernate配置为Connector的话，就需要这个jar。不过实际上一般App Server肯定会带上这个包，所以实际上是多余的包。 </p>
<p>jaas.jar: <br />
JAAS是用来进行权限验证的，已经包含在JDK1.4里面了。所以实际上是多余的包。 </p>
<p>jcs.jar： <br />
如果你准备在Hibernate中使用JCS的话，那么必须包括它，否则就不用。 </p>
<p>jdbc2_0-stdext.jar: <br />
JDBC2.0的扩展包，一般来说数据库连接池会用上它。不过App Server都会带上，所以也是多余的。 </p>
<p>jta.jar： <br />
JTA规范，当Hibernate使用JTA的时候需要，不过App Server都会带上，所以也是多余的。</p>
<img src ="http://www.blogjava.net/jzone/aggbug/321578.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzone/" target="_blank">Gavin.lee</a> 2010-05-21 22:00 <a href="http://www.blogjava.net/jzone/articles/321578.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2 要点笔记（六）</title><link>http://www.blogjava.net/jzone/articles/321315.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Tue, 18 May 2010 17:24:00 GMT</pubDate><guid>http://www.blogjava.net/jzone/articles/321315.html</guid><description><![CDATA[<p><span style="font-family: 宋体">二十三、</span><span style="font-family: 'Courier New'">OGNL</span><span style="font-family: 宋体">表达式</span><span style="font-family: 'Courier New'">-Object Graphic Navigation Language</span><span style="font-family: 宋体">（对象图导航语言）</span></p>
<p><span style="font-family: 宋体">是</span><span style="font-family: 'Courier New'">Struts2</span><span style="font-family: 宋体">框架默认的表达式语言</span><span style="font-family: 'Courier New'">—</span><span style="font-family: 宋体">其实我们可以不掌握</span><span style="font-family: 'Courier New'">OGNL</span><span style="font-family: 宋体">表达式，</span><span style="font-family: 'Courier New'">JSTL/EL</span><span style="font-family: 宋体">来代替</span></p>
<p><span style="font-family: 宋体">相对</span><span style="font-family: 'Courier New'">EL</span><span style="font-family: 宋体">表达式，它提供了平时我们需要的一些功能，如：</span></p>
<p><span style="font-family: 'Courier New'">1. </span><span style="font-family: 宋体">支持对象方法调用。如</span><span style="font-family: 'Courier New'">xxx.sayHello()</span></p>
<p><span style="font-family: 'Courier New'">2. </span><span style="font-family: 宋体">支持类静态方法调用和值访问，表达式的格式为</span><span style="font-family: 'Courier New'">@[</span><span style="font-family: 宋体">类全名（包括包路径）</span><span style="font-family: 'Courier New'">]@[</span><span style="font-family: 宋体">方法名</span><span style="font-family: 'Courier New'">|</span><span style="font-family: 宋体">值名</span><span style="font-family: 'Courier New'">]</span><span style="font-family: 宋体">，例如：</span><span style="font-family: 'Courier New'">@<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#106;&#97;&#118;&#97;&#46;&#108;&#97;&#110;&#103;&#46;&#83;&#116;&#114;&#105;&#110;&#103;&#64;&#102;&#111;&#114;&#109;&#97;&#116;&#40;&#39;&#102;&#111;&#111;&#37;&#50;&#53;&#115;">java.lang.String@format(&#8216;foo%s</a>&#8217;, &#8216;bar&#8217;)</span><span style="font-family: 宋体">或者</span></p>
<p><span style="font-family: 'Courier New'">@cn.itcast.Constant@APP_NAME</span></p>
<p style="margin-left: 18.75pt; text-indent: -18.75pt; tab-stops: list 18.75pt"><span style="font-family: 'Courier New'">1.<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">操作类对象</span></p>
<p><span style="font-family: 'Courier New'">ognl</span><span style="font-family: 宋体">有一个上下文</span><span style="font-family: 'Courier New'">(Context)</span><span style="font-family: 宋体">概念，说白了上下文就是一个</span><span style="font-family: 'Courier New'">MAP</span><span style="font-family: 宋体">结构，它实现了</span><span style="font-family: 'Courier New'">java.utils.Map</span><span style="font-family: 宋体">接口，在</span><span style="font-family: 'Courier New'">Struts2</span><span style="font-family: 宋体">中上下文</span><span style="font-family: 'Courier New'">(Context)</span><span style="font-family: 宋体">的实现为</span><span style="font-family: 'Courier New'">ActionContext</span><span style="font-family: 宋体">，下面是上下文（</span><span style="font-family: 'Courier New'">Context</span><span style="font-family: 宋体">）的结构示意图</span></p>
<p><span style="font-family: 'Courier New'">Struts2</span><span style="font-family: 宋体">中的</span><span style="font-family: 'Courier New'">OGNL</span><span style="font-family: 宋体">实现者为</span><span style="font-family: 'Courier New'">AcionContext</span></p>
<p><span style="font-family: 宋体">当</span><span style="font-family: 'Courier New'">Struts2</span><span style="font-family: 宋体">接收一个请求时，会迅速创建</span><span style="font-family: 'Courier New'">ActionContext</span><span style="font-family: 宋体">，</span><span style="font-family: 'Courier New'">ValueStack</span><span style="font-family: 宋体">，</span><span style="font-family: 'Courier New'">action</span><span style="font-family: 宋体">，然后把</span><span style="font-family: 'Courier New'">action</span><span style="font-family: 宋体">存放进</span><span style="font-family: 'Courier New'">ValueStack</span><span style="font-family: 宋体">，所以</span><span style="font-family: 'Courier New'">action</span><span style="font-family: 宋体">的实例变量可以被</span><span style="font-family: 'Courier New'">OGNL</span><span style="font-family: 宋体">访问</span></p>
<p><span style="font-family: 宋体">访问上下文（</span><span style="font-family: 'Courier New'">Context</span><span style="font-family: 宋体">）中的对象徐傲使用</span><span style="font-family: 'Courier New'">#</span><span style="font-family: 宋体">符号标注命名空间，如</span><span style="font-family: 'Courier New'">#application</span><span style="font-family: 宋体">，</span><span style="font-family: 'Courier New'">#session</span></p>
<p><span style="font-family: 宋体">另外</span><span style="font-family: 'Courier New'">OGNL</span><span style="font-family: 宋体">会设定一个根对象（</span><span style="font-family: 'Courier New'">root</span><span style="font-family: 宋体">对象），在</span><span style="font-family: 'Courier New'">Struts2</span><span style="font-family: 宋体">中根对象就是</span><span style="font-family: 'Courier New'">ValueStack</span><span style="font-family: 宋体">（值栈），如果要访问根对象（即</span><span style="font-family: 'Courier New'">ValueStack</span><span style="font-family: 宋体">）中对象的属性，则可以省略</span><span style="font-family: 'Courier New'">#</span><span style="font-family: 宋体">命名空间，直接访问该对象的属性即可。</span></p>
<p><span style="font-family: 宋体">在</span><span style="font-family: 'Courier New'">Struts2</span><span style="font-family: 宋体">中，根对象</span><span style="font-family: 'Courier New'">ValueStack</span><span style="font-family: 宋体">的实现为</span><span style="font-family: 'Courier New'">OgnlValueStack</span><span style="font-family: 宋体">，该对象不是我们想象的只存放单个值，而是存放一组对象。在</span><span style="font-family: 'Courier New'">OgnlValueStack</span><span style="font-family: 宋体">类里有一个</span><span style="font-family: 'Courier New'">List</span><span style="font-family: 宋体">类型的</span><span style="font-family: 'Courier New'">root</span><span style="font-family: 宋体">变量就是使用他存放一组对象。</span></p>
<p><span style="font-family: 宋体">在</span><span style="font-family: 'Courier New'">root</span><span style="font-family: 宋体">变量中处于第一位的对象叫栈顶对象，通常我们在</span><span style="font-family: 'Courier New'">OGNL</span><span style="font-family: 宋体">表达式里直接写上属性的名称即可访问</span><span style="font-family: 'Courier New'">root</span><span style="font-family: 宋体">变量里对象的属性，搜索顺序是从栈顶对象开始寻找，如果栈顶对象不存在该属性，就会从第二个对象寻找，如果没有找到就到第三个对象寻找，依次往下访问，知道找到为止。</span></p>
<p><span style="font-family: 宋体">注意：</span><span style="font-family: 'Courier New'">Struts</span><span style="font-family: 宋体">中，</span><span style="font-family: 'Courier New'">OGNL</span><span style="font-family: 宋体">表达式是需要配合</span><span style="font-family: 'Courier New'">Struts</span><span style="font-family: 宋体">标签才能使用，如</span><span style="font-family: 'Courier New'">:&lt;s:property value=&#8221;name&#8221;/&gt;</span></p>
<p><span style="font-family: 宋体">由于</span><span style="font-family: 'Courier New'">ValueStack</span><span style="font-family: 宋体">（值栈）是</span><span style="font-family: 'Courier New'">Struts2</span><span style="font-family: 宋体">中</span><span style="font-family: 'Courier New'">OGNL</span><span style="font-family: 宋体">的根对象，如果用户需要访问值栈中的对象，在</span><span style="font-family: 'Courier New'">JSP</span><span style="font-family: 宋体">页面可以直接通过下面的</span><span style="font-family: 'Courier New'">EL</span><span style="font-family: 宋体">表达式访问</span><span style="font-family: 'Courier New'">ValueStack</span><span style="font-family: 宋体">（值栈）中对象的属性：</span></p>
<p><span style="font-family: 'Courier New'">${foo} //</span><span style="font-family: 宋体">获得值栈中某个对象的</span><span style="font-family: 'Courier New'">foo</span><span style="font-family: 宋体">属性</span></p>
<p><span style="font-family: 宋体">如果访问其他</span><span style="font-family: 'Courier New'">Context</span><span style="font-family: 宋体">中的对象，由于他们不是根对象，所以在访问时，需要添加</span><span style="font-family: 'Courier New'">#</span><span style="font-family: 宋体">前缀</span></p>
<p><strong><span style="font-family: 'Courier New'">application</span></strong><strong><span style="font-family: 宋体">对象</span></strong><span style="font-family: 宋体">：用于访问</span><span style="font-family: 'Courier New'">ServletContext</span><span style="font-family: 宋体">，例如</span><span style="font-family: 'Courier New'">#application.userName</span><span style="font-family: 宋体">或者</span><span style="font-family: 'Courier New'">#application[&#8216;userName&#8217;]</span><span style="font-family: 宋体">，相当于调用</span><span style="font-family: 'Courier New'">ServletContext</span><span style="font-family: 宋体">的</span><span style="font-family: 'Courier New'">getAttribute(&#8220;username&#8221;)</span></p>
<p><strong><span style="font-family: 'Courier New'">session</span></strong><strong><span style="font-family: 宋体">对象</span></strong><span style="font-family: 宋体">：用来访问</span><span style="font-family: 'Courier New'">HttpSession</span><span style="font-family: 宋体">。例如</span><span style="font-family: 'Courier New'">#session.userName</span><span style="font-family: 宋体">或者</span><span style="font-family: 'Courier New'">#session[&#8216;userName&#8217;]</span><span style="font-family: 宋体">，相当于调用</span><span style="font-family: 'Courier New'">session.getAttribue(&#8220;userName&#8221;)</span></p>
<p><strong><span style="font-family: 'Courier New'">request</span></strong><strong><span style="font-family: 宋体">对象</span></strong><span style="font-family: 宋体">：用来访问</span><span style="font-family: 'Courier New'">HttpServletRequest</span><span style="font-family: 宋体">属性（</span><span style="font-family: 'Courier New'">attribute</span><span style="font-family: 宋体">）的</span><span style="font-family: 'Courier New'">Map</span><span style="font-family: 宋体">，例如</span><span style="font-family: 'Courier New'">#request.userName</span><span style="font-family: 宋体">或者</span><span style="font-family: 'Courier New'">#request[&#8216;userName&#8217;],</span><span style="font-family: 宋体">相当于调用</span><span style="font-family: 'Courier New'">request.getAttribute(&#8220;username&#8221;)</span></p>
<p><strong><span style="font-family: 'Courier New'">parameters</span></strong><strong><span style="font-family: 宋体">对象</span></strong><span style="font-family: 宋体">：用于访问</span><span style="font-family: 'Courier New'">HTTP</span><span style="font-family: 宋体">的请求参数，例如</span><span style="font-family: 'Courier New'">#parameters.userName</span><span style="font-family: 宋体">或者</span></p>
<p><span style="font-family: 'Courier New'">#parameters[&#8216;userName&#8217;]</span><span style="font-family: 宋体">，</span></p>
<p><span style="font-family: 宋体">相当于调用</span><span style="font-family: 'Courier New'">request.getParameter(&#8220;username&#8221;)</span></p>
<p><strong><span style="font-family: 'Courier New'">attr</span></strong><strong><span style="font-family: 宋体">对象</span></strong><span style="font-family: 宋体">：用于按</span><span style="font-family: 'Courier New'">page-&gt;request-&gt;session-&gt;application</span><span style="font-family: 宋体">顺序访问其属性</span></p>
<p><span style="font-family: 宋体">为什么</span><span style="font-family: 'Courier New'">EL</span><span style="font-family: 宋体">表达式能够访问</span><span style="font-family: 'Courier New'">valueStack</span><span style="font-family: 宋体">中对象的属性？</span></p>
<p><span style="font-family: 宋体">因为</span><span style="font-family: 'Courier New'">Struts2</span><span style="font-family: 宋体">对</span><span style="font-family: 'Courier New'">HttpServletRequest</span><span style="font-family: 宋体">做了进一步的封装</span></p>
<p><span style="font-family: 宋体">采用</span><span style="font-family: 'Courier New'">OGNL</span><span style="font-family: 宋体">，不能访问四大作用域中的变量，只能访问</span><span style="font-family: 'Courier New'">ValueStack</span><span style="font-family: 宋体">中的变量</span></p>
<p><span style="font-family: 宋体">采用</span><span style="font-family: 'Courier New'">OGNL</span><span style="font-family: 宋体">表达式创建一个</span><span style="font-family: 'Courier New'">List/Map</span><span style="font-family: 宋体">集合对象</span></p>
<p><span style="font-family: 宋体">如果需要一个集合元素的时候（例如</span><span style="font-family: 'Courier New'">List</span><span style="font-family: 宋体">对象或者</span><span style="font-family: 'Courier New'">Map</span><span style="font-family: 宋体">对象），可以使用</span><span style="font-family: 'Courier New'">OGNL</span><span style="font-family: 宋体">中同集合相关的表达式。</span></p>
<p><span style="font-family: 宋体">例如使用如下代码直接生成一个</span><span style="font-family: 'Courier New'">List</span><span style="font-family: 宋体">对象：</span></p>
<p><span style="font-family: 'Courier New'">&lt;s:set name=&#8221;list&#8221; value=&#8221;{&#8216;zhangming&#8217;,&#8217;xiaoli&#8217;,&#8217;liming&#8217;}&#8221;/&gt;</span></p>
<p><span style="font-family: 'Courier New'">&lt;s:iterator value=&#8221;#list&#8221;&gt;</span></p>
<p><span style="font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; &lt;s:property /&gt;&lt;br/&gt;</span></p>
<p><span style="font-family: 'Courier New'">&lt;/s:iterator&gt;</span></p>
<p><span style="font-family: 'Courier New'">set</span><span style="font-family: 宋体">标签用于将某个值放入指定范围</span></p>
<p><span style="font-family: 'Courier New'">scope</span><span style="font-family: 宋体">：指定变量被放置的范围，该属性可以接受</span><span style="font-family: 'Courier New'">application</span><span style="font-family: 宋体">、</span><span style="font-family: 'Courier New'">session</span><span style="font-family: 宋体">、</span><span style="font-family: 'Courier New'">request</span><span style="font-family: 宋体">、</span><span style="font-family: 'Courier New'">page</span><span style="font-family: 宋体">或者</span><span style="font-family: 'Courier New'">action</span><span style="font-family: 宋体">。如果没有设置该属性，则默认放置在</span><span style="font-family: 'Courier New'">OGNL Context</span><span style="font-family: 宋体">中</span></p>
<p><span style="font-family: 'Courier New'">value</span><span style="font-family: 宋体">：赋给变量的值，如果没有设置该属性，则将</span><span style="font-family: 'Courier New'">valueStack</span><span style="font-family: 宋体">栈顶的值赋给变量</span></p>
<p><span style="font-family: 宋体">生成一个</span><span style="font-family: 'Courier New'">Map</span><span style="font-family: 宋体">对象</span></p>
<p><span style="font-family: 'Courier New'">&lt;s:set name=&#8221;foobar&#8221; value=&#8221;#{&#8216;foo1&#8217;:&#8217;bar1&#8217;,&#8217;foo2&#8217;:&#8217;bar2&#8217;}&#8221; /&gt;</span></p>
<p><span style="font-family: 'Courier New'">&lt;s:iterator value=&#8221;#foobar&#8221; &gt;</span></p>
<p><span style="font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; &lt;s:property value=&#8221;key&#8221;&gt;=&lt;s:property value=&#8221;value&#8221;/&gt;</span></p>
<p><span style="font-family: 'Courier New'">&lt;/s:iterator&gt;</span></p>
<p><span style="font-family: 宋体">采用</span><span style="font-family: 'Courier New'">OGNL</span><span style="font-family: 宋体">表达式判断对象是否存在于集合中：</span></p>
<p><span style="font-family: 宋体">对于集合类型，</span><span style="font-family: 'Courier New'">OGNL</span><span style="font-family: 宋体">表达式可以使用</span><span style="font-family: 'Courier New'">in</span><span style="font-family: 宋体">和</span><span style="font-family: 'Courier New'">not in</span><span style="font-family: 宋体">两个元素符号，其中，</span><span style="font-family: 'Courier New'">in</span><span style="font-family: 宋体">表达式用来判断某个元素是否在指定的集合对象中，</span><span style="font-family: 'Courier New'">not in</span><span style="font-family: 宋体">判断某个元素是否不在指定的集合对象中，如下所示。</span></p>
<p><span style="font-family: 'Courier New'">in</span><span style="font-family: 宋体">表达式：</span></p>
<p><span style="font-family: 'Courier New'">&lt;s:if test=&#8221;&#8217;foo&#8217; in {&#8216;foo&#8217;,&#8217;bar&#8217;}&gt;</span></p>
<p><span style="font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; zai</span></p>
<p><span style="font-family: 'Courier New'">&lt;/s:if&gt;</span></p>
<p><span style="font-family: 'Courier New'">&lt;s:else&gt;</span></p>
<p><span style="font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; bu zai</span></p>
<p><span style="font-family: 'Courier New'">&lt;/s:else&gt;</span></p>
<p><span style="font-family: 'Courier New'">not in </span><span style="font-family: 宋体">表达式：</span></p>
<p><span style="font-family: 'Courier New'">&lt;s:if test&#8221;&#8217;foo&#8217; not in {&#8216;foo&#8217;,&#8217;bar&#8217;}&gt;</span></p>
<p><span style="font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; bu zai</span></p>
<p><span style="font-family: 'Courier New'">&lt;/s:if&gt;</span></p>
<p><span style="font-family: 'Courier New'">&lt;s:else&gt;</span></p>
<p><span style="font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; zai</span></p>
<p><span style="font-family: 'Courier New'">&lt;/s:else&gt;</span></p>
<p><span style="font-family: 'Courier New'">OGNL</span><span style="font-family: 宋体">表达式的投影功能</span><span style="font-family: 'Courier New'">---</span><span style="font-family: 宋体">一般不适用，我们一般会在业务层把满足条件的对象归结出来</span></p>
<p><span style="font-family: 宋体">除了</span><span style="font-family: 'Courier New'">in</span><span style="font-family: 宋体">和</span><span style="font-family: 'Courier New'">not in</span><span style="font-family: 宋体">之外，</span><span style="font-family: 'Courier New'">OGNL</span><span style="font-family: 宋体">还允许使用某个规则获得集合对象的子集，场用的有以下</span><span style="font-family: 'Courier New'">3</span><span style="font-family: 宋体">个相关操作符。</span></p>
<p><span style="font-family: 'Courier New'">?:</span><span style="font-family: 宋体">获得所有符合逻辑的元素</span></p>
<p><span style="font-family: 'Courier New'">^:</span><span style="font-family: 宋体">获得符合逻辑的第一个元素</span></p>
<p><span style="font-family: 'Courier New'">$:</span><span style="font-family: 宋体">获得符合逻辑的最后一个元素</span></p>
<p><span style="font-family: 宋体">例如代码：</span></p>
<p><span style="font-family: 'Courier New'">&lt;s:iterator value=&#8221;books.{?#this.price &gt; 35}&#8221;&gt;</span></p>
<p><span style="font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; &lt;s:property value=&#8221;title&#8221;/&gt;-$&lt;s:property value=&#8221;price&#8221; /&gt;&lt;br/&gt;</span></p>
<p><span style="font-family: 'Courier New'">&lt;/s:iterator&gt;</span></p>
<p><span style="font-family: 宋体">在上面的代码中，直接在集合后紧跟</span><span style="font-family: 'Courier New'">.{}</span><span style="font-family: 宋体">运算符取出该集合的子集，</span><span style="font-family: 'Courier New'">{}</span><span style="font-family: 宋体">内的表达式用于获取符合条件的元素，</span><span style="font-family: 'Courier New'">this</span><span style="font-family: 宋体">指的是为了从大集合</span><span style="font-family: 'Courier New'">books</span><span style="font-family: 宋体">筛选数据到小集合，需要对大集合</span><span style="font-family: 'Courier New'">books</span><span style="font-family: 宋体">进行迭代，</span><span style="font-family: 'Courier New'">this</span><span style="font-family: 宋体">代表当前迭代的元素。本例的表达式用于获取集合中价格大于</span><span style="font-family: 'Courier New'">35</span><span style="font-family: 宋体">的书集合</span></p>
<p><span style="font-family: 'Courier New'">books.{?#this.price &gt; 35}</span></p>
<p><span style="font-family: 'Courier New'">books.{&#8230;&#8230;}</span><span style="font-family: 宋体">：</span><span style="font-family: 'Courier New'">&nbsp;</span><span style="font-family: 宋体">要从大集合中，筛选出满足</span><span style="font-family: 'Courier New'">&#8230;&#8230;</span><span style="font-family: 宋体">这个条件的子集合放到</span><span style="font-family: 'Courier New'">value</span><span style="font-family: 宋体">中</span></p>
<p><span style="font-family: 'Courier New'">?</span><span style="font-family: 宋体">：表示符合逻辑的元素</span></p>
<p><span style="font-family: 'Courier New'">#this:</span><span style="font-family: 宋体">迭代大集合的当前元素<br />
<br />
<br />
&nbsp; </p>
<p><span style="font-family: 宋体">二十四、</span><span style="font-family: 'Courier New'">Struts2 </span><span style="font-family: 宋体">标签使用</span></p>
<p><strong><span style="font-family: 'Courier New'">property</span></strong><strong><span style="font-family: 宋体">标签使用</span></strong></p>
<p><span style="font-family: 'Courier New'">&lt;s:set name=&#8221;name&#8221; value=&#8221;kk&#8221; /&gt;</span></p>
<p><span style="font-family: 'Courier New'">&lt;s:property value=&#8221;#name&#8221; /&gt;</span></p>
<p><span style="font-family: 'Courier New'">default:</span><span style="font-family: 宋体">可选属性，如果需要输出的属性值为</span><span style="font-family: 'Courier New'">NULL</span><span style="font-family: 宋体">，则显示该属性指定的值</span></p>
<p><span style="font-family: 'Courier New'">escape:</span><span style="font-family: 宋体">可选属性，指定是否格式化</span><span style="font-family: 'Courier New'">HTML</span><span style="font-family: 宋体">代码。</span></p>
<p><span style="font-family: 'Courier New'">value:</span><span style="font-family: 宋体">可选属性，指定需要输出的属性值，如果没有指定该属性，则默认输出</span><span style="font-family: 'Courier New'">valueStack</span><span style="font-family: 宋体">栈顶的值</span></p>
<p><span style="font-family: 'Courier New'">id:</span><span style="font-family: 宋体">可选属性，指定该元素的标识</span></p>
<p><strong><span style="font-family: 'Courier New'">iterator </span></strong><strong><span style="font-family: 宋体">迭代标签</span></strong></p>
<p><span style="font-family: 'Courier New'">iterator</span><span style="font-family: 宋体">标签对于集合进行迭代，这里的集合包含</span><span style="font-family: 'Courier New'">List</span><span style="font-family: 宋体">、</span><span style="font-family: 'Courier New'">Set</span><span style="font-family: 宋体">和数组</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">s:set</span><span style="font-size: 10pt; font-family: 'Courier New'"> <span style="color: #7f007f">name</span><span style="color: black">=</span><em><span style="color: #2a00ff">"list"</span></em> <span style="color: #7f007f">value</span><span style="color: black">=</span><em><span style="color: #2a00ff">"{'zhangming','xiaoi','liming'}"</span></em><span style="color: teal">/&gt;</span></span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">s:iterator</span><span style="font-size: 10pt; font-family: 'Courier New'"> <span style="color: #7f007f">value</span><span style="color: black">=</span><em><span style="color: #2a00ff">"#list"</span></em> <span style="color: #7f007f">status</span><span style="color: black">=</span><em><span style="color: #2a00ff">"st"</span></em><span style="color: teal">&gt;</span></span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">font</span><span style="font-size: 10pt; font-family: 'Courier New'"> <span style="color: #7f007f">color</span><span style="color: black">=</span><span style="color: teal">&lt;</span><span style="color: #3f7f7f">s:if</span> <span style="color: #7f007f">test</span><span style="color: black">=</span><em><span style="color: #2a00ff">"#st.odd"</span></em><span style="color: teal">&gt;</span><span style="color: black">red</span><span style="color: teal">&lt;/</span><span style="color: #3f7f7f">s:if</span><span style="color: teal">&gt;&lt;</span><span style="color: #3f7f7f">s:else</span><span style="color: teal">&gt;</span><span style="color: black">blue</span><span style="color: teal">&lt;/</span><span style="color: #3f7f7f">s:else</span><span style="color: teal">&gt;&gt;</span></span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">s:property</span><span style="font-size: 10pt; font-family: 'Courier New'"> <span style="color: teal">/&gt;&lt;/</span><span style="color: #3f7f7f">font</span><span style="color: teal">&gt;</span><span style="color: black">/</span><span style="color: teal">&lt;</span><span style="color: #3f7f7f">br</span><span style="color: teal">&gt;</span></span></p>
<p><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;/</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">s:iterator</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span></p>
<p><span style="font-family: 'Courier New'">value:</span><span style="font-family: 宋体">可选属性，指定被迭代的集合，如果没有设置该属性，则使用</span><span style="font-family: 'Courier New'">ValueStack</span><span style="font-family: 宋体">栈顶的集合</span></p>
<p><span style="font-family: 'Courier New'">id:</span><span style="font-family: 宋体">可选属性，指定集合里元素的</span><span style="font-family: 'Courier New'">id</span><span style="font-family: 宋体">（已被标注为过时）</span></p>
<p><span style="font-family: 'Courier New'">status:</span><span style="font-family: 宋体">可选属性，该属性指定迭代时的</span><span style="font-family: 'Courier New'">iteratorStatus</span><span style="font-family: 宋体">实例，该实例包含如下几个方法：</span></p>
<p><span style="font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; int getCount(),</span><span style="font-family: 宋体">返回当前迭代了几个元素</span></p>
<p><span style="font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; int getIndex(),</span><span style="font-family: 宋体">返回当前迭代元素的索引</span></p>
<p><span style="font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; Boolean isEven(),</span><span style="font-family: 宋体">返回当前被迭代元素的索引是否是偶数</span></p>
<p><span style="font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; Boolean isOdd(),</span><span style="font-family: 宋体">返回当前被迭代元素的索引是否是奇数</span></p>
<p><span style="font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; Boolean isFirst(),</span><span style="font-family: 宋体">返回当前被迭代元素是否是第一个元素</span></p>
<p><span style="font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; Boolean isLast(),</span><span style="font-family: 宋体">返回当前被迭代元素是否是最后一个元素</span></p>
<p><strong><span style="font-family: 'Courier New'">if/elseif/else </span></strong><strong><span style="font-family: 宋体">逻辑判断</span></strong></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">s:set</span><span style="font-size: 10pt; font-family: 'Courier New'"> <span style="color: #7f007f">name</span><span style="color: black">=</span><em><span style="color: #2a00ff">"age"</span></em> <span style="color: #7f007f">value</span><span style="color: black">=</span><em><span style="color: #2a00ff">"323"</span></em> <span style="color: #7f007f">scope</span><span style="color: black">=</span><em><span style="color: #2a00ff">"request"</span></em><span style="color: teal">/&gt;</span></span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">s:if</span><span style="font-size: 10pt; font-family: 'Courier New'"> <span style="color: #7f007f">test</span><span style="color: black">=</span><em><span style="color: #2a00ff">"#request.age==23"</span></em><span style="color: teal">&gt;</span></span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; 23</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;/</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">s:if</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">s:elseif</span><span style="font-size: 10pt; font-family: 'Courier New'"> <span style="color: #7f007f">test</span><span style="color: black">=</span><em><span style="color: #2a00ff">"#request.age==21"</span></em><span style="color: teal">&gt;</span></span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; 21</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;/</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">s:elseif</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">s:else</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: black; font-family: 宋体">都不等</span></p>
<p><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;/</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">s:else</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span></p>
<p><strong><span style="font-family: 'Courier New'">url</span></strong><strong><span style="font-family: 宋体">标签</span></strong></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; background: silver; color: #3f7f7f; font-family: 'Courier New'">a</span><span style="font-size: 10pt; font-family: 'Courier New'"> <span style="color: #7f007f">href</span><span style="color: black">=</span>"<span style="color: teal">&lt;</span><span style="color: #3f7f7f">s:url</span> <span style="color: #7f007f">action</span><span style="color: black">=</span><em><span style="color: #2a00ff">"helloworld_add"</span></em> <span style="color: #7f007f">namespace</span><span style="color: black">=</span><em><span style="color: #2a00ff">"/test"</span></em><span style="color: teal">&gt;&lt;</span><span style="color: #3f7f7f">s:param</span> <span style="color: #7f007f">name</span><span style="color: black">=</span><em><span style="color: #2a00ff">"personid"</span></em> <span style="color: #7f007f">value</span><span style="color: black">=</span><em><span style="color: #2a00ff">"233"</span></em><span style="color: teal">/&gt;&lt;/</span><span style="color: #3f7f7f">s:url</span><span style="color: teal">&gt;</span>"<span style="color: teal">&gt;</span><u><span style="color: black">ssss</span></u><span style="color: teal">&lt;/</span><span style="background: silver; color: #3f7f7f">a</span><span style="color: teal">&gt;</span></span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">s:set</span><span style="font-size: 10pt; font-family: 'Courier New'"> <span style="color: #7f007f">name</span><span style="color: black">=</span><em><span style="color: #2a00ff">"myurl"</span></em> <span style="color: #7f007f">value</span><span style="color: black">=</span><em><span style="color: #2a00ff">"'http://www.foshanshop.net'"</span></em><span style="color: teal">/&gt;</span></span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">s:url</span><span style="font-size: 10pt; font-family: 'Courier New'"> <span style="color: #7f007f">value</span><span style="color: black">=</span><em><span style="color: #2a00ff">"%{#myurl}"</span></em> <span style="color: teal">/&gt;&lt;</span><span style="color: #3f7f7f">br</span><span style="color: teal">&gt;</span></span></p>
<p><strong><span style="font-family: 'Courier New'">checkboxlist</span></strong><strong><span style="font-family: 宋体">复选框</span></strong><strong><span style="font-family: 'Courier New'">/radio </span></strong><strong><span style="font-family: 宋体">单选框</span></strong><strong><span style="font-family: 'Courier New'">/select</span></strong><strong><span style="font-family: 宋体">下拉列表框</span></strong></p>
<p><span style="font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">集合为</span><span style="font-family: 'Courier New'">list:</span></p>
<p><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">s:checkboxlist</span><span style="font-size: 10pt; font-family: 'Courier New'"> <span style="color: #7f007f">name</span><span style="color: black">=</span><em><span style="color: #2a00ff">"list"</span></em></span></p>
<p style="margin-left: 47.25pt"><span style="font-size: 10pt; color: #7f007f; font-family: 'Courier New'">list</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">=</span><em><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'">"{'Java','.Net','RoR','PHP'}"</span></em><span style="font-size: 10pt; font-family: 'Courier New'"> <span style="color: #7f007f">value</span><span style="color: black">=</span><em><span style="color: #2a00ff">"{'Java','.Net'}"</span></em><span style="color: teal">/&gt;&lt;</span><span style="color: #3f7f7f">br</span><span style="color: teal">/&gt;</span></span></p>
<p><span style="font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">集合为</span><span style="font-family: 'Courier New'">map:</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">s:checkboxlist</span><span style="font-size: 10pt; font-family: 'Courier New'"> <span style="color: #7f007f">name</span><span style="color: black">=</span><em><span style="color: #2a00ff">"map"</span></em> <span style="color: #7f007f">list</span><span style="color: black">=</span>"<span style="color: black">#{1:'</span></span><span style="font-size: 10pt; color: black; font-family: 宋体">瑜珈用品</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">',2:'</span><span style="font-size: 10pt; color: black; font-family: 宋体">户外用品</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">',3:'</span><span style="font-size: 10pt; color: black; font-family: 宋体">球类</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">',4:'</span><span style="font-size: 10pt; color: black; font-family: 宋体">自行车</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">'}</span><span style="font-size: 10pt; font-family: 'Courier New'">"</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; &nbsp;<span style="color: #7f007f">listKey</span><span style="color: black">=</span><em><span style="color: #2a00ff">"key"</span></em> <span style="color: #7f007f">listValue</span><span style="color: black">=</span><em><span style="color: #2a00ff">"value"</span></em> <span style="color: #7f007f">value</span><span style="color: black">=</span><em><span style="color: #2a00ff">"{1,2,3}"</span></em><span style="color: teal">/&gt;&lt;</span><span style="color: #3f7f7f">br</span><span style="color: teal">/&gt;</span></span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; &nbsp;</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">s:radio</span><span style="font-size: 10pt; font-family: 'Courier New'"> <span style="color: #7f007f">name</span><span style="color: black">=</span><em><span style="color: #2a00ff">"raido1"</span></em> <span style="color: #7f007f">list</span><span style="color: black">=</span>"<span style="color: black">#{1:'</span></span><span style="font-size: 10pt; color: black; font-family: 宋体">瑜珈用品</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">',2:'</span><span style="font-size: 10pt; color: black; font-family: 宋体">户外用品</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">',3:'</span><span style="font-size: 10pt; color: black; font-family: 宋体">球类</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">',4:'</span><span style="font-size: 10pt; color: black; font-family: 宋体">自行车</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">'}</span><span style="font-size: 10pt; font-family: 'Courier New'">" <span style="color: #7f007f">listKey</span><span style="color: black">=</span><em><span style="color: #2a00ff">"key"</span></em> <span style="color: #7f007f">listValue</span><span style="color: black">=</span><em><span style="color: #2a00ff">"value"</span></em> <span style="color: #7f007f">value</span><span style="color: black">=</span><em><span style="color: #2a00ff">"1"</span></em><span style="color: teal">/&gt;</span></span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; &nbsp;</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">br</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">/&gt;</span></p>
<p><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; &nbsp;</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">s:select</span><span style="font-size: 10pt; font-family: 'Courier New'"> <span style="color: #7f007f">name</span><span style="color: black">=</span><em><span style="color: #2a00ff">"se"</span></em> <span style="color: #7f007f">list</span><span style="color: black">=</span>"<span style="color: black">#{1:'</span></span><span style="font-size: 10pt; color: black; font-family: 宋体">瑜珈用品</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">',2:'</span><span style="font-size: 10pt; color: black; font-family: 宋体">户外用品</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">',3:'</span><span style="font-size: 10pt; color: black; font-family: 宋体">球类</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">',4:'</span><span style="font-size: 10pt; color: black; font-family: 宋体">自行车</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">'}</span><span style="font-size: 10pt; font-family: 'Courier New'">" <span style="color: #7f007f">listKey</span><span style="color: black">=</span><em><span style="color: #2a00ff">"key"</span></em> <span style="color: #7f007f">listValue</span><span style="color: black">=</span><em><span style="color: #2a00ff">"value"</span></em> <span style="color: #7f007f">value</span><span style="color: black">=</span><em><span style="color: #2a00ff">"1"</span></em><span style="color: teal">/&gt;</span></span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">&lt;!-- </span><span style="font-size: 10pt; color: #3f5fbf; font-family: 宋体">默认的视图主题</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">,</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 宋体">即不需要</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'">struts2</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 宋体">在页面为我们输出一些代码</span><span style="font-size: 10pt; color: #3f5fbf; font-family: 'Courier New'"> --&gt;</span></p>
<p><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">constant</span><span style="font-size: 10pt; font-family: 'Courier New'"> <span style="color: #7f007f">name</span><span style="color: black">=</span><em><span style="color: #2a00ff">"struts.ui.theme"</span></em> <span style="color: #7f007f">value</span><span style="color: black">=</span><em><span style="color: #2a00ff">"simple"</span></em> <span style="color: teal">/&gt;<br />
<br />
<br />
&nbsp; </p>
<p><span style="font-family: 宋体">二十五、国际化</span></p>
<p><span style="font-family: 宋体">目前对笔者不适用，由于时间紧迫，不再记录</span></p>
</span></span></span>
 <img src ="http://www.blogjava.net/jzone/aggbug/321315.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzone/" target="_blank">Gavin.lee</a> 2010-05-19 01:24 <a href="http://www.blogjava.net/jzone/articles/321315.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2 要点笔记（五）</title><link>http://www.blogjava.net/jzone/articles/321123.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Sun, 16 May 2010 16:22:00 GMT</pubDate><guid>http://www.blogjava.net/jzone/articles/321123.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 二十一、Struts2对action中所有方法进行输入校验在Struts2中，我们可以实现对action的所有方法进行校验或者对action指定方法进行校验对于输入校验struts2提供了两种实现方法：1．采用手工编写代码实现重写validate方法，validate方法会校验action中所有与execute方法签名相同的方法。当某个数据校验失败时，我们应该调用addFieldE...&nbsp;&nbsp;<a href='http://www.blogjava.net/jzone/articles/321123.html'>阅读全文</a><img src ="http://www.blogjava.net/jzone/aggbug/321123.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzone/" target="_blank">Gavin.lee</a> 2010-05-17 00:22 <a href="http://www.blogjava.net/jzone/articles/321123.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2 要点笔记（四）</title><link>http://www.blogjava.net/jzone/articles/321122.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Sun, 16 May 2010 16:14:00 GMT</pubDate><guid>http://www.blogjava.net/jzone/articles/321122.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 十九、文件上传三部曲第一步、jar文件的准备commons-fileupload-1.2.1.jar、commons-io-1.3.2.jar第二步、把form表的enctype设置为：multipart/form-data&lt;%@&nbsp;page&nbsp;language="java"&nbsp;import="java.util.*"&nbsp;pageEncodin...&nbsp;&nbsp;<a href='http://www.blogjava.net/jzone/articles/321122.html'>阅读全文</a><img src ="http://www.blogjava.net/jzone/aggbug/321122.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzone/" target="_blank">Gavin.lee</a> 2010-05-17 00:14 <a href="http://www.blogjava.net/jzone/articles/321122.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2 要点笔记（三）</title><link>http://www.blogjava.net/jzone/articles/321073.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Sat, 15 May 2010 19:09:00 GMT</pubDate><guid>http://www.blogjava.net/jzone/articles/321073.html</guid><description><![CDATA[<span style="font-size: 10pt; font-family: 宋体">十三、</span><span style="font-size: 10pt; font-family: 'Courier New'">Struts2</span><span style="font-size: 10pt; font-family: 宋体">的处理流程</span>
<p><span style="font-size: 10pt; font-family: 'Courier New'">request—&gt;StrutsPrepareAndExecuteFilter</span><span style="font-size: 10pt; font-family: Wingdings">&#224;</span><span style="font-size: 10pt; font-family: 'Courier New'">Interceptor(Struts2</span><span style="font-size: 10pt; font-family: 宋体">内置的一些拦截器或用户自定义拦截器</span><span style="font-size: 10pt; font-family: 'Courier New'">)</span><span style="font-size: 10pt; font-family: Wingdings">&#224;</span><span style="font-size: 10pt; font-family: 'Courier New'">Action(</span><span style="font-size: 10pt; font-family: 宋体">用户编写的</span><span style="font-size: 10pt; font-family: 'Courier New'">Action</span><span style="font-size: 10pt; font-family: 宋体">，类似</span><span style="font-size: 10pt; font-family: 'Courier New'">Struts1</span><span style="font-size: 10pt; font-family: 宋体">中的</span><span style="font-size: 10pt; font-family: 'Courier New'">Action)</span><span style="font-size: 10pt; font-family: Wingdings">&#224;</span><span style="font-size: 10pt; font-family: 'Courier New'">Result(</span><span style="font-size: 10pt; font-family: 宋体">类似</span><span style="font-size: 10pt; font-family: 'Courier New'">Struts1</span><span style="font-size: 10pt; font-family: 宋体">中的</span><span style="font-size: 10pt; font-family: 'Courier New'">forward)</span><span style="font-size: 10pt; font-family: Wingdings">&#224;</span><span style="font-size: 10pt; font-family: 'Courier New'">Jsp/Html</span><span style="font-size: 10pt; font-family: Wingdings">&#224;</span><span style="font-size: 10pt; font-family: 'Courier New'">response</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">StrutsPrepareAndExccuterFilter</span><span style="font-size: 10pt; font-family: 宋体">是</span><span style="font-size: 10pt; font-family: 'Courier New'">Struts2</span><span style="font-size: 10pt; font-family: 宋体">框架的核心控制器，它负责拦截由</span><span style="font-size: 10pt; font-family: 'Courier New'">&lt;url-pattern&gt;/*&lt;/url-pattern&gt;</span><span style="font-size: 10pt; font-family: 宋体">指定的所有用户请求，当用户请求到达时，该</span><span style="font-size: 10pt; font-family: 'Courier New'">Filter</span><span style="font-size: 10pt; font-family: 宋体">会过滤用户的请求。默认情况下，如果用户请求的路径不带后缀或者后缀以</span><span style="font-size: 10pt; font-family: 'Courier New'">.action</span><span style="font-size: 10pt; font-family: 宋体">结尾，这时请求将被转入</span><span style="font-size: 10pt; font-family: 'Courier New'">Struts2</span><span style="font-size: 10pt; font-family: 宋体">框架处理，否则</span><span style="font-size: 10pt; font-family: 'Courier New'">Struts2</span><span style="font-size: 10pt; font-family: 宋体">框架将过滤该请求的处理。当请求转入</span><span style="font-size: 10pt; font-family: 'Courier New'">Struts2</span><span style="font-size: 10pt; font-family: 宋体">框架处理时会经过一系列的拦截器，然后再转到</span><span style="font-size: 10pt; font-family: 'Courier New'">Action</span><span style="font-size: 10pt; font-family: 宋体">。<strong>与</strong></span><strong><span style="font-size: 10pt; font-family: 'Courier New'">Struts1</span></strong><strong><span style="font-size: 10pt; font-family: 宋体">不同，</span></strong><strong><span style="font-size: 10pt; font-family: 'Courier New'">Struts2</span></strong><strong><span style="font-size: 10pt; font-family: 宋体">对用户每一次请求都会创建一个</span></strong><strong><span style="font-size: 10pt; font-family: 'Courier New'">Action</span></strong><strong><span style="font-size: 10pt; font-family: 宋体">，所以</span></strong><strong><span style="font-size: 10pt; font-family: 'Courier New'">Struts2</span></strong><strong><span style="font-size: 10pt; font-family: 宋体">的</span></strong><strong><span style="font-size: 10pt; font-family: 'Courier New'">Action</span></strong><strong><span style="font-size: 10pt; font-family: 宋体">是线程安全的<br />
</span></strong></p>
<p><span style="font-size: 10pt; font-family: 宋体"><br />
<br />
十四、</span><span style="font-size: 10pt; font-family: 'Courier New'">Struts2</span><span style="font-size: 10pt; font-family: 宋体">指定多个配置文件</span></p>
<p><span style="font-size: 10pt; font-family: 宋体">将配置文件以模块进行划分，然后通过</span><span style="font-size: 10pt; font-family: 'Courier New'">include</span><span style="font-size: 10pt; font-family: 宋体">导入</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;?</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">xml</span><span style="font-size: 10pt; font-family: 'Courier New'"> <span style="color: #7f007f">version</span><span style="color: black">=</span><em><span style="color: #2a00ff">"1.0"</span></em> <span style="color: #7f007f">encoding</span><span style="color: black">=</span><em><span style="color: #2a00ff">"UTF-8"</span></em> <span style="color: teal">?&gt;</span></span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;!</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">DOCTYPE</span><span style="font-size: 10pt; font-family: 'Courier New'"> <span style="color: teal">struts</span> <span style="color: gray">PUBLIC</span></span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; <span style="color: teal">"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"</span></span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; <span style="color: #3f7f5f">"http://struts.apache.org/dtds/struts-2.0.dtd"</span><span style="color: teal">&gt;</span></span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">struts</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">include</span><span style="font-size: 10pt; font-family: 'Courier New'"> <span style="color: #7f007f">file</span><span style="color: black">=</span><em><span style="color: #2a00ff">"struts-user.xml"</span></em><span style="color: teal">&gt;&lt;/</span><span style="color: #3f7f7f">include</span><span style="color: teal">&gt;</span></span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">include</span><span style="font-size: 10pt; font-family: 'Courier New'"> <span style="color: #7f007f">file</span><span style="color: black">=</span><em><span style="color: #2a00ff">"struts-trade.xml"</span></em><span style="color: teal">&gt;&lt;/</span><span style="color: #3f7f7f">include</span><span style="color: teal">&gt;</span></span></p>
<p><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&lt;/</span><span style="font-size: 10pt; color: #3f7f7f; font-family: 'Courier New'">struts</span><span style="font-size: 10pt; color: teal; font-family: 'Courier New'">&gt;<br />
</span></p>
<p><span style="font-size: 10pt; font-family: 宋体"><br />
<br />
十五、</span><span style="font-size: 10pt; font-family: 'Courier New'">Struts2</span><span style="font-size: 10pt; font-family: 宋体">动态方法调用</span><span style="font-size: 10pt; font-family: 'Courier New'">(</span><span style="font-size: 10pt; font-family: 宋体">在</span><span style="font-size: 10pt; font-family: 'Courier New'">Struts2.1</span><span style="font-size: 10pt; font-family: 宋体">版本文档中已经不推荐使用了</span><span style="font-size: 10pt; font-family: 'Courier New'">)</span></p>
<p><span style="font-size: 10pt; font-family: 宋体">如果在</span><span style="font-size: 10pt; font-family: 'Courier New'">action</span><span style="font-size: 10pt; font-family: 宋体">中存在多个方法时，我们可以使用</span><span style="font-size: 10pt; font-family: 'Courier New'">!+</span><span style="font-size: 10pt; font-family: 宋体">方法方法名调用指定的方法，如下：</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">public class HelloWorldAction{</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; private String message;</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; public String getMessage(){</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return message;</span></p>
<p style="text-indent: 21pt"><span style="font-size: 10pt; font-family: 'Courier New'">}</span></p>
<p style="text-indent: 21pt"><span style="font-size: 10pt; font-family: 'Courier New'">public String execute() throws Exception{</span></p>
<p style="text-indent: 21pt"><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; this.message = &#8220;</span><span style="font-size: 10pt; font-family: 宋体">我是</span><span style="font-size: 10pt; font-family: 'Courier New'">execute</span><span style="font-size: 10pt; font-family: 宋体">方法</span><span style="font-size: 10pt; font-family: 'Courier New'">&#8221;</span></p>
<p style="text-indent: 21pt"><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; return &#8220;success&#8221;;</span></p>
<p style="text-indent: 21pt"><span style="font-size: 10pt; font-family: 'Courier New'">}</span></p>
<p style="text-indent: 21pt"><span style="font-size: 10pt; font-family: 'Courier New'">public String other() throw Exception{</span></p>
<p style="text-indent: 21pt"><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; this.message = &#8220;</span><span style="font-size: 10pt; font-family: 宋体">我是</span><span style="font-size: 10pt; font-family: 'Courier New'">other</span><span style="font-size: 10pt; font-family: 宋体">方法</span><span style="font-size: 10pt; font-family: 'Courier New'">&#8221;;</span></p>
<p style="text-indent: 21pt"><span style="font-size: 10pt; font-family: 'Courier New'">}</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">}</span></p>
<p><span style="font-size: 10pt; font-family: 宋体">假设访问上面的</span><span style="font-size: 10pt; font-family: 'Courier New'">action</span><span style="font-size: 10pt; font-family: 宋体">的</span><span style="font-size: 10pt; font-family: 'Courier New'">URL</span><span style="font-size: 10pt; font-family: 宋体">路径为：</span><span style="font-size: 10pt; font-family: 'Courier New'">/struts2/test/helloworld.action</span></p>
<p><span style="font-size: 10pt; font-family: 宋体">要访问</span><span style="font-size: 10pt; font-family: 'Courier New'">action</span><span style="font-size: 10pt; font-family: 宋体">的</span><span style="font-size: 10pt; font-family: 'Courier New'">other</span><span style="font-size: 10pt; font-family: 宋体">方法，我们可以这样调用：</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">/struts2/test/helloworld!other.action</span></p>
<p><span style="font-size: 10pt; font-family: 宋体">如果不想使用动态方法调用，我们可以通过常量</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">struts.enable.DynamicMethodInvocation</span><span style="font-size: 10pt; font-family: 宋体">关闭动态方法调用</span><span style="font-size: 10pt; font-family: 'Courier New'">.</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">&lt;constant name=&#8221;struts.enable.DynamicMethodInvocation&#8221; value=&#8221;false&#8221;/&gt;</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">Struts2</span><span style="font-size: 10pt; font-family: 宋体">使用通配符定义</span><span style="font-size: 10pt; font-family: 'Courier New'">action(</span><span style="font-size: 10pt; font-family: 宋体">官方推荐</span><span style="font-size: 10pt; font-family: 'Courier New'">) </span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">&lt;package name=&#8221;employee&#8221; </span></p>
<p style="margin-left: 21pt; text-indent: 21pt"><span style="font-size: 10pt; font-family: 'Courier New'">namespace=&#8221;/control/employee&#8221; extends=&#8221;struts-default&#8221;&gt;</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; &lt;action name=&#8221;list_*&#8221; </span></p>
<p style="margin-left: 21pt; text-indent: 21pt"><span style="font-size: 10pt; font-family: 'Courier New'">class=&#8221;cn.itcast.action.HellWorldAction method=&#8221;{1}&#8221;&gt;</span></p>
<p style="margin-left: 21pt; text-indent: 21pt"><span style="font-size: 10pt; font-family: 'Courier New'">&lt;result name=&#8221;success&#8221;&gt;</span></p>
<p style="margin-left: 21pt; text-indent: 21pt"><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; /WEB-INF/page/message.jsp</span></p>
<p style="margin-left: 21pt; text-indent: 21pt"><span style="font-size: 10pt; font-family: 'Courier New'">&lt;/result&gt;</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; &lt;/action&gt;</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">&lt;/package&gt;</span></p>
<p><strong><span style="font-size: 10pt; font-family: 宋体">注：</span></strong></p>
<p><strong><span style="font-size: 10pt; font-family: 'Courier New'">a). *</span></strong><strong><span style="font-size: 10pt; font-family: 宋体">通配符可以添加多个</span></strong><strong><span style="font-size: 10pt; font-family: 宋体">如</span></strong><strong><span style="font-size: 10pt; font-family: 'Courier New'">: list_*_*_*</span></strong></p>
<p><strong><span style="font-size: 10pt; font-family: 'Courier New'">b). method=&#8221;{1}&#8221; </span></strong><strong><span style="font-size: 10pt; font-family: 宋体">表示取第一个</span></strong><strong><span style="font-size: 10pt; font-family: 'Courier New'">*</span></strong></p>
<p><strong><span style="font-size: 10pt; font-family: 'Courier New'">c). </span></strong><strong><span style="font-size: 10pt; font-family: 宋体">通配符可以放置多个地方</span></strong><strong><span style="font-size: 10pt; font-family: 宋体">如</span></strong><strong><span style="font-size: 10pt; font-family: 'Courier New'"> class</span></strong><strong><span style="font-size: 10pt; font-family: 宋体">、</span></strong><strong><span style="font-size: 10pt; font-family: 'Courier New'">result</span></strong><strong><span style="font-size: 10pt; font-family: 宋体">中</span></strong></p>
<p><strong>&nbsp;<br />
</strong></p>
<p><span style="font-size: 10pt; font-family: 宋体">十六、</span><span style="font-size: 10pt; font-family: 'Courier New'">Struts2 </span><span style="font-size: 10pt; font-family: 宋体">请求参数的接受</span></p>
<p><span style="font-size: 10pt; font-family: 宋体">以下两种方法，当参数比较多的时候，用第一种方法，将会发现</span><span style="font-size: 10pt; font-family: 'Courier New'">action</span><span style="font-size: 10pt; font-family: 宋体">中有很多</span><span style="font-size: 10pt; font-family: 'Courier New'">setter</span><span style="font-size: 10pt; font-family: 宋体">、</span><span style="font-size: 10pt; font-family: 'Courier New'">getter</span><span style="font-size: 10pt; font-family: 宋体">方法，这样不利于阅读</span><span style="font-size: 10pt; font-family: 'Courier New'">action</span><span style="font-size: 10pt; font-family: 宋体">，所以建议使用第二种。</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">a). </span><span style="font-size: 10pt; font-family: 宋体">采用基本类型接收请求参数</span><span style="font-size: 10pt; font-family: 'Courier New'">(get/post)</span></p>
<p><span style="font-size: 10pt; font-family: 宋体">在</span><span style="font-size: 10pt; font-family: 'Courier New'">Action</span><span style="font-size: 10pt; font-family: 宋体">类中定义与请求参数同名的属性，</span><span style="font-size: 10pt; font-family: 'Courier New'">Struts2</span><span style="font-size: 10pt; font-family: 宋体">便能接受请求参数并赋值给同名属性：</span></p>
<p><span style="font-size: 10pt; font-family: 宋体">如：请求路径，</span><span style="font-size: 10pt; font-family: 'Courier New'"><a href="http://localhost:8080/test/view.action?id=78">http://localhost:8080/test/view.action?id=78</a></span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">public class ProductAction{</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; private Integer id;</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; //struts2</span><span style="font-size: 10pt; font-family: 宋体">通过反射技术调用与请求参数同名的属性的</span><span style="font-size: 10pt; font-family: 'Courier New'">setter</span><span style="font-size: 10pt; font-family: 宋体">方法来获取请求参数值</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; public void setId(Integer id) {</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.id = id;</span></p>
<p style="text-indent: 21pt"><span style="font-size: 10pt; font-family: 'Courier New'">}</span></p>
<p style="text-indent: 21pt"><span style="font-size: 10pt; font-family: 'Courier New'">public Integer getId{</span></p>
<p style="text-indent: 21pt"><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; return id;</span></p>
<p style="text-indent: 21pt"><span style="font-size: 10pt; font-family: 'Courier New'">}</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">}</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">b). </span><span style="font-size: 10pt; font-family: 宋体">采用符合类型接收请求参数</span></p>
<p><span style="font-size: 10pt; font-family: 宋体">如：请求路径，</span><span style="font-size: 10pt; font-family: 'Courier New'"><a href="http://localhost:8080/test/view.action?product.id=78">http://localhost:8080/test/view.action?product.id=78</a></span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">public class ProductAction{</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; private Product product;</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; public void setProduct(Product product) {</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.product = product;</span></p>
<p style="text-indent: 21pt"><span style="font-size: 10pt; font-family: 'Courier New'">}</span></p>
<p style="text-indent: 21pt"><span style="font-size: 10pt; font-family: 'Courier New'">public Product getProduct() {</span></p>
<p style="text-indent: 21pt"><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; return product;</span></p>
<p style="text-indent: 21pt"><span style="font-size: 10pt; font-family: 'Courier New'">}</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">}</span></p>
<p style="text-indent: 21pt"><span style="font-size: 10pt; font-family: 'Courier New'">Struts2</span><span style="font-size: 10pt; font-family: 宋体">首先通过反射技术调用</span><span style="font-size: 10pt; font-family: 'Courier New'">Product</span><span style="font-size: 10pt; font-family: 宋体">的默认构造器创建</span><span style="font-size: 10pt; font-family: 'Courier New'">product</span><span style="font-size: 10pt; font-family: 宋体">对象然后在通过反射技术调用</span><span style="font-size: 10pt; font-family: 'Courier New'">product</span><span style="font-size: 10pt; font-family: 宋体">中与请求参数同名的属性的</span><span style="font-size: 10pt; font-family: 'Courier New'">setter</span><span style="font-size: 10pt; font-family: 宋体">方法来获取请求参数<br />
</span></p>
<p><span style="font-size: 10pt; font-family: 宋体"><br />
<br />
十七、</span><span style="font-size: 10pt; font-family: 'Courier New'">Struts2</span><span style="font-size: 10pt; font-family: 宋体">有两种类型转换器</span></p>
<p><span style="font-size: 10pt; font-family: 宋体">局部类型转换器</span><span style="font-size: 10pt; font-family: 'Courier New'">/</span><span style="font-size: 10pt; font-family: 宋体">全部类型转换器</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">a). </span><span style="font-size: 10pt; font-family: 宋体">自定义转换类型</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">package</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> <u>cn.itcast.type.converter</u>;</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">import</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> java.text.ParseException;</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">import</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> java.text.SimpleDateFormat;</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">import</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> java.util.Date;</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">import</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> java.util.Map;</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">import</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> com.opensymphony.xwork2.conversion.impl.DefaultTypeConverter;</span></p>
<p style="text-align: left" align="left"><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">public</span></strong><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">class</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> <u>DateTypeConverter</u> </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">extends</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> DefaultTypeConverter {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; <u>@</u></span><u><span style="font-size: 10pt; color: #646464; font-family: 'Courier New'">Override</span></u></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">public</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> Object convertValue(Map&lt;<u>String, Object</u>&gt; context, Object value, Class toType) {</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SimpleDateFormat dateFormat = </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">new</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> SimpleDateFormat(</span><span style="font-size: 10pt; color: #2a00ff; font-family: 'Courier New'">"yyyyMMdd"</span><span style="font-size: 10pt; color: black; font-family: 'Courier New'">);</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">try</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> { </span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">if</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'">(toType == Date.</span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">class</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'">){</span><span style="font-size: 10pt; color: #3f7f5f; font-family: 'Courier New'">//</span><span style="font-size: 10pt; color: #3f7f5f; font-family: 宋体">当字符串向</span><span style="font-size: 10pt; color: #3f7f5f; font-family: 'Courier New'">Date</span><span style="font-size: 10pt; color: #3f7f5f; font-family: 宋体">类型转换时</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String[] params = (String[]) value;</span><span style="font-size: 10pt; color: #3f7f5f; font-family: 'Courier New'">// request.getParameterValues() </span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">return</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> dateFormat.parse(params[0]);</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">else</span></strong><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">if</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'">(toType == String.</span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">class</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'">){</span><span style="font-size: 10pt; color: #3f7f5f; font-family: 'Courier New'">//</span><span style="font-size: 10pt; color: #3f7f5f; font-family: 宋体">当</span><span style="font-size: 10pt; color: #3f7f5f; font-family: 'Courier New'">Date</span><span style="font-size: 10pt; color: #3f7f5f; font-family: 宋体">转换成字符串时</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Date date = (Date) value;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">return</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> dateFormat.format(date);</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">catch</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'"> (ParseException e) {}</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">return</span></strong><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'Courier New'">null</span></strong><span style="font-size: 10pt; color: black; font-family: 'Courier New'">;</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; }</span></p>
<p style="text-align: left" align="left"><span style="font-size: 10pt; color: black; font-family: 'Courier New'">}</span></p>
<p><span style="font-size: 10pt; font-family: 宋体">完成具体的双向转化代码后，需要将上面的类型注册为局部类型转换器：</span></p>
<p><span style="font-size: 10pt; font-family: 宋体">在</span><span style="font-size: 10pt; font-family: 'Courier New'">Action</span><span style="font-size: 10pt; font-family: 宋体">类所有的包下放置</span><span style="font-size: 10pt; font-family: 'Courier New'">ActionClassName-conversion.properties</span><span style="font-size: 10pt; font-family: 宋体">文件，</span><span style="font-size: 10pt; font-family: 'Courier New'">ActionClassName</span><span style="font-size: 10pt; font-family: 宋体">是</span><span style="font-size: 10pt; font-family: 'Courier New'">Action</span><span style="font-size: 10pt; font-family: 宋体">的类名，后面的</span><span style="font-size: 10pt; font-family: 'Courier New'">-conversion.properties</span><span style="font-size: 10pt; font-family: 宋体">是固定写法，对于本例而言，文件的名称应为</span><span style="font-size: 10pt; font-family: 'Courier New'">HelloWroldAction-conversion.properties</span><span style="font-size: 10pt; font-family: 宋体">。</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">properties</span><span style="font-size: 10pt; font-family: 宋体">文件中的内容为：</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">birthday=cn.itcast.type.converter.DateTypeConverter</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">b).</span><span style="font-size: 10pt; font-family: 宋体">自定义全局类型转换器</span></p>
<p><span style="font-size: 10pt; font-family: 宋体">将上面的局部类型转换器注册为全局类型转换器：</span></p>
<p><span style="font-size: 10pt; font-family: 宋体">在</span><span style="font-size: 10pt; font-family: 'Courier New'">WEB-INF/classes</span><span style="font-size: 10pt; font-family: 宋体">下放置</span><span style="font-size: 10pt; font-family: 'Courier New'">xwork-conversion.properties</span><span style="font-size: 10pt; font-family: 宋体">文件。在</span><span style="font-size: 10pt; font-family: 'Courier New'">properties</span><span style="font-size: 10pt; font-family: 宋体">文件中的内容为：</span></p>
<p><span style="font-size: 10pt; font-family: 宋体">待转换的类型</span><span style="font-size: 10pt; font-family: 'Courier New'">=</span><span style="font-size: 10pt; font-family: 宋体">类型转换器的全类名</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">java.util.Date=cn.itcast.conversion.DateConverter<br />
</span></p>
<p><span style="font-size: 10pt; font-family: 宋体"><br />
<br />
<br />
十八、访问或添加</span><span style="font-size: 10pt; font-family: 'Courier New'">request/session/application</span><span style="font-size: 10pt; font-family: 宋体">属性</p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">import java.util.Arrays;</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">import javax.servlet.ServletContext;</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">import javax.servlet.http.HttpServletRequest;</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">import org.apache.struts2.ServletActionContext;</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">import com.opensymphony.xwork2.ActionContext;</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">public class HelloWorldAction {</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; public String execute(){</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ActionContext ctx = ActionContext.getContext();</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ctx.getApplication().put("app", "</span><span style="font-size: 10pt; font-family: 宋体">应用范围</span><span style="font-size: 10pt; font-family: 'Courier New'">");//</span><span style="font-size: 10pt; font-family: 宋体">往</span><span style="font-size: 10pt; font-family: 'Courier New'">ServletContext</span><span style="font-size: 10pt; font-family: 宋体">里放入</span><span style="font-size: 10pt; font-family: 'Courier New'">app</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ctx.getSession().put("ses", "session</span><span style="font-size: 10pt; font-family: 宋体">范围</span><span style="font-size: 10pt; font-family: 'Courier New'">");//</span><span style="font-size: 10pt; font-family: 宋体">往</span><span style="font-size: 10pt; font-family: 'Courier New'">session</span><span style="font-size: 10pt; font-family: 宋体">里放入</span><span style="font-size: 10pt; font-family: 'Courier New'">ses</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ctx.put("req", "request</span><span style="font-size: 10pt; font-family: 宋体">范围</span><span style="font-size: 10pt; font-family: 'Courier New'">");//</span><span style="font-size: 10pt; font-family: 宋体">往</span><span style="font-size: 10pt; font-family: 'Courier New'">request</span><span style="font-size: 10pt; font-family: 宋体">里放入</span><span style="font-size: 10pt; font-family: 'Courier New'">req</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ctx.put("names", Arrays.asList("</span><span style="font-size: 10pt; font-family: 宋体">老张</span><span style="font-size: 10pt; font-family: 'Courier New'">", "</span><span style="font-size: 10pt; font-family: 宋体">老黎</span><span style="font-size: 10pt; font-family: 'Courier New'">", "</span><span style="font-size: 10pt; font-family: 宋体">老方</span><span style="font-size: 10pt; font-family: 'Courier New'">"));</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "message";</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; public String rsa() throws Exception{</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpServletRequest request = ServletActionContext.getRequest();</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ServletContext servletContext = ServletActionContext.getServletContext();</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; request.setAttribute("req", "</span><span style="font-size: 10pt; font-family: 宋体">请求范围属性</span><span style="font-size: 10pt; font-family: 'Courier New'">");</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; request.getSession().setAttribute("ses", "</span><span style="font-size: 10pt; font-family: 宋体">会话范围属性</span><span style="font-size: 10pt; font-family: 'Courier New'">");</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; servletContext.setAttribute("app", "</span><span style="font-size: 10pt; font-family: 宋体">应用范围属性</span><span style="font-size: 10pt; font-family: 'Courier New'">");</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //HttpServletResponse response = ServletActionContext.getResponse();</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "message";</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">&nbsp;&nbsp;&nbsp; }</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">}</span><br />
</p>
<p></span><span style="font-size: 10pt; font-family: 宋体">备注：</span><span style="font-size: 10pt; font-family: 'Courier New'">ognl</span><span style="font-size: 10pt; font-family: 宋体">表达式其实完全可以通过</span><span style="font-size: 10pt; font-family: 'Courier New'">JSTL</span><span style="font-size: 10pt; font-family: 宋体">、</span><span style="font-size: 10pt; font-family: 'Courier New'">EL</span><span style="font-size: 10pt; font-family: 宋体">结合来代替</span><span style="font-size: 10pt; font-family: 'Courier New'">ognl</span></p>
 <img src ="http://www.blogjava.net/jzone/aggbug/321073.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzone/" target="_blank">Gavin.lee</a> 2010-05-16 03:09 <a href="http://www.blogjava.net/jzone/articles/321073.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2 要点笔记（二）</title><link>http://www.blogjava.net/jzone/articles/321072.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Sat, 15 May 2010 19:08:00 GMT</pubDate><guid>http://www.blogjava.net/jzone/articles/321072.html</guid><description><![CDATA[<span style="font-size: 10pt; font-family: 宋体">十二、</span><span style="font-size: 10pt; font-family: 'Courier New'">Struts2</span><span style="font-size: 10pt; font-family: 宋体">常量一览（常用的以粗体显示了）</span>
<p><span style="font-size: 10pt; font-family: 'Courier New'">struts.configuration </span></p>
<p><span style="font-size: 10pt; font-family: 宋体">该属性指定加载</span><span style="font-size: 10pt; font-family: 'Courier New'">Struts 2</span><span style="font-size: 10pt; font-family: 宋体">配置文件的配置文件管理器。该属性的默认值是</span><span style="font-size: 10pt; font-family: 'Courier New'">org.apache.Struts2.config.DefaultConfiguration</span><span style="font-size: 10pt; font-family: 宋体">，这是</span><span style="font-size: 10pt; font-family: 'Courier New'">Struts 2</span><span style="font-size: 10pt; font-family: 宋体">默认的配置文件管理器。如果需要实现自己的配置管理器，开发者则可以实现一个实现</span><span style="font-size: 10pt; font-family: 'Courier New'">Configuration</span><span style="font-size: 10pt; font-family: 宋体">接口的类，该类可以自己加载</span><span style="font-size: 10pt; font-family: 'Courier New'">Struts 2</span><span style="font-size: 10pt; font-family: 宋体">配置文件。</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">struts.locale</span></p>
<p><span style="font-size: 10pt; font-family: 宋体">指定</span><span style="font-size: 10pt; font-family: 'Courier New'">Web</span><span style="font-size: 10pt; font-family: 宋体">应用的默认</span><span style="font-size: 10pt; font-family: 'Courier New'">Locale</span><span style="font-size: 10pt; font-family: 宋体">。</span><strong>&nbsp;</strong></p>
<p><strong><span style="font-size: 10pt; font-family: 'Courier New'">struts.i18n.encoding</span></strong></p>
<p><strong><span style="font-size: 10pt; font-family: 宋体">指定</span></strong><strong><span style="font-size: 10pt; font-family: 'Courier New'">Web</span></strong><strong><span style="font-size: 10pt; font-family: 宋体">应用的默认编码集。该属性对于处理中文请求参数非常有用，对于获取中文请求参数值，应该将该属性值设置为</span></strong><strong><span style="font-size: 10pt; font-family: 'Courier New'">GBK</span></strong><strong><span style="font-size: 10pt; font-family: 宋体">或者</span></strong><strong><span style="font-size: 10pt; font-family: 'Courier New'">GB2312</span></strong><strong><span style="font-size: 10pt; font-family: 宋体">。</span></strong></p>
<p><strong><span style="font-size: 10pt; font-family: 宋体">提示：当设置该参数为</span></strong><strong><span style="font-size: 10pt; font-family: 'Courier New'">GBK</span></strong><strong><span style="font-size: 10pt; font-family: 宋体">时，相当于调用</span></strong><strong><span style="font-size: 10pt; font-family: 'Courier New'">HttpServletRequest</span></strong><strong><span style="font-size: 10pt; font-family: 宋体">的</span></strong><strong><span style="font-size: 10pt; font-family: 'Courier New'">setCharacterEncoding</span></strong><strong><span style="font-size: 10pt; font-family: 宋体">方法。</span></strong></p>
<p><strong><span style="font-size: 10pt; font-family: 'Courier New'">struts.objectFactory</span></strong></p>
<p><strong><span style="font-size: 10pt; font-family: 宋体">指定</span></strong><strong><span style="font-size: 10pt; font-family: 'Courier New'">Struts 2</span></strong><strong><span style="font-size: 10pt; font-family: 宋体">默认的</span></strong><strong><span style="font-size: 10pt; font-family: 'Courier New'">ObjectFactory Bean</span></strong><strong><span style="font-size: 10pt; font-family: 宋体">，该属性默认值是</span></strong><strong><span style="font-size: 10pt; font-family: 'Courier New'">spring</span></strong><strong><span style="font-size: 10pt; font-family: 宋体">。</span></strong></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">struts.objectFactory.spring.autoWrite</span></p>
<p><span style="font-size: 10pt; font-family: 宋体">指定</span><span style="font-size: 10pt; font-family: 'Courier New'">Spring</span><span style="font-size: 10pt; font-family: 宋体">框架的自动装配模式，该属性的默认值是</span><span style="font-size: 10pt; font-family: 'Courier New'">name</span><span style="font-size: 10pt; font-family: 宋体">，即默认根据</span><span style="font-size: 10pt; font-family: 'Courier New'">Bean</span><span style="font-size: 10pt; font-family: 宋体">的</span><span style="font-size: 10pt; font-family: 'Courier New'">name</span><span style="font-size: 10pt; font-family: 宋体">属性自动装配。</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">struts.objectFactory.spring.useClassCache</span></p>
<p><span style="font-size: 10pt; font-family: 宋体">该属性指定整合</span><span style="font-size: 10pt; font-family: 'Courier New'">Spring</span><span style="font-size: 10pt; font-family: 宋体">框架时，是否缓存</span><span style="font-size: 10pt; font-family: 'Courier New'">Bean</span><span style="font-size: 10pt; font-family: 宋体">实例，该属性只允许使用</span><span style="font-size: 10pt; font-family: 'Courier New'">true</span><span style="font-size: 10pt; font-family: 宋体">和</span><span style="font-size: 10pt; font-family: 'Courier New'">false</span><span style="font-size: 10pt; font-family: 宋体">两个属性值，它的默认值是</span><span style="font-size: 10pt; font-family: 'Courier New'">true</span><span style="font-size: 10pt; font-family: 宋体">。通常不建议修改该属性值。</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">struts.objectTypeDeterminer</span></p>
<p><span style="font-size: 10pt; font-family: 宋体">该属性指定</span><span style="font-size: 10pt; font-family: 'Courier New'">Struts 2</span><span style="font-size: 10pt; font-family: 宋体">的类型检测机制，通常支持</span><span style="font-size: 10pt; font-family: 'Courier New'">tiger</span><span style="font-size: 10pt; font-family: 宋体">和</span><span style="font-size: 10pt; font-family: 'Courier New'">notiger</span><span style="font-size: 10pt; font-family: 宋体">两个属性值。</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">struts.multipart.parser</span></p>
<p><span style="font-size: 10pt; font-family: 宋体">该属性指定处理</span><span style="font-size: 10pt; font-family: 'Courier New'">multipart/form-data</span><span style="font-size: 10pt; font-family: 宋体">的</span><span style="font-size: 10pt; font-family: 'Courier New'">MIME</span><span style="font-size: 10pt; font-family: 宋体">类型（文件上传）请求的框架，该属性支持</span><span style="font-size: 10pt; font-family: 'Courier New'">cos</span><span style="font-size: 10pt; font-family: 宋体">、</span><span style="font-size: 10pt; font-family: 'Courier New'">pell</span><span style="font-size: 10pt; font-family: 宋体">和</span><span style="font-size: 10pt; font-family: 'Courier New'">jakarta</span><span style="font-size: 10pt; font-family: 宋体">等属性值，即分别对应使用</span><span style="font-size: 10pt; font-family: 'Courier New'">cos</span><span style="font-size: 10pt; font-family: 宋体">的文件上传框架、</span><span style="font-size: 10pt; font-family: 'Courier New'">pell</span><span style="font-size: 10pt; font-family: 宋体">上传及</span><span style="font-size: 10pt; font-family: 'Courier New'">common-fileupload</span><span style="font-size: 10pt; font-family: 宋体">文件上传框架。该属性的默认值为</span><span style="font-size: 10pt; font-family: 'Courier New'">jakarta</span><span style="font-size: 10pt; font-family: 宋体">。</span></p>
<p><span style="font-size: 10pt; font-family: 宋体">注意</span><span style="font-size: 10pt; font-family: 宋体">如果需要使用</span><span style="font-size: 10pt; font-family: 'Courier New'">cos</span><span style="font-size: 10pt; font-family: 宋体">或者</span><span style="font-size: 10pt; font-family: 'Courier New'">pell</span><span style="font-size: 10pt; font-family: 宋体">的文件上传方式，则应该将对应的</span><span style="font-size: 10pt; font-family: 'Courier New'">JAR</span><span style="font-size: 10pt; font-family: 宋体">文件复制到</span><span style="font-size: 10pt; font-family: 'Courier New'">Web</span><span style="font-size: 10pt; font-family: 宋体">应用中。例如，使用</span><span style="font-size: 10pt; font-family: 'Courier New'">cos</span><span style="font-size: 10pt; font-family: 宋体">上传方式，则需要自己下载</span><span style="font-size: 10pt; font-family: 'Courier New'">cos</span><span style="font-size: 10pt; font-family: 宋体">框架的</span><span style="font-size: 10pt; font-family: 'Courier New'">JAR</span><span style="font-size: 10pt; font-family: 宋体">文件，并将该文件放在</span><span style="font-size: 10pt; font-family: 'Courier New'">WEB-INF/lib</span><span style="font-size: 10pt; font-family: 宋体">路径下。</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">struts.multipart.saveDir</span></p>
<p><span style="font-size: 10pt; font-family: 宋体">该属性指定上传文件的临时保存路径，该属性的默认值是</span><span style="font-size: 10pt; font-family: 'Courier New'">javax.servlet.context.tempdir</span><span style="font-size: 10pt; font-family: 宋体">。</span></p>
<p><strong><span style="font-size: 10pt; font-family: 'Courier New'">struts.multipart.maxSize</span></strong></p>
<p><strong><span style="font-size: 10pt; font-family: 宋体">该属性指定</span></strong><strong><span style="font-size: 10pt; font-family: 'Courier New'">Struts 2</span></strong><strong><span style="font-size: 10pt; font-family: 宋体">文件上传中整个请求内容允许的最大字节数。</span></strong></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">struts.custom.properties</span></p>
<p><span style="font-size: 10pt; font-family: 宋体">该属性指定</span><span style="font-size: 10pt; font-family: 'Courier New'">Struts 2</span><span style="font-size: 10pt; font-family: 宋体">应用加载用户自定义的属性文件，该自定义属性文件指定的属性不会覆盖</span><span style="font-size: 10pt; font-family: 'Courier New'">struts.properties</span><span style="font-size: 10pt; font-family: 宋体">文件中指定的属性。如果需要加载多个自定义属性文件，多个自定义属性文件的文件名以英文逗号（</span><span style="font-size: 10pt; font-family: 'Courier New'">,</span><span style="font-size: 10pt; font-family: 宋体">）隔开。</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">struts.mapper.class</span></p>
<p><span style="font-size: 10pt; font-family: 宋体">指定将</span><span style="font-size: 10pt; font-family: 'Courier New'">HTTP</span><span style="font-size: 10pt; font-family: 宋体">请求映射到指定</span><span style="font-size: 10pt; font-family: 'Courier New'">Action</span><span style="font-size: 10pt; font-family: 宋体">的映射器，</span><span style="font-size: 10pt; font-family: 'Courier New'">Struts 2</span><span style="font-size: 10pt; font-family: 宋体">提供了默认的映射器：</span><span style="font-size: 10pt; font-family: 'Courier New'">org.apache.struts2.dispatcher.mapper.DefaultActionMapper</span><span style="font-size: 10pt; font-family: 宋体">。默认映射器根据请求的前缀与</span><span style="font-size: 10pt; font-family: 'Courier New'">Action</span><span style="font-size: 10pt; font-family: 宋体">的</span><span style="font-size: 10pt; font-family: 'Courier New'">name</span><span style="font-size: 10pt; font-family: 宋体">属性完成映射。</span></p>
<p><strong><span style="font-size: 10pt; font-family: 'Courier New'">struts.action.extension</span></strong></p>
<p><strong><span style="font-size: 10pt; font-family: 宋体">该属性指定需要</span></strong><strong><span style="font-size: 10pt; font-family: 'Courier New'">Struts 2</span></strong><strong><span style="font-size: 10pt; font-family: 宋体">处理的请求后缀，该属性的默认值是</span></strong><strong><span style="font-size: 10pt; font-family: 'Courier New'">action</span></strong><strong><span style="font-size: 10pt; font-family: 宋体">，即所有匹配</span></strong><strong><span style="font-size: 10pt; font-family: 'Courier New'">*.action</span></strong><strong><span style="font-size: 10pt; font-family: 宋体">的请求都由</span></strong><strong><span style="font-size: 10pt; font-family: 'Courier New'">Struts 2</span></strong><strong><span style="font-size: 10pt; font-family: 宋体">处理。如果用户需要指定多个请求后缀，则多个后缀之间以英文逗号（</span></strong><strong><span style="font-size: 10pt; font-family: 'Courier New'">,</span></strong><strong><span style="font-size: 10pt; font-family: 宋体">）隔开。</span></strong></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">struts.serve.static</span></p>
<p><span style="font-size: 10pt; font-family: 宋体">该属性设置是否通过</span><span style="font-size: 10pt; font-family: 'Courier New'">JAR</span><span style="font-size: 10pt; font-family: 宋体">文件提供静态内容服务，该属性只支持</span><span style="font-size: 10pt; font-family: 'Courier New'">true</span><span style="font-size: 10pt; font-family: 宋体">和</span><span style="font-size: 10pt; font-family: 'Courier New'">false</span><span style="font-size: 10pt; font-family: 宋体">属性值，该属性的默认属性值是</span><span style="font-size: 10pt; font-family: 'Courier New'">true</span><span style="font-size: 10pt; font-family: 宋体">。</span></p>
<p><strong><span style="font-size: 10pt; font-family: 'Courier New'">struts.serve.static.browserCache</span></strong></p>
<p><strong><span style="font-size: 10pt; font-family: 宋体">该属性设置浏览器是否缓存静态内容。当应用处于开发阶段时，我们希望每次请求都获得服务器的最新响应，则可设置该属性为</span></strong><strong><span style="font-size: 10pt; font-family: 'Courier New'">false</span></strong><strong><span style="font-size: 10pt; font-family: 宋体">，生产环境下可以缓存。</span></strong><strong>&nbsp;</strong></p>
<p><strong><span style="font-size: 10pt; font-family: 'Courier New'">struts.enable.DynamicMethodInvocation</span></strong></p>
<p><strong><span style="font-size: 10pt; font-family: 宋体">该属性设置</span></strong><strong><span style="font-size: 10pt; font-family: 'Courier New'">Struts 2</span></strong><strong><span style="font-size: 10pt; font-family: 宋体">是否支持动态方法调用，该属性的默认值是</span></strong><strong><span style="font-size: 10pt; font-family: 'Courier New'">true</span></strong><strong><span style="font-size: 10pt; font-family: 宋体">。如果需要关闭动态方法调用，则可设置该属性为</span></strong><strong><span style="font-size: 10pt; font-family: 'Courier New'">false</span></strong><strong><span style="font-size: 10pt; font-family: 宋体">。</span></strong></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">struts.enable.SlashesInActionNames</span></p>
<p><span style="font-size: 10pt; font-family: 宋体">该属性设置</span><span style="font-size: 10pt; font-family: 'Courier New'">Struts 2</span><span style="font-size: 10pt; font-family: 宋体">是否允许在</span><span style="font-size: 10pt; font-family: 'Courier New'">Action</span><span style="font-size: 10pt; font-family: 宋体">名中使用斜线，该属性的默认值是</span><span style="font-size: 10pt; font-family: 'Courier New'">false</span><span style="font-size: 10pt; font-family: 宋体">。如果开发者希望允许在</span><span style="font-size: 10pt; font-family: 'Courier New'">Action</span><span style="font-size: 10pt; font-family: 宋体">名中使用斜线，则可设置该属性为</span><span style="font-size: 10pt; font-family: 'Courier New'">true</span><span style="font-size: 10pt; font-family: 宋体">。</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">struts.tag.altSyntax</span></p>
<p><span style="font-size: 10pt; font-family: 宋体">该属性指定是否允许在</span><span style="font-size: 10pt; font-family: 'Courier New'">Struts 2</span><span style="font-size: 10pt; font-family: 宋体">标签中使用表达式语法，因为通常都需要在标签中使用表达式语法，故此属性应该设置为</span><span style="font-size: 10pt; font-family: 'Courier New'">true</span><span style="font-size: 10pt; font-family: 宋体">，该属性的默认值是</span><span style="font-size: 10pt; font-family: 'Courier New'">true</span><span style="font-size: 10pt; font-family: 宋体">。</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">struts.devMode</span></p>
<p><span style="font-size: 10pt; font-family: 宋体">该属性设置</span><span style="font-size: 10pt; font-family: 'Courier New'">Struts 2</span><span style="font-size: 10pt; font-family: 宋体">应用是否使用开发模式。如果设置该属性为</span><span style="font-size: 10pt; font-family: 'Courier New'">true</span><span style="font-size: 10pt; font-family: 宋体">，则可以在应用出错时显示更多、更友好的出错提示。该属性只接受</span><span style="font-size: 10pt; font-family: 'Courier New'">true</span><span style="font-size: 10pt; font-family: 宋体">和</span><span style="font-size: 10pt; font-family: 'Courier New'">flase</span><span style="font-size: 10pt; font-family: 宋体">两个值，该属性的默认值是</span><span style="font-size: 10pt; font-family: 'Courier New'">false</span><span style="font-size: 10pt; font-family: 宋体">。通常，应用在开发阶段，将该属性设置为</span><span style="font-size: 10pt; font-family: 'Courier New'">true</span><span style="font-size: 10pt; font-family: 宋体">，当进入产品发布阶段后，则该属性设置为</span><span style="font-size: 10pt; font-family: 'Courier New'">false</span><span style="font-size: 10pt; font-family: 宋体">。</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">struts.i18n.reload</span></p>
<p><span style="font-size: 10pt; font-family: 宋体">该属性设置是否每次</span><span style="font-size: 10pt; font-family: 'Courier New'">HTTP</span><span style="font-size: 10pt; font-family: 宋体">请求到达时，系统都重新加载资源文件。该属性默认值是</span><span style="font-size: 10pt; font-family: 'Courier New'">false</span><span style="font-size: 10pt; font-family: 宋体">。在开发阶段将该属性设置为</span><span style="font-size: 10pt; font-family: 'Courier New'">true</span><span style="font-size: 10pt; font-family: 宋体">会更有利于开发，但在产品发布阶段应将该属性设置为</span><span style="font-size: 10pt; font-family: 'Courier New'">false</span><span style="font-size: 10pt; font-family: 宋体">。</span></p>
<p><span style="font-size: 10pt; font-family: 宋体">提示：开发阶段将该属性设置了</span><span style="font-size: 10pt; font-family: 'Courier New'">true</span><span style="font-size: 10pt; font-family: 宋体">，将可以在每次请求时都重新加载国际化资源文件，从而可以让开发者看到实时开发效果；产品发布阶段应该将该属性设置为</span><span style="font-size: 10pt; font-family: 'Courier New'"> false</span><span style="font-size: 10pt; font-family: 宋体">，是为了提供响应性能，每次请求都需要重新加载资源文件会大大降低应用的性能。</span></p>
<p><strong><span style="font-size: 10pt; font-family: 'Courier New'">struts.ui.theme</span></strong></p>
<p><strong><span style="font-size: 10pt; font-family: 宋体">该属性指定视图标签默认的视图主题，该属性的默认值是</span></strong><strong><span style="font-size: 10pt; font-family: 'Courier New'">xhtml</span></strong><strong><span style="font-size: 10pt; font-family: 宋体">。</span></strong></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">struts.ui.templateDir</span></p>
<p><span style="font-size: 10pt; font-family: 宋体">该属性指定视图主题所需要模板文件的位置，该属性的默认值是</span><span style="font-size: 10pt; font-family: 'Courier New'">template</span><span style="font-size: 10pt; font-family: 宋体">，即默认加载</span><span style="font-size: 10pt; font-family: 'Courier New'">template</span><span style="font-size: 10pt; font-family: 宋体">路径下的模板文件。</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">struts.ui.templateSuffix</span></p>
<p><span style="font-size: 10pt; font-family: 宋体">该属性指定模板文件的后缀，该属性的默认属性值是</span><span style="font-size: 10pt; font-family: 'Courier New'">ftl</span><span style="font-size: 10pt; font-family: 宋体">。该属性还允许使用</span><span style="font-size: 10pt; font-family: 'Courier New'">ftl</span><span style="font-size: 10pt; font-family: 宋体">、</span><span style="font-size: 10pt; font-family: 'Courier New'">vm</span><span style="font-size: 10pt; font-family: 宋体">或</span><span style="font-size: 10pt; font-family: 'Courier New'">jsp</span><span style="font-size: 10pt; font-family: 宋体">，分别对应</span><span style="font-size: 10pt; font-family: 'Courier New'">FreeMarker</span><span style="font-size: 10pt; font-family: 宋体">、</span><span style="font-size: 10pt; font-family: 'Courier New'">Velocity</span><span style="font-size: 10pt; font-family: 宋体">和</span><span style="font-size: 10pt; font-family: 'Courier New'">JSP</span><span style="font-size: 10pt; font-family: 宋体">模板。</span></p>
<p><strong><span style="font-size: 10pt; font-family: 'Courier New'">struts.configuration.xml.reload</span></strong></p>
<p><strong><span style="font-size: 10pt; font-family: 宋体">该属性设置当</span></strong><strong><span style="font-size: 10pt; font-family: 'Courier New'">struts.xml</span></strong><strong><span style="font-size: 10pt; font-family: 宋体">文件改变后，系统是否自动重新加载该文件。该属性的默认值是</span></strong><strong><span style="font-size: 10pt; font-family: 'Courier New'">false</span></strong><strong><span style="font-size: 10pt; font-family: 宋体">，开发阶段很实用。</span></strong></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">struts.velocity.configfile</span></p>
<p><span style="font-size: 10pt; font-family: 宋体">该属性指定</span><span style="font-size: 10pt; font-family: 'Courier New'">Velocity</span><span style="font-size: 10pt; font-family: 宋体">框架所需的</span><span style="font-size: 10pt; font-family: 'Courier New'">velocity.properties</span><span style="font-size: 10pt; font-family: 宋体">文件的位置。该属性的默认值为</span><span style="font-size: 10pt; font-family: 'Courier New'">velocity.properties</span><span style="font-size: 10pt; font-family: 宋体">。</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">struts.velocity.contexts</span></p>
<p><span style="font-size: 10pt; font-family: 宋体">该属性指定</span><span style="font-size: 10pt; font-family: 'Courier New'">Velocity</span><span style="font-size: 10pt; font-family: 宋体">框架的</span><span style="font-size: 10pt; font-family: 'Courier New'">Context</span><span style="font-size: 10pt; font-family: 宋体">位置，如果该框架有多个</span><span style="font-size: 10pt; font-family: 'Courier New'">Context</span><span style="font-size: 10pt; font-family: 宋体">，则多个</span><span style="font-size: 10pt; font-family: 'Courier New'">Context</span><span style="font-size: 10pt; font-family: 宋体">之间以英文逗号（</span><span style="font-size: 10pt; font-family: 'Courier New'">,</span><span style="font-size: 10pt; font-family: 宋体">）隔开。</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">struts.velocity.toolboxlocation</span></p>
<p><span style="font-size: 10pt; font-family: 宋体">该属性指定</span><span style="font-size: 10pt; font-family: 'Courier New'">Velocity</span><span style="font-size: 10pt; font-family: 宋体">框架的</span><span style="font-size: 10pt; font-family: 'Courier New'">toolbox</span><span style="font-size: 10pt; font-family: 宋体">的位置。</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">struts.url.http.port</span></p>
<p><span style="font-size: 10pt; font-family: 宋体">该属性指定</span><span style="font-size: 10pt; font-family: 'Courier New'">Web</span><span style="font-size: 10pt; font-family: 宋体">应用所在的监听端口。该属性通常没有太大的用处，只是当</span><span style="font-size: 10pt; font-family: 'Courier New'">Struts 2</span><span style="font-size: 10pt; font-family: 宋体">需要生成</span><span style="font-size: 10pt; font-family: 'Courier New'">URL</span><span style="font-size: 10pt; font-family: 宋体">时（例如</span><span style="font-size: 10pt; font-family: 'Courier New'">Url</span><span style="font-size: 10pt; font-family: 宋体">标签），该属性才提供</span><span style="font-size: 10pt; font-family: 'Courier New'">Web</span><span style="font-size: 10pt; font-family: 宋体">应用的默认端口。</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">struts.url.https.port</span></p>
<p><span style="font-size: 10pt; font-family: 宋体">该属性类似于</span><span style="font-size: 10pt; font-family: 'Courier New'">struts.url.http.port</span><span style="font-size: 10pt; font-family: 宋体">属性的作用，区别是该属性指定的是</span><span style="font-size: 10pt; font-family: 'Courier New'">Web</span><span style="font-size: 10pt; font-family: 宋体">应用的加密服务端口。</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">struts.url.includeParams</span></p>
<p><span style="font-size: 10pt; font-family: 宋体">该属性指定</span><span style="font-size: 10pt; font-family: 'Courier New'">Struts 2</span><span style="font-size: 10pt; font-family: 宋体">生成</span><span style="font-size: 10pt; font-family: 'Courier New'">URL</span><span style="font-size: 10pt; font-family: 宋体">时是否包含请求参数。该属性接受</span><span style="font-size: 10pt; font-family: 'Courier New'">none</span><span style="font-size: 10pt; font-family: 宋体">、</span><span style="font-size: 10pt; font-family: 'Courier New'">get</span><span style="font-size: 10pt; font-family: 宋体">和</span><span style="font-size: 10pt; font-family: 'Courier New'">all</span><span style="font-size: 10pt; font-family: 宋体">三个属性值，分别对应于不包含、仅包含</span><span style="font-size: 10pt; font-family: 'Courier New'">GET</span><span style="font-size: 10pt; font-family: 宋体">类型请求参数和包含全部请求参数。</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">struts.custom.i18n.resources</span></p>
<p><span style="font-size: 10pt; font-family: 宋体">该属性指定</span><span style="font-size: 10pt; font-family: 'Courier New'">Struts 2</span><span style="font-size: 10pt; font-family: 宋体">应用所需要的国际化资源文件，如果有多份国际化资源文件，则多个资源文件的文件名以英文逗号（</span><span style="font-size: 10pt; font-family: 'Courier New'">,</span><span style="font-size: 10pt; font-family: 宋体">）隔开。</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">struts.dispatcher.parametersWorkaround</span></p>
<p><span style="font-size: 10pt; font-family: 宋体">对于某些</span><span style="font-size: 10pt; font-family: 'Courier New'">Java EE</span><span style="font-size: 10pt; font-family: 宋体">服务器，不支持</span><span style="font-size: 10pt; font-family: 'Courier New'">HttpServlet Request</span><span style="font-size: 10pt; font-family: 宋体">调用</span><span style="font-size: 10pt; font-family: 'Courier New'">getParameterMap()</span><span style="font-size: 10pt; font-family: 宋体">方法，此时可以设置该属性值为</span><span style="font-size: 10pt; font-family: 'Courier New'">true</span><span style="font-size: 10pt; font-family: 宋体">来解决该问题。该属性的默认值是</span><span style="font-size: 10pt; font-family: 'Courier New'">false</span><span style="font-size: 10pt; font-family: 宋体">。对于</span><span style="font-size: 10pt; font-family: 'Courier New'"> WebLogic</span><span style="font-size: 10pt; font-family: 宋体">、</span><span style="font-size: 10pt; font-family: 'Courier New'">Orion</span><span style="font-size: 10pt; font-family: 宋体">和</span><span style="font-size: 10pt; font-family: 'Courier New'">OC4J</span><span style="font-size: 10pt; font-family: 宋体">服务器，通常应该设置该属性为</span><span style="font-size: 10pt; font-family: 'Courier New'">true</span><span style="font-size: 10pt; font-family: 宋体">。</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">struts.freemarker.manager.classname</span></p>
<p><span style="font-size: 10pt; font-family: 宋体">该属性指定</span><span style="font-size: 10pt; font-family: 'Courier New'">Struts 2</span><span style="font-size: 10pt; font-family: 宋体">使用的</span><span style="font-size: 10pt; font-family: 'Courier New'">FreeMarker</span><span style="font-size: 10pt; font-family: 宋体">管理器。该属性的默认值是</span><span style="font-size: 10pt; font-family: 'Courier New'">org.apache.struts2.views.freemarker.FreemarkerManager</span><span style="font-size: 10pt; font-family: 宋体">，这是</span><span style="font-size: 10pt; font-family: 'Courier New'">Struts 2</span><span style="font-size: 10pt; font-family: 宋体">内建的</span><span style="font-size: 10pt; font-family: 'Courier New'">FreeMarker</span><span style="font-size: 10pt; font-family: 宋体">管理器。</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">struts.freemarker.wrapper.altMap</span></p>
<p><span style="font-size: 10pt; font-family: 宋体">该属性只支持</span><span style="font-size: 10pt; font-family: 'Courier New'">true</span><span style="font-size: 10pt; font-family: 宋体">和</span><span style="font-size: 10pt; font-family: 'Courier New'">false</span><span style="font-size: 10pt; font-family: 宋体">两个属性值，默认值是</span><span style="font-size: 10pt; font-family: 'Courier New'">true</span><span style="font-size: 10pt; font-family: 宋体">。通常无需修改该属性值。</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">struts.xslt.nocache</span></p>
<p><span style="font-size: 10pt; font-family: 宋体">该属性指定</span><span style="font-size: 10pt; font-family: 'Courier New'">XSLT Result</span><span style="font-size: 10pt; font-family: 宋体">是否使用样式表缓存。当应用处于开发阶段时，该属性通常被设置为</span><span style="font-size: 10pt; font-family: 'Courier New'">true</span><span style="font-size: 10pt; font-family: 宋体">；当应用处于产品使用阶段时，该属性通常被设置为</span><span style="font-size: 10pt; font-family: 'Courier New'">false</span><span style="font-size: 10pt; font-family: 宋体">。</span></p>
<p><span style="font-size: 10pt; font-family: 'Courier New'">struts.configuration.files</span></p>
<p><span style="font-size: 10pt; font-family: 宋体">该属性指定</span><span style="font-size: 10pt; font-family: 'Courier New'">Struts 2</span><span style="font-size: 10pt; font-family: 宋体">框架默认加载的配置文件，如果需要指定默认加载多个配置文件，则多个配置文件的文件名之间以英文逗号（</span><span style="font-size: 10pt; font-family: 'Courier New'">,</span><span style="font-size: 10pt; font-family: 宋体">）隔开。该属性的默认值为</span><span style="font-size: 10pt; font-family: 'Courier New'">struts- default.xml,struts-plugin.xml,struts.xml</span><span style="font-size: 10pt; font-family: 宋体">，看到该属性值，读者应该明白为什么</span><span style="font-size: 10pt; font-family: 'Courier New'">Struts 2</span><span style="font-size: 10pt; font-family: 宋体">框架默认加载</span><span style="font-size: 10pt; font-family: 'Courier New'">struts.xml</span><span style="font-size: 10pt; font-family: 宋体">文件了。</span></p>
  <img src ="http://www.blogjava.net/jzone/aggbug/321072.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzone/" target="_blank">Gavin.lee</a> 2010-05-16 03:08 <a href="http://www.blogjava.net/jzone/articles/321072.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2 要点笔记（一）</title><link>http://www.blogjava.net/jzone/articles/321071.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Sat, 15 May 2010 18:59:00 GMT</pubDate><guid>http://www.blogjava.net/jzone/articles/321071.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 一、Struts2 主要几句话：1、 Struts2 是由webwork2发展来的而非Struts1，相比Struts1，Struts2编码规范跟类似与webwork22、Struts2 非侵入式设计、Struts1属于侵入式设计3、Struts1与ServletAPI、strutsAPI紧密耦合；Struts1则不4、Struts2 利用拦截器进行AOP编程，实现如权限拦截功能...&nbsp;&nbsp;<a href='http://www.blogjava.net/jzone/articles/321071.html'>阅读全文</a><img src ="http://www.blogjava.net/jzone/aggbug/321071.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzone/" target="_blank">Gavin.lee</a> 2010-05-16 02:59 <a href="http://www.blogjava.net/jzone/articles/321071.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2 转换器--Converter</title><link>http://www.blogjava.net/jzone/articles/316885.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Mon, 29 Mar 2010 17:06:00 GMT</pubDate><guid>http://www.blogjava.net/jzone/articles/316885.html</guid><description><![CDATA[<a href="http://www.blogjava.net/max/archive/2006/11/07/79602.html">http://www.blogjava.net/max/archive/2006/11/07/79602.html</a> 
 <img src ="http://www.blogjava.net/jzone/aggbug/316885.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzone/" target="_blank">Gavin.lee</a> 2010-03-30 01:06 <a href="http://www.blogjava.net/jzone/articles/316885.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2 表单数据校验</title><link>http://www.blogjava.net/jzone/articles/316881.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Mon, 29 Mar 2010 16:43:00 GMT</pubDate><guid>http://www.blogjava.net/jzone/articles/316881.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: http://www.blogjava.net/max/archive/2006/11/14/81106.html All Input Is Evil!利用Action的validate方法进行的注册表单验证一、注册输入页面 reg.jsp&lt;%@&nbsp;page&nbsp;language="java"&nbsp;import="java.util.*"&nbsp;p...&nbsp;&nbsp;<a href='http://www.blogjava.net/jzone/articles/316881.html'>阅读全文</a><img src ="http://www.blogjava.net/jzone/aggbug/316881.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzone/" target="_blank">Gavin.lee</a> 2010-03-30 00:43 <a href="http://www.blogjava.net/jzone/articles/316881.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2 拦截器</title><link>http://www.blogjava.net/jzone/articles/316874.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Mon, 29 Mar 2010 15:17:00 GMT</pubDate><guid>http://www.blogjava.net/jzone/articles/316874.html</guid><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 一、拦截器定义拦截器，在AOP（Aspect-Oriented Programming）中用于在某个方法或字段被访问之前，进行拦截然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。在Webwork的中文文档的解释为——拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码，也可以在一个action执行前阻止其执行。同时也是...&nbsp;&nbsp;<a href='http://www.blogjava.net/jzone/articles/316874.html'>阅读全文</a><img src ="http://www.blogjava.net/jzone/aggbug/316874.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzone/" target="_blank">Gavin.lee</a> 2010-03-29 23:17 <a href="http://www.blogjava.net/jzone/articles/316874.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts2 标签功能详解 --- 无实例讲解 </title><link>http://www.blogjava.net/jzone/articles/316631.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Fri, 26 Mar 2010 04:03:00 GMT</pubDate><guid>http://www.blogjava.net/jzone/articles/316631.html</guid><description><![CDATA[<p>Struts 2 Tag Reference: <a href="http://struts.apache.org/2.x/docs/tag-reference.html">http://struts.apache.org/2.x/docs/tag-reference.html</a> </p>
<p>A： <br />
&lt;s:a xhref=""&gt;&lt;/s:a&gt;-----超链接，类似于html里的&lt;a&gt;&lt;/a&gt; <br />
&lt;s:action name=""&gt;&lt;/s:action&gt;-----执行一个view里面的一个action <br />
&lt;s:actionerror/&gt;-----如果action的errors有值那么显示出来 <br />
&lt;s:actionmessage/&gt;-----如果action的message有值那么显示出来 <br />
&lt;s:append&gt;&lt;/s:append&gt;-----添加一个值到list，类似于list.add(); <br />
&lt;s:autocompleter&gt;&lt;/s:autocompleter&gt;-----自动完成&lt;s:combobox&gt;标签的内容，这个是ajax </p>
<p>B： <br />
&lt;s:bean name=""&gt;&lt;/s:bean&gt;-----类似于struts1.x中的，JavaBean的值 </p>
<p>C： <br />
&lt;s:checkbox&gt;&lt;/s:checkbox&gt;-----复选框 <br />
&lt;s:checkboxlist list=""&gt;&lt;/s:checkboxlist&gt;-----多选框 <br />
&lt;s:combobox list=""&gt;&lt;/s:combobox&gt;-----下拉框 <br />
&lt;s:component&gt;&lt;/s:component&gt;-----图像符号 </p>
<p>D： <br />
&lt;s:date/&gt;-----获取日期格式 <br />
&lt;s:datetimepicker&gt;&lt;/s:datetimepicker&gt;-----日期输入框 <br />
&lt;s:debug&gt;&lt;/s:debug&gt;-----显示错误信息 <br />
&lt;s:div&gt;&lt;/s:div&gt;-----表示一个块，类似于html的&lt;div&gt;&lt;/div&gt; <br />
&lt;s:doubleselect list="" doubleName="" doubleList=""&gt;&lt;/s:doubleselect&gt;-----双下拉框 </p>
<p>E： <br />
&lt;s:if test=""&gt;&lt;/s:if&gt; <br />
&lt;s:elseif test=""&gt;&lt;/s:elseif&gt; <br />
&lt;s:else&gt;&lt;/s:else&gt;-----这3个标签一起使用，表示条件判断 </p>
<p>F： <br />
&lt;s:fielderror&gt;&lt;/s:fielderror&gt;-----显示文件错误信息 <br />
&lt;s:file&gt;&lt;/s:file&gt;-----文件上传 <br />
&lt;s:form action=""&gt;&lt;/s:form&gt;-----获取相应form的值 </p>
<p>G： <br />
&lt;s:generator separator="" val=""&gt;&lt;/s:generator&gt;----和&lt;s:iterator&gt;标签一起使用 </p>
<p>H： <br />
&lt;s:head/&gt;-----在&lt;head&gt;&lt;/head&gt;里使用，表示头文件结束 <br />
&lt;s:hidden&gt;&lt;/s:hidden&gt;-----隐藏值 </p>
<p>I： <br />
&lt;s:i18n name=""&gt;&lt;/s:i18n&gt;-----加载资源包到值堆栈 <br />
&lt;s:include value=""&gt;&lt;/s:include&gt;-----包含一个输出，servlet或jsp页面 <br />
&lt;s:inputtransferselect list=""&gt;&lt;/s:inputtransferselect&gt;-----获取form的一个输入 <br />
&lt;s:iterator&gt;&lt;/s:iterator&gt;-----用于遍历集合 </p>
<p>L： <br />
&lt;s:label&gt;&lt;/s:label&gt;-----只读的标签 </p>
<p>M： <br />
&lt;s:merge&gt;&lt;/s:merge&gt;-----合并遍历集合出来的值 </p>
<p>O： <br />
&lt;s:optgroup&gt;&lt;/s:optgroup&gt;-----获取标签组 <br />
&lt;s:optiontransferselect doubleList="" list="" doubleName=""&gt;&lt;/s:optiontransferselect&gt;-----左右选择框 </p>
<p>P： <br />
&lt;s:param&gt;&lt;/s:param&gt;-----为其他标签提供参数 <br />
&lt;s:password&gt;&lt;/s:password&gt;-----密码输入框 <br />
&lt;s:property/&gt;-----得到'value'的属性 <br />
&lt;s:push value=""&gt;&lt;/s:push&gt;-----value的值push到栈中,从而使property标签的能够获取value的属性 </p>
<p>R： <br />
&lt;s:radio list=""&gt;&lt;/s:radio&gt;-----单选按钮 <br />
&lt;s:reset&gt;&lt;/s:reset&gt;-----重置按钮 </p>
<p>S： <br />
&lt;s:select list=""&gt;&lt;/s:select&gt;-----单选框 <br />
&lt;s:set name=""&gt;&lt;/s:set&gt;-----赋予变量一个特定范围内的值 <br />
&lt;s:sort comparator=""&gt;&lt;/s:sort&gt;-----通过属性给list分类 <br />
&lt;s:submit&gt;&lt;/s:submit&gt;-----提交按钮 <br />
&lt;s:subset&gt;&lt;/s:subset&gt;-----为遍历集合输出子集 </p>
<p>T： <br />
&lt;s:tabbedPanel id=""&gt;&lt;/s:tabbedPanel&gt;-----表格框 <br />
&lt;s:table&gt;&lt;/s:table&gt;-----表格 <br />
&lt;s:text name=""&gt;&lt;/s:text&gt;-----I18n文本信息 <br />
&lt;s:textarea&gt;&lt;/s:textarea&gt;-----文本域输入框 <br />
&lt;s:textfield&gt;&lt;/s:textfield&gt;-----文本输入框 <br />
&lt;s:token&gt;&lt;/s:token&gt;-----拦截器 <br />
&lt;s:tree&gt;&lt;/s:tree&gt;-----树 <br />
&lt;s:treenode label=""&gt;&lt;/s:treenode&gt;-----树的结构 </p>
<p>U： <br />
&lt;s:updownselect list=""&gt;&lt;/s:updownselect&gt;-----多选择框 <br />
&lt;s:url&gt;&lt;/s:url&gt;-----创建url&nbsp; <br />
&nbsp;<br />
&nbsp;<br />
</p>
  <img src ="http://www.blogjava.net/jzone/aggbug/316631.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzone/" target="_blank">Gavin.lee</a> 2010-03-26 12:03 <a href="http://www.blogjava.net/jzone/articles/316631.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA WEB 由Model 1 向Model 2的过度 之SSH</title><link>http://www.blogjava.net/jzone/articles/316488.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Wed, 24 Mar 2010 15:35:00 GMT</pubDate><guid>http://www.blogjava.net/jzone/articles/316488.html</guid><description><![CDATA[<span>原文：http://hi.baidu.com/%D0%C4%CB%E9%E5%D0%D2%A3/blog/item/e6ae7ed87146ac3232fa1c40.html <br />
传统的java
web应用程序是采用jsp+servlet+javabean来实现的，这种模式实现了最基本的MVC分层，使的程序结构分为几层，有负责显示的
jsp、负责流程逻辑控制的servlet、负责数据封装的javabean。但是这种结构仍然存在问题：如jsp页面中需要使用&lt;%
%&gt;符号嵌入很多的java代码，造成页面结构混乱，servlet和javabean负责了大量的跳转和运算工作，耦合紧密，程序复用度低等等。<br />
<br />
于是先出现了struts框架，它是一个完美的MVC实现，它有一个中央控制类（一个Servlet），针对不同的业务，我们需要一个Action类负责
页面跳转和后台逻辑运算，一个或几个jsp页面负责数据的输入和输出显示，还有一个Form类负责传递Action和jsp中间的数据。jsp中可以使用
struts框架提供的一组标签，就像使用html标签一样简单，但是可以完成非常复杂的逻辑。从此jsp页面中不需要出现一行&lt;%%&gt;包围
的java代码了。<br />
<br />
可是所有的运算逻辑都放在struts的Action里将使得Action类复用度低和逻辑混乱，所以通常人们会把整个web应用程序分为三层，struts负责显示层，它调用业务层完成运算逻辑，业务层再调用持久层完成数据库的读写。<br />
<br />
使用jdbc连接来读写数据库，我们最常见的就是打开数据库连接、使用复杂的sql语句进行读写、关闭连接，获得的数据又需要转换或封装后往外传，这是一个非常烦琐的过程。<br />
<br />
这时出现了hibernate框架，它需要你创建一系列的持久化类，每个类的属性都可以简单的看做和一张数据库表的属性一一对应，当然也可以实现关系数据
库的各种表件关联的对应。然后我们****作时，只需要去****作这些持久化类，而不用再关注数据库表。我们不用再去一行行的查询数据库，只需要
****作持久化类就可以完成增删改查的功能。使我们的软件开发真正面向对象，而不是面向混乱的代码。我的感受是，使用hibernate比jdbc方式
减少了80％的编程量。<br />
<br />
现在我们有三个层了，可是每层之间的调用是怎样的呢？比如显示层的struts需要调用一个业务类，就需要new一个业务类出来，然后使用；业务层需要调
用持久层的类，也需要new一个持久层类出来用。通过这种new的方式互相调用就是软件开发中最糟糕设计的体现。简单的说，就是调用者依赖被调用者，它们
之间形成了强耦合，如果我想在其他地方复用某个类，则这个类依赖的其他类也需要包含。程序就变得很混乱，每个类互相依赖互相调用，复用度极低。如果一个类
做了修改，则依赖它的很多类都会受到牵连。<br />
<br />
为此，出现spring框架，它的作用就是完全解耦类之间的依赖关系，一个类如果要依赖什么，那就是一个接口。至于如何实现这个接口，这都不重要了。只要
拿到一个实现了这个接口的类，就可以轻松的通过xml配置文件把实现类注射到调用接口的那个类里。所有类之间的这种依赖关系就完全通过配置文件的方式替代
了。所以spring框架最核心的就是所谓的依赖注射和控制反转。<br />
<br />
现在的结构是，struts负责显示层，hibernate负责持久层，spring负责中间的业务层，这个结构是目前国内最流行的Java
Web应用程序架构了。另外，由于Spring使用的依赖注射以及AOP（面向方面编程），所以它的这种内部模式非常优秀，以至于Spring自己也实现
了一个使用依赖注射的MVC框架，叫做Spring
MVC，同时为了很好的处理事物，Spring集成了hibernate，使事物管理从Hibernate的持久层提升到了业务层，使用更加方便和强大。</span>
<img src ="http://www.blogjava.net/jzone/aggbug/316488.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzone/" target="_blank">Gavin.lee</a> 2010-03-24 23:35 <a href="http://www.blogjava.net/jzone/articles/316488.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts1 初步认识</title><link>http://www.blogjava.net/jzone/articles/290601.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Mon, 10 Aug 2009 16:11:00 GMT</pubDate><guid>http://www.blogjava.net/jzone/articles/290601.html</guid><description><![CDATA[<p>1.为什么要使用struts<br />
a.struts建立在MVC这种公认的好的模式上的，Struts在M,V,C上都有涉及，但它主要提供一个好的控制器和一套定制的标签库上，也就是说它的着力点在C,V上，有MVC的一系列优点，如：结构层次分明，高可重用性，增加了程序的健壮性呵可伸缩性，便于开发与设计分工，提供集中统一的权限控制，校验，国际化，日志等等；<br />
b.struts它是开源项目，得到了包括它的发明者Craig R.McClanahan在内的一些程序大师和高手持续而细心的呵护，并且经受了实战的检验，使其功能越来越强大，体系也日益完善；<br />
c.struts框架能和其他技术很好的融合，如与Spring，Hibernate等框架的整合，大大加快了开发速度</p>
<p>2.Framework的概念<br />
框架是人们用于解决相同或者相似类型问题的方案<br />
特点：可重用性，可扩展性，可收缩性。基于请求响应（request-response）模式的应用Framework的逻辑结构<br />
控制器：Controller<br />
业务逻辑层：Business Logic<br />
数据逻辑层：Data Logic</p>
<p>3.Struts的概念和体系结构<br />
Struts是Apache组织的一个开源项目，主要是采用Servlet和JSP技术来实现的<br />
Struts是一个基于Sun JavaEE平台的MVC框架，它采用MVC模式，将MVC模式分离显示逻辑和业务逻辑的能力，发挥的淋漓尽致<br />
(Struts is a flexible control layer based on standard technologies like Java Servlets,JavaBeans,ResourceBundles,and XML,as well as various Jakarta Commons packages,like BeanUtils and Chain of Responsibility.The frameword helps you create an extensible developmnt environment for your application,based on published standards and proven design patterns)</p>
<p>4.Struts的实践步骤<br />
步骤一：搭建环境<br />
&nbsp;a.导入jar包，使用其中的类<br />
&nbsp;b.建立一个配置文件，struts=config.xml<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;方便struts用户使用<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;一般在WEB=INF下<br />
&nbsp;c.修改web.xml<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;注册struts中心控制器 --ActionServlet</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">serlet</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">servlet-name</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">servlet-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">servlet-class</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">servlet-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;初始化加载配置文件&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">config</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/WEB-INF/struts-config.xml</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">load-on-startup</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">0</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">load-on-startup</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;web容器启动就加载该servlet&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">serlet</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">servlet-mapping</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;该servlet对外调用的映射&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">servlet-name</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">servlet-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">url-pattern</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">url-pattern</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">servlet-mapping</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<p>&nbsp;<br />
步骤二：建立ActionForm<br />
步骤三：建立Action<br />
&nbsp;建立一个类，继承Action，覆盖execute方法<br />
&nbsp;注册，修改配置文件struts-config.xml<br />
&nbsp;&nbsp;path：指明调用者（jsp）能通过中心控制器ActionServlet找到该Action<br />
&nbsp;&nbsp;type：指明该action类全名<br />
&nbsp;&nbsp;name：该action引用的form的名称</p>
<p>步骤四：页面访问</p>
<p><br />
5.Struts的工作原理<br />
6.Struts的组件<br />
7.Struts的配置文件简介<br />
8.Struts标记库<br />
9.异常处理框架<br />
10.校验框架<br />
11.高级特性<br />
12.Struts优缺点<br />
优点：<br />
　　Struts跟Tomcat、Turbine等诸多Apache项目一样，是开源软件，这是它的一大优点。使开发者能更深入的了解其内部实现机制。除此之外，Struts的优点主要集中体现在两个</p>
<p>方面：Taglib和页面导航。Taglib是Struts的标记库，灵活动用，能大大提高开发效率。另外，就目前国内的JSP开发者而言，除了使用JSP自带的常用标记外，很少开发自己的标</p>
<p>记，或许Struts是一个很好的起点。<br />
　　关于页面导航，我们认为那将是今后的一个发展方向，事实上，这样做，使系统的脉络更加清晰。通过一个配置文件，即可把握整个系统各部分之间的联系，这对于后期的维</p>
<p>护有着莫大的好处。尤其是当另一批开发者接手这个项目时，这种优势体现得更加明显。</p>
<p>缺点：<br />
　　Taglib是Struts的一大优势，但对于初学者而言，却需要一个持续学习的过程，甚至还会打乱我们网页编写的习惯，但是，当我们习惯了它时，我们会觉得它真的很棒。</p>
<p>Struts将MVC的Controller一分为三，在获得结构更加清晰的同时，也增加了系统的复杂度。毫无疑问，要理解 Struts 必须接受一定的培训。随着变化的不断加入，这有时会令人</p>
<p>很沮丧。<br />
　　Struts从产生到现在还不过3-4年时间，就已逐步越来越多运用于商业软件。虽然它现在还有不少缺点，但它是一种非常优秀的J2EE MVC实现方式，如果我们的系统准备采用</p>
<p>J2EE MVC架构，那么，不妨考虑一下Struts。<br />
　　Struts 是一种基于 Web 的 MVC 解决方案，所以必须用 HTML、JSP 文件和 servlet 来实现它，Struts 需要支持 JSP 1.1 和 Servlet 2.2 规范的 servlet 容器。学习、理</p>
<p>解和掌握Struts是我们每个基于J2EE软件开发人员一门必修的课程，也是我们对企业J2EE技术应用的进一步深化。</p>
<p>/************************************************************************************************/<br />
<br />
Struts的基本组件包</p>
<p>org.apache.struts.action <br />
　基本上，控制整个struts framework的运行的核心类、组件都在这个包中，比如我们上面提到的控制器ActionServlet。已经Action,ActionForm,ActionMapping等等。struts1.1比1.0多了 DynaActionForm 类。增加了动态扩展生成FormBean功能 <br />
<br />
org.apache.struts.actions <br />
　这个包是主要作用是提供客户的http请求和业务逻辑处理之间的特定适配器转换功能，而1.0版本中的部分动态增删FromBean的类，也在struts1.1中被Action包的DynaActionForm组件所取代 <br />
<br />
org.apache.struts.config <br />
　提供对配置文件struts-config.xml元素的映射。这也是sturts1.1中新增的功能 <br />
<br />
org.apache.struts.util <br />
　Strtuts为了更好支持web application的应用，体统了一个些常用服务的支持，比如Connection Pool和Message Source。<br />
<br />
org.apache.struts.taglib <br />
　这不是一个包，而是是一个客户标签类的集合。下面包括Bean Tags，HTML Tags，Logic Tags，Nested Tags，Template Tags这几个用于构建用户界面的标签类。 <br />
<br />
org.apache.struts.validator <br />
　Struts1.1 framework中增加了validator framework，用于动态的配置from表单的验证。</p>
<p>/************************************************************************************************/<br />
核心Struts 类和MVC 的对应</p>
<p>类&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;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;描述 <br />
ActionForward&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;用户指向或者视图选择 <br />
ActionForm&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;状态改变的数据 <br />
ActionMapping&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;状态改变事件 <br />
ActionServlet&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;控制器，接受用户请求和状态改变，以及发出视图选择 <br />
Action&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;&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;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;以及告诉ActionServlet 下一个选择的视图 <br />
</p>
<p><br />
/************************************************************************************************/<br />
Struts 使用一些配置文件和视图助手（view helpers）来沟通控制器和模型<br />
ApplicationResources.properties&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;&nbsp;&nbsp;&nbsp;&nbsp;存储本地化信息和标签，以使应用可以国际化 <br />
struts-config.xml&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;&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;存储控制器对象的缺省配置，包括模型支持的用户指向，状态改变，状态查询 </p>
<p>标记库描述符&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;&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 />
struts-html.tld&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;扩展HTML Form的JSP标记 <br />
struts-bean.tld&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;扩展处理JavaBean的JSP标记 <br />
struts-logic.tld&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;扩展测试属性值的JSP标记 </p>
<p>/************************************************************************************************/<br />
控制器组件的配置框架中的控制器组件是有org.apache.struts.action.ActionServlet类实现的，这个类是javax.servlet.http.HttpServlet类的扩展。<br />
ActionServlet配置：我们需要在web.xml中声明ActionServlet，并且将它配置成启动时进行加载。以下为可以配置的初始化参数：<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;&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;&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;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;描述 <br />
application&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Null&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;&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;&nbsp;&nbsp;应用程序的资源集合的类 <br />
bufferSize&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4096&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;&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;&nbsp;&nbsp;文件上传的缓冲区大小 <br />
config&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/WEB-INF/struts-config.xml&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;配置文件的位置和名称 <br />
content&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Text/html&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;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;默认的内容类型 <br />
debug&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;&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;0&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;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;程序调试的级别 <br />
detail&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;&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;&nbsp;0&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;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;程序调试细节的级别 <br />
factory&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;&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;Null&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;消息资源工厂，用于国际化中解释消息资源 <br />
formBean&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;org.apache.struts.action.ActionFormBean&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;封装ActionForm bean信息的类的名称 <br />
forward&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;Org.apache.struts.action.ActionForward&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;封装ActionForward对象信息的类的名称 <br />
locale&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;&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;True&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;&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;为true,将在用户会话中存储一个本地对象 <br />
mapping&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;Org.apache.struts.action.ActionForward&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;封装ActionMapping信息的类的名称 <br />
maxFileSize&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;250M&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;&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;&nbsp;&nbsp;&nbsp;上传文件的最大尺寸 <br />
multipartClass&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Org.apache.struts.action.ActionForward&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;&nbsp;处理多部分请求的类的名称 <br />
noCache&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;False&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HTTP标头是否要设置为禁止缓寸 <br />
Null&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;&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;True&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;设置为true，对于无效的信息关键字将返回null <br />
tempDir&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;作为一个servlet参数提供给程序的工作目录&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 />
validate&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;&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;True&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;&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 />
vallidating&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;True&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;&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;是否对配置文件进行有效性分析 </p>
<p><br />
&nbsp;</p>
 <img src ="http://www.blogjava.net/jzone/aggbug/290601.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jzone/" target="_blank">Gavin.lee</a> 2009-08-11 00:11 <a href="http://www.blogjava.net/jzone/articles/290601.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>