﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-&lt;h3 style="font-family: Comic Sans MS"&gt;&lt;font color="#FA1A0A" size="10"&gt;︻┳═一Java&lt;/font&gt;&lt;/h3&gt;-随笔分类-Struts</title><link>http://www.blogjava.net/rain1102/category/37659.html</link><description>&lt;br/&gt;&lt;font color="green" style="font-family: 华文行楷;font-size:16px;"&gt;子曰：危邦不入，乱邦不居。天下有道则见，无道则隐。&lt;/font&gt;&lt;font color="#3C1435"&gt;&lt;/font&gt;</description><language>zh-cn</language><lastBuildDate>Sat, 21 Feb 2009 21:41:26 GMT</lastBuildDate><pubDate>Sat, 21 Feb 2009 21:41:26 GMT</pubDate><ttl>60</ttl><item><title>Commons-Validator</title><link>http://www.blogjava.net/rain1102/archive/2008/05/07/198893.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Wed, 07 May 2008 02:50:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2008/05/07/198893.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/198893.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2008/05/07/198893.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/198893.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/198893.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Commons-Validator（一）&nbsp;&nbsp;&nbsp;&nbsp;Commons-Validator包用来把验证规则程序提取出来，以供重复使用。这个包可以使用在Struts中，也可以独立的应用在任何其它的应用中。用户可以通过Java类的方式自定义验证方法，也可以在配置文件中通过正则表达式配置验证方法。它不但支持服务器端的验证，客户端的验证也支持，具体需要使用tag把相...&nbsp;&nbsp;<a href='http://www.blogjava.net/rain1102/archive/2008/05/07/198893.html'>阅读全文</a><img src ="http://www.blogjava.net/rain1102/aggbug/198893.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2008-05-07 10:50 <a href="http://www.blogjava.net/rain1102/archive/2008/05/07/198893.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts秘籍之第1段：第2.1式：用插件(PlugIn)来进行应用初始化</title><link>http://www.blogjava.net/rain1102/archive/2008/03/27/189114.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Thu, 27 Mar 2008 11:56:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2008/03/27/189114.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/189114.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2008/03/27/189114.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/189114.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/189114.html</trackback:ping><description><![CDATA[<h4>问题</h4>
<p>在应用启动时需要装入应用初始化数据到context 中。</p>
<h4>动作要领</h4>
<p>创建一个类，实现org.apache.struts.action.PlugIn接口，并且在struts-config.xml文件中指定plug-in元素。下面的XML 片断展示了一个plug-in 声明以及一个嵌套的set-property元素来设置定制属性：</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: 69.86%; word-break: break-all; padding-top: 4px; border-bottom: windowtext 0.5pt solid; height: 196px">
<div><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">plug-in&nbsp;</span><span style="color: #ff0000">className</span><span style="color: #0000ff">="com.oreilly.strutsckbk.CustomPlugin"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">set-property&nbsp;</span><span style="color: #ff0000">property</span><span style="color: #0000ff">="customData"</span><span style="color: #ff0000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value</span><span style="color: #0000ff">="Hello&nbsp;from&nbsp;the&nbsp;plugin"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">plug-in</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span></div>
</div>
<p>&nbsp;</p>
<h4>动作变化</h4>
<p>Struts提供了一个PlugIn接口，你可以用它来创建在应用启动时初始化的定制服务。PlugIn接口的Java源代码示于<a href="http://www.blogjava.net/steelhand/admin/059600771x/jakartastrutsckbk-chp-2-sect-1.html#jakartastrutsckbk-chp-2-ex-1">Example 2-1</a>. (为了清晰起见，去除了JavaDoc 文档)</p>
<h5>Example 2-1. Struts PlugIn 接口</h5>
<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: 72.75%; word-break: break-all; padding-top: 4px; border-bottom: windowtext 0.5pt solid; height: 313px">
<div><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">package&nbsp;org.apache.struts.action;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />import&nbsp;javax.servlet.ServletException;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />import&nbsp;org.apache.struts.config.ModuleConfig;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br />
<img id="Codehighlighter1_145_275_Open_Image" onclick="this.style.display='none'; Codehighlighter1_145_275_Open_Text.style.display='none'; Codehighlighter1_145_275_Closed_Image.style.display='inline'; Codehighlighter1_145_275_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_145_275_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_145_275_Closed_Text.style.display='none'; Codehighlighter1_145_275_Open_Image.style.display='inline'; Codehighlighter1_145_275_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;PlugIn&nbsp;</span><span id="Codehighlighter1_145_275_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 alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_145_275_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;destroy(&nbsp;);<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;init(ActionServlet&nbsp;servlet,&nbsp;ModuleConfig&nbsp;config)<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throws&nbsp;ServletException;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span></div>
</div>
<p>&nbsp;</p>
<p>为了实现一个plug-in，只需要实现这个接口并且在struts-config.xml文件中声明这个plug-in 实现。有两个方法必须被实现：即init()和destroy( ), 它们在插件的生命周期中被调用。Struts 在启动ActionServlet时实例化plug-in 之后调用init( )。Struts则在ActionServlet被销毁时调用destroy()方法，通常是在一个用服务器停止时。首先，这个 plug-in 特征似乎是很单纯和有限的。然而，通过使用Struts的另外一个特征，即set-property元素，你可以将特殊的信息传递到plug-in中。这种能力增强了这些类的灵活性。</p>
<table cellspacing="0" cellpadding="0">
    <tbody>
        <tr>
            <td valign="top" width="566">
            <p><font color="#ff0000"><em>set-property</em><em>元素被几乎所有定义Struts</em><em>实体的元素所支持，比如</em><em>form-bean</em><em>, </em><em>action-mapping</em><em>, </em><em>action</em><em>, </em><em>以及</em><em>plug-in</em><em>。set-property</em><em>元素有两个属性：</em><em>name</em><em>和</em><em>value</em><em>。</em><em>Struts</em><em>调用</em><em>name</em><em>属性的值指定的property</em><em>的setter</em><em>方法，将</em><em>property</em><em>设置为</em><em>value</em><em>属性的字符串值。</em></font></p>
            </td>
        </tr>
    </tbody>
</table>
<p>对给定plug-in的所有set-property元素都将在调用plug-in的init( )方法之前进行处理。这允许plug-in 在init( )方法中使用属性的值。</p>
<table cellspacing="0" cellpadding="0">
    <tbody>
        <tr>
            <td valign="top" width="566">
            <p><font color="#ff0000"><em>如果对一个plug-in</em><em>使用多个</em><em>set-property</em><em>元素，</em><em> Struts</em><em>不能保证它们被调用的顺序。每个setter</em><em>方法都应该独立于其他任何方法。</em></font></p>
            </td>
        </tr>
    </tbody>
</table>
<p>&nbsp;</p>
<p>Struts 将对ActionServlet和plug-in的ModuleConfig的引用作为引数传递给init( )方法。ActionServlet允许访问ServletContext来进行应用范围的对象存储。ActionServlet还可以允许你访问更多高级的容器管理的J2EE 组件，比如数据源和消息队列。ModuleConfig允许你访问定义plug-in 的模块的Struts配置。</p>
<table cellspacing="0" cellpadding="0">
    <tbody>
        <tr>
            <td valign="top" width="566">
            <p><em>每个Struts </em><em>应用至少有一个模块：默认模块。如果你不熟悉模块，我们将在第2.5</em><em>式中讲解之。</em></p>
            </td>
        </tr>
    </tbody>
</table>
<p>为了更具体一些，请考虑一个简单的，但仍然相关的例子。你需要定义一个plug-in，它可以使你决定应用何时启动，以及它启动和运行了多长时间。你可以使用下面所示的类跟踪和报告你的应用的运行时间。</p>
<h5>Example 2-2. Application uptime tracker 对象</h5>
<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: 66.73%; word-break: break-all; padding-top: 4px; border-bottom: windowtext 0.5pt solid; height: 512px">
<div><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">package&nbsp;com.oreilly.strutsckbk;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />import&nbsp;java.util.Date;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br />
<img id="Codehighlighter1_82_414_Open_Image" onclick="this.style.display='none'; Codehighlighter1_82_414_Open_Text.style.display='none'; Codehighlighter1_82_414_Closed_Image.style.display='inline'; Codehighlighter1_82_414_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_82_414_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_82_414_Closed_Text.style.display='none'; Codehighlighter1_82_414_Open_Image.style.display='inline'; Codehighlighter1_82_414_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;TimeTracker&nbsp;</span><span id="Codehighlighter1_82_414_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 alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_82_414_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;startUpTimeMillis;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Date&nbsp;startedOn;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img id="Codehighlighter1_170_259_Open_Image" onclick="this.style.display='none'; Codehighlighter1_170_259_Open_Text.style.display='none'; Codehighlighter1_170_259_Closed_Image.style.display='inline'; Codehighlighter1_170_259_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_170_259_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_170_259_Closed_Text.style.display='none'; Codehighlighter1_170_259_Open_Image.style.display='inline'; Codehighlighter1_170_259_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;TimeTracker(&nbsp;)&nbsp;</span><span id="Codehighlighter1_170_259_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 alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_170_259_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;startUpTimeMillis&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;System.currentTimeMillis(&nbsp;);<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;startedOn&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Date(&nbsp;);<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img id="Codehighlighter1_289_353_Open_Image" onclick="this.style.display='none'; Codehighlighter1_289_353_Open_Text.style.display='none'; Codehighlighter1_289_353_Closed_Image.style.display='inline'; Codehighlighter1_289_353_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_289_353_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_289_353_Closed_Text.style.display='none'; Codehighlighter1_289_353_Open_Image.style.display='inline'; Codehighlighter1_289_353_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;getUptime(&nbsp;)&nbsp;</span><span id="Codehighlighter1_289_353_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 alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_289_353_Open_Text"><span style="color: #000000">{<br />
<img alt="" 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">&nbsp;System.currentTimeMillis(&nbsp;)&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;startUpTimeMillis;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img id="Codehighlighter1_386_412_Open_Image" onclick="this.style.display='none'; Codehighlighter1_386_412_Open_Text.style.display='none'; Codehighlighter1_386_412_Closed_Image.style.display='inline'; Codehighlighter1_386_412_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_386_412_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_386_412_Closed_Text.style.display='none'; Codehighlighter1_386_412_Open_Image.style.display='inline'; Codehighlighter1_386_412_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;Date&nbsp;getStartedOn(&nbsp;)&nbsp;</span><span id="Codehighlighter1_386_412_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 alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_386_412_Open_Text"><span style="color: #000000">{<br />
<img alt="" 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">&nbsp;startedOn;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span></div>
</div>
<p>&nbsp;</p>
<p>创建一个PlugIn接口的实现，比如<a href="http://www.blogjava.net/steelhand/admin/059600771x/jakartastrutsckbk-chp-2-sect-1.html#jakartastrutsckbk-chp-2-ex-3">Example 2-3</a>所示，它实例化了TimeTracker。plug-in 通过plug-in 属性的值将TimeTracker实例保存在ServletContext中。你可以使用这个值来从Servlet上下文中获取TimeTracker实例。虽然这个值是硬编码的，使用属性也提供了更大的灵活性。</p>
<h5>Example 2-3. Time tracker plugin</h5>
<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: 69.58%; word-break: break-all; padding-top: 4px; border-bottom: windowtext 0.5pt solid; height: 553px">
<div><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">package&nbsp;com.oreilly.strutsckbk;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />import&nbsp;javax.servlet.ServletException;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />import&nbsp;org.apache.struts.action.ActionServlet;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />import&nbsp;org.apache.struts.action.PlugIn;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />import&nbsp;org.apache.struts.config.ModuleConfig;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br />
<img id="Codehighlighter1_256_594_Open_Image" onclick="this.style.display='none'; Codehighlighter1_256_594_Open_Text.style.display='none'; Codehighlighter1_256_594_Closed_Image.style.display='inline'; Codehighlighter1_256_594_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_256_594_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_256_594_Closed_Text.style.display='none'; Codehighlighter1_256_594_Open_Image.style.display='inline'; Codehighlighter1_256_594_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;TimeTrackerPlugin&nbsp;implements&nbsp;PlugIn&nbsp;</span><span id="Codehighlighter1_256_594_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 alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_256_594_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;contextKey;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_335_370_Open_Image" onclick="this.style.display='none'; Codehighlighter1_335_370_Open_Text.style.display='none'; Codehighlighter1_335_370_Closed_Image.style.display='inline'; Codehighlighter1_335_370_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_335_370_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_335_370_Closed_Text.style.display='none'; Codehighlighter1_335_370_Open_Image.style.display='inline'; Codehighlighter1_335_370_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setContextKey(String&nbsp;key)&nbsp;</span><span id="Codehighlighter1_335_370_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 alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_335_370_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.contextKey&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;key;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;init(ActionServlet&nbsp;servlet,&nbsp;ModuleConfig&nbsp;conf)<br />
<img id="Codehighlighter1_471_557_Open_Image" onclick="this.style.display='none'; Codehighlighter1_471_557_Open_Text.style.display='none'; Codehighlighter1_471_557_Closed_Image.style.display='inline'; Codehighlighter1_471_557_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_471_557_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_471_557_Closed_Text.style.display='none'; Codehighlighter1_471_557_Open_Image.style.display='inline'; Codehighlighter1_471_557_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throws&nbsp;ServletException&nbsp;</span><span id="Codehighlighter1_471_557_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 alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_471_557_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;servlet.getServletContext(&nbsp;).setAttribute(contextKey,&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;TimeTracker(&nbsp;));<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /><br />
<img id="Codehighlighter1_586_592_Open_Image" onclick="this.style.display='none'; Codehighlighter1_586_592_Open_Text.style.display='none'; Codehighlighter1_586_592_Closed_Image.style.display='inline'; Codehighlighter1_586_592_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_586_592_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_586_592_Closed_Text.style.display='none'; Codehighlighter1_586_592_Open_Image.style.display='inline'; Codehighlighter1_586_592_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;destroy(&nbsp;)&nbsp;</span><span id="Codehighlighter1_586_592_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 alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_586_592_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span></div>
</div>
<p>&nbsp;</p>
<p>现在你已经有了为plug-in 创建的类，你可以通过在struts-config.xml中加入plug-in元素来将其集成到Struts 应用中。</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: 65.03%; word-break: break-all; padding-top: 4px; border-bottom: windowtext 0.5pt solid; height: 149px">
<div><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">plug-in&nbsp;</span><span style="color: #ff0000">className</span><span style="color: #0000ff">="com.oreilly.strutsckbk.TimeTrackerPlugin"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">set-property&nbsp;</span><span style="color: #ff0000">property</span><span style="color: #0000ff">="contextKey"</span><span style="color: #ff0000">&nbsp;value</span><span style="color: #0000ff">="timeTracker"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">plug-in</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span></div>
</div>
<p>&nbsp;</p>
<p>plug-in 在servlet 上下文中存储了time tracker对象。可以访问TimeTracker来显示关于应用启动运行时间的信息，下面是相关的JSP 片断：</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: 69.13%; word-break: break-all; padding-top: 4px; border-bottom: windowtext 0.5pt solid; height: 241px">
<div><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">h4</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">Continuously&nbsp;running&nbsp;since&nbsp;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">bean:write&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="timeTracker"</span><span style="color: #ff0000">&nbsp;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;property</span><span style="color: #0000ff">="startedOn"</span><span style="color: #ff0000">&nbsp;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;format</span><span style="color: #0000ff">="MM/dd/yyyy&nbsp;HH:mm"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;for<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">bean:write&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="timeTracker"</span><span style="color: #ff0000">&nbsp;<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;property</span><span style="color: #0000ff">="uptime"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;milliseconds!<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">h4</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span></div>
</div>
<p>&nbsp;</p>
<p>你可以使用一个servlet 来载入像Struts plug-in之类的初始化数据。具有load-on-startup初始化参数的servlet，应将其设置为较低的数值，比如1, 一保证它们在应用启动时载入。容器在实例化Servlet之后将调用servlet的init( )方法。但是Struts plug-in 方式由多个优点。首先，大多数Struts 应用在其初始化设置后不需要修改web.xml文件。必须在web.xml中声明额外的Servlet意味着要维护额外的文件。其次，如果需要PlugIn接口提供对特定Struts信息的访问。最后，因为plug-in 的生命周期紧随ActionServlet的生命周期，所以可以保证在你的Struts应用所需时数据有效。</p>
<h4>相关招式</h4>
<p>第2.8式展示了set-property元素的另一种用法。Struts 文档中关于plug-in 的信息可以访问<a href="http://jakarta.apache.org/struts/userGuide/building_controller.html#plugin_classes">http://jakarta.apache.org/struts/userGuide/building_controller.html#plugin_classes</a>.</p>
<p>你也可以使用一个Servlet 上下文listener 来载入初始化数据。</p><img src ="http://www.blogjava.net/rain1102/aggbug/189114.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2008-03-27 19:56 <a href="http://www.blogjava.net/rain1102/archive/2008/03/27/189114.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts2的struts.properties配置文件详解</title><link>http://www.blogjava.net/rain1102/archive/2008/02/28/182773.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Thu, 28 Feb 2008 11:44:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2008/02/28/182773.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/182773.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2008/02/28/182773.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/182773.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/182773.html</trackback:ping><description><![CDATA[<p>struts2的struts.properties配置文件详解<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的后缀，例如login.do的'do'字。<br />
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接口名<br />
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自动加载的一个配置文件列表<br />
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)<br />
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名称<br />
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后缀）<br />
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>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开发模式<br />
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）<br />
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; 允许动态方法调用<br />
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接口名<br />
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; 国际化信息内码<br />
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; 是否国际化信息自动加载 <br />
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; 默认的国际化地区信息<br />
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接口<br />
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请求信息的最大尺寸（文件上传用） <br />
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) <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 专为multipart请求信息使用的org.apache.struts2.dispatcher.multipart.MultiPartRequest解析器接口（文件上传用）</p>
<p>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; 设置存储上传文件的目录夹<br />
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）<br />
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<br />
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 <br />
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接口<br />
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 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 是否struts过滤器中提供的静态内容应该被浏览器缓存在头部属性中<br />
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过滤器应该提供静态内容<br />
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<br />
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的目录夹 <br />
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主题<br />
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端口<br />
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端口<br />
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>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配置文件路径<br />
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>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接口名<br />
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模版应该被缓存&nbsp; <br />
本文转自福州IT信息网(http://www.fzic.net),详细出处参考：http://www.fzic.net/SrcShow.asp?Src_ID=990</p>
<p>&nbsp;</p><img src ="http://www.blogjava.net/rain1102/aggbug/182773.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2008-02-28 19:44 <a href="http://www.blogjava.net/rain1102/archive/2008/02/28/182773.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2中对于radio list的预选（pre select）,即：使一个值被默认选中 </title><link>http://www.blogjava.net/rain1102/archive/2008/02/28/182759.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Thu, 28 Feb 2008 09:23:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2008/02/28/182759.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/182759.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2008/02/28/182759.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/182759.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/182759.html</trackback:ping><description><![CDATA[<div class="postbody">
<p>在Struts2中，radio标签可以使用一个list来输出一组radio按钮，<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;s:radio name="sex"　list="#{'male','female'}"　label="%{getText('app.label.sex')}" /&gt; <br />
但是如何设置其中一个被默认选中。</p>
<p>查阅了struts2的文档，发现radio标签有一个value属性是用于对radio的进行预选的：　http://struts.apache.org/2.x/docs/radio.html<br />
value： Preset the value of input element.<br />
于是，进行了试验，&lt;s:radio name="sex"　list="#{'male','female'}"　label="%{getText('app.label.sex')}" value="male" /&gt; <br />
结果失败了。male的值并没有被选中，经过反复研究，终于得到了正确的结果：<br />
&lt;s:radio name="sex"　list="#{'male','female'}"　label="%{getText('app.label.sex')}" value="<span style="color: red"><span style="color: red">'male'</span></span>" /&gt; <br />
看到其中的区别了吗，就是多了两个单引号。<br />
我认为这是因为value属性的特性引起的。如果male没有加引号，那么struts2会去值的堆栈中寻找变量名为male的值，结果找不到。<br />
加上单引号后，struts2（应该是ognl）把'male'认为是一个简单的字符串。</p>
<p>这样，radio就能够正确地匹配到值，使指定的值默认被选中</p>
</div><img src ="http://www.blogjava.net/rain1102/aggbug/182759.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2008-02-28 17:23 <a href="http://www.blogjava.net/rain1102/archive/2008/02/28/182759.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在使用struts2的datetimepicker标签时候遇到JS错误:dojo未定义错误</title><link>http://www.blogjava.net/rain1102/archive/2008/02/25/181907.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Mon, 25 Feb 2008 02:18:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2008/02/25/181907.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/181907.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2008/02/25/181907.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/181907.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/181907.html</trackback:ping><description><![CDATA[在一个action跳转页面时: <br />
&lt;%@ page contentType="text/html;charset=UTF-8"%&gt; <br />
&lt;%@ include file="../../commons/taglibs.jsp"%&gt; <br />
&lt;s:datetimepicker label="releaseTime" name="releaseTime"/&gt; <br />
<br />
时间控件没有显示出来,而报JS错误:<span class="hilite2">dojo</span><span class="hilite3">未定义</span>错误 <br />
<br />
解决办法：<br />
在页面的&lt;head&gt;标签中加入&lt;s:head /&gt;　就可以了 <br />
。。。 <br />
&lt;head&gt; <br />
&lt;title&gt;Struts 2 Cool Tags - Others&lt;/title&gt; <br />
.....<br />
<span style="color: #ff0000">&lt;s:head /&gt;</span>&nbsp; <br />
&lt;/head&gt; <br />
。。。<img src ="http://www.blogjava.net/rain1102/aggbug/181907.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2008-02-25 10:18 <a href="http://www.blogjava.net/rain1102/archive/2008/02/25/181907.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在Struts 2中使用JSON Ajax支持</title><link>http://www.blogjava.net/rain1102/archive/2008/02/20/180907.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Wed, 20 Feb 2008 09:02:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2008/02/20/180907.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/180907.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2008/02/20/180907.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/180907.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/180907.html</trackback:ping><description><![CDATA[JSON插件提供了一种名为json的ResultType，一旦为某个Action指定了一个类型为json的Result，则该Result无需映射到任何视图资源。因为JSON插件会负责将Action里的状态信息序列化成JSON格式的数据，并将该数据返回给客户端页面的JavaScript。
<p>　　简单地说，JSON插件允许我们在JavaScript中异步调用Action，而且Action不再需要使用视图资源来显示该Action里的状态信息，而是由JSON插件负责将Action里的状态信息返回给调用页面——通过这种方式，就可以完成Ajax交互。</p>
<p>　　Struts2提供了一种可插拔方式来管理插件，安装Struts2的JSON插件与安装普通插件并没有太大的区别，一样只需要将Struts2插件的JAR文件复制到Web应用的WEB-INF/lib路径下即可。</p>
<p>　　安装JSON插件按如下步骤进行：</p>
<p>　　(1)登陆http://code.google.com/p/jsonplugin/downloads/list站点，下载Struts2的JSON插件的最新版本，当前最新版本是0.7，我们可以下载该版本的JSON插件。</p>
<p>　　(2)将下载到的jsonplugin-0.7.jar文件复制到Web应用的WEB-INF路径下，即可完成JSON插件的安装。</p>
<p>　　<strong>实现Actio逻辑</strong></p>
<p>　　假设wo,en输入页面中包含了三个表单域，这三个表单域对于三个请求参数，因此应该使用Action来封装这三个请求参数。三个表单域的name分别为field1、field2和field3。</p>
<p>　　处理该请求的Action类代码如下：　　
<table style="border-right: #cccccc 1px dotted; table-layout: fixed; border-top: #cccccc 1px dotted; border-left: #cccccc 1px dotted; border-bottom: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0">
    <tbody>
        <tr>
            <td style="word-wrap: break-word" bgcolor="#f3f3f3">public&nbsp;class&nbsp;JSONExample <br />
            　　{ <br />
            　　//封装请求参数的三个属性 <br />
            　　private&nbsp;String&nbsp;field1; <br />
            　　private&nbsp;transient&nbsp;String&nbsp;field2; <br />
            　　private&nbsp;String&nbsp;field3; <br />
            　　//封装处理结果的属性 <br />
            　　private&nbsp;int[]&nbsp;ints&nbsp;=&nbsp;{10,&nbsp;20}; <br />
            　　private&nbsp;Map&nbsp;map&nbsp;=&nbsp;new&nbsp;HashMap(); <br />
            　　private&nbsp;String&nbsp;customName&nbsp;=&nbsp;"custom"; <br />
            　　//三个请求参数对应的setter和getter方法 <br />
            　　public&nbsp;String&nbsp;getField1() <br />
            　　{ <br />
            　　return&nbsp;field1; <br />
            　　} <br />
            　　public&nbsp;void&nbsp;setField1(String&nbsp;field1) <br />
            　　{ <br />
            　　this.field1&nbsp;=&nbsp;field1; <br />
            　　} <br />
            　　//此处省略了field1和field2两个字段的setter和getter方法 <br />
            　　... <br />
            　　//封装处理结果的属性的setter和getter方法 <br />
            　　public&nbsp;int[]&nbsp;getInts() <br />
            　　{ <br />
            　　return&nbsp;ints; <br />
            　　} <br />
            　　public&nbsp;void&nbsp;setInts(int[]&nbsp;ints) <br />
            　　{ <br />
            　　this.ints&nbsp;=&nbsp;ints; <br />
            　　} <br />
            　　public&nbsp;Map&nbsp;getMap() <br />
            　　{ <br />
            　　return&nbsp;map; <br />
            　　} <br />
            　　public&nbsp;void&nbsp;setMap(Map&nbsp;map) <br />
            　　{ <br />
            　　this.map&nbsp;=&nbsp;map; <br />
            　　} <br />
            　　//使用注释语法来改变该属性序列化后的属性名 <br />
            　　@JSON(name="newName") <br />
            　　public&nbsp;String&nbsp;getCustomName() <br />
            　　{ <br />
            　　return&nbsp;this.customName; <br />
            　　} <br />
            　　public&nbsp;String&nbsp;execute() <br />
            　　{ <br />
            　　map.put("name",&nbsp;"yeeku"); <br />
            　　return&nbsp;Action.SUCCESS; <br />
            　　} <br />
            　　}</td>
        </tr>
    </tbody>
</table>
　　在上面代码中，使用了JSON注释，注释时指定了name域，name域指定Action属性被序列化成JSON对象的属性名。除此之外，JSON注释还支持如下几个域：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; serialize：设置是否序列化该属性</p>
<p>　　deserialize：设置是否反序列化该属性。</p>
<p>　　format：设置用于格式化输出、解析日期表单域的格式。例如"yyyy-MM-dd'T'HH:mm:ss"。</p>
<p>　　配置该Action与配置普通Action存在小小的区别，应该为该Action配置类型为json的Result。而这个Result无需配置任何视图资源。</p>
<p>　　配置该Action的struts.xml文件代码如下：　
<table style="border-right: #cccccc 1px dotted; table-layout: fixed; border-top: #cccccc 1px dotted; border-left: #cccccc 1px dotted; border-bottom: #cccccc 1px dotted" cellspacing="0" cellpadding="6" width="95%" align="center" border="0">
    <tbody>
        <tr>
            <td style="word-wrap: break-word" bgcolor="#f3f3f3">＜?xml&nbsp;version="1.0"&nbsp;encoding="GBK"?＞ <br />
            ＜!DOCTYPE&nbsp;struts&nbsp;PUBLIC <br />
            "-//Apache&nbsp;Software&nbsp;Foundation//DTD&nbsp;Struts&nbsp;Configuration&nbsp;2.0//EN" <br />
            "http://struts.apache.org/dtds/struts-2.0.dtd"＞ <br />
            ＜struts＞ <br />
            ＜constant&nbsp;name="struts.i18n.encoding"&nbsp;value="UTF-8"/＞ <br />
            ＜package&nbsp;name="example"&nbsp;extends="json-default"＞ <br />
            ＜action&nbsp;name="JSONExample"&nbsp;class="lee.JSONExample"＞ <br />
            ＜result&nbsp;type="json"/＞ <br />
            ＜/action＞ <br />
            ＜/package＞ <br />
            ＜/struts＞　　</td>
        </tr>
    </tbody>
</table>
　　在上面配置文件中有两个值得注意的地方：<br />
<br />
　　第一个地方是配置struts.i18n.encoding常量时，不再是使用GBK编码，而是UTF-8编码，这是因为Ajax的POST请求都是以UTF-8的方式进行编码的。<br />
<br />
　　第二个地方是配置包时，自己的包继承了json-default包，而不再继承默认的default包，这是因为只有在该包下才有json类型的Result。</p><img src ="http://www.blogjava.net/rain1102/aggbug/180907.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2008-02-20 17:02 <a href="http://www.blogjava.net/rain1102/archive/2008/02/20/180907.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MyEclipse 开发 SSH 整合时 java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit 解决方案 </title><link>http://www.blogjava.net/rain1102/archive/2007/12/23/169853.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Sun, 23 Dec 2007 12:47:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2007/12/23/169853.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/169853.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2007/12/23/169853.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/169853.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/169853.html</trackback:ping><description><![CDATA[ERROR [org.hibernate.proxy.BasicLazyInitializer] - CGLIB Enhancement failed: dao.User<br />
<a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit(IILjava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V<br />
&nbsp;at net.sf.cglib.core.ClassEmitter.begin_class(ClassEmitter.java:77) <br />
<span style="font-size: 10pt; color: #4b4b4b; line-height: 150%">Spring </span><span style="font-size: 10pt; color: #4b4b4b; line-height: 150%">和</span><span style="font-size: 10pt; color: #4b4b4b; line-height: 150%"> Hibernate </span><span style="font-size: 10pt; color: #4b4b4b; line-height: 150%">共用的一些</span><span style="font-size: 10pt; color: #4b4b4b; line-height: 150%"> jar </span><span style="font-size: 10pt; color: #4b4b4b; line-height: 150%">文件发生了版本冲突</span><span style="font-size: 10pt; color: #4b4b4b; line-height: 150%">, </span><span style="font-size: 10pt; color: #4b4b4b; line-height: 150%">删除</span><span style="font-size: 10pt; color: #4b4b4b; line-height: 150%"> WEB-INF/lib/asm-2.2.3.jar </span><span style="font-size: 10pt; color: #4b4b4b; line-height: 150%">然后重启</span><span style="font-size: 10pt; color: #4b4b4b; line-height: 150%"> Tomcat.</span><br />
<span style="font-size: 10pt; color: #4b4b4b; line-height: 150%">asm-2.2.3.jar<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; asm.jar<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; asm-attrs.jar<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; asm-commons-2.2.3.jar<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; asm-util-2.2.3.jar</span><img src ="http://www.blogjava.net/rain1102/aggbug/169853.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2007-12-23 20:47 <a href="http://www.blogjava.net/rain1102/archive/2007/12/23/169853.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts 2 Tags</title><link>http://www.blogjava.net/rain1102/archive/2007/07/11/129667.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Wed, 11 Jul 2007 10:20:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2007/07/11/129667.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/129667.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2007/07/11/129667.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/129667.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/129667.html</trackback:ping><description><![CDATA[<p><font color=#000080>In this section we will introduce you with the tags provided along with <strong>Struts 2</strong> framework. It is necessary to understand all the tags provided along with Struts 2 framework. In this page we will have listed all the <strong>Struts 2 Tags</strong> and in subsequent sections we will provide you the examples of the these tags in detail.</font> </p>
<p><strong><font color=#000080>The Struts 2 Tags can be divided into two types:</font></strong> </p>
<ul>
    <li><font color=#000080><strong>Struts Generic Tags</strong><br>The struts generic tags are used to control the execution flow when pages are rendered. Another use of struts generic tags are data extraction.<br>Further Generic Tags are classified into <strong>Control Tags</strong> and <strong>Data Tags</strong>.&nbsp;<br><strong>Control Tags:</strong> The Control Tags are used for flow control, such if, else and iterate.<br>Here are the list of Control Tags:<br>* if<br>* elseIf<br>* else<br>* append<br>* generator<br>* iterator<br>* merge<br>* sort<br>* subset<br><strong>Data Tags:</strong> The Data Tags are used for data manipulation or creation, such as bean, push, and i18n.<br>Here are the list of Data Tags:<br>* a<br>* action<br>* bean<br>* date<br>* debug<br>* i18n<br>* include<br>* param<br>* push<br>* set<br>* text<br>* url<br>* property<br>&nbsp;&nbsp;&nbsp;</font>
    <li><font color=#000080><strong>Struts UI tags</strong><br>Struts UI Tags are mainly designed to use the data from your action/value stack or from Data Tags. These tags are used to display the data on the HTML page. The UI tags are driven by templates and themes.&nbsp;<br>Struts UI Tags are of two types Form Tags and Non - Form tags.<br><strong>Form Tags are as follows:</strong><br>* autocompleter<br>* checkbox<br>* checkboxlist<br>* combobox<br>* datetimepicker<br>* doubleselect<br>* head<br>* file<br>* form<br>* hidden<br>* label<br>* optiontransferselect<br>* optgroup<br>* password<br>* radio<br>* reset<br>* select<br>* submit<br>* textarea<br>* textfield<br>* token<br>* updownselect<br><br><strong>Non-Form UI Tags are:</strong><br>* actionerror<br>* actionmessage<br>* component<br>* div<br>* fielderror<br>* table<br>* tabbedPanel<br>* tree<br>* treenode<br></font></li>
</ul>
<p><font color=#000080>The main difference between <strong>Struts Generic Tags</strong> and <strong>Struts UI Tags</strong> are:</font></p>
<ul>
    <li><font color=#000080>The generic tags simply output some content directly from the tag while the UI tags uses templates and often group the output together with theme</font> </li>
</ul><img src ="http://www.blogjava.net/rain1102/aggbug/129667.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2007-07-11 18:20 <a href="http://www.blogjava.net/rain1102/archive/2007/07/11/129667.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts2新特性预览 </title><link>http://www.blogjava.net/rain1102/archive/2007/07/11/129666.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Wed, 11 Jul 2007 10:16:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2007/07/11/129666.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/129666.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2007/07/11/129666.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/129666.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/129666.html</trackback:ping><description><![CDATA[<p><strong>Struts2与Struts1的对比</strong></p>
<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><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 Stacks）为每一个Action创建不同的生命周期。堆栈能够根据需要和不同的Action一起使用。</p>
<br><img src ="http://www.blogjava.net/rain1102/aggbug/129666.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2007-07-11 18:16 <a href="http://www.blogjava.net/rain1102/archive/2007/07/11/129666.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts2.0请求过程</title><link>http://www.blogjava.net/rain1102/archive/2007/07/10/129241.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Tue, 10 Jul 2007 02:07:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2007/07/10/129241.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/129241.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2007/07/10/129241.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/129241.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/129241.html</trackback:ping><description><![CDATA[<p>整个请求过程可以分为六步骤:</p>
<ol>
    <li><strong><em>一个请求产生并经由框架处理</em></strong> - 框架根据请求匹配相应的配置，如使用哪些拦截器，action 类和结果。
    <li><strong><em>请求通过一系列的拦截器</em></strong> - 拦截器，和拦截器组经配置后，能处理不同等级的请求，它们为请求提供了各种预处理，切面处理。这和Struts的使用 Jakarta Commons Chain 构件的 RequestProcessor类很相似。
    <li><strong><em>调用 Action</em></strong> - 产生一个新的action对象实例，并提供请求所调用的处理逻辑的方法。Struts2 可以在配置action时为请求分配其指定的方法。我们在第二部文章中将对这步骤进行进一步讨论;
    <li><strong><em>调用产生的结果</em></strong> - 获取通过action的方法处理后返回来的结果，匹配其result class并调用产生的实例。有种情况是在UI模板去生成HTML时才去处理这些结果。如果在这种情况下，在Struts2 模板中的tags能直接返回到 action 中，取结果来呈现界面。　
    <li><strong><em>请求再次经过一系列的拦截器处理后返回</em></strong> - 请求反顺序通过与原来进入时的拦截器链, 当然，你也可以配置在这个过程中减少或增加拦截器处理．
    <li><strong><em>请求返回到用户</em></strong> - 最后一步是由 control 返回到servlet。通常是生成HTML返回到user, 但你也可以指定返回的HTTP头或HTTP重定向。</li>
</ol>
<p>最明显的就是Struts2是pull-MVC 架构，就是可以直接从Action中获取所需要的数据，而不是像Struts那样必须把 beans 存到page, request,或者session中才能获取。</p><img src ="http://www.blogjava.net/rain1102/aggbug/129241.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2007-07-10 10:07 <a href="http://www.blogjava.net/rain1102/archive/2007/07/10/129241.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts实现资源上传</title><link>http://www.blogjava.net/rain1102/archive/2007/01/30/96690.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Tue, 30 Jan 2007 03:40:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2007/01/30/96690.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/96690.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2007/01/30/96690.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/96690.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/96690.html</trackback:ping><description><![CDATA[<p>&#160;&#160;&#160;&#160; &lt;form-bean name="fileUploadForm" type="org.apache.struts.action.DynaActionForm"&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160; &lt;form-property name="fileName" type="<a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.lang.String"&gt;&lt;/form-property&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160; &lt;form-property name="docfile" type="org.apache.struts.upload.FormFile"/&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160; &lt;form-property name="fileDescription" type="<a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.lang.String"&gt;&lt;/form-property&gt;<br />&#160;&#160;&#160; &lt;/form-bean&gt;<br /><br /></p>
		<hr />
		<p>&lt;form name="form1" method="post" action="&lt;%=request.getContextPath()%&gt;/fileUpload.do?method=upload" enctype="multipart/form-data"&gt;<br />&#160; &lt;table width="43%" border="1" align="center"&gt;<br />&#160;&#160;&#160; &lt;tr&gt; <br />&#160;&#160;&#160;&#160;&#160; &lt;td colspan="2"&gt;&lt;div align="center"&gt;上传周报&lt;/div&gt;&lt;/td&gt;<br />&#160;&#160;&#160; &lt;/tr&gt;<br />&#160;&#160;&#160; &lt;tr&gt;<br />&#160;&#160;&#160;&#160;&#160; &lt;td width="22%"&gt;文件名称&lt;/td&gt;<br />&#160;&#160;&#160;&#160;&#160; &lt;td width="78%"&gt;&lt;input type="text" name="fileName"&gt;&lt;/td&gt;<br />&#160;&#160;&#160; &lt;/tr&gt;<br />&#160;&#160;&#160; &lt;tr&gt; <br />&#160;&#160;&#160;&#160;&#160; &lt;td width="22%"&gt;选择文件&lt;/td&gt;<br />&#160;&#160;&#160;&#160;&#160; &lt;td width="78%"&gt;&lt;input type="file" name="docfile"/&gt;&lt;/td&gt;<br />&#160;&#160;&#160; &lt;/tr&gt;<br />&#160;&#160;&#160; &lt;tr&gt;<br />&#160;&#160;&#160;&#160;&#160; &lt;td width="22%"&gt;文件描述&lt;/td&gt;<br />&#160;&#160;&#160;&#160;&#160; &lt;td&gt;&lt;input type="textarea" name="fileDescription"/&gt;&lt;/td&gt;<br />&#160;&#160;&#160; &lt;/tr&gt;<br />&#160;&#160;&#160; &lt;tr&gt; <br />&#160;&#160;&#160;&#160;&#160; &lt;td colspan="2" align="center"&gt;&lt;input type="submit" name="Submit" value="上传"&gt;&lt;input type="reset" name="Submit2" value="重置"&gt;&lt;/td&gt;<br />&#160;&#160;&#160; &lt;/tr&gt;<br />&#160; &lt;/table&gt;<br /></p>
		<hr />
public ActionForward upload(ActionMapping mapping, ActionForm form,<br />&#160;&#160;&#160;HttpServletRequest request, HttpServletResponse response) throws UnsupportedEncodingException {<br />&#160;&#160;request.setCharacterEncoding("UTF-8");<br />&#160;&#160;DynaActionForm dynaform = (DynaActionForm) form;<br />&#160;&#160;FormFile docfile = (FormFile) dynaform.get("docfile");<br />&#160;&#160;String fileName=dynaform.get("fileName").toString();<br />&#160;&#160;String fileDescription=(String) dynaform.get("fileDescription");<br />&#160;&#160;if (docfile == null) {<br />&#160;&#160;&#160;return mapping.getInputForward();<br />&#160;&#160;}<br />&#160;&#160;if (docfile.getFileSize() == 0) {<br />&#160;&#160;&#160;request.getSession().setAttribute("message", "未选中文件或文件大小为零！");<br />&#160;&#160;&#160;return mapping.getInputForward();<br />&#160;&#160;}<br />&#160;&#160;String ctype = docfile.getContentType();<br />&#160;&#160;if (ctype.indexOf("doc") != -1) {<br />&#160;&#160;&#160;request.getSession().setAttribute("message", "文件类型错误！");<br />&#160;&#160;&#160;return mapping.getInputForward();<br />&#160;&#160;}<br />&#160;&#160;// 写文件<br />&#160;&#160;BufferedInputStream bis = null;<br />&#160;&#160;BufferedOutputStream bos = null;<br />&#160;&#160;InputStream is = null;<br />&#160;&#160;OutputStream fos = null;<p>&#160;&#160;String filename = "";<br />&#160;&#160;String filePath = "";<br />&#160;&#160;try {<br />&#160;&#160;&#160;is = (InputStream) docfile.getInputStream();// 把文件读入<br />&#160;&#160;&#160;bis = new BufferedInputStream(is);</p><p>&#160;&#160;&#160;filePath ="E:/upload/";// 取当前系统路径<br />&#160;&#160;&#160;File rootfile = new File(filePath);<br />&#160;&#160;&#160;if (!rootfile.exists()) {<br />&#160;&#160;&#160;&#160;rootfile.mkdirs();<br />&#160;&#160;&#160;}<br />&#160;&#160;&#160;String name= new String(docfile.getFileName().getBytes("UTF-8"),"gb2312");<br />&#160;&#160;&#160;filename = new Date().getTime()+request.getSession().getId()+fileName+".doc";<br />&#160;&#160;fos = new FileOutputStream(filePath + filename);// 建立一个上传文件的输出流<br />&#160;&#160;&#160;bos = new BufferedOutputStream(fos);<br />&#160;&#160;&#160;int bytesRead = 0;<br />&#160;&#160;&#160;byte[] buffer = new byte[2 * 1024];<br />&#160;&#160;&#160;while ((bytesRead = bis.read(buffer)) != -1) {<br />&#160;&#160;&#160;&#160;bos.write(buffer, 0, bytesRead);// 将文件写入服务器<br />&#160;&#160;&#160;}<br />&#160;&#160;&#160;FileUpload fileUpload=new FileUpload();<br />&#160;&#160;&#160;fileUpload.setFileName(fileName);<br />&#160;&#160;&#160;fileUpload.setFilePath(filePath+filename);<br />&#160;&#160;&#160;fileUpload.setFileDescription(fileDescription);<br />&#160;&#160;&#160;this.getSiteBusiness().getFileLoadService().save(fileUpload);<br />&#160;&#160;&#160;return mapping.findForward("uploadsucess");<br />&#160;&#160;}catch (Exception e) {<br />&#160;&#160;&#160;e.printStackTrace();<br />&#160;&#160;&#160;return mapping.getInputForward();<br />&#160;&#160;} finally {<br />&#160;&#160;&#160;if (bos != null) {<br />&#160;&#160;&#160;&#160;try {<br />&#160;&#160;&#160;&#160;&#160;bos.close();<br />&#160;&#160;&#160;&#160;} catch (IOException e) {<br />&#160;&#160;&#160;&#160;&#160;System.err.print(e);<br />&#160;&#160;&#160;&#160;&#160;return mapping.getInputForward();<br />&#160;&#160;&#160;&#160;}<br />&#160;&#160;&#160;}<br />&#160;&#160;&#160;if (bis != null) {<br />&#160;&#160;&#160;&#160;try {<br />&#160;&#160;&#160;&#160;&#160;bis.close();<br />&#160;&#160;&#160;&#160;} catch (IOException e) {<br />&#160;&#160;&#160;&#160;&#160;System.err.print(e);<br />&#160;&#160;&#160;&#160;&#160;return mapping.getInputForward();<br />&#160;&#160;&#160;&#160;}<br />&#160;&#160;&#160;}<br />&#160;&#160;}</p><p>&#160;}</p><img src ="http://www.blogjava.net/rain1102/aggbug/96690.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2007-01-30 11:40 <a href="http://www.blogjava.net/rain1102/archive/2007/01/30/96690.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts tiles 中不能包含 .do 文件问题的解决</title><link>http://www.blogjava.net/rain1102/archive/2007/01/26/96158.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Fri, 26 Jan 2007 07:04:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2007/01/26/96158.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/96158.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2007/01/26/96158.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/96158.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/96158.html</trackback:ping><description><![CDATA[<table cellspacing="0" cellpadding="3" width="100%" border="0">
				<tbody>
						<tr>
								<td class="littletitle">肖菁<br />软件工程师</td>
						</tr>
				</tbody>
		</table>
		<table cellspacing="0" cellpadding="0" width="100%" align="center" bgcolor="#cccccc" border="0">
				<tbody>
						<tr>
								<td>
										<table cellspacing="1" cellpadding="4" width="770" align="center" bgcolor="#ffffff" border="0">
												<tbody>
														<tr bgcolor="white">
																<td class="normaltextwithblank" valign="top" width="99%" height="1059">
																		<p>
																				<b class="littletitle">［文章摘要］</b>
																				<span class="normaltextwithblank">Struts tiles中提供了基于模版的页面组装框架，然而模版中需要包含.do文件的内容时，我们遇到了麻烦，本文中作者给出了一种简单的方式来解决这个问题。</span>
																		</p>
																		<p>
																				<b class="littletitle">[关键词] </b>Struts Tiles </p>
																		<h1>1&#160; 问题描述 </h1>
																		<p>我们在Web应用中使用Struts Tiles时，如果被组装的内容是.do的内容，比如下面的例子，将会出现错误信息。</p>
																		<p>实际例子：&lt;insert:put attribute=" /companyView.do?action=before_new"&gt;</p>
																		<p>错误信息：ServletException in '/companyView.do?action=before_new': 应答已经提交。 </p>
																		<h1>2&#160; 问题原因分析 </h1>
																		<p>tiles 使用了 JSP 的 jsp:include 技术实现页面组装，只能适用于 jsp 页面，无法用于 .do 这样的情况。 </p>
																		<p>找到出错的地方： </p>
																		<p>TilesUtilImpl.java 的 doInclude(String uri, PageContext pageContext) </p>
																		<h2>2.1&#160; doInclude 方法源代码 </h2>
																		<p>public void doInclude(String uri, PageContext pageContext) </p>
																		<p>throws IOException, ServletException { </p>
																		<p>pageContext.include(uri); </p>
																		<p>} </p>
																		<h2>3&#160; 问题解决 </h2>
																		<p>3.1&#160; 修改 doInclude 方法 </p>
																		<p>public void doInclude(String uri, PageContext pageContext) </p>
																		<p>throws IOException, ServletException { </p>
																		<p>if (uri.indexOf(".jsp") &gt; 0) </p>
																		<p>pageContext.include(uri); </p>
																		<p>else if (uri.indexOf(".do") &gt; 0) </p>
																		<p>pageContext.getOut().write(getPageContent(uri, pageContext)); </p>
																		<p>} </p>
																		<p>3.2 给 TilesUtilImpl 增加一个新的方法getPageContent，获取 .do 文件的内容用于显示 </p>
																		<p>private String getPageContent(String uri, PageContext pageContext) { </p>
																		<p>String result = ""; </p>
																		<p>HttpServletRequest request = (HttpServletRequest) pageContext .getRequest(); </p>
																		<p>String contextPath = request.getContextPath(); </p>
																		<p>String serverIP = request.getServerName(); </p>
																		<p>String serverPort = String.valueOf(request.getServerPort()); </p>
																		<p>String uriTmp = "http://"; </p>
																		<p>if (serverPort.equals("80")) </p>
																		<p>uriTmp = uriTmp + serverIP; </p>
																		<p>else </p>
																		<p>uriTmp = uriTmp + serverIP + ":" + serverPort; </p>
																		<p>uriTmp = uriTmp + contextPath; </p>
																		<p>if (uri.startsWith("/")) </p>
																		<p>uriTmp += uri; </p>
																		<p>else </p>
																		<p>uriTmp += "/" + uri; </p>
																		<p>try { </p>
																		<p>URL url = new URL(uriTmp); </p>
																		<p>HttpURLConnection conn = (HttpURLConnection) url.openConnection(); </p>
																		<p>BufferedReader reader = new BufferedReader(new InputStreamReader( </p>
																		<p>conn.getInputStream())); </p>
																		<p>String line = null; </p>
																		<p>while ((line = reader.readLine()) != null) { </p>
																		<p>result += line; </p>
																		<p>} </p>
																		<p>conn.disconnect(); </p>
																		<p>reader.close(); </p>
																		<p>} catch (Exception e) { </p>
																		<p>e.printStackTrace(); </p>
																		<p>} </p>
																		<p>return result; </p>} </td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table><img src ="http://www.blogjava.net/rain1102/aggbug/96158.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2007-01-26 15:04 <a href="http://www.blogjava.net/rain1102/archive/2007/01/26/96158.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用 Spring 更好地处理 Struts 动作</title><link>http://www.blogjava.net/rain1102/archive/2006/09/19/70561.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Tue, 19 Sep 2006 08:41:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2006/09/19/70561.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/70561.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2006/09/19/70561.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/70561.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/70561.html</trackback:ping><description><![CDATA[<em>Struts Recipes</em> 的合著者 George Franciscus 将介绍另一个重大的 Struts 整合窍门 —— 这次是将 Struts 应用程序导入 Spring 框架。请跟随 George，他将向您展示如何改变 Struts 动作，使得管理 Struts 动作就像管理 Spring beans 那样。结果是一个增强的 web 框架，这个框架可以方便地利用 Spring AOP 的优势。<br /><p>您肯定已经听说过控制反转 (IOC) 设计模式，因为很长一段时间以来一直在流传关于它的信息。如果您在任何功能中使用过 Spring 框架，那么您就知道其原理的作用。在本文中，我利用这一原理把一个 Struts 应用程序注入 Spring 框架，您将亲身体会到 IOC 模式的强大。</p><p>将一个 Struts 应用程序整合进 Spring 框架具有多方面的优点。首先，Spring 是为解决一些关于 JEE 的真实世界问题而设计的，比如复杂性、低性能和可测试性，等等。第二，Spring 框架包含一个 AOP 实现，允许您将面向方面技术应用于面向对象的代码。第三，一些人可能会说 Spring 框架只有<i>处理</i> Struts 比 Struts 处理自己好。但是这是观点问题，我演示三种将 Struts 应用程序整合到 Spring 框架的方法后，具体由您自己决定使用哪一种。</p><p>我所演示的方法都是执行起来相对简单的，但是它们却具有明显不同的优点。我为每一种方法创建了一个独立而可用的例子，这样您就可以完全理解每种方法。</p><p><a name="N1008F"><span class="atitle"><font face="Arial" size="4"><strong>为什么 Spring 这么了不起？</strong></font></span></a></p><p>Spring 的创立者 Rod Johnson 以一种批判的眼光看待 <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>&#8482; 企业软件开发，并且提议很多企业难题都能够通过战略地使用 IOC 模式（也称作依赖注入）来解决。当 Rod 和一个具有奉献精神的开放源码开发者团队将这个理论应用于实践时，结果就产生了 Spring 框架。简言之，Spring 是一个轻型的容器，利用它可以使用一个外部 XML 配置文件方便地将对象连接在一起。每个对象都可以通过显示一个 JavaBean 属性收到一个到依赖对象的引用，留给您的简单任务就只是在一个 XML 配置文件中把它们连接好。</p><table cellspacing="0" cellpadding="0" width="40%" align="right" border="0"><tbody><tr><td width="10"><img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="10" /></td><td><table cellspacing="0" cellpadding="5" width="100%" border="1"><tbody><tr><td bgcolor="#eeeeee"><a name="N1009C"><b>IOC 和 Spring</b></a><br /><p>IOC 是一种使应用程序逻辑外在化的设计模式，所以它是被注入而不是被写入客户机代码中。将 IOC 与接口编程应用结合，就像 Spring 框架那样，产生了一种架构，这种架构能够减少客户机对特定实现逻辑的依赖。请参阅 <a href="http://www-128.ibm.com/developerworks/cn/java/j-sr2.html#resources"><font color="#996699">参考资料</font></a> 了解更多关于 IOC 和 Spring 的信息。</p></td></tr></tbody></table></td></tr></tbody></table><p>依赖注入是一个强大的特性，但是 Spring 框架能够提供更多特性。Spring 支持可插拔的事务管理器，可以给您的事务处理提供更广泛的选择范围。它集成了领先的持久性框架，并且提供一个一致的异常层次结构。Spring 还提供了一种使用面向方面代码代替正常的面向对象代码的简单机制。</p><p>Spring AOP 允许您使用<i>拦截器</i> 在一个或多个执行点上拦截应用程序逻辑。加强应用程序在拦截器中的日志记录逻辑会产生一个更可读的、实用的代码基础，所以拦截器广泛用于日志记录。您很快就会看到，为了处理横切关注点，Spring AOP 发布了它自己的拦截器，您也可以编写您自己的拦截器。<br /><br /></p><p><a name="N100B3"><span class="atitle"><font face="Arial" size="4"><strong>整合 Struts 和 Spring</strong></font></span></a></p><p>与 Struts 相似，Spring 可以作为一个 MVC 实现。这两种框架都具有自己的优点和缺点，尽管大部分人同意 Struts 在 MVC 方面仍然是最好的。很多开发团队已经学会在时间紧迫的时候利用 Struts 作为构造高品质软件的基础。Struts 具有如此大的推动力，以至于开发团队宁愿整合 Spring 框架的特性，而不愿意转换成 Spring MVC。没必要进行转换对您来说是一个好消息。Spring 架构允许您将 Struts 作为 Web 框架连接到基于 Spring 的业务和持久层。最后的结果就是现在一切条件都具备了。</p><p>在接下来的小窍门中，您将会了解到三种将 Struts MVC 整合到 Spring 框架的方法。我将揭示每种方法的缺陷并且对比它们的优点。 一旦您了解到所有三种方法的作用，我将会向您展示一个令人兴奋的应用程序，这个程序使用的是这三种方法中我最喜欢的一种。<br /></p><p><a name="N100BF"><span class="atitle"><font face="Arial" size="4"><strong>三个小窍门</strong></font></span></a></p><p>接下来的每种整合技术（或者窍门）都有自己的优点和特点。我偏爱其中的一种，但是我知道这三种都能够加深您对 Struts 和 Spring 的理解。在处理各种不同情况的时候，这将给您提供一个广阔的选择范围。方法如下：</p><ul><li>使用 Spring 的 <code>ActionSupport</code> 类整合 Structs 
</li><li>使用 Spring 的 <code>DelegatingRequestProcessor</code> 覆盖 Struts 的 <code>RequestProcessor </code></li><li>将 Struts <code>Action</code> 管理委托给 Spring 框架 </li></ul><p><a name="N100E4"><span class="smalltitle"><strong><font face="Arial">装载应用程序环境</font></strong></span></a></p><p>无论您使用哪种技术，都需要使用 Spring 的 <code>ContextLoaderPlugin</code> 为 Struts 的 <code>ActionServlet</code> 装载 Spring 应用程序环境。就像添加任何其他插件一样，简单地向您的 struts-config.xml 文件添加该插件，如下所示：</p><p></p><table style="WIDTH: 664px; HEIGHT: 84px" cellspacing="0" cellpadding="5" width="664" bgcolor="#eeeeee" border="1"><tbody><tr><td><pre><code class="section"><font face="Lucida Console">&lt;plug-in className=
  "org.springframework.web.struts.ContextLoaderPlugIn"&gt;
    &lt;set-property property=
      "contextConfigLocation" value="/WEB-INF/beans.xml"/&gt;
 &lt;/plug-in&gt;
</font></code></pre></td></tr></tbody></table><p><a name="N10101"><span class="atitle"><font face="Arial" size="4"><strong>窍门 1. 使用 Spring 的 ActionSupport</strong></font></span></a></p><p>手动创建一个 Spring 环境是一种整合 Struts 和 Spring 的最直观的方式。为了使它变得更简单，Spring 提供了一些帮助。为了方便地获得 Spring 环境，<code>org.springframework.web.struts.ActionSupport</code> 类提供了一个 <code>getWebApplicationContext()</code> 方法。您所做的只是从 Spring 的 <code>ActionSupport</code> 而不是 Struts <code>Action</code> 类扩展您的动作，如清单 1 所示：</p><br /><a name="N1011F"><b>清单 1. 使用 ActionSupport 整合 Struts</b></a><br /><table style="WIDTH: 665px; HEIGHT: 634px" cellspacing="0" cellpadding="5" width="665" bgcolor="#eeeeee" border="1"><tbody><tr><td><pre><code class="section"><font face="Lucida Console">package ca.nexcel.books.actions;

import <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.DynaActionForm;
import org.springframework.context.ApplicationContext;
import org.springframework.web.struts.ActionSupport;

import ca.nexcel.books.beans.Book;
import ca.nexcel.books.business.BookService;

public class SearchSubmit extends ActionSupport {   <span class="boldcode"><strong>|(1)</strong></span>


  public ActionForward execute(
    ActionMapping mapping,
    ActionForm form,
    HttpServletRequest request,
    HttpServletResponse response)
    throws IOException, ServletException {

    DynaActionForm searchForm = (DynaActionForm) form;
    String isbn = (String) searchForm.get("isbn");
		
    //the old fashion way
    //BookService bookService = new BookServiceImpl();
		
    ApplicationContext ctx = 
      getWebApplicationContext();    <span class="boldcode"><strong>|(2)</strong></span>
    BookService bookService = 
      (BookService) ctx.getBean("bookService");   <span class="boldcode"><strong>|(3)</strong></span>
        
  Book book = bookService.read(isbn.trim());

    if (null == book) {
      ActionErrors errors = new ActionErrors();
      errors.add(ActionErrors.GLOBAL_ERROR,new ActionError
        ("message.notfound"));
      saveErrors(request, errors);
      return mapping.findForward("failure") ;
  }

    request.setAttribute("book", book);
    return mapping.findForward("success");
  }
}
</font></code></pre></td></tr></tbody></table><br /><p>让我们快速思考一下这里到底发生了什么。在 (1) 处，我通过从 Spring 的 <code>ActionSupport</code> 类而不是 Struts 的 <code>Action</code> 类进行扩展，创建了一个新的 <code>Action</code>。在 (2) 处，我使用 <code>getWebApplicationContext()</code> 方法获得一个 <code>ApplicationContext</code>。为了获得业务服务，我使用在 (2) 处获得的环境在 (3) 处查找一个 Spring bean。</p><p>这种技术很简单并且易于理解。不幸的是，它将 Struts 动作与 Spring 框架耦合在一起。如果您想替换掉 Spring，那么您必须重写代码。并且，由于 Struts 动作不在 Spring 的控制之下，所以它不能获得 Spring AOP 的优势。当使用多重独立的 Spring 环境时，这种技术可能有用，但是在大多数情况下，这种方法不如另外两种方法合适。<br /></p><p><a name="N10149"><span class="atitle"><font face="Arial" size="4"><strong>窍门 2. 覆盖 RequestProcessor</strong></font></span></a></p><p>将 Spring 从 Struts 动作中分离是一个更巧妙的设计选择。分离的一种方法是使用 <code>org.springframework.web.struts.DelegatingRequestProcessor</code> 类来覆盖 Struts 的 <code>RequestProcessor</code> 处理程序，如清单 2 所示：</p><p><br /><a name="N1015F"><b>清单 2. 通过 Spring 的 DelegatingRequestProcessor 进行整合</b></a><br /></p><table style="WIDTH: 665px; HEIGHT: 590px" cellspacing="0" cellpadding="5" width="665" bgcolor="#eeeeee" border="1"><tbody><tr><td><pre><code class="section"><font face="Lucida Console">&lt;?xml version="1.0" encoding="ISO-8859-1" ?&gt;

&lt;!DOCTYPE struts-config PUBLIC
          "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN"
          "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd"&gt;

&lt;struts-config&gt;
 &lt;form-beans&gt;
    &lt;form-bean name="searchForm" 
      type="org.apache.struts.validator.DynaValidatorForm"&gt;
               &lt;form-property name="isbn"    type="<a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.lang.String"/&gt;
    &lt;/form-bean&gt;
  
  &lt;/form-beans&gt;

 &lt;global-forwards type="org.apache.struts.action.ActionForward"&gt;
     &lt;forward   name="welcome"                path="/welcome.do"/&gt;
     &lt;forward   name="searchEntry"            path="/searchEntry.do"/&gt;
     &lt;forward   name="searchSubmit"           path="/searchSubmit.do"/&gt;
 &lt;/global-forwards&gt;

 &lt;action-mappings&gt;
    &lt;action    path="/welcome" forward="/WEB-INF/pages/welcome.htm"/&gt;
    &lt;action    path="/searchEntry" forward="/WEB-INF/pages/search.jsp"/&gt;
    &lt;action    path="/searchSubmit" 
               type="ca.nexcel.books.actions.SearchSubmit"
               input="/searchEntry.do"
               validate="true"
               name="searchForm"&gt;
              &lt;forward name="success" path="/WEB-INF/pages/detail.jsp"/&gt;
              &lt;forward name="failure" path="/WEB-INF/pages/search.jsp"/&gt;
    &lt;/action&gt;  

 &lt;/action-mappings&gt;

 &lt;message-resources parameter="ApplicationResources"/&gt;

 &lt;controller processorClass="org.springframework.web.struts.
   DelegatingRequestProcessor"/&gt; <span class="boldcode"><strong>|(1)</strong></span>

 &lt;plug-in className="org.apache.struts.validator.ValidatorPlugIn"&gt;
    &lt;set-property property="pathnames" 
      value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/&gt;
 &lt;/plug-in&gt;


 &lt;plug-in className="org.springframework.web.struts.ContextLoaderPlugIn"&gt;
    &lt;set-property property="csntextConfigLocation" value="/WEB-INF/beans.xml"/&gt;
 &lt;/plug-in&gt;
 
&lt;/struts-config&gt;
</font></code></pre></td></tr></tbody></table><br /><p>我利用了 <code>&lt;controller&gt;</code> 标记来用 <code>DelegatingRequestProcessor</code> 覆盖默认的 Struts <code>RequestProcessor</code>。下一步是在我的 Spring 配置文件中注册该动作，如清单 3 所示：</p><p><br /><a name="N1017C"><b>清单 3. 在 Spring 配置文件中注册一个动作</b></a><br /></p><table style="WIDTH: 665px; HEIGHT: 183px" cellspacing="0" cellpadding="5" width="665" bgcolor="#eeeeee" border="1"><tbody><tr><td><pre><code class="section"><font face="Lucida Console">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" 
  "http://www.springframework.org/dtd/spring-beans.dtd"&gt;

&lt;beans&gt;
  &lt;bean id="bookService" class="ca.nexcel.books.business.BookServiceImpl"/&gt;

  &lt;bean name="/searchSubmit" 
    class="ca.nexcel.books.actions.SearchSubmit"&gt; <span class="boldcode"><strong>|(1)</strong></span>
     &lt;property name="bookService"&gt;
        &lt;ref bean="bookService"/&gt;
     &lt;/property&gt;
  &lt;/bean&gt;
&lt;/beans&gt;
</font></code></pre></td></tr></tbody></table><br /><p>注意：在 (1) 处，我使用名称属性注册了一个 bean，以匹配 struts-config 动作映射名称。<code>SearchSubmit</code> 动作揭示了一个 JavaBean 属性，允许 Spring 在运行时填充属性，如清单 4 所示：</p><p><br /><a name="N10191"><b>清单 4. 具有 JavaBean 属性的 Struts 动作</b></a><br /></p><table style="WIDTH: 663px; HEIGHT: 623px" cellspacing="0" cellpadding="5" width="663" bgcolor="#eeeeee" border="1"><tbody><tr><td><pre><code class="section"><font face="Lucida Console">package ca.nexcel.books.actions;

import <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.DynaActionForm;

import ca.nexcel.books.beans.Book;
import ca.nexcel.books.business.BookService;

public class SearchSubmit extends Action {
	
  private BookService bookService;
  public BookService getBookService() {
    return bookService;
  }

  public void setBookService(BookService bookService) { <span class="boldcode"><strong>| (1)</strong></span>
    this.bookService = bookService; 
  } 

  public ActionForward execute(
    ActionMapping mapping,
    ActionForm form,
    HttpServletRequest request,
    HttpServletResponse response)
    throws IOException, ServletException {

    DynaActionForm searchForm = (DynaActionForm) form;
    String isbn = (String) searchForm.get("isbn");
		
  Book book = getBookService().read(isbn.trim());  <span class="boldcode"><strong>|(2)</strong></span>

    if (null == book) {
      ActionErrors errors = new ActionErrors();
      errors.add(ActionErrors.GLOBAL_ERROR,new ActionError("message.notfound"));
      saveErrors(request, errors);
      return mapping.findForward("failure") ;
  }

      request.setAttribute("book", book);
      return mapping.findForward("success");
  }

}
</font></code></pre></td></tr></tbody></table><br /><p>在清单 4 中，您可以了解到如何创建 Struts 动作。在 (1) 处，我创建了一个 JavaBean 属性。<code>DelegatingRequestProcessor</code>自动地配置这种属性。这种设计使 Struts 动作并不知道它正被 Spring 管理，并且使您能够利用 Sping 的动作管理框架的所有优点。由于您的 Struts 动作注意不到 Spring 的存在，所以您不需要重写您的 Struts 代码就可以使用其他控制反转容器来替换掉 Spring。</p><p><code>DelegatingRequestProcessor</code> 方法的确比第一种方法好，但是仍然存在一些问题。如果您使用一个不同的 <code>RequestProcessor</code>，则需要手动整合 Spring 的 <code>DelegatingRequestProcessor</code>。添加的代码会造成维护的麻烦并且将来会降低您的应用程序的灵活性。此外，还有过一些使用一系列命令来代替 Struts <code>RequestProcessor</code> 的传闻。 这种改变将会对这种解决方法的使用寿命造成负面的影响。<br /></p><p><a name="N101B7"><span class="atitle"><font face="Arial" size="4"><strong>窍门 3. 将动作管理委托给 Spring</strong></font></span></a></p><p>一个更好的解决方法是将 Strut 动作管理委托给 Spring。您可以通过在 <code>struts-config</code> 动作映射中注册一个代理来实现。代理负责在 Spring 环境中查找 Struts 动作。由于动作在 Spring 的控制之下，所以它可以填充动作的 JavaBean 属性，并为应用诸如 Spring 的 AOP 拦截器之类的特性带来了可能。 </p><p>清单 5 中的 <code>Action</code> 类与清单 4 中的相同。但是 struts-config 有一些不同：</p><p><br /><a name="N101D0"><b>清单 5. Spring 整合的委托方法</b></a><br /></p><table style="WIDTH: 663px; HEIGHT: 601px" cellspacing="0" cellpadding="5" width="663" bgcolor="#eeeeee" border="1"><tbody><tr><td><pre><code class="section"><font face="Lucida Console">&lt;?xml version="1.0" encoding="ISO-8859-1" ?&gt;

&lt;!DOCTYPE struts-config PUBLIC
          "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN"
          "http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd"&gt;

&lt;struts-config&gt;
 &lt;form-beans&gt;
    &lt;form-bean name="searchForm" 
      type="org.apache.struts.validator.DynaValidatorForm"&gt;
               &lt;form-property name="isbn"    type="<a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.lang.String"/&gt;
    &lt;/form-bean&gt;
  
  &lt;/form-beans&gt;

 &lt;global-forwards type="org.apache.struts.action.ActionForward"&gt;
     &lt;forward   name="welcome"                path="/welcome.do"/&gt;
     &lt;forward   name="searchEntry"            path="/searchEntry.do"/&gt;
     &lt;forward   name="searchSubmit"           path="/searchSubmit.do"/&gt;
 &lt;/global-forwards&gt;

 &lt;action-mappings&gt;
    &lt;action    path="/welcome" forward="/WEB-INF/pages/welcome.htm"/&gt;
    &lt;action    path="/searchEntry" forward="/WEB-INF/pages/search.jsp"/&gt;
    &lt;action    path="/searchSubmit" 
             type="org.springframework.web.struts.DelegatingActionProxy" <span class="boldcode"><strong>|(1)</strong></span>
             input="/searchEntry.do"
             validate="true"
             name="searchForm"&gt;
             &lt;forward name="success" path="/WEB-INF/pages/detail.jsp"/&gt;
             &lt;forward name="failure" path="/WEB-INF/pages/search.jsp"/&gt;
    &lt;/action&gt;  

 &lt;/action-mappings&gt;

 &lt;message-resources parameter="ApplicationResources"/&gt;


 &lt;plug-in className="org.apache.struts.validator.ValidatorPlugIn"&gt;
    &lt;set-property 
    property="pathnames" 
    value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"/&gt;
 &lt;/plug-in&gt;


 &lt;plug-in 
    className="org.springframework.web.struts.ContextLoaderPlugIn"&gt;
    &lt;set-property property="contextConfigLocation" value="/WEB-INF/beans.xml"/&gt;
 &lt;/plug-in&gt;

 
&lt;/struts-config&gt;
</font></code></pre></td></tr></tbody></table><br /><p>清单 5 是一个典型的 struts-config.xml 文件，只有一个小小的差别。它注册 Spring 代理类的名称，而不是声明动作的类名，如（1）处所示。DelegatingActionProxy 类使用动作映射名称查找 Spring 环境中的动作。这就是我们使用 <code>ContextLoaderPlugIn</code> 声明的环境。</p><p>将一个 Struts 动作注册为一个 Spring bean 是非常直观的，如清单 6 所示。我利用动作映射使用 <code>&lt;bean&gt;</code> 标记的名称属性（在这个例子中是 "<code>/searchSubmit</code>"）简单地创建了一个 bean。这个动作的 JavaBean 属性像任何 Spring bean 一样被填充： </p><p><br /><a name="N101F0"><b>清单 6. 在 Spring 环境中注册一个 Struts 动作</b></a><br /></p><table style="WIDTH: 661px; HEIGHT: 194px" cellspacing="0" cellpadding="5" width="661" bgcolor="#eeeeee" border="1"><tbody><tr><td><pre><code class="section"><font face="Lucida Console">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" 
 "http://www.springframework.org/dtd/spring-beans.dtd"&gt;

&lt;beans&gt;
  &lt;bean id="bookService" class="ca.nexcel.books.business.BookServiceImpl"/&gt;

  &lt;bean name="/searchSubmit"   
        class="ca.nexcel.books.actions.SearchSubmit"&gt;
     &lt;property name="bookService"&gt;
        &lt;ref bean="bookService"/&gt;
     &lt;/property&gt;
  &lt;/bean&gt;

&lt;/beans&gt;
</font></code></pre></td></tr></tbody></table><p><a name="N101F7"><span class="atitle"><font face="Arial" size="4"><strong>动作委托的优点</strong></font></span></a></p><p>动作委托解决方法是这三种方法中最好的。Struts 动作不了解 Spring，不对代码作任何改变就可用于非 Spring 应用程序中。<code>RequestProcessor</code> 的改变不会影响它，并且它可以利用 Spring AOP 特性的优点。 </p><p>动作委托的优点不止如此。一旦让 Spring 控制您的 Struts 动作，您就可以使用 Spring 给动作补充更强的活力。例如，没有 Spring 的话，所有的 Struts 动作都必须是线程安全的。如果您设置 <code>&lt;bean&gt;</code> 标记的 singleton 属性为&#8220;false&#8221;，那么不管用何种方法，您的应用程序都将在每一个请求上有一个新生成的动作对象。您可能不需要这种特性，但是把它放在您的工具箱中也很好。您也可以利用 Spring 的生命周期方法。例如，当实例化 Struts 动作时，<code>&lt;bean&gt;</code> 标记的 init-method 属性被用于运行一个方法。类似地，在从容器中删除 bean 之前，destroy-method 属性执行一个方法。这些方法是管理昂贵对象的好办法，它们以一种与 Servlet 生命周期相同的方式进行管理。<br /></p><p><a name="N10210"><span class="atitle"><font face="Arial" size="4"><strong>拦截 Struts</strong></font></span></a></p><p>前面提到过，通过将 Struts 动作委托给 Spring 框架而整合 Struts 和 Spring 的一个主要的优点是：您可以将 Spring 的 AOP 拦截器应用于您的 Struts 动作。通过将 Spring 拦截器应用于 Struts 动作，您可以用最小的代价处理横切关注点。</p><p>虽然 Spring 提供很多内置拦截器，但是我将向您展示如何创建自己的拦截器并把它应用于一个 Struts 动作。为了使用拦截器，您需要做三件事：</p><ol><li>创建拦截器。 
</li><li>注册拦截器。 
</li><li>声明在何处拦截代码。 </li></ol><p>这看起来非常简单的几句话却非常强大。例如，在清单 7 中，我为 Struts 动作创建了一个日志记录拦截器。 这个拦截器在每个方法调用之前打印一句话：</p><p><br /><a name="N10230"><b>清单 7. 一个简单的日志记录拦截器</b></a><br /></p><table style="WIDTH: 663px; HEIGHT: 161px" cellspacing="0" cellpadding="5" width="663" bgcolor="#eeeeee" border="1"><tbody><tr><td><pre><code class="section"><font face="Lucida Console">package ca.nexcel.books.interceptors;

import org.springframework.aop.MethodBeforeAdvice;

import <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.lang.reflect.Method;

public class LoggingInterceptor implements MethodBeforeAdvice {

   public void before(Method method, Object[] objects, Object o) throws Throwable {
        System.out.println("logging before!");
    }
}
</font></code></pre></td></tr></tbody></table><br /><p>这个拦截器非常简单。<code>before()</code> 方法在拦截点中每个方法之前运行。在本例中，它打印出一句话，其实它可以做您想做的任何事。下一步就是在 Spring 配置文件中注册这个拦截器，如清单 8 所示：</p><p><br /><a name="N10242"><b>清单 8. 在 Spring 配置文件中注册拦截器</b></a><br /></p><table style="WIDTH: 660px; HEIGHT: 392px" cellspacing="0" cellpadding="5" width="660" bgcolor="#eeeeee" border="1"><tbody><tr><td><pre><code class="section"><font face="Lucida Console">&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" 
  "http://www.springframework.org/dtd/spring-beans.dtd"&gt;

&lt;beans&gt;
  &lt;bean id="bookService" class="ca.nexcel.books.business.BookServiceImpl"/&gt;

  &lt;bean name="/searchSubmit" 
        class="ca.nexcel.books.actions.SearchSubmit"&gt;
     &lt;property name="bookService"&gt;
        &lt;ref bean="bookService"/&gt;
     &lt;/property&gt;
  &lt;/bean&gt;

  &lt;!--  Interceptors --&gt; 
  &lt;bean name="logger"    
    class="ca.nexcel.books.interceptors.LoggingInterceptor"/&gt; <span class="boldcode"><strong>|(1)</strong></span>

  &lt;!-- AutoProxies --&gt;
  &lt;bean name="loggingAutoProxy" 
        class="org.springframework.aop.framework.autoproxy.
          BeanNameAutoProxyCreator"&gt; <span class="boldcode"><strong>|(2)</strong></span>
    &lt;property name="beanNames"&gt;
          &lt;value&gt;/searchSubmit&lt;/valuesgt; <span class="boldcode"><strong>|(3)</strong></span>
    &lt;/property&gt;
    &lt;property name="interceptorNames"&gt;
        &lt;list&gt;
          &lt;value&gt;logger&lt;/value&gt; <span class="boldcode"><strong>|(4)</strong></span>
        &lt;/list&gt;
    &lt;/property&gt;
   &lt;/bean&gt;

&lt;/beans&gt;
</font></code></pre></td></tr></tbody></table><br /><p>您可能已经注意到了，清单 8 扩展了 清单6 中所示的应用程序以包含一个拦截器。具体细节如下：</p><ul><li>在 (1) 处，我注册了这个拦截器。 
</li><li>在 (2) 处，我创建了一个 bean 名称自动代理，它描述如何应用拦截器。还有其他的方法定义拦截点，但是这种方法常见而简便。 
</li><li>在 (3) 处，我将 Struts 动作注册为将被拦截的 bean。如果您想要拦截其他的 Struts 动作，则只需要在 "beanNames" 下面创建附加的 <code>&lt;value&gt;</code> 标记。 
</li><li>在 (4) 处，当拦截发生时，我执行了在 (1) 处创建的拦截器 bean 的名称。这里列出的所有拦截器都应用于&#8220;beanNames&#8221;。 </li></ul><p>就是这样。就像这个例子所展示的，将您的 Struts 动作置于 Spring 框架的控制之下，为处理您的 Struts 应用程序提供了一系列全新的选择。在本例中，使用动作委托可以轻松地利用 Spring 拦截器提高 Struts 应用程序中的日志记录能力。<br /></p><p><a name="N10272"><span class="atitle"><font face="Arial" size="4"><strong>结束语</strong></font></span></a></p><p>在本文中，您已经学习了将 Struts 动作整合到 Spring 框架中的三种窍门。使用 Spring 的 <code>ActionSupport</code> 来整合 Struts（第一种窍门中就是这样做的）简单而快捷，但是会将 Struts 动作与 Spring 框架耦合在一起。如果您需要将应用程序移植到一个不同的框架，则需要重写代码。第二种解决方法通过委托 <code>RequestProcessor</code> 巧妙地解开代码的耦合，但是它的可扩展性不强，并且当 Struts 的 <code>RequestProcessor</code> 变成一系列命令时，这种方法就持续不了很长时间。第三种方法是这三种方法中最好的：将 Struts 动作委托给 Spring 框架可以使代码解耦，从而使您可以在您的 Struts 应用程序中利用 Spring 的特性（比如日志记录拦截器）。</p><p>三种 Struts-Spring 整合窍门中的每一种都被实现成一个完整可用的应用程序。</p><img src ="http://www.blogjava.net/rain1102/aggbug/70561.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2006-09-19 16:41 <a href="http://www.blogjava.net/rain1102/archive/2006/09/19/70561.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ajax+Struts+Hibernate实现级联下拉单</title><link>http://www.blogjava.net/rain1102/archive/2006/09/13/69348.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Wed, 13 Sep 2006 04:45:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2006/09/13/69348.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/69348.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2006/09/13/69348.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/69348.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/69348.html</trackback:ping><description><![CDATA[<p>&lt;!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt;<br />&lt;html&gt;<br />&#160; &lt;head&gt;<br />&#160;&#160;&#160; &lt;title&gt;kind.html&lt;/title&gt;<br />&#160; &lt;script type="text/javascript" src="js/common.js"&gt;&lt;/script&gt;<br />&#160; &lt;script type="text/javascript"&gt;<br />&#160;&#160;&#160; function refreshModelList(){&#160;<br />&#160;&#160;&#160;&#160;&#160; var oneName=document.getElementById("kindone").value;<br />&#160;&#160;&#160;&#160;&#160; if(oneName==""){<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; clearlist();<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; return;<br />&#160;&#160;&#160;&#160;&#160; }<br />&#160;&#160;&#160;&#160;&#160; var url="kind.do?method=search&amp;&amp;kindid="+oneName;<br />&#160;&#160;&#160;&#160; <br />&#160;&#160;&#160;&#160;&#160; createXMLHttpRequest();<br />&#160;&#160;&#160;&#160;&#160; <br />&#160;&#160;&#160;&#160;&#160; xmlHttp.onreadystatechange=handleStateChange;<br />&#160;&#160;&#160;&#160;&#160; xmlHttp.open("GET",url,true);<br />&#160;&#160;&#160;&#160;&#160; xmlHttp.send(null);<br />&#160;&#160;&#160;&#160;&#160; <br />&#160;&#160;&#160; }<br />&#160;&#160;&#160; function handleStateChange(){<br />&#160;&#160;&#160;&#160;&#160; if(xmlHttp.readyState==4){&#160;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; if(xmlHttp.status==200){<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; setNames();&#160;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br />&#160;&#160;&#160;&#160;&#160; }<br />&#160;&#160;&#160; }<br />&#160;&#160;&#160; function clearlist(){<br />&#160;&#160;&#160;&#160;&#160; var models=document.getElementById("kindtwo");<br />&#160;&#160;&#160;&#160;&#160; while(models.childNodes.length&gt;0){<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; models.removeChild(models.childNodes[0]);<br />&#160;&#160;&#160;&#160;&#160; }<br />&#160;&#160;&#160; }<br />&#160;&#160;&#160; function setNames(){<br />&#160;&#160;&#160;&#160;&#160; clearlist();<br />&#160;&#160;&#160;&#160;&#160; var models=document.getElementById("kindtwo");<br />&#160;&#160;&#160;&#160;&#160; var xmlDoc=xmlHttp.responseXML;<br />&#160;&#160;&#160;&#160;&#160; var results=xmlDoc.getElementsByTagName("kind");<br />&#160;&#160;&#160;&#160;&#160; var option=null;<br />&#160;&#160;&#160;&#160;&#160; for(var i=0;i&lt;results.length;i++){<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; option=document.createElement("option");<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; option.appendChild(document.createTextNode(results[i].firstChild.nodeValue));<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; models.appendChild(option);<br />&#160;&#160;&#160;&#160;&#160; }<br />&#160;&#160;&#160; }<br />&#160; &lt;/script&gt;<br />&#160; &lt;/head&gt;<br />&#160; <br />&#160; &lt;body&gt;<br />&#160;&#160;&#160; &lt;h2&gt;dynamicLists&lt;/h2&gt;<br />&#160;&#160;&#160; &lt;select id="kindone" onchange="refreshModelList();"&gt;<br />&#160;&#160;&#160;&#160;&#160; &lt;option value="1"&gt;a&lt;/option&gt;<br />&#160;&#160;&#160;&#160;&#160; &lt;option value="2"&gt;b&lt;/option&gt;<br />&#160;&#160;&#160;&#160;&#160; &lt;option value="3"&gt;c&lt;/option&gt;<br />&#160;&#160;&#160;&#160;&#160; &lt;option value="4"&gt;d&lt;/option&gt;<br />&#160;&#160;&#160; &lt;/select&gt;<br />&#160;&#160;&#160; &lt;select id="kindtwo"&gt;<br />&#160;&#160;&#160; &lt;/select&gt;<br />&#160; &lt;/body&gt;<br />&lt;/html&gt;<br /></p>
		<hr />
/*<br />&#160;* Generated by MyEclipse Struts<br />&#160;* Template path: templates/java/JavaClass.vtl<br />&#160;*/<br />package com.rain.struts.action; 
<p>import <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.io.IOException;<br />import <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.io.PrintWriter;<br />import <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.util.Iterator;<br />import <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.util.List;</p><p>import javax.servlet.http.HttpServletRequest;<br />import javax.servlet.http.HttpServletResponse;<br />import org.apache.struts.action.ActionForm;<br />import org.apache.struts.action.ActionForward;<br />import org.apache.struts.action.ActionMapping;<br />import org.apache.struts.actions.DispatchAction;<br />import org.apache.struts.validator.DynaValidatorForm;</p><p>import com.rain.bean.KindDao;</p><p>/** <br />&#160;* MyEclipse Struts<br />&#160;* Creation date: 09-13-2006<br />&#160;* <br />&#160;* XDoclet definition:<br />&#160;* @struts.action parameter="method"<br />&#160;*/<br />public class KindAction extends DispatchAction {<br />&#160;/*<br />&#160; * Generated Methods<br />&#160; */</p><p>&#160;/** <br />&#160; * Method execute<br />&#160; * @param mapping<br />&#160; * @param form<br />&#160; * @param request<br />&#160; * @param response<br />&#160; * @return ActionForward<br />&#160; */<br />&#160;public ActionForward search(ActionMapping mapping, ActionForm form,<br />&#160;&#160;&#160;HttpServletRequest request, HttpServletResponse response) {<br />&#160;&#160;DynaValidatorForm kindForm = (DynaValidatorForm)form;<br />&#160;&#160;KindDao dao=new KindDao();<br />&#160;&#160;int kindid=Integer.parseInt(kindForm.getString("kindid"));<br />&#160;&#160;List list=dao.findAllKind(kindid);<br />&#160;&#160;Iterator it=list.iterator();<br />&#160;&#160;if(it.hasNext()){<br />&#160;&#160;&#160;PrintWriter out;<br />&#160;&#160;&#160;try {<br />&#160;&#160;&#160;&#160;response.setContentType("text/xml;charset=UTF-8");<br />&#160;&#160;&#160;&#160;response.setHeader("Cache-Control", "no-cache");<br />&#160;&#160;&#160;&#160;out = response.getWriter();<br /><br />&#160;&#160;&#160;&#160;out.println("&lt;response&gt;");<br />&#160;&#160;&#160;&#160;while(it.hasNext()){<br />&#160;&#160;&#160;&#160;&#160;String name=it.next().toString();<br />&#160;&#160;&#160;&#160;&#160;out.println("&lt;kind&gt;"+name+"&lt;/kind&gt;");<br />&#160;&#160;&#160;&#160;}<br />&#160;&#160;&#160;&#160;out.println("&lt;/response&gt;");<br />&#160;&#160;&#160;&#160;it=null;<br />&#160;&#160;&#160;&#160;out.close();<br />&#160;&#160;&#160;} catch (IOException e) {<br />&#160;&#160;&#160;&#160;// TODO 自动生成 catch 块<br />&#160;&#160;&#160;&#160;e.printStackTrace();<br />&#160;&#160;&#160;}<br />&#160;&#160;&#160;<br />&#160;&#160;}else{<br />&#160;&#160;&#160;response.setStatus(HttpServletResponse.SC_NO_CONTENT);<br />&#160;&#160;}<br />&#160;&#160;// TODO Auto-generated method stub<br />&#160;&#160;return null;<br />&#160;}<br />}</p><img src ="http://www.blogjava.net/rain1102/aggbug/69348.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2006-09-13 12:45 <a href="http://www.blogjava.net/rain1102/archive/2006/09/13/69348.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ajax+Struts+Hibernate注册</title><link>http://www.blogjava.net/rain1102/archive/2006/09/13/69302.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Wed, 13 Sep 2006 01:29:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2006/09/13/69302.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/69302.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2006/09/13/69302.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/69302.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/69302.html</trackback:ping><description><![CDATA[<p>HTML代码<br />&lt;html&gt;<br />&lt;head&gt;<br />&lt;title&gt;用户注册&lt;/title&gt;<br />&lt;meta http-equiv="Content-Type" content="text/html; charset=gb2312"&gt;<br />&lt;style type="text/css"&gt;<br />td {<br />&#160;font-size:12px;<br />&#160;color:#000033;<br />}<br />span {<br />&#160;font-size:12px;<br />&#160;color:#FF0000;<br />&#160;text-align:center;<br />&#160;height:20px;<br />&#160;vertical-align:bottom;<br />}<br />input {<br />&#160;border:0px;<br />&#160;border-bottom:1px #666666 dotted;<br />&#160;color:#3399FF;<br />}<br />&lt;/style&gt;<br />&lt;script language="JavaScript"&gt;<br />&#160; var xmlHttp;<br />&#160; function createXMLHttpRequest(){<br />&#160; if(window.ActiveXObject){<br />&#160;&#160;&#160;&#160; try {<br />&#160;&#160;&#160; xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");<br />&#160; } catch (e) {<br />&#160;&#160;try {<br />&#160;&#160;&#160; xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");<br />&#160;&#160; } catch (e) {}<br />&#160; }<br />&#160;&#160; }else if(window.XMLHttpRequest){<br />&#160;&#160;&#160;&#160; xmlHttp = new XMLHttpRequest();<br />&#160; if (xmlHttp.overrideMimeType) {<br />&#160;&#160;&#160; xmlHttp.overrideMimeType('text/xml');<br />&#160;&#160; }<br />&#160;&#160; }<br />&#160;&#160; if (!xmlHttp) { <br />&#160;&#160; window.alert("Could not create XMLHttpRequest.");<br />&#160;&#160; return false;<br />&#160;&#160; }<br />&#160; }<br />&#160; function checkUsername(obj){<br />&#160;&#160;&#160; createXMLHttpRequest();<br />&#160;&#160;&#160; document.getElementById("usernameview").innerHTML="";<br />&#160;&#160;&#160; var url="login.do?method=checkUserName&amp;&amp;UserName="+obj;<br />&#160;&#160;&#160; xmlHttp.onreadystatechange=handleStateChange;<br />&#160;&#160;&#160; xmlHttp.open("GET",url,true);<br />&#160;&#160;&#160; xmlHttp.send(null);<br />&#160; }<br />&#160; function handleStateChange(){<br />&#160;&#160;&#160; if(xmlHttp.readyState==4){<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; if(xmlHttp.status==200){<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; document.getElementById("usernameview").innerHTML=xmlHttp.responseText;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br />&#160;&#160;&#160;&#160;&#160; }<br />&#160; }<br />&#160; function checkPassword(obj){<br />&#160;&#160;&#160; document.getElementById("pwdview").innerHTML="";<br />&#160;&#160;&#160; if(obj.length&lt;6){<br />&#160;&#160;&#160;&#160;&#160; document.getElementById("pwdview").innerHTML="密码长度不能小于六位！";<br />&#160;&#160;&#160; }<br />&#160;&#160;&#160; else{<br />&#160;&#160;&#160;&#160;&#160; document.getElementById("pwdview").innerHTML="&#8730;";<br />&#160;&#160;&#160; }<br />&#160; }<br />&#160; function checkPassword2(obj){<br />&#160;&#160;&#160; var pwd1=document.getElementById("password1").value;<br />&#160;&#160;&#160; document.getElementById("usernameview").innerHTML="";<br />&#160;&#160;&#160; if(obj!=pwd1||obj==null)<br />&#160;&#160;&#160; {<br />&#160;&#160;&#160;&#160;&#160; document.getElementById("pwd2view").innerHTML="两次输入的密码不一致！";<br />&#160;&#160;&#160; }else{<br />&#160;&#160;&#160;&#160;&#160; document.getElementById("pwd2view").innerHTML="&#8730;";<br />&#160;&#160;&#160; }<br />&#160; }<br />&#160; function checkRealName(obj){<br />&#160;&#160;&#160; if(obj==null){<br />&#160;&#160;&#160;&#160;&#160;&#160; document.getElementById("realnameview").innerHTML="真实姓名不能为空！";<br />&#160;&#160;&#160; }else{<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; document.getElementById("realnameview").innerHTML="&#8730;";<br />&#160;&#160;&#160; }<br />&#160; }<br />&lt;/script&gt;</p>
		<p>&lt;/head&gt;<br />&lt;body&gt;<br />&#160;&lt;form name="RegistForm"&gt;<br />&#160;&lt;table height="328" align="center" cellpadding="0" cellspacing="0" style="border:2px #666666 solid; "&gt;<br />&#160;<br />&#160;&lt;tr&gt;<br />&#160;&#160;&lt;td colspan="2" height="30" bgcolor="#666666" align="center" style="border-bottom:1px #666666 solid;"&gt;&lt;font color="#FFFFFF"&gt;&lt;b&gt;用&amp;nbsp;户&amp;nbsp;注&amp;nbsp;册&lt;/b&gt;&lt;/font&gt;&lt;/td&gt;<br />&#160;&lt;/tr&gt;<br />&#160;&lt;tr&gt;<br />&#160;&#160;&lt;td width="147" height="35" align="right"&gt;用&amp;nbsp;户&amp;nbsp;名：&lt;/td&gt;<br />&#160;&#160;&lt;td width="368"&gt;&lt;input type="text" name="UserName" id="username" maxlength="15" size="13" onblur="checkUsername(this.value);"&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#ff0000"&gt;*&lt;/font&gt;&amp;nbsp;&amp;nbsp;&lt;span id="usernameview"&gt;&lt;/span&gt;&lt;/td&gt;<br />&#160;&lt;/tr&gt;<br />&#160;&lt;tr&gt;<br />&#160;&#160;&lt;td height="35" align="right"&gt;密&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;码：&lt;/td&gt;<br />&#160;&#160;&lt;td&gt;&lt;input type="password" name="Password" id="password1" maxlength="15" size="15" onblur="checkPassword(this.value);"&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#ff0000"&gt;*&lt;/font&gt;&lt;span id="pwdview"&gt;&lt;/span&gt;&lt;/td&gt;<br />&#160;&lt;/tr&gt;<br />&#160;&lt;tr&gt;<br />&#160;&#160;&lt;td height="35" align="right"&gt;密码校验：&lt;/td&gt;<br />&#160;&#160;&lt;td&gt;&lt;input type="password" name="Password2" id="password2" maxlength="15" size="15" onblur="checkPassword2(this.value);"&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#ff0000"&gt;*&lt;/font&gt;&amp;nbsp;&amp;nbsp;&lt;span id="pwd2view"&gt;&lt;/span&gt;&lt;/td&gt;<br />&#160;&lt;/tr&gt;<br />&#160;&lt;tr&gt;<br />&#160;&#160;&lt;td height="35" align="right"&gt;真实姓名：&lt;/td&gt;<br />&#160;&#160;&lt;td&gt;&lt;input type="text" name="realname" id="realname" size="10" maxlength="10" onblur="checkRealName(this.value);"&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#ff0000"&gt;*&lt;/font&gt;&lt;span id="realnameview"&gt;&lt;/span&gt;&lt;/td&gt;<br />&#160;&lt;/tr&gt;<br />&#160;&lt;tr&gt;<br />&#160;&#160;&lt;td height="35" align="right"&gt;性&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;别：&lt;/td&gt;<br />&#160;&#160;&lt;td&gt;&lt;select name="sex" id="sex"&gt;<br />&#160;&#160;&lt;option value="m"&gt;男&lt;/option&gt;<br />&#160;&#160;&lt;option value="w"&gt;女&lt;/option&gt;&lt;/select&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#ff0000"&gt;*&lt;/font&gt;&lt;/td&gt;<br />&#160;&lt;/tr&gt;<br />&#160;&lt;tr&gt;<br />&#160;&#160;&lt;td height="35" align="right"&gt;联系电话：&lt;/td&gt;<br />&#160;&#160;&lt;td&gt;&lt;input type="text" name="tel" id="tel" maxlength="12" size="13" &gt;&amp;nbsp;&amp;nbsp;&lt;font color="#ff0000"&gt;*&lt;/font&gt;&lt;/td&gt;<br />&#160;&lt;/tr&gt;<br />&#160;&lt;tr&gt;<br />&#160;&#160;&lt;td height="35" align="right"&gt;手&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;机：&lt;/td&gt;<br />&#160;&#160;&lt;td&gt;&lt;input type="text" name="mobile" id="mobile" maxlength="12" size="13"&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#ff0000"&gt;*&lt;/font&gt;&lt;/td&gt;<br />&#160;&lt;/tr&gt;<br />&#160;&lt;tr&gt;<br />&#160;&#160;&lt;td height="35" align="right"&gt;E - mail：&lt;/td&gt;<br />&#160;&#160;&lt;td&gt;&lt;input type="text" name="email" id="email" size="25" onChange="checkEmail();"&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#ff0000"&gt;*&lt;/font&gt;&lt;/td&gt;<br />&#160;&lt;/tr&gt;<br />&#160;&lt;tr&gt;<br />&#160;&#160;&lt;td height="86" align="right"&gt;个人简介：&lt;/td&gt;<br />&#160;&#160;&lt;td&gt;&lt;textarea cols="30" rows="4" class="text" name="memo" style="overflow:auto; border:1px #666666 solid; color:#3399FF;"&gt;&lt;/textarea&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#ff0000"&gt;*&lt;/font&gt;&lt;/td&gt;<br />&#160;&lt;/tr&gt;<br />&#160;&lt;tr&gt;<br />&#160;&#160;&lt;td height="10" colspan="2"&gt;&lt;/td&gt;<br />&#160;&lt;/tr&gt;<br />&#160;&lt;tr&gt;<br />&#160;&#160;&lt;td height="30" colspan="2" align="center" style="border-top:1px #666666 solid; "&gt;&lt;input onClick="javascript:addUser();" style="background-color:#666666; color:#FFFFFF; border:0; text-align:center; width:60px;" type="button" name="add" value="A D D"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;input style="background-color:#666666; color:#FFFFFF; border:0; width:60px;" type="reset" name="reset" value="R E T"&gt;&lt;/td&gt;<br />&#160;&lt;/tr&gt;<br />&#160;<br />&#160;&lt;/table&gt;<br />&#160;&lt;/form&gt;<br />&lt;/body&gt;<br />&lt;/html&gt;<br /></p>
		<p>
		</p>
		<hr />
		<p>/*<br />&#160;* Generated by MyEclipse Struts<br />&#160;* Template path: templates/java/JavaClass.vtl<br />&#160;*/<br />package com.rain.struts.action;</p>
		<p>import <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.io.IOException;</p>
		<p>import javax.servlet.http.HttpServletRequest;<br />import javax.servlet.http.HttpServletResponse;<br />import org.apache.struts.action.ActionForm;<br />import org.apache.struts.action.ActionForward;<br />import org.apache.struts.action.ActionMapping;<br />import org.apache.struts.actions.DispatchAction;<br />import org.apache.struts.validator.DynaValidatorForm;</p>
		<p>import com.rain.bean.Regist;</p>
		<p>/** <br />&#160;* MyEclipse Struts<br />&#160;* Creation date: 09-12-2006<br />&#160;* <br />&#160;* XDoclet definition:<br />&#160;* @struts.action parameter="method" validate="true"<br />&#160;*/<br />public class LoginAction extends DispatchAction {<br />&#160;</p>
		<p>&#160;/** <br />&#160; * Method execute<br />&#160; * @param mapping<br />&#160; * @param form<br />&#160; * @param request<br />&#160; * @param response<br />&#160; * @return ActionForward<br />&#160; */<br />&#160;public ActionForward checkUserName(ActionMapping mapping, ActionForm form,<br />&#160;&#160;&#160;HttpServletRequest request, HttpServletResponse response) {<br />&#160;&#160;Regist regist=new Regist();<br />&#160;&#160;DynaValidatorForm loginForm = (DynaValidatorForm)form;<br />&#160;&#160;String username=loginForm.getString("UserName");<br />&#160;&#160;System.out.println(username);<br />&#160;&#160;boolean flag=regist.findByName(username);<br />&#160;&#160;System.out.println("test");<br />&#160;&#160;if(flag)<br />&#160;&#160;{<br />&#160;&#160;&#160;try {<br />&#160;&#160;&#160;&#160;response.getWriter().write("sorry!");<br />&#160;&#160;&#160;} catch (IOException e) {<br />&#160;&#160;&#160;&#160;// TODO 自动生成 catch 块<br />&#160;&#160;&#160;&#160;e.printStackTrace();<br />&#160;&#160;&#160;}<br />&#160;&#160;}else<br />&#160;&#160;{<br />&#160;&#160;&#160;try {<br />&#160;&#160;&#160;&#160;response.getWriter().write("luck!");<br />&#160;&#160;&#160;} catch (IOException e) {<br />&#160;&#160;&#160;&#160;// TODO 自动生成 catch 块<br />&#160;&#160;&#160;&#160;e.printStackTrace();<br />&#160;&#160;&#160;}<br />&#160;&#160;}<br />&#160;&#160;&#160;&#160; <br />&#160;&#160;return null;<br />&#160;}<br />}<br /></p>
		<hr /><img src ="http://www.blogjava.net/rain1102/aggbug/69302.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2006-09-13 09:29 <a href="http://www.blogjava.net/rain1102/archive/2006/09/13/69302.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ajax+Struts+Hibernate实现动态搜索</title><link>http://www.blogjava.net/rain1102/archive/2006/09/13/69294.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Wed, 13 Sep 2006 01:19:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2006/09/13/69294.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/69294.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2006/09/13/69294.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/69294.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/69294.html</trackback:ping><description><![CDATA[<p>HTML源代码<br />&lt;%@ page language="<a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>" contentType="text/html; charset=UTF-8"%&gt;<br />&lt;html&gt;<br />&#160; &lt;head&gt;<br />&#160;&#160;&#160; &lt;title&gt;article.html&lt;/title&gt;<br />&#160; &lt;script type="text/javascript" src="js/common.js"&gt;&lt;/script&gt;<br />&#160; &lt;script type="text/javascript"&gt;<br />&#160; var completeDiv;<br />&#160; var inputField;<br />&#160; var nameTable;<br />&#160; var nameTableBody;<br />&#160; function initVars() {<br />&#160;&#160;&#160;&#160; inputField = document.getElementById("title");&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br />&#160;&#160;&#160;&#160; nameTable = document.getElementById("name_table");<br />&#160;&#160;&#160;&#160; completeDiv = document.getElementById("popup");<br />&#160;&#160;&#160;&#160; nameTableBody = document.getElementById("name_table_body");<br />&#160;&#160;&#160;&#160; <br />&#160; }<br />&#160;<br />&#160; function findNames(){<br />&#160;&#160; initVars();<br />&#160;&#160; if (inputField.value.length &gt; 0) {<br />&#160;&#160;&#160;&#160;&#160;&#160; createXMLHttpRequest();&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160; var url = "article.do?method=search&amp;title="+<font color="#ff1493">encodeURI</font>(inputField.value);&#160;&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160; xmlHttp.open("GET", url, true);<br />&#160;&#160;&#160;&#160;&#160;&#160; xmlHttp.onreadystatechange = callback;<br />&#160;&#160;&#160;&#160;&#160;&#160; xmlHttp.send(null);<br />&#160;&#160;&#160; } else {<br />&#160;&#160;&#160;&#160;&#160;&#160; clearNames();<br />&#160;&#160;&#160; }<br />&#160; }<br />&#160; function callback() {<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if (xmlHttp.readyState == 4) {<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if (xmlHttp.status == 200) {<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; var name = xmlHttp.responseXML.getElementsByTagName("title")[0].firstChild.data;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; setNames(xmlHttp.responseXML.getElementsByTagName("title"));<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; } else if (xmlHttp.status == 204){<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; clearNames();<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; function setNames(the_names) {&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; clearNames();<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; var size = the_names.length;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; setOffsets();</p>
		<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; var row, cell, txtNode;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; for (var i = 0; i &lt; size; i++) {<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; var nextNode = the_names[i].firstChild.data;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; row = document.createElement("tr");<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; cell = document.createElement("td");<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; cell.onmouseout = function() {this.className='mouseOver';};<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; cell.onmouseover = function() {this.className='mouseOut';};<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; cell.setAttribute("bgcolor", "#FFFAFA");<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; cell.setAttribute("border", "0");<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; cell.onclick = function() { populateName(this); } ;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </p>
		<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; txtNode = document.createTextNode(nextNode);<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; cell.appendChild(txtNode);<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; row.appendChild(cell);<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; nameTableBody.appendChild(row);<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</p>
		<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; function setOffsets() {<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; var end = inputField.offsetWidth;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; var left = calculateOffsetLeft(inputField);<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; var top = calculateOffsetTop(inputField) + inputField.offsetHeight;</p>
		<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; completeDiv.style.border = "black 1px solid";<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; completeDiv.style.left = left + "px";<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; completeDiv.style.top = top + "px";<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; nameTable.style.width = end + "px";<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; function calculateOffsetLeft(field) {<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return calculateOffset(field, "offsetLeft");<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</p>
		<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; function calculateOffsetTop(field) {<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return calculateOffset(field, "offsetTop");<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</p>
		<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; function calculateOffset(field, attr) {<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; var offset = 0;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; while(field) {<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; offset += field[attr]; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; field = field.offsetParent;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return offset;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }</p>
		<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; function populateName(cell) {<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; inputField.value = cell.firstChild.nodeValue;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; clearNames();<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br />&#160; function clearNames() {<br />&#160;&#160;&#160;&#160; var ind = nameTableBody.childNodes.length;<br />&#160;&#160;&#160;&#160; for (var i = ind - 1; i &gt;= 0 ; i--) {<br />&#160;&#160;&#160;&#160;&#160;&#160; nameTableBody.removeChild(nameTableBody.childNodes[i]);<br />&#160;&#160;&#160;&#160; }<br />&#160;&#160;&#160; completeDiv.style.border = "none";<br />&#160; }<br />&#160; &lt;/script&gt;<br />&#160; &lt;/head&gt;<br />&#160; <br />&#160; &lt;body&gt;<br />&#160;&#160;&#160; &lt;h3&gt;Ajax Auto Complete Example&lt;/h3&gt;<br />&#160;&#160;&#160; 请输入名称：&lt;input type="text" name="title" id="title" size="30" width="100" height="20" onkeyup="findNames();"&gt;<br />&#160;&#160;&#160; &lt;div style="position:absolute;" id="popup"&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;table id="name_table" bgcolor="#FFFAFA" border="0" cellspacing="0" cellpadding="0"/&gt;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;tbody id="name_table_body"&gt;&lt;/tbody&gt;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;/table&gt;<br />&#160;&#160;&#160; &lt;/div&gt;<br />&#160; &lt;/body&gt;<br />&lt;/html&gt;</p>
		<p>
		</p>
		<hr />
		<p>Action源代码<br />/*<br />&#160;* Generated by MyEclipse Struts<br />&#160;* Template path: templates/java/JavaClass.vtl<br />&#160;*/<br />package com.rain.struts.action;</p>
		<p>import <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.io.IOException;<br />import <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.io.PrintWriter;<br />import <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.io.UnsupportedEncodingException;<br />import <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.util.Iterator;</p>
		<p>import javax.servlet.http.HttpServletRequest;<br />import javax.servlet.http.HttpServletResponse;<br />import org.apache.struts.action.ActionForm;<br />import org.apache.struts.action.ActionForward;<br />import org.apache.struts.action.ActionMapping;<br />import org.apache.struts.actions.DispatchAction;<br />import org.apache.struts.validator.DynaValidatorForm;</p>
		<p>import com.rain.bean.ArticleDao;</p>
		<p>/** <br />&#160;* MyEclipse Struts<br />&#160;* Creation date: 09-12-2006<br />&#160;* <br />&#160;* XDoclet definition:<br />&#160;* @struts.action parameter="method"<br />&#160;*/<br />public class ArticleAction extends DispatchAction {<br />&#160;/*<br />&#160; * Generated Methods<br />&#160; */</p>
		<p>&#160;/** <br />&#160; * Method execute<br />&#160; * @param mapping<br />&#160; * @param form<br />&#160; * @param request<br />&#160; * @param response<br />&#160; * @return ActionForward<br />&#160; */<br />&#160;public ActionForward search(ActionMapping mapping, ActionForm form,<br />&#160;&#160;&#160;HttpServletRequest request, HttpServletResponse response) {<br />&#160;&#160;DynaValidatorForm articleForm = (DynaValidatorForm)form;<br />&#160;&#160;String title;<br />&#160;&#160;try {<br />&#160;&#160;&#160;title = new String(request.getParameter("title").getBytes("ISO8859_1"),"UTF-8");<br />&#160;&#160;&#160;System.out.println(title);<br />&#160;&#160;&#160;ArticleDao dao=new ArticleDao();<br />&#160;&#160;&#160;<br />&#160;&#160;&#160;Iterator it=dao.findAllName(title).iterator();<br />&#160;&#160;&#160;<br />&#160;&#160;&#160;if(it.hasNext()){<br />&#160;&#160;&#160;&#160;PrintWriter out;<br />&#160;&#160;&#160;&#160;try {<br />&#160;&#160;&#160;&#160;&#160;<br />&#160;&#160;&#160;&#160;&#160;response.setContentType("text/xml;charset=UTF-8");<br />&#160;&#160;&#160;&#160;&#160;response.setHeader("Cache-Control", "no-cache");<br />&#160;&#160;&#160;&#160;&#160;out = response.getWriter();<br />&#160;&#160;&#160;&#160;&#160;out.println("&lt;response&gt;");<br />&#160;&#160;&#160;&#160;&#160;while(it.hasNext()){<br />&#160;&#160;&#160;&#160;&#160;&#160;String name=it.next().toString();<br />&#160;&#160;&#160;&#160;&#160;&#160;out.println("&lt;title&gt;"+name+"&lt;/title&gt;");<br />&#160;&#160;&#160;&#160;&#160;}<br />&#160;&#160;&#160;&#160;&#160;out.println("&lt;/response&gt;");<br />&#160;&#160;&#160;&#160;&#160;it=null;<br />&#160;&#160;&#160;&#160;&#160;out.close();<br />&#160;&#160;&#160;&#160;} catch (IOException e) {<br />&#160;&#160;&#160;&#160;&#160;// TODO 自动生成 catch 块<br />&#160;&#160;&#160;&#160;&#160;e.printStackTrace();<br />&#160;&#160;&#160;&#160;}<br />&#160;&#160;&#160;&#160;<br />&#160;&#160;&#160;}else{<br />&#160;&#160;&#160;&#160;response.setStatus(HttpServletResponse.SC_NO_CONTENT);<br />&#160;&#160;&#160;}<br />&#160;&#160;} catch (UnsupportedEncodingException e1) {<br />&#160;&#160;&#160;// TODO 自动生成 catch 块<br />&#160;&#160;&#160;e1.printStackTrace();<br />&#160;&#160;}<br />&#160;&#160;<br />&#160;&#160;<br />&#160;&#160;return null;<br />&#160;}<br />}</p>
		<hr />
		<br />Dao源代码<br />/**<br />&#160;<a href="mailto:*@type_name">*@type_name</a>: ArticleDao<br />&#160;<a href="mailto:*@date">*@date</a>: 2006-9-13<br />&#160;<a href="mailto:*@author">*@author</a> scott_zhou<br />&#160;*/<br />package com.rain.bean; 
<p>import <a title="Java爱好者" href="http://www.blogjava.net/rain1102" >Java</a>.util.List;</p><p>import org.hibernate.Query;<br />import org.hibernate.Session;<br />import org.hibernate.Transaction;</p><p>import com.rain.HibernateSessionFactory;</p><p>/**<br />&#160;*<br />&#160;*/<br />public class ArticleDao {</p><p>&#160;public List findAllName(String title){<br />&#160;&#160;System.out.println("11");<br />&#160; String hql="select art.title from Article art where art.title like '"+title+"%'";<br />&#160;&#160; &#160; List list=null;<br />&#160;&#160; &#160; try{<br />&#160;&#160; &#160;&#160; <br />&#160;&#160; &#160;&#160; Session session=HibernateSessionFactory.getCurrentSession();</p><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;Transaction tx=session.beginTransaction();<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Query query=session.createQuery(hql);<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; list=query.list();<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; tx.commit();<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; session.close();<br />&#160;&#160; &#160; }catch(Exception e){<br />&#160;&#160; &#160;&#160; System.out.println(e.getMessage());<br />&#160;&#160; &#160;&#160; e.printStackTrace();<br />&#160;&#160; &#160; }<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; return list;<br />&#160;}<br />}<br /></p><img src ="http://www.blogjava.net/rain1102/aggbug/69294.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2006-09-13 09:19 <a href="http://www.blogjava.net/rain1102/archive/2006/09/13/69294.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts标记库</title><link>http://www.blogjava.net/rain1102/archive/2006/09/06/68065.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Wed, 06 Sep 2006 08:51:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2006/09/06/68065.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/68065.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2006/09/06/68065.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/68065.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/68065.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: JSP				视窗组件所使用的				 struts				标记库由四类标记组成：																																								　						Bean						标记：用来在						JSP						页中管理														bean 						　　						...&nbsp;&nbsp;<a href='http://www.blogjava.net/rain1102/archive/2006/09/06/68065.html'>阅读全文</a><img src ="http://www.blogjava.net/rain1102/aggbug/68065.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2006-09-06 16:51 <a href="http://www.blogjava.net/rain1102/archive/2006/09/06/68065.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts 配置骨架</title><link>http://www.blogjava.net/rain1102/archive/2006/09/04/67610.html</link><dc:creator>Eric.Zhou</dc:creator><author>Eric.Zhou</author><pubDate>Mon, 04 Sep 2006 08:28:00 GMT</pubDate><guid>http://www.blogjava.net/rain1102/archive/2006/09/04/67610.html</guid><wfw:comment>http://www.blogjava.net/rain1102/comments/67610.html</wfw:comment><comments>http://www.blogjava.net/rain1102/archive/2006/09/04/67610.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/rain1102/comments/commentRss/67610.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/rain1102/services/trackbacks/67610.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: struts-config.xml																		&#160;												&lt;?xml version="1.0" encoding="ISO-8859-1" ?&gt;																												&lt;!DOCTYPE struts-config PUBLIC		...&nbsp;&nbsp;<a href='http://www.blogjava.net/rain1102/archive/2006/09/04/67610.html'>阅读全文</a><img src ="http://www.blogjava.net/rain1102/aggbug/67610.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/rain1102/" target="_blank">Eric.Zhou</a> 2006-09-04 16:28 <a href="http://www.blogjava.net/rain1102/archive/2006/09/04/67610.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>