﻿<?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-空间站-文章分类-Struts</title><link>http://www.blogjava.net/i369/category/18051.html</link><description>北极心空</description><language>zh-cn</language><lastBuildDate>Wed, 28 May 2008 18:14:27 GMT</lastBuildDate><pubDate>Wed, 28 May 2008 18:14:27 GMT</pubDate><ttl>60</ttl><item><title>当JsonPlugin遇到CGLib</title><link>http://www.blogjava.net/i369/articles/203608.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Wed, 28 May 2008 10:26:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/203608.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/203608.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/203608.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/203608.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/203608.html</trackback:ping><description><![CDATA[<p>JsonPlugin在分析类结构并序列化时，对于CGLig动态生成的类也是按照一般类来看待的。这就导致了如下的问题：<br />
<br />
在一个应用中，某些情况下，一个服务类返回的实体并不是原有实体类的对象，而是CGLib动态生成的子类。例如使用Hibernate的时候，某些情况下DAO返回的是EntityClassName$$EnhancerByCGLIB$$ac21e这样的类的对象。Hibernate在这个子类中添加了hibernateLazyInitializer等等的附加属性。由于jsonplugin并不区分类和动态生成的类，所以也会试图序列化hibernateLazyInitializer属性，从而导致出现如下的异常：</p>
java.sql.SQLException: Positioned Update not supported.<br />
&nbsp;at com.mysql.jdbc.ResultSet.getCursorName(ResultSet.java:1800)<br />
<br />
另外，CGLIB生成的类，某些方法上的@JSON标记奇怪的丢失了。导致标记了@JSON(serialize=false)的属性也被序列化。<br />
<br />
在网上查了很久没有发现相关的文章，所以无奈就自己动手修改jsonplugin的代码了。<br />
<br />
类：com.googlecode.jsonplugin.JSONWriter，修改bean()方法：<br />
<br />
<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; line-height: 22px; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">&nbsp;1</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;bean(Object&nbsp;object)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;JSONException&nbsp;{<br />
</span><span style="color: #008080">&nbsp;2</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.add(</span><span style="color: #000000">"</span><span style="color: #000000">{</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">&nbsp;3</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;4</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BeanInfo&nbsp;info;<br />
</span><span style="color: #008080">&nbsp;5</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;6</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;{<br />
</span><span style="color: #008080">&nbsp;7</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Class&nbsp;clazz&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;object.getClass();<br />
</span><span style="color: #008080">&nbsp;8</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;9</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;info&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;((object&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.root)&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.ignoreHierarchy)&nbsp;</span><span style="color: #000000">?</span><span style="color: #000000">&nbsp;Introspector<br />
</span><span style="color: #008080">10</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.getBeanInfo(clazz,&nbsp;clazz.getSuperclass())<br />
</span><span style="color: #008080">11</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;Introspector.getBeanInfo(clazz);<br />
</span><span style="color: #008080">12</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">13</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PropertyDescriptor[]&nbsp;props&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;info.getPropertyDescriptors();<br />
</span><span style="color: #008080">14</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">15</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">boolean</span><span style="color: #000000">&nbsp;hasData&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">;<br />
</span><span style="color: #008080">16</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;i&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;props.length;&nbsp;</span><span style="color: #000000">++</span><span style="color: #000000">i)&nbsp;{<br />
</span><span style="color: #008080">17</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PropertyDescriptor&nbsp;prop&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;props[i];<br />
</span><span style="color: #008080">18</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;name&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;prop.getName();<br />
</span><span style="color: #008080">19</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Method&nbsp;accessor&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;prop.getReadMethod();<br />
</span><span style="color: #008080">20</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Method&nbsp;baseAccessor&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">这里增加一个临时变量作为真实希望序列化的属性的accessor方法引用</span><span style="color: #008000"><br />
</span><span style="color: #008080">21</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(clazz.getName().indexOf(</span><span style="color: #000000">"</span><span style="color: #000000">$$EnhancerByCGLIB$$</span><span style="color: #000000">"</span><span style="color: #000000">)&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">)&nbsp;{&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">如果是CGLIB动态生成的类</span><span style="color: #008000"><br />
</span><span style="color: #008080">22</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;{<br />
</span><span style="color: #008080">23</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">下面的逻辑是根据CGLIB动态生成的类名，得到原本的实体类名<br />
</span><span style="color: #008080">24</span>&nbsp;<span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">例如&nbsp;EntityClassName$$EnhancerByCGLIB$$ac21e这样<br />
</span><span style="color: #008080">25</span>&nbsp;<span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">的类，将返回的是EntityClassName这个类中的相应方法，若<br />
</span><span style="color: #008080">26</span>&nbsp;<span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">获取不到对应方法，则说明要序列化的属性例如hibernateLazyInitializer之类<br />
</span><span style="color: #008080">27</span>&nbsp;<span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">不在原有实体类中，而是仅存在于CGLib生成的子类中，此时baseAccessor<br />
</span><span style="color: #008080">28</span>&nbsp;<span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">保持为null</span><span style="color: #008000"><br />
</span><span style="color: #008080">29</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;baseAccessor&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Class.forName(<br />
</span><span style="color: #008080">30</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clazz.getName().substring(</span><span style="color: #000000">0</span><span style="color: #000000">,<br />
</span><span style="color: #008080">31</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;clazz.getName().indexOf(</span><span style="color: #000000">"</span><span style="color: #000000">$$</span><span style="color: #000000">"</span><span style="color: #000000">)))<br />
</span><span style="color: #008080">32</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.getDeclaredMethod(accessor.getName(),<br />
</span><span style="color: #008080">33</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;accessor.getParameterTypes());<br />
</span><span style="color: #008080">34</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(Exception&nbsp;ex)&nbsp;{<br />
</span><span style="color: #008080">35</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.debug(ex.getMessage());<br />
</span><span style="color: #008080">36</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080">37</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080">38</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">若不是CGLib生成的类，那么要序列化的属性的accessor方法就是该类中的方法。</span><span style="color: #008000"><br />
</span><span style="color: #008080">39</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;baseAccessor&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;accessor;<br />
</span><span style="color: #008080">40</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">41</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">这个判断，根据上面的逻辑，使得仅存在于CGLIB生成子类中的属性跳过JSON序列化</span><span style="color: #008000"><br />
</span><span style="color: #008080">42</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(baseAccessor&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">43</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">44</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">下面的JSON&nbsp;Annotation的获取也修改为从baseAccessor获取，这样避免了<br />
</span><span style="color: #008080">45</span>&nbsp;<span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">由于CGLIB生成子类而导致某些方法上的JSON&nbsp;Annotation丢失导致处理不该<br />
</span><span style="color: #008080">46</span>&nbsp;<span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">序列化的属性</span><span style="color: #008000"><br />
</span><span style="color: #008080">47</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JSON&nbsp;json&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;baseAccessor.getAnnotation(JSON.</span><span style="color: #0000ff">class</span><span style="color: #000000">);<br />
</span><span style="color: #008080">48</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(json&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)&nbsp;{<br />
</span><span style="color: #008080">49</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">!</span><span style="color: #000000">json.serialize())<br />
</span><span style="color: #008080">50</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">continue</span><span style="color: #000000">;<br />
</span><span style="color: #008080">51</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(json.name().length()&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">)<br />
</span><span style="color: #008080">52</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;json.name();<br />
</span><span style="color: #008080">53</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080">54</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">55</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">ignore&nbsp;"class"&nbsp;and&nbsp;others</span><span style="color: #008000"><br />
</span><span style="color: #008080">56</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">this</span><span style="color: #000000">.shouldExcludeProperty(clazz,&nbsp;prop))&nbsp;{<br />
</span><span style="color: #008080">57</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">continue</span><span style="color: #000000">;<br />
</span><span style="color: #008080">58</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080">59</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;expr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
</span><span style="color: #008080">60</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">this</span><span style="color: #000000">.buildExpr)&nbsp;{<br />
</span><span style="color: #008080">61</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;expr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.expandExpr(name);<br />
</span><span style="color: #008080">62</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">this</span><span style="color: #000000">.shouldExcludeProperty(expr))&nbsp;{<br />
</span><span style="color: #008080">63</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">continue</span><span style="color: #000000">;<br />
</span><span style="color: #008080">64</span>&nbsp;<span style="color: #000000">&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 />
</span><span style="color: #008080">65</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;expr&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.setExprStack(expr);<br />
</span><span style="color: #008080">66</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080">67</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(hasData)&nbsp;{<br />
</span><span style="color: #008080">68</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.add(</span><span style="color: #000000">'</span><span style="color: #000000">,</span><span style="color: #000000">'</span><span style="color: #000000">);<br />
</span><span style="color: #008080">69</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080">70</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hasData&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">;<br />
</span><span style="color: #008080">71</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">72</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;value&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;accessor.invoke(object,&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Object[</span><span style="color: #000000">0</span><span style="color: #000000">]);<br />
</span><span style="color: #008080">73</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.add(name,&nbsp;value,&nbsp;accessor);<br />
</span><span style="color: #008080">74</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">this</span><span style="color: #000000">.buildExpr)&nbsp;{<br />
</span><span style="color: #008080">75</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.setExprStack(expr);<br />
</span><span style="color: #008080">76</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080">77</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080">78</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080">79</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(Exception&nbsp;e)&nbsp;{<br />
</span><span style="color: #008080">80</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">throw</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;JSONException(e);<br />
</span><span style="color: #008080">81</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080">82</span>&nbsp;<span style="color: #000000"><br />
</span><span style="color: #008080">83</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.add(</span><span style="color: #000000">"</span><span style="color: #000000">}</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
</span><span style="color: #008080">84</span>&nbsp;<span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
<br />
这样修改之后，原有类中不能存在的属性将不会被序列化，同时，由于不检查生成的类的方法上的JSON标记，而是检查原有类上的标记，这样避免了由于CGLIB导致的Annotation丢失的问题。<br />
<br />
在此依然向诸位询问是否JSONPlugin有处理这样的情况的方法。 
<img src ="http://www.blogjava.net/i369/aggbug/203608.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2008-05-28 18:26 <a href="http://www.blogjava.net/i369/articles/203608.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[Translation]JSON与struts2[转]</title><link>http://www.blogjava.net/i369/articles/203606.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Wed, 28 May 2008 10:20:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/203606.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/203606.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/203606.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/203606.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/203606.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 下载地址: http://code.google.com/p/jsonplugin/downloads/list&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Apache提供的一个插件包，可以把Action中的数据以JSON做个封装然后返回。它会将整个action中的变量转化为J...&nbsp;&nbsp;<a href='http://www.blogjava.net/i369/articles/203606.html'>阅读全文</a><img src ="http://www.blogjava.net/i369/aggbug/203606.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2008-05-28 18:20 <a href="http://www.blogjava.net/i369/articles/203606.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>［译］Struts Menu开发向导 [转]</title><link>http://www.blogjava.net/i369/articles/188258.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Mon, 24 Mar 2008 07:31:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/188258.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/188258.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/188258.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/188258.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/188258.html</trackback:ping><description><![CDATA[官方英文版向导（<a href="http://struts-menu.sourceforge.net/userguide.html"><a href="http://struts-menu.sourceforge.net/userguide.html" target="_blank"><font color="#666666">http://struts-menu.sourceforge.net/userguide.html</font></a></a>）
<p>一、从1.X升级到2.X需要做以下事情：<br />
1、改变你的taglib声明中的URI。<br />
<font style="background-color: #ffe000">&nbsp;&lt;% at taglib uri="</font><a href="http://struts-menu%20dot%20sf.net/tag"><font style="background-color: #ffe000"><a href="http://struts-menu.sf.net/tag" target="_blank"><font color="#666666">http://struts-menu.sf.net/tag</font></a></font></a><font style="background-color: #ffe000">" prefix="menu" %&gt;<br />
</font>2、改变&lt;plug-in&gt;,使用新的包名"net.sf.navigator." 。<br />
&nbsp;<font style="background-color: #ffe000">&lt;plug-in className="net.sf.navigator.menu.MenuPlugIn"&gt;</font><br />
3、改变你的menu-config.xml文件，使用新的包名"net.sf.navigator." 。<br />
<font style="background-color: #ffe000">&nbsp;&lt;Displayer name="Simple"<br />
&nbsp;&nbsp; type="net.sf.navigator.displayer.SimpleMenuDisplayer"/&gt;</font></p>
<p>二、快速开始：<br />
1、下载最新的struts-menu版本；<br />
2、解包到本地目录；<br />
3、下载Tomcat或者其它Servlet容器；<br />
4、把struts-menu.war包放入Tomcat安装目录的wabapps目录下，并重启Tomcat服务。<br />
5、打开htpp://localhost:8080/struts-menu/</p>
<p>三、把Struts Menu整合到你的应用程序中：<br />
Struts Menu能够被轻易的整合到你的Struts应用程序中，它也可以整合到一个非Struts的应用程序中，但是我不喜欢这样做，所以在此没有提供相应的教程。这里将一步步的带你整合这个标签库。<br />
你需要把struts-menu.jar放到你的WEB-INF/lib目录下。然后使用URI标签声明你的JSP文件中想使用的这个标签库。<br />
如果使用Struts Menu 2.1，你还需要 Jakarta's Standard Tag Library JAR包放入你的WEB-INF/lib目录下。下载地址：<a href="http://ibiblio.org/maven/taglibs/jars/standard-1.0.4.jar"><a href="http://ibiblio.org/maven/taglibs/jars/standard-1.0.4.jar" target="_blank"><font color="#666666">http://ibiblio.org/maven/taglibs/jars/standard-1.0.4.jar</font></a></a>，这个文件包括例程WAR包文件和二进制发布包。<br />
1、放入struts-menu.jar包到你的应用程序的WEB-INF/lib目录中。<br />
2、在你的struts-config.xml文件中加入plug-in设置。<br />
<font style="background-color: #ffe000">&nbsp;&lt;plug-in className="net.sf.navigator.menu.MenuPlugIn"&gt;<br />
&nbsp;&nbsp; &lt;set-property property="menuConfig"<br />
&nbsp;&nbsp;&nbsp;&nbsp; value="/WEB-INF/menu-config.xml"/&gt;<br />
&nbsp;&lt;/plug-in&gt;</font><br />
3、你将需要在你的应用程序的/WEB-INF/menu-config.xml文件中定义你的菜单，这里提供一个简单的片断：<br />
<font style="background-color: #ffe000">&nbsp;&lt;Menu name="contactMenu" title="Contact" location="?Contact"&gt;<br />
&nbsp;&nbsp; &lt;Item name="email" title="E-Mail" location="?EMail"/&gt;<br />
&nbsp;&nbsp; &lt;Item name="phone" title="Phone" location="?Phone"/&gt;<br />
&nbsp;&lt;/Menu&gt;</font><br />
　　更多全面的例程，请查看应用程序的web/WEB-INF目录中的menu-config.xml文件，你可以截取一段作为你需要的菜单。完整的属性列表，可以查看MenuBase class's javadocs（<a href="http://struts-menu.sourceforge.net/apidocs/net/sf/navigator/menu/MenuBase.html"><a href="http://struts-menu.sourceforge.net/apidocs/net/sf/navigator/menu/MenuBase.html" target="_blank"><font color="#666666">http://struts-menu.source......avigator/menu/MenuBase.html</font></a></a>）。<br />
4、在你的JSP文件的顶部加入taglib声明：<br />
&nbsp;<font style="background-color: #ffe000">&lt;% at taglib uri="</font><a href="http://struts-menu%20dot%20sf.net/tag"><font style="background-color: #ffe000"><a href="http://struts-menu.sf.net/tag" target="_blank"><font color="#666666">http://struts-menu.sf.net/tag</font></a></font></a><font style="background-color: #ffe000">" prefix="menu" %&gt;</font><br />
5、在你的JSP文件中要放置菜单的位置加入taglib代码：<br />
<font style="background-color: #ffe000">&nbsp;&lt;menu:useMenuDisplayer name="TabbedMenu"<br />
&nbsp;&nbsp; bundle="org.apache.struts.action.MESSAGE"&gt;<br />
&nbsp;&nbsp; &lt;menu:displayMenu name="Home"/&gt;<br />
&nbsp;&nbsp; &lt;menu:displayMenu name="About"/&gt;<br />
&nbsp;&lt;/menu:useMenuDisplayer&gt;</font><br />
　　属性name="TabbedMenu"被定义在menu-config.xml文件的顶部：<br />
<font style="background-color: #ffe000">&nbsp;&lt;Displayer name="TabbedMenu"<br />
&nbsp;&nbsp; type="net.sf.navigator.displayer.TabbedMenuDisplayer"/&gt;</font></p>
<p><font style="background-color: #a0ff00">(译注：其实到此步即可在你的JSP文件中添加相应的菜单了，只不过是没有结合Velocity。在menu-config.xml文件的头部可以定义多个Displayer，每个Displayer都有name和type属性，name属性与JSP文件中menu:useMenuDisplayer标签的name属性相对应，即表明使用何种样式，具体的样式定义便在type属性中定义，type属性中是一个class。在menu-config.xml文件中的菜单定义中的name属性则与JSP文件中的menu:displayMenu标签的name属性相对应。)</font></p>
<p>使用定制的Velocity模版实施你的菜单，你需要整合Velocity到你的WEB应用程序中。如果需要这样做的话，请完成下面的步骤：<br />
1、确定你的menu-config.xml文件有&#8220;Velocity&#8221;的displayer定义：<br />
<font style="background-color: #ffe000">&nbsp;&lt;Displayer name="Velocity" <br />
&nbsp;&nbsp;&nbsp;&nbsp; type="net.sf.navigator.displayer.VelocityMenuDisplayer"/&gt;</font><br />
2、加入Velocity的JARs包到你的WEB-INF/lib目录中，下载velocity-1.4-rc1.jar（<a href="http://www.ibiblio.org/maven/velocity/jars/velocity-1.4-rc1.jar"><a href="http://www.ibiblio.org/maven/velocity/jars/velocity-1.4-rc1.jar" target="_blank"><font color="#666666">http://www.ibiblio.org/ma......y/jars/velocity-1.4-rc1.jar</font></a></a>）和velocity-tools-view-1.0.jar（<a href="http://www.ibiblio.org/maven/velocity-tools/jars/velocity-tools-view-1.0.jar"><a href="http://www.ibiblio.org/maven/velocity-tools/jars/velocity-tools-view-1.0.jar" target="_blank"><font color="#666666">http://www.ibiblio.org/ma......velocity-tools-view-1.0.jar</font></a></a>）。 <br />
3、加入globalMacros.vm（<a href="http://cvs.sourceforge.net/viewcvs.py/*checkout*/struts-menu/navigator/web/WEB-INF/classes/globalMacros.vm?content-type=text%2Fplain&amp;rev=1.1"><a href="http://cvs.sourceforge.net/viewcvs.py/" target="_blank"><font color="#666666">http://cvs.sourceforge.net/viewcvs.py/</font></a>*checkout*/struts-menu/navigator/web/WEB-INF/classes/globalMacros.vm?content-type=text%2Fplain&amp;rev=1.1</a>（右键另存为））到你的WEB-INF/lib目录中。<br />
4、改变你的JSP文件中displayer的值为&#8220;Velocity&#8221;，&#8220;config&#8221;属性指向一个文件（如config="/templates/tabs.html"）或者如果tabs.htm在你的WEB-INF/classes目录中的话，则可设config="tabs.html"。</p>
<p>这里提供了一些使用Velocity的displayer例子，可在sample application（<a href="http://demo.raibledesigns.com/struts-menu/index.jsp"><a href="http://demo.raibledesigns.com/struts-menu/index.jsp" target="_blank"><font color="#666666">http://demo.raibledesigns.com/struts-menu/index.jsp</font></a></a>）中查看。它总是在你的菜单需要的时候显示CSS，JavaScript和图像文件。下面有一些在当前的Struts Menu中用到的Velocity模版的例子的链接：<br />
&nbsp;CoolMenus: Demo（<a href="http://demo.raibledesigns.com/struts-menu/velocity-coolmenu4.jsp"><a href="http://demo.raibledesigns.com/struts-menu/velocity-coolmenu4.jsp" target="_blank"><font color="#666666">http://demo.raibledesigns......menu/velocity-coolmenu4.jsp</font></a></a>）, <br />
&nbsp;&nbsp;　 Template（<a href="http://struts-menu.sourceforge.net/templates/coolmenus.html"><a href="http://struts-menu.sourceforge.net/templates/coolmenus.html" target="_blank"><font color="#666666">http://struts-menu.sourceforge.net/templates/coolmenus.html</font></a></a>） <br />
&nbsp;NiceTabs: Demo, Template <br />
&nbsp;Tabs: Demo, Template <br />
&nbsp;XTree: Demo, Template </p>
<p>所有相关的有用的文件如果你需要的话都可以在下面的站点上下载：<br />
&nbsp;Images （<a href="http://struts-menu.sourceforge.net/menu-images/"><a href="http://struts-menu.sourceforge.net/menu-images/" target="_blank"><font color="#666666">http://struts-menu.sourceforge.net/menu-images/</font></a></a>）<br />
&nbsp;Stylesheets （<a href="http://struts-menu.sourceforge.net/styles/"><a href="http://struts-menu.sourceforge.net/styles/" target="_blank"><font color="#666666">http://struts-menu.sourceforge.net/styles/</font></a></a>）<br />
&nbsp;Scripts （<a href="http://struts-menu.sourceforge.net/scripts/"><a href="http://struts-menu.sourceforge.net/scripts/" target="_blank"><font color="#666666">http://struts-menu.sourceforge.net/scripts/</font></a></a>）<br />
&nbsp;Templates （<a href="http://struts-menu.sourceforge.net/templates/"><a href="http://struts-menu.sourceforge.net/templates/" target="_blank"><font color="#666666">http://struts-menu.sourceforge.net/templates/</font></a></a>）</p>
<p>更多的基于roles的显示/隐藏菜单的信息，请查看FAQs（<a href="http://struts-menu.sourceforge.net/faq.html"><a href="http://struts-menu.sourceforge.net/faq.html" target="_blank"><font color="#666666">http://struts-menu.sourceforge.net/faq.html</font></a></a>）。</p>
<p>四、在Struts之外使用Struts Menu:<br />
在2.2版中，Menu Repository能够使用MenuContextListener载入：<br />
<font style="background-color: #ffe000">&nbsp;&lt;!--<br />
&nbsp;&nbsp;&nbsp; - Loads the menu-config.xml for struts-menu at startup,<br />
&nbsp;&nbsp;&nbsp; - by default from "/WEB-INF/menu-config.xml".<br />
&nbsp;&nbsp;&nbsp; - To override this, add a context-param named "menuConfigLocation"<br />
&nbsp;&nbsp;&nbsp; - web.xml file.<br />
&nbsp;&nbsp;&nbsp; --&gt;<br />
&nbsp;&lt;listener&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;listener-class&gt;net.sf.navigator.menu.MenuContextListener&lt;/listener-class&gt;<br />
&nbsp;&lt;/listener&gt;</font></p>
<p>或者如果你使用Spring，甚至更容易。仅仅需要加入下面的部分到你的applicationContext.xml文件中：<br />
<font style="background-color: #ffe000">&nbsp;&lt;bean id="menu" class="net.sf.navigator.menu.MenuLoader"&gt;<br />
&nbsp;&nbsp; &lt;property name="menuConfig"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;/WEB-INF/menu-config.xml&lt;/value&gt;<br />
&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&lt;/bean&gt;<br />
&nbsp;&lt;!-- The menuConfig property is an optional attribute.&nbsp; It is set to<br />
&nbsp;&nbsp;&nbsp;&nbsp; /WEB-INF/menu-config.xml by default. --&gt;</font><br />
感谢Dan Luputan提供MenuLoader类的源代码。</p>
<p>五、从源文件编译：<br />
要从源文件编译这个项目，执行下面的步骤：<br />
1、下载并安装Maven（<a href="http://maven.apache.org/"><a href="http://maven.apache.org/" target="_blank"><font color="#666666">http://maven.apache.org/</font></a></a>）；<br />
2、创建一个环境变量MAVEN＿HOME指出你的Maven的安装目录，然后添加$MAVEN_HOME/bin到你的PATH变量中；<br />
3、操纵这个目录你可以扩展源代码，执行&#8220;maven.jar&#8221;创建target/struts-menu.jar。</p>
<p>要展开struts-menu例程，需要下面的步骤：<br />
1、下载和安装Tomcat；<br />
2、创建一个环境变量CATALINA＿HOME指出你的Tomcat的安装目录；<br />
3、执行&#8220;maven deploy&#8221;把应用程序展开到Tomcat中；<br />
4、打开<a href="http://localhost:8080/struts-menu"><a href="http://localhost:8080/struts-menu" target="_blank"><font color="#666666">http://localhost:8080/struts-menu</font></a></a>在你喜爱的浏览器中。</p>
<p>如果你喜欢使用Eclipse开发项目，请参考此份开发向导（<a href="http://struts-menu.sourceforge.net/devguide.html"><a href="http://struts-menu.sourceforge.net/devguide.html" target="_blank"><font color="#666666">http://struts-menu.sourceforge.net/devguide.html</font></a></a>）。 </p>
<img src ="http://www.blogjava.net/i369/aggbug/188258.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2008-03-24 15:31 <a href="http://www.blogjava.net/i369/articles/188258.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Strus 2的新表单标志的使用 [转]</title><link>http://www.blogjava.net/i369/articles/183622.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Tue, 04 Mar 2008 02:30:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/183622.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/183622.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/183622.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/183622.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/183622.html</trackback:ping><description><![CDATA[<div class="postTitle"><a class="postTitle2" id="viewpost1_TitleUrl" href="http://www.blogjava.net/max/archive/2007/05/18/118442.html">Strus 2的新表单标志的使用</a> </div>
<p>&nbsp;Struts 2为大家提供了不少常用的很酷的表单标志，简化了我们程序员的工作。不过，由于这些都是新标志，大家可能在使用上还存在不少疑问。本文将就朋友们的回复、留言或Email上的问题，分别对这些酷标志进行讲述。</p>
<h2>表单标志使用小技巧</h2>
<p>Struts 2的表单标志在输出（render）HTML时，使用了模板的概念，增加了复杂性（因为它不像Struts 1.x的表单标志，它通常都是一个标志对应HTML的一个元素），因此大家在使用时，需要一些技巧：</p>
<ol>
    <li>Struts 2的UI标志的表单标志默认是以表格布局，按钮是右对齐的。如果你不喜欢此风格，你可以简单地将&lt;s:form /&gt;标志的&#8220;theme&#8221;属性设为&#8220;simple&#8221;，然后用以往的做法自已布局表单元素（注意：此法有利有弊，弊就是当你将&#8220;theme&#8221;属性设为&#8220;simple&#8221;时，表单标志以最简单方式输出HTML，所以你可能失去一些默认输出提供的便利，如：友好的错误信息的显示，或客户端的表单验证等）。当然更好的做法是通过CSS或自定义主题（theme）然后应用到整个应用程序，这样可以获得一致的页面风格，加强用户体验（我会在以后的文章对此进行讲解）；
    <li>当你在页面上加入某些标志（如：&lt;s:doubleselect /&gt;等）时，应该通过action来访问页面，而不是通过*.jsp的URL直接访问。 </li>
</ol>
<p>下面我将分别对这些标志进行讲述：</p>
<h2>1、&lt;s:checkboxlist /&gt;</h2>
<p>大家对&lt;s:checkboxlist /&gt;的最大的疑问可能是：&#8220;如何在默认情况下，选中某些checkbox？&#8221;</p>
<p>答案其实很简单，只需要将其&#8220;value&#8221;属性设为你的要选中的值，如以代码所示：</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"><span style="color: #000000; background-color: #ffff00">&lt;%</span><span style="color: #000000; background-color: #f5f5f5">@ page language</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">java</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5"> contentType</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">text/html; charset=utf-8</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5"> pageEncoding</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">utf-8</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5"> </span><span style="color: #000000; background-color: #ffff00">%&gt;</span><span style="color: #000000"><br />
</span><span style="color: #000000; background-color: #ffff00">&lt;%</span><span style="color: #000000; background-color: #f5f5f5">@ taglib prefix</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">s</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5"> uri</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">/struts-tags</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5"> </span><span style="color: #000000; background-color: #ffff00">%&gt;</span><span style="color: #000000"><br />
<br />
</span><span style="color: #0000ff">&lt;!</span><span style="color: #ff00ff">DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">html </span><span style="color: #ff0000">xmlns</span><span style="color: #0000ff">="http://www.w3.org/1999/xhtml"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">Struts 2 Cool Tags - </span><span style="color: #ff0000">&amp;lt;</span><span style="color: #000000">s:checkboxlist/ </span><span style="color: #ff0000">&amp;gt;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:head </span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"> &nbsp; &nbsp;<br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">h2</span><span style="color: #0000ff">&gt;</span><span style="color: #ff0000">&amp;lt;</span><span style="color: #000000">s:checkboxlist/</span><span style="color: #ff0000">&amp;gt;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">h2</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:form </span><span style="color: #ff0000">action</span><span style="color: #0000ff">="Store"</span><span style="color: #ff0000"> </span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:checkboxlist </span><span style="color: #ff0000">name</span><span style="color: #0000ff">="skills1"</span><span style="color: #ff0000">&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; label</span><span style="color: #0000ff">="Skills 1"</span><span style="color: #ff0000">&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; list</span><span style="color: #0000ff">="{ 'Java', '.Net', 'RoR', 'PHP' }"</span><span style="color: #ff0000">&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; value</span><span style="color: #0000ff">="{ 'Java', '.Net' }"</span><span style="color: #ff0000"> </span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:checkboxlist </span><span style="color: #ff0000">name</span><span style="color: #0000ff">="skills2"</span><span style="color: #ff0000">&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; label</span><span style="color: #0000ff">="Skills 2"</span><span style="color: #ff0000">&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; list</span><span style="color: #0000ff">="#{ 1:'Java', 2: '.Net', 3: 'RoR', 4: 'PHP' }"</span><span style="color: #ff0000">&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; listKey</span><span style="color: #0000ff">="key"</span><span style="color: #ff0000">&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; listValue</span><span style="color: #0000ff">="value"</span><span style="color: #ff0000">&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; value</span><span style="color: #0000ff">="{ 1, 2, 3 }"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">s:form</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">html</span><span style="color: #0000ff">&gt;</span></div>
<span style="font-size: smaller; font-style: italic">清单1 WebContent/checkboxlist.jsp</span>
<p>分布运行应用程序，在浏览器中键入：<a href="http://localhost:8080/Struts2_CoolTags/checkboxlist.jsp">http://localhost:8080/Struts2_CoolTags/checkboxlist.jsp</a>，出现如下图所示页面：</p>
<p><img alt="checkboxlist.jsp页面" src="http://www.blogjava.net/images/blogjava_net/max/22548/r_checkboxlist.gif" /><br />
<span style="font-size: smaller; font-style: italic">清单2 checkboxlist.jsp页面</span></p>
<h2>2、&lt;s:doubleselect /&gt;</h2>
<p>大家看Struts 2的showcase的例子，&lt;s:doubleselect /&gt;的用法如下所示：</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"><span style="color: #000000">&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:doubleselect<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #ff0000">tooltip</span><span style="color: #0000ff">="Choose Your State"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; label</span><span style="color: #0000ff">="State"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; name</span><span style="color: #0000ff">="region"</span><span style="color: #ff0000"> list</span><span style="color: #0000ff">="{'North', 'South'}"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; value</span><span style="color: #0000ff">="'South'"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; doubleValue</span><span style="color: #0000ff">="'Florida'"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; doubleList</span><span style="color: #0000ff">="top == 'North' ? {'Oregon', 'Washington'} : {'Texas', 'Florida'}"</span><span style="color: #ff0000">&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; doubleName</span><span style="color: #0000ff">="state"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; headerKey</span><span style="color: #0000ff">="-1"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; headerValue</span><span style="color: #0000ff">="---------- Please Select ----------"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; emptyOption</span><span style="color: #0000ff">="true"</span><span style="color: #ff0000"> </span><span style="color: #0000ff">/&gt;</span></div>
<span style="font-size: smaller; font-style: italic">清单3 Showcase中&lt;s:doubleselect /&gt;</span>
<p>很多朋友问：&#8220;上面的&#8216;list&#8217;属性只有两个值，如果我有三个或更多的值，&#8216;doublelist&#8217;属性应该如何设定呢？&#8221;</p>
<p>我建议的做法是先定义一个Map类型的对象，键为&#8220;list&#8221;的集合，值则为&#8220;doubleList&#8221;的集合，然后&#8220;doubleList&#8221;的OGNL写成&#8220;#myMap[top]&#8221;，如以下代码所示：</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"><span style="color: #000000; background-color: #ffff00">&lt;%</span><span style="color: #000000; background-color: #f5f5f5">@ page language</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">java</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5"> contentType</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">text/html; charset=utf-8</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5"> pageEncoding</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">utf-8</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5"> </span><span style="color: #000000; background-color: #ffff00">%&gt;</span><span style="color: #000000"><br />
</span><span style="color: #000000; background-color: #ffff00">&lt;%</span><span style="color: #000000; background-color: #f5f5f5">@ taglib prefix</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">s</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5"> uri</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">/struts-tags</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5"> </span><span style="color: #000000; background-color: #ffff00">%&gt;</span><span style="color: #000000"><br />
<br />
</span><span style="color: #0000ff">&lt;!</span><span style="color: #ff00ff">DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">html </span><span style="color: #ff0000">xmlns</span><span style="color: #0000ff">="http://www.w3.org/1999/xhtml"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">Struts 2 Cool Tags - </span><span style="color: #ff0000">&amp;lt;</span><span style="color: #000000">s:doubeselect/ </span><span style="color: #ff0000">&amp;gt;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:head </span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"> &nbsp; &nbsp;<br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">h2</span><span style="color: #0000ff">&gt;</span><span style="color: #ff0000">&amp;lt;</span><span style="color: #000000">s:doubleselect/</span><span style="color: #ff0000">&amp;gt;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">h2</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:form </span><span style="color: #ff0000">action</span><span style="color: #0000ff">="Store"</span><span style="color: #ff0000"> </span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:set </span><span style="color: #ff0000">name</span><span style="color: #0000ff">="foobar"</span><span style="color: #ff0000">&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;value</span><span style="color: #0000ff">="#{'Java': {'Spring', 'Hibernate', 'Struts 2'}, '.Net': {'Linq', ' ASP.NET 2.0'}, 'Database': {'Oracle', 'SQL Server', 'DB2', 'MySQL'}}"</span><span style="color: #ff0000"> </span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:doubleselect </span><span style="color: #ff0000">list</span><span style="color: #0000ff">="#foobar.keySet()"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; doubleName</span><span style="color: #0000ff">="technology"</span><span style="color: #ff0000">&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; doubleList</span><span style="color: #0000ff">="#foobar[top]"</span><span style="color: #ff0000">&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; label</span><span style="color: #0000ff">="Technology"</span><span style="color: #ff0000"> </span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">s:form</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">html</span><span style="color: #0000ff">&gt;</span></div>
<span style="font-size: smaller; font-style: italic">清单4 WebContent/doubleselect.jsp</span>
<p>分布运行应用程序，在浏览器中键入：<a href="http://localhost:8080/Struts2_CoolTags/doubleselect.action">http://localhost:8080/Struts2_CoolTags/doubleselect.action</a>，出现如下图所示页面：</p>
<p><img alt="doubleselect.jsp页面" src="http://www.blogjava.net/images/blogjava_net/max/22548/r_doubleselect.gif" /><br />
<span style="font-size: smaller; font-style: italic">清单5 doubleselect.jsp页面</span></p>
<h2>3、&lt;s: token /&gt;</h2>
<p>这个标志可能大家不常用，不过本人认为它还是挺有用的。在使用Struts 1.x时，因为跳转通常是用Forward（而不是Redirect）实现的，所以当用户完成请求后，按&#8220;F5&#8221;刷新页面时，就会重新提交上次的请求，这样经常会出错。要解决这个问题，&lt;s:token /&gt;可以帮你忙。</p>
<h3>实现原理</h3>
<p>在页面加载时，&lt;s: token /&gt;产生一个GUID（Globally Unique Identifier，全局唯一标识符）值的隐藏输入框如：</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"><span style="color: #0000ff">&lt;</span><span style="color: #800000">input </span><span style="color: #ff0000">type</span><span style="color: #0000ff">="hidden"</span><span style="color: #ff0000"> name</span><span style="color: #0000ff">="struts.token.name"</span><span style="color: #ff0000"> value</span><span style="color: #0000ff">="struts.token"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">input </span><span style="color: #ff0000">type</span><span style="color: #0000ff">="hidden"</span><span style="color: #ff0000"> name</span><span style="color: #0000ff">="struts.token"</span><span style="color: #ff0000"> value</span><span style="color: #0000ff">="BXPNNDG6BB11ZXHPI4E106CZ5K7VNMHR"</span><span style="color: #0000ff">/&gt;</span></div>
<span style="font-size: smaller; font-style: italic">清单6 &lt;s:token /&gt;的HTML输出</span>
<p>同时，将GUID放到会话（session）中；在执行action之前，&#8220;token&#8221;拦截器将会话token与请求token比较，如果两者相同，则将会话中的token删除并往下执行，否则向actionErrors加入错误信息。如此一来，如果用户通过某种手段提交了两次相同的请求，两个token就会不同。</p>
<h3>具体实现</h3>
<p>首先看一下Action的代码：</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">package</span><span style="color: #000000"> tutorial;<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">import</span><span style="color: #000000"> com.opensymphony.xwork2.ActionSupport;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_115_471_Open_Image" onclick="this.style.display='none'; Codehighlighter1_115_471_Open_Text.style.display='none'; Codehighlighter1_115_471_Closed_Image.style.display='inline'; Codehighlighter1_115_471_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_115_471_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_115_471_Closed_Text.style.display='none'; Codehighlighter1_115_471_Open_Image.style.display='inline'; Codehighlighter1_115_471_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">class</span><span style="color: #000000"> CoolTagAction </span><span style="color: #0000ff">extends</span><span style="color: #000000"> ActionSupport </span><span id="Codehighlighter1_115_471_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_115_471_Open_Text"><span style="color: #000000">{ &nbsp; &nbsp;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /> &nbsp; &nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000"> </span><span style="color: #0000ff">static</span><span style="color: #000000"> </span><span style="color: #0000ff">final</span><span style="color: #000000"> </span><span style="color: #0000ff">long</span><span style="color: #000000"> serialVersionUID </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">6820659617470261780L</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /> &nbsp; &nbsp;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /> &nbsp; &nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000"> String message;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /> &nbsp; &nbsp; &nbsp; &nbsp;<br />
<img id="Codehighlighter1_244_265_Open_Image" onclick="this.style.display='none'; Codehighlighter1_244_265_Open_Text.style.display='none'; Codehighlighter1_244_265_Closed_Image.style.display='inline'; Codehighlighter1_244_265_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_244_265_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_244_265_Closed_Text.style.display='none'; Codehighlighter1_244_265_Open_Image.style.display='inline'; Codehighlighter1_244_265_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /> &nbsp; &nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000"> String getMessage() </span><span id="Codehighlighter1_244_265_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_244_265_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /> &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000"> message;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" /> &nbsp; &nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_308_337_Open_Image" onclick="this.style.display='none'; Codehighlighter1_308_337_Open_Text.style.display='none'; Codehighlighter1_308_337_Closed_Image.style.display='inline'; Codehighlighter1_308_337_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_308_337_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_308_337_Closed_Text.style.display='none'; Codehighlighter1_308_337_Open_Image.style.display='inline'; Codehighlighter1_308_337_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /> &nbsp; &nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> setMessage(String message) </span><span id="Codehighlighter1_308_337_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_308_337_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /> &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.message </span><span style="color: #000000">=</span><span style="color: #000000"> message;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" /> &nbsp; &nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /> &nbsp; &nbsp;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /> &nbsp; &nbsp;@Override<br />
<img id="Codehighlighter1_377_468_Open_Image" onclick="this.style.display='none'; Codehighlighter1_377_468_Open_Text.style.display='none'; Codehighlighter1_377_468_Closed_Image.style.display='inline'; Codehighlighter1_377_468_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_377_468_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_377_468_Closed_Text.style.display='none'; Codehighlighter1_377_468_Open_Image.style.display='inline'; Codehighlighter1_377_468_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /> &nbsp; &nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000"> String execute() </span><span id="Codehighlighter1_377_468_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_377_468_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /> &nbsp; &nbsp; &nbsp; &nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">Executing action, your message is </span><span style="color: #000000">"</span><span style="color: #000000"> </span><span style="color: #000000">+</span><span style="color: #000000"> message);<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /> &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000"> SUCCESS;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" /> &nbsp; &nbsp;}</span></span><span style="color: #000000"> &nbsp; &nbsp;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<span style="font-size: smaller; font-style: italic">清单7 src/tutorial/CoolTagAction.java</span>
<p>以上代码一目了然，再看看JSP的写法：</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"><span style="color: #000000">%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %&gt;<br />
</span><span style="color: #000000; background-color: #ffff00">&lt;%</span><span style="color: #000000; background-color: #f5f5f5">@ taglib prefix</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">s</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5"> uri</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">/struts-tags</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5"> </span><span style="color: #000000; background-color: #ffff00">%&gt;</span><span style="color: #000000"><br />
<br />
</span><span style="color: #0000ff">&lt;!</span><span style="color: #ff00ff">DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">html </span><span style="color: #ff0000">xmlns</span><span style="color: #0000ff">="http://www.w3.org/1999/xhtml"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">Struts 2 Cool Tags - </span><span style="color: #ff0000">&amp;lt;</span><span style="color: #000000">s:token/ </span><span style="color: #ff0000">&amp;gt;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:head </span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"> &nbsp; &nbsp;<br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">h2</span><span style="color: #0000ff">&gt;</span><span style="color: #ff0000">&amp;lt;</span><span style="color: #000000">s:token/</span><span style="color: #ff0000">&amp;gt;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">h2</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:actionerror </span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:form </span><span style="color: #ff0000">action</span><span style="color: #0000ff">="Token"</span><span style="color: #ff0000"> </span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:textfield </span><span style="color: #ff0000">name</span><span style="color: #0000ff">="message"</span><span style="color: #ff0000"> label</span><span style="color: #0000ff">="Message"</span><span style="color: #ff0000"> </span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:token </span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:submit </span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">s:form</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">html</span><span style="color: #0000ff">&gt;</span></div>
<span style="font-size: smaller; font-style: italic">清单8 WebContent/token.jsp</span>
<p>JSP也很简单，就是加入&lt;s:token /&gt;标志。接下来是Actoin配置的XML片段：</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"><span style="color: #0000ff">&lt;?</span><span style="color: #ff00ff">xml version="1.0" encoding="UTF-8"</span><span style="color: #0000ff">?&gt;</span><span style="color: #000000"><br />
<br />
</span><span style="color: #0000ff">&lt;!</span><span style="color: #ff00ff">DOCTYPE struts PUBLIC<br />
&nbsp; &nbsp; "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"<br />
&nbsp; &nbsp; "http://struts.apache.org/dtds/struts-2.0.dtd"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">struts</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">package </span><span style="color: #ff0000">name</span><span style="color: #0000ff">="Struts2_COOL_TAGS_DEMO"</span><span style="color: #ff0000"> extends</span><span style="color: #0000ff">="struts-default"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">action </span><span style="color: #ff0000">name</span><span style="color: #0000ff">="Token"</span><span style="color: #ff0000"> class</span><span style="color: #0000ff">="tutorial.CoolTagAction"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">interceptor-ref </span><span style="color: #ff0000">name</span><span style="color: #0000ff">="defaultStack"</span><span style="color: #ff0000"> </span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">interceptor-ref </span><span style="color: #ff0000">name</span><span style="color: #0000ff">="token"</span><span style="color: #ff0000"> </span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">result </span><span style="color: #ff0000">name</span><span style="color: #0000ff">="invalid.token"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/token.jsp</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">result</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">result</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/token.jsp</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">result</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">action</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">action </span><span style="color: #ff0000">name</span><span style="color: #0000ff">="*"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">result</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/{1}.jsp</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">result</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">action</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">package</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">struts</span><span style="color: #0000ff">&gt;</span></div>
<span style="font-size: smaller; font-style: italic">清单9 src/struts.xml</span>
<p>以上XML片段值注意的是加入了&#8220;token&#8221;拦截器和&#8220;invalid.token&#8221;结果，因为&#8220;token&#8221;拦截器在会话token与请求token不一致时，将会直接返回&#8220;invalid.token&#8221;结果。</p>
<p>发布运行应用程序，在浏览器中键入：<a href="http://localhost:8080/Struts2_CoolTags/token.jsp">http://localhost:8080/Struts2_CoolTags/token.jsp</a>，出现如下图所示页面：</p>
<p><img alt="正常显示的token.jsp页面" src="http://www.blogjava.net/images/blogjava_net/max/22548/r_token1.gif" /><br />
<span style="font-size: smaller; font-style: italic">清单10 正常显示的token.jsp页面</span></p>
<p>随便填点东西并提交页面，一切正常返回以上页面，然后按&#8220;F5&#8221;刷新页面，在弹出的对话框中点击&#8220;Retry&#8221;，出现如下图所示页面：</p>
<p><img alt="重复提交出错显示" src="http://www.blogjava.net/images/blogjava_net/max/22548/r_token2.gif" /><br />
<span style="font-size: smaller; font-style: italic">清单11 重复提交出错显示</span></p>
<h2>4、&lt;s:datetimepicker /&gt;、&lt;s:optiontransferselect /&gt;和&lt;s:updownselect /&gt;</h2>
<p>这几个标志的使用相对简单，所以我想小举一例即可，以下是JSP的代码：</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"><span style="color: #0000ff">&lt;!</span><span style="color: #ff00ff">DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">html </span><span style="color: #ff0000">xmlns</span><span style="color: #0000ff">="http://www.w3.org/1999/xhtml"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">Struts 2 Cool Tags - Others</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">title</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:head </span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">head</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"> &nbsp; &nbsp;<br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">h2</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">Others</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">h2</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:form </span><span style="color: #ff0000">action</span><span style="color: #0000ff">="Store"</span><span style="color: #ff0000"> </span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:datetimepicker </span><span style="color: #ff0000">name</span><span style="color: #0000ff">="birthday"</span><span style="color: #ff0000"> label</span><span style="color: #0000ff">="Birthday"</span><span style="color: #ff0000"> </span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:updownselect<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #ff0000">label </span><span style="color: #0000ff">= "Favourite Countries"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; list</span><span style="color: #0000ff">="#{'england':'England', 'america':'America', 'germany':'Germany'}"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; name</span><span style="color: #0000ff">="prioritisedFavouriteCountries"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; headerKey</span><span style="color: #0000ff">="-1"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; headerValue</span><span style="color: #0000ff">="--- Please Order Them Accordingly ---"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; emptyOption</span><span style="color: #0000ff">="true"</span><span style="color: #ff0000"> </span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #0000ff">&lt;</span><span style="color: #800000">s:optiontransferselect &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span><span style="color: #ff0000">label</span><span style="color: #0000ff">="Favourite Cartoons Characters"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; name</span><span style="color: #0000ff">="leftSideCartoonCharacters"</span><span style="color: #ff0000">&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; leftTitle</span><span style="color: #0000ff">="Left Title"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; rightTitle</span><span style="color: #0000ff">="Right Title"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; list</span><span style="color: #0000ff">="{'Popeye', 'He-Man', 'Spiderman'}"</span><span style="color: #ff0000">&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; multiple</span><span style="color: #0000ff">="true"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; headerKey</span><span style="color: #0000ff">="headerKey"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; headerValue</span><span style="color: #0000ff">="--- Please Select ---"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; emptyOption</span><span style="color: #0000ff">="true"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; doubleList</span><span style="color: #0000ff">="{'Superman', 'Mickey Mouse', 'Donald Duck'}"</span><span style="color: #ff0000">&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; doubleName</span><span style="color: #0000ff">="rightSideCartoonCharacters"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; doubleHeaderKey</span><span style="color: #0000ff">="doubleHeaderKey"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; doubleHeaderValue</span><span style="color: #0000ff">="--- Please Select ---"</span><span style="color: #ff0000">&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; doubleEmptyOption</span><span style="color: #0000ff">="true"</span><span style="color: #ff0000"><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; doubleMultiple</span><span style="color: #0000ff">="true"</span><span style="color: #ff0000"> </span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
&nbsp; &nbsp; </span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">s:form</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">body</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">html</span><span style="color: #0000ff">&gt;</span></div>
<span style="font-size: smaller; font-style: italic">清单12 WebContent\others.jsp页面</span>
<p>发布运行应用程序，在浏览器中键入：<a href="http://localhost:8080/Struts2_CoolTags/others.jsp">http://localhost:8080/Struts2_CoolTags/others.jsp</a>，出现如下图所示页面：</p>
<p><a href="http://www.blogjava.net/images/blogjava_net/max/22548/o_others.gif"><img alt="点击查看大图" src="http://www.blogjava.net/images/blogjava_net/max/22548/r_others.gif" /></a><br />
<span style="font-size: smaller; font-style: italic">清单13 其它表单标志页面</span></p>
<h2>总结</h2>
<p>Struts 2在标志上的确比Struts 1.x丰富了许多，同时模板机制也给程序员带来不少方便（如果你不太喜欢个性化的风格）。另外，Struts 2还有一些AJAX（如<a title="autocompleter" href="http://www.blogjava.net/max/admin/autocompleter.html">&lt;s: autocompleter /&gt;</a>等）的标志和非表单的UI标志（如<a href="http://cwiki.apache.org/WW/tree.html">&lt;s: tree /&gt;</a>等），我会在以后的文章中讲述其使用。</p>
<br />
原作者:http://www.blogjava.net/max/archive/2007/05/18/118442.html
<img src ="http://www.blogjava.net/i369/aggbug/183622.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2008-03-04 10:30 <a href="http://www.blogjava.net/i369/articles/183622.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转换器（Converter）——Struts 2.0中的魔术师(Struts2中数据批量保存)[转别人的]</title><link>http://www.blogjava.net/i369/articles/183607.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Tue, 04 Mar 2008 01:25:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/183607.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/183607.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/183607.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/183607.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/183607.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 转换器（Converter）——Struts 2.0中的魔术师 在我已往的Struts 1.x项目经验中，有个问题不时的出现——在创建FormBean时，对于某个属性到底应该用String还是其它类型？开发Web应用程序与开发传统桌面应用程序不同，Web应用程序实际上是分布个不同的主机（当然也可以同一个主机，不过比较少见）上的两个进程之间互交。这种互交建立在HTTP之上，它们互相传递是都是...&nbsp;&nbsp;<a href='http://www.blogjava.net/i369/articles/183607.html'>阅读全文</a><img src ="http://www.blogjava.net/i369/aggbug/183607.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2008-03-04 09:25 <a href="http://www.blogjava.net/i369/articles/183607.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts 1.x中批量封装对象</title><link>http://www.blogjava.net/i369/articles/183603.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Tue, 04 Mar 2008 01:19:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/183603.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/183603.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/183603.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/183603.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/183603.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Struts 1.x中批量封装对象 在我早前的文章《转换器（Converter）——Struts 2.0中的魔术师》（以下简称为《转》）中，提及在Struts 1.x中实现批量封装对象，并不是一件容易的事，这需要一些技巧。昨天，有一位同事又和我讨论起这个问题，所以鉴于此场景（scenario）较为普遍，我决定写一篇有关的文章。 应用场景本文使用《转》中的最后一个例子作为应用场景，即是批...&nbsp;&nbsp;<a href='http://www.blogjava.net/i369/articles/183603.html'>阅读全文</a><img src ="http://www.blogjava.net/i369/aggbug/183603.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2008-03-04 09:19 <a href="http://www.blogjava.net/i369/articles/183603.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts2 strus.xml中result类型及含义</title><link>http://www.blogjava.net/i369/articles/169286.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Fri, 21 Dec 2007 05:04:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/169286.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/169286.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/169286.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/169286.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/169286.html</trackback:ping><description><![CDATA[<p style="text-indent: 2em">一个提交到服务器的处理通常可以分为两个阶段，第一个阶段查询服务器状态（查询或者更新数据库），第二个阶段选择一个合适的结果页面其返回给用户（这里要讲的Result的内容）。</p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">Struts2提供了对不同种类返回结果的支持，常见的有JSP，FreeMarker，Velocity等。</p>
<p style="text-indent: 2em">Struts2支持的不同类型的返回结果为：</p>
<p style="text-indent: 2em">
<table cellspacing="0" cellpadding="0" border="1">
    <tbody>
        <tr>
            <td valign="top" width="210">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">名字</p>
            </td>
            <td valign="top" width="366">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">说明</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="210">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">Chain Result</p>
            </td>
            <td valign="top" width="366">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">用来处理Action链</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="210">
            <p style="text-indent: 2em">Dispatcher Result</p>
            </td>
            <td valign="top" width="366">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">用来转向页面，通常处理JSP</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="210">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">FreeMarker Result</p>
            </td>
            <td valign="top" width="366">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">处理FreeMarker模板</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="210">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">HttpHeader Result</p>
            </td>
            <td valign="top" width="366">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">用来控制特殊的Http行为</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="210">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">Redirect Result</p>
            </td>
            <td valign="top" width="366">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">重定向到一个URL</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="210">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">Redirect Action Result</p>
            </td>
            <td valign="top" width="366">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">重定向到一个Action</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="210">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">&nbsp;Stream Result</p>
            </td>
            <td valign="top" width="366">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">向浏览器发送InputSream对象，通常用来处理文件下载</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="210">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">Velocity Result</p>
            </td>
            <td valign="top" width="366">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">处理Velocity模板</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="210">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">XLS Result</p>
            </td>
            <td valign="top" width="366">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">处理XML/XLST模板</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="210">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">PlainText Result</p>
            </td>
            <td valign="top" width="366">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">显示原始文件内容，例如文件源代码</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="210">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">S2PLUGINS:Tiles Result</p>
            </td>
            <td valign="top" width="366">
            <p>&nbsp;</p>
            <p style="text-indent: 2em">结合Tile使用</p>
            </td>
        </tr>
    </tbody>
</table>
</p>
<p style="text-indent: 2em">另外第三方的Result类型还包括JasperReports Plugin，专门用来处理JasperReport类型的报表输出。</p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">在struts-default.xml文件中已经有了对于所有类型Result的定义：</p>
<p style="text-indent: 2em">&lt;result-types&gt;</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; &lt;result-type name="chain" </p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="com.opensymphony.xwork2.ActionChainResult"/&gt;</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; &lt;result-type name="dispatcher" </p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="org.apache.struts2.dispatcher.ServletDispatcherResult" </p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; default="true"/&gt;</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; &lt;result-type name="freemarker" </p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="org.apache.struts2.views.freemarker.FreemarkerResult"/&gt;</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; &lt;result-type name="httpheader" </p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="org.apache.struts2.dispatcher.HttpHeaderResult"/&gt;</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; &lt;result-type name="redirect" </p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="org.apache.struts2.dispatcher.ServletRedirectResult"/&gt;</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; &lt;result-type name="redirectAction" </p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="org.apache.struts2.dispatcher.ServletActionRedirectResult"/&gt;</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; &lt;result-type name="stream" </p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="org.apache.struts2.dispatcher.StreamResult"/&gt;</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; &lt;result-type name="velocity" </p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="org.apache.struts2.dispatcher.VelocityResult"/&gt;</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; &lt;result-type name="xslt" </p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="org.apache.struts2.views.xslt.XSLTResult"/&gt;</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; &lt;result-type name="plainText" </p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="org.apache.struts2.dispatcher.PlainTextResult" /&gt;</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; &lt;!-- Deprecated name form scheduled for removal in Struts 2.1.0. </p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The camelCase versions are preferred. See ww-1707 --&gt;</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; &lt;result-type name="redirect-action" </p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="org.apache.struts2.dispatcher.ServletActionRedirectResult"/&gt;</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; &lt;result-type name="plaintext" </p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="org.apache.struts2.dispatcher.PlainTextResult" /&gt;</p>
<p style="text-indent: 2em">&lt;/result-types&gt;</p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">从上述代码中可以看出在不指定Result类型的时候使用dispatcher类型。</p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">定义一个Result值，</p>
<p style="text-indent: 2em">&lt;result name="success" type="dispatcher"&gt;</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; &lt;param name="location"&gt;/ThankYou.jsp&lt;/param&gt;</p>
<p style="text-indent: 2em">&lt;/result&gt;</p>
<p style="text-indent: 2em">由于type默认值是dispatcher，所以这里不需要定义，另外name的默认值为success所以这里也不需要定义。</p>
<p style="text-indent: 2em">上述代码可以简写为：</p>
<p style="text-indent: 2em">&lt;result&gt;</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; &lt;param name="location"&gt;/ThankYou.jsp&lt;/param&gt;</p>
<p style="text-indent: 2em">&lt;/result&gt;</p>
<p style="text-indent: 2em">另外location参数也可以直接卸载result标签内部，所以上述代码的最简单的写法为：</p>
<p style="text-indent: 2em">&lt;result&gt;/ThankYou.jsp&lt;/result&gt;</p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">我们也可以定义多个不同的Result</p>
<p style="text-indent: 2em">&lt;action name="Hello"&gt;</p>
<p style="text-indent: 2em">&nbsp;&lt;result&gt;/hello/Result.jsp&lt;/result&gt;</p>
<p style="text-indent: 2em">&nbsp;&lt;result name="error"&gt;/hello/Error.jsp&lt;/result&gt;</p>
<p style="text-indent: 2em">&nbsp;&lt;result name="input"&gt;/hello/Input.jsp&lt;/result&gt;</p>
<p style="text-indent: 2em">&lt;/action&gt;</p>
<p style="text-indent: 2em">上述代码的含义为，名字为Hello的Action有三个返回结果，并且都是dispatcher类型（默认类型），这三个返回值的名字分别为success（默认值），error，input，对应的页面的路径分别为/hello/Result.jsp，/hello/Error.jsp，/hello/Input.jsp。</p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">有些时候我们需要一个定义在全局的Result，这个时候我们可以在package内部定义全局的Result，例如：</p>
<p style="text-indent: 2em">&lt;global-results&gt;</p>
<p style="text-indent: 2em">&nbsp;&lt;result name="error"&gt;/Error.jsp&lt;/result&gt;</p>
<p style="text-indent: 2em">&nbsp;&lt;result name="invalid.token"&gt;/Error.jsp&lt;/result&gt;</p>
<p style="text-indent: 2em">&nbsp;&lt;result name="login" type="redirect-action"&gt;Logon!input&lt;/result&gt;</p>
<p style="text-indent: 2em">&lt;/global-results&gt;</p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">动态返回结果</p>
<p style="text-indent: 2em">有些时候，只有当Action执行完璧的时候我们才知道要返回哪个结果，这个时候我们可以在Action内部定义一个属性，这个属性用来存储Action执行完璧之后的Result值，例如：</p>
<p style="text-indent: 2em">private String nextAction;&nbsp;</p>
<p style="text-indent: 2em">public String getNextAction() {</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp; return nextAction;</p>
<p style="text-indent: 2em">}</p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">在strutx.xml配置文件中，我们可以使用${nextAction}来引用到Action中的属性，通过${nextAction}表示的内容来动态的返回结果，例如：</p>
<p style="text-indent: 2em">&lt;action name="fragment" class="FragmentAction"&gt;</p>
<p style="text-indent: 2em">&nbsp;&lt;result name="next" type="redirect-action"&gt;${nextAction}&lt;/result&gt;</p>
<p style="text-indent: 2em">&lt;/action&gt;</p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">上述Action的execute方法返回next的时候，还需要根据nextAction的属性来判断具体定位到哪个Action。</p>
<p style="text-indent: 2em">&nbsp;</p>
<p style="text-indent: 2em">在strutx.xml配置文件中，我们可以使用method=""来设置调用类的哪个方法，这样就可以在一个JAVA类中使用不同的方法来实现不同的功能,就无需每个功能写一类了,例如：</p>
<p style="text-indent: 2em">&lt;action name="fragment" class="FragmentAction" method="add"&gt;</p>
<p style="text-indent: 2em">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result&gt;/success.jsp&lt;/result&gt;</p>
<p style="text-indent: 2em">&lt;/action&gt;</p>
<img src ="http://www.blogjava.net/i369/aggbug/169286.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-12-21 13:04 <a href="http://www.blogjava.net/i369/articles/169286.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2拦截器的使用 (详解)</title><link>http://www.blogjava.net/i369/articles/162407.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Thu, 22 Nov 2007 08:58:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/162407.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/162407.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/162407.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/162407.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/162407.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 如何使用struts2拦截器，或者自定义拦截器。特别注意，在使用拦截器的时候，在Action里面必须最后一定要引用struts2自带的拦截器缺省堆栈defaultStack,如下(这里我是引用了struts2自带的checkbox拦截器)：&lt;interceptor-ref name="checkbox"&gt;&nbsp; &lt;param name="uncheckedValue...&nbsp;&nbsp;<a href='http://www.blogjava.net/i369/articles/162407.html'>阅读全文</a><img src ="http://www.blogjava.net/i369/aggbug/162407.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-11-22 16:58 <a href="http://www.blogjava.net/i369/articles/162407.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts 2中的OGNL [转]</title><link>http://www.blogjava.net/i369/articles/162409.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Thu, 22 Nov 2007 08:58:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/162409.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/162409.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/162409.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/162409.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/162409.html</trackback:ping><description><![CDATA[<p>Struts 2中的OGNL <br />
本人是一个EL（Expression Language，以下译为表达式语言）的支持者。因为我对&lt;% %&gt;写法极为反感，忘记了在那本书上看到的一句话——&#8220;使用标志（Tag）的一个目的就是避免在JSP页面中出现过多的&lt;%%&gt;的语句，使页面与后台代码分离。&#8221;</p>
<p>表达式语言主要有以下几大好处：</p>
<p>避免(MyType) request.getAttribute()和myBean.getMyProperty()之类的语句，使页面更简洁； <br />
支持运算符（如+-*/），比普通的标志具有更高的自由度和更强的功能； <br />
简单明了地表达代码逻辑，使用代码更可读与便于维护。 <br />
Struts 2中的表达式语言<br />
Struts 2支持以下几种表达式语言：</p>
<p>OGNL（Object-Graph Navigation Language），可以方便地操作对象属性的开源表达式语言； <br />
JSTL（JSP Standard Tag Library），JSP 2.0集成的标准的表达式语言； <br />
Groovy，基于Java平台的动态语言，它具有时下比较流行的动态语言（如Python、Ruby和Smarttalk等）的一些起特性； <br />
Velocity，严格来说不是表达式语言，它是一种基于Java的模板匹配引擎，具说其性能要比JSP好。 <br />
Struts 2默认的表达式语言是OGNL，原因是它相对其它表达式语言具有下面几大优势：</p>
<p>支持对象方法调用，如xxx.doSomeSpecial()； <br />
支持类静态的方法调用和值访问，表达式的格式为@[类全名（包括包路径）]@[方法名 |&nbsp;&nbsp; 值名]，例如：@java.lang.String@format('foo %s', 'bar')或@tutorial.MyConstant@APP_NAME； <br />
支持赋值操作和表达式串联，如price=100, discount=0.8, calculatePrice()，这个表达式会返回80； <br />
访问OGNL上下文（OGNL context）和ActionContext； <br />
操作集合对象。 <br />
OGNL的用法<br />
OGNL是通常要结合Struts 2的标志一起使用，如&lt;s:property value="xx" /&gt;等。大家经常遇到的问题是#、%和$这三个符号的使用。下面我想通过例子讲述这个问题：</p>
<p>首先新建名为Struts2_OGNL的Web工程，配置开发环境。之前很多朋友在使用Struts 2的过程中都遇到乱码问题。当然乱码问题由来已久，而且涉及多方面的知识，所以并非三言两语可以说明白，而且互联网上也已经有很多这方便的文章，大家可以Google一下。不过，如果你在开发的过程，多注意一下，避免乱码问题也不难。乱码多数是由于编码与解码所使用的方式不同造成的，所以我建议大家将编码方式都设为&#8220;utf-8&#8221;，如&lt;%@&nbsp;&nbsp; page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %&gt;。另外，在配置web.xml时使用ActionContextCleanUp过滤器（Filter），如下面代码所示：</p>
<p>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;web-app id="WebApp_9" version="2.4"<br />
&nbsp;&nbsp;&nbsp;&nbsp; xmlns="<a href="http://java.sun.com/xml/ns/j2ee">http://java.sun.com/xml/ns/j2ee</a>"<br />
&nbsp;&nbsp;&nbsp;&nbsp; xmlns:xsi="<a href="http://www.w3.org/2001/XMLSchema-instance">http://www.w3.org/2001/XMLSchema-instance</a>"<br />
&nbsp;&nbsp;&nbsp;&nbsp; xsi:schemaLocation="<a href="http://java.sun.com/xml/ns/j2ee">http://java.sun.com/xml/ns/j2ee</a> <a href="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd</a>"&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; &lt;display-name&gt;Struts 2 OGNL&lt;/display-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-name&gt;struts-cleanup&lt;/filter-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-class&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.apache.struts2.dispatcher.ActionContextCleanUp<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/filter-class&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/filter&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-mapping&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-name&gt;struts-cleanup&lt;/filter-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/filter-mapping&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-name&gt;struts2&lt;/filter-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-class&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.apache.struts2.dispatcher.FilterDispatcher<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/filter-class&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/filter&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-mapping&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;filter-name&gt;struts2&lt;/filter-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/filter-mapping&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; &lt;welcome-file-list&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;welcome-file&gt;index.html&lt;/welcome-file&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/welcome-file-list&gt;</p>
<p>&lt;/web-app&gt;清单1 WebContent/WEB-INF/web.xml <br />
&#8220;#&#8221;主要有三种用途：</p>
<p>访问OGNL上下文和Action上下文，#相当于ActionContext.getContext()；下表有几个ActionContext中有用的属性：&nbsp;&nbsp; 名称 作用 例子 <br />
parameters 包含当前HTTP请求参数的Map #parameters.id[0]作用相当于request.getParameter("id") <br />
request 包含当前HttpServletRequest的属性（attribute)的Map #request.userName相当于request.getAttribute("userName") <br />
session 包含当前HttpSession的属性（attribute）的Map #session.userName相当于session.getAttribute("userName") <br />
application 包含当前应用的ServletContext的属性（attribute）的Map #application.userName相当于application.getAttribute("userName") <br />
attr 用于按request &gt; session &gt; application顺序访问其属性（attribute） #attr.userName相当于按顺序在以上三个范围（scope）内读取userName属性，直到找到为止 </p>
<p>用于过滤和投影（projecting)集合，如books.{?#this.price&lt;100}； <br />
构造Map，如#{'foo1':'bar1', 'foo2':'bar2'}。 <br />
下面让我们它们的具体写法，首先是Action类代码：</p>
<p>package tutorial.action;</p>
<p>import java.util.LinkedList;<br />
import java.util.List;<br />
import java.util.Map;</p>
<p>import javax.servlet.ServletContext;<br />
import javax.servlet.http.HttpServletRequest;</p>
<p>import org.apache.struts2.interceptor.ServletRequestAware;<br />
import org.apache.struts2.interceptor.SessionAware;<br />
import org.apache.struts2.util.ServletContextAware;</p>
<p>import tutorial.model.Book;</p>
<p>import com.opensymphony.xwork2.ActionSupport;</p>
<p>public class OgnlAction extends ActionSupport implements ServletRequestAware, SessionAware, ServletContextAware&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp; private static final long serialVersionUID = 1L;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; private HttpServletRequest request;<br />
&nbsp;&nbsp;&nbsp;&nbsp; private Map&lt;String, String&gt; session;<br />
&nbsp;&nbsp;&nbsp;&nbsp; private ServletContext application;<br />
&nbsp;&nbsp;&nbsp;&nbsp; private List&lt;Book&gt; books;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void setServletRequest(HttpServletRequest request) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.request = request;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; @SuppressWarnings("unchecked")<br />
&nbsp;&nbsp;&nbsp;&nbsp; public void setSession(Map session) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.session = session;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; public void setServletContext(ServletContext application) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.application = application;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; public List&lt;Book&gt; getBooks() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return books;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; @Override<br />
&nbsp;&nbsp;&nbsp;&nbsp; public String execute() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; request.setAttribute("userName", "Max From request");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; session.put("userName", "Max From session");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; application.setAttribute("userName", "Max From application");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; books = new LinkedList&lt;Book&gt;();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; books.add(new Book("978-0735619678", "Code Complete, Second Edition", 32.99));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; books.add(new Book("978-0596007867", "The Art of Project Management", 35.96));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; books.add(new Book("978-0201633610", "Design Patterns: Elements of Reusable Object-Oriented Software", 43.19));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; books.add(new Book("978-0596527341", "Information Architecture for the World Wide Web: Designing Large-Scale Web Sites", 25.19));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; books.add(new Book("978-0735605350", "Software Estimation: Demystifying the Black Art", 25.19));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return SUCCESS;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
}清单2 src/tutorial/action/OgnlAction.java </p>
<p>以上代码分别在request、session和application的范围内添加&#8220;userName&#8221;属性，然后再在JSP页面使用OGNL将其取回。我还创建了Book对象的列表用于演示&#8220;用于过滤和投影（projecting)集合&#8221;的功能，至于Book的代码大家可以在我前一文章《在Struts 2中实现CRUD》看到。</p>
<p>下面是Ognl.jsp的代码，内容如下：</p>
<p>&lt;%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %&gt;<br />
&lt;%@ taglib prefix="s" uri="/struts-tags" %&gt;</p>
<p>&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "<a href="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd</a>"&gt;<br />
&lt;html xmlns="<a href="http://www.w3.org/1999/xhtml">http://www.w3.org/1999/xhtml</a>"&gt;<br />
&lt;head&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;title&gt;Struts OGNL Demo&lt;/title&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;h3&gt;访问OGNL上下文和Action上下文&lt;/h3&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;p&gt;parameters: &lt;s:property value="#parameters.userName" /&gt;&lt;/p&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;p&gt;request.userName: &lt;s:property value="#request.userName" /&gt;&lt;/p&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;p&gt;session.userName: &lt;s:property value="#session.userName" /&gt;&lt;/p&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;p&gt;application.userName: &lt;s:property value="#application.userName" /&gt;&lt;/p&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;p&gt;attr.userName: &lt;s:property value="#attr.userName" /&gt;&lt;/p&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;hr /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;h3&gt;用于过滤和投影（projecting)集合&lt;/h3&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;p&gt;Books more than $35&lt;/p&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;ul&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;s:iterator value="books.{?#this.price &gt; 35}"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;li&gt;&lt;s:property value="title" /&gt; - $&lt;s:property value="price" /&gt;&lt;/li&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/s:iterator&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/ul&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;p&gt;The price of "Code Complete, Second Edition" is: &lt;s:property value="books.{?#this.title=='Code Complete, Second Edition'}.{price}[0]"/&gt;&lt;/p&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;hr /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;h3&gt;构造Map&lt;/h3&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;s:set name="foobar" value="#{'foo1':'bar1', 'foo2':'bar2'}" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;p&gt;The value of key "foo1" is &lt;s:property value="#foobar['foo1']" /&gt;&lt;/p&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;清单3 WebContent/Ognl.jsp <br />
以上代码值得注意的是&#8220;&lt;s:property value="books.{?#this.title=='Code Complete, Second Edition'}.{price}[0]"/&gt;&#8221;，因为&#8220;books.{?#this.title=='Code Complete, Second Edition'}.{price}&#8221;返回的值是集合类型，所以要用&#8220;[索引]&#8221;来访问其值。</p>
<p>最后是Struts 2的配置文件struts.xml，内容如下：</p>
<p>&lt;?xml version="1.0" encoding="UTF-8"?&gt;</p>
<p>&lt;!DOCTYPE struts PUBLIC<br />
&nbsp;&nbsp;&nbsp;&nbsp; "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"<br />
&nbsp;&nbsp;&nbsp;&nbsp; "<a href="http://struts.apache.org/dtds/struts-2.0.dtd">http://struts.apache.org/dtds/struts-2.0.dtd</a>"&gt;</p>
<p>&lt;struts&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;constant name="struts.devMode" value="true" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;package name="Struts2_OGNL_DEMO" extends="struts-default"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;action name="Ognl" class="tutorial.action.OgnlAction"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;result&gt;/Ognl.jsp&lt;/result&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/action&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/package&gt;<br />
&lt;/struts&gt;清单4 src/struts.xml </p>
<p>发布运行应用程序，结果如下所示：</p>
<div forimg="1"><img class="blogimg" src="http://hiphotos.baidu.com/%B3%BF%D1%F4%C2%FE%B2%BD/pic/item/e5feecec2b06392d62d09f26.jpg" border="0" small="0"  alt="" /></div>
<p><br />
清单5 示例运行结果1</p>
<p>&#8220;%&#8221;符号的用途是在标志的属性为字符串类型时，计算OGNL表达式的值。例如在Ognl.jsp中加入以下代码：</p>
<p>&lt;hr /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;h3&gt;%的用途&lt;/h3&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;p&gt;&lt;s:url value="#foobar['foo1']" /&gt;&lt;/p&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; &lt;p&gt;&lt;s:url value="%{#foobar['foo1']}" /&gt;&lt;/p&gt;清单6 演示%用途的代码片段 <br />
刷新页面，结果如下所示：</p>
<div forimg="1"><a href="http://hiphotos.baidu.com/%B3%BF%D1%F4%C2%FE%B2%BD/pic/item/3cdd86ce81eba60992457e26.jpg" target="_blank"><img class="blogimg" src="http://hiphotos.baidu.com/%B3%BF%D1%F4%C2%FE%B2%BD/abpic/item/3cdd86ce81eba60992457e26.jpg" border="0" small="1"  alt="" /></a></div>
<p>清单7 示例运行结果2</p>
<p>&#8220;$&#8221;有两个主要的用途</p>
<p>用于在国际化资源文件中，引用OGNL表达式，例子请参考《在Struts 2.0中国际化(i18n)您的应用程序》 <br />
在Struts 2配置文件中，引用OGNL表达式，如 &lt;action name="AddPhoto" class="addPhoto"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;interceptor-ref name="fileUploadStack" /&gt;&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; &lt;result type="redirect"&gt;ListPhotos.action?albumId=${albumId}&lt;/result&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/action&gt;清单8 演示$用途的代码片段 <br />
总结<br />
OGNL是一种功能很大的表达式语言，熟悉它可以使我们的开发变得更快捷。<br />
</p>
<img src ="http://www.blogjava.net/i369/aggbug/162409.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-11-22 16:58 <a href="http://www.blogjava.net/i369/articles/162409.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts2 ognl 与 jsp2.1 el 的冲突问题</title><link>http://www.blogjava.net/i369/articles/162318.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Thu, 22 Nov 2007 03:13:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/162318.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/162318.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/162318.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/162318.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/162318.html</trackback:ping><description><![CDATA[tomcat6 , jetty6 采用 jsp2.1。 <br />
由于 nio 带来的性能提升，tomcat6 不能被忽略。<br />
<br />
办法1：<br />
<br />
<a title="http://www.devzuz.org/blogs/bporter/2006/08/05/1154706744655.html" href="http://www.devzuz.org/blogs/bporter/2006/08/05/1154706744655.html">http://www.devzuz.org/blogs/bporter/2006/08/05/1154706744655.html</a><br />
<br />
&lt;ww:select list="#{'default' : 'Maven 2.x Repository', 'legacy' : 'Maven 1.x Repository'}" /&gt;<br />
<br />
改用-------------------------------------------------------------<br />
&lt;ww:select list="#@java.util.HashMap@{'default' : 'Maven 2.x Repository', 'legacy' : 'Maven 1.x Repository'}" /&gt;<br />
<br />
这样 jsp2.1 el 就不会有问题了。<br />
<br />
办法2： 对于旧的程序，不愿意改了，可以向后兼容<br />
<a title="http://today.java.net/lpt/a/272#backwards-compatibility" href="http://today.java.net/lpt/a/272#backwards-compatibility">http://today.java.net/lpt/a/272#backwards-compatibility</a><br />
<br />
<span>必须用 Servlet <strong class="highlight">2</strong>.<strong class="highlight">5</strong> XSD. <br />
</span><font size="-1">&lt;web-app xmlns="http://java.sun.com/xml/ns/javaee" version="<font color="#cc0033">2.5</font>" xmlns:xsi="http://www.<wbr>w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.<font color="#cc0033">xsd</font>"&gt; </font><br />
<br />
<pre><code>&lt;jsp-property-group&gt;<br />
&lt;deferred-syntax-allowed-as-literal&gt;<br />
true<br />
&lt;/deferred-syntax-allowed-as-literal&gt;<br />
<br />
<br />
&lt;/jsp-property-group&gt;</code></pre>
或者在页面中<br />
<pre><code>&lt;%@page  language="java" deferredSyntaxAllowedAsLiteral="true" %&gt;<br />
<br />
办法3 ：不用 jsp2.1 el<br />
<br />
</code>&gt;   &lt;jsp-config&gt;<br />
&gt;     &lt;jsp-property-group&gt;<br />
&gt;       &lt;url-pattern&gt;*.jsp&lt;/url-pattern&gt;<br />
&gt;       &lt;el-ignored&gt;true&lt;/el-ignored&gt;<br />
&gt;     &lt;/jsp-property-group&gt;<br />
&gt;   &lt;/jsp-config&gt;
<br />
<br />
<a title="http://www.mail-archive.com/dev@struts.apache.org/msg28920.html" href="http://www.mail-archive.com/dev@struts.apache.org/msg28920.html">http://www.mail-archive.com/dev@struts.apache.org/msg28920.html
</a><br />
我现在的疑问<br />
在一个页面中采用两个 el 引擎，是否会对性能造成一定影响？<br />
较小。<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<code><br />
<br />
<br />
<br />
<br />
</code></pre>
<br />
<br />
<br />
<br />
<br />
<br />
西津渡 ,<a title="99 街购物搜索 www.99jie.com" href="http://www.99jie.com/">99 街购物搜索 www.99jie.com </a><br />
<br />
webwork ognl的list集合与jsp el 冲突问题解决&nbsp;&nbsp; <script src="http://blog.csdn.net/count.aspx?ID=1827462&amp;Type=Rank"></script><img title="文章指数:0" alt="文章指数:0" src="http://blog.csdn.net/images/star_0.gif" border="0" />&nbsp;&nbsp;<img title="CSDN Blog推出文章指数概念，文章指数是对Blog文章综合评分后推算出的，综合评分项分别是该文章的点击量，回复次数，被网摘收录数量，文章长度和文章类型；满分100，每月更新一次。" alt="CSDN Blog推出文章指数概念，文章指数是对Blog文章综合评分后推算出的，综合评分项分别是该文章的点击量，回复次数，被网摘收录数量，文章长度和文章类型；满分100，每月更新一次。" src="http://blog.csdn.net/images/ask.gif" border="0" />
<div class="postText">
<div style="border-right: windowtext 0.5pt solid; padding-right: 5.4pt; border-top: windowtext 0.5pt solid; padding-left: 5.4pt; background: #e6e6e6; padding-bottom: 4px; border-left: windowtext 0.5pt solid; width: 97.24%; word-break: break-all; padding-top: 4px; border-bottom: windowtext 0.5pt solid; height: 153px">
<div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">将：&nbsp;<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">&lt;</span><span style="color: #000000">ww:radio&nbsp;list</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">#{"D":"草稿箱","S":"直接发表"}</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">savePosition</span><span style="color: #000000">"</span><span style="color: #000000">&gt;&lt;/</span><span style="color: #000000">ww:radio</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />改：<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">&lt;</span><span style="color: #000000">ww:radio&nbsp;list</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">#@java.util.HashMap@{"D":"草稿箱","S":"直接发表"}</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">savePosition</span><span style="color: #000000">"</span><span style="color: #000000">&gt;&lt;/</span><span style="color: #000000">ww:radio</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;</span></div>
</div>
</div>
<img src ="http://www.blogjava.net/i369/aggbug/162318.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-11-22 11:13 <a href="http://www.blogjava.net/i369/articles/162318.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2与Struts1对比</title><link>http://www.blogjava.net/i369/articles/157718.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Fri, 02 Nov 2007 04:07:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/157718.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/157718.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/157718.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/157718.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/157718.html</trackback:ping><description><![CDATA[<p class="g_w_100 g_t_wrap g_t_center g_t_bold g_t_24 g_c_pdin c07" id="blogtitle__fks_0xDqmeVJRM9svcUG7799Og==">Struts2与Struts1对比</p>
<div class="g_blog_list">
<div class="g_t_center g_c_pdin g_p_center c07 content" id="blogtext__fks_0xDqmeVJRM9svcUG7799Og==" style="width: 760px">
<p>Struts2与Struts1Struts2与Struts1对比<br />
Action 类:<br />
&nbsp; Struts1要求Action类继承一个抽象基类。Struts1的一个普遍问题是使用抽象类编程而不是接口。<br />
&nbsp; Struts 2 Action类可以实现一个Action接口，也可实现其他接口，使可选和定制的服务成为可能。Struts2提供一</p>
<p>个ActionSupport基类去实现 常用的接口。Action接口不是必须的，任何有execute标识的POJO对象都可以用作</p>
<p>Struts2的Action对象。</p>
<p>线程模式:<br />
&nbsp; Struts1 Action是单例模式并且必须是线程安全的，因为仅有Action的一个实例来处理所有的请求。单例策略限制</p>
<p>了Struts1 Action能作的事，并且要在开发时特别小心。Action资源必须是线程安全的或同步的。<br />
&nbsp; Struts2 Action对象为每一个请求产生一个实例，因此没有线程安全问题。（实际上，servlet容器给每个请求产生</p>
<p>许多可丢弃的对象，并且不会导致性能和垃圾回收问题）</p>
<p>Servlet 依赖:<br />
&nbsp; Struts1 Action 依赖于Servlet API ,因为当一个Action被调用时HttpServletRequest 和 HttpServletResponse </p>
<p>被传递给execute方法。<br />
&nbsp; Struts 2 Action不依赖于容器，允许Action脱离容器单独被测试。如果需要，Struts2 Action仍然可以访问初始的</p>
<p>request和response。但是，其他的元素减少或者消除了直接访问HttpServetRequest 和 HttpServletResponse的必要</p>
<p>性。</p>
<p>可测性:<br />
&nbsp; 测试Struts1 Action的一个主要问题是execute方法暴露了servlet API（这使得测试要依赖于容器）。一个第三方</p>
<p>扩展－－Struts TestCase－－提供了一套Struts1的模拟对象（来进行测试）。<br />
&nbsp; Struts 2 Action可以通过初始化、设置属性、调用方法来测试，&#8220;依赖注入&#8221;支持也使测试更容易。</p>
<p>捕获输入:<br />
&nbsp; Struts1 使用ActionForm对象捕获输入。所有的ActionForm必须继承一个基类。因为其他JavaBean不能用作</p>
<p>ActionForm，开发者经常创建多余的类捕获输入。动态Bean（DynaBeans）可以作为创建传统ActionForm的选择，但是</p>
<p>，开发者可能是在重新描述(创建)已经存在的JavaBean（仍然会导致有冗余的javabean）。<br />
&nbsp; Struts 2直接使用Action属性作为输入属性，消除了对第二个输入对象的需求。输入属性可能是有自己(子)属性的</p>
<p>rich对象类型。Action属性能够通过 web页面上的taglibs访问。Struts2也支持ActionForm模式。rich对象类型，包</p>
<p>括业务对象，能够用作输入/输出对象。这种 ModelDriven 特性简化了taglib对POJO输入对象的引用。</p>
<p>表达式语言：<br />
&nbsp; Struts1 整合了JSTL，因此使用JSTL EL。这种EL有基本对象图遍历，但是对集合和索引属性的支持很弱。<br />
&nbsp; Struts2可以使用JSTL，但是也支持一个更强大和灵活的表达式语言－－"Object Graph Notation Language" </p>
<p>(OGNL).</p>
<p>绑定值到页面（view）:<br />
&nbsp; Struts 1使用标准JSP机制把对象绑定到页面中来访问。<br />
&nbsp; Struts 2 使用 "ValueStack"技术，使taglib能够访问值而不需要把你的页面（view）和对象绑定起来。</p>
<p>ValueStack策略允许通过一系列名称相同但类型不同的属性重用页面（view）。<br />
　<br />
类型转换：<br />
&nbsp; Struts 1 ActionForm 属性通常都是String类型。Struts1使用Commons-Beanutils进行类型转换。每个类一个转换</p>
<p>器，对每一个实例来说是不可配置的。<br />
&nbsp; Struts2 使用OGNL进行类型转换。提供基本和常用对象的转换器。</p>
<p>校验：<br />
&nbsp; Struts 1支持在ActionForm的validate方法中手动校验，或者通过Commons Validator的扩展来校验。同一个类可以</p>
<p>有不同的校验内容，但不能校验子对象。<br />
&nbsp; Struts2支持通过validate方法和XWork校验框架来进行校验。XWork校验框架使用为属性类类型定义的校验和内容校</p>
<p>验，来支持chain校验子属性</p>
<p>Action执行的控制：<br />
&nbsp; Struts1支持每一个模块有单独的Request Processors（生命周期），但是模块中的所有Action必须共享相同的生命</p>
<p>周期。<br />
&nbsp; Struts2支持通过拦截器堆栈（Interceptor Stacks）为每一个Action创建不同的生命周期。堆栈能够根据需要和不</p>
<p>同的Action一起使用。</p>
<p>&nbsp;</p>
<p>--------------------------------------------------------------------------------<br />
注释struts.action.extension<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The URL extension to use to determine if the request is meant for a Struts action <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用URL扩展名来确定是否这个请求是被用作Struts action，其实也就是设置 action的后缀，例如</p>
<p>login.do的'do'字。</p>
<p>struts.configuration<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The org.apache.struts2.config.Configuration implementation class<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.apache.struts2.config.Configuration接口名</p>
<p>struts.configuration.files<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A list of configuration files automatically loaded by Struts <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; struts自动加载的一个配置文件列表</p>
<p>struts.configuration.xml.reload<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Whether to reload the XML configuration or not<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 是否加载xml配置(true,false)</p>
<p>struts.continuations.package<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The package containing actions that use Rife continuations<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 含有actions的完整连续的package名称</p>
<p>struts.custom.i18n.resources<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Location of additional localization properties files to load <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 加载附加的国际化属性文件（不包含.properties后缀）</p>
<p>struts.custom.properties<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Location of additional configuration properties files to load<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 加载附加的配置文件的位置</p>
<p><br />
struts.devMode<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Whether Struts is in development mode or not<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 是否为struts开发模式</p>
<p>struts.dispatcher.parametersWorkaround<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Whether to use a Servlet request parameter workaround necessary for some versions of WebLogic<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （某些版本的weblogic专用）是否使用一个servlet请求参数工作区（PARAMETERSWORKAROUND）</p>
<p>struts.enable.DynamicMethodInvocation<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Allows one to disable dynamic method invocation from the URL<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 允许动态方法调用</p>
<p>struts.freemarker.manager.classname<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The org.apache.struts2.views.freemarker.FreemarkerManager implementation class <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.apache.struts2.views.freemarker.FreemarkerManager接口名</p>
<p>struts.i18n.encoding<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The encoding to use for localization messages<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 国际化信息内码</p>
<p>struts.i18n.reload<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Whether the localization messages should automatically be reloaded<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 是否国际化信息自动加载 </p>
<p>struts.locale<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The default locale for the Struts application<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 默认的国际化地区信息</p>
<p>struts.mapper.class<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The org.apache.struts2.dispatcher.mapper.ActionMapper implementation class<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.apache.struts2.dispatcher.mapper.ActionMapper接口</p>
<p>struts.multipart.maxSize<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The maximize size of a multipart request (file upload)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; multipart请求信息的最大尺寸（文件上传用） </p>
<p>struts.multipart.parser<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The org.apache.struts2.dispatcher.multipart.MultiPartRequest parser implementation for a </p>
<p>multipart request (file upload) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 专为multipart请求信息使用的org.apache.struts2.dispatcher.multipart.MultiPartRequest解析器接口</p>
<p>（文件上传用）</p>
<p><br />
struts.multipart.saveDir<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The directory to use for storing uploaded files <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 设置存储上传文件的目录夹</p>
<p>struts.objectFactory<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The com.opensymphony.xwork2.ObjectFactory implementation class<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; com.opensymphony.xwork2.ObjectFactory接口（spring）</p>
<p>struts.objectFactory.spring.autoWire<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Whether Spring should autoWire or not<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 是否自动绑定Spring</p>
<p>struts.objectFactory.spring.useClassCache<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Whether Spring should use its class cache or not<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 是否spring应该使用自身的cache </p>
<p>struts.objectTypeDeterminer<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The com.opensymphony.xwork2.util.ObjectTypeDeterminer implementation class<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; com.opensymphony.xwork2.util.ObjectTypeDeterminer接口</p>
<p>struts.serve.static.browserCache<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If static content served by the Struts filter should set browser caching header properties or </p>
<p>not <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 是否struts过滤器中提供的静态内容应该被浏览器缓存在头部属性中</p>
<p>struts.serve.static<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Whether the Struts filter should serve static content or not <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 是否struts过滤器应该提供静态内容</p>
<p>struts.tag.altSyntax<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Whether to use the alterative syntax for the tags or not <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 是否可以用替代的语法替代tags</p>
<p>struts.ui.templateDir<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The directory containing UI templates<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UI templates的目录夹 </p>
<p>struts.ui.theme<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The default UI template theme<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 默认的UI template主题</p>
<p>struts.url.http.port<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The HTTP port used by Struts URLs<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 设置http端口</p>
<p>struts.url.https.port<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The HTTPS port used by Struts URLs <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 设置https端口</p>
<p>struts.url.includeParams<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The default includeParams method to generate Struts URLs <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在url中产生 默认的includeParams</p>
<p><br />
struts.velocity.configfile<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The Velocity configuration file path<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; velocity配置文件路径</p>
<p>struts.velocity.contexts<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List of Velocity context names<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; velocity的context列表</p>
<p><br />
struts.velocity.manager.classname<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.apache.struts2.views.velocity.VelocityManager implementation class<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.apache.struts2.views.velocity.VelocityManager接口名</p>
<p>struts.velocity.toolboxlocation<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The location of the Velocity toolbox<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; velocity工具盒的位置 <br />
struts.xslt.nocache<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Whether or not XSLT templates should not be cached<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 是否XSLT模版应该被缓存<br />
在Struts2中，action中的getXXX()只在服务器启动时执行一次，一刷新页面显示的数据内容全都没了，这种问题的解</p>
<p>决办法是： <br />
在web.xml中配置struts2.0时， <br />
&lt;filter-mapping&gt; <br />
&lt;filter-name&gt;action2&lt;/filter-name&gt; <br />
&lt;url-pattern&gt;/*&lt;/url-pattern&gt; <br />
&lt;/filter-mapping&gt; <br />
把/*改成*.ation就OK了<br />
一、Struts2配置文件 <br />
Struts2相关的配置文件有web.xml，struts.xml，struts.properties， <br />
struts-default.xml，velocity.properties，struts-default.vm。其中web.xml，struts.xml是必须的，其它的配置</p>
<p>文件可选择。它们在web应用中的功能如下： <br />
web.xml：包含所有必须的框架组件的web部署描述符。 <br />
Struts.xml:配置包含result/view类型、action映射、拦截器等的Struts2的主要配置文件。 <br />
Struts.properties：配置struts2的框架属性。 <br />
Struts-default.xml：在文件在struts-action-x.x.jar中，该文件是应该被包含在struts.xml中的缺省配置。 <br />
Welocity.properties：重写了velocity的配置文件。 <br />
Struts-default.vm：相对于velocity的缺省配置。</p>
<p>二、Struts2配置元素 <br />
Struts2核心的配置文件是缺省的struts.xml。 <br />
必要的时候，缺省的配置文件可以包含其它的配置文件；struts文件可以放入jar中，并自动插入应用程序，这样每个</p>
<p>模块可以包含自己的配置文件并自动配置。在Freemarker和Velocity模块中，模板也能从classpath中加载，所以整个</p>
<p>模块可以作为一个简单的jar文件被包含。 <br />
Struts.xml配置文件可以包含Interceptor、Action类和Results。 <br />
Struts.xml配置元素说明：</p>
<p>1、Packages <br />
Packages:packages把actions、results、results types、interceptors <br />
和interceptor-stacks组装到一个逻辑单元中，从概念上讲，packages就像一个对象，可以被其它子包从写，而且可</p>
<p>以拥有自己独立的部分。 <br />
Name属性是packages的必填元素，它作为一个关键字被后边的包引用；extends元素是可选的，它允许包扩展一个和多</p>
<p>个前边定义的包。注意， <br />
struts.xml文件是至上而下处理的，所有被扩展的包，需要在扩展包前定义。 <br />
Abstract元素是可选的，它可以申明一个不包含actions的配置文件。</p>
<p>2、Namespace <br />
Namespace元素把actions细分到逻辑模块，每一个namespace都有自己的 <br />
前缀（prefix），namespace避免了action之间的名字冲突，当前缀出现在URI中时，这些标签都是名字空间感知的（</p>
<p>&#8220;namespace aware&#8221;），所以这些namespace prefix不必嵌入到表单或连接中。 <br />
Default的namespace是一个空字符串&#8220;&#8221;，如果在指定的配置文件中，没有找到action，缺省的namespace也会被查找</p>
<p>。Local/global策略允许应用程序在action &#8220;extends&#8221;元素层次结构之外，有全局的action配置。缺省的namespace</p>
<p>也可以不在package中申明。 <br />
Namespace prefix可以注册为java的申明式安全，以确保授权的用户才能访问namespace的资源。 <br />
Root namespace(&#8220;/&#8221;)也被支持，root就是当直接请求context path的时候的namespace。</p>
<p>[个人理解：namespace的用法就像struts1.x中的path一样，只不过它在package中什么路径，而在action中申明</p>
<p>action名子罢了]</p>
<p>3、Include <br />
Include元素使得框架能应用&#8220;divide and conquer&#8221;来配置文件。被include <br />
的每个配置文件必须和struts.xml有一样的格式，一个大的项目可以采用这样方式来组织程序模块。 <br />
Include元素也可以和package交替出现，框架将按照顺序加载配置文件。</p>
<p>4、Interceptor configuration <br />
Interceptor允许应用程序在Action方法执行前后定义执行代码， <br />
Interceptor在应用程序开发中十分重要，对于Interceptor有许多用例，如validation, property population, </p>
<p>security, logging, 和profiling。 <br />
Interceptor被定义为一个Java类，Interceptor也可以组装成Interceptor-stack，他们将按照定义的顺序执行。 <br />
在struts-default.xml中定义了一些缺省的Interceptor-stack,以便框架能很好地运行。</p>
<p>5、Action <br />
Action是框架的&#8220;工作单元&#8221;。Action可以指定一个Interceptor-stack、 <br />
一序列的return type和一序列的异常处理，但只有name属性是必须的。 </p>
<p>&nbsp;</p>
<p>--------------------------------------------------------------------------------<br />
struts2.0简单的例子今天在apache网站上无意中看到了struts项目2.0.8正式发布了，怀着欣喜的心情我下载了</p>
<p>stuts2.0.8完整包。 Struts2.0.8是struts项目和WebWork2.2项目的合并版本，集成了两大流行MVC框架的优点，对</p>
<p>struts框架来说是一个大的提升，同时也更大程度地简化了开发人员的开发过程。我简单地研究了一下这个新版本，</p>
<p>现在给大家介绍一个入门级的小例子，希望能对学习这个新版本的朋友有点帮助。<br />
这个例子完成了一次URL调用返回结果页面的过程。<br />
首先，要从apache网站上下载struts2.0.8的完整包（可以从这里下载：</p>
<p><a href="http://www.signal42.com/mirrors/apache/struts/binaries/struts-2.0.8-all.zip">http://www.signal42.com/mirrors/apache/struts/binaries/struts-2.0.8-all.zip</a>），解压后需要找到下列几个文</p>
<p>件：<br />
commons-logging-1.0.4.jar<br />
freemarker-2.3.8.jar<br />
ognl-2.6.11.jar<br />
struts2-core-2.0.8.jar<br />
xwork-2.0.3.jar<br />
然后，我们就开始做第一个例子，我们就使用经典的&#8220;HelloWorld&#8221;的名字吧！<br />
1． 制作目录结构<br />
如下图所示:<br />
stuts2是web应用的根目录。<br />
2． 拷贝引用文件<br />
将上面列举的jar文件拷贝到步骤1中制作的目录struts2\WEB-INF\lib中。<br />
3． 制作jsp文件HelloWorld.jsp</p>
<p>&lt;%@ taglib prefix="s" uri="/struts-tags" %&gt;<br />
&lt;html&gt;<br />
&lt;head&gt;<br />
&lt;title&gt;Hello World!&lt;/title&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&lt;h2&gt;&lt;s:property value="message" /&gt;&lt;/h2&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;<br />
将该文件拷贝到步骤1中制作的目录struts2\example中。<br />
4．制作java文件HelloWorld.java</p>
<p>package example;</p>
<p>/** *//**<br />
* &lt;code&gt;Set welcome message.&lt;/code&gt;<br />
*/<br />
import com.opensymphony.xwork2.ActionSupport;<br />
public class HelloWorld extends ActionSupport ...{</p>
<p>public static final String MESSAGE = "Struts is up and running ...";</p>
<p>public String execute() throws Exception ...{<br />
setMessage(MESSAGE);<br />
return SUCCESS;<br />
}</p>
<p>private String message;</p>
<p>public void setMessage(String message)...{<br />
this.message = message;<br />
}</p>
<p>public String getMessage() ...{<br />
return message;<br />
}<br />
}<br />
使用下面的命令编译这个java文件：<br />
set CLASSPATH=yourdirectory\xwork-2.0-beta-1.jar<br />
javac HelloWorld.java<br />
将编译后的HelloWorld.class文件拷贝到步骤1中制作的目录struts2\WEB-INF\classes\example中。<br />
5．制作web应用的描述文件web.xml</p>
<p>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;web-app xmlns="<a href="http://java.sun.com/xml/ns/j2ee">http://java.sun.com/xml/ns/j2ee</a>"<br />
&nbsp;&nbsp;&nbsp; xmlns:xsi="<a href="http://www.w3.org/2001/XMLSchema-instance">http://www.w3.org/2001/XMLSchema-instance</a>"<br />
&nbsp;&nbsp;&nbsp; xsi:schemaLocation="<a href="http://java.sun.com/xml/ns/j2ee">http://java.sun.com/xml/ns/j2ee</a> <a href="http://java.sun.com/xml/ns/j2ee/web">http://java.sun.com/xml/ns/j2ee/web</a>-</p>
<p>app_2_4.xsd"<br />
&nbsp;&nbsp;&nbsp; version="2.4"&gt;</p>
<p>&lt;display-name&gt;Struts Blank&lt;/display-name&gt;</p>
<p>&lt;filter&gt;<br />
&lt;filter-name&gt;struts2&lt;/filter-name&gt;<br />
&lt;filter-class&gt;org.apache.struts2.dispatcher.FilterDispatcher&lt;/filter-class&gt;<br />
&lt;/filter&gt;</p>
<p>&lt;filter-mapping&gt;<br />
&lt;filter-name&gt;struts2&lt;/filter-name&gt;<br />
&lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br />
&lt;/filter-mapping&gt;</p>
<p>&lt;welcome-file-list&gt;<br />
&lt;welcome-file&gt;index.html&lt;/welcome-file&gt;<br />
&lt;/welcome-file-list&gt;<br />
&lt;/web-app&gt;<br />
将该文件拷贝到步骤1中制作的目录struts2\WEB-INF中。<br />
6．制作MANIFEST.MF文件（从其它地方随便找一个即可）<br />
将该文件拷贝到步骤1中制作的目录struts2\META-INF中。<br />
7．制作struts配置文件struts.xml和struts.properties<br />
struts.xml文件：</p>
<p>&lt;!DOCTYPE struts PUBLIC<br />
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"<br />
"<a href="http://struts.apache.org/dtds/struts-2.0.dtd">http://struts.apache.org/dtds/struts-2.0.dtd</a>"&gt;<br />
&lt;struts&gt;<br />
&lt;package name="abc" namespace="/example" extends="struts-default"&gt;<br />
&lt;action name="HelloWorld" class="example.HelloWorld"&gt;<br />
&lt;result&gt;/example/HelloWorld.jsp&lt;/result&gt;<br />
&lt;/action&gt;<br />
&lt;!-- Add your actions here --&gt;<br />
&lt;/package&gt;<br />
&lt;/struts&gt;<br />
struts.properties文件：<br />
struts.devMode = true<br />
struts.enable.DynamicMethodInvocation = false<br />
将这两个文件拷贝到步骤1中制作的目录struts2\ WEB-INF\classes中。<br />
好了整个例子的文件我们都搞定了。<br />
最后，你可以将制作好的web应用struts2拷贝到tomcat下运行。<br />
访问<a href="http://localhost:8080/struts2/example/HelloWorld.action">http://localhost:8080/struts2/example/HelloWorld.action</a>如果能够看到页面上的&#8220;Struts is up and </p>
<p>running ...&#8221;提示信息说明你的例子是正确的。</p>
<p>&nbsp;</p>
<p><br />
--------------------------------------------------------------------------------<br />
Struts2.0 中文乱码1.为了能正确显示 jsp页面直接写的中文 在jsp页面正确显示添加下面字符设置。<br />
&nbsp;&nbsp; &lt;%@ page contentType="text/html;charset=GBK"%&gt; <br />
2.为了解决form提交到action中的中文参数乱码问题，在src\struts.properties文件添加<br />
struts.i18n.encoding=GBK</p>
<p><br />
或<br />
&nbsp;&nbsp;&nbsp; 在struts2-core-2.0.8.jar 包中路径为struts2-core-2.0.8\org\apache\struts2 有一个default.properties </p>
<p>文件<br />
&nbsp;&nbsp;&nbsp; 把struts.i18n.encoding=UTF-8改为struts.i18n.encoding=GBK 或者在struts.xml里面改<br />
&nbsp;&nbsp;&nbsp; 这样在action中取到的参数不用自己手工转码 了。</p>
<p>&nbsp;</p>
<p>--------------------------------------------------------------------------------<br />
Struts 2.0的标志（Tag）介绍介绍常用标志前，我想先从总体上，对Struts 1.x与Struts 2.0的标志库（Tag </p>
<p>Library）作比较。&nbsp; Struts 1.x Struts 2.0 <br />
分类 将标志库按功能分成HTML、Tiles、Logic和Bean等几部分 严格上来说，没有分类，所有标志都在URI为</p>
<p>&#8220;/struts-tags&#8221;命名空间下，不过，我们可以从功能上将其分为两大类：非UI标志和UI标志 <br />
表达式语言（expression languages） 不支持嵌入语言（EL） OGNL、JSTL、Groovy和Velcity <br />
以上表格，纯属个人总结，如有所不足或错误，请不吝指正 </p>
<p>好了，我要开始介绍&#8220;常用&#8221;（这里所谓的&#8220;常用&#8221;，是指在已往工作中使用Struts里经常用到的）的标志了。</p>
<p><br />
&nbsp; 要在JSP中使用Struts 2.0标志，先要指明标志的引入。通过在JSP的代码的顶部加入以下代码可以做到这点。<br />
&lt;<a href="mailto:%@taglib">%@taglib</a> prefix="s" uri="/struts-tags" %&gt; </p>
<p>非UI标志 <br />
if、elseif和else <br />
描述：<br />
执行基本的条件流转。 </p>
<p>参数： </p>
<p>名称 必需 默认 类型 描述 备注 <br />
test 是&nbsp; Boolean 决定标志里内容是否显示的表达式 else标志没有这个参数 <br />
id 否&nbsp; Object/String 用来标识元素的id。在UI和表单中为HTML的id属性&nbsp;&nbsp; </p>
<p>例子： </p>
<p>&lt;%@ page contentType="text/html; charset=UTF-8" %&gt;<br />
&lt;%@ taglib prefix="s" uri="/struts-tags" %&gt;<br />
&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt;<br />
&lt;html&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;head&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;title&gt;Condition Flow&lt;/title&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/head&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;body&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;h3&gt;Condition Flow&lt;/h3&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!--<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这里有点小技巧：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 本来可以用#parameters.name[0]来获得，请求中name的值。但是，在我实现include例子时，<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 无论我用param标志给name赋任何值，#parameters里面不会含有任何值，所以#parameters.name也为空</p>
<p>值。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其原因为：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当使用include标志时，被包含的页面（included）里#parameters拿到的是包含页面里的请求参数。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 因此，这里必须手工调用request.getParameter("name")。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;s:set name="name" value="&lt;%= "'" + request.getParameter("name") + "'" %&gt;" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;s:if test="#name == 'Max'"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Max's file here<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/s:if&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;s:elseif test="#name == 'Scott'"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Scott's file here<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/s:elseif&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;s:else&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Other's file here<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/s:else&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; &lt;/body&gt;<br />
&lt;/html&gt;<br />
例1 condition.jsp </p>
<p>iterator <br />
描述：<br />
用于遍历集合（java.util.Collection）或枚举值（java.util.Iterator）。 </p>
<p>参数： </p>
<p>名称 必需 默认 类型 描述 <br />
status 否&nbsp; String 如果设置此参数，一个IteratorStatus的实例将会压入每个遍历的堆栈 <br />
value 否&nbsp; Object/String 要遍历的可枚举的（iteratable）数据源，或者将放入新列表（List）的对象 <br />
id 否&nbsp; Object/String 用来标识元素的id。在UI和表单中为HTML的id属性&nbsp; </p>
<p>例子： </p>
<p>&lt;%@ page contentType="text/html; charset=UTF-8" %&gt;<br />
&lt;%@ page import="java.util.List" %&gt;<br />
&lt;%@ page import="java.util.ArrayList" %&gt;<br />
&lt;%@ taglib prefix="s" uri="/struts-tags" %&gt;</p>
<p>&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt;<br />
&lt;%<br />
&nbsp;&nbsp;&nbsp; List list = new ArrayList();<br />
&nbsp;&nbsp;&nbsp; list.add("Max");<br />
&nbsp;&nbsp;&nbsp; list.add("Scott");<br />
&nbsp;&nbsp;&nbsp; list.add("Jeffry");<br />
&nbsp;&nbsp;&nbsp; list.add("Joe");<br />
&nbsp;&nbsp;&nbsp; list.add("Kelvin");<br />
&nbsp;&nbsp;&nbsp; request.setAttribute("names", list);<br />
%&gt;<br />
&lt;html&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;head&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;title&gt;Iterator&lt;/title&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/head&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;body&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;h3&gt;Names: &lt;/h3&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、此处的空property元素用于获得当前iterator的值 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、status被设成stuts，在iterator的里面就可以通过#stuts取得IteratorStatus的对象。</p>
<p>IteratorStatus类包含当前序号信息，如是否第一个或最后一个，是否为奇数序号。这些信息在我们做格式化的时候</p>
<p>，显得非常有用。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ol&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;s:iterator value="#request.names" status="stuts"&gt;&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; &lt;s:if test="#stuts.odd == true"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;li&gt;White &lt;s:property /&gt;&lt;/li&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/s:if&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;s:else&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;li style="background-color:gray"&gt;&lt;s:property /&gt;&lt;/li&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/s:else&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/s:iterator&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/ol&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/body&gt;<br />
&lt;/html&gt;<br />
例2 iterator.jsp </p>
<p>i18n <br />
描述：<br />
加载资源包到值堆栈。它可以允许text标志访问任何资源包的信息，而不只当前action相关联的资源包。 </p>
<p>参数： </p>
<p>名称 必需 默认 类型 描述 <br />
value 是&nbsp; Object/String 资源包的类路径（如com.xxxx.resources.AppMsg） <br />
id 否&nbsp; Object/String 用来标识元素的id。在UI和表单中为HTML的id属性&nbsp; </p>
<p>例子： </p>
<p>HelloWorld=Hello Wrold!<br />
例3 classes\ ApplicationMessages.properties</p>
<p><br />
&lt;%@ page contentType="text/html; charset=UTF-8" %&gt;<br />
&lt;%@ taglib prefix="s" uri="/struts-tags" %&gt;</p>
<p>&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt;<br />
&lt;html&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;head&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;title&gt;Internationization&lt;/title&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/head&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;body&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;h3&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;s:i18n name="ApplicationMessages"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;s:text name="HelloWorld" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/s:i18n&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/h3&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/body&gt;<br />
&lt;/html&gt;<br />
例3 i18n.jsp </p>
<p>include <br />
描述：<br />
包含一个servlet的输出（servlet或jsp的页面）。 </p>
<p>参数： </p>
<p>名称 必需 默认 类型 描述 <br />
value 是&nbsp; String 要包含的jsp或servlet <br />
id 否&nbsp; Object/String 用来标识元素的id。在UI和表单中为HTML的id属性&nbsp; </p>
<p>例子： </p>
<p>&lt;%@ page contentType="text/html; charset=UTF-8" %&gt;<br />
&lt;%@ taglib prefix="s" uri="/struts-tags" %&gt;</p>
<p>&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt;<br />
&lt;html&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;head&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;title&gt;Iterator&lt;/title&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/head&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;body&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;h3&gt;Interator Page&lt;/h3&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;s:include value="/condition.jsp"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;s:param name="name"&gt;Max&lt;/s:param&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/s:include&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;h3&gt;i18n&lt;/h3&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;s:include value="/i18n.jsp" /&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/body&gt;<br />
&lt;/html&gt;<br />
例4 include.jsp </p>
<p>param <br />
描述：<br />
为其他标签提供参数,比如include标签和bean标签. 参数的name属性是可选的,如果提供，会调用Component的方法</p>
<p>addParameter(String, Object), 如果不提供，则外层嵌套标签必须实现UnnamedParametric接口(如TextTag)。 </p>
<p><br />
&nbsp;value的提供有两种方式,通过value属性或者标签中间的text,不同之处我们看一下例子:</p>
<p>&lt;param name="color"&gt;blue&lt;/param&gt;&lt;!-- (A) --&gt;</p>
<p>&lt;param name="color" value="blue"/&gt;&lt;!-- (B) --&gt;<br />
(A)参数值会以String的格式放入statck. <br />
(B)该值会以java.lang.Object的格式放入statck. <br />
&nbsp;</p>
<p>参数： </p>
<p>名称 必需 默认 类型 描述 <br />
name 否&nbsp; String 参数名 <br />
value 否&nbsp; String value表达式 <br />
id 否&nbsp; Object/String 用来标识元素的id。在UI和表单中为HTML的id属性&nbsp; </p>
<p>例子：<br />
请参考例4。 </p>
<p>set <br />
描述：<br />
set标签赋予变量一个特定范围内的值。当希望给一个变量赋一个复杂的表达式,每次访问该变量而不是复杂的表达式</p>
<p>时用到。其在两种情况下非常有用: 复杂的表达式很耗时 (性能提升) 或者很难理解 (代码可读性提高)。 </p>
<p>参数： </p>
<p>名称 必需 默认 类型 描述 <br />
name 是&nbsp; String 变量名字 <br />
scope 否&nbsp; String 变量作用域,可以为application, session, request, page, 或action. <br />
value 否&nbsp; Object/String 将会赋给变量的值 <br />
id 否&nbsp; Object/String 用来标识元素的id。在UI和表单中为HTML的id属性&nbsp; </p>
<p>例子：<br />
请参考例1。 </p>
<p>text <br />
描述：<br />
支持国际化信息的标签。国际化信息必须放在一个和当前action同名的resource bundle中,如果没有找到相应</p>
<p>message,tag body将被当作默认message,如果没有tag body,message的name会被作为默认message。 </p>
<p>参数： </p>
<p>名称 必需 默认 类型 描述 <br />
name 是&nbsp; String 资源属性的名字 <br />
id 否&nbsp; Object/String 用来标识元素的id。在UI和表单中为HTML的id属性&nbsp; </p>
<p>例子：<br />
请参考例3。 </p>
<p>url <br />
描述：<br />
该标签用于创建url,可以通过"param"标签提供request参数。 </p>
<p><br />
&nbsp;当includeParams的值时'all'或者'get', param标签中定义的参数将有优先权,也就是说其会覆盖其他同名参数的值</p>
<p>。&nbsp; </p>
<p>参数： 略</p>
<p>例子： </p>
<p>&lt;%@ page contentType="text/html; charset=UTF-8" %&gt;<br />
&lt;%@ taglib prefix="s" uri="/struts-tags" %&gt;<br />
&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt;<br />
&lt;html&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;head&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;title&gt;URL&lt;/title&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/head&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;body&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;h3&gt;URL&lt;/h3&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;a href='&lt;s:url value="/i18n.jsp" /&gt;'&gt;i18n&lt;/a&gt;&lt;br /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;s:url id="url" value="/condition.jsp"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;s:param name="name"&gt;Max&lt;/s:param&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/s:url&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;s:a href="%{url}"&gt;if\elseif\else&lt;/s:a&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/body&gt;<br />
&lt;/html&gt;<br />
例5 url.jsp </p>
<p>property <br />
描述：<br />
得到'value'的属性,如果value没提供,默认为堆栈顶端的元素。 </p>
<p>参数： </p>
<p>名称 必需 默认 类型 描述 <br />
default 否&nbsp; String 如果属性是null则显示的default值 <br />
escape 否 true Booelean 是否escape HTML <br />
value 否 栈顶 Object 要显示的值 <br />
id 否&nbsp; Object/String 用来标识元素的id。在UI和表单中为HTML的id属性&nbsp; </p>
<p>例子：<br />
请参考例2。 </p>
<p>&nbsp;</p>
<p>--------------------------------------------------------------------------------<br />
UI标志UI标志又可以分为表单UI和非表单UI两部分。表单UI部分基本与Struts 1.x相同，都是对HTML表单元素的包装</p>
<p>。不过，Struts 2.0加了几个我们经常在项目中用到的控件如：datepicker、doubleselect、timepicker、</p>
<p>optiontransferselect等。因为这些标志很多都经常用到，而且参数也很多，要在一篇文章详细说明并非易事。 </p>
<p><br />
&nbsp;需要深入了解这些标志的朋友，可以到以下查看以下网址：<br />
<a href="http://wiki.javascud.org/display/ww2cndoc/Tags">http://wiki.javascud.org/display/ww2cndoc/Tags</a> WebWork2文档中文化计划（中文）<br />
<a href="http://cwiki.apache.org/WW/tag-reference.html">http://cwiki.apache.org/WW/tag-reference.html</a> Tag Developers Guide（英文）<br />
本文有相当的内容也来自这两处。&nbsp; <br />
&nbsp;</p>
<p>--------------------------------------------------------------------------------<br />
Struts 2.0的Action讲解<a href="http://www.blogjava.net/max/archive/2006/10/25/77157.html">http://www.blogjava.net/max/archive/2006/10/25/77157.html</a></p>
<p>当请求HelloWorld.action发生时，Struts运行时（Runtime）根据struts.xml里的Action映射集(Mapping)，实例化</p>
<p>tutoiral.HelloWorld类，并调用其execute方法。当然，我们可以通过以下两种方法改变这种默认调用。这个功能</p>
<p>（Feature）有点类似Struts 1.x中的LookupDispathAction。</p>
<p>在classes/sturts.xml中新建Action，并指明其调用的方法； <br />
访问Action时，在Action名后加上&#8220;!xxx&#8221;（xxx为方法名）。<br />
现方法一，在classes/sturts.xml中加入下面代码：<br />
&lt;action name="AliasHelloWorld" class="tutorial.HelloWorld" method="aliasAction"&gt;<br />
&nbsp;&nbsp; &lt;result&gt;/HelloWorld.jsp&lt;/result&gt;<br />
&lt;/action&gt;例2 classes/struts.xml中AlaisHelloWorld Action的配置<br />
通过上面的两个例子，细心的朋友应该可能会发现classes/tutorial/HelloWorld.java中Action方法（execute和</p>
<p>aliasAction）返回都是SUCCESS。这个属性变量我并没有定义，所以大家应该会猜到它在ActionSupport或其父类中定</p>
<p>义。没错，SUCCESS在接口com.opensymphony.xwork2.Action中定义，另外同时定义的还有ERROR, INPUT, LOGIN, </p>
<p>NONE。</p>
<p>此外，我在配置Action时都没有为result定义名字（name），所以它们默认都为success。值得一提的是Struts 2.0中</p>
<p>的result不仅仅是Struts 1.x中forward的别名，它可以实现除forward外的很激动人心的功能，如将Action输出到</p>
<p>FreeMaker模板、Velocity模板、JasperReports和使用XSL转换等。这些都过result里的type（类型）属性</p>
<p>（Attribute）定义的。另外，您还可以自定义result类型。</p>
<p>下面让我们来做一个Velocity模板输出的例子，首先在classes/struts.xml中新建一个Action映射（Mapping），将其</p>
<p>result类型设为velocity，如以下代码所示：<br />
&lt;action name="VMHelloWorld" class="tutorial.HelloWorld"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;result type="velocity"&gt;/HelloWorld.vm&lt;/result&gt;<br />
&lt;/action&gt;例3 classes/struts.xml中VMHelloWorld Action的配置</p>
<p>新建HelloWorld.vm，内容如下所示：<br />
&lt;html&gt;<br />
&nbsp; &lt;head&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;title&gt;Velocity&lt;/title&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;meta http-equiv="content-type" content="text/html; charset=UTF-8"&gt;<br />
&nbsp; &lt;/head&gt;<br />
&nbsp; &lt;body&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;h2&gt;Message rendered in Velocity: $message&lt;/h2&gt;<br />
&nbsp; &lt;/body&gt;<br />
&lt;/html&gt;例3 HelloWorld.vm</p>
<p><br />
很多时候我的同事会问我：&#8220;如果我要取得Servlet API中的一些对象，如request、response或session等，应该怎么</p>
<p>做？这里的execute不像Struts 1.x的那样在参数中引入。&#8221;开发Web应用程序当然免不了跟这些对象打交道。在</p>
<p>Strutx 2.0你可以有两种方式获得这些对象：非IoC（控制反转Inversion of Control）方式和IoC方式。</p>
<p>非IoC方式</p>
<p>要获得上述对象，关键Struts 2.0中com.opensymphony.xwork2.ActionContext类。我们可以通过它的静态方法</p>
<p>getContext()获取当前Action的上下文对象。 另外，org.apache.struts2.ServletActionContext作为辅助类</p>
<p>（Helper Class），可以帮助您快捷地获得这几个对象。 </p>
<p>HttpServletRequest request = ServletActionContext.getRequest(); <br />
HttpServletResponse response = ServletActionContext.getResponse(); <br />
HttpSession session = request.getSession();<br />
如果你只是想访问session的属性（Attribute），你也可以通过ActionContext.getContext().getSession()获取或添</p>
<p>加session范围（Scoped）的对象。</p>
<p>IoC方式</p>
<p>要使用IoC方式，我们首先要告诉IoC容器（Container）想取得某个对象的意愿，通过实现相应的接口做到这点。具体</p>
<p>实现，请参考例6 IocServlet.java。 <br />
package tutorial;</p>
<p>import javax.servlet.http.HttpServletRequest;<br />
import javax.servlet.http.HttpServletResponse;<br />
import javax.servlet.http.HttpSession;</p>
<p>import org.apache.struts2.ServletActionContext;</p>
<p>import com.opensymphony.xwork2.ActionContext;<br />
import com.opensymphony.xwork2.ActionSupport;</p>
<p>publicclass NonIoCServlet extends ActionSupport {<br />
&nbsp;&nbsp;&nbsp; private String message;<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; public String getMessage() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return message;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; @Override<br />
&nbsp;&nbsp;&nbsp; public String execute() {&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ActionContext.getContext().getSession().put("msg", "Hello World from Session!");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpServletRequest request = ServletActionContext.getRequest();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpServletResponse response = ServletActionContext.getResponse();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpSession session = request.getSession();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StringBuffer sb =new StringBuffer("Message from request: ");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb.append(request.getParameter("msg"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb.append("&lt;br&gt;Response Buffer Size: ");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb.append(response.getBufferSize());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb.append("&lt;br&gt;Session ID: ");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb.append(session.getId());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; message = sb.toString();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return SUCCESS;<br />
&nbsp;&nbsp;&nbsp; }<br />
}例6 classes/tutorial/NonIoCServlet.java</p>
<p>package tutorial;</p>
<p>import java.util.Map;</p>
<p>import javax.servlet.http.HttpServletRequest;<br />
import javax.servlet.http.HttpServletResponse;<br />
import javax.servlet.http.HttpSession;</p>
<p>import org.apache.struts2.interceptor.ServletRequestAware;<br />
import org.apache.struts2.interceptor.ServletResponseAware;<br />
import org.apache.struts2.interceptor.SessionAware;</p>
<p>import com.opensymphony.xwork2.ActionContext;<br />
import com.opensymphony.xwork2.ActionSupport;</p>
<p>publicclass IoCServlet extends ActionSupport implements SessionAware, ServletRequestAware, </p>
<p>ServletResponseAware {<br />
&nbsp;&nbsp;&nbsp; private String message;<br />
&nbsp;&nbsp;&nbsp; private Map att;<br />
&nbsp;&nbsp;&nbsp; private HttpServletRequest request;<br />
&nbsp;&nbsp;&nbsp; private HttpServletResponse response;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; public String getMessage() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return message;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; publicvoid setSession(Map att) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.att = att;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; publicvoid setServletRequest(HttpServletRequest request) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.request = request;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; publicvoid setServletResponse(HttpServletResponse response) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.response = response;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; @Override<br />
&nbsp;&nbsp;&nbsp; public String execute() {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; att.put("msg", "Hello World from Session!");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpSession session = request.getSession();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StringBuffer sb =new StringBuffer("Message from request: ");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb.append(request.getParameter("msg"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb.append("&lt;br&gt;Response Buffer Size: ");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb.append(response.getBufferSize());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb.append("&lt;br&gt;Session ID: ");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sb.append(session.getId());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; message = sb.toString();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return SUCCESS;<br />
&nbsp;&nbsp;&nbsp; }<br />
}例6 classes/tutorial/IoCServlet.java</p>
<p>&lt;%@ page contentType="text/html; charset=UTF-8" %&gt;<br />
&lt;%@ taglib prefix="s" uri="/struts-tags"%&gt;<br />
&lt;html&gt;<br />
&lt;head&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;title&gt;Hello World!&lt;/title&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;h2&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;s:property value="message" escape="false"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;br&gt;Message from session: &lt;s:property value="#session.msg"/&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/h2&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;例6 Servlet.jsp</p>
<p>&lt;action name="NonIoCServlet" class="tutorial.NonIoCServlet"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;result&gt;/Servlet.jsp&lt;/result&gt;<br />
&lt;/action&gt;<br />
&lt;action name="IoCServlet" class="tutorial.IoCServlet"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;result&gt;/Servlet.jsp&lt;/result&gt;<br />
&lt;/action&gt;</p>
<p>&nbsp;</p>
<p><br />
--------------------------------------------------------------------------------<br />
在src文件夹中加入struts.properties文件，内容如下： <br />
struts.custom.i18n.resources=globalMessages<br />
Struts 2.0有两个配置文件，struts.xml和struts.properties都是放在WEB-INF/classes/下。 <br />
struts.xml用于应用程序相关的配置 <br />
struts.properties用于Struts 2.0的运行时（Runtime）的配置</p>
<p><br />
在src文件夹中加入globalMessages_en_US.properties文件，内容如下：<br />
HelloWorld=Hello World!<br />
在src文件夹中加入globalMessages_zh_CN.properties文件，内容如下：<br />
HelloWorld=你好，世界！</p>
<p>在WebContent文件夹下加入HelloWorl.jsp文件，内容如下：<br />
&lt;%@ page&nbsp; contentType="text/html; charset=UTF-8"%&gt;<br />
&lt;<a href="mailto:%@taglib">%@taglib</a> prefix="s" uri="/struts-tags"%&gt;<br />
&lt;html&gt;<br />
&lt;head&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;title&gt;Hello World&lt;/title&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;h2&gt;&lt;s:text name="HelloWorld"/&gt;&lt;/h2&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;h2&gt;&lt;s:property value="%{getText('HelloWorld')}"/&gt;&lt;/h2&gt;<br />
&lt;/body&gt;<br />
&lt;/html&gt;<br />
资源文件查找顺序<br />
之所以说Struts 2.0的国际化更灵活是因为它可以能根据不同需要配置和获取资源（properties）文件。在Struts </p>
<p>2.0中有下面几种方法：</p>
<p>使用全局的资源文件，方法如上例所示。这适用于遍布于整个应用程序的国际化字符串，它们在不同的包（package）</p>
<p>中被引用，如一些比较共用的出错提示； <br />
使用包范围内的资源文件。做法是在包的根目录下新建名的package.properties和package_xx_XX.properties文件。</p>
<p>这就适用于在包中不同类访问的资源； <br />
使用Action范围的资源文件。做法为Action的包下新建文件名（除文件扩展名外）与Action类名同样的资源文件。它</p>
<p>只能在该Action中访问。如此一来，我们就可以在不同的Action里使用相同的properties名表示不同的值。例如，在</p>
<p>ActonOne中title为&#8220;动作一&#8221;，而同样用title在ActionTwo表示&#8220;动作二&#8221;，节省一些命名工夫； <br />
使用&lt;s:i18n&gt;标志访问特定路径的properties文件。使用方法请参考我早前的文章《常用的Struts 2.0的标志（Tag）</p>
<p>介绍》。在您使用这一方法时，请注意&lt;s:i18n&gt;标志的范围。在&lt;s:i18n name="xxxxx"&gt;到&lt;/s:i18n&gt;之间，所有的国</p>
<p>际化字符串都会在名为xxxxx资源文件查找，如果找不到，Struts 2.0就会输出默认值（国际化字符串的名字）。<br />
上面我列举了四种配置和访问资源的方法，它们的范围分别是从大到小，而Struts 2.0在查找国际化字符串所遵循的</p>
<p>是特定的顺序，如图3所示：</p>
<p><br />
图3 资源文件查找顺序图<br />
假设我们在某个ChildAction中调用了getText("user.title")，Struts 2.0的将会执行以下的操作： </p>
<p>查找ChildAction_xx_XX.properties文件或ChildAction.properties； <br />
查找ChildAction实现的接口，查找与接口同名的资源文件MyInterface.properties； <br />
查找ChildAction的父类ParentAction的properties文件，文件名为ParentAction.properties； <br />
判断当前ChildAction是否实现接口ModelDriven。如果是，调用getModel()获得对象，查找与其同名的资源文件； <br />
查找当前包下的package.properties文件； <br />
查找当前包的父包，直到最顶层包； <br />
在值栈（Value Stack）中，查找名为user的属性，转到user类型同名的资源文件，查找键为title的资源; <br />
查找在struts.properties配置的默认的资源文件，参考例1; <br />
输出user.title。<br />
参数化国际化字符串<br />
许多情况下，我们都需要在动行时（runtime）为国际化字符插入一些参数，例如在输入验证提示信息的时候。在</p>
<p>Struts 2.0中，我们通过以下两种方法做到这点：</p>
<p>在资源文件的国际化字符串中使用OGNL，格式为${表达式}，例如：<br />
validation.require=${getText(fileName)} is required<br />
使用java.text.MessageFormat中的字符串格式，格式为{ 参数序号（从0开始）, 格式类形（number | date | time </p>
<p>| choice）, 格式样式}，例如：<br />
validation.between=Date must between {0, date, short} and {1, date, short}<br />
在显示这些国际化字符时，同样有两种方法设置参数的值：</p>
<p>使用标志的value0、value1...valueN的属性，如：<br />
&lt;s:text name="validation.required" value0="User Name"/&gt;<br />
使用param子元素，这些param将按先后顺序，代入到国际化字符串的参数中，例如：<br />
&lt;s:text name="validation.required"&gt;<br />
&nbsp;&nbsp; &lt;s:param value="User Name"/&gt;<br />
&lt;/s:text&gt;<br />
让用户方便地选择语言<br />
开发国际化的应用程序时，有一个功能是必不可少的——让用户快捷地选择或切换语言。在Struts 2.0中，通过</p>
<p>ActionContext.getContext().setLocale(Locale arg)可以设置用户的默认语言。不过，由于这是一个比较普遍的应</p>
<p>用场景（Scenario），所以Struts 2.0为您提供了一个名i18n的拦截器（Interceptor），并在默认情况下将其注册到</p>
<p>拦截器链（Interceptor chain）中。它的原理为在执行Action方法前，i18n拦截器查找请求中的一个名</p>
<p>为"request_locale"的参数。如果其存在，拦截器就将其作为参数实例化Locale对象，并将其设为用户默认的区域</p>
<p>（Locale），最后，将此Locale对象保存在session的名为&#8220;WW_TRANS_I18N_LOCALE&#8221;的属性中。</p>
<p>下面，我将提供一完整示例演示它的使用方法。</p>
<p>package tutorial;</p>
<p>import java.util.Hashtable;<br />
import java.util.Locale;<br />
import java.util.Map;</p>
<p>publicclass Locales {<br />
&nbsp;&nbsp;&nbsp; public Map&lt;String, Locale&gt; getLocales() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Map&lt;String, Locale&gt; locales =new Hashtable&lt;String, Locale&gt;(2);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; locales.put("American English", Locale.US);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; locales.put("Simplified Chinese", Locale.CHINA);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return locales;<br />
&nbsp;&nbsp;&nbsp; }<br />
}tutorial/Locales.java</p>
<p>&lt;<a href="mailto:%@taglib">%@taglib</a> prefix="s" uri="/struts-tags"%&gt;<br />
&lt;script type="text/javascript"&gt;<br />
&lt;!--<br />
&nbsp;&nbsp;&nbsp; function langSelecter_onChanged() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; document.langForm.submit();<br />
&nbsp;&nbsp;&nbsp; }<br />
//--&gt;<br />
&lt;/script&gt;<br />
&lt;s:set name="SESSION_LOCALE" value="#session['WW_TRANS_I18N_LOCALE']"/&gt;<br />
&lt;s:bean id="locales" name="tutorial.Locales"/&gt;<br />
&lt;form action="&lt;s:url includeParams="get" encode="true"/&gt;" name="langForm" <br />
&nbsp;&nbsp;&nbsp; style="background-color: powderblue; padding-top: 4px; padding-bottom: 4px;"&gt;<br />
&nbsp;&nbsp;&nbsp; Language: &lt;s:select label="Language" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; list="#locales.locales" listKey="value"&nbsp;&nbsp;&nbsp; listValue="key"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; value="#SESSION_LOCALE == null ? locale : #SESSION_LOCALE"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name="request_locale" id="langSelecter" <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; onchange="langSelecter_onChanged()" theme="simple"/&gt;<br />
&lt;/form&gt;LangSelector.jsp<br />
上述代码的原理为，LangSelector.jsp先实例化一个Locales对象，并把对象的Map类型的属性locales赋予下拉列表（</p>
<p>select） 。如此一来，下拉列表就获得可用语言的列表。大家看到LangSelector有&lt;s:form&gt;标志和一段Javascript脚</p>
<p>本，它们的作用就是在用户在下拉列表中选择了后，提交包含&#8220;reqeust_locale&#8221;变量的表单到Action。在打开页面</p>
<p>时，为了下拉列表的选中的当前区域，我们需要到session取得当前区域（键为&#8220;WW_TRANS_I18N_LOCALE&#8221;的属性），</p>
<p>而该属性在没有设置语言前是为空的，所以通过值栈中locale属性来取得当前区域（用户浏览器所设置的语言）。</p>
<p>你可以把LangSelector.jsp作为一个控件使用，方法是在JSP页面中把它包含进来，代码如下所示： &lt;s:include </p>
<p>value="/LangSelector.jsp"/&gt;<br />
在例1中的HellloWorld.jsp中&lt;body&gt;后加入上述代码，并在struts.xml中新建Action，代码如下：<br />
&lt;action name="HelloWorld"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;result&gt;/HelloWorld.jsp&lt;/result&gt;<br />
&lt;/action&gt;<br />
或者，如果你多个JSP需要实现上述功能，你可以使用下面的通用配置，而不是为每一个JSP页面都新建一个Action。<br />
&lt;action name="*"&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;result&gt;/{1}.jsp&lt;/result&gt;<br />
&lt;/action&gt;<br />
分布运行程序，在浏览器的地址栏中输入<a href="http://localhost:8080/Struts2_i18n/HelloWorld.action">http://localhost:8080/Struts2_i18n/HelloWorld.action</a>，出现图4所示页</p>
<p>面：</p>
<p>图3 HelloWorld.action</p>
<p>在下拉列表中，选择&#8220;American English&#8221;，出现图5所示页面：</p>
<p>图4 HelloWorld.action<br />
可能大家会问为什么一定要通过Action来访问页面呢？<br />
你可以试一下不用Action而直接用JSP的地址来访问页面，结果会是无论你在下拉列表中选择什么，语言都不会改变。</p>
<p>这表示不能正常运行的。其原因为如果直接使用JSP访问页面，Struts 2.0在web.xml的配置的过滤器（Filter）就不</p>
<p>会工作，所以拦截器链也不会工作。 <br />
</p>
</div>
</div>
<img src ="http://www.blogjava.net/i369/aggbug/157718.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-11-02 12:07 <a href="http://www.blogjava.net/i369/articles/157718.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>深入了解struts中的struts-config.xml  </title><link>http://www.blogjava.net/i369/articles/151217.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Tue, 09 Oct 2007 00:50:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/151217.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/151217.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/151217.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/151217.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/151217.html</trackback:ping><description><![CDATA[<p><u><font color="#800080"><span class="Title"><u><font color="#800080">深入了解struts中的struts-config.xml</font></u>&nbsp;</span></font></u></p>
<p>&nbsp;弄清楚struts-config.xml中各项元素的作用，对于我们构建web项目有莫大的好处。&lt;struts-config&gt;是struts的根元素，它主要有8个子元素，DTD定义如下：</p>
<p>&lt;!ELEMENT struts-config<br />
(data-sources?,form-beans?,global-exceptions?,global-forwards?,action-mappings?,controller?,message-resources*,plug-in*)<br />
&gt;<br />
以上8个元素，下面一一描述：<br />
<font color="#ff0000"><strong>1. date-sources元素<br />
</strong></font><font color="#000000"><strong>　　</strong>date-sources元素用来配置应用程序所需要的数据源。java语言提供了javax.sql.DateSource接口，所有数据源必须实现该接口。如下配置：<br />
&lt;data-sources&gt;<br />
　　&lt;data-source type="org.apache.commons.dbcp.BasicDataSource"&gt;<br />
　　　　&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;<br />
　　&lt;/data-source&gt;<br />
</font>&lt;/data-sources&gt;<br />
在Action中访问方式如：<br />
javax.sql.DataSource dataSource;<br />
java.sql.Connection myConnection;<br />
try<br />
{<br />
　　dataSource = getDataSource(request);<br />
　　myConnection　＝　dataSource.getConnection();<br />
}<br />
&#8230;&#8230;&#8230;&#8230;<br />
　　如果是多数据源，可用如下配置：<br />
&lt;data-sources&gt;<br />
　　&lt;data-source key="a"&nbsp; type="org.apache.commons.dbcp.BasicDataSource"&gt;<br />
　　　　&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;<br />
　　&lt;/data-source&gt;<br />
　　&lt;data-source key="b"&nbsp;&nbsp; type="org.apache.commons.dbcp.BasicDataSource"&gt;<br />
　　　　&#8230;&#8230;&#8230;&#8230;&#8230;&#8230; <br />
　　&lt;/data-source&gt;<br />
&lt;/data-sources&gt;<br />
访问方式：dataSource = getDataSource(request,"a");</p>
<p><strong><font color="#ff0000">&nbsp;2. form-beans元素</font></strong><br />
　　该元素主要用来配置表单验证的类。它包含如下属性：<br />
　　1. classname：一般用得少，指定和form-bean无素对应的配置类，默认为org.apache.struts.config.FormBeanConfig，如果自定义，则必须扩展FormBeanConfig类。可有可无。<br />
　　2. name：ActionForm Bean的惟一标识。必须。<br />
　　3. type：ActionForm的完整类名。必须。<br />
如下所示：<br />
&lt;form-beans&gt;<br />
　　&lt;form-bean <br />
　　　　　　name="Loign"<br />
　　　　　　type="com.ha.login"&gt;<br />
　　&lt;/form-bean&gt;<br />
&lt;/form-beans&gt;<br />
　　如果是动态Action FormBean，还必须配置form-bean元素的form-property子元素。它包含四个属性，上面三个，还有一个initial 元素：以字符串的形式设置表单字段的初始值，如果没有设置该属性，则是基本类型为0，如果是对象则为null。可有可无。如下所示：<br />
&lt;form-beans&gt;<br />
　　&lt;form-bean <br />
　　　　　　name="Loign"<br />
　　　　　　type="com.ha.login"&gt;<br />
　　　　　&lt;form-property name="ok"&nbsp; type="java.lang.String"/&gt;<br />
　　　　　&lt;form-property name="oks"&nbsp; type="java.lang.String"/&gt;<br />
　　　　　&lt;form-property name="okss"&nbsp; type="java.lang.Integer" initial="20"/&gt;<br />
　　&lt;/form-bean&gt;<br />
&lt;/form-beans&gt;</p>
<p><strong><font color="#ff0000">&nbsp;3. global-exceptions元素</font></strong><br />
　　该元素主要配置异常处理，它的exception子元素代表全局的异常配置。struts采取配置的方式来处理异常。它用来设置java异常和异常处理类org.apache.struts.action.ExceptionHandler之间的映射。它有七个属性，如下所示：<br />
　　1. className：指定和exception元素对应的配置类，默认为：org.apache.struts.config.ExceptionConfig。可有可无。<br />
　　2. Handler：指定异常得理类，默认为：org.apache.struts.action.ExceptionHandler。可有可无<br />
　　3. key：指定在Resource Bundle中描述该异常的消息key<br />
　　4. path：指定当异常发生时的转发路径。<br />
　　5. scope：指定ActionMessages实例的存放范围，可选值包括：request和session，默认为request。可有可无。<br />
　　6. type：指定所需处理异常类的名字，必须。<br />
　　7. bundle：指定Resource Bundle<br />
如下所示：<br />
&lt;global-exceptions&gt;<br />
　　&lt;exception <br />
　　　　　　key="global.error.invalidlogin"<br />
　　　　　　path="/error.jsp"<br />
　　　　　　scope="request"<br />
　　　　　　type="com.hn.tree"<br />
　　/&gt;<br />
&lt;/global-exceptions&gt;</p>
<p><font color="#ff0000"><strong>&nbsp;4. global-forwards元素<br />
</strong></font>　　该元素主要用来声明全局的转发关系，它具有以下四个属性：<br />
　　1. className：和forward元素对应的配置类，默认为：org.apache.struts.action.ActionForward。可有可无。<br />
　　2. contextRelative：此项为true时，表时path属性以＂/＂开头，相对于当前上下文的URL，默认为false．可有可无。　<br />
　　3. name：转发路径的逻辑名．必填。<br />
　　4. path：转发或重定向的URL，当contextRelative=false时，URL路径相对于当前应用（application），当为ture时，表示URL路径相对于当前上下文（context）。<br />
　　5.&nbsp; redirect：当此项为ture时，表示执行重定向操作。当此项为false时表示转向操作。默认为false。<br />
如下所示：<br />
&lt;global-forwards&gt;<br />
　　&lt;forward&nbsp; name="forms1" &nbsp;path="/a.do"/&gt;<br />
　　&lt;forward&nbsp; name="forms2" &nbsp;path="/nb.jsp"/&gt;<br />
&lt;global-forwards&gt;</p>
<p><font color="#ff0000"><strong>&nbsp;5. action-mappings元素</strong></font><br />
　　描述从特定的请求路径到相应的Action类的映射。它具有以下几个属性：<br />
　　1. attribute：设置和Action关联的ActionForm Bean在request和session范围内的key。如：Form Bean存在于request范围内，此项设为&#8220;myBenas&#8221;，则在request.getAttribute("myBenas")就可以返回该Bean的实例。<br />
　　2. classsName：和action元素对应的配置元素，默认为：org.apache.struts.action.ActionMapping.<br />
　　3. forward：转发的URL路径。<br />
　　4. include：指定包含的URL路径。<br />
　　5. input：输入表单的URL路径，当表单验证失败时，将把请求转发到该URL。<br />
　　6. name：指定和Action关联的Action FormBean的名字，该名字必须在Form-Bean定义过。<br />
　　7. path：指定访问Action的路径，以&#8220;/&#8221;开头，无扩展名。<br />
　　8. parameter：指定Actgion的配置参数，在Action类的execute()方法中，可以调用ActionMapping对象的getParameter()方法来读取该配置参数。<br />
　　9. roles：指定允许调用该Action的安全角色，多个角色之间用，隔开，在处理请求时，RequestProcessor会根据该配置项来决定用户是否有权限调用Action权限。<br />
　　10. scope：指定ActionForm Bean的存在范围，可选取为request和session，默认为session。<br />
　　11. type：指定Action类的完整类名。<br />
　　12. unknown：如果此项为true，表示可以处理用户发出的所有无效的Action URL，默认为false；<br />
　　13. validate：指定是否要调用Action FormBean的validate方法，默认值为ture.<br />
注：forward、include、type属性只能选中其中一项。<br />
如下：<br />
&lt;action path="/search"<br />
　　　　type="zxj.okBean"<br />
　　　　name="a1"<br />
　　　　scope="request"<br />
　　　　validate="true"<br />
　　　　input="/b.jsp"&gt;<br />
　　&lt;forward name="tig" path="/aa.jsp"/&gt;<br />
&lt;/action&gt;<br />
注：此中的forward是指局部的转发路径。global-forwards表示全局的转发路径。</p>
<p><font color="#ff0000"><strong>&nbsp;6. controller元素<br />
</strong></font>　　该元素用于配置ActionServlet。它具有以下属性。<br />
　　1. bufferSize：指定上载文件的输入缓冲大小，可选，默认为4096<br />
　　2. className：指定和controller元素对应的配置类，默认为org.apache.struts.config.ControllerConfig<br />
　　3. conentType：字符编码，如果在Action和JSP网页中设置了，则覆盖该设置。<br />
　　4. locale：指定是否把Locale对象保存到当前用户的session中，默认值为false.<br />
　　5. processorClass：指定负责请求的java类完整路径。<br />
　　6. tempDir：指定处理文件的临时工作目录，如果此项没有设置，将采用Servlet容器为web应用分配的临时工作目录。<br />
　　7. nochache：如果为true：在响应结果中将加入特定的头参数：Pragma,Cache-Control和Expise，防止页面被保存在客户端的浏览器中，默认为false<br />
如下：<br />
&lt;controller<br />
　　contentType="text/html;charset="UTF-8""<br />
　　locale="true"<br />
　　processorClass="con.ok"/&gt;</p>
<p><font color="#ff0000"><strong>&nbsp;7. message-resources元素</strong></font><br />
　　主要配置本地化消息文本，它具有以下属性。<br />
　　1. className：和message-resources元素对应的配置类，默认为org.apache.struts.config.MessageResourcesConfig。<br />
　　2. factory：指定消息资源的工厂类，默认为：org.apache.struts.util.PropertyMessageResourcesFactory类<br />
　　3. key：指定Resource Bundle存放的ServletContext对象中时采用的属性Key，默认由Globals.MESSAGES_KEY定义的字符串常量，只允许一个Resource Bundle采用默认的属性Key。<br />
　　4. null：指定MessageSources类如何处理未知消息的key，如果为true，则返回空字符串，如果为false，则返回相关字串，默认为false<br />
　　5. prameter：指定MessageSources的资源文件名，如果为：a.b.ApplicationResources，则实际对应的文件路径为：WEB-INF/classes/a/b/ApplicationResources.properties.<br />
如：<br />
&lt;message-resources null="false" parameter="defaultResource"/&gt;<br />
&lt;message-resources key="num1" null="false" parameter="test"/&gt;<br />
访问为：<br />
&lt;bean:message&nbsp; key="zxj"/&gt;<br />
&lt;bean:message&nbsp; key="zxj"&nbsp; bundle="num1"/&gt;<br />
其中，zxj表法，messagesource资源文件中的一个字符串。</p>
<p><font color="#ff0000"><strong>&nbsp;8. plugin-in元素</strong></font><br />
　　配置Struts的插件，属性如下：<br />
　　1.&nbsp;className：指定的Struts插件类，必须实现org.apache.struts.action.PlugiIn接口。如：<br />
&lt;plug-in<br />
　　className="a.b.c."&gt;<br />
　　&lt;set-property property="xxx" value="/WEB-INF/aa.xml"&nbsp;&nbsp;/&gt;<br />
&lt;/plug-in&gt;</p>
<p>&nbsp;后记，多模块的配置，可以供多个应用应用不同的struts-config.xml</p>
<p>(转载于：<a href="http://blog.csdn.net/zxjcool/archive/2006/06/18/810305.aspx">http://blog.csdn.net/zxjcool/archive/2006/06/18/810305.aspx</a>)</p>
<img src ="http://www.blogjava.net/i369/aggbug/151217.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-10-09 08:50 <a href="http://www.blogjava.net/i369/articles/151217.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2访问隐藏的request和session </title><link>http://www.blogjava.net/i369/articles/135780.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Fri, 10 Aug 2007 05:12:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/135780.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/135780.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/135780.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/135780.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/135780.html</trackback:ping><description><![CDATA[<div style="TEXT-INDENT: 21.75pt">在Struts1.*中，要想访问request、response以及session等Servlet对象是很方便的，因为它们一直是作为形参在各个方法之间进行传递的，而在Struts2中我们就很难看到它们的芳踪了，因为我们获得表单中的值都是通过预先设置好了的get方法来得到的，那么如果有些参数我们必须通过request.getParametre或者session.getAttribute来得到，那么应该怎么做呢？按照Max的教程上的说法，可以分为两种：IoC方式和非IoC方式，如何理解这两种方式的区别呢？IoC是Spring里面的特征之一，字面意思是反转控制，说白了就是依赖注入，比方说类A依赖类B，那么就主动的给A注入一个类B的对象，下面看一下这两种方法的具体实现。</div>
<div style="TEXT-INDENT: 21.75pt">1．非Ioc方式</div>
<div style="TEXT-INDENT: 21.75pt">这种方式主要是利用了<span style="BACKGROUND: red; COLOR: black">com.opensymphony.xwork2.ActionContext</span>类以及<span style="BACKGROUND: red">org.apache.struts2.ServletActionContext</span>类，具体的方法如下所示。</div>
<div style="TEXT-INDENT: 21.75pt">获得request对象：</div>
<div style="TEXT-INDENT: 21.75pt"><span style="COLOR: black">A</span><span style="COLOR: black">．</span><span style="COLOR: black">HttpServletRequest request = ServletActionContext.getRequest ();</span></div>
<div style="TEXT-INDENT: 21.75pt">B．ActionContext ct=<span style="COLOR: black"> ActionContext.<em>getContext</em>()</span></div>
<div style="TEXT-INDENT: 21.75pt"><span style="COLOR: black">&nbsp;&nbsp; </span><span style="COLOR: black">HttpServletRequest&nbsp;request=</span></div>
<div style="TEXT-INDENT: 30.7pt"><span style="FONT-SIZE: 10pt; COLOR: black">(HttpServletRequest)ct.get(ServletActionContext.</span><em><span style="FONT-SIZE: 10pt; COLOR: #0000c0">HTTP_REQUEST</span></em><span style="FONT-SIZE: 10pt; COLOR: black">);</span></div>
<div style="TEXT-INDENT: 21.75pt">获得session对象：</div>
<div style="TEXT-INDENT: 21.75pt">在Struts2中底层的session都被封装成了Map类型，我们称之为SessionMap，而平常我们所说的session则是指HttpSession对象，具体的获得方法如下所示。</div>
<div style="TEXT-INDENT: 21.75pt">A．Map session=ActionContext.getSession();</div>
<div style="TEXT-INDENT: 21.75pt">B．Map session=(Map)ActionContext.getContext().get(ActionContext.SESSION);</div>
<div style="TEXT-INDENT: 21.75pt">得到这个SessionMap之后我们就可以对session进行读写了，<span style="BACKGROUND: blue; COLOR: white">如果我们想得到原始的</span><span style="BACKGROUND: blue; COLOR: white">HttpSession</span><span style="BACKGROUND: blue; COLOR: white">可以首先得到</span><span style="BACKGROUND: blue; COLOR: white">HttpServletRequest</span><span style="BACKGROUND: blue; COLOR: white">对象，然后通过</span><span style="BACKGROUND: blue; COLOR: white">request.getSession()</span><span style="BACKGROUND: blue; COLOR: white">来取得原始的</span><span style="BACKGROUND: blue; COLOR: white">HttpSession</span><span style="BACKGROUND: blue; COLOR: white">对象</span>。一般情况下SessionMap已经可以完成所有的工作，我们不必再去碰底层的session了。</div>
<div style="TEXT-INDENT: 21.75pt">2．IoC方式</div>
<div style="TEXT-INDENT: 21.75pt">这种方式相对来说变化就比较少了，具体流程如下所示。</div>
<div style="TEXT-INDENT: 21.75pt">获得request对象：</div>
<div style="TEXT-INDENT: 21.75pt">第一步：让action实现<span style="BACKGROUND: red; COLOR: black">ServletRequestAware</span><span style="COLOR: black">接口</span></div>
<div style="TEXT-INDENT: 21.75pt"><span style="COLOR: black">第二步：在</span><span style="COLOR: black">action</span><span style="COLOR: black">中声明一个</span><span style="COLOR: black">HttpServletRequest</span><span style="COLOR: black">类型的实例变量</span></div>
<div style="MARGIN-LEFT: 63.75pt; TEXT-INDENT: -42pt"><span style="COLOR: black">第三步：在</span><span style="COLOR: black">action</span><span style="COLOR: black">中实现</span><span style="BACKGROUND: red; COLOR: black">ServletRequestAware</span><span style="COLOR: black">接口的</span><span style="FONT-SIZE: 10pt; COLOR: black">setServletRequest</span><span style="FONT-SIZE: 10pt; COLOR: black">方法，实现方式很简单，如下所示。</span></div>
<div align=left><span style="FONT-SIZE: 10pt; COLOR: black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="FONT-SIZE: 10pt; COLOR: #7f0055">private</span></strong><span style="FONT-SIZE: 10pt; COLOR: black"> HttpServletRequest </span><span style="FONT-SIZE: 10pt; COLOR: #0000c0">request</span><span style="FONT-SIZE: 10pt; COLOR: black">;</span></div>
<div style="TEXT-INDENT: 44.25pt" align=left><strong><span style="FONT-SIZE: 10pt; COLOR: #7f0055">public</span></strong><strong><span style="FONT-SIZE: 10pt; COLOR: #7f0055">void</span></strong><span style="FONT-SIZE: 10pt; COLOR: black"> <span style="BACKGROUND: silver">setServletRequest</span>(HttpServletRequest request) {</span></div>
<div align=left><span style="FONT-SIZE: 10pt; COLOR: black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;</span><strong><span style="FONT-SIZE: 10pt; COLOR: #7f0055">this</span></strong><span style="FONT-SIZE: 10pt; COLOR: black">.</span><span style="FONT-SIZE: 10pt; COLOR: #0000c0">request</span><span style="FONT-SIZE: 10pt; COLOR: black"> = request;</span></div>
<div style="MARGIN-LEFT: 61.75pt; TEXT-INDENT: -40pt"><span style="FONT-SIZE: 10pt; COLOR: black">&nbsp;&nbsp;&nbsp; }</span></div>
<div style="MARGIN-LEFT: 61.75pt; TEXT-INDENT: -40pt"><span style="FONT-SIZE: 10pt; COLOR: black">获得</span><span style="FONT-SIZE: 10pt; COLOR: black">Session</span><span style="FONT-SIZE: 10pt; COLOR: black">对象</span><span style="FONT-SIZE: 10pt; COLOR: black">(</span><span style="FONT-SIZE: 10pt; COLOR: black">注意，此时的</span><span style="FONT-SIZE: 10pt; COLOR: black">session</span><span style="FONT-SIZE: 10pt; COLOR: black">是</span><span style="FONT-SIZE: 10pt; COLOR: black">SessionMap</span><span style="FONT-SIZE: 10pt; COLOR: black">类型</span><span style="FONT-SIZE: 10pt; COLOR: black">)</span><span style="FONT-SIZE: 10pt; COLOR: black">：</span></div>
<div style="TEXT-INDENT: 21.75pt">第一步：让action实现<span style="FONT-SIZE: 10pt; BACKGROUND: red; COLOR: black">SessionAware</span><span style="COLOR: black">接口</span></div>
<div style="TEXT-INDENT: 21.75pt"><span style="COLOR: black">第二步：在</span><span style="COLOR: black">action</span><span style="COLOR: black">中声明一个</span><span style="COLOR: black">HttpServletRequest</span><span style="COLOR: black">类型的实例变量</span></div>
<div style="MARGIN-LEFT: 63.75pt; TEXT-INDENT: -42pt"><span style="COLOR: black">第三步：在</span><span style="COLOR: black">action</span><span style="COLOR: black">中实现</span><span style="FONT-SIZE: 10pt; BACKGROUND: red; COLOR: black">SessionAware</span><span style="COLOR: black">接口的</span><span style="FONT-SIZE: 10pt; BACKGROUND: silver; COLOR: black">setSession</span><span style="FONT-SIZE: 10pt; COLOR: black">方法，实现方式很简单，如下所示。</span></div>
<div align=left><span style="FONT-SIZE: 10pt; COLOR: black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><strong><span style="FONT-SIZE: 10pt; COLOR: #7f0055">private</span></strong><span style="FONT-SIZE: 10pt; COLOR: black"> Map </span><span style="FONT-SIZE: 10pt; COLOR: #0000c0">session</span><span style="FONT-SIZE: 10pt; COLOR: black">;</span></div>
<div style="TEXT-INDENT: 44.25pt" align=left><strong><span style="FONT-SIZE: 10pt; COLOR: #7f0055">public</span></strong><strong><span style="FONT-SIZE: 10pt; COLOR: #7f0055">void</span></strong><span style="FONT-SIZE: 10pt; COLOR: black"> setSession(Map session) {</span></div>
<div align=left><span style="FONT-SIZE: 10pt; COLOR: black">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;</span><strong><span style="FONT-SIZE: 10pt; COLOR: #7f0055">this</span></strong><span style="FONT-SIZE: 10pt; COLOR: black">.</span><span style="FONT-SIZE: 10pt; COLOR: #0000c0"> session</span><span style="FONT-SIZE: 10pt; COLOR: black"> = session;</span></div>
<div style="MARGIN-LEFT: 61.75pt; TEXT-INDENT: -40pt"><span style="FONT-SIZE: 10pt; COLOR: black">&nbsp;&nbsp;&nbsp; }</span></div>
<div style="MARGIN-LEFT: 63.75pt; TEXT-INDENT: -42pt">&nbsp;Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1721226</div>
<img src ="http://www.blogjava.net/i369/aggbug/135780.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-08-10 13:12 <a href="http://www.blogjava.net/i369/articles/135780.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts2的struts.properties配置文件详解 </title><link>http://www.blogjava.net/i369/articles/135778.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Fri, 10 Aug 2007 05:07:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/135778.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/135778.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/135778.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/135778.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/135778.html</trackback:ping><description><![CDATA[&nbsp;<!--正文-->struts.action.extension<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The URL extension to use to determine if the request is meant for a Struts action&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用URL扩展名来确定是否这个请求是被用作Struts action，其实也就是设置 action的后缀，例如login.do的'do'字。
<p>struts.configuration<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The org.apache.struts2.config.Configuration implementation class<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.apache.struts2.config.Configuration接口名</p>
<p>struts.configuration.files<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A list of configuration files automatically loaded by Struts&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; struts自动加载的一个配置文件列表</p>
<p>struts.configuration.xml.reload<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Whether to reload the XML configuration or not<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 是否加载xml配置(true,false)</p>
<p>struts.continuations.package<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The package containing actions that use Rife continuations<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 含有actions的完整连续的package名称</p>
<p>struts.custom.i18n.resources<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Location of additional localization properties files to load&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;加载附加的国际化属性文件（不包含.properties后缀）</p>
<p>struts.custom.properties<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Location of additional configuration properties files to load<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 加载附加的配置文件的位置</p>
<p><br>struts.devMode<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Whether Struts is in development mode or not<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 是否为struts开发模式</p>
<p>struts.dispatcher.parametersWorkaround<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Whether to use a Servlet request parameter workaround necessary for some versions of WebLogic<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; （某些版本的weblogic专用）是否使用一个servlet请求参数工作区（PARAMETERSWORKAROUND）</p>
<p>struts.enable.DynamicMethodInvocation<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Allows one to disable dynamic method invocation from the URL<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;允许动态方法调用</p>
<p>struts.freemarker.manager.classname<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The org.apache.struts2.views.freemarker.FreemarkerManager implementation class&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.apache.struts2.views.freemarker.FreemarkerManager接口名</p>
<p>struts.i18n.encoding<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The encoding to use for localization messages<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 国际化信息内码</p>
<p>struts.i18n.reload<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Whether the localization messages should automatically be reloaded<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;是否国际化信息自动加载 </p>
<p>struts.locale<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The default locale for the Struts application<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;默认的国际化地区信息</p>
<p>struts.mapper.class<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The org.apache.struts2.dispatcher.mapper.ActionMapper implementation class<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.apache.struts2.dispatcher.mapper.ActionMapper接口</p>
<p>struts.multipart.maxSize<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The maximize size of a multipart request (file upload)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; multipart请求信息的最大尺寸（文件上传用） </p>
<p>struts.multipart.parser<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The org.apache.struts2.dispatcher.multipart.MultiPartRequest parser implementation for a multipart request (file upload)&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 专为multipart请求信息使用的org.apache.struts2.dispatcher.multipart.MultiPartRequest解析器接口（文件上传用）</p>
<p><br>struts.multipart.saveDir<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The directory to use for storing uploaded files&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 设置存储上传文件的目录夹</p>
<p>struts.objectFactory<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The com.opensymphony.xwork2.ObjectFactory implementation class<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;com.opensymphony.xwork2.ObjectFactory接口（spring）</p>
<p>struts.objectFactory.spring.autoWire<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Whether Spring should autoWire or not<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 是否自动绑定Spring</p>
<p>struts.objectFactory.spring.useClassCache<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Whether Spring should use its class cache or not<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 是否spring应该使用自身的cache </p>
<p>struts.objectTypeDeterminer<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The com.opensymphony.xwork2.util.ObjectTypeDeterminer implementation class<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;com.opensymphony.xwork2.util.ObjectTypeDeterminer接口</p>
<p>struts.serve.static.browserCache<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If static content served by the Struts filter should set browser caching header properties or not&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 是否struts过滤器中提供的静态内容应该被浏览器缓存在头部属性中</p>
<p>struts.serve.static<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Whether the Struts filter should serve static content or not&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 是否struts过滤器应该提供静态内容</p>
<p>struts.tag.altSyntax<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Whether to use the alterative syntax for the tags or not&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 是否可以用替代的语法替代tags</p>
<p>struts.ui.templateDir<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The directory containing UI templates<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UI templates的目录夹 </p>
<p>struts.ui.theme<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The default UI template theme<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 默认的UI template主题</p>
<p>struts.url.http.port<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The HTTP port used by Struts URLs<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 设置http端口</p>
<p>struts.url.https.port<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The HTTPS port used by Struts URLs&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 设置https端口</p>
<p>struts.url.includeParams<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The default includeParams method to generate Struts URLs&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在url中产生&nbsp;默认的includeParams<br></p>
<p>struts.velocity.configfile<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The Velocity configuration file path<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; velocity配置文件路径</p>
<p>struts.velocity.contexts<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; List of Velocity context names<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; velocity的context列表</p>
<p><br>struts.velocity.manager.classname<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.apache.struts2.views.velocity.VelocityManager implementation class<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; org.apache.struts2.views.velocity.VelocityManager接口名</p>
<p>struts.velocity.toolboxlocation<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The location of the Velocity toolbox<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;velocity工具盒的位置 <br>struts.xslt.nocache<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Whether or not XSLT templates should not be cached<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 是否XSLT模版应该被缓存&nbsp; <br></p>
<img src ="http://www.blogjava.net/i369/aggbug/135778.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-08-10 13:07 <a href="http://www.blogjava.net/i369/articles/135778.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>WebWork深入浅出</title><link>http://www.blogjava.net/i369/articles/135461.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Thu, 09 Aug 2007 05:15:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/135461.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/135461.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/135461.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/135461.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/135461.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 本文发表于《开源大本营》&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 作者：钱...&nbsp;&nbsp;<a href='http://www.blogjava.net/i369/articles/135461.html'>阅读全文</a><img src ="http://www.blogjava.net/i369/aggbug/135461.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-08-09 13:15 <a href="http://www.blogjava.net/i369/articles/135461.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用struts上传文件时创建目录以及把文件上传到指定的目录 </title><link>http://www.blogjava.net/i369/articles/134640.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Mon, 06 Aug 2007 02:56:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/134640.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/134640.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/134640.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/134640.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/134640.html</trackback:ping><description><![CDATA[<p>在Action里面取得路径:<br>String pathMyDir = this.getServlet().getServletContext().getRealPath("/uploads/");<br><br>File targetFolder = new File(pathMyDir);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (targetFolder.isFile() || !targetFolder.exists())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;targetFolder.mkdir();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>为避免重复文件名<br>FormFile file = theForm.getTheFile();<br><br>String fileName= file.getFileName();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>int i = fileName.lastIndexOf(".");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(i != -1)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;fileName = fileName.substring(i);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fileName = ".bin";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp; fileName = new Date().getTime()+fileName;<br><br>最后别忘了file.destroy();<br><br>其他的就用struts里面自带的例子搞定.<br>InputStream stream = file.getInputStream();<br>OutputStream bos = new FileOutputStream(pathMyDir+fileName);<br>&nbsp;&nbsp;&nbsp;&nbsp;int bytesRead = 0;<br>&nbsp;&nbsp;&nbsp; byte[] buffer = new byte[8192];<br>&nbsp;&nbsp;&nbsp;&nbsp;while ((bytesRead = stream.read(buffer, 0, 8192)) != -1) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bos.write(buffer, 0, bytesRead);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bos.close();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stream.close();<br></p>
<br><br>
<p id=TBPingURL>Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=250969</p>
<img src ="http://www.blogjava.net/i369/aggbug/134640.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-08-06 10:56 <a href="http://www.blogjava.net/i369/articles/134640.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts-Menu使用指南 </title><link>http://www.blogjava.net/i369/articles/134616.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Mon, 06 Aug 2007 02:30:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/134616.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/134616.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/134616.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/134616.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/134616.html</trackback:ping><description><![CDATA[<table class="fixedTable blogpost" cellSpacing=0 width="100%" border=0>
    <tbody>
        <tr>
            <td id=msgcns!1p_JnSfniDjhIqH4_VuqURcw!136>
            <p><font size=2>&nbsp;一、简介<br>&nbsp; Struts-Menu是一组从基于XML的配置文件中生成多种样式的菜单的JSP Tags，并且可以结合API开发通过数据库生成的动态菜单。Struts-Menu支持国际化和多种权限控制。</font></p>
            <p><font size=2>二、运行环境<br>&nbsp; Windows 2000 Professional<br>&nbsp; JDK 1.4.2_03<br>&nbsp; Eclipse 3.1<br>&nbsp; Tomcat 5.0.28<br>&nbsp; Tomcat Plugin 3.1Beta<br>&nbsp; Struts 1.2.7<br>&nbsp; Commons-Lang 2.1<br>&nbsp; Commons-Collections 3.1<br>&nbsp; Struts-Menu 2.3<br>&nbsp; MySQL 4.1.10a-nt</font></p>
            <p><font size=2>三、下载与安装<br>&nbsp; 1：从</font><a href="http://java.sun.com/"><font color=#049baa size=2>http://java.sun.com</font></a><font size=2>下载J2SDK，当前1.4.x系列的最新版本为1.4.2_08<br>&nbsp; 2：从</font><a href="http://www.eclipse.org/"><font color=#049baa size=2>http://www.eclipse.org</font></a><font size=2>下载Eclipse，当前最新版本为3.1正式版<br>&nbsp; 3：从</font><a href="http://jakarta.apache.org/tomcat"><font color=#049baa size=2>http://jakarta.apache.org/tomcat</font></a><font size=2>下载Tomcat，当前5.x系列的最新版本为5.0.28<br>&nbsp; 4：从</font><a href="http://www.sysdeo.com/eclipse/tomcatplugin"><font color=#049baa size=2>http://www.sysdeo.com/eclipse/tomcatplugin</font></a><font size=2>下载Eclipse的Tomcat插件，对应Eclipse3.1x的最新版本为3.1Beta<br>&nbsp; 5：从</font><a href="http://struts.apache.org/"><font color=#049baa size=2>http://struts.apache.org</font></a><font size=2>下载Struts，当前最新版本为1.2.7<br>&nbsp; 6：从</font><a href="http://jakarta.apache.org/commons/"><font color=#049baa size=2>http://jakarta.apache.org/commons/</font></a><font size=2>下载Commons-Lang，当前最新版本为2.1，下载Commons-Collections，当前最新版本为3.1<br>&nbsp; 7：从</font><a href="http://struts-menu.sourceforge.net/"><font color=#049baa size=2>http://struts-menu.sourceforge.net</font></a><font size=2>下载Struts Menu，当前最新版本为2.3<br>&nbsp; 8：从</font><a href="http://www.mysql.com/"><font color=#049baa size=2>http://www.mysql.com</font></a><font size=2>下载MySQL数据库，4.x系列的最新版本是4.1.12a<br>&nbsp; 9：MySQL、JDK、Eclipse、Tomcat和TomcatPlugin的安装及配置请参考相关资料</font></p>
            <p><font size=2>四、运行示例程序<br>&nbsp; 1：安装好Tomcat后，解压缩struts-menu-2.3.zip，将struts-menu.war释放到Tomcat安装目录下的webapps下，运行Tomcat<br>&nbsp; 2：在地址栏输入</font><a href="http://localhost:8080/struts-menu"><font color=#049baa size=2>http://localhost:8080/struts-menu</font></a></p>
            <p><font size=2>五、安装与配置<br>&nbsp; 1：在Eclipse中新建Tomcat项目，Context为/mymenu，Subdirectory为/web<br>&nbsp; 2：在项目目录下面新建lib目录和web目录及WEB-INF，在web/WEB-INF目录下新建web.xml，内容如下：<br>&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;</font></p>
            <p><font size=2>&lt;!DOCTYPE web-app<br>&nbsp;&nbsp;&nbsp; PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"<br>&nbsp;&nbsp;&nbsp; "</font><a href="http://java.sun.com/dtd/web-app_2_3.dtd"><font color=#049baa size=2>http://java.sun.com/dtd/web-app_2_3.dtd</font></a><font size=2>"&gt;</font></p>
            <p><font size=2>&lt;web-app&gt;<br>&nbsp; &lt;display-name&gt;My Example Application -- Vinton Lee&lt;/display-name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp; &lt;!-- ============= The Struts ActionServlet Configuration ============= --&gt;<br>&nbsp; &lt;servlet&gt;<br>&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;action&lt;/servlet-name&gt;<br>&nbsp;&nbsp;&nbsp; &lt;servlet-class&gt;org.apache.struts.action.ActionServlet&lt;/servlet-class&gt;<br>&nbsp;&nbsp;&nbsp; &lt;init-param&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;config&lt;/param-name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;/WEB-INF/struts-config.xml&lt;/param-value&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/init-param&gt;<br>&nbsp;&nbsp;&nbsp; &lt;load-on-startup&gt;1&lt;/load-on-startup&gt;<br>&nbsp; &lt;/servlet&gt;<br>&nbsp; &lt;!-- ================================================================== --&gt;<br>&nbsp;&nbsp;&nbsp; <br>&nbsp; &lt;!-- ============= The Struts Action Servlet Mapping ================== --&gt;<br>&nbsp; &lt;servlet-mapping&gt;<br>&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;action&lt;/servlet-name&gt;<br>&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;*.do&lt;/url-pattern&gt;<br>&nbsp; &lt;/servlet-mapping&gt;<br>&nbsp; &lt;!-- ================================================================== --&gt;<br>&nbsp; <br>&nbsp; &lt;!-- The Welcome File List --&gt;<br>&nbsp; &lt;welcome-file-list&gt;<br>&nbsp;&nbsp;&nbsp; &lt;welcome-file&gt;index.jsp&lt;/welcome-file&gt;<br>&nbsp; &lt;/welcome-file-list&gt;</font></p>
            <p><font size=2>&nbsp; &lt;!-- =============== The Struts Taglib Definition ===================== --&gt;<br>&nbsp; &lt;taglib&gt;<br>&nbsp;&nbsp;&nbsp; &lt;taglib-uri&gt;struts-bean&lt;/taglib-uri&gt;<br>&nbsp;&nbsp;&nbsp; &lt;taglib-location&gt;/WEB-INF/struts-bean.tld&lt;/taglib-location&gt;<br>&nbsp; &lt;/taglib&gt;<br>&nbsp; &lt;taglib&gt;<br>&nbsp;&nbsp;&nbsp; &lt;taglib-uri&gt;struts-html&lt;/taglib-uri&gt;<br>&nbsp;&nbsp;&nbsp; &lt;taglib-location&gt;/WEB-INF/struts-html.tld&lt;/taglib-location&gt;<br>&nbsp; &lt;/taglib&gt;<br>&nbsp; &lt;taglib&gt;<br>&nbsp;&nbsp;&nbsp; &lt;taglib-uri&gt;struts-logic&lt;/taglib-uri&gt;<br>&nbsp;&nbsp;&nbsp; &lt;taglib-location&gt;/WEB-INF/struts-logic.tld&lt;/taglib-location&gt;<br>&nbsp; &lt;/taglib&gt;<br>&nbsp; &lt;taglib&gt;<br>&nbsp;&nbsp;&nbsp; &lt;taglib-uri&gt;struts-nested&lt;/taglib-uri&gt;<br>&nbsp;&nbsp;&nbsp; &lt;taglib-location&gt;/WEB-INF/struts-nested.tld&lt;/taglib-location&gt;<br>&nbsp; &lt;/taglib&gt;<br>&nbsp; &lt;taglib&gt;<br>&nbsp;&nbsp;&nbsp; &lt;taglib-uri&gt;struts-tiles&lt;/taglib-uri&gt;<br>&nbsp;&nbsp;&nbsp; &lt;taglib-location&gt;/WEB-INF/struts-tiles.tld&lt;/taglib-location&gt;<br>&nbsp; &lt;/taglib&gt;<br>&nbsp; &lt;!-- ================================================================== --&gt;<br>&nbsp; <br>&nbsp; &lt;!-- ============= The Struts-Menu Taglib Definition ================== --&gt;<br>&nbsp; &lt;taglib&gt;<br>&nbsp;&nbsp;&nbsp; &lt;taglib-uri&gt;struts-menu&lt;/taglib-uri&gt;<br>&nbsp;&nbsp;&nbsp; &lt;taglib-location&gt;/WEB-INF/struts-menu.tld&lt;/taglib-location&gt;<br>&nbsp; &lt;/taglib&gt;<br>&nbsp; &lt;!-- ================================================================== --&gt;<br>&lt;/web-app&gt;</font></p>
            <p><font size=2>&nbsp; 3：解压缩struts-1.2.7.zip，将压缩包中的lib目录下所有的8个jar释放到lib目录中，将5个tld文件释放到web\WEB-INF目录中，在web\WEB-INF目录中新建struts-config.xml，内容如下：<br>&lt;?xml version="1.0" encoding="ISO-8859-1" ?&gt;</font></p>
            <p><font size=2>&lt;!DOCTYPE struts-config PUBLIC<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "</font><a href="http://struts.apache.org/dtds/struts-config_1_2.dtd"><font color=#049baa size=2>http://struts.apache.org/dtds/struts-config_1_2.dtd</font></a><font size=2>"&gt;</font></p>
            <p><font size=2>&lt;struts-config&gt;</font></p>
            <p><font size=2>&nbsp;&nbsp;&nbsp; &lt;!-- ========== Data Source Configuration =============================== --&gt;<br>&nbsp;&nbsp;&nbsp; &lt;data-sources /&gt;</font></p>
            <p><font size=2>&nbsp;&nbsp;&nbsp; &lt;!-- ========== Form Bean Definitions =================================== --&gt;<br>&nbsp;&nbsp;&nbsp; &lt;form-beans /&gt;</font></p>
            <p><font size=2>&nbsp;&nbsp;&nbsp; &lt;!-- ========== Global Exception Definitions ============================ --&gt;<br>&nbsp;&nbsp;&nbsp; &lt;global-exceptions /&gt;</font></p>
            <p><font size=2>&nbsp;&nbsp;&nbsp; &lt;!-- ========== Global Forward Definitions ============================== --&gt;<br>&nbsp;&nbsp;&nbsp; &lt;global-forwards /&gt;</font></p>
            <p><font size=2>&nbsp;&nbsp;&nbsp; &lt;!-- ========== Action Mapping Definitions ============================== --&gt;<br>&nbsp;&nbsp;&nbsp; &lt;action-mappings /&gt;</font></p>
            <p><font size=2>&nbsp;&nbsp;&nbsp; &lt;!-- ========== Controller Configuration ================================ --&gt;</font></p>
            <p><font size=2>&nbsp;&nbsp;&nbsp; &lt;!-- ========== Message Resources Definitions =========================== --&gt;<br>&nbsp;&nbsp;&nbsp; &lt;message-resources parameter="application" /&gt;</font></p>
            <p><font size=2>&nbsp;&nbsp;&nbsp; &lt;!-- ========== Plug Ins Configuration ================================== --&gt;<br>&nbsp;&nbsp;&nbsp; &lt;plug-in className="net.sf.navigator.menu.MenuPlugIn"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;set-property property="menuConfig" value="/WEB-INF/menu-config.xml"/&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/plug-in&gt;</font></p>
            <p><font size=2>&lt;/struts-config&gt;</font></p>
            <p><font size=2>&nbsp; 4：解压缩struts-menu-2.3.zip，将压缩包中的jstl-1.0.6.jar、standard-1.0.6.jar、struts-menu-2.3.jar释放到lib目录中，将压缩包中的struts-menu.tld、struts-menu-el.tld释放到web\WEB-INF目录中，解压缩commons-lang-2.1.zip，将commons-lang-2.1.jar解压缩到lib目录中，注意，在Struts-Menu的文档中没有看到需要这个包，但是没有这个包却无法成功加载。在web\WEB-INF目录中新建menu-config.xml，内容如下：<br>&lt;?xml version="1.0" encoding="UTF-8" ?&gt;</font></p>
            <p><font size=2>&lt;MenuConfig&gt;</font></p>
            <p><font size=2>&nbsp; &lt;Displayers&gt;<br>&nbsp;&nbsp;&nbsp; &lt;Displayer&nbsp;&nbsp; name="DropDown"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type="net.sf.navigator.displayer.DropDownMenuDisplayer"/&gt;<br>&nbsp;&nbsp;&nbsp; &lt;Displayer&nbsp;&nbsp; name="Simple"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type="net.sf.navigator.displayer.SimpleMenuDisplayer"/&gt;<br>&nbsp;&nbsp;&nbsp; &lt;Displayer&nbsp;&nbsp; name="CoolMenu"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type="net.sf.navigator.displayer.CoolMenuDisplayer"/&gt;<br>&nbsp;&nbsp;&nbsp; &lt;Displayer&nbsp;&nbsp; name="CoolMenu4"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type="net.sf.navigator.displayer.CoolMenuDisplayer4"/&gt;<br>&nbsp;&nbsp;&nbsp; &lt;Displayer&nbsp;&nbsp; name="MenuForm"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type="net.sf.navigator.example.PermissionsFormMenuDisplayer"/&gt;<br>&nbsp;&nbsp;&nbsp; &lt;Displayer&nbsp;&nbsp; name="ListMenu"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type="net.sf.navigator.displayer.ListMenuDisplayer"/&gt;<br>&nbsp;&nbsp;&nbsp; &lt;Displayer&nbsp;&nbsp; name="TabbedMenu"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type="net.sf.navigator.displayer.TabbedMenuDisplayer"/&gt;<br>&nbsp;&nbsp;&nbsp; &lt;Displayer&nbsp;&nbsp; name="Velocity"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type="net.sf.navigator.displayer.VelocityMenuDisplayer"/&gt;<br>&nbsp; &lt;/Displayers&gt;</font></p>
            <p><font size=2>&nbsp; &lt;Menus&gt;<br>&nbsp;&nbsp;&nbsp; &lt;Menu&nbsp; name="DoorSite"&nbsp; title="DoorSite"&nbsp; description="Some famous doorsite" width="50"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Item&nbsp;&nbsp; name="Yahoo"&nbsp;&nbsp; title="Yahoo"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Item&nbsp;&nbsp; name="YahooIndex"&nbsp;&nbsp; title="Yahoo Index"&nbsp;&nbsp; location="</font><a href='http://www.yahoo.com.cn"/'><font color=#049baa size=2>http://www.yahoo.com.cn"/</font></a><font size=2>&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Item&nbsp;&nbsp; name="YahooMail"&nbsp;&nbsp;&nbsp; title="Yahoo Mail"&nbsp;&nbsp;&nbsp; location="</font><a href='http://cn.mail.yahoo.com"/'><font color=#049baa size=2>http://cn.mail.yahoo.com"/</font></a><font size=2>&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Item&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Item&nbsp;&nbsp;&nbsp; name="Sohu"&nbsp; title="Sohu"&nbsp;&nbsp; location="</font><a href='http://www.sohu.com"/'><font color=#049baa size=2>http://www.sohu.com"/</font></a><font size=2>&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Item&nbsp;&nbsp;&nbsp; name="Sina"&nbsp; title="Sina"&nbsp;&nbsp; location="</font><a href='http://www.sina.com.cn"/'><font color=#049baa size=2>http://www.sina.com.cn"/</font></a><font size=2>&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/Menu&gt;<br>&nbsp; &lt;/Menus&gt;</font></p>
            <p><font size=2>&lt;/MenuConfig&gt;</font></p>
            <p><font size=2>&nbsp; 5：将第四步的示例程序中的struts-menu应用目录下的images、scripts、styles三个目录中的内容复制到web目录下</font></p>
            <p><font size=2>&nbsp; 6：你的目录结构应该类似如下：<br>&nbsp;&nbsp;&nbsp; %PROJECT_HOME%\classes<br>&nbsp;&nbsp;&nbsp; %PROJECT_HOME%\lib<br>&nbsp;&nbsp;&nbsp; %PROJECT_HOME%\lib\antlr.jar<br>&nbsp;&nbsp;&nbsp; %PROJECT_HOME%\lib\commons-beanutils.jar<br>&nbsp;&nbsp;&nbsp; %PROJECT_HOME%\lib\commons-digester.jar<br>&nbsp;&nbsp;&nbsp; %PROJECT_HOME%\lib\commons-fileupload.jar<br>&nbsp;&nbsp;&nbsp; %PROJECT_HOME%\lib\commons-lang-2.1.jar<br>&nbsp;&nbsp;&nbsp; %PROJECT_HOME%\lib\commons-logging.jar<br>&nbsp;&nbsp;&nbsp; %PROJECT_HOME%\lib\commons-validator.jar<br>&nbsp;&nbsp;&nbsp; %PROJECT_HOME%\lib\jakarta-oro.jar<br>&nbsp;&nbsp;&nbsp; %PROJECT_HOME%\lib\jstl-1.0.6.jar<br>&nbsp;&nbsp;&nbsp; %PROJECT_HOME%\lib\standard-1.0.6.jar<br>&nbsp;&nbsp;&nbsp; %PROJECT_HOME%\lib\struts.jar<br>&nbsp;&nbsp;&nbsp; %PROJECT_HOME%\lib\struts-menu-2.3.jar<br>&nbsp;&nbsp;&nbsp; %PROJECT_HOME%\src<br>&nbsp;&nbsp;&nbsp; %PROJECT_HOME%\src\log4j.properties<br>&nbsp;&nbsp;&nbsp; %PROJECT_HOME%\src\application.properties<br>&nbsp;&nbsp;&nbsp; %PROJECT_HOME%\src\application_zh_CN.properties<br>&nbsp;&nbsp;&nbsp; %PROJECT_HOME%\web<br>&nbsp;%PROJECT_HOME%\web\images\...<br>&nbsp;%PROJECT_HOME%\web\scripts\...<br>&nbsp;%PROJECT_HOME%\web\styles\...<br>&nbsp;&nbsp;&nbsp; %PROJECT_HOME%\web\WEB-INF<br>&nbsp;&nbsp;&nbsp; %PROJECT_HOME%\web\WEB-INF\menu-config.xml<br>&nbsp;&nbsp;&nbsp; %PROJECT_HOME%\web\WEB-INF\struts-bean.tld<br>&nbsp;&nbsp;&nbsp; %PROJECT_HOME%\web\WEB-INF\struts-config.xml<br>&nbsp;&nbsp;&nbsp; %PROJECT_HOME%\web\WEB-INF\struts-html.tld<br>&nbsp;&nbsp;&nbsp; %PROJECT_HOME%\web\WEB-INF\struts-logic.tld<br>&nbsp;&nbsp;&nbsp; %PROJECT_HOME%\web\WEB-INF\struts-menu.tld<br>&nbsp;&nbsp;&nbsp; %PROJECT_HOME%\web\WEB-INF\struts-menu-el.tld<br>&nbsp;&nbsp;&nbsp; %PROJECT_HOME%\web\WEB-INF\struts-nested.tld<br>&nbsp;&nbsp;&nbsp; %PROJECT_HOME%\web\WEB-INF\struts-tiles.tld<br>&nbsp;&nbsp;&nbsp; %PROJECT_HOME%\web\WEB-INF\web.xml</font></p>
            <p><font size=2>六、实战Struts-Menu<br>&nbsp; 1：使用配置文件实现静态菜单<br>&nbsp; 新建JSP文件web/static-menu.jsp，内容如下：<br>&lt;%@ page contentType="text/html; charset=GBK" %&gt;<br>&lt;%@ taglib uri="struts-menu" prefix="menu" %&gt;</font></p>
            <p><font size=2>&lt;menu:useMenuDisplayer name="ListMenu" <br>&nbsp;&nbsp;&nbsp; bundle="org.apache.struts.action.MESSAGE"&gt;<br>&nbsp;&nbsp;&nbsp; &lt;menu:displayMenu name="DoorSite"/&gt;<br>&lt;/menu:useMenuDisplayer&gt;<br>&nbsp; 运行Tomcat，在IE地址栏输入</font><a href="http://localhost:8080/mymenu/static-menu.jsp"><font color=#049baa size=2>http://localhost:8080/mymenu/static-menu.jsp</font></a><font size=2>查看</font></p>
            <p><font size=2>&nbsp; 2：实现中文化<br>&nbsp; &gt; 在src\application_zh_CN.properties中增加下面的内容，Unicode可以通过JDK自带的native2ascii工具得到：<br>#门户网站<br>menu.DoorSite=\u95e8\u6237\u7f51\u7ad9<br>#雅虎<br>menu.Yahoo=\u96c5\u864e<br>#雅虎首页<br>menu.YahooIndex=\u96c5\u864e\u9996\u9875<br>#雅虎邮件<br>menu.YahooMail=\u96c5\u864e\u90ae\u4ef6<br>#搜狐<br>menu.Sohu=\u641c\u72d0<br>#新浪<br>menu.Sina=\u65b0\u6d6a<br>&nbsp; &gt; 在src\application.properties中增加下面的内容：<br>#门户网站<br>menu.DoorSite=DoorSite<br>#雅虎<br>menu.Yahoo=Yahoo<br>#雅虎首页<br>menu.YahooIndex=Yahoo Index<br>#雅虎邮件<br>menu.YahooMail=Yahoo Mail<br>#搜狐<br>menu.Sohu=Sohu<br>#新浪<br>menu.Sina=Sina<br>&nbsp; &gt; 修改menu-config.xml文件&lt;Menus&gt;&lt;/Menus&gt;部分：<br>&nbsp; &lt;Menus&gt;<br>&nbsp;&nbsp;&nbsp; &lt;Menu&nbsp; name="DoorSite"&nbsp; title="menu.DoorSite"&nbsp; description="Some famous doorsite" width="50"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Item&nbsp;&nbsp; name="Yahoo"&nbsp;&nbsp; title="menu.Yahoo"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Item&nbsp;&nbsp; name="YahooIndex"&nbsp;&nbsp; title="menu.YahooIndex"&nbsp;&nbsp; location="</font><a href='http://www.yahoo.com.cn"/'><font color=#049baa size=2>http://www.yahoo.com.cn"/</font></a><font size=2>&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Item&nbsp;&nbsp; name="YahooMail"&nbsp;&nbsp;&nbsp; title="menu.YahooMail"&nbsp;&nbsp;&nbsp; location="</font><a href='http://cn.mail.yahoo.com"/'><font color=#049baa size=2>http://cn.mail.yahoo.com"/</font></a><font size=2>&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Item&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Item&nbsp;&nbsp;&nbsp; name="Sohu"&nbsp; title="menu.Sohu"&nbsp;&nbsp; location="</font><a href='http://www.sohu.com"/'><font color=#049baa size=2>http://www.sohu.com"/</font></a><font size=2>&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Item&nbsp;&nbsp;&nbsp; name="Sina"&nbsp; title="menu.Sina"&nbsp;&nbsp; location="</font><a href='http://www.sina.com.cn"/'><font color=#049baa size=2>http://www.sina.com.cn"/</font></a><font size=2>&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/Menu&gt;<br>&nbsp; &lt;/Menus&gt;<br>&nbsp; 重起Tomcat，在IE地址栏输入</font><a href="http://localhost:8080/mymenu/static-menu.jsp"><font color=#049baa size=2>http://localhost:8080/mymenu/static-menu.jsp</font></a><font size=2>查看</font></p>
            <p><font size=2>&nbsp; 3：结合数据库实现动态菜单<br>&nbsp; &gt; 新建数据myexamples：<br>CREATE DATABASE myexamples<br>&nbsp; &gt; 新建数据库表menu_item：<br>CREATE TABLE menu_item (<br>&nbsp;&nbsp; id BIGINT not null,<br>&nbsp;&nbsp; parent_name VARCHAR(30),<br>&nbsp;&nbsp; name VARCHAR(30),<br>&nbsp;&nbsp; title VARCHAR(30),<br>&nbsp;&nbsp; titleCN VARCHAR(30),<br>&nbsp;&nbsp; description VARCHAR(50),<br>&nbsp;&nbsp; location VARCHAR(255),<br>&nbsp;&nbsp; target VARCHAR(10),<br>&nbsp;&nbsp; onclick VARCHAR(100),<br>&nbsp;&nbsp; onmouseover VARCHAR(100),<br>&nbsp;&nbsp; onmouseout VARCHAR(100),<br>&nbsp;&nbsp; image VARCHAR(50),<br>&nbsp;&nbsp; altImage VARCHAR(30),<br>&nbsp;&nbsp; tooltip VARCHAR(100),<br>&nbsp;&nbsp; roles VARCHAR(100),<br>&nbsp;&nbsp; page VARCHAR(255),<br>&nbsp;&nbsp; width VARCHAR(5),<br>&nbsp;&nbsp; height VARCHAR(5),<br>&nbsp;&nbsp; forward VARCHAR(50),<br>&nbsp;&nbsp; action VARCHAR(50),<br>&nbsp;&nbsp; primary key (id)<br>)<br>&nbsp; &gt; 插入测试数据：<br>INSERT INTO menu_item<br>&nbsp;&nbsp;&nbsp; (id, parent_name, name, title, titleCN, location)<br>VALUES<br>&nbsp;&nbsp;&nbsp; (1,null,'DatabaseMenu','Database Menu','数据库动态菜单',null),<br>&nbsp;&nbsp;&nbsp; (2,'DatabaseMenu','Yahoo','Yahoo Mail','雅虎邮件','http://mail.yahoo.com'),<br>&nbsp;&nbsp;&nbsp; (3,'DatabaseMenu','JavaBlogs','JavaBlogs','Java博客','http://javablogs.com'),<br>&nbsp;&nbsp;&nbsp; (4,null,'StandaloneMenu','Standalone Menu','独立的菜单','http://www.sohu.com')<br>&nbsp; &gt; 将数据库驱动程序放到lib目录中，并加入到Build Path，如MySQL的数据库驱动mysql-connector-java-3.1.8-bin.jar，解压缩commons-collections-3.1.zip，将commons-collections-3.1.jar释放到lib目录，并加入Build Path<br>&nbsp; &gt; 新建一个Struts的Action，代码如下：<br>package cn.appex.menu;</font></p>
            <p><font size=2>import java.io.UnsupportedEncodingException;<br>import java.sql.Connection;<br>import java.sql.DriverManager;<br>import java.sql.PreparedStatement;<br>import java.sql.ResultSet;<br>import java.sql.SQLException;<br>import java.util.ArrayList;<br>import java.util.HashMap;<br>import java.util.ListResourceBundle;<br>import java.util.Map;</font></p>
            <p><font size=2>import com.mysql.jdbc.Driver;</font></p>
            <p><font size=2>import javax.servlet.http.HttpServletRequest;<br>import javax.servlet.http.HttpServletResponse;<br>import javax.servlet.http.HttpSession;</font></p>
            <p><font size=2>import net.sf.navigator.menu.MenuComponent;<br>import net.sf.navigator.menu.MenuRepository;<br>import net.sf.navigator.menu.PermissionsAdapter;</font></p>
            <p><font size=2>import org.apache.struts.action.Action;<br>import org.apache.struts.action.ActionForm;<br>import org.apache.struts.action.ActionForward;<br>import org.apache.struts.action.ActionMapping;</font></p>
            <p><font size=2>public class MenuAction extends Action {<br>&nbsp;&nbsp;&nbsp; public ActionForward execute(ActionMapping mapping, ActionForm form,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpServletRequest request, HttpServletResponse response)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throws Exception {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; buildMenuRepository(request);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; buildMenuResourceBundle(request);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; buildMenuPermissions(request);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return (mapping.findForward("success"));<br>&nbsp;&nbsp;&nbsp; }</font></p>
            <p><font size=2>&nbsp;&nbsp;&nbsp; /**<br>&nbsp;&nbsp;&nbsp;&nbsp; * 创建菜单数据结构<br>&nbsp;&nbsp;&nbsp;&nbsp; * <br>&nbsp;&nbsp;&nbsp;&nbsp; * @param request<br>&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp;&nbsp;&nbsp; private void buildMenuRepository(HttpServletRequest request) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MenuRepository repository = new MenuRepository();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Get the repository from the application scope - and copy the<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // DisplayerMappings from it.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MenuRepository defaultRepository = (MenuRepository) request<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .getSession().getServletContext().getAttribute(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MenuRepository.MENU_REPOSITORY_KEY);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; repository.setDisplayers(defaultRepository.getDisplayers());</font></p>
            <p><font size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Map[] menus = getMenuComponents();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i=0; i &lt; menus.length; i++) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MenuComponent mc = new MenuComponent();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Map row = menus[i];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String name = (String) row.get("name");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mc.setName(name);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String parent = (String) row.get("parent_name");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(name + ", parent is: " + parent);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (parent != null) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MenuComponent parentMenu = repository.getMenu(parent);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (parentMenu == null) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("parentMenu '" + parent + "' doesn't exist!");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // create a temporary parentMenu<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parentMenu = new MenuComponent();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parentMenu.setName(parent);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; repository.addMenu(parentMenu);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></p>
            <p><font size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mc.setParent(parentMenu);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String title = (String) row.get("title");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mc.setTitle(title);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String location = (String) row.get("location");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mc.setLocation(location);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String description = (String) row.get("description");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mc.setDescription(description);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; repository.addMenu(mc);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; request.setAttribute("examplesRepository", repository);<br>&nbsp;&nbsp;&nbsp; }</font></p>
            <p><font size=2>&nbsp;&nbsp;&nbsp; /**<br>&nbsp;&nbsp;&nbsp;&nbsp; * 从数据库中读取菜单配置信息<br>&nbsp;&nbsp;&nbsp;&nbsp; * <br>&nbsp;&nbsp;&nbsp;&nbsp; * @return<br>&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp;&nbsp;&nbsp; private Map[] getMenuComponents() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ArrayList list = new ArrayList();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Connection conn = null;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PreparedStatement pstmt = null;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ResultSet rest = null;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String sql = "select name,parent_name,title,location,description from menu_item order by id";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class.forName("com.mysql.jdbc.Driver").newInstance();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conn = DriverManager.getConnection("jdbc:mysql://localhost/myexamples?user=root&amp;password=mywangya&amp;useUnicode=true&amp;characterEncoding=UTF-8");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pstmt = conn.prepareStatement(sql);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rest = pstmt.executeQuery();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (rest.next()) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int i = 1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HashMap map = new HashMap();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map.put("name", rest.getString(i++));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map.put("parent_name", rest.getString(i++));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map.put("title", rest.getString(i++));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map.put("location", rest.getString(i++));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map.put("description", rest.getString(i++));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; list.add(map);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (SQLException ex) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ex.printStackTrace();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (InstantiationException e) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (IllegalAccessException e) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (ClassNotFoundException e) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } finally {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (null!=rest) rest.close();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (null!=pstmt) pstmt.close();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (null!=conn) conn.close();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (SQLException e) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return (Map[]) list.toArray(new HashMap[0]);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; /**<br>&nbsp;&nbsp;&nbsp;&nbsp; * 构造菜单权限<br>&nbsp;&nbsp;&nbsp;&nbsp; * <br>&nbsp;&nbsp;&nbsp;&nbsp; * @param request<br>&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp;&nbsp;&nbsp; private void buildMenuPermissions(HttpServletRequest request) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PermissionsAdapter permession = new PermissionsAdapter() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public boolean isAllowed(MenuComponent menu) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 名称等于StandaloneMenu的菜单不显示<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return !"StandaloneMenu".equalsIgnoreCase(menu.getName());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; };<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; request.setAttribute("examplesPermession", permession);<br>&nbsp;&nbsp;&nbsp; }</font></p>
            <p><font size=2>&nbsp;&nbsp;&nbsp; /**<br>&nbsp;&nbsp;&nbsp;&nbsp; * 构造菜单显示标题<br>&nbsp;&nbsp;&nbsp;&nbsp; * <br>&nbsp;&nbsp;&nbsp;&nbsp; * @param request<br>&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp;&nbsp;&nbsp; private void buildMenuResourceBundle(HttpServletRequest request) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MenuResourceBundle resourceBundle = new MenuResourceBundle();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; request.setAttribute("examplesBundle", resourceBundle);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; /**<br>&nbsp;&nbsp;&nbsp;&nbsp; * MenuResourceBundle树状菜单国际语言显示<br>&nbsp;&nbsp;&nbsp;&nbsp; * <br>&nbsp;&nbsp;&nbsp;&nbsp; * @author wenbin.zhang<br>&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp;&nbsp;&nbsp; class MenuResourceBundle extends ListResourceBundle {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private ArrayList list = new ArrayList();</font></p>
            <p><font size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public MenuResourceBundle() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Connection conn = null;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PreparedStatement pstmt = null;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ResultSet rest = null;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String sql = "select title,titleCN from menu_item order by id";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class.forName("com.mysql.jdbc.Driver").newInstance();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conn = DriverManager.getConnection("jdbc:mysql://localhost/myexamples?user=root&amp;password=mywangya&amp;useUnicode=true&amp;characterEncoding=UTF-8");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pstmt = conn.prepareStatement(sql);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rest = pstmt.executeQuery();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (rest.next()) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int i = 1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String[] message = new String[2];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; message[0] = rest.getString(i++);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; message[1] = new String(rest.getString(i++).getBytes("latin1"), "gbk");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (UnsupportedEncodingException e) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br>&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; if (message[0] != null &amp;&amp; message[1] != null) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; list.add(message);<br>&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; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (SQLException ex) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ex.printStackTrace();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (InstantiationException e) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (IllegalAccessException e) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (ClassNotFoundException e) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } finally {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (null!=rest) rest.close();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (null!=pstmt) pstmt.close();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (null!=conn) conn.close();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (SQLException e) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br>&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; }</font></p>
            <p><font size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></p>
            <p><font size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public Object[][] getContents() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return (String[][]) list.toArray(new String[0][0]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>}</font></p>
            <p><font size=2>&nbsp; &gt; 将struts-config.xml文件的&lt;action-mappings /&gt;部分修改为：<br>&lt;action-mappings&gt;<br>&nbsp; &lt;action path="/menuAction" type="cn.appex.menu.MenuAction" &gt;<br>&nbsp;&nbsp;&nbsp; &lt;forward name="success" path="/struts-menu/dynamic-menu.jsp" /&gt;<br>&nbsp; &lt;/action&gt;<br>&lt;/action-mappings&gt;<br>&nbsp; &gt; 新建JSP文件web/dynamic-menu.jsp，内容如下：<br>&lt;%@ page contentType="text/html; charset=GBK" %&gt;<br>&lt;%@ taglib uri="struts-menu" prefix="menu" %&gt;</font></p>
            <p><font size=2>&lt;p&gt;没有使用Bundle和权限控制:<br>&lt;menu:useMenuDisplayer name="ListMenu" repository="examplesRepository"&gt;<br>&nbsp;&nbsp;&nbsp; &lt;menu:displayMenu name="DatabaseMenu"/&gt;<br>&nbsp;&nbsp;&nbsp; &lt;menu:displayMenu name="StandaloneMenu"/&gt;<br>&lt;/menu:useMenuDisplayer&gt;&lt;/p&gt;</font></p>
            <p><font size=2>&lt;p&gt;使用Bundle, 没有使用权限控制:<br>&lt;menu:useMenuDisplayer name="ListMenu" bundle="examplesBundle" repository="examplesRepository"&gt;<br>&nbsp;&nbsp;&nbsp; &lt;menu:displayMenu name="DatabaseMenu"/&gt;<br>&nbsp;&nbsp;&nbsp; &lt;menu:displayMenu name="StandaloneMenu"/&gt;<br>&lt;/menu:useMenuDisplayer&gt;&lt;/p&gt;</font></p>
            <p><font size=2>&lt;p&gt;使用Bundle和权限控制:<br>&lt;menu:useMenuDisplayer name="ListMenu" permissions="examplesPermession"&nbsp; bundle="examplesBundle" repository="examplesRepository"&gt;<br>&nbsp;&nbsp;&nbsp; &lt;menu:displayMenu name="DatabaseMenu"/&gt;<br>&nbsp;&nbsp;&nbsp; &lt;menu:displayMenu name="StandaloneMenu"/&gt;<br>&lt;/menu:useMenuDisplayer&gt;&lt;/p&gt;<br>&nbsp; 重起Tomcat，在地址栏输入</font><a href="http://localhost:8080/mymenu/menuAction.do"><font color=#049baa size=2>http://localhost:8080/mymenu/menuAction.do</font></a></p>
            <p><font size=2>七、关于Struts-Menu配置文件和API的使用方法，请参考附录中的官方网站</font></p>
            <p><br><font size=2>附：<br>Struts-Menu官方网站：</font><a href="http://struts-menu.sourceforge.net/"><font color=#049baa size=2>http://struts-menu.sourceforge.net</font></a><br><font size=2>数据库驱动的动态菜单：</font><a href="http://demo.raibledesigns.com/struts-menu/dynamicMenu.jsp"><font color=#049baa size=2>http://demo.raibledesigns.com/struts-menu/dynamicMenu.jsp</font></a></p>
            </td>
        </tr>
        <tr>
            <td>
            <table cellSpacing=0 border=0>
                <tbody>
                    <font size=2></font>
                </tbody>
            </table>
            </td>
        </tr>
        <tr>
            <td class=bvh8><font size=2></font></td>
        </tr>
        <tr>
            <td class=line><font size=2></font></td>
        </tr>
    </tbody>
</table>
<br>
<script src="http://www.itsrc.cn/ads/ads_text_728x90_csdn.js"></script>
<br><br>
<p id=TBPingURL>Trackback: <a href="http://tb.blog.csdn.net/TrackBack.aspx?PostId=496331">http://tb.blog.csdn.net/TrackBack.aspx?PostId=496331</a>
<script src="http://localhost:82/PromoteIcon.aspx?id=496331"></script>
</p>
<link href="http://blog.csdn.net/NoExcuse/Services/Pingback.aspx" rel=pingback><!--<rdf:rdf xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"xmlns:dc="http://purl.org/dc/elements/1.1/"xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/"><rdf:descriptionrdf:about="http://blog.csdn.net/noexcuse/archive/2005/10/07/496331.aspx"dc:identifier="http://blog.csdn.net/noexcuse/archive/2005/10/07/496331.aspx"dc:title="struts-menu使用指南"trackback:ping="http://tb.blog.csdn.net/trackback.aspx?postid=496331" /></rdf:rdf>-->
<script>function hide(){showComment();}</script>
<br>
<img src ="http://www.blogjava.net/i369/aggbug/134616.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-08-06 10:30 <a href="http://www.blogjava.net/i369/articles/134616.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用struts-menu_详细实现动态菜单</title><link>http://www.blogjava.net/i369/articles/124651.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Sat, 16 Jun 2007 06:59:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/124651.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/124651.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/124651.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/124651.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/124651.html</trackback:ping><description><![CDATA[<p><strong><font size=2><font color=#0000ff><font face=宋体>准备工作</font>: </font></font></strong></p>
<p>&nbsp;</p>
<p><font color=#0000ff><font size=2><span style="FONT-FAMILY: 宋体">下载</span>struts menu, <span style="FONT-FAMILY: 宋体">解压其中的示例包</span>(struts-menu<span style="FONT-FAMILY: 宋体">里面有些库没有提供</span>,<span style="FONT-FAMILY: 宋体">但示例里面有</span>) </font></font><font color=#0000ff><strong><font size=2><span style="FONT-FAMILY: 宋体">步骤</span> </font></strong></font>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font color=#0000ff><font size=2>1,<span style="FONT-FAMILY: 宋体">新建一个</span>tomcat<span style="FONT-FAMILY: 宋体">工程</span></font></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font color=#0000ff><font size=2>2,<span style="FONT-FAMILY: 宋体">添加</span>webProject<span style="FONT-FAMILY: 宋体">支持</span></font></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体"><font color=#0000ff><font size=2><img alt="" src="http://www.blogjava.net/images/blogjava_net/cinderella/1%E5%8A%A8%E6%80%81%E8%8F%9C%E5%8D%95/%E6%9C%AA%E6%A0%87%E9%A2%98-1.jpg" width=552 border=0><br></font></font></span></p>
<span style="FONT-FAMILY: 宋体">
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font color=#0000ff><font size=2><font face="Times New Roman">3,</font><span style="FONT-FAMILY: 宋体">增加</span><font face="Times New Roman">struts</font></font><span style="FONT-FAMILY: 宋体"><font size=2>支持<br><img alt="" src="http://www.blogjava.net/images/blogjava_net/cinderella/1%E5%8A%A8%E6%80%81%E8%8F%9C%E5%8D%95/%E6%9C%AA%E6%A0%87%E9%A2%98-2.jpg" width=612 border=0><br></font></span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font color=#0000ff><font size=2><font face="Times New Roman">4,</font><span style="FONT-FAMILY: 宋体">增加</span><font face="Times New Roman">jstl</font><span style="FONT-FAMILY: 宋体">支持</span></font></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font color=#0000ff><font size=2><img alt="" src="http://www.blogjava.net/images/blogjava_net/cinderella/1%E5%8A%A8%E6%80%81%E8%8F%9C%E5%8D%95/%E6%9C%AA%E6%A0%87%E9%A2%98-3.jpg" width=588 border=0><br></font></font></p>
<p><font color=#0000ff><font size=2><font face="Times New Roman">5, </font><span style="FONT-FAMILY: 宋体">拷贝必要的</span><font face="Times New Roman">jar</font><span style="FONT-FAMILY: 宋体">库文件到</span><font face="Times New Roman">dbMenuWEB-INFlib </font></font></font><font color=#0000ff><font face="Times New Roman"><font size=2><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log4j-</span><span>1.2.8</span><span>.jar </span></font></font></font><span><font color=#0000ff><font face="Times New Roman"><font size=2>velocity-1.4.jar </font></font></font></span><span><font color=#0000ff><font face="Times New Roman"><font size=2>velocity-tools-view-1.0.jar </font></font></font></span><font color=#0000ff><font size=2><span><font face="Times New Roman">struts-menu-2.3.jar</font></span> </font></font>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font color=#0000ff><font size=2><font face="Times New Roman">6,</font><span style="FONT-FAMILY: 宋体">创建</span><font face="Times New Roman">menu-config.xml</font><span style="FONT-FAMILY: 宋体">文件在</span><font face="Times New Roman">dbMenuWEB-INF</font><span style="FONT-FAMILY: 宋体">目录。</span><span style="FONT-FAMILY: 宋体">内容如下</span></font><font face="Times New Roman"><font size=2>:<br></font></font></font></p>
<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid; moz-background-clip: initial; moz-background-origin: initial; moz-background-inline-policy: initial">
<div><font color=#0000ff><font face="Times New Roman"><font size=2><span>&lt;?</span><span>xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"&nbsp;</span><span>?&gt;</span></font><span><br><br></span><font size=2><span>&lt;</span><span>MenuConfig</span><span>&gt;</span></font><span><br><br><font size=2>&nbsp;&nbsp;</font></span><font size=2><span>&lt;</span><span>Displayers</span><span>&gt;</span></font><span><br><font size=2>&nbsp;&nbsp;&nbsp;&nbsp;</font></span><font size=2><span>&lt;</span><span>Displayer&nbsp;&nbsp;&nbsp;</span><span>name</span><span>="DropDown"</span></font><span><br><font size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type</font></span><font size=2><span>="net.sf.navigator.displayer.DropDownMenuDisplayer"</span><span>/&gt;</span></font><span><br><font size=2>&nbsp;&nbsp;&nbsp;&nbsp;</font></span><font size=2><span>&lt;</span><span>Displayer&nbsp;&nbsp;&nbsp;</span><span>name</span><span>="Simple"</span></font><span><br><font size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type</font></span><font size=2><span>="net.sf.navigator.displayer.SimpleMenuDisplayer"</span><span>/&gt;</span></font><span><br><font size=2>&nbsp;&nbsp;&nbsp;&nbsp;</font></span><font size=2><span>&lt;</span><span>Displayer&nbsp;&nbsp;&nbsp;</span><span>name</span><span>="CoolMenu"</span></font><span><br><font size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type</font></span><font size=2><span>="net.sf.navigator.displayer.CoolMenuDisplayer"</span><span>/&gt;</span></font><span><br><font size=2>&nbsp;&nbsp;&nbsp;&nbsp;</font></span><font size=2><span>&lt;</span><span>Displayer&nbsp;&nbsp;&nbsp;</span><span>name</span><span>="CoolMenu4"</span></font><span><br><font size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type</font></span><font size=2><span>="net.sf.navigator.displayer.CoolMenuDisplayer4"</span><span>/&gt;</span></font><span><br><font size=2>&nbsp;&nbsp;&nbsp;&nbsp;</font></span><font size=2><span>&lt;</span><span>Displayer&nbsp;&nbsp;&nbsp;</span><span>name</span><span>="MenuForm"</span></font><span><br><font size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type</font></span><font size=2><span>="net.sf.navigator.example.PermissionsFormMenuDisplayer"</span><span>/&gt;</span></font><span><br><font size=2>&nbsp;&nbsp;&nbsp;&nbsp;</font></span><font size=2><span>&lt;</span><span>Displayer&nbsp;&nbsp;&nbsp;</span><span>name</span><span>="ListMenu"</span></font><span><br><font size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type</font></span><font size=2><span>="net.sf.navigator.displayer.ListMenuDisplayer"</span><span>/&gt;</span></font><span><br><font size=2>&nbsp;&nbsp;&nbsp;&nbsp;</font></span><font size=2><span>&lt;</span><span>Displayer&nbsp;&nbsp;&nbsp;</span><span>name</span><span>="TabbedMenu"</span></font><span><br><font size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type</font></span><font size=2><span>="net.sf.navigator.displayer.TabbedMenuDisplayer"</span><span>/&gt;</span></font><span><br><font size=2>&nbsp;&nbsp;&nbsp;&nbsp;</font></span><font size=2><span>&lt;</span><span>Displayer&nbsp;&nbsp;&nbsp;</span><span>name</span><span>="Velocity"</span></font><span><br><font size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type</font></span><font size=2><span>="net.sf.navigator.displayer.VelocityMenuDisplayer"</span><span>/&gt;</span></font><span><br><font size=2>&nbsp;&nbsp;</font></span><font size=2><span>&lt;/</span><span>Displayers</span><span>&gt;</span></font><span><br><font size=2>&nbsp;&nbsp;<br></font></span><font size=2><span>&lt;/</span><span>MenuConfig</span><span>&gt;</span></font><span><br></span></font></font></div>
</div>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt">&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid; moz-background-clip: initial; moz-background-origin: initial; moz-background-inline-policy: initial">
<div><font size=2><span>&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>plug-in&nbsp;</span><span>className</span><span>="net.sf.navigator.menu.MenuPlugIn"</span><span>&gt;</span></font><span><br><font size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font></span><font size=2><span>&lt;</span><span>set-property&nbsp;</span><span>property</span><span>="menuConfig"</span></font><span><br><font size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value</font></span><font size=2><span>="/WEB-INF/menu-config.xml"</span><span>/&gt;</span></font><span><br><font size=2>&nbsp;&nbsp;&nbsp;</font></span><font size=2><span>&lt;/</span><span>plug-in</span><span>&gt;</span></font><span><br></span></div>
</div>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font size=2><font face="Times New Roman">8,</font><span style="FONT-FAMILY: 宋体">拷贝必要的文件</span></font></p>
<p><span><font face="Times New Roman"><font size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Images/*.* </font></font></span><span><font face="Times New Roman"><font size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Scripts/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; menuExpandable.js xtree.js </font></font></span><span><font face="Times New Roman"><font size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Styles/&nbsp;&nbsp;&nbsp;&nbsp; menuExpandable.css&nbsp;&nbsp; global.css&nbsp;&nbsp; xtree.css </font></font></span><span><font face="Times New Roman"><font size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Templates/xtree.html </font></font></span><font size=2><span><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dbMenuWEB-INFclassesglobalMacros.vm&nbsp;&nbsp; (</font></span><span style="FONT-FAMILY: 宋体">这个文件好像必须要最后拷贝</span><span><font face="Times New Roman">,</font></span><span style="FONT-FAMILY: 宋体">否则会自动没了</span><span><font face="Times New Roman">why???) </font></span></font>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font size=2><font face="Times New Roman">10, </font><span style="FONT-FAMILY: 宋体">拷贝</span><font face="Times New Roman">tld</font><span style="FONT-FAMILY: 宋体">文件到</span><font face="Times New Roman">dbMenuWEB-INF</font></font></p>
<p><span><font face="Times New Roman"><font size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; struts-menu.tld<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></font></span><font size=2><span><font face="Times New Roman">struts-menu-el.tld</font></span> </font>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font size=2><font face="Times New Roman">11, </font><span style="FONT-FAMILY: 宋体">不知道什么原因</span><font face="Times New Roman">,</font><span style="FONT-FAMILY: 宋体">需要修改</span><font face="Times New Roman">web.xml</font><span style="FONT-FAMILY: 宋体">文件中的</span><font face="Times New Roman">version=2.3</font></font></p>
<p><span><font face="Times New Roman"><font size=2>&lt;web-app version="2.3"&gt; </font></font></span>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font size=2><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Web.xml</font><span style="FONT-FAMILY: 宋体">中增加</span></font><span style="FONT-FAMILY: 宋体"></span></p>
<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid; moz-background-clip: initial; moz-background-origin: initial; moz-background-inline-policy: initial">
<div><font size=2><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top border=0><span>&lt;</span><span>context-param</span><span>&gt;</span></font><span><br><font size=2><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top border=0>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font></span><font size=2><span>&lt;</span><span>param-name</span><span>&gt;</span><span>javax.servlet.jsp.jstl.fmt.localizationContext</span><span>&lt;/</span><span>param-name</span><span>&gt;</span></font><span><br><font size=2><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top border=0>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font></span><font size=2><span>&lt;</span><span>param-value</span><span>&gt;</span><span>TrackerRes</span><span>&lt;/</span><span>param-value</span><span>&gt;</span></font><span><br><font size=2><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top border=0>&nbsp;&nbsp;&nbsp;&nbsp;</font></span><font size=2><span>&lt;/</span><span>context-param</span><span>&gt;</span></font><span><br><font size=2><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top border=0></font></span></div>
</div>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt">&nbsp;</p>
<p>&#160;</p>
<p>&nbsp;</p>
<p>&#160;</p>
<p><font face="Times New Roman">&nbsp;</font></p>
<p>&#160;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&#160;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><font face="Times New Roman">&nbsp;</font></p>
</span><font color=#0000ff><font size=2><font face="宋体, MS Song">7,</font><span style="FONT-FAMILY: 宋体">修改</span><font face="宋体, MS Song">struts-config.xml </font><span style="FONT-FAMILY: 宋体">文件</span><font face="宋体, MS Song">,</font></font><span style="FONT-FAMILY: 宋体"><font size=2>增加如下部分</font> </span></font><span style="FONT-SIZE: 9pt; COLOR: navy; FONT-FAMILY: Arial">
<p><font color=#0000ff><font color=#000000><font size=2><font face="Times New Roman">11,</font><span style="FONT-FAMILY: 宋体">创建数据库</span></font></font></font></p>
<p>&nbsp;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font color=#0000ff><font color=#000000><font size=2><font face="Times New Roman">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font><span style="FONT-FAMILY: 宋体">仿造如下代码创建数据库</span></font></font></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; moz-background-clip: initial; moz-background-origin: initial; moz-background-inline-policy: initial" align=left><font color=#0000ff><font size=2></font></font></p>
<div style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid; moz-background-clip: initial; moz-background-origin: initial; moz-background-inline-policy: initial">
<div><font color=#0000ff><font size=2><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>sql:</span><span>update</span><span>&gt;</span></font><span><br><font size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font></span><font size=2><span>CREATE</span><span>&nbsp;</span><span>TABLE</span></font><font size=2><span>&nbsp;menu_item&nbsp;(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id&nbsp;BIGINT&nbsp;</span><span>not</span><span>&nbsp;</span><span>null</span></font><font size=2><span>,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parent_name&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #000000">VARCHAR</span><span>(</span><span style="FONT-WEIGHT: bold; COLOR: #800000">30</span></font><font size=2><span>),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #000000">VARCHAR</span><span>(</span><span style="FONT-WEIGHT: bold; COLOR: #800000">30</span></font><font size=2><span>),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;title&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #000000">VARCHAR</span><span>(</span><span style="FONT-WEIGHT: bold; COLOR: #800000">30</span></font><font size=2><span>),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;description&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #000000">VARCHAR</span><span>(</span><span style="FONT-WEIGHT: bold; COLOR: #800000">50</span></font><font size=2><span>),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;location&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #000000">VARCHAR</span><span>(</span><span style="FONT-WEIGHT: bold; COLOR: #800000">255</span></font><font size=2><span>),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;target&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #000000">VARCHAR</span><span>(</span><span style="FONT-WEIGHT: bold; COLOR: #800000">10</span></font><font size=2><span>),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;onclick&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #000000">VARCHAR</span><span>(</span><span style="FONT-WEIGHT: bold; COLOR: #800000">100</span></font><font size=2><span>),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;onmouseover&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #000000">VARCHAR</span><span>(</span><span style="FONT-WEIGHT: bold; COLOR: #800000">100</span></font><font size=2><span>),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;onmouseout&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #000000">VARCHAR</span><span>(</span><span style="FONT-WEIGHT: bold; COLOR: #800000">100</span></font><font size=2><span>),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #000000">image</span><span>&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #000000">VARCHAR</span><span>(</span><span style="FONT-WEIGHT: bold; COLOR: #800000">50</span></font><font size=2><span>),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;altImage&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #000000">VARCHAR</span><span>(</span><span style="FONT-WEIGHT: bold; COLOR: #800000">30</span></font><font size=2><span>),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tooltip&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #000000">VARCHAR</span><span>(</span><span style="FONT-WEIGHT: bold; COLOR: #800000">100</span></font><font size=2><span>),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;roles&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #000000">VARCHAR</span><span>(</span><span style="FONT-WEIGHT: bold; COLOR: #800000">100</span></font><font size=2><span>),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;page&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #000000">VARCHAR</span><span>(</span><span style="FONT-WEIGHT: bold; COLOR: #800000">255</span></font><font size=2><span>),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;width&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #000000">VARCHAR</span><span>(</span><span style="FONT-WEIGHT: bold; COLOR: #800000">5</span></font><font size=2><span>),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;height&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #000000">VARCHAR</span><span>(</span><span style="FONT-WEIGHT: bold; COLOR: #800000">5</span></font><font size=2><span>),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;forward&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #000000">VARCHAR</span><span>(</span><span style="FONT-WEIGHT: bold; COLOR: #800000">50</span></font><font size=2><span>),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;action&nbsp;</span><span style="FONT-WEIGHT: bold; COLOR: #000000">VARCHAR</span><span>(</span><span style="FONT-WEIGHT: bold; COLOR: #800000">50</span></font><font size=2><span>),<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>primary</span><span>&nbsp;</span><span>key</span></font><font size=2><span>&nbsp;(id)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br></span><span>&lt;/</span><span>sql:</span><span>update</span><span>&gt;</span></font><span><br></span></font></div>
</div>
</span>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font color=#0000ff size=2>12,</font><span style="FONT-FAMILY: 宋体"><font color=#0000ff><font size=2>填写数据库<br><img alt="" src="http://www.blogjava.net/images/blogjava_net/cinderella/1%E5%8A%A8%E6%80%81%E8%8F%9C%E5%8D%95/%E6%9C%AA%E6%A0%87%E9%A2%98-4.jpg" width=354 border=0></font></font></span></p>
<p>&#160;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<br><br>
<p id=TBPingURL>Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=640825</p>
<img src ="http://www.blogjava.net/i369/aggbug/124651.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-06-16 14:59 <a href="http://www.blogjava.net/i369/articles/124651.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts-Menu使用指南 </title><link>http://www.blogjava.net/i369/articles/124649.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Sat, 16 Jun 2007 06:58:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/124649.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/124649.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/124649.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/124649.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/124649.html</trackback:ping><description><![CDATA[<table class="fixedTable blogpost" cellSpacing=0 width="100%" border=0>
    <tbody>
        <tr>
            <td id=msgcns!1p_JnSfniDjhIqH4_VuqURcw!136>
            <p><font size=2>一、简介<br>&nbsp; Struts-Menu是一组从基于XML的配置文件中生成多种样式的菜单的JSP Tags，并且可以结合API开发通过数据库生成的动态菜单。Struts-Menu支持国际化和多种权限控制。</font></p>
            <p><font size=2>二、运行环境<br>&nbsp; Windows 2000 Professional<br>&nbsp; JDK 1.4.2_03<br>&nbsp; Eclipse 3.1<br>&nbsp; Tomcat 5.0.28<br>&nbsp; Tomcat Plugin 3.1Beta<br>&nbsp; Struts 1.2.7<br>&nbsp; Commons-Lang 2.1<br>&nbsp; Commons-Collections 3.1<br>&nbsp; Struts-Menu 2.3<br>&nbsp; MySQL 4.1.10a-nt</font></p>
            <p><font size=2>三、下载与安装<br>&nbsp; 1：从</font><a href="http://java.sun.com/"><font color=#049baa size=2><u>http://java.sun.com</u></font></a><font size=2>下载J2SDK，当前1.4.x系列的最新版本为1.4.2_08<br>&nbsp; 2：从</font><a href="http://www.eclipse.org/"><font color=#049baa size=2><u>http://www.eclipse.org</u></font></a><font size=2>下载Eclipse，当前最新版本为3.1正式版<br>&nbsp; 3：从</font><a href="http://jakarta.apache.org/tomcat"><font color=#049baa size=2><u>http://jakarta.apache.org/tomcat</u></font></a><font size=2>下载Tomcat，当前5.x系列的最新版本为5.0.28<br>&nbsp; 4：从</font><a href="http://www.sysdeo.com/eclipse/tomcatplugin"><font color=#049baa size=2><u>http://www.sysdeo.com/eclipse/tomcatplugin</u></font></a><font size=2>下载Eclipse的Tomcat插件，对应Eclipse3.1x的最新版本为3.1Beta<br>&nbsp; 5：从</font><a href="http://struts.apache.org/"><font color=#049baa size=2><u>http://struts.apache.org</u></font></a><font size=2>下载Struts，当前最新版本为1.2.7<br>&nbsp; 6：从</font><a href="http://jakarta.apache.org/commons/"><font color=#049baa size=2><u>http://jakarta.apache.org/commons/</u></font></a><font size=2>下载Commons-Lang，当前最新版本为2.1，下载Commons-Collections，当前最新版本为3.1<br>&nbsp; 7：从</font><a href="http://struts-menu.sourceforge.net/"><font color=#049baa size=2><u>http://struts-menu.sourceforge.net</u></font></a><font size=2>下载Struts Menu，当前最新版本为2.3<br>&nbsp; 8：从</font><a href="http://www.mysql.com/"><font color=#049baa size=2><u>http://www.mysql.com</u></font></a><font size=2>下载MySQL数据库，4.x系列的最新版本是4.1.12a<br>&nbsp; 9：MySQL、JDK、Eclipse、Tomcat和TomcatPlugin的安装及配置请参考相关资料</font></p>
            <p><font size=2>四、运行示例程序<br>&nbsp; 1：安装好Tomcat后，解压缩struts-menu-2.3.zip，将struts-menu.war释放到Tomcat安装目录下的webapps下，运行Tomcat<br>&nbsp; 2：在地址栏输入</font><a href="http://localhost:8080/struts-menu"><font color=#049baa size=2><u>http://localhost:8080/struts-menu</u></font></a></p>
            <p><font size=2>五、安装与配置<br>&nbsp; 1：在Eclipse中新建Tomcat项目，Context为/mymenu，Subdirectory为/web<br>&nbsp; 2：在项目目录下面新建lib目录和web目录及WEB-INF，在web/WEB-INF目录下新建web.xml，内容如下：<br>&lt;?xml version="1.0" encoding="ISO-8859-1"?&gt;</font></p>
            <p><font size=2>&lt;!DOCTYPE web-app<br>&nbsp;&nbsp;&nbsp; PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"<br>&nbsp;&nbsp;&nbsp; "</font><a href="http://java.sun.com/dtd/web-app_2_3.dtd"><font color=#049baa size=2><u>http://java.sun.com/dtd/web-app_2_3.dtd</u></font></a><font size=2>"&gt;</font></p>
            <p><font size=2>&lt;web-app&gt;<br>&nbsp; &lt;display-name&gt;My Example Application -- Vinton Lee&lt;/display-name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp; &lt;!-- ============= The Struts ActionServlet Configuration ============= --&gt;<br>&nbsp; &lt;servlet&gt;<br>&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;action&lt;/servlet-name&gt;<br>&nbsp;&nbsp;&nbsp; &lt;servlet-class&gt;org.apache.struts.action.ActionServlet&lt;/servlet-class&gt;<br>&nbsp;&nbsp;&nbsp; &lt;init-param&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;config&lt;/param-name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;/WEB-INF/struts-config.xml&lt;/param-value&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/init-param&gt;<br>&nbsp;&nbsp;&nbsp; &lt;load-on-startup&gt;1&lt;/load-on-startup&gt;<br>&nbsp; &lt;/servlet&gt;<br>&nbsp; &lt;!-- ================================================================== --&gt;<br>&nbsp;&nbsp;&nbsp; <br>&nbsp; &lt;!-- ============= The Struts Action Servlet Mapping ================== --&gt;<br>&nbsp; &lt;servlet-mapping&gt;<br>&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;action&lt;/servlet-name&gt;<br>&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;*.do&lt;/url-pattern&gt;<br>&nbsp; &lt;/servlet-mapping&gt;<br>&nbsp; &lt;!-- ================================================================== --&gt;<br>&nbsp; <br>&nbsp; &lt;!-- The Welcome File List --&gt;<br>&nbsp; &lt;welcome-file-list&gt;<br>&nbsp;&nbsp;&nbsp; &lt;welcome-file&gt;index.jsp&lt;/welcome-file&gt;<br>&nbsp; &lt;/welcome-file-list&gt;</font></p>
            <p><font size=2>&nbsp; &lt;!-- =============== The Struts Taglib Definition ===================== --&gt;<br>&nbsp; &lt;taglib&gt;<br>&nbsp;&nbsp;&nbsp; &lt;taglib-uri&gt;struts-bean&lt;/taglib-uri&gt;<br>&nbsp;&nbsp;&nbsp; &lt;taglib-location&gt;/WEB-INF/struts-bean.tld&lt;/taglib-location&gt;<br>&nbsp; &lt;/taglib&gt;<br>&nbsp; &lt;taglib&gt;<br>&nbsp;&nbsp;&nbsp; &lt;taglib-uri&gt;struts-html&lt;/taglib-uri&gt;<br>&nbsp;&nbsp;&nbsp; &lt;taglib-location&gt;/WEB-INF/struts-html.tld&lt;/taglib-location&gt;<br>&nbsp; &lt;/taglib&gt;<br>&nbsp; &lt;taglib&gt;<br>&nbsp;&nbsp;&nbsp; &lt;taglib-uri&gt;struts-logic&lt;/taglib-uri&gt;<br>&nbsp;&nbsp;&nbsp; &lt;taglib-location&gt;/WEB-INF/struts-logic.tld&lt;/taglib-location&gt;<br>&nbsp; &lt;/taglib&gt;<br>&nbsp; &lt;taglib&gt;<br>&nbsp;&nbsp;&nbsp; &lt;taglib-uri&gt;struts-nested&lt;/taglib-uri&gt;<br>&nbsp;&nbsp;&nbsp; &lt;taglib-location&gt;/WEB-INF/struts-nested.tld&lt;/taglib-location&gt;<br>&nbsp; &lt;/taglib&gt;<br>&nbsp; &lt;taglib&gt;<br>&nbsp;&nbsp;&nbsp; &lt;taglib-uri&gt;struts-tiles&lt;/taglib-uri&gt;<br>&nbsp;&nbsp;&nbsp; &lt;taglib-location&gt;/WEB-INF/struts-tiles.tld&lt;/taglib-location&gt;<br>&nbsp; &lt;/taglib&gt;<br>&nbsp; &lt;!-- ================================================================== --&gt;<br>&nbsp; <br>&nbsp; &lt;!-- ============= The Struts-Menu Taglib Definition ================== --&gt;<br>&nbsp; &lt;taglib&gt;<br>&nbsp;&nbsp;&nbsp; &lt;taglib-uri&gt;struts-menu&lt;/taglib-uri&gt;<br>&nbsp;&nbsp;&nbsp; &lt;taglib-location&gt;/WEB-INF/struts-menu.tld&lt;/taglib-location&gt;<br>&nbsp; &lt;/taglib&gt;<br>&nbsp; &lt;!-- ================================================================== --&gt;<br>&lt;/web-app&gt;</font></p>
            <p><font size=2>&nbsp; 3：解压缩struts-1.2.7.zip，将压缩包中的lib目录下所有的8个jar释放到lib目录中，将5个tld文件释放到web\WEB-INF目录中，在web\WEB-INF目录中新建struts-config.xml，内容如下：<br>&lt;?xml version="1.0" encoding="ISO-8859-1" ?&gt;</font></p>
            <p><font size=2>&lt;!DOCTYPE struts-config PUBLIC<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "</font><a href="http://struts.apache.org/dtds/struts-config_1_2.dtd"><font color=#049baa size=2><u>http://struts.apache.org/dtds/struts-config_1_2.dtd</u></font></a><font size=2>"&gt;</font></p>
            <p><font size=2>&lt;struts-config&gt;</font></p>
            <p><font size=2>&nbsp;&nbsp;&nbsp; &lt;!-- ========== Data Source Configuration =============================== --&gt;<br>&nbsp;&nbsp;&nbsp; &lt;data-sources /&gt;</font></p>
            <p><font size=2>&nbsp;&nbsp;&nbsp; &lt;!-- ========== Form Bean Definitions =================================== --&gt;<br>&nbsp;&nbsp;&nbsp; &lt;form-beans /&gt;</font></p>
            <p><font size=2>&nbsp;&nbsp;&nbsp; &lt;!-- ========== Global Exception Definitions ============================ --&gt;<br>&nbsp;&nbsp;&nbsp; &lt;global-exceptions /&gt;</font></p>
            <p><font size=2>&nbsp;&nbsp;&nbsp; &lt;!-- ========== Global Forward Definitions ============================== --&gt;<br>&nbsp;&nbsp;&nbsp; &lt;global-forwards /&gt;</font></p>
            <p><font size=2>&nbsp;&nbsp;&nbsp; &lt;!-- ========== Action Mapping Definitions ============================== --&gt;<br>&nbsp;&nbsp;&nbsp; &lt;action-mappings /&gt;</font></p>
            <p><font size=2>&nbsp;&nbsp;&nbsp; &lt;!-- ========== Controller Configuration ================================ --&gt;</font></p>
            <p><font size=2>&nbsp;&nbsp;&nbsp; &lt;!-- ========== Message Resources Definitions =========================== --&gt;<br>&nbsp;&nbsp;&nbsp; &lt;message-resources parameter="application" /&gt;</font></p>
            <p><font size=2>&nbsp;&nbsp;&nbsp; &lt;!-- ========== Plug Ins Configuration ================================== --&gt;<br>&nbsp;&nbsp;&nbsp; &lt;plug-in className="net.sf.navigator.menu.MenuPlugIn"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;set-property property="menuConfig" value="/WEB-INF/menu-config.xml"/&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/plug-in&gt;</font></p>
            <p><font size=2>&lt;/struts-config&gt;</font></p>
            <p><font size=2>&nbsp; 4：解压缩struts-menu-2.3.zip，将压缩包中的jstl-1.0.6.jar、standard-1.0.6.jar、struts-menu-2.3.jar释放到lib目录中，将压缩包中的struts-menu.tld、struts-menu-el.tld释放到web\WEB-INF目录中，解压缩commons-lang-2.1.zip，将commons-lang-2.1.jar解压缩到lib目录中，注意，在Struts-Menu的文档中没有看到需要这个包，但是没有这个包却无法成功加载。在web\WEB-INF目录中新建menu-config.xml，内容如下：<br>&lt;?xml version="1.0" encoding="UTF-8" ?&gt;</font></p>
            <p><font size=2>&lt;MenuConfig&gt;</font></p>
            <p><font size=2>&nbsp; &lt;Displayers&gt;<br>&nbsp;&nbsp;&nbsp; &lt;Displayer&nbsp;&nbsp; name="DropDown"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type="net.sf.navigator.displayer.DropDownMenuDisplayer"/&gt;<br>&nbsp;&nbsp;&nbsp; &lt;Displayer&nbsp;&nbsp; name="Simple"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type="net.sf.navigator.displayer.SimpleMenuDisplayer"/&gt;<br>&nbsp;&nbsp;&nbsp; &lt;Displayer&nbsp;&nbsp; name="CoolMenu"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type="net.sf.navigator.displayer.CoolMenuDisplayer"/&gt;<br>&nbsp;&nbsp;&nbsp; &lt;Displayer&nbsp;&nbsp; name="CoolMenu4"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type="net.sf.navigator.displayer.CoolMenuDisplayer4"/&gt;<br>&nbsp;&nbsp;&nbsp; &lt;Displayer&nbsp;&nbsp; name="MenuForm"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type="net.sf.navigator.example.PermissionsFormMenuDisplayer"/&gt;<br>&nbsp;&nbsp;&nbsp; &lt;Displayer&nbsp;&nbsp; name="ListMenu"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type="net.sf.navigator.displayer.ListMenuDisplayer"/&gt;<br>&nbsp;&nbsp;&nbsp; &lt;Displayer&nbsp;&nbsp; name="TabbedMenu"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type="net.sf.navigator.displayer.TabbedMenuDisplayer"/&gt;<br>&nbsp;&nbsp;&nbsp; &lt;Displayer&nbsp;&nbsp; name="Velocity"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type="net.sf.navigator.displayer.VelocityMenuDisplayer"/&gt;<br>&nbsp; &lt;/Displayers&gt;</font></p>
            <p><font size=2>&nbsp; &lt;Menus&gt;<br>&nbsp;&nbsp;&nbsp; &lt;Menu&nbsp; name="DoorSite"&nbsp; title="DoorSite"&nbsp; description="Some famous doorsite" width="50"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Item&nbsp;&nbsp; name="Yahoo"&nbsp;&nbsp; title="Yahoo"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Item&nbsp;&nbsp; name="YahooIndex"&nbsp;&nbsp; title="Yahoo Index"&nbsp;&nbsp; location="</font><a href='http://www.yahoo.com.cn"/'><font color=#049baa size=2><u>http://www.yahoo.com.cn"/</u></font></a><font size=2>&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Item&nbsp;&nbsp; name="YahooMail"&nbsp;&nbsp;&nbsp; title="Yahoo Mail"&nbsp;&nbsp;&nbsp; location="</font><a href='http://cn.mail.yahoo.com"/'><font color=#049baa size=2><u>http://cn.mail.yahoo.com"/</u></font></a><font size=2>&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Item&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Item&nbsp;&nbsp;&nbsp; name="Sohu"&nbsp; title="Sohu"&nbsp;&nbsp; location="</font><a href='http://www.sohu.com"/'><font color=#049baa size=2><u>http://www.sohu.com"/</u></font></a><font size=2>&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Item&nbsp;&nbsp;&nbsp; name="Sina"&nbsp; title="Sina"&nbsp;&nbsp; location="</font><a href='http://www.sina.com.cn"/'><font color=#049baa size=2><u>http://www.sina.com.cn"/</u></font></a><font size=2>&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/Menu&gt;<br>&nbsp; &lt;/Menus&gt;</font></p>
            <p><font size=2>&lt;/MenuConfig&gt;</font></p>
            <p><font size=2>&nbsp; 5：将第四步的示例程序中的struts-menu应用目录下的images、scripts、styles三个目录中的内容复制到web目录下</font></p>
            <p><font size=2>&nbsp; 6：你的目录结构应该类似如下：<br>&nbsp;&nbsp;&nbsp; %PROJECT_HOME%\classes<br>&nbsp;&nbsp;&nbsp; %PROJECT_HOME%\lib<br>&nbsp;&nbsp;&nbsp; %PROJECT_HOME%\lib\antlr.jar<br>&nbsp;&nbsp;&nbsp; %PROJECT_HOME%\lib\commons-beanutils.jar<br>&nbsp;&nbsp;&nbsp; %PROJECT_HOME%\lib\commons-digester.jar<br>&nbsp;&nbsp;&nbsp; %PROJECT_HOME%\lib\commons-fileupload.jar<br>&nbsp;&nbsp;&nbsp; %PROJECT_HOME%\lib\commons-lang-2.1.jar<br>&nbsp;&nbsp;&nbsp; %PROJECT_HOME%\lib\commons-logging.jar<br>&nbsp;&nbsp;&nbsp; %PROJECT_HOME%\lib\commons-validator.jar<br>&nbsp;&nbsp;&nbsp; %PROJECT_HOME%\lib\jakarta-oro.jar<br>&nbsp;&nbsp;&nbsp; %PROJECT_HOME%\lib\jstl-1.0.6.jar<br>&nbsp;&nbsp;&nbsp; %PROJECT_HOME%\lib\standard-1.0.6.jar<br>&nbsp;&nbsp;&nbsp; %PROJECT_HOME%\lib\struts.jar<br>&nbsp;&nbsp;&nbsp; %PROJECT_HOME%\lib\struts-menu-2.3.jar<br>&nbsp;&nbsp;&nbsp; %PROJECT_HOME%\src<br>&nbsp;&nbsp;&nbsp; %PROJECT_HOME%\src\log4j.properties<br>&nbsp;&nbsp;&nbsp; %PROJECT_HOME%\src\application.properties<br>&nbsp;&nbsp;&nbsp; %PROJECT_HOME%\src\application_zh_CN.properties<br>&nbsp;&nbsp;&nbsp; %PROJECT_HOME%\web<br>&nbsp;%PROJECT_HOME%\web\images\...<br>&nbsp;%PROJECT_HOME%\web\scripts\...<br>&nbsp;%PROJECT_HOME%\web\styles\...<br>&nbsp;&nbsp;&nbsp; %PROJECT_HOME%\web\WEB-INF<br>&nbsp;&nbsp;&nbsp; %PROJECT_HOME%\web\WEB-INF\menu-config.xml<br>&nbsp;&nbsp;&nbsp; %PROJECT_HOME%\web\WEB-INF\struts-bean.tld<br>&nbsp;&nbsp;&nbsp; %PROJECT_HOME%\web\WEB-INF\struts-config.xml<br>&nbsp;&nbsp;&nbsp; %PROJECT_HOME%\web\WEB-INF\struts-html.tld<br>&nbsp;&nbsp;&nbsp; %PROJECT_HOME%\web\WEB-INF\struts-logic.tld<br>&nbsp;&nbsp;&nbsp; %PROJECT_HOME%\web\WEB-INF\struts-menu.tld<br>&nbsp;&nbsp;&nbsp; %PROJECT_HOME%\web\WEB-INF\struts-menu-el.tld<br>&nbsp;&nbsp;&nbsp; %PROJECT_HOME%\web\WEB-INF\struts-nested.tld<br>&nbsp;&nbsp;&nbsp; %PROJECT_HOME%\web\WEB-INF\struts-tiles.tld<br>&nbsp;&nbsp;&nbsp; %PROJECT_HOME%\web\WEB-INF\web.xml</font></p>
            <p><font size=2>六、实战Struts-Menu<br>&nbsp; 1：使用配置文件实现静态菜单<br>&nbsp; 新建JSP文件web/static-menu.jsp，内容如下：<br>&lt;%@ page contentType="text/html; charset=GBK" %&gt;<br>&lt;%@ taglib uri="struts-menu" prefix="menu" %&gt;</font></p>
            <p><font size=2>&lt;menu:useMenuDisplayer name="ListMenu" <br>&nbsp;&nbsp;&nbsp; bundle="org.apache.struts.action.MESSAGE"&gt;<br>&nbsp;&nbsp;&nbsp; &lt;menu:displayMenu name="DoorSite"/&gt;<br>&lt;/menu:useMenuDisplayer&gt;<br>&nbsp; 运行Tomcat，在IE地址栏输入</font><a href="http://localhost:8080/mymenu/static-menu.jsp"><font color=#049baa size=2><u>http://localhost:8080/mymenu/static-menu.jsp</u></font></a><font size=2>查看</font></p>
            <p><font size=2>&nbsp; 2：实现中文化<br>&nbsp; &gt; 在src\application_zh_CN.properties中增加下面的内容，Unicode可以通过JDK自带的native2ascii工具得到：<br>#门户网站<br>menu.DoorSite=\u95e8\u6237\u7f51\u7ad9<br>#雅虎<br>menu.Yahoo=\u96c5\u864e<br>#雅虎首页<br>menu.YahooIndex=\u96c5\u864e\u9996\u9875<br>#雅虎邮件<br>menu.YahooMail=\u96c5\u864e\u90ae\u4ef6<br>#搜狐<br>menu.Sohu=\u641c\u72d0<br>#新浪<br>menu.Sina=\u65b0\u6d6a<br>&nbsp; &gt; 在src\application.properties中增加下面的内容：<br>#门户网站<br>menu.DoorSite=DoorSite<br>#雅虎<br>menu.Yahoo=Yahoo<br>#雅虎首页<br>menu.YahooIndex=Yahoo Index<br>#雅虎邮件<br>menu.YahooMail=Yahoo Mail<br>#搜狐<br>menu.Sohu=Sohu<br>#新浪<br>menu.Sina=Sina<br>&nbsp; &gt; 修改menu-config.xml文件&lt;Menus&gt;&lt;/Menus&gt;部分：<br>&nbsp; &lt;Menus&gt;<br>&nbsp;&nbsp;&nbsp; &lt;Menu&nbsp; name="DoorSite"&nbsp; title="menu.DoorSite"&nbsp; description="Some famous doorsite" width="50"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Item&nbsp;&nbsp; name="Yahoo"&nbsp;&nbsp; title="menu.Yahoo"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Item&nbsp;&nbsp; name="YahooIndex"&nbsp;&nbsp; title="menu.YahooIndex"&nbsp;&nbsp; location="</font><a href='http://www.yahoo.com.cn"/'><font color=#049baa size=2><u>http://www.yahoo.com.cn"/</u></font></a><font size=2>&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Item&nbsp;&nbsp; name="YahooMail"&nbsp;&nbsp;&nbsp; title="menu.YahooMail"&nbsp;&nbsp;&nbsp; location="</font><a href='http://cn.mail.yahoo.com"/'><font color=#049baa size=2><u>http://cn.mail.yahoo.com"/</u></font></a><font size=2>&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Item&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Item&nbsp;&nbsp;&nbsp; name="Sohu"&nbsp; title="menu.Sohu"&nbsp;&nbsp; location="</font><a href='http://www.sohu.com"/'><font color=#049baa size=2><u>http://www.sohu.com"/</u></font></a><font size=2>&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Item&nbsp;&nbsp;&nbsp; name="Sina"&nbsp; title="menu.Sina"&nbsp;&nbsp; location="</font><a href='http://www.sina.com.cn"/'><font color=#049baa size=2><u>http://www.sina.com.cn"/</u></font></a><font size=2>&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/Menu&gt;<br>&nbsp; &lt;/Menus&gt;<br>&nbsp; 重起Tomcat，在IE地址栏输入</font><a href="http://localhost:8080/mymenu/static-menu.jsp"><font color=#049baa size=2><u>http://localhost:8080/mymenu/static-menu.jsp</u></font></a><font size=2>查看</font></p>
            <p><font size=2>&nbsp; 3：结合数据库实现动态菜单<br>&nbsp; &gt; 新建数据myexamples：<br>CREATE DATABASE myexamples<br>&nbsp; &gt; 新建数据库表menu_item：<br>CREATE TABLE menu_item (<br>&nbsp;&nbsp; id BIGINT not null,<br>&nbsp;&nbsp; parent_name VARCHAR(30),<br>&nbsp;&nbsp; name VARCHAR(30),<br>&nbsp;&nbsp; title VARCHAR(30),<br>&nbsp;&nbsp; titleCN VARCHAR(30),<br>&nbsp;&nbsp; description VARCHAR(50),<br>&nbsp;&nbsp; location VARCHAR(255),<br>&nbsp;&nbsp; target VARCHAR(10),<br>&nbsp;&nbsp; onclick VARCHAR(100),<br>&nbsp;&nbsp; onmouseover VARCHAR(100),<br>&nbsp;&nbsp; onmouseout VARCHAR(100),<br>&nbsp;&nbsp; image VARCHAR(50),<br>&nbsp;&nbsp; altImage VARCHAR(30),<br>&nbsp;&nbsp; tooltip VARCHAR(100),<br>&nbsp;&nbsp; roles VARCHAR(100),<br>&nbsp;&nbsp; page VARCHAR(255),<br>&nbsp;&nbsp; width VARCHAR(5),<br>&nbsp;&nbsp; height VARCHAR(5),<br>&nbsp;&nbsp; forward VARCHAR(50),<br>&nbsp;&nbsp; action VARCHAR(50),<br>&nbsp;&nbsp; primary key (id)<br>)<br>&nbsp; &gt; 插入测试数据：<br>INSERT INTO menu_item<br>&nbsp;&nbsp;&nbsp; (id, parent_name, name, title, titleCN, location)<br>VALUES<br>&nbsp;&nbsp;&nbsp; (1,null,'DatabaseMenu','Database Menu','数据库动态菜单',null),<br>&nbsp;&nbsp;&nbsp; (2,'DatabaseMenu','Yahoo','Yahoo Mail','雅虎邮件','http://mail.yahoo.com'),<br>&nbsp;&nbsp;&nbsp; (3,'DatabaseMenu','JavaBlogs','JavaBlogs','Java博客','http://javablogs.com'),<br>&nbsp;&nbsp;&nbsp; (4,null,'StandaloneMenu','Standalone Menu','独立的菜单','http://www.sohu.com')<br>&nbsp; &gt; 将数据库驱动程序放到lib目录中，并加入到Build Path，如MySQL的数据库驱动mysql-connector-java-3.1.8-bin.jar，解压缩commons-collections-3.1.zip，将commons-collections-3.1.jar释放到lib目录，并加入Build Path<br>&nbsp; &gt; 新建一个Struts的Action，代码如下：<br>package cn.appex.menu;</font></p>
            <p><font size=2>import java.io.UnsupportedEncodingException;<br>import java.sql.Connection;<br>import java.sql.DriverManager;<br>import java.sql.PreparedStatement;<br>import java.sql.ResultSet;<br>import java.sql.SQLException;<br>import java.util.ArrayList;<br>import java.util.HashMap;<br>import java.util.ListResourceBundle;<br>import java.util.Map;</font></p>
            <p><font size=2>import com.mysql.jdbc.Driver;</font></p>
            <p><font size=2>import javax.servlet.http.HttpServletRequest;<br>import javax.servlet.http.HttpServletResponse;<br>import javax.servlet.http.HttpSession;</font></p>
            <p><font size=2>import net.sf.navigator.menu.MenuComponent;<br>import net.sf.navigator.menu.MenuRepository;<br>import net.sf.navigator.menu.PermissionsAdapter;</font></p>
            <p><font size=2>import org.apache.struts.action.Action;<br>import org.apache.struts.action.ActionForm;<br>import org.apache.struts.action.ActionForward;<br>import org.apache.struts.action.ActionMapping;</font></p>
            <p><font size=2>public class MenuAction extends Action {<br>&nbsp;&nbsp;&nbsp; public ActionForward execute(ActionMapping mapping, ActionForm form,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpServletRequest request, HttpServletResponse response)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throws Exception {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; buildMenuRepository(request);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; buildMenuResourceBundle(request);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; buildMenuPermissions(request);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return (mapping.findForward("success"));<br>&nbsp;&nbsp;&nbsp; }</font></p>
            <p><font size=2>&nbsp;&nbsp;&nbsp; /**<br>&nbsp;&nbsp;&nbsp;&nbsp; * 创建菜单数据结构<br>&nbsp;&nbsp;&nbsp;&nbsp; * <br>&nbsp;&nbsp;&nbsp;&nbsp; * @param request<br>&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp;&nbsp;&nbsp; private void buildMenuRepository(HttpServletRequest request) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MenuRepository repository = new MenuRepository();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Get the repository from the application scope - and copy the<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // DisplayerMappings from it.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MenuRepository defaultRepository = (MenuRepository) request<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .getSession().getServletContext().getAttribute(<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MenuRepository.MENU_REPOSITORY_KEY);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; repository.setDisplayers(defaultRepository.getDisplayers());</font></p>
            <p><font size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Map[] menus = getMenuComponents();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i=0; i &lt; menus.length; i++) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MenuComponent mc = new MenuComponent();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Map row = menus[i];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String name = (String) row.get("name");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mc.setName(name);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String parent = (String) row.get("parent_name");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(name + ", parent is: " + parent);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (parent != null) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MenuComponent parentMenu = repository.getMenu(parent);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (parentMenu == null) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("parentMenu '" + parent + "' doesn't exist!");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // create a temporary parentMenu<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parentMenu = new MenuComponent();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; parentMenu.setName(parent);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; repository.addMenu(parentMenu);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></p>
            <p><font size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mc.setParent(parentMenu);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String title = (String) row.get("title");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mc.setTitle(title);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String location = (String) row.get("location");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mc.setLocation(location);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String description = (String) row.get("description");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mc.setDescription(description);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; repository.addMenu(mc);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; request.setAttribute("examplesRepository", repository);<br>&nbsp;&nbsp;&nbsp; }</font></p>
            <p><font size=2>&nbsp;&nbsp;&nbsp; /**<br>&nbsp;&nbsp;&nbsp;&nbsp; * 从数据库中读取菜单配置信息<br>&nbsp;&nbsp;&nbsp;&nbsp; * <br>&nbsp;&nbsp;&nbsp;&nbsp; * @return<br>&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp;&nbsp;&nbsp; private Map[] getMenuComponents() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ArrayList list = new ArrayList();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Connection conn = null;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PreparedStatement pstmt = null;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ResultSet rest = null;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String sql = "select name,parent_name,title,location,description from menu_item order by id";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class.forName("com.mysql.jdbc.Driver").newInstance();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conn = DriverManager.getConnection("jdbc:mysql://localhost/myexamples?user=root&amp;password=mywangya&amp;useUnicode=true&amp;characterEncoding=UTF-8");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pstmt = conn.prepareStatement(sql);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rest = pstmt.executeQuery();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (rest.next()) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int i = 1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HashMap map = new HashMap();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map.put("name", rest.getString(i++));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map.put("parent_name", rest.getString(i++));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map.put("title", rest.getString(i++));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map.put("location", rest.getString(i++));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map.put("description", rest.getString(i++));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; list.add(map);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (SQLException ex) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ex.printStackTrace();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (InstantiationException e) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (IllegalAccessException e) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (ClassNotFoundException e) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } finally {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (null!=rest) rest.close();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (null!=pstmt) pstmt.close();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (null!=conn) conn.close();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (SQLException e) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return (Map[]) list.toArray(new HashMap[0]);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; /**<br>&nbsp;&nbsp;&nbsp;&nbsp; * 构造菜单权限<br>&nbsp;&nbsp;&nbsp;&nbsp; * <br>&nbsp;&nbsp;&nbsp;&nbsp; * @param request<br>&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp;&nbsp;&nbsp; private void buildMenuPermissions(HttpServletRequest request) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PermissionsAdapter permession = new PermissionsAdapter() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public boolean isAllowed(MenuComponent menu) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 名称等于StandaloneMenu的菜单不显示<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return !"StandaloneMenu".equalsIgnoreCase(menu.getName());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; };<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; request.setAttribute("examplesPermession", permession);<br>&nbsp;&nbsp;&nbsp; }</font></p>
            <p><font size=2>&nbsp;&nbsp;&nbsp; /**<br>&nbsp;&nbsp;&nbsp;&nbsp; * 构造菜单显示标题<br>&nbsp;&nbsp;&nbsp;&nbsp; * <br>&nbsp;&nbsp;&nbsp;&nbsp; * @param request<br>&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp;&nbsp;&nbsp; private void buildMenuResourceBundle(HttpServletRequest request) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MenuResourceBundle resourceBundle = new MenuResourceBundle();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; request.setAttribute("examplesBundle", resourceBundle);<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; /**<br>&nbsp;&nbsp;&nbsp;&nbsp; * MenuResourceBundle树状菜单国际语言显示<br>&nbsp;&nbsp;&nbsp;&nbsp; * <br>&nbsp;&nbsp;&nbsp;&nbsp; * @author wenbin.zhang<br>&nbsp;&nbsp;&nbsp;&nbsp; *&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; */<br>&nbsp;&nbsp;&nbsp; class MenuResourceBundle extends ListResourceBundle {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private ArrayList list = new ArrayList();</font></p>
            <p><font size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public MenuResourceBundle() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Connection conn = null;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PreparedStatement pstmt = null;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ResultSet rest = null;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String sql = "select title,titleCN from menu_item order by id";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Class.forName("com.mysql.jdbc.Driver").newInstance();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; conn = DriverManager.getConnection("jdbc:mysql://localhost/myexamples?user=root&amp;password=mywangya&amp;useUnicode=true&amp;characterEncoding=UTF-8");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pstmt = conn.prepareStatement(sql);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rest = pstmt.executeQuery();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (rest.next()) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int i = 1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String[] message = new String[2];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; message[0] = rest.getString(i++);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; message[1] = new String(rest.getString(i++).getBytes("latin1"), "gbk");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (UnsupportedEncodingException e) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br>&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; if (message[0] != null &amp;&amp; message[1] != null) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; list.add(message);<br>&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; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (SQLException ex) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ex.printStackTrace();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (InstantiationException e) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (IllegalAccessException e) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (ClassNotFoundException e) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } finally {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (null!=rest) rest.close();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (null!=pstmt) pstmt.close();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (null!=conn) conn.close();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (SQLException e) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br>&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; }</font></p>
            <p><font size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</font></p>
            <p><font size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public Object[][] getContents() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return (String[][]) list.toArray(new String[0][0]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; }<br>}</font></p>
            <p><font size=2>&nbsp; &gt; 将struts-config.xml文件的&lt;action-mappings /&gt;部分修改为：<br>&lt;action-mappings&gt;<br>&nbsp; &lt;action path="/menuAction" type="cn.appex.menu.MenuAction" &gt;<br>&nbsp;&nbsp;&nbsp; &lt;forward name="success" path="/struts-menu/dynamic-menu.jsp" /&gt;<br>&nbsp; &lt;/action&gt;<br>&lt;/action-mappings&gt;<br>&nbsp; &gt; 新建JSP文件web/dynamic-menu.jsp，内容如下：<br>&lt;%@ page contentType="text/html; charset=GBK" %&gt;<br>&lt;%@ taglib uri="struts-menu" prefix="menu" %&gt;</font></p>
            <p><font size=2>&lt;p&gt;没有使用Bundle和权限控制:<br>&lt;menu:useMenuDisplayer name="ListMenu" repository="examplesRepository"&gt;<br>&nbsp;&nbsp;&nbsp; &lt;menu:displayMenu name="DatabaseMenu"/&gt;<br>&nbsp;&nbsp;&nbsp; &lt;menu:displayMenu name="StandaloneMenu"/&gt;<br>&lt;/menu:useMenuDisplayer&gt;&lt;/p&gt;</font></p>
            <p><font size=2>&lt;p&gt;使用Bundle, 没有使用权限控制:<br>&lt;menu:useMenuDisplayer name="ListMenu" bundle="examplesBundle" repository="examplesRepository"&gt;<br>&nbsp;&nbsp;&nbsp; &lt;menu:displayMenu name="DatabaseMenu"/&gt;<br>&nbsp;&nbsp;&nbsp; &lt;menu:displayMenu name="StandaloneMenu"/&gt;<br>&lt;/menu:useMenuDisplayer&gt;&lt;/p&gt;</font></p>
            <p><font size=2>&lt;p&gt;使用Bundle和权限控制:<br>&lt;menu:useMenuDisplayer name="ListMenu" permissions="examplesPermession"&nbsp; bundle="examplesBundle" repository="examplesRepository"&gt;<br>&nbsp;&nbsp;&nbsp; &lt;menu:displayMenu name="DatabaseMenu"/&gt;<br>&nbsp;&nbsp;&nbsp; &lt;menu:displayMenu name="StandaloneMenu"/&gt;<br>&lt;/menu:useMenuDisplayer&gt;&lt;/p&gt;<br>&nbsp; 重起Tomcat，在地址栏输入</font><a href="http://localhost:8080/mymenu/menuAction.do"><font color=#049baa size=2><u>http://localhost:8080/mymenu/menuAction.do</u></font></a></p>
            <p><font size=2>七、关于Struts-Menu配置文件和API的使用方法，请参考附录中的官方网站</font></p>
            <p><br><font size=2>附：<br>Struts-Menu官方网站：</font><a href="http://struts-menu.sourceforge.net/"><font color=#049baa size=2><u>http://struts-menu.sourceforge.net</u></font></a><br><font size=2>数据库驱动的动态菜单：</font><a href="http://demo.raibledesigns.com/struts-menu/dynamicMenu.jsp"><font color=#049baa size=2><u>http://demo.raibledesigns.com/struts-menu/dynamicMenu.jsp</u></font></a></p>
            </td>
        </tr>
        <tr>
            <td>
            <table cellSpacing=0 border=0>
                <tbody>
                    <font size=2><u></u></font>
                </tbody>
            </table>
            </td>
        </tr>
        <tr>
            <td class=bvh8><font size=2><u></u></font></td>
        </tr>
        <tr>
            <td class=line><font size=2><u></u></font></td>
        </tr>
    </tbody>
</table>
<br>
<script src="http://www.itsrc.cn/ads/ads_text_728x90_csdn.js"></script>
<br><br>
<p id=TBPingURL>Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=496331</p>
<img src ="http://www.blogjava.net/i369/aggbug/124649.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-06-16 14:58 <a href="http://www.blogjava.net/i369/articles/124649.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts Menu中文文档综述 </title><link>http://www.blogjava.net/i369/articles/124650.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Sat, 16 Jun 2007 06:58:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/124650.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/124650.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/124650.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/124650.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/124650.html</trackback:ping><description><![CDATA[<h1 style="MARGIN: 0cm 0cm 0pt 21.25pt; TEXT-INDENT: -21.25pt; LINE-HEIGHT: normal; mso-list: l5 level1 lfo3; tab-stops: list 21.25pt"><font face="Times New Roman"><span lang=EN-US style="FONT-SIZE: 14pt; mso-bidi-font-size: 22.0pt">1.<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span lang=EN-US style="FONT-SIZE: 14pt; mso-bidi-font-size: 22.0pt">Overview
<p>&#160;</p>
</span></font></h1>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font size=3><span lang=EN-US><font face="Times New Roman">Struts Menu</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">应用是一个</span><span lang=EN-US><font face="Times New Roman">JSP</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">标记的集合，支持从</span><span lang=EN-US><font face="Times New Roman">XML</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">文件生成各种不同菜单系统。</span><span lang=EN-US><font face="Times New Roman">Struts Menu 2.0</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">进行了重构，使用</span><span lang=EN-US><font face="Times New Roman">Velocity Templates</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">定义菜单。</span></font></p>
<h1 style="MARGIN: 0cm 0cm 0pt 21.25pt; TEXT-INDENT: -21.25pt; LINE-HEIGHT: normal; mso-list: l5 level1 lfo3; tab-stops: list 21.25pt"><font face="Times New Roman"><span lang=EN-US style="FONT-SIZE: 14pt; mso-bidi-font-size: 22.0pt">2.<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span lang=EN-US style="FONT-SIZE: 14pt; mso-bidi-font-size: 22.0pt">User Guide
<p>&#160;</p>
</span></font></h1>
<h1 style="MARGIN: 0cm 0cm 0pt 1cm; TEXT-INDENT: -1cm; LINE-HEIGHT: normal; mso-list: l5 level2 lfo3; tab-stops: list 1.0cm"><span lang=EN-US style="FONT-SIZE: 12pt; mso-bidi-font-size: 22.0pt"><font face="Times New Roman">2.1.<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 22.0pt; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">从</span><span lang=EN-US style="FONT-SIZE: 12pt; mso-bidi-font-size: 22.0pt"><font face="Times New Roman">1.x</font></span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 22.0pt; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">迁移到</span><span lang=EN-US style="FONT-SIZE: 12pt; mso-bidi-font-size: 22.0pt"><font face="Times New Roman">2.x
<p>&#160;</p>
</font></span></h1>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font size=3><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">要从</span><span lang=EN-US><font face="Times New Roman">Struts Menu1.x</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">升级到</span><span lang=EN-US><font face="Times New Roman">2.x</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">，需要做如下改变：</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt; mso-list: l1 level1 lfo1; tab-stops: list 42.0pt"><span lang=EN-US style="FONT-FAMILY: Wingdings"><font size=3>l</font><span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><font size=3><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">修改标记库声明的</span><span lang=EN-US><font face="Times New Roman">URI</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">，去掉&#8220;</span><span lang=EN-US><font face="Times New Roman">1.2</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">&#8221;</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21pt"><span lang=EN-US style="COLOR: black"><font face="Times New Roman" size=3>&lt;%@ taglib uri="http://struts-menu.sf.net/tag" prefix="menu" %&gt;</font></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt; mso-list: l1 level1 lfo1; tab-stops: list 42.0pt"><span lang=EN-US style="FONT-FAMILY: Wingdings"><font size=3>l</font><span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><font size=3><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">修改</span><span lang=EN-US><font face="Times New Roman">&lt;plug-in&gt;</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">，使用新的包名&#8220;</span><span lang=EN-US><font face="Times New Roman">net.sf.navigator</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">&#8221;</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21pt"><span lang=EN-US style="COLOR: black"><font face="Times New Roman" size=3>&lt;plug-in className="net.sf.navigator.menu.MenuPlugIn"&gt;</font></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt; mso-list: l1 level1 lfo1; tab-stops: list 42.0pt"><span lang=EN-US style="FONT-FAMILY: Wingdings"><font size=3>l</font><span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><font size=3><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">修改</span><span lang=EN-US><font face="Times New Roman">menu-config.xml</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">文件，使用新的包名&#8220;</span><span lang=EN-US><font face="Times New Roman">net.sf.navigator</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">&#8221;</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21pt"><span lang=EN-US style="COLOR: black"><font face="Times New Roman" size=3>&lt;Displayer name="Simple" type="net.sf.navigator.displayer.SimpleMenuDisplayer"/&gt;</font></span></p>
<h1 style="MARGIN: 0cm 0cm 0pt 1cm; TEXT-INDENT: -1cm; LINE-HEIGHT: normal; mso-list: l5 level2 lfo3; tab-stops: list 1.0cm"><span lang=EN-US style="FONT-SIZE: 12pt; mso-bidi-font-size: 22.0pt"><font face="Times New Roman">2.2.<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 22.0pt; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">快速启动</span><span lang=EN-US style="FONT-SIZE: 12pt; mso-bidi-font-size: 22.0pt">
<p>&#160;</p>
</span></h1>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt; mso-list: l1 level1 lfo1; tab-stops: list 42.0pt"><span lang=EN-US style="FONT-FAMILY: Wingdings"><font size=3>l</font><span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><font size=3><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">下载</span><span lang=EN-US><font face="Times New Roman">struts-menu</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">分发包</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt; mso-list: l1 level1 lfo1; tab-stops: list 42.0pt"><span lang=EN-US style="FONT-FAMILY: Wingdings"><font size=3>l</font><span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'"><font size=3>解压缩到本地目录</font></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt; mso-list: l1 level1 lfo1; tab-stops: list 42.0pt"><span lang=EN-US style="FONT-FAMILY: Wingdings"><font size=3>l</font><span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><font size=3><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">下载并安装</span><span lang=EN-US><font face="Times New Roman">Tomcat</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">或其它</span><span lang=EN-US><font face="Times New Roman">Java Servlet</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">容器</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt; mso-list: l1 level1 lfo1; tab-stops: list 42.0pt"><span lang=EN-US style="FONT-FAMILY: Wingdings"><font size=3>l</font><span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><font size=3><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">将</span><span lang=EN-US><font face="Times New Roman">struts-menu.war</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">文件拷贝到</span><span lang=EN-US><font face="Times New Roman">Tomcat</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">服务器的</span><span lang=EN-US><font face="Times New Roman">webapps</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">目录下，启动服务器</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt; mso-list: l1 level1 lfo1; tab-stops: list 42.0pt"><span lang=EN-US style="FONT-FAMILY: Wingdings"><font size=3>l</font><span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><font size=3><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">浏览</span><span lang=EN-US><a href="http://localhost:8080/struts-menu"><font face="Times New Roman" color=#000080>http://localhost:8080/struts-menu</font></a></span></font></p>
<h1 style="MARGIN: 0cm 0cm 0pt 1cm; TEXT-INDENT: -1cm; LINE-HEIGHT: normal; mso-list: l5 level2 lfo3; tab-stops: list 1.0cm"><span lang=EN-US style="FONT-SIZE: 12pt; mso-bidi-font-size: 22.0pt"><font face="Times New Roman">2.3.<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 22.0pt; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">将</span><span lang=EN-US style="FONT-SIZE: 12pt; mso-bidi-font-size: 22.0pt"><font face="Times New Roman">Struts Menu</font></span><span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-size: 22.0pt; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">集成到应用中</span><span lang=EN-US style="FONT-SIZE: 12pt; mso-bidi-font-size: 22.0pt">
<p>&#160;</p>
</span></h1>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font size=3><span lang=EN-US><font face="Times New Roman">Struts Menu</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">可以很方便得集成到</span><span lang=EN-US><font face="Times New Roman">Struts</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">应用中，也将能够集成到其它非</span><span lang=EN-US><font face="Times New Roman">struts</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">的应用中。下面是继承标记库的步骤。</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font size=3><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">你所需要做的就是将</span><span lang=EN-US><font face="Times New Roman">struts-menu.jar</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">文件拷贝到</span><span lang=EN-US><font face="Times New Roman">WEB-INF/lib</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">目录下，并在</span><span lang=EN-US><font face="Times New Roman">JSP</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">页面中使用标记的</span><span lang=EN-US><font face="Times New Roman">URI</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">以声明标记库。</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font size=3><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">对于</span><span lang=EN-US><font face="Times New Roman">Struts Menu 2.1</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">，还需要将</span><span lang=EN-US><font face="Times New Roman">Jakarta</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">的</span><span lang=EN-US><font face="Times New Roman">Standard Tag Library Jar</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">拷贝到</span><span lang=EN-US><font face="Times New Roman">WEB-INF/lib</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">目录下。</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt; mso-list: l6 level1 lfo4; tab-stops: list 42.0pt"><span lang=EN-US style="FONT-FAMILY: Wingdings"><font size=3>l</font><span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><font size=3><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">将</span><span lang=EN-US><font face="Times New Roman">struts-menu.jar</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">文件拷贝到</span><span lang=EN-US><font face="Times New Roman">WEB-INF/lib</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">目录下</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt; mso-list: l6 level1 lfo4; tab-stops: list 42.0pt"><span lang=EN-US style="FONT-FAMILY: Wingdings"><font size=3>l</font><span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><font size=3><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">在</span><span lang=EN-US><font face="Times New Roman">struts-config.xml</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">文件中添加</span><span lang=EN-US><font face="Times New Roman">&lt;plug-in&gt;</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">设置</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21pt"><span lang=EN-US style="COLOR: black"><font face="Times New Roman"><font size=3>&lt;plug-in className="net.sf.navigator.menu.MenuPlugIn"&gt;
<p>&#160;</p>
</font></font></span>
<p>&#160;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: 21pt"><span lang=EN-US style="COLOR: black"><font face="Times New Roman"><font size=3>&lt;set-property property="menuConfig" value="/WEB-INF/menu-config.xml"/&gt;
<p>&#160;</p>
</font></font></span>
<p>&#160;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt"><span lang=EN-US style="COLOR: black"><font face="Times New Roman" size=3>&lt;/plug-in&gt;</font></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt; mso-list: l6 level1 lfo4; tab-stops: list 42.0pt"><span lang=EN-US style="FONT-FAMILY: Wingdings"><font size=3>l</font><span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><font size=3><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">在</span><span lang=EN-US><font face="Times New Roman">WEB-INF/menu-config.xml</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">文件中声明菜单属性。下面是一个示例：</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21pt"><span lang=EN-US style="COLOR: black"><font face="Times New Roman"><font size=3>&lt;Menu name="contactMenu" title="Contact" location="?Contact"&gt;
<p>&#160;</p>
</font></font></span>
<p>&#160;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21pt"><span lang=EN-US style="COLOR: black"><font face="Times New Roman"><font size=3><span style="mso-spacerun: yes">&nbsp; </span>&lt;Item name="email" title="E-Mail" location="?EMail"/&gt;
<p>&#160;</p>
</font></font></span>
<p>&#160;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21pt"><span lang=EN-US style="COLOR: black"><font face="Times New Roman"><font size=3><span style="mso-spacerun: yes">&nbsp; </span>&lt;Item name="phone" title="Phone" location="?Phone"/&gt;
<p>&#160;</p>
</font></font></span>
<p>&#160;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21pt"><span lang=EN-US style="COLOR: black"><font face="Times New Roman"><font size=3>&lt;/Menu&gt;
<p>&#160;</p>
</font></font></span>
<p>&#160;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21pt"><span lang=EN-US style="COLOR: black"><font face="Times New Roman"><font size=3>&nbsp;
<p>&#160;</p>
</font></font></span>
<p>&#160;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21pt"><font size=3><span style="COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">详细情况请参考例子应用的</span><span lang=EN-US style="COLOR: black"><font face="Times New Roman">WEB-INF</font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">目录下的</span><span lang=EN-US style="COLOR: black"><font face="Times New Roman">menu-config.xml</font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">文件，并修改该文件以适应自己的应用。如果要了解所有相关属性，请参考</span><span lang=EN-US style="COLOR: black"><font face="Times New Roman">MenuBase</font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">类的标准文档。</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt; mso-list: l6 level1 lfo4; tab-stops: list 42.0pt"><span lang=EN-US style="FONT-FAMILY: Wingdings"><font size=3>l</font><span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><font size=3><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">在</span><span lang=EN-US><font face="Times New Roman">JSP</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">页面中添加标记库的声明</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21pt"><span lang=EN-US style="COLOR: black"><font face="Times New Roman" size=3>&lt;%@ taglib uri="http://struts-menu.sf.net/tag" prefix="menu" %&gt;</font></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt; mso-list: l6 level1 lfo4; tab-stops: list 42.0pt"><span lang=EN-US style="FONT-FAMILY: Wingdings"><font size=3>l</font><span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><font size=3><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">在</span><span lang=EN-US><font face="Times New Roman">JSP</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">页面中添加标记库代码以生成菜单</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21pt"><span lang=EN-US style="COLOR: black"><font face="Times New Roman"><font size=3>&lt;menu:useMenuDisplayer name="TabbedMenu"
<p>&#160;</p>
</font></font></span>
<p>&#160;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: 21pt"><span lang=EN-US style="COLOR: black"><font face="Times New Roman"><font size=3>bundle="org.apache.struts.action.MESSAGE"&gt;
<p>&#160;</p>
</font></font></span>
<p>&#160;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21pt"><span lang=EN-US style="COLOR: black"><font face="Times New Roman"><font size=3><span style="mso-spacerun: yes">&nbsp; </span>&lt;menu:displayMenu name="Home"/&gt;
<p>&#160;</p>
</font></font></span>
<p>&#160;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21pt"><span lang=EN-US style="COLOR: black"><font face="Times New Roman"><font size=3><span style="mso-spacerun: yes">&nbsp; </span>&lt;menu:displayMenu name="About"/&gt;
<p>&#160;</p>
</font></font></span>
<p>&#160;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 21pt"><span lang=EN-US style="COLOR: black"><font face="Times New Roman" size=3>&lt;/menu:useMenuDisplayer&gt;</font></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font size=3><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">其中，</span><span lang=EN-US style="COLOR: black"><font face="Times New Roman">name="TabbedMenu"</font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">是在</span><span lang=EN-US style="COLOR: black"><font face="Times New Roman">menu-config.xml</font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">文件中定义的。如下：</span><span lang=EN-US style="COLOR: black">
<p>&#160;</p>
</span></font>
<p>&#160;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="COLOR: black"><font face="Times New Roman" size=3>&lt;Displayer name="TabbedMenu" type="net.sf.navigator.displayer.TabbedMenuDisplayer"/&gt;</font></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US><font face="Times New Roman"><font size=3>&nbsp;
<p>&#160;</p>
</font></font></span>
<p>&#160;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font size=3><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">要使用可定制的</span><span lang=EN-US><font face="Times New Roman">Velocity</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">模板生成菜单，需要将</span><span lang=EN-US><font face="Times New Roman">Velocity</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">集成到</span><span lang=EN-US><font face="Times New Roman">web</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">应用中。具体步骤如下：</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt; mso-list: l6 level1 lfo4; tab-stops: list 42.0pt"><span lang=EN-US style="FONT-FAMILY: Wingdings"><font size=3>l</font><span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><font size=3><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">确保</span><span lang=EN-US><font face="Times New Roman">menu-config.xml</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">文件有如下定义：</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="COLOR: black"><font face="Times New Roman"><font size=3><span style="mso-spacerun: yes">&nbsp;&nbsp; </span>&lt;Displayer name="Velocity" type="net.sf.navigator.displayer.VelocityMenuDisplayer"/&gt;</font></font></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt; mso-list: l6 level1 lfo4; tab-stops: list 42.0pt"><span lang=EN-US style="FONT-FAMILY: Wingdings"><font size=3>l</font><span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><font size=3><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">将</span><span lang=EN-US><font face="Times New Roman">Velocity</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">的相关</span><span lang=EN-US><font face="Times New Roman">jar</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">文件拷贝到</span><span lang=EN-US><font face="Times New Roman">WEB-INF/lib</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">目录下</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt; mso-list: l6 level1 lfo4; tab-stops: list 42.0pt"><span lang=EN-US style="FONT-FAMILY: Wingdings"><font size=3>l</font><span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><font size=3><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">将</span><span lang=EN-US><font face="Times New Roman">globalMacros.vm</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">文件添加到</span><span lang=EN-US><font face="Times New Roman">WEB-INF/classes</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">目录下</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt; mso-list: l6 level1 lfo4; tab-stops: list 42.0pt"><span lang=EN-US style="FONT-FAMILY: Wingdings"><font size=3>l</font><span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><font size=3><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">在</span><span lang=EN-US><font face="Times New Roman">JSP</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">页面中，修改为</span><font face="Times New Roman"><span lang=EN-US style="COLOR: black">name="</span><span lang=EN-US>Velocity<span style="COLOR: black">"</span></span></font><span style="COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">，并将</span><span lang=EN-US style="COLOR: black"><font face="Times New Roman">config</font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">属性指到一个文件（如</span><span lang=EN-US><font face="Times New Roman">config="/templates/tabs.html"</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">），如果文件在</span><span lang=EN-US><font face="Times New Roman">WEB-INF/classes</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">目录下，就是</span><span lang=EN-US><font face="Times New Roman">config="tabs.html"</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">。</span></font></p>
<h1 style="MARGIN: 0cm 0cm 0pt 21.25pt; TEXT-INDENT: -21.25pt; LINE-HEIGHT: normal; mso-list: l5 level1 lfo3; tab-stops: list 21.25pt"><font face="Times New Roman"><span lang=EN-US style="FONT-SIZE: 14pt; mso-bidi-font-size: 22.0pt">3.<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span lang=EN-US style="FONT-SIZE: 14pt; mso-bidi-font-size: 22.0pt">FAQ
<p>&#160;</p>
</span></font></h1>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 1cm; TEXT-INDENT: -1cm; mso-list: l5 level2 lfo3; tab-stops: list 1.0cm"><span lang=EN-US><font face="Times New Roman"><font size=3>3.1.</font><span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span><font size=3><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">在使用菜单访问</span><span lang=EN-US><font face="Times New Roman">JSP</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">时抛出异常：</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="COLOR: black"><font face="Times New Roman" size=3>org.apache.jasper.JasperException: Could not obtain the menu repository</font></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'"><font size=3>解决方法：</font></span></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font size=3><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">检查</span><span lang=EN-US><font face="Times New Roman">struts-config.xml</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">文件，确保添加如下</span><span lang=EN-US><font face="Times New Roman">plug-in</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">设置</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="COLOR: black"><font size=3><font face="Times New Roman">&lt;plug-in className="net.sf.navigator.menu.MenuPlugIn"&gt;
<p>&#160;</p>
</font></font></span>
<p>&#160;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="COLOR: black"><font size=3><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp; </span>&lt;set-property property="menuConfig" value="/WEB-INF/menu-config.xml"/&gt;
<p>&#160;</p>
</font></font></span>
<p>&#160;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="COLOR: black"><font size=3><font face="Times New Roman">&lt;/plug-in&gt;
<p>&#160;</p>
</font></font></span>
<p>&#160;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="COLOR: black"><font size=3><font face="Times New Roman">&lt;!-- The menuConfig property is an optional attribute. It is set to /WEB-INF/menu-config.xml by default. --&gt;
<p>&#160;</p>
</font></font></span>
<p>&#160;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="COLOR: black"><font size=3><font face="Times New Roman">&nbsp;
<p>&#160;</p>
</font></font></span>
<p>&#160;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 1cm; TEXT-INDENT: -1cm; mso-list: l5 level2 lfo3; tab-stops: list 1.0cm"><span lang=EN-US><font face="Times New Roman"><font size=3>3.2.</font><span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span><font size=3><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">如何基于角色隐藏</span><span lang=EN-US><font face="Times New Roman">/</font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">显示菜单项</span></font></p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><font size=3><span style="COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">先在</span><span lang=EN-US style="COLOR: black"><font face="Times New Roman">JSP</font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">页面中添加属性</span><span lang=EN-US style="COLOR: black"><font face="Times New Roman">permissions="rolesAdapter"</font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">到</span><span lang=EN-US style="COLOR: black"><font face="Times New Roman">&lt;menu:useMenuDisplayer&gt;</font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">标记中；然后在</span><span lang=EN-US style="COLOR: black"><font face="Times New Roman">menu-config.xml</font></span><span style="COLOR: black; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'">文件中加入允许看到此菜单项的角色列表，角色之间以逗号分隔。</span><span lang=EN-US style="COLOR: black">
<p>&#160;</p>
</span></font>
<p>&#160;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt"><span lang=EN-US style="COLOR: black"><font size=3><font face="Times New Roman">&nbsp;
<p>&#160;</p>
</font></font></span>
<p>&#160;</p>
<p class=MsoNormal style="MARGIN: 0cm 0cm 0pt 1cm; TEXT-INDENT: -1cm; mso-list: l5 level2 lfo3; tab-stops: list 1.0cm"><span lang=EN-US><font face="Times New Roman"><font size=3>3.3.</font><span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></font></span><span style="FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-ascii-font-family: 'Times New Roman'"><font size=3>基于数据库的动态菜单</font></span></p>
<img src ="http://www.blogjava.net/i369/aggbug/124650.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-06-16 14:58 <a href="http://www.blogjava.net/i369/articles/124650.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ajax、Struts、spring的无缝结合</title><link>http://www.blogjava.net/i369/articles/111968.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Thu, 19 Apr 2007 08:03:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/111968.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/111968.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/111968.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/111968.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/111968.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: zhipingch 原创&nbsp;&nbsp;&nbsp;&nbsp;去年初，正好负责一个医药信息系统的设计开发，架构设计时，采用Struts+JDBC（自定义采用适配器模式封装了HashMap动态VO实现的持久层）。后来ajax热潮兴起，正好系统中有很多地方需要和服务器端交互数据，如采购销售系统中的订单头/订单明细等主从表结构的维护。&nbsp;&nbsp;&nbsp;&nbsp;[col...&nbsp;&nbsp;<a href='http://www.blogjava.net/i369/articles/111968.html'>阅读全文</a><img src ="http://www.blogjava.net/i369/aggbug/111968.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-04-19 16:03 <a href="http://www.blogjava.net/i369/articles/111968.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2与Struts1的对比 </title><link>http://www.blogjava.net/i369/articles/111965.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Thu, 19 Apr 2007 08:00:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/111965.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/111965.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/111965.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/111965.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/111965.html</trackback:ping><description><![CDATA[<p>来源：struts2开发组 翻译：tianxinet（胖猴）</p>
<p><strong>Action 类: </strong><br>&#8226; Struts1要求Action类继承一个抽象基类。Struts1的一个普遍问题是使用抽象类编程而不是接口。 <br>&#8226; Struts 2 Action类可以实现一个Action接口，也可实现其他接口，使可选和定制的服务成为可能。Struts2提供一个ActionSupport基类去实现 常用的接口。Action接口不是必须的，任何有execute标识的POJO对象都可以用作Struts2的Action对象。 <br><strong>线程模式: </strong><br>&#8226; Struts1 Action是单例模式并且必须是线程安全的，因为仅有Action的一个实例来处理所有的请求。单例策略限制了Struts1 Action能作的事，并且要在开发时特别小心。Action资源必须是线程安全的或同步的。 <br>&#8226; Struts2 Action对象为每一个请求产生一个实例，因此没有线程安全问题。（实际上，servlet容器给每个请求产生许多可丢弃的对象，并且不会导致性能和垃圾回收问题） </p>
<p><strong>Servlet 依赖: </strong><br>&#8226; Struts1 Action 依赖于Servlet API ,因为当一个Action被调用时HttpServletRequest 和 HttpServletResponse 被传递给execute方法。 <br>&#8226; Struts 2 Action不依赖于容器，允许Action脱离容器单独被测试。如果需要，Struts2 Action仍然可以访问初始的request和response。但是，其他的元素减少或者消除了直接访问HttpServetRequest 和 HttpServletResponse的必要性。 </p>
<p><strong>可测性:</strong> <br>&#8226; 测试Struts1 Action的一个主要问题是execute方法暴露了servlet API（这使得测试要依赖于容器）。一个第三方扩展－－Struts TestCase－－提供了一套Struts1的模拟对象（来进行测试）。 <br>&#8226; Struts 2 Action可以通过初始化、设置属性、调用方法来测试，&#8220;依赖注入&#8221;支持也使测试更容易。 </p>
<p><strong>捕获输入: </strong><br>&#8226; Struts1 使用ActionForm对象捕获输入。所有的ActionForm必须继承一个基类。因为其他JavaBean不能用作ActionForm，开发者经常创建多余的类捕获输入。动态Bean（DynaBeans）可以作为创建传统ActionForm的选择，但是，开发者可能是在重新描述(创建)已经存在的JavaBean（仍然会导致有冗余的javabean）。 <br>&#8226; Struts 2直接使用Action属性作为输入属性，消除了对第二个输入对象的需求。输入属性可能是有自己(子)属性的rich对象类型。Action属性能够通过web页面上的taglibs访问。Struts2也支持ActionForm模式。rich对象类型，包括业务对象，能够用作输入/输出对象。这种ModelDriven 特性简化了taglib对POJO输入对象的引用。 </p>
<p><strong>表达式语言：</strong> <br>&#8226; Struts1 整合了JSTL，因此使用JSTL EL。这种EL有基本对象图遍历，但是对集合和索引属性的支持很弱。 <br>&#8226; Struts2可以使用JSTL，但是也支持一个更强大和灵活的表达式语言－－"Object Graph Notation Language" (OGNL). </p>
<p><strong>绑定值到页面（view）: </strong><br>&#8226; Struts 1使用标准JSP机制把对象绑定到页面中来访问。 <br>&#8226; Struts 2 使用 "ValueStack"技术，使taglib能够访问值而不需要把你的页面（view）和对象绑定起来。ValueStack策略允许通过一系列名称相同但类型不同的属性重用页面（view）。 <br>　 <br><strong>类型转换：</strong> <br>&#8226; Struts 1 ActionForm 属性通常都是String类型。Struts1使用Commons-Beanutils进行类型转换。每个类一个转换器，对每一个实例来说是不可配置的。 <br>&#8226; Struts2 使用OGNL进行类型转换。提供基本和常用对象的转换器。 </p>
<p><strong>校验：</strong> <br>&#8226; Struts 1支持在ActionForm的validate方法中手动校验，或者通过Commons Validator的扩展来校验。同一个类可以有不同的校验内容，但不能校验子对象。 <br>&#8226; Struts2支持通过validate方法和XWork校验框架来进行校验。XWork校验框架使用为属性类类型定义的校验和内容校验，来支持chain校验子属性 </p>
<p><strong>Action执行的控制：</strong> <br>&#8226; Struts1支持每一个模块有单独的Request Processors（生命周期），但是模块中的所有Action必须共享相同的生命周期。 <br>&#8226; Struts2支持通过拦截器堆栈（Interceptor&nbsp;Stacks）为每一个Action创建不同的生命周期。堆栈能够根据需要和不同的Action一起使用。</p>
<p><br>本文引用地址：<a href="http://cnpoint.com/web/2006/1023/content_4392.htm"><font color=#0000ff><u>http://cnpoint.com/web/2006/1023/content_4392.htm</u></font></a></p>
<div class=content_text id=11615771872 style="DISPLAY: none"><a href="http://cnpoint.com/web/2006/1023/content_4392.htm"><u><font color=#0000ff>来源：WEB开发资源联盟(http://cnpoint.com/)<br>作者：point<br>原文：Struts2与Struts1的对比(http://cnpoint.com/web/2006/1023/content_4392.htm)</font></u></a></div>
<br>
<img src ="http://www.blogjava.net/i369/aggbug/111965.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-04-19 16:00 <a href="http://www.blogjava.net/i369/articles/111965.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts2的struts.properties配置文件详解</title><link>http://www.blogjava.net/i369/articles/111964.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Thu, 19 Apr 2007 07:59:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/111964.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/111964.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/111964.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/111964.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/111964.html</trackback:ping><description><![CDATA[<a href="http://www.javaresource.org/struts/struts-24.html"><u><font color=#0000ff>struts</font></u></a>.action.extension<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;URL&nbsp;extension&nbsp;to&nbsp;use&nbsp;to&nbsp;determine&nbsp;if&nbsp;the&nbsp;request&nbsp;is&nbsp;me<a href="http://www.javaresource.org/ant/ant-57.html"><u><font color=#0000ff>ant</font></u></a>&nbsp;for&nbsp;a&nbsp;Struts&nbsp;action&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;用URL扩展名来确定是否这个请求是被用作Struts&nbsp;action，其实也就是设置&nbsp;action的后缀，例如login.do的'do'字。<br><br><a href="http://www.javaresource.org/struts/struts-24.html"><u><font color=#0000ff>struts</font></u></a>.configuration<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;org.apache.<a href="http://www.javaresource.org/struts/struts-24.html"><u><font color=#0000ff>struts</font></u></a>2.config.Configuration&nbsp;implementation&nbsp;class<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.apache.<a href="http://www.javaresource.org/struts/struts-24.html"><u><font color=#0000ff>struts</font></u></a>2.config.Configuration接口名<br><br><a href="http://www.javaresource.org/struts/struts-24.html"><u><font color=#0000ff>struts</font></u></a>.configuration.files<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A&nbsp;list&nbsp;of&nbsp;configuration&nbsp;files&nbsp;automatically&nbsp;loaded&nbsp;by&nbsp;Struts&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://www.javaresource.org/struts/struts-24.html"><u><font color=#0000ff>struts</font></u></a>自动加载的一个配置文件列表<br><br><a href="http://www.javaresource.org/struts/struts-24.html"><u><font color=#0000ff>struts</font></u></a>.configuration.<a href="http://www.javaresource.org/xml/xml-55.html"><u><font color=#0000ff>xml</font></u></a>.reload<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Whether&nbsp;to&nbsp;reload&nbsp;the&nbsp;XML&nbsp;configuration&nbsp;or&nbsp;not<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;是否加载<a href="http://www.javaresource.org/xml/xml-55.html"><u><font color=#0000ff>xml</font></u></a>配置(true,false)<br><br><a href="http://www.javaresource.org/struts/struts-24.html"><u><font color=#0000ff>struts</font></u></a>.continuations.package<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;package&nbsp;containing&nbsp;actions&nbsp;that&nbsp;use&nbsp;Rife&nbsp;continuations<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;含有actions的完整连续的package名称<br><br><a href="http://www.javaresource.org/struts/struts-24.html"><u><font color=#0000ff>struts</font></u></a>.custom.i18n.resources<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Location&nbsp;of&nbsp;additional&nbsp;localization&nbsp;properties&nbsp;files&nbsp;to&nbsp;load&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;加载附加的国际化属性文件（不包含.properties后缀）<br><br><a href="http://www.javaresource.org/struts/struts-24.html"><u><font color=#0000ff>struts</font></u></a>.custom.properties<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Location&nbsp;of&nbsp;additional&nbsp;configuration&nbsp;properties&nbsp;files&nbsp;to&nbsp;load<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;加载附加的配置文件的位置<br><br><br><a href="http://www.javaresource.org/struts/struts-24.html"><u><font color=#0000ff>struts</font></u></a>.devMode<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Whether&nbsp;Struts&nbsp;is&nbsp;in&nbsp;development&nbsp;mode&nbsp;or&nbsp;not<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;是否为<a href="http://www.javaresource.org/struts/struts-24.html"><u><font color=#0000ff>struts</font></u></a>开发模式<br><br><a href="http://www.javaresource.org/struts/struts-24.html"><u><font color=#0000ff>struts</font></u></a>.dispatcher.parametersWorkaround<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Whether&nbsp;to&nbsp;use&nbsp;a&nbsp;Servlet&nbsp;request&nbsp;parameter&nbsp;workaround&nbsp;necessary&nbsp;for&nbsp;some&nbsp;versions&nbsp;of&nbsp;WebLogic<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;（某些版本的<a href="http://www.javaresource.org/weblogic/weblogic.html"><u><font color=#0000ff>weblogic</font></u></a>专用）是否使用一个servlet请求参数工作区（PARAMETERSWORKAROUND）<br><br><a href="http://www.javaresource.org/struts/struts-24.html"><u><font color=#0000ff>struts</font></u></a>.enable.DynamicMethodInvocation<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Allows&nbsp;one&nbsp;to&nbsp;disable&nbsp;dynamic&nbsp;method&nbsp;invocation&nbsp;from&nbsp;the&nbsp;URL<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;允许动态方法调用<br><br><a href="http://www.javaresource.org/struts/struts-24.html"><u><font color=#0000ff>struts</font></u></a>.freemarker.manager.classname<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;org.apache.<a href="http://www.javaresource.org/struts/struts-24.html"><u><font color=#0000ff>struts</font></u></a>2.views.freemarker.FreemarkerManager&nbsp;implementation&nbsp;class&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.apache.<a href="http://www.javaresource.org/struts/struts-24.html"><u><font color=#0000ff>struts</font></u></a>2.views.freemarker.FreemarkerManager接口名<br><br><a href="http://www.javaresource.org/struts/struts-24.html"><u><font color=#0000ff>struts</font></u></a>.i18n.encoding<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;encoding&nbsp;to&nbsp;use&nbsp;for&nbsp;localization&nbsp;messages<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;国际化信息内码<br><br><a href="http://www.javaresource.org/struts/struts-24.html"><u><font color=#0000ff>struts</font></u></a>.i18n.reload<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Whether&nbsp;the&nbsp;localization&nbsp;messages&nbsp;should&nbsp;automatically&nbsp;be&nbsp;reloaded<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;是否国际化信息自动加载&nbsp;<br><br><a href="http://www.javaresource.org/struts/struts-24.html"><u><font color=#0000ff>struts</font></u></a>.locale<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;default&nbsp;locale&nbsp;for&nbsp;the&nbsp;Struts&nbsp;application<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;默认的国际化地区信息<br><br><a href="http://www.javaresource.org/struts/struts-24.html"><u><font color=#0000ff>struts</font></u></a>.mapper.class<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;org.apache.<a href="http://www.javaresource.org/struts/struts-24.html"><u><font color=#0000ff>struts</font></u></a>2.dispatcher.mapper.ActionMapper&nbsp;implementation&nbsp;class<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.apache.<a href="http://www.javaresource.org/struts/struts-24.html"><u><font color=#0000ff>struts</font></u></a>2.dispatcher.mapper.ActionMapper接口<br><br><a href="http://www.javaresource.org/struts/struts-24.html"><u><font color=#0000ff>struts</font></u></a>.multipart.maxSize<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;maximize&nbsp;size&nbsp;of&nbsp;a&nbsp;multipart&nbsp;request&nbsp;(file&nbsp;upload)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;multipart请求信息的最大尺寸（文件上传用）&nbsp;<br><br><a href="http://www.javaresource.org/struts/struts-24.html"><u><font color=#0000ff>struts</font></u></a>.multipart.parser<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;org.apache.<a href="http://www.javaresource.org/struts/struts-24.html"><u><font color=#0000ff>struts</font></u></a>2.dispatcher.multipart.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MultiPartRequest&nbsp;parser&nbsp;implementation&nbsp;for&nbsp;a&nbsp;multipart&nbsp;request&nbsp;(file&nbsp;upload)&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;专为multipart请求信息使用的org.apache.<a href="http://www.javaresource.org/struts/struts-24.html"><u><font color=#0000ff>struts</font></u></a>2.dispatcher.multipart.MultiPartRequest解析器接口（文件上传用）<br><br><br><a href="http://www.javaresource.org/struts/struts-24.html"><u><font color=#0000ff>struts</font></u></a>.multipart.saveDir<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;directory&nbsp;to&nbsp;use&nbsp;for&nbsp;storing&nbsp;uploaded&nbsp;files&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;设置存储上传文件的目录夹<br><br><a href="http://www.javaresource.org/struts/struts-24.html"><u><font color=#0000ff>struts</font></u></a>.objectFactory<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;com.opensymphony.xwork2.ObjectFactory&nbsp;implementation&nbsp;class<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;com.opensymphony.xwork2.ObjectFactory接口（<a href="http://www.javaresource.org/spring-framework/spring-framework-23.html"><u><font color=#0000ff>spring</font></u></a>）<br><br><a href="http://www.javaresource.org/struts/struts-24.html"><u><font color=#0000ff>struts</font></u></a>.objectFactory.<a href="http://www.javaresource.org/spring-framework/spring-framework-23.html"><u><font color=#0000ff>spring</font></u></a>.autoWire<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Whether&nbsp;Spring&nbsp;should&nbsp;autoWire&nbsp;or&nbsp;not<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;是否自动绑定Spring<br><br><a href="http://www.javaresource.org/struts/struts-24.html"><u><font color=#0000ff>struts</font></u></a>.objectFactory.<a href="http://www.javaresource.org/spring-framework/spring-framework-23.html"><u><font color=#0000ff>spring</font></u></a>.useClassCache<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Whether&nbsp;Spring&nbsp;should&nbsp;use&nbsp;its&nbsp;class&nbsp;cache&nbsp;or&nbsp;not<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;是否<a href="http://www.javaresource.org/spring-framework/spring-framework-23.html"><u><font color=#0000ff>spring</font></u></a>应该使用自身的cache&nbsp;<br><br><a href="http://www.javaresource.org/struts/struts-24.html"><u><font color=#0000ff>struts</font></u></a>.objectTypeDeterminer<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;com.opensymphony.xwork2.util.ObjectTypeDeterminer&nbsp;implementation&nbsp;class<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;com.opensymphony.xwork2.util.ObjectTypeDeterminer接口<br><br><a href="http://www.javaresource.org/struts/struts-24.html"><u><font color=#0000ff>struts</font></u></a>.serve.static.browserCache<br>&nbsp;&nbsp;If&nbsp;static&nbsp;content&nbsp;served&nbsp;by&nbsp;the&nbsp;Struts&nbsp;filter&nbsp;should&nbsp;set&nbsp;browser&nbsp;caching&nbsp;header&nbsp;properties&nbsp;or&nbsp;not&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;是否<a href="http://www.javaresource.org/struts/struts-24.html"><u><font color=#0000ff>struts</font></u></a>过滤器中提供的静态内容应该被浏览器缓存在头部属性中<br><br><a href="http://www.javaresource.org/struts/struts-24.html"><u><font color=#0000ff>struts</font></u></a>.serve.static<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Whether&nbsp;the&nbsp;Struts&nbsp;filter&nbsp;should&nbsp;serve&nbsp;static&nbsp;content&nbsp;or&nbsp;not&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;是否<a href="http://www.javaresource.org/struts/struts-24.html"><u><font color=#0000ff>struts</font></u></a>过滤器应该提供静态内容<br><br><a href="http://www.javaresource.org/struts/struts-24.html"><u><font color=#0000ff>struts</font></u></a>.tag.altSyntax<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Whether&nbsp;to&nbsp;use&nbsp;the&nbsp;alterative&nbsp;syntax&nbsp;for&nbsp;the&nbsp;tags&nbsp;or&nbsp;not&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;是否可以用替代的语法替代tags<br><br><a href="http://www.javaresource.org/struts/struts-24.html"><u><font color=#0000ff>struts</font></u></a>.ui.templateDir<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;directory&nbsp;containing&nbsp;UI&nbsp;templates<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UI&nbsp;templates的目录夹&nbsp;<br><br><a href="http://www.javaresource.org/struts/struts-24.html"><u><font color=#0000ff>struts</font></u></a>.ui.theme<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;default&nbsp;UI&nbsp;template&nbsp;theme<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;默认的UI&nbsp;template主题<br><br><a href="http://www.javaresource.org/struts/struts-24.html"><u><font color=#0000ff>struts</font></u></a>.url.http.port<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;HTTP&nbsp;port&nbsp;used&nbsp;by&nbsp;Struts&nbsp;URLs<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;设置http端口<br><br><a href="http://www.javaresource.org/struts/struts-24.html"><u><font color=#0000ff>struts</font></u></a>.url.https.port<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;HTTPS&nbsp;port&nbsp;used&nbsp;by&nbsp;Struts&nbsp;URLs&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;设置https端口<br><br><a href="http://www.javaresource.org/struts/struts-24.html"><u><font color=#0000ff>struts</font></u></a>.url.includeParams<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;default&nbsp;includeParams&nbsp;method&nbsp;to&nbsp;generate&nbsp;Struts&nbsp;URLs&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在url中产生&nbsp;默认的includeParams<br><br><br><a href="http://www.javaresource.org/struts/struts-24.html"><u><font color=#0000ff>struts</font></u></a>.velocity.configfile<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;Velocity&nbsp;configuration&nbsp;file&nbsp;path<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;velocity配置文件路径<br><br><a href="http://www.javaresource.org/struts/struts-24.html"><u><font color=#0000ff>struts</font></u></a>.velocity.contexts<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;of&nbsp;Velocity&nbsp;context&nbsp;names<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;velocity的context列表<br><br><br><a href="http://www.javaresource.org/struts/struts-24.html"><u><font color=#0000ff>struts</font></u></a>.velocity.manager.classname<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.apache.<a href="http://www.javaresource.org/struts/struts-24.html"><u><font color=#0000ff>struts</font></u></a>2.views.velocity.VelocityManager&nbsp;implementation&nbsp;class<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.apache.<a href="http://www.javaresource.org/struts/struts-24.html"><u><font color=#0000ff>struts</font></u></a>2.views.velocity.VelocityManager接口名<br><br><a href="http://www.javaresource.org/struts/struts-24.html"><u><font color=#0000ff>struts</font></u></a>.velocity.toolboxlocation<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;location&nbsp;of&nbsp;the&nbsp;Velocity&nbsp;toolbox<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;velocity工具盒的位置&nbsp;<br><a href="http://www.javaresource.org/struts/struts-24.html"><u><font color=#0000ff>struts</font></u></a>.xslt.nocache<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Whether&nbsp;or&nbsp;not&nbsp;XSLT&nbsp;templates&nbsp;should&nbsp;not&nbsp;be&nbsp;cached<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;是否XSLT模版应该被缓存<br><br>请记住本文永久地址:<br><a href="http://www.javaresource.org/struts/struts-75302.html"><u><font color=#0000ff>http://www.javaresource.org/struts/struts-75302.html</font></u></a> <br>
<img src ="http://www.blogjava.net/i369/aggbug/111964.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-04-19 15:59 <a href="http://www.blogjava.net/i369/articles/111964.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Struts 2.0中国际化(i18n)您的应用程序 </title><link>http://www.blogjava.net/i369/articles/111922.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Thu, 19 Apr 2007 05:34:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/111922.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/111922.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/111922.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/111922.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/111922.html</trackback:ping><description><![CDATA[<p>国际化是商业系统中不可或缺的一部分，所以无论您学习的是什么Web框架，它都是必须掌握的技能。</p>
<p>其实，Struts 1.x在此部分已经做得相当不错了。它极大地简化了我们程序员在做国际化时所需的工作，例如，如果您要输出一条国际化的信息，只需在代码包中加入FILE-NAME_xx_XX.properties（其中FILE-NAME为默认资源文件的文件名），然后在struts-config.xml中指明其路径，再在页面用&lt;bean:message&gt;标志输出即可。 </p>
<p>不过，所谓&#8220;没有最好，只有更好&#8221;。Struts 2.0并没有在这部分止步，而是在原有的简单易用的基础上，将其做得更灵活、更强大。</p>
<h2>国际化Hello World</h2>
<p>下面让我们看一个例子——HelloWorld。这个例子演示如何根据用户浏览器的设置输出相应的HelloWorld。</p>
<ol>
    <li>在Eclipse创建工程配置开发和运行环境（如果对这个步骤有问题，可以参考我早前的文章《<a class=entrylistItemTitle id=A1 href="http://www.blogjava.net/max/archive/2006/10/10/74353.html"><strong><font color=#1a8bc8>为Struts 2.0做好准备</font></strong></a>》）。 <br>
    <li>在src文件夹中加入struts.properties文件，内容如下： <br>
    <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"><span style="COLOR: #000000">struts.custom.i18n.resources</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">globalMessages</span></div>
    <center>
    <table style="BORDER-RIGHT: #f0c000 1px solid; BORDER-TOP: #f0c000 1px solid; MARGIN-TOP: 8px; MARGIN-BOTTOM: 8px; BORDER-LEFT: #f0c000 1px solid; BORDER-BOTTOM: #f0c000 1px solid; BACKGROUND-COLOR: #ffffce; TEXT-ALIGN: left" cellSpacing=0 cellPadding=0 border=0>
        <tbody>
            <tr>
                <td style="PADDING-RIGHT: 4px; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; PADDING-TOP: 4px"><img src="http://cwiki.apache.org/confluence/images/icons/emoticons/lightbulb_on.gif"></td>
                <td style="PADDING-RIGHT: 4px; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; PADDING-TOP: 4px; FONT-FAMILY: 华文仿宋">Struts 2.0有两个配置文件，struts.xml和struts.properties都是放在WEB-INF/classes/下。
                <ul>
                    <li>struts.xml用于应用程序相关的配置
                    <li>struts.properties用于Struts 2.0的运行时（Runtime）的配置</li>
                </ul>
                </td>
            </tr>
        </tbody>
    </table>
    </center>
    <li>在src文件夹中加入globalMessages_en_US.properties文件，内容如下：<br>
    <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; MARGIN-BOTTOM: 8px; 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"><span style="COLOR: #000000">HelloWorld</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">Hello World!</span></div>
    <li>在src文件夹中加入globalMessages_zh_CN.properties文件，内容如下：<br>
    <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"><span style="COLOR: #000000">HelloWorld</span><span style="COLOR: #000000">=你</span><span style="COLOR: #000000">好，世界！</span></div>
    <table style="BORDER-RIGHT: #f0c000 1px solid; BORDER-TOP: #f0c000 1px solid; MARGIN-TOP: 8px; MARGIN-BOTTOM: 8px; BORDER-LEFT: #f0c000 1px solid; BORDER-BOTTOM: #f0c000 1px solid; BACKGROUND-COLOR: #ffffce; TEXT-ALIGN: left" cellSpacing=0 cellPadding=0 border=0>
        <tbody>
            <tr>
                <td style="PADDING-RIGHT: 4px; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; PADDING-TOP: 4px"><img src="http://cwiki.apache.org/confluence/images/icons/emoticons/lightbulb_on.gif"></td>
                <td style="PADDING-RIGHT: 4px; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; PADDING-TOP: 4px; FONT-FAMILY: 华文仿宋">在此想和大家分享一个不错的编写properties文件的Eclipse插件（plugin），有了它我们在编辑一些简体中文、繁体中文等Unicode文本时，就不必再使用native2ascii编码了。您可以通过Eclipse中的软件升级（Software Update）安装此插件，步骤如下：<br>
                <div style="PADDING-RIGHT: 36px; PADDING-LEFT: 36px">1、展开Eclipse的Help菜单，将鼠标移到Software Update子项，在出现的子菜单中点击Find and Install；<br>2、在Install/Update对话框中选择Search for new features to install，点击Next；<br>3、在Install对话框中点击New Remote Site；<br>4、在New Update Site对话框的Name填入&#8220;PropEdit&#8221;或其它任意非空字符串，在URL中填入http://propedit.sourceforge.jp/eclipse/updates/；<br>5、在Site to include to search列表中，除上一步加入的site外的其它选项去掉，点击Finsih；<br>6、在弹出的Updates对话框中的Select the features to install列表中将所有结尾为&#8220;3.1.x&#8221;的选项去掉（适用于Eclipse 3.2版本的朋友）；<br>7、点击Finish关闭对话框；<br>8、在下载后，同意安装，再按提示重启Eclipse，在工具条看到形似vi的按钮表示安装成功，插件可用。此时，Eclpise中所有properties文件的文件名前有绿色的P的图标作为标识。 </div>
                </td>
            </tr>
        </tbody>
    </table>
    <li>在WebContent文件夹下加入HelloWorl.jsp文件，内容如下：<br>
    <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; MARGIN-BOTTOM: 8px; 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"><span style="COLOR: #000000; BACKGROUND-COLOR: #ffff00">&lt;%</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">@ page &nbsp;contentType</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">=</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">text/html; charset=UTF-8</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span><span style="COLOR: #000000; BACKGROUND-COLOR: #ffff00">%&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #000000; BACKGROUND-COLOR: #ffff00">&lt;%</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">@taglib prefix</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">=</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">s</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5"> uri</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">=</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">/struts-tags</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5"></span><span style="COLOR: #000000; BACKGROUND-COLOR: #ffff00">%&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">html</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">head</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br>&nbsp; &nbsp; </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">title</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">Hello World</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">title</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">head</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">body</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br>&nbsp; &nbsp; </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">h2</span><span style="COLOR: #0000ff">&gt;&lt;</span><span style="COLOR: #800000">s:text </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="HelloWorld"</span><span style="COLOR: #ff0000"></span><span style="COLOR: #0000ff">/&gt;&lt;/</span><span style="COLOR: #800000">h2</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br>&nbsp; &nbsp; </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">h2</span><span style="COLOR: #0000ff">&gt;&lt;</span><span style="COLOR: #800000">s:property </span><span style="COLOR: #ff0000">value</span><span style="COLOR: #0000ff">="%{getText('HelloWorld')}"</span><span style="COLOR: #ff0000"></span><span style="COLOR: #0000ff">/&gt;&lt;/</span><span style="COLOR: #800000">h2</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">body</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">html</span><span style="COLOR: #0000ff">&gt;</span></div>
    <li>发布运行应用程序，在浏览器地址栏中输入<a href="http://localhost:8080/Struts2_i18n/HelloWorld.jsp"><font color=#1a8bc8>http://localhost:8080/Struts2_i18n/HelloWorld.jsp</font></a> ，出现图1所示页面。<br><img alt="图1 中文输出" src="http://www.blogjava.net/images/blogjava_net/max/16758/r_imag2.gif"><br><span style="FONT-SIZE: smaller; MARGIN-BOTTOM: 8px; FONT-STYLE: italic"><font size=1>图1 中文输出</font></span>
    <li>将浏览器的默认语言改为&#8220;英语（美国）&#8221;，刷新页面，出现图2所示页面。<br><img alt="图2 英文输出" src="http://www.blogjava.net/images/blogjava_net/max/16758/r_imag1.gif"><br><span style="FONT-SIZE: smaller; MARGIN-BOTTOM: 8px; FONT-STYLE: italic"><font size=1>图2 英文输出</font></span> </li>
</ol>
上面的例子的做法，与Struts 1.x的做法相似，似乎并不能体现Struts 2.0的优势。不过，我在上面的例子用了两种方法来显示国际化字符串，其输出是相同的。其实，这就是Struts 2.0的一个优势，因为它默认支持EL，所示我们可以用getText方法来简洁地取得国际化字符串。另外更普遍的情况——在使用UI表单标志时，getText可以用来设置label属性，例如：<br>
<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"><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">s:textfield </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="name"</span><span style="COLOR: #ff0000"> label</span><span style="COLOR: #0000ff">="%{getText('UserName')}"</span><span style="COLOR: #ff0000"></span><span style="COLOR: #0000ff">/&gt;</span></div>
<h2>资源文件查找顺序</h2>
<p>之所以说Struts 2.0的国际化更灵活是因为它可以能根据不同需要配置和获取资源（properties）文件。在Struts 2.0中有下面几种方法：</p>
<ol>
    <li>使用全局的资源文件，方法如上例所示。这适用于遍布于整个应用程序的国际化字符串，它们在不同的包（package）中被引用，如一些比较共用的出错提示；
    <li>使用包范围内的资源文件。做法是在包的根目录下新建名的package.properties和package_xx_XX.properties文件。这就适用于在包中不同类访问的资源；
    <li>使用Action范围的资源文件。做法为Action的包下新建文件名（除文件扩展名外）与Action类名同样的资源文件。它只能在该Action中访问。如此一来，我们就可以在不同的Action里使用相同的properties名表示不同的值。例如，在ActonOne中title为&#8220;动作一&#8221;，而同样用title在ActionTwo表示&#8220;动作二&#8221;，节省一些命名工夫；
    <li>使用&lt;s:i18n&gt;标志访问特定路径的properties文件。使用方法请参考我早前的文章《<a class=entrylistItemTitle id=CategoryEntryList1_EntryStoryList_Entries_ctl02_TitleUrl href="http://www.blogjava.net/max/archive/2006/10/18/75857.html"><strong><font color=#1a8bc8>常用的Struts 2.0的标志（Tag）介绍</font></strong></a>》。在您使用这一方法时，请注意&lt;s:i18n&gt;标志的范围。在&lt;s:i18n name="xxxxx"&gt;到&lt;/s:i18n&gt;之间，所有的国际化字符串都会在名为xxxxx资源文件查找，如果找不到，Struts 2.0就会输出默认值（国际化字符串的名字）。</li>
</ol>
<p>上面我列举了四种配置和访问资源的方法，它们的范围分别是从大到小，而Struts 2.0在查找国际化字符串所遵循的是特定的顺序，如图3所示：</p>
<img alt="图3 资源文件查找顺序图" src="http://www.blogjava.net/images/blogjava_net/max/16758/o_Search.jpg"><br><span style="FONT-SIZE: smaller; MARGIN-BOTTOM: 8px; FONT-STYLE: italic"><font size=1>图3 资源文件查找顺序图</font></span>
<p>假设我们在某个ChildAction中调用了getText("user.title")，Struts 2.0的将会执行以下的操作： </p>
<ol>
    <li>查找ChildAction_xx_XX.properties文件或ChildAction.properties；
    <li>查找ChildAction实现的接口，查找与接口同名的资源文件MyInterface.properties；
    <li>查找ChildAction的父类ParentAction的properties文件，文件名为ParentAction.properties；
    <li>判断当前ChildAction是否实现接口ModelDriven。如果是，调用getModel()获得对象，查找与其同名的资源文件；
    <li>查找当前包下的package.properties文件；
    <li>查找当前包的父包，直到最顶层包；
    <li>在值栈（Value Stack）中，查找名为user的属性，转到user类型同名的资源文件，查找键为title的资源;
    <li>查找在struts.properties配置的默认的资源文件，参考例1;
    <li>输出user.title。</li>
</ol>
<h2>参数化国际化字符串</h2>
<p>许多情况下，我们都需要在动行时（runtime）为国际化字符插入一些参数，例如在输入验证提示信息的时候。在Struts 2.0中，我们通过以下两种方法做到这点：</p>
<ol>
    <li>在资源文件的国际化字符串中使用OGNL，格式为${表达式}，例如：<br>
    <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; MARGIN-BOTTOM: 8px; 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"><span style="COLOR: #000000">validation.require</span><span style="COLOR: #000000">=</span><span style="MARGIN-BOTTOM: 8px; COLOR: #000000">${getText(fileName)} is required</span></div>
    <li>使用<a href="http://gceclub.sun.com.cn/Java_Docs/html/zh_CN/api/java/text/MessageFormat.html"><font color=#1a8bc8>java.text.MessageFormat</font></a>中的字符串格式，格式为{ 参数序号（从0开始）, 格式类形（number | date | time | choice）, 格式样式}，例如：<br>
    <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"><span style="COLOR: #000000">validation.between</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">Date must between {</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000"> date, short} and {</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000"> date, short}</span></div>
    </li>
</ol>
在显示这些国际化字符时，同样有两种方法设置参数的值：<br>
<ol>
    <li>使用标志的value0、value1...valueN的属性，如：<br>
    <div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; MARGIN-BOTTOM: 8px; 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"><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">s:text </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="validation.required"</span><span style="COLOR: #ff0000"> value0</span><span style="COLOR: #0000ff">="User Name"</span><span style="COLOR: #ff0000"></span><span style="COLOR: #0000ff">/&gt;</span></div>
    <li>使用param子元素，这些param将按先后顺序，代入到国际化字符串的参数中，例如：<br>
    <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"><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">s:text </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="validation.required"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br>&nbsp; &nbsp;</span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">s:param </span><span style="COLOR: #ff0000">value</span><span style="COLOR: #0000ff">="User Name"</span><span style="COLOR: #ff0000"></span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">s:text</span><span style="COLOR: #0000ff">&gt;</span></div>
    </li>
</ol>
<h2>让用户方便地选择语言</h2>
<p>开发国际化的应用程序时，有一个功能是必不可少的——让用户快捷地选择或切换语言。在Struts 2.0中，通过ActionContext.getContext().setLocale(Locale arg)可以设置用户的默认语言。不过，由于这是一个比较普遍的应用场景（Scenario），所以Struts 2.0为您提供了一个名i18n的拦截器（Interceptor），并在默认情况下将其注册到拦截器链（Interceptor chain）中。它的原理为在执行Action方法前，i18n拦截器查找请求中的一个名为"request_locale"的参数。如果其存在，拦截器就将其作为参数实例化Locale对象，并将其设为用户默认的区域（Locale），最后，将此Locale对象保存在session的名为&#8220;WW_TRANS_I18N_LOCALE&#8221;的属性中。</p>
<p>下面，我将提供一完整示例演示它的使用方法。</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><span style="COLOR: #0000ff">package</span><span style="COLOR: #000000"> tutorial;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> java.util.Hashtable;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> java.util.Locale;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> java.util.Map;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><br><img id=Codehighlighter1_116_345_Open_Image onclick="this.style.display='none'; Codehighlighter1_116_345_Open_Text.style.display='none'; Codehighlighter1_116_345_Closed_Image.style.display='inline'; Codehighlighter1_116_345_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_116_345_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_116_345_Closed_Text.style.display='none'; Codehighlighter1_116_345_Open_Image.style.display='inline'; Codehighlighter1_116_345_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> Locales </span><span id=Codehighlighter1_116_345_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_116_345_Open_Text><span style="COLOR: #000000">{<br><img id=Codehighlighter1_159_343_Open_Image onclick="this.style.display='none'; Codehighlighter1_159_343_Open_Text.style.display='none'; Codehighlighter1_159_343_Closed_Image.style.display='inline'; Codehighlighter1_159_343_Closed_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_159_343_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_159_343_Closed_Text.style.display='none'; Codehighlighter1_159_343_Open_Image.style.display='inline'; Codehighlighter1_159_343_Open_Text.style.display='inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align=top> &nbsp; &nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> Map</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">String, Locale</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"> getLocales() </span><span id=Codehighlighter1_159_343_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"></span><span id=Codehighlighter1_159_343_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top> &nbsp; &nbsp; &nbsp; &nbsp;Map</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">String, Locale</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"> locales </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"></span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> Hashtable</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">String, Locale</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top> &nbsp; &nbsp; &nbsp; &nbsp;locales.put(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">American English</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, Locale.US);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top> &nbsp; &nbsp; &nbsp; &nbsp;locales.put(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Simplified Chinese</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, Locale.CHINA);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align=top> &nbsp; &nbsp; &nbsp; &nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> locales;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top> &nbsp; &nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<font size=1><span style="FONT-SIZE: smaller; FONT-STYLE: italic">tutorial/Locales.java</span><br><br></font>
<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"><span style="COLOR: #000000; BACKGROUND-COLOR: #ffff00">&lt;%</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">@taglib prefix</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">=</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">s</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5"> uri</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">=</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">/struts-tags</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">"</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5"></span><span style="COLOR: #000000; BACKGROUND-COLOR: #ffff00">%&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">script </span><span style="COLOR: #ff0000">type</span><span style="COLOR: #0000ff">="text/javascript"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5"><br></span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5">&lt;!--</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5"><br>&nbsp; &nbsp; </span><span style="COLOR: #0000ff; BACKGROUND-COLOR: #f5f5f5">function</span><span style="COLOR: #000000; BACKGROUND-COLOR: #f5f5f5"> langSelecter_onChanged() {<br>&nbsp; &nbsp; &nbsp; &nbsp; document.langForm.submit();<br>&nbsp; &nbsp; }<br></span><span style="COLOR: #008000; BACKGROUND-COLOR: #f5f5f5">//</span><span style="COLOR: #008000; BACKGROUND-COLOR: #f5f5f5">--&gt;</span><span style="COLOR: #008000; BACKGROUND-COLOR: #f5f5f5"><br></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">script</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">s:set </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="SESSION_LOCALE"</span><span style="COLOR: #ff0000"> value</span><span style="COLOR: #0000ff">="#session['WW_TRANS_I18N_LOCALE']"</span><span style="COLOR: #ff0000"></span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">s:bean </span><span style="COLOR: #ff0000">id</span><span style="COLOR: #0000ff">="locales"</span><span style="COLOR: #ff0000"> name</span><span style="COLOR: #0000ff">="tutorial.Locales"</span><span style="COLOR: #ff0000"></span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">form </span><span style="COLOR: #ff0000">action</span><span style="COLOR: #0000ff">="&lt;s:url includeParams="</span><span style="COLOR: #ff0000">get" encode</span><span style="COLOR: #0000ff">="true"</span><span style="COLOR: #ff0000"></span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000">" name="langForm"&nbsp;<br>&nbsp; &nbsp; style="background-color: powderblue; padding-top: 4px; padding-bottom: 4px;"&gt;<br>&nbsp; &nbsp; Language: </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">s:select </span><span style="COLOR: #ff0000">label</span><span style="COLOR: #0000ff">="Language"</span><span style="COLOR: #ff0000">&nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; list</span><span style="COLOR: #0000ff">="#locales.locales"</span><span style="COLOR: #ff0000"> listKey</span><span style="COLOR: #0000ff">="value"</span><span style="COLOR: #ff0000"> &nbsp; &nbsp;listValue</span><span style="COLOR: #0000ff">="key"</span><span style="COLOR: #ff0000"><br>&nbsp; &nbsp; &nbsp; &nbsp; value</span><span style="COLOR: #0000ff">="#SESSION_LOCALE == null ? locale : #SESSION_LOCALE"</span><span style="COLOR: #ff0000"><br>&nbsp; &nbsp; &nbsp; &nbsp; name</span><span style="COLOR: #0000ff">="request_locale"</span><span style="COLOR: #ff0000"> id</span><span style="COLOR: #0000ff">="langSelecter"</span><span style="COLOR: #ff0000">&nbsp;<br>&nbsp; &nbsp; &nbsp; &nbsp; onchange</span><span style="COLOR: #0000ff">="langSelecter_onChanged()"</span><span style="COLOR: #ff0000"> theme</span><span style="COLOR: #0000ff">="simple"</span><span style="COLOR: #ff0000"></span><span style="COLOR: #0000ff">/&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">form</span><span style="COLOR: #0000ff">&gt;</span></div>
<span style="FONT-SIZE: smaller; FONT-STYLE: italic"><font size=1>LangSelector.jsp</font></span>
<p>上述代码的原理为，LangSelector.jsp先实例化一个Locales对象，并把对象的Map类型的属性locales赋予下拉列表（select） 。如此一来，下拉列表就获得可用语言的列表。大家看到LangSelector有&lt;s:form&gt;标志和一段Javascript脚本，它们的作用就是在用户在下拉列表中选择了后，提交包含&#8220;reqeust_locale&#8221;变量的表单到Action。在打开页面时，为了下拉列表的选中的当前区域，我们需要到session取得当前区域（键为&#8220;WW_TRANS_I18N_LOCALE&#8221;的属性），而该属性在没有设置语言前是为空的，所以通过值栈中locale属性来取得当前区域（用户浏览器所设置的语言）。</p>
你可以把LangSelector.jsp作为一个控件使用，方法是在JSP页面中把它包含进来，代码如下所示：
<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"><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">s:include </span><span style="COLOR: #ff0000">value</span><span style="COLOR: #0000ff">="/LangSelector.jsp"</span><span style="COLOR: #ff0000"></span><span style="COLOR: #0000ff">/&gt;</span></div>
<br>在例1中的HellloWorld.jsp中&lt;body&gt;后加入上述代码，并在struts.xml中新建Action，代码如下：<br>
<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"><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">action </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="HelloWorld"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br>&nbsp; &nbsp; </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">result</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">/HelloWorld.jsp</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">result</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">action</span><span style="COLOR: #0000ff">&gt;</span></div>
<br>或者，如果你多个JSP需要实现上述功能，你可以使用下面的通用配置，而不是为每一个JSP页面都新建一个Action。<br>
<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"><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">action </span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="*"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br>&nbsp; &nbsp; </span><span style="COLOR: #0000ff">&lt;</span><span style="COLOR: #800000">result</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000">/{1}.jsp</span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">result</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">&lt;/</span><span style="COLOR: #800000">action</span><span style="COLOR: #0000ff">&gt;</span></div>
<br>分布运行程序，在浏览器的地址栏中输入<a href="http://localhost:8080/Struts2_i18n/HelloWorld.action"><font color=#1a8bc8>http://localhost:8080/Struts2_i18n/HelloWorld.action</font></a>，出现图4所示页面：<br><img alt="图3 HelloWorld.action" src="http://www.blogjava.net/images/blogjava_net/max/16758/r_imag3.gif"><br><font size=1><span style="FONT-SIZE: smaller; MARGIN-BOTTOM: 8px; FONT-STYLE: italic">图3 HelloWorld.action<br></span><br></font>在下拉列表中，选择&#8220;American English&#8221;，出现图5所示页面：<br><img alt="图3 HelloWorld.action" src="http://www.blogjava.net/images/blogjava_net/max/16758/r_imag4.gif"><br><font size=1><span style="FONT-SIZE: smaller; MARGIN-BOTTOM: 8px; FONT-STYLE: italic">图4 HelloWorld.action</span><br></font>
<table style="BORDER-RIGHT: #f0c000 1px solid; BORDER-TOP: #f0c000 1px solid; MARGIN-TOP: 8px; MARGIN-BOTTOM: 8px; BORDER-LEFT: #f0c000 1px solid; BORDER-BOTTOM: #f0c000 1px solid; BACKGROUND-COLOR: #ffffce; TEXT-ALIGN: left" cellSpacing=0 cellPadding=0 border=0>
    <tbody>
        <tr>
            <td style="PADDING-RIGHT: 4px; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; PADDING-TOP: 4px"><font size=1><img src="http://cwiki.apache.org/confluence/images/icons/emoticons/lightbulb_on.gif"></font></td>
            <td style="PADDING-RIGHT: 4px; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; PADDING-TOP: 4px; FONT-FAMILY: 华文仿宋">可能大家会问为什么一定要通过Action来访问页面呢？<br>你可以试一下不用Action而直接用JSP的地址来访问页面，结果会是无论你在下拉列表中选择什么，语言都不会改变。这表示不能正常运行的。其原因为如果直接使用JSP访问页面，Struts 2.0在web.xml的配置的过滤器（Filter）就不会工作，所以拦截器链也不会工作。</td>
        </tr>
    </tbody>
</table>
<div class=postDesc>posted on 2006-11-01 19:06 <a href="http://www.blogjava.net/max/"><font color=#1a8bc8>Max</font></a> 阅读(3247) <a href="http://www.blogjava.net/max/archive/2006/11/01/78536.html#Post"><font color=#1a8bc8>评论(30)</font></a> &nbsp;<a href="http://www.blogjava.net/max/admin/EditPosts.aspx?postid=78536"><font color=#1a8bc8>编辑</font></a>&nbsp;<a href="http://www.blogjava.net/max/AddToFavorite.aspx?id=78536"><font color=#1a8bc8>收藏</font></a> <a href="http://www.blogjava.net/max/services/trackbacks/78536.aspx"><font color=#1a8bc8>引用</font></a> 所属分类: <a href="http://www.blogjava.net/max/category/16130.html"><font color=#1a8bc8>Struts 2.0系列</font></a> </div>
<img src ="http://www.blogjava.net/i369/aggbug/111922.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-04-19 13:34 <a href="http://www.blogjava.net/i369/articles/111922.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>常用的Struts 2.0的标志（Tag）介绍 </title><link>http://www.blogjava.net/i369/articles/111921.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Thu, 19 Apr 2007 05:33:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/111921.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/111921.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/111921.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/111921.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/111921.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在上一篇文章《为Struts 2.0做好准备》中，我过于详细地介绍了Struts 2.0开发环境和运行环境的配置，所以，本文很少涉及的以上两方面的细节。如果，您看完《为Struts 2.0做好准备》后，还有什么不明白，或者没法运行文中例子，请联系我。我的E-MAIL：Max.M.Yuan@gmail.com。在介绍常用标志前，我想先从总体上，对Struts 1.x与Struts 2.0的标志库...&nbsp;&nbsp;<a href='http://www.blogjava.net/i369/articles/111921.html'>阅读全文</a><img src ="http://www.blogjava.net/i369/aggbug/111921.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-04-19 13:33 <a href="http://www.blogjava.net/i369/articles/111921.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Struts 2中实现文件上传 </title><link>http://www.blogjava.net/i369/articles/111918.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Thu, 19 Apr 2007 05:29:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/111918.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/111918.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/111918.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/111918.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/111918.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 前一阵子有些朋友在电子邮件中问关于Struts 2实现文件上传的问题， 所以今天我们就来讨论一下这个问题。实现原理Struts 2是通过Commons FileUpload文件上传。Commons FileUpload通过将HTTP的数据保存到临时文件夹，然后Struts使用fileUpload拦截器将文件绑定到Action的实例中。从而我们就能够以本地文件方式的操作浏览器上传的文件。...&nbsp;&nbsp;<a href='http://www.blogjava.net/i369/articles/111918.html'>阅读全文</a><img src ="http://www.blogjava.net/i369/aggbug/111918.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-04-19 13:29 <a href="http://www.blogjava.net/i369/articles/111918.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Struts 2中实现CRUD </title><link>http://www.blogjava.net/i369/articles/111917.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Thu, 19 Apr 2007 05:28:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/111917.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/111917.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/111917.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/111917.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/111917.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: CRUD是Create（创建）、Read（读取）、Update（更新）和Delete（删除）的缩写，它是普通应用程序的缩影。如果您掌握了某框架的CRUD编写，那么意味可以使用该框架创建普通应用程序了，所以大家使用新框架开发OLTP（Online Transaction Processing）应用程序时，首先会研究一下如何编写CRUD。这类似于大家在学习新编程语言时喜欢编写&#8220;Hello ...&nbsp;&nbsp;<a href='http://www.blogjava.net/i369/articles/111917.html'>阅读全文</a><img src ="http://www.blogjava.net/i369/aggbug/111917.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-04-19 13:28 <a href="http://www.blogjava.net/i369/articles/111917.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts 2.0的Action讲解 </title><link>http://www.blogjava.net/i369/articles/111913.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Thu, 19 Apr 2007 05:24:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/111913.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/111913.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/111913.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/111913.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/111913.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 有Struts 1.x经验的朋友都知道Action是Struts的核心内容，当然Struts 2.0也不例外。不过，Struts 1.x与Struts 2.0的Action模型很大的区别。                        &nbsp;            Struts 1.x            Stuts 2.0               ...&nbsp;&nbsp;<a href='http://www.blogjava.net/i369/articles/111913.html'>阅读全文</a><img src ="http://www.blogjava.net/i369/aggbug/111913.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-04-19 13:24 <a href="http://www.blogjava.net/i369/articles/111913.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>为Struts 2.0做好准备</title><link>http://www.blogjava.net/i369/articles/111909.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Thu, 19 Apr 2007 05:19:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/111909.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/111909.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/111909.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/111909.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/111909.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Struts作为MVC 2的Web框架，自推出以来不断受到开发者的追捧，得到用广泛的应用。作为最成功的Web框架，Struts自然拥有众多的优点：    MVC 2模型的使用    功能齐全的标志库（Tag Library）    开放源代码 但是，所谓&#8220;金无赤金，人无完人&#8221;，Struts自身也有不少的缺点：    需要编写的代码过多，容易引...&nbsp;&nbsp;<a href='http://www.blogjava.net/i369/articles/111909.html'>阅读全文</a><img src ="http://www.blogjava.net/i369/aggbug/111909.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-04-19 13:19 <a href="http://www.blogjava.net/i369/articles/111909.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts 2的基石——拦截器（Interceptor） </title><link>http://www.blogjava.net/i369/articles/111907.html</link><dc:creator>芦苇</dc:creator><author>芦苇</author><pubDate>Thu, 19 Apr 2007 05:17:00 GMT</pubDate><guid>http://www.blogjava.net/i369/articles/111907.html</guid><wfw:comment>http://www.blogjava.net/i369/comments/111907.html</wfw:comment><comments>http://www.blogjava.net/i369/articles/111907.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/i369/comments/commentRss/111907.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/i369/services/trackbacks/111907.html</trackback:ping><description><![CDATA[<p>首先，要跟大家道个歉，前一阵子为给客户个一个DEMO，忙得不可开交，所以很久没有更新Blog。提到这个DEMO我想顺便跟大家分享一下心得——如果大家希望快速开发，一个类似Struts 2这样的简单方便的WEB框架必不可少。我们在开发DEMO使用的还是Struts 1.2.8，而且没有不使用任何EL（表达式语言），导致页面出现无数类似&#8220;&lt;%= ((Integer) request.getAttribute("xx")).intValue()%6 %&gt;&#8221;的代码。Struts 1.x的Form Bean的麻烦使得有部分同事直接使用request.getParameter(String arg)，继而引入另一种麻烦。诸如此类的问题，在DEMO这样时间紧迫的项目凸显了Struts 1.x对快速开发的无能为力。不过没办法，由于我们项目中的几个资深员工除了Struts 1.x外，对其它的WEB框架似乎不大感兴趣。 </p>
<p>言归正传，Interceptor（以下译为拦截器）是Struts 2的一个强有力的工具，有许多功能（feature）都是构建于它之上，如<a href="http://www.blogjava.net/max/archive/2006/11/01/78536.html"><font color=#1a8bc8>国际化</font></a>、<a href="http://www.blogjava.net/max/archive/2006/11/07/79602.html"><font color=#1a8bc8>转换器</font></a>，<a href="http://www.blogjava.net/max/archive/2006/11/14/81106.html"><font color=#1a8bc8>校验</font></a>等。</p>
<h2>什么是拦截器</h2>
<p>拦截器，在AOP（Aspect-Oriented Programming）中用于在某个方法或字段被访问之前，进行拦截然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。</p>
<p>在Webwork的中文文档的解释为——拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码，也可以在一个action执行前阻止其执行。同时也是提供了一种可以提取action中可重用的部分的方式。</p>
<p>谈到拦截器，还有一个词大家应该知道——拦截器链（Interceptor Chain，在Struts 2中称为拦截器栈Interceptor Stack）。拦截器链就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时，拦截器链中的拦截器就会按其之前定义的顺序被调用。</p>
<h2>实现原理</h2>
<p>Struts 2的拦截器实现相对简单。当请求到达Struts 2的ServletDispatcher时，Struts 2会查找配置文件，并根据其配置实例化相对的拦截器对象，然后串成一个列表（list），最后一个一个地调用列表中的拦截器，如图1所示。</p>
<p><img alt=图１　拦截器调用序列图 src="http://www.blogjava.net/images/blogjava_net/max/18114/r_pic1.jpg"> <br><span style="FONT-SIZE: smaller; FONT-STYLE: italic"><font size=1>图１　拦截器调用序列图</font></span> </p>
<h2>已有的拦截器</h2>
<p>Struts 2已经为您提供丰富多样的，功能齐全的拦截器实现。大家可以到struts2-all-2.0.1.jar或struts2-core-2.0.1.jar包的struts-default.xml查看关于默认的拦截器与拦截器链的配置。</p>
<table style="BORDER-RIGHT: #f0c000 1px solid; BORDER-TOP: #f0c000 1px solid; MARGIN-TOP: 8px; MARGIN-BOTTOM: 8px; BORDER-LEFT: #f0c000 1px solid; BORDER-BOTTOM: #f0c000 1px solid; BACKGROUND-COLOR: #ffffce; TEXT-ALIGN: left" cellSpacing=0 cellPadding=0 border=0>
    <tbody>
        <tr>
            <td style="PADDING-RIGHT: 4px; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; PADDING-TOP: 4px"><img src="http://cwiki.apache.org/confluence/images/icons/emoticons/lightbulb_on.gif"> </td>
            <td style="PADDING-RIGHT: 4px; PADDING-LEFT: 4px; PADDING-BOTTOM: 4px; PADDING-TOP: 4px; FONT-FAMILY: 黑体, 宋体, Tahoma, Arial">在本文使用是Struts 2的最新发布版本2.0.1。需要下载的朋友请点击以下链接：<br><a href="http://apache.justdn.org/struts/binaries/struts-2.0.1-all.zip"><font color=#1a8bc8>http://apache.justdn.org/struts/binaries/struts-2.0.1-all.zip</font></a></td>
        </tr>
    </tbody>
</table>
<p>以下部分就是从struts-default.xml文件摘取的内容：</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"><span style="COLOR: #0000ff">&lt;</span> <span style="COLOR: #800000">interceptor </span><span style="COLOR: #ff0000">name</span> <span style="COLOR: #0000ff">="alias"</span> <span style="COLOR: #ff0000">class</span> <span style="COLOR: #0000ff">="com.opensymphony.xwork2.interceptor.AliasInterceptor"</span> <span style="COLOR: #0000ff">/&gt;</span> <span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">&lt;</span> <span style="COLOR: #800000">interceptor </span><span style="COLOR: #ff0000">name</span> <span style="COLOR: #0000ff">="autowiring"</span> <span style="COLOR: #ff0000">class</span> <span style="COLOR: #0000ff">="com.opensymphony.xwork2.spring.interceptor.ActionAutowiringInterceptor"</span> <span style="COLOR: #0000ff">/&gt;</span> <span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">&lt;</span> <span style="COLOR: #800000">interceptor </span><span style="COLOR: #ff0000">name</span> <span style="COLOR: #0000ff">="chain"</span> <span style="COLOR: #ff0000">class</span> <span style="COLOR: #0000ff">="com.opensymphony.xwork2.interceptor.ChainingInterceptor"</span> <span style="COLOR: #0000ff">/&gt;</span> <span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">&lt;</span> <span style="COLOR: #800000">interceptor </span><span style="COLOR: #ff0000">name</span> <span style="COLOR: #0000ff">="conversionError"</span> <span style="COLOR: #ff0000">class</span> <span style="COLOR: #0000ff">="org.apache.struts2.interceptor.StrutsConversionErrorInterceptor"</span> <span style="COLOR: #0000ff">/&gt;</span> <span style="COLOR: #000000"><br></span><span style="COLOR: #0000ff">&lt;</span> <span style="COLOR: #800000">interceptor </span><span style="COLOR: #ff0000">name</span> <span style="COLOR: #0000ff">="createSession"</span> <span style="COLOR: #ff0000">class</span> <span style="COLOR: #0000ff">="org.apache.struts2.interceptor.CreateSessionInterceptor"</span> <span style="COLOR: #ff0000"></span><span style="COLOR: #0000ff"></span></div>
<img src ="http://www.blogjava.net/i369/aggbug/111907.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/i369/" target="_blank">芦苇</a> 2007-04-19 13:17 <a href="http://www.blogjava.net/i369/articles/111907.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>