﻿<?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-BaoYaEr-文章分类-开源opensource</title><link>http://www.blogjava.net/baoyaer/category/21722.html</link><description>java</description><language>zh-cn</language><lastBuildDate>Mon, 25 Jul 2011 16:39:06 GMT</lastBuildDate><pubDate>Mon, 25 Jul 2011 16:39:06 GMT</pubDate><ttl>60</ttl><item><title>mule事件驱动服务</title><link>http://www.blogjava.net/baoyaer/articles/354997.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Mon, 25 Jul 2011 08:17:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/354997.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/354997.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/354997.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/354997.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/354997.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: @import url(http://www.blogjava.net/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);面向服务的架构和事件驱动的架构天生就有着对分布式系统的适应性，这些架构都有着模块性、松散耦合，和适应性等特...&nbsp;&nbsp;<a href='http://www.blogjava.net/baoyaer/articles/354997.html'>阅读全文</a><img src ="http://www.blogjava.net/baoyaer/aggbug/354997.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2011-07-25 16:17 <a href="http://www.blogjava.net/baoyaer/articles/354997.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XPath语法</title><link>http://www.blogjava.net/baoyaer/articles/354820.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Thu, 21 Jul 2011 13:22:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/354820.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/354820.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/354820.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/354820.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/354820.html</trackback:ping><description><![CDATA[<h2>XML示例文档</h2>
<p>我们将使用如下的简单XML文档描述XPath语法：<br />
<br />
<br />
</p>
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000; "><br />
<span style="color: #0000FF; ">&lt;?</span><span style="color: #FF00FF; ">xml&nbsp;version="1.0"&nbsp;encoding="ISO-8859-1"</span><span style="color: #0000FF; ">?&gt;</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">catalog</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">cd&nbsp;</span><span style="color: #FF0000; ">country</span><span style="color: #0000FF; ">="USA"</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">title</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">Empire&nbsp;Burlesque</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">title</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">artist</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">Bob&nbsp;Dylan</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">artist</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">price</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">10.90</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">price</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">cd</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">cd&nbsp;</span><span style="color: #FF0000; ">country</span><span style="color: #0000FF; ">="UK"</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">title</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">Hide&nbsp;your&nbsp;heart</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">title</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">artist</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">Bonnie&nbsp;Tyler</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">artist</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">price</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">9.90</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">price</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">cd</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">cd&nbsp;</span><span style="color: #FF0000; ">country</span><span style="color: #0000FF; ">="USA"</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">title</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">Greatest&nbsp;Hits</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">title</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">artist</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">Dolly&nbsp;Parton</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">artist</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">price</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">9.90</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">price</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">cd</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />
&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">catalog</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />
</span></div>
<br />
<span  style="font-size: 21px; font-weight: bold; ">定位节点</span><br />
<p>XML文档可以看作是一个节点树（非常类似于计算机的树形文件夹）。</p>
<p>XPath使用模式表达式识别XML文档里的节点。一个XPath模式是一个以斜线分隔的子元素名列表，用于描述XML文档的一个路径。模式选择匹配该路径的元素。</p>
<p>
<p>下面的XPath表达式选择catalog元素的所有cd元素的所有price元素：</p>
<table cellspacing="0" width="100%" border="1">
    <tbody>
        <tr>
            <td>
            <p>/catalog/cd/price &nbsp; &nbsp; &nbsp;//如果路径以一个斜线（/）开始，代表相对于一个元素的绝对路径</p>
            </td>
        </tr>
    </tbody>
</table>
<p><strong><br />
</strong></p>
<strong>注意：</strong>&nbsp;如果路径以两个斜线开始，表示选择文档中所有符合该条件的元素（即使它们在不同的XML树的级别）！下面的XPath表达式选择catalog元素的所有cd元素的所有price元素：<br />
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000; ">//cd &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //<span  style="font-size: 14px; ">&nbsp;如果路径以两个斜线开始，表示选择文档中所有符合该条件的元素（即使它们在不同的XML树的级别）！下面的XPath表达式选择catalog元素的所有cd元素的所有price元素：</span></div>
<br />
<br />
<h2>选择未知元素</h2>
<p>通配符（*）用来选择未知XML元素。</p>
<p>
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000; ">/catalog/cd/* &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//<span  style="font-size: 14px; ">XPath表达式选择catalog元素下所有cd元素的所有子元素</span></div>
</p>
</span><br />
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000; ">/catalog/*/price &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //</span><span  style="font-size: 14px; ">XPath表达式选择catalog元素的孙子元素下所有的price元素</span></div>
</p>
</span><br />
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000; ">/*/*/price &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //<span  style="font-size: 14px; ">XPath表达式选择有两个祖先的所有price元素</span></span></div>
<br />
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000; ">//* &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //</span><span  style="font-size: 14px; ">XPath表达式选择文档中所有元素</span></div>
<br />
<br />
<h2>选择分支</h2>
<p>通过在XPath表达式中使用方括号可以进一步地指定一个元素。<br />
<br />
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000; "><br />
/catalog/cd[1] &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//<span  style="font-size: 14px; ">XPath表达式选择catalog元素的第一个cd子元素</span></div>
<br />
</p>
<p>
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000; ">/catalog/cd[last()] &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//</span><span  style="font-size: 14px; ">XPath表达式选择catalog元素的最后一个子元素</span></div>
</p>
</span><br />
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000; ">/catalog/cd[price] &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//</span><span  style="font-size: 14px; ">XPath表达式选择catalog元素下含有price子元素的所有cd元素</span></div>
<br />
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000; ">/catalog/cd[price=10.90] &nbsp; &nbsp; &nbsp; &nbsp; //</span><span  style="font-size: 14px; ">XPath表达式选择catalog元素下子元素price值等于10.90的所有cd元素</span></div>
<br />
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000; ">/catalog/cd[price=10.90]/price &nbsp; //</span><span  style="font-size: 14px; ">XPath表达式选择catalog元素下price元素值等于10.90的所有cd元素的price元素</span></div>
<br />
<br />
<br />
<h2>选择多个路径</h2>
<p>通过在XPath表达式中使用|操作符，可以选择多个路径。</p>
<p>下面的XPath表达式选择catalog元素的子元素cd元素下所有的title和artist元素：<br />
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000; ">/catalog/cd/title&nbsp;|&nbsp;/catalog/cd/artist &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//<span  style="font-size: 14px; ">XPath表达式选择catalog元素的子元素cd元素下所有的title和artist元素</span></div>
</p>
</span><br />
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><span style="color: #000000; ">//title&nbsp;|&nbsp;//artist &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //</span><span  style="font-size: 14px; ">XPath表达式选择文档中所有title元素和artist元素：</span></div>
<br />
<br />
<h2>选择属性</h2>
<p>在XPath中，所有属性以前缀@指定。</p>
<p>下面的XPath表达式选择所有名为country的属性：<br />
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000; ">//@country &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //<span  style="font-size: 14px; ">XPath表达式选择所有名为country的属性</span></div>
</p>
</span><br />
<div style="font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; background-color: #eeeeee; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000; ">//cd[@country] &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //</span><span  style="font-size: 14px; ">XPath表达式选择所有含有country属性的cd元素：</span></div>
<br />
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000; ">//cd[@*] &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //</span><span  style="font-size: 14px; ">XPath表达式选择选择所有含有任何属性的cd元素</span></div>
<br />
<div style="background-color: #eeeeee; font-size: 13px; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000; ">//cd[@country='UK'] &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //</span><span  style="font-size: 14px; ">XPath表达式选择属性country等于UK的所有cd元素</span></div>
<br />
<br />
<br />
<br />
<br />
<br />
<p>&nbsp;</p>
</span>
@import url(http://www.blogjava.net/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);<img src ="http://www.blogjava.net/baoyaer/aggbug/354820.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2011-07-21 21:22 <a href="http://www.blogjava.net/baoyaer/articles/354820.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mule示例分析</title><link>http://www.blogjava.net/baoyaer/articles/354806.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Thu, 21 Jul 2011 08:27:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/354806.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/354806.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/354806.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/354806.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/354806.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 一、Hello World&nbsp;（主要演示了两个service component链式合作处理一条消息和消息格式转换1、示例翻译：&nbsp;&nbsp;展示了如何配置多个service components&#8212;&#8212;它们与一个请求交互（就是说二者合作以链式方式先后处理一个请求消息，处理的方式是添加消息的内容），以及如何管理事件转换（所谓事件就是消息，这里的事件转换...&nbsp;&nbsp;<a href='http://www.blogjava.net/baoyaer/articles/354806.html'>阅读全文</a><img src ="http://www.blogjava.net/baoyaer/aggbug/354806.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2011-07-21 16:27 <a href="http://www.blogjava.net/baoyaer/articles/354806.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在xml的汪洋中遨游之mule篇</title><link>http://www.blogjava.net/baoyaer/articles/353499.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Fri, 01 Jul 2011 03:52:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/353499.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/353499.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/353499.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/353499.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/353499.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: mule号称开源ESB的最好实现，研究mule也有段时间了， 在&#8220;浩如烟海&#8221;的xml配置中，保持清醒的头脑确实不容易。&nbsp;作为学习笔记之一，记录一下一个mule简单应用的实现。需求：给指定的email地址发送邮件.&nbsp;一：基本实现：&nbsp;1: 实现命令行输入发送email：&nbsp;为了能在命令行接受输入， 需要配置一个输入输出连...&nbsp;&nbsp;<a href='http://www.blogjava.net/baoyaer/articles/353499.html'>阅读全文</a><img src ="http://www.blogjava.net/baoyaer/aggbug/353499.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2011-07-01 11:52 <a href="http://www.blogjava.net/baoyaer/articles/353499.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EqualsBuilder和HashCodeBuilder </title><link>http://www.blogjava.net/baoyaer/articles/311311.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Sat, 30 Jan 2010 03:07:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/311311.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/311311.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/311311.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/311311.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/311311.html</trackback:ping><description><![CDATA[<font size="2">自动化hashCode()和equals() &nbsp; 问题产生：当需要自动实现hashCode()和equals()方法 &nbsp; 解决方法：使用<font face="Courier New">EqualsBuilder和</font><tt>HashCodeBuilder</tt></font> <font size="2">使用举例：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;&nbsp;org.apache.commons.lang.builder.HashCodeBuilder;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;&nbsp;org.apache.commons.lang.builder.EqualsBuilder;&nbsp;<br />
<img id="Codehighlighter1_151_1053_Open_Image" onclick="this.style.display='none'; Codehighlighter1_151_1053_Open_Text.style.display='none'; Codehighlighter1_151_1053_Closed_Image.style.display='inline'; Codehighlighter1_151_1053_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_151_1053_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_151_1053_Closed_Text.style.display='none'; Codehighlighter1_151_1053_Open_Image.style.display='inline'; Codehighlighter1_151_1053_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;&nbsp;PoliticalCandidate&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_151_1053_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_151_1053_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;Member&nbsp;variables&nbsp;-&nbsp;omitted&nbsp;for&nbsp;brevity&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;Constructors&nbsp;-&nbsp;omitted&nbsp;for&nbsp;brevity&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;get/set&nbsp;methods&nbsp;-&nbsp;omitted&nbsp;for&nbsp;brevity&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;A&nbsp;hashCode&nbsp;which&nbsp;creates&nbsp;a&nbsp;hash&nbsp;from&nbsp;the&nbsp;two&nbsp;unique&nbsp;identifiers&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
<img id="Codehighlighter1_388_529_Open_Image" onclick="this.style.display='none'; Codehighlighter1_388_529_Open_Text.style.display='none'; Codehighlighter1_388_529_Closed_Image.style.display='inline'; Codehighlighter1_388_529_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_388_529_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_388_529_Closed_Text.style.display='none'; Codehighlighter1_388_529_Open_Image.style.display='inline'; Codehighlighter1_388_529_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;&nbsp;hashCode(&nbsp;)&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_388_529_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_388_529_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;&nbsp;HashCodeBuilder(&nbsp;</span><span style="color: #000000">17</span><span style="color: #000000">&nbsp;,&nbsp;&nbsp;</span><span style="color: #000000">37</span><span style="color: #000000">&nbsp;)&nbsp;&nbsp;.append(firstName)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.append(lastName).toHashCode(&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;An&nbsp;equals&nbsp;which&nbsp;compares&nbsp;two&nbsp;unique&nbsp;identifiers&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
<img id="Codehighlighter1_640_1051_Open_Image" onclick="this.style.display='none'; Codehighlighter1_640_1051_Open_Text.style.display='none'; Codehighlighter1_640_1051_Closed_Image.style.display='inline'; Codehighlighter1_640_1051_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_640_1051_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_640_1051_Closed_Text.style.display='none'; Codehighlighter1_640_1051_Open_Image.style.display='inline'; Codehighlighter1_640_1051_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">boolean</span><span style="color: #000000">&nbsp;&nbsp;equals(Object&nbsp;o)&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_640_1051_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_640_1051_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">boolean</span><span style="color: #000000">&nbsp;&nbsp;equals&nbsp;&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">&nbsp;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img id="Codehighlighter1_770_1014_Open_Image" onclick="this.style.display='none'; Codehighlighter1_770_1014_Open_Text.style.display='none'; Codehighlighter1_770_1014_Closed_Image.style.display='inline'; Codehighlighter1_770_1014_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_770_1014_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_770_1014_Closed_Text.style.display='none'; Codehighlighter1_770_1014_Open_Image.style.display='inline'; Codehighlighter1_770_1014_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;&nbsp;(&nbsp;o&nbsp;&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;PoliticalCandidate.&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;.isAssignableFrom(o)&nbsp;)&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_770_1014_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_770_1014_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PoliticalCandidate&nbsp;pc&nbsp;&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;&nbsp;(PoliticalCandidate)&nbsp;o;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;equals&nbsp;&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;&nbsp;(&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;&nbsp;EqualsBuilder(&nbsp;)&nbsp;.append(firstName,&nbsp;ps.firstName)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.append(lastName,&nbsp;ps.lastName)).isEquals(&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;&nbsp;equals;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000">&nbsp;&nbsp;</span></div>
<br />
<font size="2">Discussion： 1.在上述例子中，当有相同的firstname和lastname时,认为两个对象的hashCode相同，从而equals()返回true. 如果hashCode取决于该class的所有filed时需要使用反射机制来产生一个hashCode。 <br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_28_94_Open_Image" onclick="this.style.display='none'; Codehighlighter1_28_94_Open_Text.style.display='none'; Codehighlighter1_28_94_Closed_Image.style.display='inline'; Codehighlighter1_28_94_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_28_94_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_28_94_Closed_Text.style.display='none'; Codehighlighter1_28_94_Open_Image.style.display='inline'; Codehighlighter1_28_94_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;&nbsp;hashCode(&nbsp;)&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_28_94_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_28_94_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;&nbsp;HashCodeBuilder.reflectionHashCode(&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">&nbsp;);&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;</span></div>
<p><br />
<font size="2"><font face="Courier New">和ToStringBuilder</font>&nbsp;与 <tt>HashCodeBuilder一样</tt><tt>EqualsBuilder</tt> 也是使用append()方法进行配置，</font> <font size="2"><font face="Courier New">EqualsBuilder的append()方法可以接受基本类型、对象、数组作为参数。EqualsBuilder强大的地方在于可以直接把数组作为参数传入append()方法，EqualsBuilder会依次比较数组中的每个元素。<br />
<br />
2.如果两个对象相等当且仅当每个属性值都相等 这句话可以由以下代码实现： </font></font></p>
<p><font size="2"><font face="Courier New">&nbsp;</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_37_102_Open_Image" onclick="this.style.display='none'; Codehighlighter1_37_102_Open_Text.style.display='none'; Codehighlighter1_37_102_Closed_Image.style.display='inline'; Codehighlighter1_37_102_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_37_102_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_37_102_Closed_Text.style.display='none'; Codehighlighter1_37_102_Open_Image.style.display='inline'; Codehighlighter1_37_102_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">boolean</span><span style="color: #000000">&nbsp;&nbsp;equals(Object&nbsp;o)&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_37_102_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_37_102_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;&nbsp;EqualsBuilder.reflectionEquals(&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">&nbsp;,&nbsp;o);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
<p><br />
&nbsp;</p>
<p><font size="2">问题提出：需要快速实现compareTo()方法解决方法：使用<font face="Courier New"><font color="#ff0000">CompareToBuilder</font>提供的<font color="#ff0000">compareTo()</font>方法。同样的CompareToBuilder也使用了反射机制。以下代码提供了一个compareTo()方法，用于比较两个对象所有的非static和非transient成员变量。 </font></font></p>
<p>&nbsp;</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;&nbsp;org.apache.commons.lang.builder.CompareToBuilder;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;Build&nbsp;a&nbsp;compareTo&nbsp;function&nbsp;from&nbsp;reflection&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
<img id="Codehighlighter1_149_220_Open_Image" onclick="this.style.display='none'; Codehighlighter1_149_220_Open_Text.style.display='none'; Codehighlighter1_149_220_Closed_Image.style.display='inline'; Codehighlighter1_149_220_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_149_220_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_149_220_Closed_Text.style.display='none'; Codehighlighter1_149_220_Open_Image.style.display='inline'; Codehighlighter1_149_220_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;&nbsp;compareTo(Object&nbsp;o)&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_149_220_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_149_220_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;&nbsp;CompareToBuilder.reflectionCompare(&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">&nbsp;,&nbsp;obj);&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;</span></div>
<p><font face="Verdana" size="2">Discussion：</font> <font size="2"><font face="Courier New">CompareToBuilder.reflectionCompare()提供了两个对象non-static和nontransient成员变量的方法。 reflectionCompare()方法不予理会static和transient变量，因此以下代码中的averageAge和fullName变量是不会进入比较表达式的。 </font></font><br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_38_474_Open_Image" onclick="this.style.display='none'; Codehighlighter1_38_474_Open_Text.style.display='none'; Codehighlighter1_38_474_Closed_Image.style.display='inline'; Codehighlighter1_38_474_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_38_474_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_38_474_Closed_Text.style.display='none'; Codehighlighter1_38_474_Open_Image.style.display='inline'; Codehighlighter1_38_474_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;&nbsp;PoliticalCandidate&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_38_474_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_38_474_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;Static&nbsp;variable&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;&nbsp;String&nbsp;averageAge;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;Member&nbsp;variables&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;&nbsp;String&nbsp;firstName;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;&nbsp;String&nbsp;lastName;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">transient</span><span style="color: #000000">&nbsp;&nbsp;String&nbsp;fullName;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;Constructors&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;get/set&nbsp;methods&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;Build&nbsp;a&nbsp;compareTo&nbsp;function&nbsp;from&nbsp;reflection&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
<img id="Codehighlighter1_384_467_Open_Image" onclick="this.style.display='none'; Codehighlighter1_384_467_Open_Text.style.display='none'; Codehighlighter1_384_467_Closed_Image.style.display='inline'; Codehighlighter1_384_467_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_384_467_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_384_467_Closed_Text.style.display='none'; Codehighlighter1_384_467_Open_Image.style.display='inline'; Codehighlighter1_384_467_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;&nbsp;compareTo(Object&nbsp;o)&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_384_467_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_384_467_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;&nbsp;CompareToBuilder.reflectionCompare(&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">&nbsp;,&nbsp;obj);&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;</span></div>
<p><br />
<font face="Verdana" size="2">比较对象成员变量的时候应该有一个比较的次序存在，上述代码中默认的应该是先比较lastName,然后是firstName。调用append()方法可以把要比较的变量加入比较表达式中，并且遵循后加入的先比较的次序。例如： </p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_36_455_Open_Image" onclick="this.style.display='none'; Codehighlighter1_36_455_Open_Text.style.display='none'; Codehighlighter1_36_455_Closed_Image.style.display='inline'; Codehighlighter1_36_455_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_36_455_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_36_455_Closed_Text.style.display='none'; Codehighlighter1_36_455_Open_Image.style.display='inline'; Codehighlighter1_36_455_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;&nbsp;compareTo(Object&nbsp;o)&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_36_455_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_36_455_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;&nbsp;compare&nbsp;&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;By&nbsp;default&nbsp;return&nbsp;less-than&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
<img id="Codehighlighter1_192_421_Open_Image" onclick="this.style.display='none'; Codehighlighter1_192_421_Open_Text.style.display='none'; Codehighlighter1_192_421_Closed_Image.style.display='inline'; Codehighlighter1_192_421_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_192_421_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_192_421_Closed_Text.style.display='none'; Codehighlighter1_192_421_Open_Image.style.display='inline'; Codehighlighter1_192_421_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(&nbsp;o&nbsp;&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;&nbsp;PoliticalCandidate.&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;.isAssignableFrom(&nbsp;o.getClass(&nbsp;)&nbsp;)&nbsp;)&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_192_421_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_192_421_Open_Text"><span style="color: #000000">{&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PoliticalCandidate&nbsp;pc&nbsp;&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;&nbsp;(PoliticalCandidate)&nbsp;o;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;compare&nbsp;&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;&nbsp;(&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;&nbsp;CompareToBuilder(&nbsp;)&nbsp;.append(firstName,&nbsp;pc.firstName)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.append(lastName,&nbsp;pc.lastName)).toComparison(&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;&nbsp;compare;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<br />
<p></font><font size="2">在比较的时候会先比较lastName，只有在lastName相同的情况下才会比较firstName。 ps：实现compareTo()的时候应保证和equals()规则相同，即当compareTo()返回是0的时候equals()应该返回true。 </font><br />
<strong>ReflectionToStringBuilder <br />
<br />
</strong></p>
</font></font></font></font>1.使用ReflectionToStringBuilder 或者ToStringBuilder 自动产生toString()的内容。&nbsp;&nbsp;&nbsp; 使用举例：假设有一个表征校长候选人信息的javabean－PoliticalCandidate。 <br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_32_327_Open_Image" onclick="this.style.display='none'; Codehighlighter1_32_327_Open_Text.style.display='none'; Codehighlighter1_32_327_Closed_Image.style.display='inline'; Codehighlighter1_32_327_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_32_327_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_32_327_Closed_Text.style.display='none'; Codehighlighter1_32_327_Open_Image.style.display='inline'; Codehighlighter1_32_327_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;PoliticalCandidate&nbsp;</span><span id="Codehighlighter1_32_327_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_32_327_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;lastName;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;String&nbsp;firstName;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;Date&nbsp;dateOfBirth;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;BigDecimal&nbsp;moneyRaised;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;State&nbsp;homeState;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;get/set方法省略&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
<img id="Codehighlighter1_262_324_Open_Image" onclick="this.style.display='none'; Codehighlighter1_262_324_Open_Text.style.display='none'; Codehighlighter1_262_324_Closed_Image.style.display='inline'; Codehighlighter1_262_324_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_262_324_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_262_324_Closed_Text.style.display='none'; Codehighlighter1_262_324_Open_Image.style.display='inline'; Codehighlighter1_262_324_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&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;toString(&nbsp;)&nbsp;</span><span id="Codehighlighter1_262_324_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_262_324_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ReflectionToStringBuilder.toString(&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">&nbsp;);&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<br />
该bean里面有个toString()方法，假设有以下操作： <br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Create&nbsp;a&nbsp;State</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">State&nbsp;va&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;State(&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">VA</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Virginia</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Create&nbsp;a&nbsp;Birth&nbsp;Date</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">Calendar&nbsp;calendar&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;GregorianCalendar(&nbsp;);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />calendar.set(&nbsp;Calendar.YEAR,&nbsp;</span><span style="color: #000000">1743</span><span style="color: #000000">&nbsp;);&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />calendar.set(&nbsp;Calendar.MONTH,&nbsp;Calendar.APRIL&nbsp;);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />calendar.set(&nbsp;Calendar.DAY_OF_MONTH,&nbsp;</span><span style="color: #000000">13</span><span style="color: #000000">&nbsp;);&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />Date&nbsp;dob&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;calendar.getTime(&nbsp;);&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />BigDecimal&nbsp;moneyRaised&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;BigDecimal(&nbsp;</span><span style="color: #000000">293829292.93</span><span style="color: #000000">&nbsp;);&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;Create&nbsp;a&nbsp;Political&nbsp;Candidate</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">PoliticalCandidate&nbsp;candidate&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;PoliticalCandidate(&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Jefferson</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Thomas</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;dob,&nbsp;moneyRaised,&nbsp;va&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />System.out.println(&nbsp;candidate&nbsp;);&nbsp;</span></div>
<br />
假设State对象也是一个使用ReflectionToStringBuilder的javabean，上述程序一种可能的输出为com.discursive.jccook.lang.builders.PoliticalCandidate@187aeca&nbsp;&nbsp;&nbsp;&nbsp; [lastName=Jefferson,\firstName=Thomas,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dateOfBirth=Sat Apr 13 22:38:42 CST 1743,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; moneyRaised=\293829292.930000007152557373046875,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; state=\com.discursive.jccook.lang.builders.State@87816d&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [abbreviation=VA,name=Virginia]]<br />
<br />
org.apache.commons.lang.builder 　　CompareToBuilder &#8211; 用于辅助实现Comparable.compareTo(Object)方法；　　　　<br />
EqualsBuilder &#8211; 用于辅助实现Object.equals()方法；　　　　<br />
HashCodeBuilder &#8211; 用于辅助实现Object.hashCode()方法；　　<br />
ToStringBuilder &#8211; 用于辅助实现Object.toString()方法；　　　<br />
ReflectionToStringBuilder &#8211; 使用反射机制辅助实现Object.toString()方法；　　　<br />
ToStringStyle &#8211; 辅助ToStringBuilder控制输出格式；　　　　<br />
StandardToStringStyle &#8211; 辅助ToStringBuilder控制标准格式。 <br />
<img src ="http://www.blogjava.net/baoyaer/aggbug/311311.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2010-01-30 11:07 <a href="http://www.blogjava.net/baoyaer/articles/311311.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>webservice  cfx学习</title><link>http://www.blogjava.net/baoyaer/articles/310729.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Mon, 25 Jan 2010 06:44:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/310729.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/310729.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/310729.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/310729.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/310729.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 第一步：新建一个webservice接口 @WebService&nbsp;&nbsp;public&nbsp;interface&nbsp;IHelloWorld&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//@WebParam给参数命名，提高可代码可读性。此项可选&nbsp;&nbsp;&nbsp;blic&nbsp;Str...&nbsp;&nbsp;<a href='http://www.blogjava.net/baoyaer/articles/310729.html'>阅读全文</a><img src ="http://www.blogjava.net/baoyaer/aggbug/310729.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2010-01-25 14:44 <a href="http://www.blogjava.net/baoyaer/articles/310729.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JTA事务初级研究</title><link>http://www.blogjava.net/baoyaer/articles/248196.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Thu, 25 Dec 2008 01:28:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/248196.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/248196.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/248196.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/248196.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/248196.html</trackback:ping><description><![CDATA[一般情况下，J2EE应用服务器支持JDBC事务、JTA事务、容器管理事务。这里讨论JTA和JDBC事务的区别。这2个是常用的DAO模式事务界定方式。<br />
&nbsp;<strong>JDBC 事务<br />
</strong>&nbsp;JDBC 事务是用 Connection 对象控制的。JDBC Connection 接口( java.sql.Connection )提供了两种事务模式：自动提交和手工提交。<br />
★ 在jdbc中，事务操作缺省是自动提交。也就是说，一条对数据库的更新表达式代表一项事务操作，操作成功后，系统将自动调用commit()来提交，否则将调用rollback()来回滚。<br />
★&nbsp; 在jdbc中，可以通过调用setAutoCommit(false)来禁止自动提交。之后就可以把多个数据库操作的表达式作为一个事务，在操作完成后调 用commit()来进行整体提交，倘若其中一个表达式操作失败，都不会执行到commit()，并且将产生响应的异常；此时就可以在异常捕获时调用 rollback()进行回滚。这样做可以保持多次更新操作后，相关数据的一致性，示例如下：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_4_259_Open_Image" onclick="this.style.display='none'; Codehighlighter1_4_259_Open_Text.style.display='none'; Codehighlighter1_4_259_Closed_Image.style.display='inline'; Codehighlighter1_4_259_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_4_259_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_4_259_Closed_Text.style.display='none'; Codehighlighter1_4_259_Open_Image.style.display='inline'; Codehighlighter1_4_259_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_4_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 src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_4_259_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;conn&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;DriverManager.getConnection&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;conn.setAutoCommit(</span><span style="color: #0000ff">false</span><span style="color: #000000">);</span><span style="color: #008000">//</span><span style="color: #008000">禁止自动提交，设置回滚点</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;stmt&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;conn.createStatement();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;stmt.executeUpdate(&#8220;alter&nbsp;table&nbsp;&#8230;&#8221;);&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">数据库更新操作1</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;stmt.executeUpdate(&#8220;insert&nbsp;into&nbsp;table&nbsp;&#8230;&#8221;);&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">数据库更新操作2</span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;conn.commit();&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">事务提交</span><span style="color: #008000"><br />
<img id="Codehighlighter1_280_412_Open_Image" onclick="this.style.display='none'; Codehighlighter1_280_412_Open_Text.style.display='none'; Codehighlighter1_280_412_Closed_Image.style.display='inline'; Codehighlighter1_280_412_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_280_412_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_280_412_Closed_Text.style.display='none'; Codehighlighter1_280_412_Open_Image.style.display='inline'; Codehighlighter1_280_412_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #000000">}</span></span><span style="color: #0000ff">catch</span><span style="color: #000000">(Exception&nbsp;ex)&nbsp;</span><span id="Codehighlighter1_280_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 src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_280_412_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;ex.printStackTrace();<br />
<img id="Codehighlighter1_318_357_Open_Image" onclick="this.style.display='none'; Codehighlighter1_318_357_Open_Text.style.display='none'; Codehighlighter1_318_357_Closed_Image.style.display='inline'; Codehighlighter1_318_357_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_318_357_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_318_357_Closed_Text.style.display='none'; Codehighlighter1_318_357_Open_Image.style.display='inline'; Codehighlighter1_318_357_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_318_357_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_318_357_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn.rollback();&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">操作不成功则回滚</span><span style="color: #008000"><br />
<img id="Codehighlighter1_377_410_Open_Image" onclick="this.style.display='none'; Codehighlighter1_377_410_Open_Text.style.display='none'; Codehighlighter1_377_410_Closed_Image.style.display='inline'; Codehighlighter1_377_410_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_377_410_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_377_410_Closed_Text.style.display='none'; Codehighlighter1_377_410_Open_Image.style.display='inline'; Codehighlighter1_377_410_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #0000ff">catch</span><span style="color: #000000">(Exception&nbsp;e)&nbsp;</span><span id="Codehighlighter1_377_410_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_377_410_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<br />
JDBC 事务的一个缺点是事务的范围局限于一个数据库连接。一个 JDBC 事务不能跨越多个数据库。<br />
<br />
<strong>&nbsp;JTA事务</strong><br />
&nbsp;JTA(Java Transaction API) 为 J2EE 平台提供了分布式事务服务。<br />
&nbsp;要用 JTA 进行事务界定，应用程序要调用 javax.transaction.UserTransaction 接口中的方法。例如：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;utx.begin();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DataSource&nbsp;ds&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;obtainXADataSource();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Connection&nbsp;conn&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ds.getConnection();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pstmt&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;conn.prepareStatement(</span><span style="color: #000000">"</span><span style="color: #000000">UPDATE&nbsp;MOVIES&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pstmt.setString(</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Spinal&nbsp;Tap</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pstmt.executeUpdate();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span style="color: #008000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;utx.commit();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
&#8220;用 JTA 界定事务，那么就需要有一个实现 javax.sql.XADataSource 、 javax.sql.XAConnection 和 javax.sql.XAResource 接口的 JDBC 驱动程序。一个实现了这些接口的驱动程序将可以参与 JTA 事务。一个 XADataSource 对象就是一个 XAConnection 对象的工厂。 XAConnection s 是参与 JTA 事务的 JDBC 连接。&#8221;<br />
&nbsp;要使用JTA事务，必须使用XADataSource来产生数据库连接，产生的连接为一个XA连接。<br />
&nbsp;XA连接（javax.sql.XAConnection）和非XA（java.sql.Connection）连接的区别在于：XA可以参与JTA的事务，而且不支持自动提交。<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">&nbsp;Note:<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />Oracle,&nbsp;Sybase,&nbsp;DB2,&nbsp;SQL&nbsp;Server等大型数据库才支持XA,&nbsp;支持分布事务。&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />My&nbsp;SQL&nbsp;连本地都支持不好，更别说分布事务了。</span></div>
<br />
JTA方式的实现过程：<br />
&nbsp;&nbsp; 用XADataSource产生的XAConnection它扩展了一个getXAResource()方法,事务通过这个方法把它加入到事务容器中进行 管理.对于调用者来说,根本看不到事务是如果管理的,你只要声明开始事务,告诉容器我下面的操作要求事务参与了,最后告诉事务说到这儿可以提交或回滚了, 别的都是黑箱操作。<br />
&nbsp;在使用JTA之前，你必须首先实现一个Xid类用来标识事务（在普通情况下这将由事务管理程序来处理）。Xid包含三个元素：formatID、gtrid（全局事务标识符）和bqual（分支修饰词标识符）。<br />
&nbsp;下面的例子说明Xid的实现：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;javax.transaction.xa.</span><span style="color: #000000">*</span><span style="color: #000000">;&nbsp;<br />
<img id="Codehighlighter1_66_523_Open_Image" onclick="this.style.display='none'; Codehighlighter1_66_523_Open_Text.style.display='none'; Codehighlighter1_66_523_Closed_Image.style.display='inline'; Codehighlighter1_66_523_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_66_523_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_66_523_Closed_Text.style.display='none'; Codehighlighter1_66_523_Open_Image.style.display='inline'; Codehighlighter1_66_523_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;MyXid&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;Xid&nbsp;</span><span id="Codehighlighter1_66_523_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_66_523_Open_Text"><span style="color: #000000">{&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;formatId;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">&nbsp;gtrid[];&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">&nbsp;bqual[];&nbsp;<br />
<img id="Codehighlighter1_171_177_Open_Image" onclick="this.style.display='none'; Codehighlighter1_171_177_Open_Text.style.display='none'; Codehighlighter1_171_177_Closed_Image.style.display='inline'; Codehighlighter1_171_177_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_171_177_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_171_177_Closed_Text.style.display='none'; Codehighlighter1_171_177_Open_Image.style.display='inline'; Codehighlighter1_171_177_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;MyXid()&nbsp;</span><span id="Codehighlighter1_171_177_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_171_177_Open_Text"><span style="color: #000000">{&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;<br />
<img id="Codehighlighter1_238_325_Open_Image" onclick="this.style.display='none'; Codehighlighter1_238_325_Open_Text.style.display='none'; Codehighlighter1_238_325_Closed_Image.style.display='inline'; Codehighlighter1_238_325_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_238_325_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_238_325_Closed_Text.style.display='none'; Codehighlighter1_238_325_Open_Image.style.display='inline'; Codehighlighter1_238_325_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;MyXid(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;formatId,&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">&nbsp;gtrid[],&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">&nbsp;bqual[])&nbsp;</span><span id="Codehighlighter1_238_325_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_238_325_Open_Text"><span style="color: #000000">{&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.formatId&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;formatId;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.gtrid&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;gtrid;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.bqual&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;bqual;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_355_384_Open_Image" onclick="this.style.display='none'; Codehighlighter1_355_384_Open_Text.style.display='none'; Codehighlighter1_355_384_Closed_Image.style.display='inline'; Codehighlighter1_355_384_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_355_384_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_355_384_Closed_Text.style.display='none'; Codehighlighter1_355_384_Open_Image.style.display='inline'; Codehighlighter1_355_384_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />　</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;getFormatId()&nbsp;</span><span id="Codehighlighter1_355_384_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_355_384_Open_Text"><span style="color: #000000">{&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;formatId;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_424_450_Open_Image" onclick="this.style.display='none'; Codehighlighter1_424_450_Open_Text.style.display='none'; Codehighlighter1_424_450_Closed_Image.style.display='inline'; Codehighlighter1_424_450_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_424_450_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_424_450_Closed_Text.style.display='none'; Codehighlighter1_424_450_Open_Image.style.display='inline'; Codehighlighter1_424_450_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />　</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;getBranchQualifier()&nbsp;</span><span id="Codehighlighter1_424_450_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_424_450_Open_Text"><span style="color: #000000">{&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;bqual;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_494_520_Open_Image" onclick="this.style.display='none'; Codehighlighter1_494_520_Open_Text.style.display='none'; Codehighlighter1_494_520_Closed_Image.style.display='inline'; Codehighlighter1_494_520_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_494_520_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_494_520_Closed_Text.style.display='none'; Codehighlighter1_494_520_Open_Image.style.display='inline'; Codehighlighter1_494_520_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />　</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]&nbsp;getGlobalTransactionId()&nbsp;</span><span id="Codehighlighter1_494_520_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_494_520_Open_Text"><span style="color: #000000">{&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;gtrid;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
其次，你需要创建一个你要使用的数据库的数据源：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_54_301_Open_Image" onclick="this.style.display='none'; Codehighlighter1_54_301_Open_Text.style.display='none'; Codehighlighter1_54_301_Closed_Image.style.display='inline'; Codehighlighter1_54_301_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_54_301_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_54_301_Closed_Text.style.display='none'; Codehighlighter1_54_301_Open_Image.style.display='inline'; Codehighlighter1_54_301_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;DataSource&nbsp;getDataSource()&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;SQLException&nbsp;</span><span id="Codehighlighter1_54_301_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_54_301_Open_Text"><span style="color: #000000">{&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;SQLServerDataSource&nbsp;xaDS&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;com.merant.datadirect.jdbcx.sqlserver.SQLServerDataSource();&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;xaDS.setDataSourceName(</span><span style="color: #000000">"</span><span style="color: #000000">SQLServer</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;xaDS.setServerName(</span><span style="color: #000000">"</span><span style="color: #000000">server</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;xaDS.setPortNumber(</span><span style="color: #000000">1433</span><span style="color: #000000">);&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;xaDS.setSelectMethod(</span><span style="color: #000000">"</span><span style="color: #000000">cursor</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;xaDS;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000">&nbsp;</span></div>
<br />
这个例子是用&#8220;两步提交协议&#8221;来提交一个事务分支：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />XADataSource&nbsp;xaDS;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />XAConnection&nbsp;xaCon;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />XAResource&nbsp;xaRes;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />Xid&nbsp;xid;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />Connection&nbsp;con;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />Statement&nbsp;stmt;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;ret;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />xaDS&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;getDataSource();&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />xaCon&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;xaDS.getXAConnection(</span><span style="color: #000000">"</span><span style="color: #000000">jdbc_user</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">jdbc_password</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />xaRes&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;xaCon.getXAResource();&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />con&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;xaCon.getConnection();&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />stmt&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;con.createStatement();&nbsp;<br />
<img id="Codehighlighter1_325_330_Open_Image" onclick="this.style.display='none'; Codehighlighter1_325_330_Open_Text.style.display='none'; Codehighlighter1_325_330_Closed_Image.style.display='inline'; Codehighlighter1_325_330_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_325_330_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_325_330_Closed_Text.style.display='none'; Codehighlighter1_325_330_Open_Image.style.display='inline'; Codehighlighter1_325_330_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" />xid&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;MyXid(</span><span style="color: #000000">100</span><span style="color: #000000">,&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]</span><span id="Codehighlighter1_325_330_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_325_330_Open_Text"><span style="color: #000000">{</span><span style="color: #000000">0x01</span><span style="color: #000000">}</span></span><span style="color: #000000">,&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">[]</span><span id="Codehighlighter1_343_348_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_343_348_Open_Text"><span style="color: #000000">{</span><span style="color: #000000">0x02</span><span style="color: #000000">}</span></span><span style="color: #000000">);&nbsp;<br />
<img id="Codehighlighter1_357_597_Open_Image" onclick="this.style.display='none'; Codehighlighter1_357_597_Open_Text.style.display='none'; Codehighlighter1_357_597_Closed_Image.style.display='inline'; Codehighlighter1_357_597_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_357_597_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_357_597_Closed_Text.style.display='none'; Codehighlighter1_357_597_Open_Image.style.display='inline'; Codehighlighter1_357_597_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_357_597_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_357_597_Open_Text"><span style="color: #000000">{&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;xaRes.start(xid,&nbsp;XAResource.TMNOFLAGS);&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;stmt.executeUpdate(</span><span style="color: #000000">"</span><span style="color: #000000">insert&nbsp;into&nbsp;test_table&nbsp;values&nbsp;(100)</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;xaRes.end(xid,&nbsp;XAResource.TMSUCCESS);&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;ret&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;xaRes.prepare(xid);&nbsp;<br />
<img id="Codehighlighter1_561_594_Open_Image" onclick="this.style.display='none'; Codehighlighter1_561_594_Open_Text.style.display='none'; Codehighlighter1_561_594_Closed_Image.style.display='inline'; Codehighlighter1_561_594_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_561_594_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_561_594_Closed_Text.style.display='none'; Codehighlighter1_561_594_Open_Image.style.display='inline'; Codehighlighter1_561_594_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(ret&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;XAResource.XA_OK)&nbsp;</span><span id="Codehighlighter1_561_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 src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_561_594_Open_Text"><span style="color: #000000">{&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;xaRes.commit(xid,&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">);&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;}</span></span><span style="color: #000000">&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000">&nbsp;<br />
<img id="Codehighlighter1_622_648_Open_Image" onclick="this.style.display='none'; Codehighlighter1_622_648_Open_Text.style.display='none'; Codehighlighter1_622_648_Closed_Image.style.display='inline'; Codehighlighter1_622_648_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_622_648_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_622_648_Closed_Text.style.display='none'; Codehighlighter1_622_648_Open_Image.style.display='inline'; Codehighlighter1_622_648_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(XAException&nbsp;e)&nbsp;</span><span id="Codehighlighter1_622_648_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_622_648_Open_Text"><span style="color: #000000">{&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;e.printStackTrace();&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000">&nbsp;<br />
<img id="Codehighlighter1_659_710_Open_Image" onclick="this.style.display='none'; Codehighlighter1_659_710_Open_Text.style.display='none'; Codehighlighter1_659_710_Closed_Image.style.display='inline'; Codehighlighter1_659_710_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_659_710_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_659_710_Closed_Text.style.display='none'; Codehighlighter1_659_710_Open_Image.style.display='inline'; Codehighlighter1_659_710_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">finally</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_659_710_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_659_710_Open_Text"><span style="color: #000000">{&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;stmt.close();&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;con.close();&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;xaCon.close();&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
</span></div>
<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">两阶段提交（Two</span><span style="color: #000000">-</span><span style="color: #000000">Phase</span><span style="color: #000000">-</span><span style="color: #000000">Commit）协议<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />首先，两阶段提交（Two</span><span style="color: #000000">-</span><span style="color: #000000">Phase</span><span style="color: #000000">-</span><span style="color: #000000">Commit）事务的启动与常规的单阶段提交（One</span><span style="color: #000000">-</span><span style="color: #000000">Phase</span><span style="color: #000000">-</span><span style="color: #000000">Commit）事务类似。接着，应用程序</span><span style="color: #000000">/</span><span style="color: #000000">客&nbsp;户机对该两阶段提交（Two</span><span style="color: #000000">-</span><span style="color: #000000">Phase</span><span style="color: #000000">-</span><span style="color: #000000">Commit）操作中所涉及的所有数据库执行其修改工作。现在，在最终提交该事务之前，客户机通知参与的数据库准备提交（第&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;阶段）。如果客户机从数据库收到一条&#8220;okay&#8221;，就发出命令向数据库提交该事务（第&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">&nbsp;阶段）。最后分布式事务（Distributed&nbsp;Transaction）结束。<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<br />
<p>在该应用程序中，如果一个事务分支报告了错误，您就要负责进行错误处理。但是&#8220;两阶段提交协议 简介&#8221;小节中提到仍然存在一个问题，那就是如果第 2 阶段中一个事务分支发生故障，该怎么办呢？</p>
<p>如果再次查看程序代码，您可以看到在&#8220;第 1 阶段&#8221;和&#8220;第 2 阶段&#8221;之间有一个很小的时间间隔。在这一时间间隔中，出于某种理由，其中某一参与数据库可能崩溃。如果发生了，我们将陷入分布式事务已经部分提交的情形中。</p>
<p>假 定下列情形：在&#8220;第 1 阶段&#8221;之后，您从 DB2 和 IDS 数据库中都收到了&#8220;okay&#8221;。在下一步中，应用程序成功提交了 DB2 的事务分支。接着，应用程序通知 DB2 事务分支提交事务。现在，在应用程序可以通知 IDS 事务分支提交它这一部分之前，IDS 引擎由于断电发生崩溃。这就是一种部分提交全局事务的情形。您现在该怎么办呢？</p>
<p>在重启之后，DB2 和 IDS 都将尝试恢复打开的事务分支。该引擎等待来自应用程序的提示如何做。如果应用程序没有准备重新发送&#8220;第 2 阶段&#8221;的提交，该事务分支将被引擎所启动的试探性回滚中止。这是非常糟糕的，因为这将使该全局事务处于不一致状态。</p>
<p>一种解决方案是用一个小型应用程序连接引擎中打开的事务分支，并通知引擎提交或回滚这一打开的事务。如果您使用 IDS 作为后端，那么还有一个隐藏的 onmode 标志，允许您结束打开的事务分支。（onmode -Z xid）。</p>
<p>在 DB2 UDB 中，您可以发出 LIST INDOUBT TRANSACTIONS 来获得打开的 XA 事务的有关信息。您必须查看 DB2 Information Center 中的描述来解决该问题。</p>
<p>上面描述的情形是一个很好的例子，也是使用应用程序服务器（Application Server）或事务监控器（Transaction Monitor）的理由。在使用一个中间层服务器时，就由该服务器负责保持事情正常。</p>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/baoyaer/aggbug/248196.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2008-12-25 09:28 <a href="http://www.blogjava.net/baoyaer/articles/248196.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA 对象池</title><link>http://www.blogjava.net/baoyaer/articles/218460.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Tue, 29 Jul 2008 08:07:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/218460.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/218460.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/218460.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/218460.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/218460.html</trackback:ping><description><![CDATA[<div class="postTitle"><a class="postTitle2" id="viewpost1_TitleUrl" href="http://www.blogjava.net/woxingwosu/archive/2007/12/29/171477.html">Jakarta对象池</a> </div>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ☆<strong>为什么使用对象池</strong>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">&nbsp;&nbsp;恰当地使用对象池化技术，可以有效地减少对象生成和初始化时的消耗，提高系统的运行效率。Jakarta&nbsp;Commons&nbsp;Pool组件提供了一整套用于实现对象池化的框架，以及若干种各具特色的对象池实现</span></div>
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ☆<strong>对象池思路</strong>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;对象池化的基本思路是：将用过的对象保存起来，等下一次需要这种对象的时候，再拿出来重复使用，从而在一定程度上减少频繁创建对象所造成的开销。用于充当保存对象的&#8220;容器&#8221;的对象，被称为&#8220;对象池&#8221;（Object&nbsp;Pool，或简称Pool）。&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;对于没有状态的对象（例如String），在重复使用之前，无需进行任何处理；对于有状态的对象（例如StringBuffer），在重复使用之前，就需要把它们恢复到等同于刚刚生成时的状态。由于条件的限制，恢复某个对象的状态的操作不可能实现了的话，就得把这个对象抛弃，改用新创建的实例了。&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;并非所有对象都适合拿来池化――因为维护对象池也要造成一定开销。对生成时开销不大的对象进行池化，反而可能会出现&#8220;维护对象池的开销&#8221;大于&#8220;生成新对象的开销&#8221;，从而使性能降低的情况。但是对于生成时开销可观的对象，池化技术就是提高性能的有效策略了。&nbsp;</span></div>
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ☆<strong>运用对象池</strong>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">&nbsp;&nbsp;在Pool组件中，对象池化的工作被划分给了三类对象：&nbsp;<br />
<br />
&nbsp;&nbsp;<strong>PoolableObjectFactory</strong>用于管理被池化的对象的产生、激活、挂起、校验和销毁；&nbsp;<br />
&nbsp;&nbsp;<strong>ObjectPool</strong>用于管理要被池化的对象的借出和归还，并通知PoolableObjectFactory完成相应的工作；&nbsp;<br />
&nbsp;&nbsp;<strong>ObjectPoolFactory</strong>则用于大量生成相同类型和设置的ObjectPool。&nbsp;<br />
&nbsp;&nbsp;相应地，使用Pool组件的过程，也大体可以划分成&#8220;创立PoolableObjectFactory&#8221;、&#8220;使用ObjectPool&#8221;和可选的&#8220;利用ObjectPoolFactory&#8221;三种动作。&nbsp;<br />
</span></div>
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ☆<strong>PoolableObjectFactory</strong><img height="197" alt="" src="http://www.blogjava.net/images/blogjava_net/woxingwosu/PoolableObjectFactory.png" width="668" border="0" /><br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ☆<strong>ObjectPool<br />
</strong><img height="219" alt="" src="http://www.blogjava.net/images/blogjava_net/woxingwosu/ObjectPool.png" width="533" border="0" /><br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ☆<strong>最终结构<br />
</strong><img height="476" alt="" src="http://www.blogjava.net/images/blogjava_net/woxingwosu/pool1.png" width="591" border="0" /><br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ☆<strong>简化PoolableObjectFactory</strong>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">&nbsp;&nbsp;PoolableObjectFactory定义了许多方法，可以适应多种不同的情况。但是，在并没有什么特殊需要的时候，直接实现PoolableObjectFactory接口，就要编写若干的不进行任何操作，或是始终返回true的方法来让编译通过，比较繁琐。这种时候就可以借助BasePoolableObjectFactory的威力，来简化编码的工作。&nbsp;<br />
<br />
&nbsp;&nbsp;BasePoolableObjectFactory是org.apache.commons.pool包中的一个抽象类。它实现了PoolableObjectFactory接口，并且为除了makeObject之外的方法提供了一个基本的实现――activateObject、passivateObject和destroyObject不进行任何操作，而validateObject始终返回true。通过继承这个类，而不是直接实现PoolableObjectFactory接口，就可以免去编写一些只起到让编译通过的作用的代码的麻烦了。</span></div>
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ☆<strong>ObjectPool实现类<br />
</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ☆<strong>StackObjectPool</strong>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">&nbsp;&nbsp;StackObjectPool利用一个java.util.Stack对象来保存对象池里的对象。这种对象池的特色是：&nbsp;<br />
<br />
&nbsp;&nbsp;可以为对象池指定一个初始的参考大小（当空间不够时会自动增长）。&nbsp;<br />
&nbsp;&nbsp;在对象池已空的时候，调用它的borrowObject方法，会自动返回新创建的实例。&nbsp;<br />
&nbsp;&nbsp;可以为对象池指定一个可保存的对象数目的上限。达到这个上限之后，再向池里送回的对象会被自动送去回收。&nbsp;<br />
&nbsp;&nbsp;StackObjectPool的构造方法共有六个，其中：&nbsp;<br />
<br />
&nbsp;&nbsp;最简单的一个是StackObjectPool()，一切采用默认的设置，也不指明要用的PoolableObjectFactory实例。&nbsp;<br />
&nbsp;&nbsp;最复杂的一个则是StackObjectPool(PoolableObjectFactory&nbsp;factory,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;max,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;init)。其中：&nbsp;<br />
&nbsp;&nbsp;参数factory指明要与之配合使用的PoolableObjectFactory实例；&nbsp;<br />
&nbsp;&nbsp;参数max设定可保存对象数目的上限；&nbsp;<br />
&nbsp;&nbsp;参数init则指明初始的参考大小。&nbsp;<br />
&nbsp;&nbsp;剩余的四个构造方法则是最复杂的构造方法在某方面的简化版本，可以根据需要选用。它们是：&nbsp;<br />
&nbsp;&nbsp;StackObjectPool(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;max)&nbsp;<br />
&nbsp;&nbsp;StackObjectPool(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;max,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;init)&nbsp;<br />
&nbsp;&nbsp;StackObjectPool(PoolableObjectFactory&nbsp;factory)&nbsp;<br />
&nbsp;&nbsp;StackObjectPool(PoolableObjectFactory&nbsp;factory,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;max)&nbsp;<br />
&nbsp;&nbsp;用不带factory参数的构造方法构造的StackObjectPool实例，必须要在用它的setFactory(PoolableObjectFactory&nbsp;factory)方法与某一&nbsp;&nbsp;PoolableObjectFactory实例关联起来后才能正常使用。&nbsp;<br />
<br />
&nbsp;&nbsp;这种对象池可以在没有Jakarta&nbsp;Commmons&nbsp;Collections组件支持的情况下正常运行。</span></div>
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ☆<strong>SoftReferenceObjectPool</strong>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">&nbsp;&nbsp;SoftReferenceObjectPool利用一个java.util.ArrayList对象来保存对象池里的对象。不过它并不在对象池里直接保存对象本身，而是保存它们的&#8220;软引用&#8221;（Soft&nbsp;Reference）。这种对象池的特色是：&nbsp;<br />
<br />
&nbsp;&nbsp;可以保存任意多个对象，不会有容量已满的情况发生。&nbsp;<br />
&nbsp;&nbsp;在对象池已空的时候，调用它的borrowObject方法，会自动返回新创建的实例。&nbsp;<br />
&nbsp;&nbsp;可以在初始化同时，在池内预先创建一定量的对象。&nbsp;<br />
&nbsp;&nbsp;当内存不足的时候，池中的对象可以被Java虚拟机回收。&nbsp;<br />
&nbsp;&nbsp;SoftReferenceObjectPool的构造方法共有三个，其中：&nbsp;<br />
<br />
&nbsp;&nbsp;最简单的是SoftReferenceObjectPool()，不预先在池内创建对象，也不指明要用的PoolableObjectFactory实例。&nbsp;<br />
&nbsp;&nbsp;最复杂的一个则是SoftReferenceObjectPool(PoolableObjectFactory&nbsp;factory,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;initSize)。其中：&nbsp;<br />
&nbsp;&nbsp;参数factory指明要与之配合使用的PoolableObjectFactory实例&nbsp;<br />
&nbsp;&nbsp;参数initSize则指明初始化时在池中创建多少个对象。&nbsp;<br />
&nbsp;&nbsp;剩下的一个构造方法，则是最复杂的构造方法在某方面的简化版本，适合在大多数情况下使用。它是：&nbsp;<br />
SoftReferenceObjectPool(PoolableObjectFactory&nbsp;factory)&nbsp;<br />
&nbsp;&nbsp;用不带factory参数的构造方法构造的SoftReferenceObjectPool实例，也要在用它的setFactory(PoolableObjectFactory&nbsp;factory)方法与某一PoolableObjectFactory实例关联起来后才能正常使用。&nbsp;<br />
<br />
&nbsp;&nbsp;这种对象池也可以在没有Jakarta&nbsp;Commmons&nbsp;Collections组件支持的情况下正常运行。</span></div>
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ☆<strong>GenericObjectPool</strong>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">&nbsp;&nbsp;GenericObjectPool利用一个org.apache.commons.collections.CursorableLinkedList对象来保存对象池里的对象。这种对象池的特色是：&nbsp;<br />
<br />
&nbsp;&nbsp;可以设定最多能从池中借出多少个对象。&nbsp;<br />
&nbsp;&nbsp;可以设定池中最多能保存多少个对象。&nbsp;<br />
&nbsp;&nbsp;可以设定在池中已无对象可借的情况下，调用它的borrowObject方法时的行为，是等待、创建新的实例还是抛出异常。&nbsp;<br />
&nbsp;&nbsp;可以分别设定对象借出和还回时，是否进行有效性检查。&nbsp;<br />
&nbsp;&nbsp;可以设定是否使用一个单独的线程，对池内对象进行后台清理。&nbsp;<br />
&nbsp;&nbsp;GenericObjectPool的构造方法共有七个，其中：&nbsp;<br />
<br />
&nbsp;&nbsp;最简单的一个是GenericObjectPool(PoolableObjectFactory&nbsp;factory)。仅仅指明要用的PoolableObjectFactory实例，其它参数则采用默认值。&nbsp;<br />
&nbsp;&nbsp;最复杂的一个是GenericObjectPool(PoolableObjectFactory&nbsp;factory,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;maxActive,&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">&nbsp;whenExhaustedAction,&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;maxWait,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;maxIdle,&nbsp;</span><span style="color: #0000ff">boolean</span><span style="color: #000000">&nbsp;testOnBorrow,&nbsp;</span><span style="color: #0000ff">boolean</span><span style="color: #000000">&nbsp;testOnReturn,&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;timeBetweenEvictionRunsMillis,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;numTestsPerEvictionRun,&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;minEvictableIdleTimeMillis,&nbsp;</span><span style="color: #0000ff">boolean</span><span style="color: #000000">&nbsp;testWhileIdle)。其中：&nbsp;<br />
&nbsp;&nbsp;参数factory指明要与之配合使用的PoolableObjectFactory实例。&nbsp;<br />
&nbsp;&nbsp;参数maxActive指明能从池中借出的对象的最大数目。如果这个值不是正数，表示没有限制。&nbsp;<br />
&nbsp;&nbsp;参数whenExhaustedAction指定在池中借出对象的数目已达极限的情况下，调用它的borrowObject方法时的行为。可以选用的值有：&nbsp;<br />
&nbsp;&nbsp;GenericObjectPool.WHEN_EXHAUSTED_BLOCK，表示等待；&nbsp;<br />
&nbsp;&nbsp;GenericObjectPool.WHEN_EXHAUSTED_GROW，表示创建新的实例（不过这就使maxActive参数失去了意义）；&nbsp;<br />
&nbsp;&nbsp;GenericObjectPool.WHEN_EXHAUSTED_FAIL，表示抛出一个java.util.NoSuchElementException异常。&nbsp;<br />
&nbsp;&nbsp;参数maxWait指明若在对象池空时调用borrowObject方法的行为被设定成等待，最多等待多少毫秒。如果等待时间超过了这个数值，则会抛出一个java.util.NoSuchElementException异常。如果这个值不是正数，表示无限期等待。&nbsp;<br />
&nbsp;&nbsp;参数testOnBorrow设定在借出对象时是否进行有效性检查。&nbsp;<br />
&nbsp;&nbsp;参数testOnBorrow设定在还回对象时是否进行有效性检查。&nbsp;<br />
&nbsp;&nbsp;参数timeBetweenEvictionRunsMillis，设定间隔每过多少毫秒进行一次后台对象清理的行动。如果这个值不是正数，则实际上不会进行后台对象清理。&nbsp;<br />
&nbsp;&nbsp;参数numTestsPerEvictionRun，设定在进行后台对象清理时，每次检查几个对象。如果这个值不是正数，则每次检查的对象数是检查时池内对象的总数乘以这个值的负倒数再向上取整的结果――也就是说，如果这个值是</span><span style="color: #000000">-</span><span style="color: #000000">2</span><span style="color: #000000">（</span><span style="color: #000000">-</span><span style="color: #000000">3</span><span style="color: #000000">、</span><span style="color: #000000">-</span><span style="color: #000000">4</span><span style="color: #000000">、</span><span style="color: #000000">-</span><span style="color: #000000">5</span><span style="color: #000000">&#8230;&#8230;）的话，那么每次大约检查当时池内对象总数的1</span><span style="color: #000000">/</span><span style="color: #000000">2</span><span style="color: #000000">（</span><span style="color: #000000">1</span><span style="color: #000000">/</span><span style="color: #000000">3</span><span style="color: #000000">、</span><span style="color: #000000">1</span><span style="color: #000000">/</span><span style="color: #000000">4</span><span style="color: #000000">、</span><span style="color: #000000">1</span><span style="color: #000000">/</span><span style="color: #000000">5</span><span style="color: #000000">&#8230;&#8230;）左右。&nbsp;<br />
&nbsp;&nbsp;参数minEvictableIdleTimeMillis，设定在进行后台对象清理时，视休眠时间超过了多少毫秒的对象为过期。过期的对象将被回收。如果这个值不是正数，那么对休眠时间没有特别的约束。&nbsp;<br />
&nbsp;&nbsp;参数testWhileIdle，则设定在进行后台对象清理时，是否还对没有过期的池内对象进行有效性检查。不能通过有效性检查的对象也将被回收。&nbsp;<br />
&nbsp;&nbsp;另一个比较特别的构造方法是GenericObjectPool(PoolableObjectFactory&nbsp;factory,&nbsp;GenericObjectPool.Config&nbsp;config)&nbsp;。其中：&nbsp;<br />
&nbsp;&nbsp;参数factory指明要与之配合使用的PoolableObjectFactory实例；&nbsp;<br />
&nbsp;&nbsp;参数config则指明一个包括了各个参数的预设值的对象（详见《GenericObjectPool.Config》一节）。&nbsp;<br />
&nbsp;&nbsp;剩下的五个构造函数则是最复杂的构造方法在某方面的简化版本，可以根据情况选用。它们是：&nbsp;<br />
&nbsp;&nbsp;GenericObjectPool(PoolableObjectFactory&nbsp;factory,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;maxActive)&nbsp;<br />
&nbsp;&nbsp;GenericObjectPool(PoolableObjectFactory&nbsp;factory,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;maxActive,&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">&nbsp;whenExhaustedAction,&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;maxWait)&nbsp;<br />
&nbsp;&nbsp;GenericObjectPool(PoolableObjectFactory&nbsp;factory,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;maxActive,&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">&nbsp;whenExhaustedAction,&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;maxWait,&nbsp;</span><span style="color: #0000ff">boolean</span><span style="color: #000000">&nbsp;testOnBorrow,&nbsp;</span><span style="color: #0000ff">boolean</span><span style="color: #000000">&nbsp;testOnReturn)&nbsp;<br />
&nbsp;&nbsp;GenericObjectPool(PoolableObjectFactory&nbsp;factory,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;maxActive,&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">&nbsp;whenExhaustedAction,&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;maxWait,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;maxIdle)&nbsp;<br />
&nbsp;&nbsp;GenericObjectPool(PoolableObjectFactory&nbsp;factory,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;maxActive,&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">&nbsp;whenExhaustedAction,&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;maxWait,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;maxIdle,&nbsp;</span><span style="color: #0000ff">boolean</span><span style="color: #000000">&nbsp;testOnBorrow,&nbsp;</span><span style="color: #0000ff">boolean</span><span style="color: #000000">&nbsp;testOnReturn)&nbsp;<br />
&nbsp;&nbsp;这种对象池不可以在没有Jakarta&nbsp;Commmons&nbsp;Collections组件支持的情况下运行。&nbsp;</span></div>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">&nbsp;&nbsp;【注意】如果没有设置参数值，GenericObjectPool会使用默认的参数值，比如池的最大数为8，这样可能造成影响。</span></div>
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ☆<strong>GenericObjectPool.Config</strong>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">&nbsp;&nbsp;调用一个有很多的参数的方法的时候，很可能将参数的位置和个数搞错，导致编译或运行时的错误；阅读包含了有很多参数的方法调用的代码的时候，也很可能因为没有搞对参数的位置和个数，产生错误的理解。因此，人们往往避免给一个方法安排太多的参数的做法（所谓的&#8220;Long&nbsp;Parameter&nbsp;List&#8221;）。不过，有些方法又确实需要许多参数才能完成工作。于是，就有人想到了一种将大批的参数封装到一个对象（称为参数对象，Parameter&nbsp;Object）里，然后将这个对象作为单一的参数传递的两全其美的对策。&nbsp;<br />
<br />
&nbsp;&nbsp;因为生成GenericKeyedObjectPool时可供设置的特性非常之多，所以它的构造方法里也就难免会需要不少的参数。GenericKeyedObjectPool除了提供了几个超长的构造方法之外，同时也定义了一个使用参数对象的构造方法。所用参数对象的类型是GenericKeyedObjectPool.Config。&nbsp;<br />
<br />
&nbsp;&nbsp;GenericKeyedObjectPool.Config定义了许多的public字段，每个对应一种可以为GenericKeyedObjectPool设置的特性，包括：&nbsp;<br />
<br />
&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;maxActive&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;maxIdle&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;maxWait&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;minEvictableIdleTimeMillis&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;numTestsPerEvictionRun&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #0000ff">boolean</span><span style="color: #000000">&nbsp;testOnBorrow&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #0000ff">boolean</span><span style="color: #000000">&nbsp;testOnReturn&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #0000ff">boolean</span><span style="color: #000000">&nbsp;testWhileIdle&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;timeBetweenEvictionRunsMillis&nbsp;<br />
&nbsp;&nbsp;</span><span style="color: #0000ff">byte</span><span style="color: #000000">&nbsp;whenExhaustedAction&nbsp;<br />
&nbsp;&nbsp;这些字段的作用，与在GenericKeyedObjectPool最复杂的构造方法中与它们同名的参数完全相同。&nbsp;<br />
<br />
&nbsp;&nbsp;使用的时候，先生成一个GenericKeyedObjectPool.Config对象，然后将个字段设置为想要的值，最后用这个对象作为唯一的参数调用GenericKeyedObjectPool的构造方法即可。&nbsp;<br />
<br />
&nbsp;&nbsp;注意：使用有许多public字段、却没有任何方法的类，也是一个人们往往加以避免的行为（所谓的&#8220;Data&nbsp;Class&#8221;）。不过这次GenericKeyedObjectPool特立独行了一回。</span></div>
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ☆<strong>带键值的对象池</strong>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">&nbsp;&nbsp;有时候，单用对池内所有对象一视同仁的对象池，并不能解决的问题。例如，对于一组某些参数设置不同的同类对象――比如一堆指向不同地址的java.net.URL对象或者一批代表不同语句的java.sql.PreparedStatement对象，用这样的方法池化，就有可能取出不合用的对象的麻烦。&nbsp;<br />
<br />
&nbsp;&nbsp;可以通过为每一组参数相同的同类对象建立一个单独的对象池来解决这个问题。但是，如果使用普通的ObjectPool来实施这个计策的话，因为普通的PoolableObjectFactory只能生产出大批设置完全一致的对象，就需要为每一组参数相同的对象编写一个单独的PoolableObjectFactory，工作量相当可观。这种时候就适合调遣Pool组件中提供的一种&#8220;带键值的对象池&#8221;来展开工作了。&nbsp;<br />
<br />
&nbsp;&nbsp;Pool组件采用实现了KeyedObjectPool接口的类，来充当带键值的对象池。相应的，这种对象池需要配合实现了KeyedPoolableObjectFactory接口的类和实现了KeyedObjectPoolFactory接口的类来使用（这三个接口都在org.apache.commons.pool包中定义）：&nbsp;<br />
<br />
&nbsp;&nbsp;KeyedPoolableObjectFactory和PoolableObjectFactory形式如出一辙，只是每个方法都增加了一个Object&nbsp;key参数而已：&nbsp;<br />
&nbsp;&nbsp;makeObject的参数变为(Object&nbsp;key)&nbsp;<br />
&nbsp;&nbsp;activateObject的参数变为(Object&nbsp;key,&nbsp;Object&nbsp;obj)&nbsp;<br />
&nbsp;&nbsp;passivateObject的参数变为(Object&nbsp;key,&nbsp;Object&nbsp;obj)&nbsp;<br />
&nbsp;&nbsp;validateObject的参数变为Object&nbsp;key,&nbsp;Object&nbsp;obj)&nbsp;<br />
&nbsp;&nbsp;destroyObject的参数变为(Object&nbsp;key,&nbsp;Object&nbsp;obj)&nbsp;<br />
&nbsp;&nbsp;另外Pool组件也提供了BaseKeyedPoolableObjectFactory，用于充当和BasePoolableObjectFactory差不多的角色。<br />
<br />
&nbsp;&nbsp;KeyedObjectPool和ObjectPool的形式大同小异，只是某些方法的参数类型发生了变化，某些方法分成了两种略有不同的版本：&nbsp;<br />
&nbsp;&nbsp;用Object&nbsp;borrowObject(Object&nbsp;key)和void&nbsp;returnObject(Object&nbsp;key,&nbsp;Object&nbsp;obj)来负责对象出借和归还的动作。&nbsp;<br />
&nbsp;&nbsp;用void&nbsp;close()来关闭不再需要的对象池。&nbsp;<br />
&nbsp;&nbsp;用void&nbsp;clear(Object&nbsp;key)和void&nbsp;clear()来清空池中的对象，前者针对与特定键值相关联的实例，后者针对整个对象池。&nbsp;<br />
&nbsp;&nbsp;用int&nbsp;getNumActive(Object&nbsp;key)和int&nbsp;getNumActive()来查询已借出的对象数，前者针对与特定键值相关联的实例，后者针对整个对象池。&nbsp;<br />
&nbsp;&nbsp;用int&nbsp;getNumIdle(Object&nbsp;key)和int&nbsp;getNumIdle()来查询正在休眠的对象数，前者针对与特定键值相关联的实例，后者针对整个对象池。&nbsp;<br />
&nbsp;&nbsp;用void&nbsp;setFactory(KeyedPoolableObjectFactory&nbsp;factory)来设置要用的KeyedPoolableObjectFactory实例。&nbsp;<br />
</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;clear、</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;getNumActive、</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;getNumIdle和void&nbsp;setFactory的各种版本都仍然是可以由具体实现自行决定是否要支持的方法。如果所&nbsp;&nbsp;用的KeyedObjectPool实现不支持这些操作，那么调用这些方法的时候，会抛出一个UnsupportedOperationException异常。&nbsp;<br />
<br />
&nbsp;&nbsp;KeyedObjectPoolFactory和ObjectPoolFactory的形式完全相同，只是所代表的对象不同而已。</span></div>
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ☆<strong>当出借少于归还</strong>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">&nbsp;&nbsp;Java并未提供一种机制来保证两个方法被调用的次数之间呈现一种特定的关系（相等，相差一个常数，或是其它任何关系）。因此，完全可以做到建立一个ObjectPool对象，然后调用一次borrowObject方法，借出一个对象，之后重复两次returnObject方法调用，进行两次归还。而调用一个从不曾借出对象的ObjectPool的returnObject方法也并不是一个不可完成的任务。&nbsp;<br />
<br />
&nbsp;&nbsp;尽管这些使用方法并不合乎returnObject的字面意思，但是Pool组件中的各个ObjectPool</span><span style="color: #000000">/</span><span style="color: #000000">KeyedObjectPool实现都不在乎这一点。它们的returnObject方法都只是单纯地召唤与当前对象池关联的PoolableObjectFactory实例，看这对象能否经受得起validateObject的考验而已。考验的结果决定了这个对象是应该拿去作passivateObject处理，而后留待重用；还是应该拿去作destroyObject处理，以免占用资源。也就是说，当出借少于归还的时候，并不会额外发生什么特别的事情（当然，有可能因为该对象池处于不接受归还对象的请求的状态而抛出异常，不过这是常规现象）。&nbsp;<br />
<br />
&nbsp;&nbsp;在实际使用中，可以利用这一特性来向对象池内加入通过其它方法生成的对象。</span></div>
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ☆<strong>什么时候使用对象池</strong>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">&nbsp;&nbsp;采用对象池化的本意，是要通过减少对象生成的次数，减少花在对象初始化上面的开销，从而提高整体的性能。然而池化处理本身也要付出代价，因此，并非任何情况下都适合采用对象池化。&nbsp;<br />
<br />
&nbsp;&nbsp;Dr.&nbsp;Cliff&nbsp;Click在JavaOne&nbsp;2003上发表的《Performance&nbsp;Myths&nbsp;Exposed》中，给出了一组其它条件都相同时，使用与不使用对象池化技术的实际性能的比较结果。他的实测结果表明：&nbsp;<br />
<br />
&nbsp;&nbsp;对于类似Point这样的轻量级对象，进行池化处理后，性能反而下降，因此不宜池化；&nbsp;<br />
<br />
&nbsp;&nbsp;对于类似Hashtable这样的中量级对象，进行池化处理后，性能基本不变，一般不必池化（池化会使代码变复杂，增大维护的难度）；&nbsp;<br />
&nbsp;&nbsp;对于类似JPanel这样的重量级对象，进行池化处理后，性能有所上升，可以考虑池化。&nbsp;<br />
&nbsp;&nbsp;根据使用方法的不同，实际的情况可能与这一测量结果略有出入。在配置较高的机器和技术较强的虚拟机上，不宜池化的对象的范围可能会更大。不过，对于像网络和数据库连接这类重量级的对象来说，目前还是有池化的必要。&nbsp;<br />
<br />
&nbsp;&nbsp;基本上，只在重复生成某种对象的操作成为影响性能的关键因素的时候，才适合进行对象池化。如果进行池化所能带来的性能提高并不重要的话，还是不采用对象池化技术，以保持代码的简明，而使用更好的硬件和更棒的虚拟机来提高性能为佳。</span></div>
<img src ="http://www.blogjava.net/baoyaer/aggbug/218460.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2008-07-29 16:07 <a href="http://www.blogjava.net/baoyaer/articles/218460.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mina中文教程</title><link>http://www.blogjava.net/baoyaer/articles/218019.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Mon, 28 Jul 2008 04:00:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/218019.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/218019.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/218019.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/218019.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/218019.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 现在已经是World Wide Web的时代，无数的web应用框架被创造出来从而大大的提高了web开发的速度。抛开WWW的这个优势，我们知道还有很多协议是HTTP协议所无法替代的。有时，我们仍然需要构造c/s应用来实现适当的协议。&nbsp;=== MINA是什么? ===&nbsp;你有没有曾经使用java或者其他语言实现...&nbsp;&nbsp;<a href='http://www.blogjava.net/baoyaer/articles/218019.html'>阅读全文</a><img src ="http://www.blogjava.net/baoyaer/aggbug/218019.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2008-07-28 12:00 <a href="http://www.blogjava.net/baoyaer/articles/218019.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring+atomikos+JTA完整例子 </title><link>http://www.blogjava.net/baoyaer/articles/208872.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Wed, 18 Jun 2008 06:54:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/208872.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/208872.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/208872.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/208872.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/208872.html</trackback:ping><description><![CDATA[jotm真是个烂东西，不能回滚，导致系统出现了很多问题，深受其害，决心换个东东，在网上找到了atomikos，做下记录<br />
<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">&lt;?</span><span style="color: #ff00ff">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="color: #0000ff">?&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;!</span><span style="color: #ff00ff">DOCTYPE&nbsp;beans&nbsp;PUBLIC&nbsp;"-//SPRING//DTD&nbsp;BEAN&nbsp;2.0//EN"&nbsp;"http://www.springframework.org/dtd/spring-beans-2.0.dtd"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">beans&nbsp;</span><span style="color: #ff0000">default-autowire</span><span style="color: #0000ff">="byName"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">bean&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="atomikosUserTransaction"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="com.atomikos.icatch.jta.UserTransactionImp"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">bean</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">bean&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="atomikosTransactionManager"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="com.atomikos.icatch.jta.UserTransactionManager"</span><span style="color: #ff0000">&nbsp;init-method</span><span style="color: #0000ff">="init"</span><span style="color: #ff0000">&nbsp;destroy-method</span><span style="color: #0000ff">="close"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;&nbsp;when&nbsp;close&nbsp;is&nbsp;called,&nbsp;should&nbsp;we&nbsp;force&nbsp;transactions&nbsp;to&nbsp;terminate&nbsp;or&nbsp;not?&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="forceShutdown"</span><span style="color: #0000ff">&gt;&lt;</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">true</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">bean</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">bean&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="txManager"</span><span style="color: #ff0000">&nbsp;class</span><span style="color: #0000ff">="org.springframework.transaction.jta.JtaTransactionManager"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="transactionManager"</span><span style="color: #0000ff">&gt;&lt;</span><span style="color: #800000">ref&nbsp;</span><span style="color: #ff0000">bean</span><span style="color: #0000ff">="atomikosTransactionManager"</span><span style="color: #ff0000">&nbsp;&nbsp;</span><span style="color: #0000ff">/&gt;&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="userTransaction"</span><span style="color: #0000ff">&gt;&lt;</span><span style="color: #800000">ref&nbsp;</span><span style="color: #ff0000">bean</span><span style="color: #0000ff">="atomikosUserTransaction"</span><span style="color: #0000ff">/&gt;&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">bean</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">bean&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="auditDS"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;class</span><span style="color: #0000ff">="com.atomikos.jdbc.AtomikosDataSourceBean"</span><span style="color: #ff0000">&nbsp;init-method</span><span style="color: #0000ff">="init"</span><span style="color: #ff0000">&nbsp;destroy-method</span><span style="color: #0000ff">="close"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="uniqueResourceName"</span><span style="color: #0000ff">&gt;&lt;</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">mysql/cnaudit</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="xaDataSourceClassName"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="xaProperties"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">props</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">prop&nbsp;</span><span style="color: #ff0000">key</span><span style="color: #0000ff">="user"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">XXX</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">prop</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">prop&nbsp;</span><span style="color: #ff0000">key</span><span style="color: #0000ff">="password"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">XXX</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">prop</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">prop&nbsp;</span><span style="color: #ff0000">key</span><span style="color: #0000ff">="URL"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XXX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">prop</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">props</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="poolSize"</span><span style="color: #0000ff">&gt;&lt;</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">50</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">bean</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">bean&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="oracleDS"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;class</span><span style="color: #0000ff">="com.atomikos.jdbc.AtomikosDataSourceBean"</span><span style="color: #ff0000">&nbsp;init-method</span><span style="color: #0000ff">="init"</span><span style="color: #ff0000">&nbsp;destroy-method</span><span style="color: #0000ff">="close"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="uniqueResourceName"</span><span style="color: #0000ff">&gt;&lt;</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">oracle/cnaudit</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="xaDataSourceClassName"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">oracle.jdbc.xa.client.OracleXADataSource</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="xaProperties"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">props</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">prop&nbsp;</span><span style="color: #ff0000">key</span><span style="color: #0000ff">="user"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">XXX</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">prop</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">prop&nbsp;</span><span style="color: #ff0000">key</span><span style="color: #0000ff">="password"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">XXX</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">prop</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">prop&nbsp;</span><span style="color: #ff0000">key</span><span style="color: #0000ff">="URL"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XXX<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">prop</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">props</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">property</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">bean</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">bean&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="sqlMapClient"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class</span><span style="color: #0000ff">="org.springframework.orm.ibatis.SqlMapClientFactoryBean"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="configLocation"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value</span><span style="color: #0000ff">="classpath:ibatis/SqlMapConfig.xml"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="dataSource"</span><span style="color: #ff0000">&nbsp;ref</span><span style="color: #0000ff">="auditDS"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">bean</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">bean&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="sqlMapClientTemplate"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class</span><span style="color: #0000ff">="org.springframework.orm.ibatis.SqlMapClientTemplate"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">bean&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="oraSqlMapClient"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class</span><span style="color: #0000ff">="org.springframework.orm.ibatis.SqlMapClientFactoryBean"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="configLocation"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value</span><span style="color: #0000ff">="classpath:ibatis/SqlMapConfig-oracle.xml"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="dataSource"</span><span style="color: #ff0000">&nbsp;ref</span><span style="color: #0000ff">="oracleDS"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">bean</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">bean&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="oraSqlMapClientTemplate"</span><span style="color: #ff0000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class</span><span style="color: #0000ff">="org.springframework.orm.ibatis.SqlMapClientTemplate"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">property&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="sqlMapClient"</span><span style="color: #ff0000">&nbsp;ref</span><span style="color: #0000ff">="oraSqlMapClient"</span><span style="color: #ff0000">&nbsp;</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">bean</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">beans</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<br />
<br />
在配置一下事物管理，ok
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">&lt;?</span><span style="color: #ff00ff">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="color: #0000ff">?&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">beans&nbsp;</span><span style="color: #ff0000">xmlns</span><span style="color: #0000ff">="http://www.springframework.org/schema/beans"</span><span style="color: #ff0000">&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlns:xsi</span><span style="color: #0000ff">="http://www.w3.org/2001/XMLSchema-instance"</span><span style="color: #ff0000">&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlns:aop</span><span style="color: #0000ff">="http://www.springframework.org/schema/aop"</span><span style="color: #ff0000">&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlns:tx</span><span style="color: #0000ff">="http://www.springframework.org/schema/tx"</span><span style="color: #ff0000">&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xsi:schemaLocation</span><span style="color: #0000ff">="http://www.springframework.org/schema/beans&nbsp;http://www.springframework.org/schema/beans/spring-beans-2.0.xsd&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/aop&nbsp;http://www.springframework.org/schema/aop/spring-aop-2.0.xsd&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/tx&nbsp;http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"</span><span style="color: #ff0000">&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default-autowire</span><span style="color: #0000ff">="byName"</span><span style="color: #ff0000">&nbsp;default-lazy-init</span><span style="color: #0000ff">="true"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;支持&nbsp;@AspectJ&nbsp;标记</span><span style="color: #008000">--&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">aop:aspectj-autoproxy</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">aop:config&nbsp;</span><span style="color: #ff0000">proxy-target-class</span><span style="color: #0000ff">="true"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">aop:advisor&nbsp;</span><span style="color: #ff0000">pointcut</span><span style="color: #0000ff">="execution(*&nbsp;*Facade.*(..))"</span><span style="color: #ff0000">&nbsp;advice-ref</span><span style="color: #0000ff">="txAdvice"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">aop:advisor&nbsp;</span><span style="color: #ff0000">pointcut</span><span style="color: #0000ff">="execution(*&nbsp;*Manager.*(..))"</span><span style="color: #ff0000">&nbsp;advice-ref</span><span style="color: #0000ff">="txAdvice"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">aop:config</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">tx:advice&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="txAdvice"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">tx:attributes</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">tx:method&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="get*"</span><span style="color: #ff0000">&nbsp;read-only</span><span style="color: #0000ff">="true"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">tx:method&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="find*"</span><span style="color: #ff0000">&nbsp;read-only</span><span style="color: #0000ff">="true"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">tx:method&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="has*"</span><span style="color: #ff0000">&nbsp;read-only</span><span style="color: #0000ff">="true"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">tx:method&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="locate*"</span><span style="color: #ff0000">&nbsp;read-only</span><span style="color: #0000ff">="true"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">tx:method&nbsp;</span><span style="color: #ff0000">name</span><span style="color: #0000ff">="*"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">tx:attributes</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">tx:advice</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">beans</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<img src ="http://www.blogjava.net/baoyaer/aggbug/208872.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2008-06-18 14:54 <a href="http://www.blogjava.net/baoyaer/articles/208872.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>拟Google首页(dwr实现ajax) </title><link>http://www.blogjava.net/baoyaer/articles/204101.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Fri, 30 May 2008 07:29:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/204101.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/204101.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/204101.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/204101.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/204101.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 模拟Google首页(dwr实现ajax) 上周末听了在用友工作的两个学长的一个小讲座，虽然时间不长，但还是有些收获的，其中一个开发部的经理就提到了一些小的技术点，其中就包括dwr，回家后上网查了查相关资料，了解到dwr是一个java开源框架，它的诞生就是为了降低开发ajax的难度，原理类似于在javascript中调用java类，于是就使用dwr技术模拟Google首页做了个练习。由于正直全...&nbsp;&nbsp;<a href='http://www.blogjava.net/baoyaer/articles/204101.html'>阅读全文</a><img src ="http://www.blogjava.net/baoyaer/aggbug/204101.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2008-05-30 15:29 <a href="http://www.blogjava.net/baoyaer/articles/204101.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java远程通讯可选技术及原理 </title><link>http://www.blogjava.net/baoyaer/articles/202836.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Mon, 26 May 2008 01:44:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/202836.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/202836.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/202836.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/202836.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/202836.html</trackback:ping><description><![CDATA[<div class="postTitle">&nbsp;</div>
<div class="blog_content">Java远程通讯可选技术及原理 <br />
在分布式服务框架中，一个最基础的问题就是远程服务是怎么通讯的，在Java领域中有很多可实现远程通讯的技术，例如：RMI、MINA、ESB、 Burlap、Hessian、SOAP、EJB和JMS等，这些名词之间到底是些什么关系呢，它们背后到底是基于什么原理实现的呢，了解这些是实现分布式服务框架的基础知识，而如果在性能上有高的要求的话，那深入了解这些技术背后的机制就是必须的了，在这篇blog中我们将来一探究竟，抛砖引玉，欢迎大家提供更多的实现远程通讯的技术和原理的介绍。 <br />
<br />
基本原理 <br />
要实现网络机器间的通讯，首先得来看看计算机系统网络通信的基本原理，在底层层面去看，网络通信需要做的就是将流从一台计算机传输到另外一台计算机，基于传输协议和网络IO来实现，其中传输协议比较出名的有http、tcp、udp等等，http、tcp、udp都是在基于Socket概念上为某类应用场景而扩展出的传输协议，网络IO，主要有bio、nio、aio三种方式，所有的分布式应用通讯都基于这个原理而实现，只是为了应用的易用，各种语言通常都会提供一些更为贴近应用易用的应用层协议。 <br />
<br />
应用级协议 <br />
远程服务通讯，需要达到的目标是在一台计算机发起请求，另外一台机器在接收到请求后进行相应的处理并将结果返回给请求端，这其中又会有诸如one way request、同步请求、异步请求等等请求方式，按照网络通信原理，需要实现这个需要做的就是将请求转换成流，通过传输协议传输至远端，远端计算机在接收到请求的流后进行处理，处理完毕后将结果转化为流，并通过传输协议返回给调用端。 <br />
原理是这样的，但为了应用的方便，业界推出了很多基于此原理之上的应用级的协议，使得大家可以不用去直接操作这么底层的东西，通常应用级的远程通信协议会提供： <br />
1、为了避免直接做流操作这么麻烦，提供一种更加易用或贴合语言的标准传输格式； <br />
2、网络通信机制的实现，就是替你完成了将传输格式转化为流，通过某种传输协议传输至远端计算机，远端计算机在接收到流后转化为传输格式，并进行存储或以某种方式通知远端计算机。 <br />
所以在学习应用级的远程通信协议时，我们可以带着这几个问题进行学习： <br />
1、传输的标准格式是什么？ <br />
2、怎么样将请求转化为传输的流？ <br />
3、怎么接收和处理流？ <br />
4、传输协议是？ <br />
不过应用级的远程通信协议并不会在传输协议上做什么多大的改进，主要是在流操作方面，让应用层生成流和处理流的这个过程更加的贴合所使用的语言或标准，至于传输协议则通常都是可选的，在java领域中知名的有：RMI、XML-RPC、Binary-RPC、SOAP、CORBA、JMS，来具体的看看这些远程通信的应用级协议： <br />
-------------------------------------------------------------------------------------------------------------------------------------------------- <br />
RMI <br />
RMI是个典型的为java定制的远程通信协议，我们都知道，在single vm中，我们可以通过直接调用java object instance来实现通信，那么在远程通信时，如果也能按照这种方式当然是最好了，这种远程通信的机制成为RPC（Remote Procedure Call），RMI正是朝着这个目标而诞生的。 <br />
来看下基于RMI的一次完整的远程通信过程的原理： <br />
1、客户端发起请求，请求转交至RMI客户端的stub类； <br />
2、stub类将请求的接口、方法、参数等信息进行序列化； <br />
3、基于socket将序列化后的流传输至服务器端； <br />
4、服务器端接收到流后转发至相应的skelton类； <br />
5、skelton类将请求的信息反序列化后调用实际的处理类； <br />
6、处理类处理完毕后将结果返回给skelton类； <br />
7、Skelton类将结果序列化，通过socket将流传送给客户端的stub； <br />
8、stub在接收到流后反序列化，将反序列化后的Java Object返回给调用者。 <br />
来看jboss-remoting对于此过程的一个更好的图示：<br />
&nbsp;<img height="225" alt="" src="http://www.blogjava.net/images/blogjava_net/baoyaer/jboss-remoting-arch.jpg" width="710" border="0" /><br />
<br />
根据原理来回答下之前学习应用级协议带着的几个问题： <br />
1、传输的标准格式是什么？ <br />
是Java ObjectStream。 <br />
2、怎么样将请求转化为传输的流？ <br />
基于Java串行化机制将请求的java object信息转化为流。 <br />
3、怎么接收和处理流？ <br />
根据采用的协议启动相应的监听端口，当有流进入后基于Java串行化机制将流进行反序列化，并根据RMI协议获取到相应的处理对象信息，进行调用并处理，处理完毕后的结果同样基于java串行化机制进行返回。 <br />
4、传输协议是？ <br />
Socket。 <br />
-------------------------------------------------------------------------------------------------------------------------------------------------- <br />
XML-RPC <br />
XML-RPC也是一种和RMI类似的远程调用的协议，它和RMI的不同之处在于它以标准的xml格式来定义请求的信息(请求的对象、方法、参数等)，这样的好处是什么呢，就是在跨语言通讯的时候也可以使用。 <br />
来看下XML-RPC协议的一次远程通信过程： <br />
1、客户端发起请求，按照XML-RPC协议将请求信息进行填充； <br />
2、填充完毕后将xml转化为流，通过传输协议进行传输； <br />
3、接收到在接收到流后转换为xml，按照XML-RPC协议获取请求的信息并进行处理； <br />
4、处理完毕后将结果按照XML-RPC协议写入xml中并返回。 <br />
图示以上过程：<br />
&nbsp;<img height="270" alt="" src="http://www.blogjava.net/images/blogjava_net/baoyaer/xmlrpc.jpg" width="527" border="0" /><br />
<br />
同样来回答问题： <br />
1、传输的标准格式是？ <br />
标准格式的XML。 <br />
2、怎么样将请求转化为传输的流？ <br />
将XML转化为流。 <br />
3、怎么接收和处理流？ <br />
通过监听的端口获取到请求的流，转化为XML，并根据协议获取请求的信息，进行处理并将结果写入XML中返回。 <br />
4、传输协议是？ <br />
Http。 <br />
-------------------------------------------------------------------------------------------------------------------------------------------------- <br />
Binary-RPC <br />
Binary-RPC看名字就知道和XML-RPC是差不多的了，不同之处仅在于传输的标准格式由XML转为了二进制的格式。 <br />
同样来回答问题： <br />
1、传输的标准格式是？ <br />
标准格式的二进制文件。 <br />
2、怎么样将请求转化为传输的流？ <br />
将二进制格式文件转化为流。 <br />
3、怎么接收和处理流？ <br />
通过监听的端口获取到请求的流，转化为二进制文件，根据协议获取请求的信息，进行处理并将结果写入XML中返回。 <br />
4、传输协议是？ <br />
Http。 <br />
-------------------------------------------------------------------------------------------------------------------------------------------------- <br />
SOAP <br />
SOAP原意为Simple Object Access Protocol，是一个用于分布式环境的、轻量级的、基于XML进行信息交换的通信协议，可以认为SOAP是XML RPC的高级版，两者的原理完全相同，都是http+XML，不同的仅在于两者定义的XML规范不同，SOAP也是Webservice采用的服务调用协议标准，因此在此就不多加阐述了。 <br />
-------------------------------------------------------------------------------------------------------------------------------------------------- <br />
CORBA <br />
Common Object Request Broker Architecture （公用对象请求代理[调度]程序体系结构），是一组用来定义&#8220;分布式对象系统&#8221;的标准，由OMG(Object Menagement Group)作为发起和标准制定单位。CORBA的目的是定义一套协议，符合这个协议的对象可以互相交互，不论它们是用什么样的语言写的，不论它们运行于什么样的机器和操作系统。 <br />
CORBA在我看来是个类似于SOA的体系架构，涵盖可选的远程通信协议，但其本身不能列入通信协议这里来讲，而且CORBA基本淘汰，再加上对CORBA也不怎么懂，在此就不进行阐述了。 <br />
-------------------------------------------------------------------------------------------------------------------------------------------------- <br />
JMS <br />
JMS呢，是实现java领域远程通信的一种手段和方法，基于JMS实现远程通信时和RPC是不同的，虽然可以做到RPC的效果，但因为不是从协议级别定义的，因此我们不认为JMS是个RPC协议，但它确实是个远程通信协议，在其他的语言体系中也存在着类似JMS的东西，可以统一的将这类机制称为消息机制，而消息机制呢，通常是高并发、分布式领域推荐的一种通信机制，这里的主要一个问题是容错（详细见ErLang论文）。 <br />
来看JMS中的一次远程通信的过程： <br />
1、客户端将请求转化为符合JMS规定的Message； <br />
2、通过JMS API将Message放入JMS Queue或Topic中； <br />
3、如为JMS Queue，则发送中相应的目标Queue中，如为Topic，则发送给订阅了此Topic的JMS Queue。 <br />
4、处理端则通过轮训JMS Queue，来获取消息，接收到消息后根据JMS协议来解析Message并处理。 <br />
回答问题： <br />
1、传输的标准格式是？ <br />
JMS规定的Message。 <br />
2、怎么样将请求转化为传输的流？ <br />
将参数信息放入Message中即可。 <br />
3、怎么接收和处理流？ <br />
轮训JMS Queue来接收Message，接收到后进行处理，处理完毕后仍然是以Message的方式放入Queue中发送或Multicast。 <br />
4、传输协议是？ <br />
不限。 <br />
基于JMS也是常用的实现远程异步调用的方法之一。 <br />
（http://www.blogjava.net/BlueDavy/archive/2008/03/04/182077.html）（参考）</div>
<img src ="http://www.blogjava.net/baoyaer/aggbug/202836.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2008-05-26 09:44 <a href="http://www.blogjava.net/baoyaer/articles/202836.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Mina 应用开发---新手入门[转]</title><link>http://www.blogjava.net/baoyaer/articles/201576.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Tue, 20 May 2008 02:14:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/201576.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/201576.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/201576.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/201576.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/201576.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: MINA 基本类的描述在介绍架构之前先认识几个接口：IoAccepter 相当于网络应用程序中的服务器端IoConnector 相当于客户端IoSession 当前客户端到服务器端的一个连接实例。此会话将一直保持连接，除非网络断开或用户主动断开连接（session.close()）IoHandler 业务处理逻辑IoFilter 过滤器用于悬接通讯层接口与业务层接口...&nbsp;&nbsp;<a href='http://www.blogjava.net/baoyaer/articles/201576.html'>阅读全文</a><img src ="http://www.blogjava.net/baoyaer/aggbug/201576.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2008-05-20 10:14 <a href="http://www.blogjava.net/baoyaer/articles/201576.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>urlrewrite 的使用方法 </title><link>http://www.blogjava.net/baoyaer/articles/186994.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Tue, 18 Mar 2008 06:16:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/186994.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/186994.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/186994.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/186994.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/186994.html</trackback:ping><description><![CDATA[<div class="postText">这几天网络不好，都是台湾地震闹的，国外站点上不去，把以前下载的 appfuse 翻看了一下，里面带了个 <br />
urlrewrite-3.0-beta.jar ，看着网络上的资料，试着配了一下，记录如下：<br />
<br />
把上面这个包 放进lib目录，在xml中 添加过滤器&nbsp;&nbsp;<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Code_Closed_Image_102945" onclick="this.style.display='none'; Code_Closed_Text_102945.style.display='none'; Code_Open_Image_102945.style.display='inline'; Code_Open_Text_102945.style.display='inline';" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" width="11" align="top"  alt="" /><img id="Code_Open_Image_102945" style="display: none" onclick="this.style.display='none'; Code_Open_Text_102945.style.display='none'; Code_Closed_Image_102945.style.display='inline'; Code_Closed_Text_102945.style.display='inline';" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top"  alt="" /><span id="Code_Open_Text_102945" style="display: none"><br />
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080">&nbsp;1</span><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">rewriteFilter</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">logLevel</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">commons</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-mapping</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">10</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">rewriteFilter</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">11</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">url-pattern</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/*</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">url-pattern</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">12</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">filter-mapping</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">13</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span></span></div>
<br />
&nbsp;建立一个 urlrewrite.xml&nbsp;&nbsp; <br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Code_Closed_Image_103051" onclick="this.style.display='none'; Code_Closed_Text_103051.style.display='none'; Code_Open_Image_103051.style.display='inline'; Code_Open_Text_103051.style.display='inline';" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" width="11" align="top"  alt="" /><img id="Code_Open_Image_103051" style="display: none" onclick="this.style.display='none'; Code_Open_Text_103051.style.display='none'; Code_Closed_Image_103051.style.display='inline'; Code_Closed_Text_103051.style.display='inline';" height="16" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top"  alt="" /><span id="Code_Open_Text_103051" style="display: none"><br />
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080">&nbsp;1</span><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">&lt;?</span><span style="color: #ff00ff">xml&nbsp;version="1.0"&nbsp;encoding="utf-8"</span><span style="color: #0000ff">?&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;!</span><span style="color: #ff00ff">DOCTYPE&nbsp;urlrewrite&nbsp;PUBLIC&nbsp;"-//tuckey.org//DTD&nbsp;UrlRewrite&nbsp;3.0//EN"<br />
</span><span style="color: #008080">&nbsp;3</span><span style="color: #ff00ff"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;"http://tuckey.org/res/dtds/urlrewrite3.0.dtd"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">urlrewrite</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">rule</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">from</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">^/guide/([a-z]+)/([a-z]+)/([a-z]+)\.html$</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">from</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">to&nbsp;</span><span style="color: #ff0000">type</span><span style="color: #0000ff">="forward"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/guide.do?module=$1</span><span style="color: #ff0000">&amp;amp;</span><span style="color: #000000">submodule=$2</span><span style="color: #ff0000">&amp;amp;</span><span style="color: #000000">action=$3</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">to</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">rule</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">urlrewrite</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">10</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span></span></div>
&lt;from&gt;^/guide/([a-z]+)/([a-z]+)/([a-z]+)\.html$&lt;/from&gt; 这里是url地址栏里面显示的地址<br />
&nbsp;<span style="color: #0000ff">&lt;</span><span style="color: #800000">to&nbsp;</span><span style="color: #ff0000">type</span><span style="color: #0000ff">="forward"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/guide.do?module=$1</span><span style="color: #ff0000">&amp;amp;</span><span style="color: #000000">submodule=$2</span><span style="color: #ff0000">&amp;amp;</span><span style="color: #000000">action=$3</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">to</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span>&nbsp; 这里是实际的显示地址<br />
$1对应/guide/后面第一个([a-z]+)&nbsp;&nbsp; ，正则表达式匹配，如果你要传输数字，可以修改规则<br />
<br />
启动你的tomcat，&nbsp; 我这里输入的地址是&nbsp;&nbsp; <br />
<a href="http://suda:8888/guide/user/base/reguser.html?name=suda">http://suda:8888/guide/user/base/reguser.html?name=suda</a>&nbsp; 在我的<u><font color="#0000ff">name=suda 这个可以在action里面用<br />
</font></u>request.getParameter("name") 得到<br />
他实际访问的 地址是&nbsp;&nbsp;&nbsp; <a href="http://suda:8888/guide.do?module=user&amp;submodule=base&amp;action=reguser&amp;name=suda">http://suda:8888/guide.do?module=user&amp;submodule=base&amp;action=reguser&amp;name=suda</a><br />
<br />
配置就这样，<br />
</div>
<img src ="http://www.blogjava.net/baoyaer/aggbug/186994.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2008-03-18 14:16 <a href="http://www.blogjava.net/baoyaer/articles/186994.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Junit  结合spring+hibernate框架</title><link>http://www.blogjava.net/baoyaer/articles/168752.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Wed, 19 Dec 2007 06:52:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/168752.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/168752.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/168752.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/168752.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/168752.html</trackback:ping><description><![CDATA[<p>spring + hibernate的Junit测试框架： </p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;test.trs;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;junit.framework.TestCase;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.springframework.context.ApplicationContext;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.springframework.context.support.FileSystemXmlApplicationContext;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;org.springframework.core.io.FileSystemResource;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_287_755_Open_Image" onclick="this.style.display='none'; Codehighlighter1_287_755_Open_Text.style.display='none'; Codehighlighter1_287_755_Closed_Image.style.display='inline'; Codehighlighter1_287_755_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_287_755_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_287_755_Closed_Text.style.display='none'; Codehighlighter1_287_755_Open_Image.style.display='inline'; Codehighlighter1_287_755_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;DreamFactoryTest&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;TestCase&nbsp;</span><span id="Codehighlighter1_287_755_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_287_755_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;ApplicationContext&nbsp;factory;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_377_647_Open_Image" onclick="this.style.display='none'; Codehighlighter1_377_647_Open_Text.style.display='none'; Codehighlighter1_377_647_Closed_Image.style.display='inline'; Codehighlighter1_377_647_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_377_647_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_377_647_Closed_Text.style.display='none'; Codehighlighter1_377_647_Open_Image.style.display='inline'; Codehighlighter1_377_647_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setUp()&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Exception&nbsp;</span><span id="Codehighlighter1_377_647_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_377_647_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_417_574_Open_Image" onclick="this.style.display='none'; Codehighlighter1_417_574_Open_Text.style.display='none'; Codehighlighter1_417_574_Closed_Image.style.display='inline'; Codehighlighter1_417_574_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_417_574_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_417_574_Closed_Text.style.display='none'; Codehighlighter1_417_574_Open_Image.style.display='inline'; Codehighlighter1_417_574_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;[]location</span><span style="color: #000000">=</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;String[]</span><span id="Codehighlighter1_417_574_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_417_574_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">D:/workspace/EmailSubScribe/webapp/WEB-INF/beans.xml</span><span style="color: #000000">"</span><span style="color: #000000">,<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">D:/workspace/EmailSubScribe/webapp/WEB-INF/applicationContext.xml</span><span style="color: #000000">"</span><span style="color: #000000">}</span></span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;factory&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;FileSystemXmlApplicationContext(location);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_697_752_Open_Image" onclick="this.style.display='none'; Codehighlighter1_697_752_Open_Text.style.display='none'; Codehighlighter1_697_752_Closed_Image.style.display='inline'; Codehighlighter1_697_752_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_697_752_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_697_752_Closed_Text.style.display='none'; Codehighlighter1_697_752_Open_Image.style.display='inline'; Codehighlighter1_697_752_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;tearDown()&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Exception&nbsp;</span><span id="Codehighlighter1_697_752_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_697_752_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;factory</span><span style="color: #000000">=</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">super</span><span style="color: #000000">.tearDown();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<br />
<br />
继承的子类<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;test.trs.db.impl;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;test.trs.DreamFactoryTest;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;com.trs.db.dao.WebSiteConfigDao;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;com.trs.db.persistent.WebSiteConfig;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_207_462_Open_Image" onclick="this.style.display='none'; Codehighlighter1_207_462_Open_Text.style.display='none'; Codehighlighter1_207_462_Closed_Image.style.display='inline'; Codehighlighter1_207_462_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_207_462_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_207_462_Closed_Text.style.display='none'; Codehighlighter1_207_462_Open_Image.style.display='inline'; Codehighlighter1_207_462_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;WebSiteConfigImplTest&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;DreamFactoryTest&nbsp;</span><span id="Codehighlighter1_207_462_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_207_462_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;WebSiteConfigDao&nbsp;manager;<br />
<img id="Codehighlighter1_299_400_Open_Image" onclick="this.style.display='none'; Codehighlighter1_299_400_Open_Text.style.display='none'; Codehighlighter1_299_400_Closed_Image.style.display='inline'; Codehighlighter1_299_400_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_299_400_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_299_400_Closed_Text.style.display='none'; Codehighlighter1_299_400_Open_Image.style.display='inline'; Codehighlighter1_299_400_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;setUp()&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Exception&nbsp;</span><span id="Codehighlighter1_299_400_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_299_400_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">super</span><span style="color: #000000">.setUp();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;manager</span><span style="color: #000000">=</span><span style="color: #000000">(WebSiteConfigDao)factory.getBean(</span><span style="color: #000000">"</span><span style="color: #000000">WebSiteConfigDao</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img id="Codehighlighter1_439_457_Open_Image" onclick="this.style.display='none'; Codehighlighter1_439_457_Open_Text.style.display='none'; Codehighlighter1_439_457_Closed_Image.style.display='inline'; Codehighlighter1_439_457_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_439_457_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_439_457_Closed_Text.style.display='none'; Codehighlighter1_439_457_Open_Image.style.display='inline'; Codehighlighter1_439_457_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&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;testCascadeDelete()&nbsp;</span><span id="Codehighlighter1_439_457_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_439_457_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />.&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<img src ="http://www.blogjava.net/baoyaer/aggbug/168752.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-12-19 14:52 <a href="http://www.blogjava.net/baoyaer/articles/168752.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Quartz Job Scheduling Framework［翻译］第三章. Hello Quartz (二) </title><link>http://www.blogjava.net/baoyaer/articles/166554.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Mon, 10 Dec 2007 01:03:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/166554.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/166554.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/166554.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/166554.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/166554.html</trackback:ping><description><![CDATA[<div class="postText"><strong>3. 声明式部署一个 Job</strong> <br />
<br />
前面我们讨论过，尽可能的用声明式处理软件配置，其次才才虑编程式。再来看代码&nbsp; 3.6，如果我们要在 job 启动之后改变它的执行时间和频度，必须去修改源代码重新编译。这种方式只适用于小的例子程序，但是对于一个大且复杂的系统，这就成了一个问题了。因此，假如能以声明式部署 Quart Job 时，并且也是需求允许的情况下，你应该每次都选择这种方式。<br />
<br />
<strong>&#183;配置 quartz.properties 文件</strong><br />
<br />
文件 <font color="#800080">quartz.properties</font> 定义了 Quartz 应用运行时行为，还包含了许多能控制 Quartz 运转的属性。本章只会讲到它的基本配置；更多的高级设置将在以后讨论。在现阶段也不用太深入到每一项配置有效值的细节。<br />
<br />
现在我们来看看最基础的 <font color="#800080">quartz.properties</font> 文件，并讨论其中一些设置。代码 3.7 是一个修剪版的 <font color="#800080">quartz.propertis</font> 文件。<br />
<br />
<table width="650" align="center" border="0">
    <tbody>
        <tr>
            <td><strong>注</strong><br />
            &nbsp;Quartz 框架会为几乎所有的这些属性设定默认值。</td>
        </tr>
    </tbody>
</table>
<br />
<strong>代码 3.7. 基本的 Quartz Properties 文件</strong><br />
<br />
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-c">
    <li class="alt"><span><span class="preprocessor">#=============================================================== </span>&nbsp;</span>
    <li class=""><span><span class="preprocessor">#Configure&nbsp;Main&nbsp;Scheduler&nbsp;Properties </span>&nbsp;</span>
    <li class="alt"><span><span class="preprocessor">#=============================================================== </span><span>&nbsp;&nbsp;</span></span>
    <li class=""><span>org.quartz.scheduler.instanceName&nbsp;=&nbsp;QuartzScheduler &nbsp;&nbsp;</span>
    <li class="alt"><span>org.quartz.scheduler.instanceId&nbsp;=&nbsp;AUTO </span>&nbsp;
    <li class=""><span></span>
    <li class="alt"><span><span class="preprocessor">#=============================================================== </span>&nbsp;</span>
    <li class=""><span><span class="preprocessor">#Configure&nbsp;ThreadPool </span>&nbsp;</span>
    <li class="alt"><span><span class="preprocessor">#=============================================================== </span><span>&nbsp;&nbsp;</span></span>
    <li class=""><span>org.quartz.threadPool.threadCount&nbsp;=&nbsp;&nbsp;5 &nbsp;&nbsp;</span>
    <li class="alt"><span>org.quartz.threadPool.threadPriority&nbsp;=&nbsp;5 &nbsp;&nbsp;</span>
    <li class=""><span>org.quartz.threadPool.</span><span class="keyword">class</span><span>&nbsp;=&nbsp;org.quartz.simpl.SimpleThreadPool </span>&nbsp;
    <li class="alt"><span></span>
    <li class=""><span><span class="preprocessor">#=============================================================== </span>&nbsp;</span>
    <li class="alt"><span><span class="preprocessor">#Configure&nbsp;JobStore </span>&nbsp;</span>
    <li class=""><span><span class="preprocessor">#=============================================================== </span><span>&nbsp;&nbsp;</span></span>
    <li class="alt"><span>org.quartz.jobStore.</span><span class="keyword">class</span><span>&nbsp;=&nbsp;org.quartz.simpl.RAMJobStore </span>&nbsp;
    <li class=""><span></span>
    <li class="alt"><span><span class="preprocessor">#=============================================================== </span>&nbsp;</span>
    <li class=""><span><span class="preprocessor">#Configure&nbsp;Plugins </span>&nbsp;</span>
    <li class="alt"><span><span class="preprocessor">#=============================================================== </span><span>&nbsp;&nbsp;</span></span>
    <li class=""><span>org.quartz.plugin.jobInitializer.</span><span class="keyword">class</span><span>&nbsp;= &nbsp;&nbsp;</span>
    <li class="alt"><span>org.quartz.plugins.xml.JobInitializationPlugin &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>org.quartz.plugin.jobInitializer.overWriteExistingJobs&nbsp;=&nbsp;</span><span class="keyword">true</span><span>&nbsp;&nbsp;</span>
    <li class=""><span>org.quartz.plugin.jobInitializer.failOnFileNotFound&nbsp;=&nbsp;</span><span class="keyword">true</span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>org.quartz.plugin.jobInitializer.validating=</span><span class="keyword">false</span><span>&nbsp;&nbsp;</span></li>
</ol>
</div>
<br />
在代码 3.7 所示的 <font color="#800080">quartz.properties</font> 文件中，属性被逻辑上分为了四部分。属性在写法上无须要求分组或按特定的顺序。有 # 的行是注释行。<br />
<br />
<table width="650" align="center" border="0">
    <tbody>
        <tr>
            <td><strong>注</strong><br />
            这里讨论的并没有涉及到所有可能的设置，仅仅是一些基本的设置。也是你需要去熟悉的，能使声明式例子运转起来的必须的设置项。<font color="#800080">quartz.properties</font> 中的所有属性配置将会分散在本书中的各章节中依据所在章节涉及内容详细讨论。</td>
        </tr>
    </tbody>
</table>
<br />
<strong>&#183;调度器属性</strong><br />
<br />
第一部分有两行，分别设置调度器的实例名(<font color="#800080">instanceName</font>) 和实例 ID (<font color="#800080">instanceId</font>)。属性 <font color="#800080">org.quartz.scheduler.instanceName</font> 可以是你喜欢的任何字符串。它用来在用到多个调度器区分特定的调度器实例。多个调度器通常用在集群环境中。(Quartz 集群将会在第十一章，&#8220;Quartz 集群&#8221;中讨论)。现在的话，设置如下的一个字符串就行：<br />
<br />
<font color="#800080">org.quartz.scheduler.instanceName = QuartzScheduler</font><br />
<br />
实际上，这也是当你没有该属性配置时的默认值。<br />
<br />
代码 3.7 中显示的调度器的第二个属性是 <font color="#800080">org.quartz.scheduler.instanceId</font>。和 <font color="#800080">instaneName</font> 属性一样，<font color="#800080">instanceId</font> 属性也允许任何字符串。这个值必须是在所有调度器实例中是唯一的，尤其是在一个集群当中。假如你想 Quartz 帮你生成这个值的话，可以设置为 <font color="#800080">AUTO</font>。如果 Quartz 框架是运行在非集群环境中，那么自动产生的值将会是 <font color="#800080">NON_CLUSTERED</font>。假如是在集群环境下使用 Quartz，这个值将会是主机名加上当前的日期和时间。大多情况下，设置为 <font color="#800080">AUTO</font> 即可。<br />
<br />
<strong>&#183;线程池属性</strong><br />
<br />
接下来的部分是设置有关线程必要的属性值，这些线程在 Quartz 中是运行在后台担当重任的。<font color="#800080">threadCount </font>属性控制了多少个工作者线程被创建用来处理 Job。原则上是，要处理的 Job 越多，那么需要的工作者线程也就越多。<font color="#800080">threadCount </font>的数值至少为 <font color="#800080">1</font>。Quartz 没有限定你设置工作者线程的最大值，但是在多数机器上设置该值超过100的话就会显得相当不实用了，特别是在你的 Job 执行时间较长的情况下。这项没有默认值，所以你必须为这个属性设定一个值。<br />
<br />
<font color="#800080">threadPriority</font> 属性设置工作者线程的优先级。优先级别高的线程比级别低的线程更优先得到执行。threadPriority 属性的最大值是常量 <font color="#800080">java.lang.Thread.MAX_PRIORITY</font>，等于10。最小值为常量 <font color="#800080">java.lang.Thread.MIN_PRIORITY</font>，为1。这个属性的正常值是 <font color="#800080">Thread.NORM_PRIORITY</font>，为5。大多情况下，把它设置为5，这也是没指定该属性的默认值。<br />
<br />
最后一个要设置的线程池属性是 <font color="#800080">org.quartz.threadPool.class</font>。这个值是一个实现了 <font color="#800080">org.quartz.spi.ThreadPool</font> 接口的类的全限名称。Quartz 自带的线程池实现类是 <font color="#800080">org.quartz.smpl.SimpleThreadPool</font>，它能够满足大多数用户的需求。这个线程池实现具备简单的行为，并经很好的测试过。它在调度器的生命周期中提供固定大小的线程池。你能根据需求创建自己的线程池实现，如果你想要一个随需可伸缩的线程池时也许需要这么做。这个属性没有默认值，你必须为其指定值。<br />
<br />
<strong>&#183;作业存储设置</strong><br />
<br />
作业存储部分的设置描述了在调度器实例的生命周期中，Job 和 Trigger 信息是如何被存储的。我们还没有谈论到作业存储和它的目的；因为对当前例子是非必的，所以我们留待以后说明。现在的话，你所要了解的就是我们存储调度器信息在内存中而不是在关系型数据库中就行了。<br />
<br />
把调度器信息存储在内存中非常的快也易于配置。当调度器进程一旦被终止，所有的 Job 和 Trigger 的状态就丢失了。要使 Job 存储在内存中需通过设置&nbsp; <font color="#800080">org.quartz.jobStrore.class</font> 属性为 <font color="#800080">org.quartz.simpl.RAMJobStore</font>，就像在代码 3.7 所做的那样。假如我们不希望在 JVM 退出之后丢失调度器的状态信息的话，我们可以使用关系型数据库来存储这些信息。这需要另一个作业存储(JobStore) 实现，我们在后面将会讨论到。第五章&#8220;Cron Trigger 和其他&#8221;和第六章&#8220;作业存储和持久化&#8221;会提到你需要用到的不同类型的作业存储实现。<br />
<br />
<strong>&#183;插件配置<br />
</strong><br />
在这个简单的 <font color="#800080">quartz.properties</font> 文件中最后一部分是你要用到的 Quart 插件的配置。插件常常在别的开源框架上使用到，比如 Apache 的 Struts 框架(见 <a href="http://struts.apache.org/">http://struts.apache.org</a>)。<br />
<br />
一个声明式扩框架的方法就是通过新加实现了 <font color="#800080">org.quartz.spi.SchedulerPlugin</font> 接口的类。<font color="#800080">SchedulerPlugin</font>&nbsp;&nbsp;接口中有给调度器调用的三个方法。<br />
<br />
<table width="560" align="center" border="0">
    <tbody>
        <tr>
            <td><strong>注</strong><br />
            Quartz 插件会在第八章&#8220;使用 Quartz 插件&#8221;中详细讨论</td>
        </tr>
    </tbody>
</table>
<br />
要在我们的例子中声明式配置调度器信息，我们会用到一个 Quartz 自带的叫做 <font color="#800080">org.quartz.plugins.xml.JobInitializationPlugin</font> 的插件。<br />
<br />
默认时，这个插件会在 classpath 中搜索名为 quartz_jobs.xml 的文件并从中加载 Job 和 Trigger 信息。<br />
<br />
在下一节中讨论 <font color="#800080">quartz_jobs.xml</font> 文件，这是我们所参考的非正式的 Job 定义文件。<br />
<br />
<table width="650" align="center" border="0">
    <tbody>
        <tr>
            <td><strong>注</strong><br />
            默认时，插件 <font color="#800080">JobInitializationPlugin</font> 在 classpath 中寻找 <font color="#800080">quartz_jobs.xml</font> 文件。你可以覆盖相应设置强制这个插件使用不同的文件名查找。要做到这个，你必须设置上一节讨论的 <font color="#800080">quartz.properties</font> 中的文件名。目前，我们就使用默认的文件名 <font color="#800080">quartz_jobs.xml</font>，至于如何修改 <font color="#800080">quartz.properties</font> 中相应设置会在本章中后面讲到。</td>
        </tr>
    </tbody>
</table>
<br />
<strong>&#183;使用 <font color="#800080">quartz_jobx.xml</font> 文件<br />
</strong><br />
代码 3.8 就是目录扫描例子的 Job 定义的 XML 文件。正如代码 3.5 所示例子那样，这里我们用的是声明式途径来配置 Job 和 Trigger 信息的。<br />
<br />
<strong>代码 3.8. ScanDirectory Job 的 quartz_jobs.xml<br />
</strong>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;?</span><span class="tag-name">xml</span><span>&nbsp;</span><span class="attribute">version</span><span>=</span><span class="attribute-value">'1.0'</span><span>&nbsp;</span><span class="attribute">encoding</span><span>=</span><span class="attribute-value">'utf-8'</span><span class="tag">?&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span class="tag">&lt;</span><span class="tag-name">quartz</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">job</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">job-detail</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">name</span><span class="tag">&gt;</span><span>ScanDirectory</span><span class="tag">&lt;/</span><span class="tag-name">name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">group</span><span class="tag">&gt;</span><span>DEFAULT</span><span class="tag">&lt;/</span><span class="tag-name">group</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">description</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A&nbsp;job&nbsp;that&nbsp;scans&nbsp;a&nbsp;directory&nbsp;for&nbsp;files &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">description</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">job-class</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.cavaness.quartzbook.chapter3.ScanDirectoryJob &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">job-class</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">volatility</span><span class="tag">&gt;</span><span>false</span><span class="tag">&lt;/</span><span class="tag-name">volatility</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">durability</span><span class="tag">&gt;</span><span>false</span><span class="tag">&lt;/</span><span class="tag-name">durability</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">recover</span><span class="tag">&gt;</span><span>false</span><span class="tag">&lt;/</span><span class="tag-name">recover</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">job-data-map</span><span>&nbsp;</span><span class="attribute">allows-transient-data</span><span>=</span><span class="attribute-value">"true"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">entry</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">key</span><span class="tag">&gt;</span><span>SCAN_DIR</span><span class="tag">&lt;/</span><span class="tag-name">key</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">value</span><span class="tag">&gt;</span><span>c:\quartz-book\input</span><span class="tag">&lt;/</span><span class="tag-name">value</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">entry</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">job-data-map</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">job-detail</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">trigger</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">simple</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">name</span><span class="tag">&gt;</span><span>scanTrigger</span><span class="tag">&lt;/</span><span class="tag-name">name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">group</span><span class="tag">&gt;</span><span>DEFAULT</span><span class="tag">&lt;/</span><span class="tag-name">group</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">job-name</span><span class="tag">&gt;</span><span>ScanDirectory</span><span class="tag">&lt;/</span><span class="tag-name">job-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">job-group</span><span class="tag">&gt;</span><span>DEFAULT</span><span class="tag">&lt;/</span><span class="tag-name">job-group</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">start-time</span><span class="tag">&gt;</span><span>2005-06-10&nbsp;6:10:00&nbsp;PM</span><span class="tag">&lt;/</span><span class="tag-name">start-time</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comments">&lt;!--&nbsp;repeat&nbsp;indefinitely&nbsp;every&nbsp;10&nbsp;seconds&nbsp;--&gt;</span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">repeat-count</span><span class="tag">&gt;</span><span>-1</span><span class="tag">&lt;/</span><span class="tag-name">repeat-count</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">repeat-interval</span><span class="tag">&gt;</span><span>10000</span><span class="tag">&lt;/</span><span class="tag-name">repeat-interval</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">simple</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">trigger</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">job</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class=""><span class="tag">&lt;/</span><span class="tag-name">quartz</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
</ol>
</div>
<br />
<font color="#800080">&lt;job&gt;</font> 元素描述了一个要注册到调度器上的 Job，相当于我们在前面章节中使用 <font color="#800080">scheduleJob()</font> 方法那样。你所看到的<font color="#800080">&lt;job-detail&gt;</font> 和&nbsp; <font color="#800080">&lt;trigger&gt;</font> 这两个元素就是我们在代码 3.5 中以编程式传递给方法 <font color="#800080">schedulerJob()</font> 的参数。前面本质上是与这里一样的，只是现在用的是一种较流行声明的方式。你还可以对照着代码 3.5 中的例子来看在代码3.8 中我们是如何设置 <font color="#800080">SCAN_DIR</font> 属性到 <font color="#800080">JobDataMap</font> 中的。<br />
<br />
<font color="#800080">&lt;trigger&gt;</font>元素也是非常直观的：它使用前面同样的属性，但更简单的建立一个 <font color="#800080">SimpleTrigger</font>。因此代码 3.8 仅仅是一种不同的(可论证的且更好的)方式做了代码 3.5 中同样的事情。显然，你也可以支持多个 Job。在代码3.6 中我们编程的方式那么做的，也能用声明的方式来支持。代码 3.9 显示了与代码 3.6 可比较的版本<br />
<br />
<strong>代码 3.9. 你能在一个 quartz_jobs.xml 文件中指定多个 Job<br />
</strong><br />
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;?</span><span class="tag-name">xml</span><span>&nbsp;</span><span class="attribute">version</span><span>=</span><span class="attribute-value">'1.0'</span><span>&nbsp;</span><span class="attribute">encoding</span><span>=</span><span class="attribute-value">'utf-8'</span><span class="tag">?&gt;</span><span>&nbsp;&nbsp;</span></span>
    <li class=""><span>&nbsp;&nbsp;</span>
    <li class="alt"><span class="tag">&lt;</span><span class="tag-name">quartz</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">job</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">job-detail</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">name</span><span class="tag">&gt;</span><span>ScanDirectory1</span><span class="tag">&lt;/</span><span class="tag-name">name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">group</span><span class="tag">&gt;</span><span>DEFAULT</span><span class="tag">&lt;/</span><span class="tag-name">group</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">description</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A&nbsp;job&nbsp;that&nbsp;scans&nbsp;a&nbsp;directory&nbsp;for&nbsp;files &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">description</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">job-class</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.cavaness.quartzbook.chapter3.ScanDirectoryJob &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">job-class</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">volatility</span><span class="tag">&gt;</span><span>false</span><span class="tag">&lt;/</span><span class="tag-name">volatility</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">durability</span><span class="tag">&gt;</span><span>false</span><span class="tag">&lt;/</span><span class="tag-name">durability</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">recover</span><span class="tag">&gt;</span><span>false</span><span class="tag">&lt;/</span><span class="tag-name">recover</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">job-data-map</span><span>&nbsp;</span><span class="attribute">allows-transient-data</span><span>=</span><span class="attribute-value">"true"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">entry</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">key</span><span class="tag">&gt;</span><span>SCAN_DIR</span><span class="tag">&lt;/</span><span class="tag-name">key</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">value</span><span class="tag">&gt;</span><span>c:\quartz-book\input1</span><span class="tag">&lt;/</span><span class="tag-name">value</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">entry</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">job-data-map</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">job-detail</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">trigger</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">simple</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">name</span><span class="tag">&gt;</span><span>scanTrigger1</span><span class="tag">&lt;/</span><span class="tag-name">name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">group</span><span class="tag">&gt;</span><span>DEFAULT</span><span class="tag">&lt;/</span><span class="tag-name">group</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">job-name</span><span class="tag">&gt;</span><span>ScanDirectory1</span><span class="tag">&lt;/</span><span class="tag-name">job-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">job-group</span><span class="tag">&gt;</span><span>DEFAULT</span><span class="tag">&lt;/</span><span class="tag-name">job-group</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">start-time</span><span class="tag">&gt;</span><span>2005-07-19&nbsp;8:31:00&nbsp;PM</span><span class="tag">&lt;/</span><span class="tag-name">start-time</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comments">&lt;!--&nbsp;repeat&nbsp;indefinitely&nbsp;every&nbsp;10&nbsp;seconds&nbsp;--&gt;</span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">repeat-count</span><span class="tag">&gt;</span><span>-1</span><span class="tag">&lt;/</span><span class="tag-name">repeat-count</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">repeat-interval</span><span class="tag">&gt;</span><span>10000</span><span class="tag">&lt;/</span><span class="tag-name">repeat-interval</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">simple</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">trigger</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class=""><span class="tag">&lt;/</span><span class="tag-name">job</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;</span>
    <li class=""><span class="tag">&lt;</span><span class="tag-name">job</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">job-detail</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">name</span><span class="tag">&gt;</span><span>ScanDirectory2</span><span class="tag">&lt;/</span><span class="tag-name">name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">group</span><span class="tag">&gt;</span><span>DEFAULT</span><span class="tag">&lt;/</span><span class="tag-name">group</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">description</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A&nbsp;job&nbsp;that&nbsp;scans&nbsp;a&nbsp;directory&nbsp;for&nbsp;files &nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">description</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">job-class</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;org.cavaness.quartzbook.chapter3.ScanDirectoryJob &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">job-class</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">volatility</span><span class="tag">&gt;</span><span>false</span><span class="tag">&lt;/</span><span class="tag-name">volatility</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">durability</span><span class="tag">&gt;</span><span>false</span><span class="tag">&lt;/</span><span class="tag-name">durability</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">recover</span><span class="tag">&gt;</span><span>false</span><span class="tag">&lt;/</span><span class="tag-name">recover</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">job-data-map</span><span>&nbsp;</span><span class="attribute">allows-transient-data</span><span>=</span><span class="attribute-value">"true"</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">entry</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">key</span><span class="tag">&gt;</span><span>SCAN_DIR</span><span class="tag">&lt;/</span><span class="tag-name">key</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">value</span><span class="tag">&gt;</span><span>c:\quartz-book\input2</span><span class="tag">&lt;/</span><span class="tag-name">value</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">entry</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">job-data-map</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">job-detail</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">trigger</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">simple</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">name</span><span class="tag">&gt;</span><span>scanTrigger2</span><span class="tag">&lt;/</span><span class="tag-name">name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">group</span><span class="tag">&gt;</span><span>DEFAULT</span><span class="tag">&lt;/</span><span class="tag-name">group</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">job-name</span><span class="tag">&gt;</span><span>ScanDirectory2</span><span class="tag">&lt;/</span><span class="tag-name">job-name</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">job-group</span><span class="tag">&gt;</span><span>DEFAULT</span><span class="tag">&lt;/</span><span class="tag-name">job-group</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">start-time</span><span class="tag">&gt;</span><span>2005-06-10&nbsp;6:10:00&nbsp;PM</span><span class="tag">&lt;/</span><span class="tag-name">start-time</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comments">&lt;!--&nbsp;repeat&nbsp;indefinitely&nbsp;every&nbsp;15&nbsp;seconds&nbsp;--&gt;</span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">repeat-count</span><span class="tag">&gt;</span><span>-1</span><span class="tag">&lt;/</span><span class="tag-name">repeat-count</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">repeat-interval</span><span class="tag">&gt;</span><span>15000</span><span class="tag">&lt;/</span><span class="tag-name">repeat-interval</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">simple</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">trigger</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class=""><span>&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">job</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span class="tag">&lt;/</span><span class="tag-name">quartz</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
</ol>
</div>
<br />
<strong>&#183;为插件修改 <font color="#800080">quartz.properties</font> 配置</strong><br />
<br />
在本章前面，告诉过你的是，<font color="#800080">JobInitializationPlugin</font> 找寻 <font color="#800080">quartz_jobs.xml</font> 来获得声明的 Job 信息。假如你想改变这个文件名，你需要修改 quartz.properties 来告诉插件去加载那个文件。例如，假如你想要 Quartz 从名为 <font color="#800080">my_quartz_jobs.xml</font> 的 XML 文件中加载 Job 信息，你不得不为插件指定这一文件名。代码 3.10 显示了怎么完成这个配置；我们现在是最后一次在这里重复说明这一插件部分。<br />
<br />
<strong>代码 3.10. 为 JobInitializationPlugin 修改&nbsp;quartz.properties</strong><br />
<br />
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-c">
    <li class="alt"><span><span>org.quartz.plugin.jobInitializer.</span><span class="keyword">class</span><span>&nbsp;=&nbsp;</span></span><span>org.quartz.plugins.xml.JobInitializationPlugin &nbsp;&nbsp;</span>
    <li class="alt">
    <li class=""><span>org.quartz.plugin.jobInitializer.fileName&nbsp;=&nbsp;my_quartz_jobs.xml &nbsp;&nbsp;</span>
    <li class="alt"><span>&nbsp;&nbsp;</span>
    <li class=""><span>org.quartz.plugin.jobInitializer.overWriteExistingJobs&nbsp;=&nbsp;</span><span class="keyword">true</span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>org.quartz.plugin.jobInitializer.validating&nbsp;=&nbsp;</span><span class="keyword">false</span><span>&nbsp;&nbsp;</span>
    <li class=""><span>org.quartz.plugin.jobInitializer.overWriteExistingJobs&nbsp;=&nbsp;</span><span class="keyword">false</span><span>&nbsp;&nbsp;</span>
    <li class="alt"><span>org.quartz.plugin.jobInitializer.failOnFileNotFound&nbsp;=&nbsp;</span><span class="keyword">true</span><span>&nbsp;&nbsp;</span></li>
</ol>
</div>
<br />
在代码 3.10中，我们添加了属性 <font color="#800080">org.quartz.plugin.jobInitializer.fileName</font> 并设置该属性值为我们想要的文件名。这个文件名要对 classloader 可见，也就是说要在 classpath 下。<br />
<br />
当 Quartz 启动后读取 <font color="#800080">quartz.properties</font> 文件，然后初始化插件。它会传递上面配置的所有属性给插件，这时候插件也就得到通知去搜寻不同的文件。<br />
<br />
译者后记：<br />
想了又想，关于动词的 &#8220;Schedule&#8221; 还是选择&#8220;部署&#8221;，此前用的是&#8220;安排&#8221;，感觉不那么正式。当然英语中&#8220;部署&#8221;基本都用&#8220;Deploy&#8221;对应，平时与同事交流 Quartz 方面的技术都是说&#8220;往调度器上部署一个 Job&#8221;的，只要词能达意就行。<br />
<br />
对于 &#8220;register with the Scheduler&#8221;，有时候是用的&#8220;通过调度器来注册&#8221;，有时候是&#8220;注册到调度器上&#8221;，意思基本一致的。 <br />
<br />
<br />
<br />
<strong>4. 打包 Quartz 应用程序</strong> <br />
<br />
让我们最后简单讨论打包一个用到了 Quarts 框架的应用程序的流程，也以此来结束本章的内容。<br />
<br />
<strong>&#183;Quartz 第三方依赖包<br />
</strong><br />
从 1.5 版的发行包开始，你会看到一个 <font color="#800080">&lt;QUARTZ_HOME&gt;\lib</font> 目录，在这个目录，你会发现几个子目录：<br />
<br />
<font color="#800080">&#183;&lt;QUARTZ_HOME&gt;\lib\core<br />
&#183;&lt;QUARTZ_HOME&gt;\lib\optional<br />
&#183;&lt;QUARTZ_HOME&gt;\lib\build</font><br />
<br />
作为开发呢，你绝对是需求 Quartz JAR 包，也需要其他一些依赖包。需要哪些第三方包还依赖于你是运行在独立环境中还是作为一个 J2EE 发行包的一部份。典型的，jakarta Commons 库 (commons-loggin, commons-beanutils，还有其他的) 总是要用到。然而，当你是部署到一个应用服务器环境中，你需要确保不能把那些在应用服务器上已存在的包拷过去；如果你这样做的，你可能回得到非常奇怪的结果。<br />
<br />
表 3.1 列出了第三方包的信息，帮助你确定是否需要在应用中包含它们<br />
<br />
<strong>
<div align="center">表 3.1.&nbsp;Quartz&nbsp; 第三方包，必须/可选</div>
</strong><br />
<table width="700" align="center" border="0">
    <tbody>
        <tr>
            <td width="25%">名称</td>
            <td>必须/备注</td>
            <td>网址</td>
        </tr>
        <tr>
        </tr>
        <tr>
            <td><font color="#800080">activation.jar</font></td>
            <td>主要是 JavaMail 要用到</td>
            <td><a href="http://java.sun.com/products/javabeans/glasgow/jaf.html">http://java.sun.com/products/javabeans/glasgow/jaf.html</a></td>
        </tr>
        <tr>
        </tr>
        <tr>
            <td><font color="#800080">commons-beanutils.jar</font></td>
            <td>是</td>
            <td><a href="http://jakarta.apache.org/commons/beanutils">http://jakarta.apache.org/commons/beanutils</a></td>
        </tr>
        <tr>
        </tr>
        <tr>
            <td><font color="#800080">commons-collections.jar</font></td>
            <td>是</td>
            <td><a href="http://jakarta.apache.org/commons/collections">http://jakarta.apache.org/commons/collections</a></td>
        </tr>
        <tr>
        </tr>
        <tr>
            <td><font color="#800080">commons-dbcp-1.1.jar</font></td>
            <td>是，假如用到数据库作为作业存储</td>
            <td><a href="http://jakarta.apache.org/commons/dbcp">http://jakarta.apache.org/commons/dbcp</a></td>
        </tr>
        <tr>
        </tr>
        <tr>
            <td><font color="#800080">commons-digester.jar</font></td>
            <td>是</td>
            <td>假如你使用了某些插件，就需要它</td>
        </tr>
        <tr>
        </tr>
        <tr>
            <td><font color="#800080">commons-logging.jar</font></td>
            <td>是</td>
            <td><a href="http://jakarta.apache.org/commons/logging/">http://jakarta.apache.org/commons/logging/</a></td>
        </tr>
        <tr>
        </tr>
        <tr>
            <td><font color="#800080">commons-pool-1.1.jar</font></td>
            <td></td>
            <td><a href="http://jakarta.apache.org/commons/pool/">http://jakarta.apache.org/commons/pool/</a></td>
        </tr>
        <tr>
        </tr>
        <tr>
            <td><font color="#800080">javamail.jar</font></td>
            <td>发送 e-mail 用</td>
            <td><a href="http://java.sun.com/products/javamail/">http://java.sun.com/products/javamail/</a></td>
        </tr>
        <tr>
        </tr>
        <tr>
            <td><font color="#800080">jdbc2_0-stdext.jar</font></td>
            <td>是，假如用到数据库作为作业存储</td>
            <td><a href="http://java.sun.com/products/jdbc/">http://java.sun.com/products/jdbc/</a></td>
        </tr>
        <tr>
        </tr>
        <tr>
            <td><font color="#800080">jta.jar</font></td>
            <td>是，假如用到数据库作为作业存储</td>
            <td><a href="http://java.sun.com/products/jta/database">http://java.sun.com/products/jta/database</a></td>
        </tr>
        <tr>
        </tr>
        <tr>
            <td><font color="#800080">quartz.jar</font></td>
            <td>是</td>
            <td>Quart 框架核心包</td>
        </tr>
        <tr>
        </tr>
        <tr>
            <td><font color="#800080">servlet.jar</font></td>
            <td>假如使用了Servlet 容器，但容器中应该存在</td>
            <td><a href="http://java.sun.com/products/servlet/">http://java.sun.com/products/servlet/</a></td>
        </tr>
        <tr>
        </tr>
        <tr>
            <td><font color="#800080">log4j.jar</font></td>
            <td>来吧，谁没用过它呢？</td>
            <td><a href="http://logging.apache.org/">http://logging.apache.org/</a></td>
        </tr>
        <tr>
        </tr>
    </tbody>
</table>
<p><br />
<strong>&#183;配置和属性文件</strong><br />
<br />
你还必须在你的应用中包含 quartz.properties。假如你是应散装(exploded format) 形式部署应用，你应该把 quartz.properties 文件放置在类加载器能够加载的目录中。(所谓的 &#8220;exploed&#8221; 形式指不打成一个 JAR、WAR、EAR 或者其他 Java 包，以独立文件存在于文件系统中) 例如，如果你有一个 classes 目录(比如一个 Web 应用的 WEB-INF/classes 目录)，就可以把 quartz.properties 文件放在那儿。假如你以 Java 打包形式部署，应该放属性文件放在包的根下。在对待 quartz_job.xml 文件时也使用同样的规则。</p>
</div>
<img src ="http://www.blogjava.net/baoyaer/aggbug/166554.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-12-10 09:03 <a href="http://www.blogjava.net/baoyaer/articles/166554.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Quartz Job Scheduling Framework［翻译］第三章. Hello Quartz （一）</title><link>http://www.blogjava.net/baoyaer/articles/166552.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Mon, 10 Dec 2007 01:01:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/166552.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/166552.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/166552.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/166552.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/166552.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 第三章：Hello Quartz多数读者都较容易从一个简明扼要的例子中明白一个东西。作为写作者，要注意避免把一章的内容精简地几乎什么都没了；作为读者呢，需要有耐心并且要进一步相信其后相关的章节应该去阅读，尽管这个例子看起来是如此之简单。有了这种初衷，这一章将为你介绍如何用 Quartz 框架创建一个简单的应用程序，它展示了一个典型的应用。这个例子将让你领略到创建和执行一个简单应用的...&nbsp;&nbsp;<a href='http://www.blogjava.net/baoyaer/articles/166552.html'>阅读全文</a><img src ="http://www.blogjava.net/baoyaer/aggbug/166552.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-12-10 09:01 <a href="http://www.blogjava.net/baoyaer/articles/166552.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Quartz Job Scheduling Framework［翻译］第二章. Quartz 起步 </title><link>http://www.blogjava.net/baoyaer/articles/166551.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Mon, 10 Dec 2007 00:59:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/166551.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/166551.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/166551.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/166551.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/166551.html</trackback:ping><description><![CDATA[<div class="postText"><strong>第二章. Quartz 起步</strong> <br />
<br />
本章对 Quartz 框架一个快速的入门介绍，同时也大略指导你从哪里下载，构建和安装这个框架<br />
<br />
<strong>1. Quartz 框架的发展历程</strong><br />
和现今许多在用的开源项目一样，Quartz之初也只是为个人开发者提供了一个简单的实现方案。但是随着日益增多的关键人员的积极参与和慷慨的贡献，Quartz 已经成为了一个为众人所知，并且能帮助人们解决更大问题的框架。<br />
<br />
Quartz 项目&nbsp;是由 James House 创立的，它在1998年就有该框架最初的构思。包括作业队列的概念，使用线程池来处理作业，也许它最早的模型已不为现今的Quartz使用者所知了。<br />
<br />
在接下来的数年中，House 自己说他一直在关注着同一个需求：需要一个灵活的作业调度工具。他在找寻便宜且具有丰富特征的Java作业调度工具时，让他面临着以下几个选择：<br />
&nbsp;&nbsp;&nbsp; &#183;一个昂贵的商业化工具<br />
&nbsp;&nbsp;&nbsp; &#183;嵌入在大框架之中的，根本用不着这么一个大框架<br />
&nbsp;&nbsp;&nbsp;&nbsp;&#183;类似 Unix Cron 或者 Windows 的计划任务<br />
&nbsp;&nbsp;&nbsp; &#183;自己亲自定制的方案<br />
<br />
House 有限的选择和在这个问题上的兴趣促成了他为作业调度器创建一个开源的项目。在2001年春天，他在 SourceForge 上创立了该项目，这一网址 <a href="http://sourceforge.net/projects/quartz">http://sourceforge.net/projects/quartz</a> 现在还是有效的，只是已经不再维护了。<br />
<br />
自从 Quartz 的雏形一出来，众多的捐助者和开发人员加入到这个项目中来。然而应该说，Quartz 能象今天这么存在还是要感谢 House 以及他在作业调度领域中的兴趣。在众多人眼中，他那解决问题的决心很值得称颂的。<br />
<br />
<strong>2. 下载和安装 Quartz<br />
<br />
</strong>在 Quartz 的主页面 <a href="http://www.opensymphony.com/quartz">http://www.opensymphony.com/quartz</a> 中有下载链接（由 OpenSymphony 提供的主机服务）。在这里你可获取到最新版，也有几个早期版本供下载。Quartz 下过来是一个完整的发行版，其中包括源代码和已编译好可直接使用的 JAR 文件。Quartz 的 JAR 包还存在于 ibiblio (译者注：<a href="http://www.ibiblio.org/maven/">http://www.ibiblio.org/maven/</a>)&nbsp;maven 仓库中，很方便于你用 Maven (译者注：一个比ANT更为强大的构建工具)&nbsp; 或者 Ivy(译者注：一个免费基于Java的依赖管理器) 来构建系统。<br />
<br />
下载到的是一个 ZIP 格式文件，因此你需要一个像 WINZIP 那样的工具，你还可以用 Java 的 jar 命令来解压缩该文件：<br />
<br />
<font color="#cc3399">jar -xvf quartz-1.5.0-rc1.zip<br />
<br />
</font><font color="#000000">Quartz 发行包中的文件将会解压到当前目录中。<br />
<br />
解开来的 Quartz zip 文件包含以下几个子目录。表 2.1 描述了每一个子目录的内容。<br />
<br />
</font>表 2.1&nbsp; Quartz 的目录结构和内容
<table style="width: 600px">
    <tbody>
        <tr>
            <td>目录名</td>
            <td>存放内容</td>
        </tr>
        <tr>
            <td><font color="#800080">Docs</font></td>
            <td></td>
        </tr>
        <tr>
            <td><font color="#800080">docs/api</font></td>
            <td>Quartz 框架的JavaDoc Api 说明文档</td>
        </tr>
        <tr>
            <td><font color="#800080">docs/dbTables</font></td>
            <td>创建 Quartz 的数据库对象的脚本</td>
        </tr>
        <tr>
            <td><font color="#800080">docs/wikidocs</font></td>
            <td>Quartz 的帮助文件，点击 index.html 开始查看</td>
        </tr>
        <tr>
            <td>Examples</td>
            <td>多方面使用 Quartz 的例子</td>
        </tr>
        <tr>
            <td>Lib</td>
            <td>Quartz&nbsp;使用到的第三方包</td>
        </tr>
        <tr>
            <td><font color="#800080">src/java/org/quartz</font></td>
            <td>使用 Quartz 的客户端程序源代码，公有 API</td>
        </tr>
        <tr>
            <td><font color="#800080">src/java/org/quartz/core</font></td>
            <td>使用 Quartz 的服务端程序源代码，私有 API</td>
        </tr>
        <tr>
            <td><font color="#800080">src/java/org/quartz/simpl</font></td>
            <td>Quartz 提供的不衣赖于第三方产品的简单实现</td>
        </tr>
        <tr>
            <td><font color="#800080">src/java/org/quartz/impl</font></td>
            <td>依赖于第三方产品的支持模块的实现</td>
        </tr>
        <tr>
            <td><font color="#800080">src/java/org/quartz/utils</font></td>
            <td>整个框架要用到的辅助类和工具组件</td>
        </tr>
        <tr>
            <td><font color="#800080">src/jboss</font></td>
            <td>提供了特定于 JBoss 特性的源代码</td>
        </tr>
        <tr>
            <td><font color="#800080">src/oracle</font></td>
            <td>提供了特定于 Oracle 特性的源代码</td>
        </tr>
        <tr>
            <td><font color="#800080">src/weblogic</font></td>
            <td>提供了特定于 WebLogic 特性的源代码</td>
        </tr>
    </tbody>
</table>
<br />
安装必要的 JAR 文件<br />
<br />
如果你急于想让 Quartz 工作起来，那么最快捷的方法是获取到已编译打包好的 Quartz JAR 文件（它存在于解压后的根目录下），并把它加到你的应用程序的 Classpath 上，你还需要获取到 Quartz 所依赖的包。表 2.2 列出了要创建一个 Quartz 应用最基本的包。<br />
<br />
Quartz 基本应用所需的 JAR 包<br />
<table style="width: 650px">
    <tbody>
        <tr>
            <td>名称</td>
            <td>位置</td>
            <td>备注</td>
        </tr>
        <tr>
            <td><font color="#800080">Commons BeanUtils</font></td>
            <td><font color="#800080">&lt;quartz-download&gt;/ lib/optional</font></td>
            <td>依赖于怎么使用 Quartz, 最好是包含进来</td>
        </tr>
        <tr>
            <td><font color="#800080">Commons Collections</font></td>
            <td><font color="#800080">&lt;quartz-download&gt;/ lib/core</font></td>
            <td>需要</td>
        </tr>
        <tr>
            <td><font color="#800080">Commons Digester</font></td>
            <td><font color="#800080">&lt;quartz-download&gt;/ lib/optional</font></td>
            <td>依赖于怎么使用 Quartz, 最好是包含进来</td>
        </tr>
        <tr>
            <td><font color="#800080">Commons Logging</font></td>
            <td><font color="#800080">&lt;quartz-download&gt;/ lib/core</font></td>
            <td>需要</td>
        </tr>
    </tbody>
</table>
<br />
就像使用 Quartz JAR 包一样，你同样需要把所依赖的包加到应用程序的 Classpath 中。<br />
<br />
<table style="border-right: 1px; border-top: 1px; border-left: 1px; width: 650px; border-bottom: 1px" align="center" border="1">
    <tbody>
        <tr>
            <td><strong>当心版本冲突<br />
            </strong>Quartz 同特定版本的第三方包构建并作过测试。许多其他的项目，包括一些非常知名的应用服务器也使用着这些第三方库，在某些情况下，这些库已然成了应用服务器的组成部份。类加载器是一个很神奇的东西。假如你是在应用服务器环境中使用 Quartz，小心不要用到了重复的库，不然你可能会得到奇怪的执行结果。表 2.1 中的包如果它们已存在于应用服务器中，你的程序应该能运行的很好。然而，像 <font color="#800080">servlet.jar</font> 和 <font color="#800080">ejb.jar</font> 这样的包要是重复出现在 classpath 中，恐怕会给你带来麻烦。这个时候你可以试着不把这类包加到 classpath 中，看看程序的运行表现。</td>
        </tr>
    </tbody>
</table>
<p><br />
&#183;<font color="#800080">quartz.properties</font> 文件<br />
Quartz 包括一个名为 <font color="#800080">quartz.properties</font> 的配置文件，它允许你对 Quartz 的很多方面的配置。在 Quartz JAR 包中有一个默认的 <font color="#800080">quartz.properties</font> 文件，但是假如你需要修改任何默认配置项时，你需要放置一个 quartz.properties 文件持贝在 classpath 下。<br />
<br />
下一章将详细描述 quartz.properties 中哪些选项可配置和如何配置。你将有极大的可能性要去修改其中的一或多项设置，因此你应该拷贝一份 <font color="#800080">quartz.properties</font> 文件到你的 classpath 下。<br />
<br />
<strong>3. 从源代码构建 Quartz<br />
<br />
</strong>下载到的Quartz包括源代码和可部署的JAR文件。有了源代码的好处之一是你可以深入去理解它是如何实现以及实现了什么。阅读源代码方便了想深入研究它的开发人员。如果是用像 Eclipse 那样的 IDE 想要单步跟进到代码中，那么源代码肯定是少不了的。(译者注：怎么感觉原文挺啰嗦的)</p>
<p>Quartz CVS 仓库</p>
<p>Quartz 的 CVS 仓库和别的 OpenSymphony 项目一块，都是着落在 Java.net 主机上。想要从 CVS 仓库中下载任何东西的话，你必须要有一个 CVS 帐号。当然，你也能在 xwork.dev.java.net/source/browse/quartz 上以匿名的方式浏览源代码，但是要下载的话就必须要有 CVS 帐号。<br />
<br />
</p>
<table style="border-right: 1px; border-top: 1px; border-left: 1px; width: 600px; border-bottom: 1px" align="center" border="1">
    <tbody>
        <tr>
            <td><strong>创建一个 Java.net 帐号</strong><br />
            你可以登录到网址：http://www.dev.java.net/servlets/Join 注册一个免费的 Java.net 帐号。使用申请的帐号不仅能存取 Quartz CVS 仓库中的代码，而且还能够在这个站点上找到大量的有用的信息和技巧（见 http://www.java.net）。 </td>
        </tr>
    </tbody>
</table>
<p>创建好了帐号之后，你可以下载所需的文件用来构建 Quartz. 大致步骤是，打开命令行，进入到你希望工程存放的目录。通过 CVS 取代码后会在当前目录中创建两个子目录，quartz 和 opensymphony.</p>
<p><font color="#800080">cvs -d :pserver:[username]@cvs.dev.java.net:/cvs login<br />
cvs -d :pserver:[username]@cvs.dev.java.net:/cvs checkout quartz</font></p>
<p>和</p>
<p><font color="#800080">cvs -d :pserver:[username]@cvs.dev.java.net:/<br />
cvs checkout opensymphony</font></p>
<p>替换上面的[username]为你自己的帐号（命令中不带中括号）。</p>
<p>下载完这两个模块之后，命令行下进入到 quartz 子目录，并输入：</p>
<p><font color="#800080">ant -projecthelp<br />
<br />
</font>该命令会列出所有的 target 和对应的描述。默认的 target 是构建 Quartz JAR 文件的 "<font color="#800080">jar</font>"；你可以在命令行下只输入 "ant"，将会给你编译打包出一个 Quartz <font color="#800080">JAR</font> 文件来。</p>
<p>&nbsp;</p>
<table style="border-right: 1px; border-top: 1px; border-left: 1px; width: 600px; border-bottom: 1px" align="center" border="1">
    <tbody>
        <tr>
            <td><strong>IDE中由源代码进行构建</strong><br />
            需要指出的是，几个 Quartz 包依赖于第三方的产品的，比如 JBoss 和 WebLogic. 当使用 Ant 的 build 文件从源代码进行构建时，默认的设置是，找不到第三方的包时会忽略构建那些组件。假如你的IDE中包括了完整的 Quarts 源代码，而又没有第三方产品的包，将会出现编译错误。最简单的方法是不要在IDE中包含那些源码。幸运的是，Quart 源码的层次和结构性很清晰，因此你可以在IDE中选择不包含某些目录/包。 </td>
        </tr>
    </tbody>
</table>
<p><br />
<strong>4. 从 Quartz 社区获得帮助<br />
</strong><br />
通常评定一个开源项目的一个关键指标是它的用户社区的健康状况。参与到开源项目中完全是自愿的，并且是没有任何回报的，这也是为大家所认同的，用户应该是充满着热花费他们的时间在项目中。因此，自然给人的感觉就是，假如有一个令人满意的社区的话，用户就会相信这个项目的价值。</p>
<p>Quartz 的用户社区相当活跃的。和其他许多开源项目一样，大部份社区成都以匿名的方式查看列表和消息；少部分人发周占贴和回答别人的问题。Quartz 用户社区六个月以来就达到了一个很高的发贴记录，用户论坛收到了超过分属于500个不同主题的1500条消息，和惊人的25000人查看了贴子。这些甚至还不包括开发者列表中的消息。假如你注意到这六个月来的数字变化，你就能看出是一个上升趋势。从下载数量来看，Quartz 平均每月下载量在2000和3000之间。这些数字在有新版本发布时变的更高。</p>
<p>你能在网页 <a href="http://forums.opensymphony.com/">http://forums.opensymphony.com</a> 找到进入用户或开发者论坛的链接，你也能够从 Quartz 的首页面 <a href="http://www.opensymphony.com/quartz">http://www.opensymphony.com/quartz</a> 进入那两个论坛。也建议你注册加入到邮件列表中；假如感觉不错的话，可以加入到项目中，以任何自己所能的方式做有助于项目的事情。</p>
<p><strong>5. 谁在用 Quartz?<br />
</strong>开源软件一个常被人询问的问题是，"谁在使用它?"。如果有人在使用它，人们头脑中的观念就会觉得它一定很好，并且可安全的使用。尽管 Quartz 出来有好长一阵子了，但它最近才得到开发社区应得的关注。</p>
<p>使用了 Quartz 的用户和项目列表许多是我们耳熟能详的。你能在 Quartz Wike 网站 <a href="http://wiki.opensymphony.com/display/QRTZ1/Quartz+Users">http://wiki.opensymphony.com/display/QRTZ1/Quartz+Users</a> 看到这个列表。Quartz 是作为其中的那些知名开源项目的一部分存在，这些开源项目包括有：JIRA, Spring 和几个 Jakarta 项目。</p>
<p>没有一个准确的方法获知到底有多少用户在实际的项目中使用 Quartz。但是从下载次数以及某些当前流行的项目正在使用 Quartz 可推断出，Quartz 的使用者应该是数以千计。<br />
<br />
第二章到此结束，会继续未尽的革命事业。<br />
-----------------------------------<br />
看别人译作，不时也会指手划脚起来，可真待到自己去把英文转成中文时，才有些体会，有些一眼看过去很明了的原句，换成中文愣是难找到一个合适的词，同时对原句一知半解时，转换起来就要受些阻，强行过去难免要跑意了......</p>
</div>
<img src ="http://www.blogjava.net/baoyaer/aggbug/166551.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-12-10 08:59 <a href="http://www.blogjava.net/baoyaer/articles/166551.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Quartz Job Scheduling Framework［翻译］第一章. 企业应用中的作业调度 </title><link>http://www.blogjava.net/baoyaer/articles/166550.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Mon, 10 Dec 2007 00:58:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/166550.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/166550.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/166550.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/166550.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/166550.html</trackback:ping><description><![CDATA[<div class="postText">
<p><strong>第一章.&nbsp; 企业应用中的作业调度</strong> <br />
<br />
&#183;什么是作业调度<br />
&#183;作业调度为什么说是重要的<br />
&#183;企业应用中的作业调度<br />
&#183;非企业应用中的作业调度<br />
&#183;作业调度与工作流<br />
&#183;关于作业调度其他可选择方案<br />
<br />
<strong>1. 什么是作业调度</strong><br />
&#8220;作业&#8221;，这一技术述语上的概念，又让我们回到了大型机的年代，那时候，用户/程序员提交一叠穿孔卡片或者纸带（上面描述了一个作业）给操作人员，由操作人员帮忙执行那些作业。用户等待作业执行完后，回到主机那边取自己的卡片和打印出来的输出结果。<br />
<br />
因为不是每一个作业要求立即被执行，所以作业可以被安排在将来的某个时候执行。比如说，一个系统管理员每天晚上可能有一份要执行的作业列表：<br />
&#183; 10:00 PM: 运行患者信息文件的上载作业<br />
&#183; 11:00 PM: 运行销售数据报表生成<br />
&#183; 11:59 PM: 进行数据库的备份<br />
<br />
作业调度通常是指运行一个批量的作业或称之谓批处理。这种批处理作业一般都是放在后台运行并且不需要与用户交互。现在，显著增多的多样性的任务已代替了早先的批量作业。在一个大的组织中每天的每小时跑上百个作业已属普遍。并且作业的规模与复杂性仍在持续的上扬，因此批量作业和作业调度器也就随需应生。<br />
<br />
<strong>2. 作业调度为什么说是重要的<br />
</strong>俗话说，&#8220;时间就是金钱。&#8221;，过高的资源投入到枯燥的任务中无疑是金钱和资源的浪费。随着业务流程复杂性的提升，自动化流程也更能显现出它的有益之处来。图 1.1 说明了这一问题。<br />
<br />
图1.1　任务规规模越大、越复杂、越频繁的被执行，那么能从自动化中获益也越大<br />
<br />
<img src="http://www.blogjava.net/images/blogjava_net/Unmi/23785/r_QuartzFigure1.1.JPG"  alt="" /><br />
人之所以称之为人，国为我们犯错误的频度远高于电脑。把一系列任务自动安置到一个作业中，然后再为这个作业创建一个调度器，到时这个作业就会自动执行了。相对于人的手工处理，我们可以减少大多数的出错机会。<br />
<br />
作业调度器的另一个优点体现在伸缩性。我们也许能一个小时中手工完成10或20个作业，但是随着每小时处理作业数量的增加，我们就更难杜绝不在作业中引入错误。但如果借助于作业调度，只会受到硬件资源的影响了。<br />
<br />
所以我们能着实的说通过作业调度那样自动化处理相对于手工来说，至少为我们提供了以下三个优点：<br />
<br />
&#183;资源使用效率更高<br />
&#183;更少的出错机率<br />
&#183;更高的伸缩性<br />
<br />
<strong>3. 企业应用中的作业调度</strong><br />
&#8220;企业应用&#8221;一词，如今经常会被我们无意识间提及，然而似乎现在还没有对它一个准确的定义。但对于在本书中这一词的意义，我们只要建立起这样一个概念：作为某一组织的一部份而存在的软件系统或程序。这个系统可以是一个大型机上的、或者是一个C/S结构的、或者就是一个J2EE应用。真实世界中的例子就是，作业调度器能在那个系统上大量的使用。以下的几个场景，尽管没有详尽的进行描绘，也涉及到了现今应用软件常常遇到的场景。<br />
<br />
场景 #1: 邮件提醒和告警<br />
许多网站（不管是商业的还是别的）允许用户提供用户名和密码注册一个帐户。出于安全考虑，一个好的做法是让用户密码每隔一段时间过期失效，比如说90天的周期。这种情况下，你可以创建一个作业，让它每天午夜运行一次，并且向离过期时间不到三天的所有用户发邮件提醒。这里可以恰到好处的用到作业调度器。图 1.2 描绘了密码这个提醒作业。<br />
<br />
图 1.2&nbsp; 密码过期的作业每晚发送邮件给密码很快会过期的用户<br />
<img src="http://www.blogjava.net/images/blogjava_net/Unmi/23785/r_QuartzFigure1.2.JPG"  alt="" /><br />
除了发过期的密码信息，网站还可以发送其他的告警或提醒（可不是垃圾邮件哦）。一个作业调度器还能够用在类似的其他方面。<br />
<br />
场景 #2: 执行文件传输操作<br />
许多商家需要和他们的供应商或客户作信息集成。一种集成的方式就是进行数据文件的交换。可以采用实时的方式，例如SOAP协议，但是许多时候却不需要实时性，代之以异步的方式，譬如用FTP协议来发出或取所要的文件。<br />
<br />
下图描绘了一个劳工补偿局每天早上收到一些包含患者及事故信息的文件。公司可以雇一个人每天早上手工的检出FTP服务器上的文件。作为另一个更好的选择就是可以写一个作业，让它每天早上扫描FTP服务器，如果有文件的话，把文件内容处理后插入到患者数据库中去。让作业调度器代劳后，这个职员再也不用手工去上FTP检查文件，而可以为公司做更多别的更有意义的事情。图1.3 描绘了文件传输的操作。<br />
<br />
图 1.3. 文件传输的作业检查FTP站点，把患者信息文件处理到数据库中。<br />
</p>
<p><img src="http://www.blogjava.net/images/blogjava_net/Unmi/23785/r_QuartzFigure1.3.JPG"  alt="" /> <br />
场景 #3: 创建销售报表<br />
<br />
公司经营由盈亏账目所驱动，其中一个很重要的事情就是经营管理者和财务人员需要拿到最终收入和毛利数据进行分析。抽取销售报表数据可能非常的慢并且很耗资源，因为这通常需要联合多个表从中查询出上千条记录。一个更好的解决途径是在晚上计帐和计价结束后，运行一个作业，让它去生成一些临时表或视图为报表程序所用。创建临时表或视图的方式，使报表生成更具动态特性，而且用户也用不着平白去等待报表的生成，一些报表工具，如水晶报表 XI(Crystal Reports XI) 本身就包含了作业调度器（见图1.4）。</p>
<p>图 1.4. 销售数据报表程序执行为销售团队产生收入和毛利信息<br />
<img src="http://www.blogjava.net/images/blogjava_net/Unmi/23785/r_QuartzFigure1.4.JPG"  alt="" /><br />
<br />
<strong>4. 非企业应用中的作业调度<br />
</strong>Quartz 对于许多非企业环境的应用也是很有帮助的。例如，假定你有一个独立的应用程序，事件是基于时钟而不是鼠标的点击激发的。这时候你就可以把Quartz构建到这个应用程序中来，并且安排事件能周期性的被触发。<br />
<br />
另一例子是，你也许正想查询数据库并发送邮件，而邮件接受者正是基于这些数据得到的。（译者注：真有些搞不明白）<br />
<br />
<strong>5. 作业调度与工作流</strong></p>
<p>作业调度不是工作流，理解这一点很重的要。它们常被同时应用于一个方案中，但它们是两个截然不同的解决办法，并且都可孤立使用。一个作业通常由几个步骤组成。我们回过头来看前面提到的那个密码过期的作业，实质上它是由三个步骤所组成。<br />
<br />
&nbsp;&nbsp; 1. 获取到密码将要过期的用户列表<br />
&nbsp;&nbsp; 2. 为列表中的用户各自发送一个邮件<br />
&nbsp;&nbsp; 3. 更新记录，下次就能知道哪些邮件发送过</p>
<p>这个作业可以使用工作流的优点，作业的每一部份恰好对应着工作流的每一个步骤。这并非意味着离开了工作流，作业调度会有些糟。这是普通的下一步、下一步简单操作。只要作业调度框架与第三方工作流能轻便的解决问题，就是好的。更多的关于Quartz和工作流的内容将会在第十四章，&#8220;使用Quartz和工作流&#8221;详解。</p>
<p><strong>6. 关于作业调度其他可选择方案<br />
</strong><br />
正如你所知，这本书是讲Quartz的，但是Quartz的可替代方案呢？当我们比较作业调度方案的时候肯定要提到别的同类应用，那么现在就来简单介绍一下它们。<br />
<br />
Java SDK Timer 和 TimerTask 类<br />
java.util.Timer和java.util.TimerTask这两个类是自1.3版本才加入到JDK中来的。这两个新类可以实现一个最基本的调度器。也就只能作为我们理想的完整调度器框架的一个小的部件。任何严格意义的作业调度器都提供直接指定执行时间，存储作业信息到多种介绍和使用钩子进行定制及其他更多的功能。单纯靠JDK的那两个类还不足以构建一个真正的作业调度器。JAVA的Timer类也没办法对作业和触发器作相应的组织，使用每任务一个线程，而不是线程池的方式，还有其他不足之处难以成全其实现一个完全意义的作业调度器。<br />
<br />
本土方案</p>
<p>从前面提到的Timer和TimerTask类来看，我们很容易低估创建一个灵活的、并且日后可扩展的作业调度器所作出的努力。创建一个作业调度器也不视之为微不足道的活儿。它需要的不仅仅是Java线程方面的专业技术，还需要解决其他更复杂的课题。如果你没有这方面成熟的专业知识，别想着作业调度器能直接随意一份草稿能一蹴而就。</p>
<p>商业解决方案</p>
<p>现在市面上也能见到不少商业的作业调度产品。在本书中，我们不打算花功夫去了解和评估那些商业化产品。表1.1 中列出了当下流行的几个解决方案，你可以通过所给相应的URL获得更详尽的信息。</p>
<p>表 1.1 商业作业调度器</p>
<table style="width: 600px">
    <tbody>
        <tr>
            <td>名称</td>
            <td>网址</td>
        </tr>
        <tr>
            <td>Flux Scheduler</td>
            <td><a href="http://www.fluxcorp.com/" taget="_blank">www.fluxcorp.com/</a> </td>
        </tr>
        <tr>
            <td>Enterprise Batching Queuing</td>
            <td><a href="http://www.argent.com/p/qe/qe.html" taget="_blank">www.argent.com/p/qe/qe.html</a> </td>
        </tr>
        <tr>
            <td>Unicenter AutoSys Job Management 4.5</td>
            <td><a href="http://www.ca.com/" taget="_blank">www.ca.com</a> </td>
        </tr>
        <tr>
            <td>BMC Software ControlM</td>
            <td><a href="http://www.bmc.com/" taget="_blank">www.bmc.com</a> </td>
        </tr>
        <tr>
            <td>Cybermation ESP Espresso 4.2</td>
            <td><a href="http://www.cybermation.corly;9'm/" taget="_blank">www.cybermation.corly;9'm</a> </td>
        </tr>
        <tr>
            <td>Vexus consulting Avatar Job Scheduling Suite 4.5.5</td>
            <td><a href="http://www.vexus.ca/" taget="_blank">www.vexus.ca</a> </td>
        </tr>
        <tr>
            <td>Argent software The Argent Job Scheduler 4.5A</td>
            <td><a href="http://www.argent.com/" taget="_blank">www.argent.com</a> </td>
        </tr>
        <tr>
            <td>Tidal Enterprise Scheduler</td>
            <td><a href="http://www.tidalsoftware.com/" taget="_blank">www.tidalsoftware.com</a> </td>
        </tr>
    </tbody>
</table>
</div>
<img src ="http://www.blogjava.net/baoyaer/aggbug/166550.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-12-10 08:58 <a href="http://www.blogjava.net/baoyaer/articles/166550.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Quartz任务调度快速入门 </title><link>http://www.blogjava.net/baoyaer/articles/155645.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Wed, 24 Oct 2007 09:41:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/155645.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/155645.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/155645.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/155645.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/155645.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 概述            了解Quartz体系结构            Quartz对任务调度的领域问题进行了高度的抽象，提出了调度器、任务和触发器这3个核心的概念，并在org.quartz通过接口和类对重要的这些核心概念进行描述：            ●Job：是一个接口，只有一个方法void execute(JobExecutionContext context)，开发者实现...&nbsp;&nbsp;<a href='http://www.blogjava.net/baoyaer/articles/155645.html'>阅读全文</a><img src ="http://www.blogjava.net/baoyaer/aggbug/155645.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-10-24 17:41 <a href="http://www.blogjava.net/baoyaer/articles/155645.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Apache Commons工具集</title><link>http://www.blogjava.net/baoyaer/articles/155251.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Tue, 23 Oct 2007 05:03:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/155251.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/155251.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/155251.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/155251.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/155251.html</trackback:ping><description><![CDATA[<p><br />
&nbsp;</p>
<p>&nbsp;<br />
Apache Commons包含了很多开源的工具，用于解决平时编程经常会遇到的问题，减少重复劳动。我选了一些比较常用的项目做简单介绍。文中用了很多网上现成的东西，我只是做了一个汇总整理。 <br />
一、Commons BeanUtils</p>
<p>http://jakarta.apache.org/commons/beanutils/index.html</p>
<p>说明：针对Bean的一个工具集。由于Bean往往是有一堆get和set组成，所以BeanUtils也是在此基础上进行一些包装。</p>
<p>使用示例：功能有很多，网站上有详细介绍。一个比较常用的功能是Bean Copy，也就是copy bean的属性。如果做分层架构开发的话就会用到，比如从PO（Persistent Object）拷贝数据到VO（Value Object）。</p>
<p>传统方法如下：</p>
<p>//得到TeacherForm</p>
<p>TeacherForm teacherForm=(TeacherForm)form;</p>
<p>//构造Teacher对象</p>
<p>Teacher teacher=new Teacher();</p>
<p>//赋值<br />
teacher.setName(teacherForm.getName());<br />
teacher.setAge(teacherForm.getAge());<br />
teacher.setGender(teacherForm.getGender());<br />
teacher.setMajor(teacherForm.getMajor());<br />
teacher.setDepartment(teacherForm.getDepartment());</p>
<p>//持久化Teacher对象到数据库<br />
HibernateDAO= ;<br />
HibernateDAO.save(teacher);</p>
<p>使用BeanUtils后，代码就大大改观了，如下所示：</p>
<p>//得到TeacherForm<br />
TeacherForm teacherForm=(TeacherForm)form;<br />
//构造Teacher对象<br />
Teacher teacher=new Teacher();</p>
<p>//赋值<br />
BeanUtils.copyProperties(teacher,teacherForm);</p>
<p>//持久化Teacher对象到数据库<br />
HibernateDAO= ;<br />
HibernateDAO.save(teacher);</p>
<p>二、Commons CLI</p>
<p>http://jakarta.apache.org/commons/cli/index.html</p>
<p>说明：这是一个处理命令的工具。比如main方法输入的string[]需要解析。你可以预先定义好参数的规则，然后就可以调用CLI来解析。</p>
<p>使用示例：</p>
<p>// create Options object<br />
Options options = new Options();<br />
// add t option, option is the command parameter, false indicates that<br />
// this parameter is not required.</p>
<p>options.addOption(&#8220;t&#8221;, false, &#8220;display current time&#8221;);<br />
options.addOption("c", true, "country code");</p>
<p>CommandLineParser parser = new PosixParser();<br />
CommandLine cmd = parser.parse( options, args);</p>
<p>if(cmd.hasOption("t")) {<br />
&nbsp;&nbsp;&nbsp; // print the date and time<br />
}else {<br />
&nbsp;&nbsp;&nbsp; // print the date<br />
}</p>
<p>// get c option value<br />
String countryCode = cmd.getOptionValue("c");</p>
<p>if(countryCode == null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp; // print default date<br />
}else {<br />
&nbsp;&nbsp;&nbsp;&nbsp; // print date for country specified by countryCode<br />
}</p>
<p>三、Commons Codec</p>
<p>http://jakarta.apache.org/commons/codec/index.html</p>
<p>说明：这个工具是用来编码和解码的，包括Base64，URL，Soundx等等。用这个工具的人应该很清楚这些，我就不多介绍了。</p>
<p>四、Commons Collections</p>
<p>http://jakarta.apache.org/commons/collections/</p>
<p>说明：你可以把这个工具看成是java.util的扩展。</p>
<p>使用示例：举一个简单的例子</p>
<p>OrderedMap map = new LinkedMap();<br />
map.put("FIVE", "5");<br />
map.put("SIX", "6");<br />
map.put("SEVEN", "7");<br />
map.firstKey(); // returns "FIVE"<br />
map.nextKey("FIVE"); // returns "SIX"<br />
map.nextKey("SIX"); // returns "SEVEN" </p>
<p>五、Commons Configuration</p>
<p>http://jakarta.apache.org/commons/configuration/</p>
<p>说明：这个工具是用来帮助处理配置文件的，支持很多种存储方式</p>
<p>1. Properties files<br />
2. XML documents<br />
3. Property list files (.plist)<br />
4. JNDI<br />
5. JDBC Datasource<br />
6. System properties<br />
7. Applet parameters<br />
8. Servlet parameters</p>
<p>使用示例：举一个Properties的简单例子</p>
<p># usergui.properties, definining the GUI,<br />
colors.background = #FFFFFF<br />
colors.foreground = #000080<br />
window.width = 500<br />
window.height = 300</p>
<p><br />
PropertiesConfiguration config = new PropertiesConfiguration("usergui.properties");<br />
config.setProperty("colors.background", "#000000);<br />
config.save();</p>
<p>config.save("usergui.backup.properties);//save a copy<br />
Integer integer = config.getInteger("window.width");</p>
<p>Commons DBCP</p>
<p>http://jakarta.apache.org/commons/dbcp/</p>
<p>说明：Database Connection pool, Tomcat就是用的这个，不用我多说了吧，要用的自己去网站上看说明。</p>
<p><br />
六、Commons DbUtils</p>
<p>http://jakarta.apache.org/commons/dbutils/</p>
<p>说明：我以前在写数据库程序的时候，往往把数据库操作单独做一个包。DbUtils就是这样一个工具，以后开发不用再重复这样的工作了。值得一体的是，这个工具并不是现在流行的OR-Mapping工具（比如Hibernate），只是简化数据库操作，比如</p>
<p>QueryRunner run = new QueryRunner(dataSource);</p>
<p>// Execute the query and get the results back from the handler<br />
Object[] result = (Object[]) run.query("SELECT * FROM Person WHERE name=?", "John Doe");</p>
<p>七、Commons FileUpload</p>
<p>http://jakarta.apache.org/commons/fileupload/</p>
<p>说明：jsp的上传文件功能怎么做呢？</p>
<p>使用示例：</p>
<p>// Create a factory for disk-based file items<br />
FileItemFactory factory = new DiskFileItemFactory();<br />
// Create a new file upload handler<br />
ServletFileUpload upload = new ServletFileUpload(factory);</p>
<p><br />
// Parse the request<br />
List /* FileItem */ items = upload.parseRequest(request);<br />
// Process the uploaded items<br />
Iterator iter = items.iterator();<br />
while (iter.hasNext()) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileItem item = (FileItem) iter.next();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (item.isFormField()) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; processFormField(item);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; processUploadedFile(item);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
}</p>
<p>八、Commons HttpClient</p>
<p>http://jakarta.apache.org/commons/httpclient/</p>
<p>说明：这个工具可以方便通过编程的方式去访问网站。</p>
<p>使用示例：最简单的Get操作</p>
<p>GetMethod get = new GetMethod("http://jakarta.apache.org");</p>
<p>// execute method and handle any error responses.</p>
<p>...</p>
<p>InputStream in = get.getResponseBodyAsStream();<br />
// Process the data from the input stream.<br />
get.releaseConnection();</p>
<p>九、Commons IO</p>
<p>http://jakarta.apache.org/commons/io/</p>
<p>说明：可以看成是java.io的扩展，我觉得用起来非常方便。</p>
<p>使用示例：</p>
<p>1．读取Stream</p>
<p>标准代码：</p>
<p>InputStream in = new URL( "http://jakarta.apache.org" ).openStream();<br />
try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InputStreamReader inR = new InputStreamReader( in );<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BufferedReader buf = new BufferedReader( inR );<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String line;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while ( ( line = buf.readLine() ) != null ) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println( line );<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; } finally {<br />
&nbsp;&nbsp;&nbsp;&nbsp; in.close();<br />
&nbsp;&nbsp; }</p>
<p>使用IOUtils</p>
<p>InputStream in = new URL( "http://jakarta.apache.org" ).openStream();<br />
try {<br />
&nbsp;&nbsp;&nbsp;&nbsp; System.out.println( IOUtils.toString( in ) );<br />
} finally {<br />
&nbsp;&nbsp;&nbsp;&nbsp; IOUtils.closeQuietly(in);<br />
}</p>
<p>2．读取文件</p>
<p>File file = new File("/commons/io/project.properties");<br />
List lines = FileUtils.readLines(file, "UTF-8");</p>
<p>3．察看剩余空间<br />
long freeSpace = FileSystemUtils.freeSpace("C:/");</p>
<p>十、Commons JXPath</p>
<p>http://jakarta.apache.org/commons/jxpath/</p>
<p>说明：Xpath你知道吧，那么JXpath就是基于Java对象的Xpath，也就是用Xpath对Java对象进行查询。这个东西还是很有想像力的。</p>
<p>使用示例：<br />
Address address = (Address)JXPathContext.newContext(vendor).<br />
getValue("locations[address/zipCode='90210']/address");</p>
<p>上述代码等同于<br />
Address address = null;<br />
Collection locations = vendor.getLocations();<br />
Iterator it = locations.iterator();<br />
while (it.hasNext()){<br />
&nbsp;&nbsp;&nbsp;&nbsp; Location location = (Location)it.next();<br />
&nbsp;&nbsp;&nbsp;&nbsp; String zipCode = location.getAddress().getZipCode();<br />
&nbsp;&nbsp;&nbsp;&nbsp; if (zipCode.equals("90210")){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; address = location.getAddress();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
}</p>
<p>十一、Commons Lang</p>
<p>http://jakarta.apache.org/commons/lang/</p>
<p>说明：这个工具包可以看成是对java.lang的扩展。提供了诸如StringUtils, StringEscapeUtils, RandomStringUtils, Tokenizer, WordUtils等工具类。</p>
<p>十二、Commons Logging</p>
<p>http://jakarta.apache.org/commons/logging/</p>
<p>说明：你知道Log4j吗？</p>
<p><br />
十三、Commons Math</p>
<p>http://jakarta.apache.org/commons/math/</p>
<p>说明：看名字你就应该知道这个包是用来干嘛的了吧。这个包提供的功能有些和Commons Lang重复了，但是这个包更专注于做数学工具，功能更强大。</p>
<p>十四、Commons Net</p>
<p>http://jakarta.apache.org/commons/net/</p>
<p>说明：这个包还是很实用的，封装了很多网络协议。</p>
<p>1. FTP<br />
2. NNTP<br />
3. SMTP<br />
4. POP3<br />
5. Telnet<br />
6. TFTP<br />
7. Finger<br />
8. Whois<br />
9. rexec/rcmd/rlogin<br />
10. Time (rdate) and Daytime<br />
11. Echo<br />
12. Discard<br />
13. NTP/SNTP</p>
<p>使用示例：<br />
TelnetClient telnet = new TelnetClient();<br />
telnet.connect( "192.168.1.99", 23 );<br />
InputStream in = telnet.getInputStream();<br />
PrintStream out = new PrintStream( telnet.getOutputStream() );<br />
...<br />
telnet.close(); </p>
<p>十五、Commons Validator</p>
<p>http://jakarta.apache.org/commons/validator/</p>
<p>说明：用来帮助进行验证的工具。比如验证Email字符串，日期字符串等是否合法。</p>
<p>使用示例：</p>
<p>// Get the Date validator<br />
DateValidator validator = DateValidator.getInstance();<br />
// Validate/Convert the date<br />
Date fooDate = validator.validate(fooString, "dd/MM/yyyy");<br />
if (fooDate == null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp; // error...not a valid date<br />
&nbsp;&nbsp;&nbsp;&nbsp; return;<br />
}</p>
<p>十六、Commons Virtual File System</p>
<p>http://jakarta.apache.org/commons/vfs/</p>
<p>说明：提供对各种资源的访问接口。支持的资源类型包括</p>
<p>1. CIFS<br />
2. FTP<br />
3. Local Files<br />
4. HTTP and HTTPS<br />
5. SFTP<br />
6. Temporary Files<br />
7. WebDAV<br />
8. Zip, Jar and Tar (uncompressed, tgz or tbz2)<br />
9. gzip and bzip2<br />
10. res<br />
11. ram</p>
<p>这个包的功能很强大，极大的简化了程序对资源的访问。</p>
<p>使用示例：</p>
<p>从jar中读取文件</p>
<p>// Locate the Jar file<br />
FileSystemManager fsManager = VFS.getManager();<br />
FileObject jarFile = fsManager.resolveFile( "jar:lib/aJarFile.jar" );</p>
<p>// List the children of the Jar file<br />
FileObject[] children = jarFile.getChildren();<br />
System.out.println( "Children of " + jarFile.getName().getURI() );<br />
for ( int i = 0; i &lt; children.length; i++ ){<br />
&nbsp;&nbsp;&nbsp;&nbsp; System.out.println( children[ i ].getName().getBaseName() );<br />
}</p>
<p>从smb读取文件<br />
StaticUserAuthenticator auth = new StaticUserAuthenticator("username", "password", null);<br />
FileSystemOptions opts = new FileSystemOptions();<br />
DefaultFileSystemConfigBuilder.getInstance().setUserAuthenticator(opts, auth);<br />
FileObject fo = VFS.getManager().resolveFile("smb://host/anyshare/dir", opts);<br />
&nbsp;<br />
&nbsp;<br />
</p>
<img src ="http://www.blogjava.net/baoyaer/aggbug/155251.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-10-23 13:03 <a href="http://www.blogjava.net/baoyaer/articles/155251.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用Axis开发Web Service程序</title><link>http://www.blogjava.net/baoyaer/articles/152860.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Mon, 15 Oct 2007 01:31:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/152860.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/152860.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/152860.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/152860.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/152860.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1、新建一个Web工程，工程名为&#8220;AxisTest&#8221;：2、新建&#8220;lib&#8221;文件夹，然后把主要JAR包：axis.jar，commons-discovery-0.2.jar，commons-logging-1.0.4.jar，jaxrpc.jar，wsdl4j-1.5.1.jar，saaj.jar；可选包（发布服务及生成客户端程序是要用到的）：act...&nbsp;&nbsp;<a href='http://www.blogjava.net/baoyaer/articles/152860.html'>阅读全文</a><img src ="http://www.blogjava.net/baoyaer/aggbug/152860.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-10-15 09:31 <a href="http://www.blogjava.net/baoyaer/articles/152860.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ServletContextListener   || HttpSessionListener 的用法 </title><link>http://www.blogjava.net/baoyaer/articles/152853.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Mon, 15 Oct 2007 01:17:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/152853.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/152853.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/152853.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/152853.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/152853.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 这个J2EE小提示阐述了ServletContextListener的用法。这个事件类作为Web应用服务的一部分，处理Web应用的 servlet上下文(context)的变化的通知。这可以解释为，好像有个人在服务器旁不断地通知我们服务器在发生什么事件。那当然需要监听者了。因 此，在通知上下文(context)初始化和销毁的时候，ServletContextListner非常有用。 ...&nbsp;&nbsp;<a href='http://www.blogjava.net/baoyaer/articles/152853.html'>阅读全文</a><img src ="http://www.blogjava.net/baoyaer/aggbug/152853.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-10-15 09:17 <a href="http://www.blogjava.net/baoyaer/articles/152853.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>读取容器配置参数---context-param和init-param区别 [zt]</title><link>http://www.blogjava.net/baoyaer/articles/152843.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Mon, 15 Oct 2007 01:02:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/152843.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/152843.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/152843.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/152843.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/152843.html</trackback:ping><description><![CDATA[web.xml里面可以定义两种参数：<br />
(1)application范围内的参数，存放在servletcontext中，在web.xml中配置如下：
<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: 95%; word-break: break-all; padding-top: 4px; border-bottom: windowtext 0.5pt solid">
<div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /><span> </span><span>&lt;</span><span>context-param</span><span>&gt;</span><span><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>param-name</span><span>&gt;</span><span>context/param</span><span>&lt;/</span><span>param-name</span><span>&gt;</span><span><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>param-value</span><span>&gt;</span><span>avalible during application</span><span>&lt;/</span><span>param-value</span><span>&gt;</span><span><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span>&lt;/</span><span>context-param</span><span>&gt;</span></div>
</div>
<p>(2)servlet范围内的参数，只能在servlet的init()方法中取得，在web.xml中配置如下：</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: 95%; word-break: break-all; padding-top: 4px; border-bottom: windowtext 0.5pt solid">
<div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /><span> </span><span>&lt;</span><span>servlet</span><span>&gt;</span><span><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>servlet-name</span><span>&gt;</span><span>MainServlet</span><span>&lt;/</span><span>servlet-name</span><span>&gt;</span><span><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>servlet-class</span><span>&gt;</span><span>com.wes.controller.MainServlet</span><span>&lt;/</span><span>servlet-class</span><span>&gt;</span><span><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>init-param</span><span>&gt;</span><span><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>param-name</span><span>&gt;</span><span>param1</span><span>&lt;/</span><span>param-name</span><span>&gt;</span><span><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>param-value</span><span>&gt;</span><span>avalible in servlet init()</span><span>&lt;/</span><span>param-value</span><span>&gt;</span><span><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;/</span><span>init-param</span><span>&gt;</span><span><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&lt;</span><span>load-on-startup</span><span>&gt;</span><span>0</span><span>&lt;/</span><span>load-on-startup</span><span>&gt;</span><span><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /> </span><span>&lt;/</span><span>servlet</span><span>&gt;</span></div>
</div>
<p>在servlet中可以通过代码分别取用：</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: 95%; word-break: break-all; padding-top: 4px; border-bottom: windowtext 0.5pt solid">
<div><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /><span>package</span><span> com.wes.controller;<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span>import</span><span> javax.servlet.ServletException;<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span><span>import</span><span> javax.servlet.http.HttpServlet;<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span>public</span><span> </span><span>class</span><span> MainServlet </span><span>extends</span><span> HttpServlet </span><span>...</span><span><span>{<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" /><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span>public</span><span> MainServlet() </span><span>...</span><span><span>{<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>super</span><span>();<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp; }</span></span><span><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span>public</span><span> </span><span>void</span><span> init() </span><span>throws</span><span> ServletException </span><span>...</span><span><span>{<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(</span><span>"</span><span>下面的两个参数param1是在servlet中存放的</span><span>"</span><span>);<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(</span><span>this</span><span>.getInitParameter(</span><span>"</span><span>param1</span><span>"</span><span>));</span><span><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(</span><span>"</span><span>下面的参数是存放在servletcontext中的</span><span>"</span><span>);<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(getServletContext().getInitParameter(</span><span>"</span><span>context/param</span><span>"</span><span>));<br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></span><span><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span><br />
<img alt="" src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" align="top" /></span></div>
</div>
<p>第一种参数在servlet里面可以通过getServletContext().getInitParameter("context/param")得到<br />
第二种参数只能在servlet的init()方法中通过this.getInitParameter("param1")取得</p>
<img src ="http://www.blogjava.net/baoyaer/aggbug/152843.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-10-15 09:02 <a href="http://www.blogjava.net/baoyaer/articles/152843.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转载]Tomcat类加载机制 </title><link>http://www.blogjava.net/baoyaer/articles/149426.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Sat, 29 Sep 2007 01:08:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/149426.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/149426.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/149426.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/149426.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/149426.html</trackback:ping><description><![CDATA[<div style="margin-top: 10px; margin-left: 15px; overflow: auto">
<table width="100%">
    <tbody>
        <tr>
            <td>
            <p>Tomcat Server在启动的时候将构造一个ClassLoader树，以保证模块的类库是私有的 <br />
            Tomcat Server的ClassLoader结构如下： <br />
            <div class="code_title">代码</div>
            <div class="code_div">
            <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;Bootstrap&nbsp;&nbsp;&nbsp;<br />
            <img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
            <img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System&nbsp;&nbsp;&nbsp;&nbsp;<br />
            <img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;<br />
            <img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Common&nbsp;&nbsp;&nbsp;<br />
            <img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\&nbsp;&nbsp;&nbsp;<br />
            <img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />Catalina&nbsp;&nbsp;Shared&nbsp;&nbsp;&nbsp;<br />
            <img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/&nbsp;&nbsp;&nbsp;&nbsp;\&nbsp;&nbsp;&nbsp;<br />
            <img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WebApp1&nbsp;&nbsp;WebApp2&nbsp;&nbsp;&nbsp;<br />
            <img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
            </div>
            <script>render_code();</script><br />
            其中： <br />
            - Bootstrap - 载入JVM自带的类和$JAVA_HOME/jre/lib/ext/*.jar <br />
            - System - 载入$CLASSPATH/*.class <br />
            - Common - 载入$CATALINA_HOME/common/...，它们对TOMCAT和所有的WEB APP都可见 <br />
            - Catalina - 载入$CATALINA_HOME/server/...，它们仅对TOMCAT可见，对所有的WEB APP都不可见 <br />
            - Shared - 载入$CATALINA_HOME/shared/...，它们仅对所有WEB APP可见，对TOMCAT不可见（也不必见） <br />
            - WebApp - 载入ContextBase?/WEB-INF/...，它们仅对该WEB APP可见
            <p>&nbsp;</p>
            <p>每个运行中的线程都有一个成员contextClassLoader，用来在运行时动态地载入其它类，系统默认的contextClassLoader是systemClassLoader，所以一般而言java程序在执行时可以使用JVM自带的类、$JAVA_HOME/jre/lib/ext/中的类和$CLASSPATH/中的类，可以使用Thread.currentThread().setContextClassLoader(...);更改当前线程的contextClassLoader，来改变其载入类的行为</p>
            <p>ClassLoader被组织成树形，一般的工作原理是： <br />
            1) 线程需要用到某个类，于是contextClassLoader被请求来载入该类 <br />
            2) contextClassLoader请求它的父ClassLoader来完成该载入请求 <br />
            3) 如果父ClassLoader无法载入类，则contextClassLoader试图自己来载入 <br />
            注意：WebApp?ClassLoader的工作原理和上述有少许不同： <br />
            它先试图自己载入类（在ContextBase?/WEB-INF/...中载入类），如果无法载入，再请求父ClassLoader完成</p>
            <p>由此可得： <br />
            - 对于WEB APP线程，它的contextClassLoader是WebApp?ClassLoader <br />
            - 对于Tomcat Server线程，它的contextClassLoader是CatalinaClassLoader </p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<img src ="http://www.blogjava.net/baoyaer/aggbug/149426.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-09-29 09:08 <a href="http://www.blogjava.net/baoyaer/articles/149426.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>FCKeditor 在 Java Web Application 里应用的简单方法 </title><link>http://www.blogjava.net/baoyaer/articles/147959.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Tue, 25 Sep 2007 01:04:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/147959.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/147959.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/147959.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/147959.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/147959.html</trackback:ping><description><![CDATA[<strong style="color: #0000ff">1.介绍</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;FCKeditor 是一个使用广泛,支持多语言的在线HTML编辑器,它支持asp,php,jsp等常见的网络编程语言.它的官方网站是:<a href="http://www.fckeditor.net/">http://www.fckeditor.net/</a>&nbsp;目前最新版本是2.4.3 ,百度空间等大型的网站都有用到FCKeditor<br />
<strong style="color: #0000ff"><br />
2.下载<br />
</strong>&nbsp;&nbsp;&nbsp;&nbsp;我们今天讨论的是在java环境下的使用.我们要下载两个文件包.一个是FCKeditor的主文件包,还有一个是用来实现JSP tag,和处理文件的上传和浏览的FCKeditor For Jsp 的压缩包.<br />
&nbsp;&nbsp;&nbsp;&nbsp;下载地址:<a href="http://sourceforge.net/project/showfiles.php?group_id=75348">http://sourceforge.net/project/showfiles.php?group_id=75348</a><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;选择下载: <a onclick="window.location='/project/downloading.php?group_id=75348&amp;use_mirror=jaist&amp;filename=FCKeditor_2.4.3.zip&amp;'+Math.floor(Math.random()*100000000); return false;" href="http://downloads.sourceforge.net/fckeditor/FCKeditor_2.4.3.zip?use_mirror=jaist">FCKeditor_2.4.3.zip</a>&nbsp;和 <a class="tup" id="pkg1_0" onclick="report_expand('pkg1'); void(0); return false;" href="http://sourceforge.net/project/showfiles.php?group_id=75348#">FCKeditor.Java&nbsp;</a>里的 <a onclick="window.location='/project/downloading.php?group_id=75348&amp;use_mirror=jaist&amp;filename=FCKeditor-2.3.zip&amp;'+Math.floor(Math.random()*100000000); return false;" href="http://downloads.sourceforge.net/fckeditor/FCKeditor-2.3.zip?use_mirror=jaist">FCKeditor-2.3.zip</a><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;下载完成后解压.&nbsp;&nbsp;就像下面的样子:<br />
&nbsp;&nbsp;&nbsp;&nbsp;<img height="108" alt="" src="http://www.blogjava.net/images/blogjava_net/netnova/1.jpg" width="619" border="0" /><br />
<br />
<strong style="color: #0000ff">3.拷贝文件</strong><br />
&nbsp;&nbsp;&nbsp;<strong>&nbsp;<span style="color: #0000ff">a.</span></strong>首先把FCKeditor_2.4.3里的fckeditor拷贝到你的网站文件根目录.一般是WebRoot或WebContent下面并把_samples文件夹和一些不要的asp,php 文件删除.网站的目录结构就像下面的这个样子:<br />
<img height="375" alt="" src="http://www.blogjava.net/images/blogjava_net/netnova/2.jpg" width="181" border="0" /><br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong style="color: #0000ff">b.</strong>把FCKeditor-2.3(也就是FCKeditor For Java 的那个文件夹)下的\web\WEB-INF\lib目录下的FCKeditor-2.3.jar和commons-fileupload.jar拷贝到你网站的WEB-INF/lib下面<br />
&nbsp;&nbsp;&nbsp;&nbsp;<img height="106" alt="" src="http://www.blogjava.net/images/blogjava_net/netnova/3.jpg" width="680" border="0" /><br />
&nbsp;&nbsp;&nbsp;&nbsp;拷贝到:<br />
<img height="200" alt="" src="http://www.blogjava.net/images/blogjava_net/netnova/4.jpg" width="842" border="0" /><br />
<br />
<strong style="color: #0000ff">4.配置Servlet<br />
</strong>&nbsp;&nbsp;&nbsp;&nbsp;我们要把处理图片上传的Servlet配置到web.xml里: 我的写法是这样的:
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;FCKeditro&nbsp;配置&nbsp;</span><span style="color: #008000">--&gt;</span><span style="color: #000000"><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">servlet</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;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">servlet-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">Connector</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">servlet-name</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;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">servlet-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">com.fredck.FCKeditor.connector.ConnectorServlet</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">servlet-class</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;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">baseDir</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/UserFiles/</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">debug</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">true</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">load-on-startup</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">1</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">load-on-startup</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><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">servlet</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;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">servlet</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;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">servlet-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">SimpleUploader</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">servlet-name</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;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">servlet-class</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">com.fredck.FCKeditor.uploader.SimpleUploaderServlet</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">servlet-class</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;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">baseDir</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/UserFiles/</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">debug</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">true</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">enabled</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">true</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">AllowedExtensionsFile</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">param-value</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;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">DeniedExtensionsFile</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">php|php3|php5|phtml|asp|aspx|ascx|jsp|cfm|cfc|pl|bat|exe|dll|reg|cgi</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">AllowedExtensionsImage</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">jpg|gif|jpeg|png|bmp</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">DeniedExtensionsImage</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">param-value</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;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">AllowedExtensionsFlash</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">swf|fla</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">DeniedExtensionsFlash</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">param-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">param-value</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">param-value</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;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">init-param</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">load-on-startup</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">1</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">load-on-startup</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><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">servlet</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">servlet-mapping</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">servlet-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">Connector</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">servlet-name</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">url-pattern</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/fckeditor/editor/filemanager/browser/default/connectors/jsp/connector</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">url-pattern</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;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">servlet-mapping</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;<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">servlet-mapping</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">servlet-name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">SimpleUploader</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">servlet-name</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">url-pattern</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">/fckeditor/editor/filemanager/upload/simpleuploader</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">url-pattern</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;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">servlet-mapping</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;</span><span style="color: #008000">&lt;!--</span><span style="color: #008000">&nbsp;结束FCKeditor配置&nbsp;</span><span style="color: #008000">--&gt;</span></div>
<br />
&nbsp;&nbsp;&nbsp;&nbsp;一共有2个servlet.<br />
<br />
<strong style="color: #0000ff">5.配置Jsp<br />
</strong>&nbsp;&nbsp;&nbsp;&nbsp;要在JSP页面上能显示出来编辑器的话,还要在JSP页面调用FCKeditor,调用的方法可以有很多种,可以用Java代码调用,也可以是纯javascript,asp,JSP Tag.在本例中,我们用JSP Tag调用:<br />
&nbsp;&nbsp;&nbsp;&nbsp;假设在你的页面表单中新闻内容字段名为content的话.那JSP的代码如下:<br />
&nbsp;&nbsp;&nbsp;&nbsp;<strong style="color: #0000ff">a.</strong>在页面的头部引入Taglib:
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_2_65_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2_65_Open_Text.style.display='none'; Codehighlighter1_2_65_Closed_Image.style.display='inline'; Codehighlighter1_2_65_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_2_65_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_2_65_Closed_Text.style.display='none'; Codehighlighter1_2_65_Open_Image.style.display='inline'; Codehighlighter1_2_65_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="color: #000000; background-color: #ffff00">&lt;%</span><span id="Codehighlighter1_2_65_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_2_65_Open_Text"><span style="color: #000000; background-color: #f5f5f5">@&nbsp;taglib&nbsp;uri</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">http://fckeditor.net/tags-fckeditor</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;prefix</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">FCK</span><span style="color: #000000; background-color: #f5f5f5">"</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;</span></span><span style="color: #000000; background-color: #ffff00">%&gt;</span></div>
<br />
&nbsp;&nbsp;&nbsp;<strong style="color: #0000ff">&nbsp;b.</strong>在页面相应的部分嵌入tag:<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">tr</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">td&nbsp;</span><span style="color: #ff0000">colspan</span><span style="color: #0000ff">="2"</span><span style="color: #ff0000">&nbsp;height</span><span style="color: #0000ff">="500px;"</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">FCK:editor&nbsp;</span><span style="color: #ff0000">id</span><span style="color: #0000ff">="content"</span><span style="color: #ff0000">&nbsp;basePath</span><span style="color: #0000ff">="fckeditor/"</span><span style="color: #ff0000">&nbsp;height</span><span style="color: #0000ff">="500"</span><span style="color: #ff0000"><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;imageBrowserURL</span><span style="color: #0000ff">="../filemanager/browser/default/browser.html?Type=Image&amp;Connector=connectors/jsp/connector"</span><span style="color: #ff0000"><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;linkBrowserURL</span><span style="color: #0000ff">="../filemanager/browser/default/browser.html?Connector=connectors/jsp/connector"</span><span style="color: #ff0000"><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flashBrowserURL</span><span style="color: #0000ff">="../filemanager/browser/default/browser.html?Type=Flash&amp;Connector=connectors/jsp/connector"</span><span style="color: #ff0000"><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;imageUploadURL</span><span style="color: #0000ff">="../filemanager/upload/simpleuploader?Type=Image"</span><span style="color: #ff0000"><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;linkUploadURL</span><span style="color: #0000ff">="../filemanager/upload/simpleuploader?Type=File"</span><span style="color: #ff0000"><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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flashUploadURL</span><span style="color: #0000ff">="../filemanager/upload/simpleuploader?Type=Flash"</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; background-color: #ffff00">&lt;%</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;U.f(doc.getContent())&nbsp;</span><span style="color: #000000; background-color: #ffff00">%&gt;</span><span style="color: #000000"><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;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">FCK:editor</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">td</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">tr</span><span style="color: #0000ff">&gt;</span></div>
&nbsp;&nbsp;&nbsp;&nbsp;那个&nbsp;<span style="color: #000000; background-color: #ffff00">&lt;%</span><span style="color: #000000; background-color: #f5f5f5">=</span><span style="color: #000000; background-color: #f5f5f5">&nbsp;U.f(doc.getContent())&nbsp;</span><span style="background-color: #ffff00">%&gt;&nbsp;<span style="background-color: #ffffff">是用来设置初始值的.您可以换成你的代码.<br />
</span></span><br />
<strong><span style="color: #0000ff"><strong>6.完成</strong>&nbsp;</span></strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;如果您的完全按照我的这样的方法陪置,那你现在就可以正常的用它了.要是不是的话,就是路径不对导致的问题,那你要自己调一下了.也就是说servlet里的url-pattern和FCK标签里的那些URL要调一下.如果是用默认的话,其它地方就不用调,如果你要个性化,那调的地方就多了.呵呵.自己倒腾吧.<br />
&nbsp;&nbsp;&nbsp;&nbsp;Servlet 加载成功的话,tomcat启动时会打印如下信息:<br />
&nbsp;&nbsp;&nbsp;&nbsp;
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">----</span><span style="color: #000000">&nbsp;SimpleUploaderServlet&nbsp;initialization&nbsp;started&nbsp;</span><span style="color: #000000">----</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" />php</span><span style="color: #000000">|</span><span style="color: #000000">php3</span><span style="color: #000000">|</span><span style="color: #000000">php5</span><span style="color: #000000">|</span><span style="color: #000000">phtml</span><span style="color: #000000">|</span><span style="color: #000000">asp</span><span style="color: #000000">|</span><span style="color: #000000">aspx</span><span style="color: #000000">|</span><span style="color: #000000">ascx</span><span style="color: #000000">|</span><span style="color: #000000">jsp</span><span style="color: #000000">|</span><span style="color: #000000">cfm</span><span style="color: #000000">|</span><span style="color: #000000">cfc</span><span style="color: #000000">|</span><span style="color: #000000">pl</span><span style="color: #000000">|</span><span style="color: #000000">bat</span><span style="color: #000000">|</span><span style="color: #000000">exe</span><span style="color: #000000">|</span><span style="color: #000000">dll</span><span style="color: #000000">|</span><span style="color: #000000">reg</span><span style="color: #000000">|</span><span style="color: #000000">cgi<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">0</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;php<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;php3<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">2</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;php5<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">3</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;phtml<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">4</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;asp<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">5</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;aspx<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">6</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;ascx<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">7</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;jsp<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">8</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;cfm<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">9</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;cfc<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">10</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;pl<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">11</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;bat<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">12</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;exe<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">13</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;dll<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">14</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;reg<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">15</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;cgi<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />jpg</span><span style="color: #000000">|</span><span style="color: #000000">gif</span><span style="color: #000000">|</span><span style="color: #000000">jpeg</span><span style="color: #000000">|</span><span style="color: #000000">png</span><span style="color: #000000">|</span><span style="color: #000000">bmp<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">0</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;jpg<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;gif<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">2</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;jpeg<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">3</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;png<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">4</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;bmp<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" />swf</span><span style="color: #000000">|</span><span style="color: #000000">fla<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">0</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;swf<br />
<img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;fla<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: #000000">----</span><span style="color: #000000">&nbsp;SimpleUploaderServlet&nbsp;initialization&nbsp;completed&nbsp;</span><span style="color: #000000">----</span></div>
<br />
&nbsp;&nbsp;&nbsp;&nbsp;下面是成功的图片,可以上传图片.<br />
<img height="537" alt="" src="http://www.blogjava.net/images/blogjava_net/netnova/fck.JPG" width="775" border="0" /><br />
&nbsp;<br />
<img src ="http://www.blogjava.net/baoyaer/aggbug/147959.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-09-25 09:04 <a href="http://www.blogjava.net/baoyaer/articles/147959.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Jmagick的安装和使用 </title><link>http://www.blogjava.net/baoyaer/articles/134154.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Fri, 03 Aug 2007 01:27:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/134154.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/134154.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/134154.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/134154.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/134154.html</trackback:ping><description><![CDATA[jmagick是什么？不用我说了吧。<br><br>jmagick的安装（基于windows），精简版步骤：<br>1、下载jmagick-win-5.5.7-Q8.zip，并把jmagick.jar放到应用的lib下，jmagick.dll拷贝到SYSTEM32下；<br>2、安装ImageMagick-5.5.7-Q8-windows-dll.exe软件<br>3、重新启动机器<br>麻烦点，但对图片的处理能力，确实超乎想象的（不过用6.2.6版本频频出现JVM Crach，吓死）<br><br>jmagick的使用，我只用了图片缩放，还可以。<br>代码如下：<br>&nbsp;&nbsp;
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">System.setProperty(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">jmagick.systemclassloader</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">no</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">这个没什么好说的，照办就是了</span><span style="COLOR: #008000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;ImageInfo&nbsp;info&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;ImageInfo(fromFileName);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;MagickImage&nbsp;fromImage&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;MagickImage(info);<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;Dimension&nbsp;dim&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;fromImage.getDimension();<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&nbsp;w&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;dim.getWidth();<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&nbsp;h&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;dim.getHeight();<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;toHeight&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">)(h</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">toWidth</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">w);</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">按宽度比例缩放</span><span style="COLOR: #008000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;MagickImage&nbsp;toImage&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;fromImage.scaleImage(toWidth,&nbsp;toHeight);</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">缩放操作</span><span style="COLOR: #008000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;toImage.setFileName(toFileName);</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">设置输出的文件名</span><span style="COLOR: #008000"><br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;toImage.writeImage(info);&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">保存<br><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align=top></span></div>
<br><br>过程中发现最新版本的诸多问题，要么NoClassDefFoundError要么Can't find dependent libraries，简直不胜其烦。<br><br>后来降级到5.5.7，就好了，说明IT人唯最新版本是从的想法不一定正确。<br>
<img src ="http://www.blogjava.net/baoyaer/aggbug/134154.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-08-03 09:27 <a href="http://www.blogjava.net/baoyaer/articles/134154.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用Fiter来控制页面的权限 </title><link>http://www.blogjava.net/baoyaer/articles/130478.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Mon, 16 Jul 2007 01:32:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/130478.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/130478.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/130478.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/130478.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/130478.html</trackback:ping><description><![CDATA[<div style="MARGIN-TOP: 1px; MARGIN-LEFT: 15px">
<h2>&nbsp;</h2>
</div>
<div style="MARGIN-TOP: 5px; MARGIN-LEFT: 15px"><strong>关键字:</strong> &nbsp; 使用Fiter来控制页面的权限&nbsp;&nbsp;&nbsp;&nbsp; </div>
<div style="MARGIN-TOP: 10px; MARGIN-LEFT: 15px; OVERFLOW: auto">
<table width="100%">
    <tbody>
        <tr>
            <td>
            <p>转载：<font face=Arial color=#0000ff><a href="http://www.javaeye.com/topic/95432"><u>http://www.javaeye.com/topic/95432</u></a></font></p>
            <p>众所周知，如果没有对页面进行权限控制，用户只要输入URL就能进入任何页面。 </p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp; 下面就演示一下最基本的使用Fiter来控制页面的权限。</p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp; 1.写一个FILTER,用来判断用户是否有权限进入指定页面。</p>
            <div class=code_title>java 代码</div>
            <div class=dp-highlighter>
            <div class=bar></div>
            <ol class=dp-j>
                <li class=alt><span><span class=keyword>import</span><span>&nbsp;java.io.IOException; &nbsp;&nbsp;</span></span>
                <li class=""><span>&nbsp;&nbsp;</span>
                <li class=alt><span></span><span class=keyword>import</span><span>&nbsp;javax.servlet.Filter; &nbsp;&nbsp;</span>
                <li class=""><span></span><span class=keyword>import</span><span>&nbsp;javax.servlet.FilterChain; &nbsp;&nbsp;</span>
                <li class=alt><span></span><span class=keyword>import</span><span>&nbsp;javax.servlet.FilterConfig; &nbsp;&nbsp;</span>
                <li class=""><span></span><span class=keyword>import</span><span>&nbsp;javax.servlet.ServletException; &nbsp;&nbsp;</span>
                <li class=alt><span></span><span class=keyword>import</span><span>&nbsp;javax.servlet.ServletRequest; &nbsp;&nbsp;</span>
                <li class=""><span></span><span class=keyword>import</span><span>&nbsp;javax.servlet.ServletResponse; &nbsp;&nbsp;</span>
                <li class=alt><span></span><span class=keyword>import</span><span>&nbsp;javax.servlet.http.HttpServlet; &nbsp;&nbsp;</span>
                <li class=""><span></span><span class=keyword>import</span><span>&nbsp;javax.servlet.http.HttpServletRequest; &nbsp;&nbsp;</span>
                <li class=alt><span></span><span class=keyword>import</span><span>&nbsp;javax.servlet.http.HttpServletResponse; &nbsp;&nbsp;</span>
                <li class=""><span></span><span class=keyword>import</span><span>&nbsp;javax.servlet.http.HttpSession; &nbsp;&nbsp;</span>
                <li class=alt><span>&nbsp;&nbsp;</span>
                <li class=""><span></span><span class=keyword>import</span><span>&nbsp;org.apache.log4j.Logger; &nbsp;&nbsp;</span>
                <li class=alt><span>&nbsp;&nbsp;</span>
                <li class=""><span></span><span class=keyword>import</span><span>&nbsp;com.kiral.action.UserAction; &nbsp;&nbsp;</span>
                <li class=alt><span></span><span class=keyword>import</span><span>&nbsp;com.kiral.model.User; &nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;</span>
                <li class=alt><span></span><span class=comment>/******************************************************************************* </span>&nbsp;
                <li class=""><span><span class=comment>&nbsp;*&nbsp;在过滤器中实现权限控制类，用来检验用户是否有权限进入当前页面 </span>&nbsp;</span>
                <li class=alt><span><span class=comment>&nbsp;*&nbsp; </span>&nbsp;</span>
                <li class=""><span><span class=comment>&nbsp;*&nbsp;@作者：kiral </span>&nbsp;</span>
                <li class=alt><span><span class=comment>&nbsp;*&nbsp;@日期：2006-6-24 </span>&nbsp;</span>
                <li class=""><span><span class=comment>&nbsp;*&nbsp;@版本:&nbsp;1.0 </span>&nbsp;</span>
                <li class=alt><span><span class=comment>&nbsp;******************************************************************************/</span><span>&nbsp;&nbsp;</span></span>
                <li class=""><span></span><span class=keyword>public</span><span>&nbsp;</span><span class=keyword>class</span><span>&nbsp;FilterServlet&nbsp;</span><span class=keyword>extends</span><span>&nbsp;HttpServlet&nbsp;</span><span class=keyword>implements</span><span>&nbsp;Filter&nbsp;{ &nbsp;&nbsp;</span>
                <li class=alt><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class=keyword>private</span><span>&nbsp;</span><span class=keyword>static</span><span>&nbsp;</span><span class=keyword>final</span><span>&nbsp;</span><span class=keyword>long</span><span>&nbsp;serialVersionUID&nbsp;=&nbsp;5162189625393315379L; &nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;</span>
                <li class=alt><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class=keyword>private</span><span>&nbsp;</span><span class=keyword>static</span><span>&nbsp;Logger&nbsp;LOG&nbsp;=&nbsp;Logger.getLogger(FilterServlet.</span><span class=keyword>class</span><span>); &nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;</span>
                <li class=alt><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class=comment>/** </span>&nbsp;
                <li class=""><span><span class=comment>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;配置允许的角色 </span>&nbsp;</span>
                <li class=alt><span><span class=comment>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class=keyword>private</span><span>&nbsp;String&nbsp;allowRole&nbsp;=&nbsp;</span><span class=keyword>null</span><span>; &nbsp;&nbsp;</span>
                <li class=alt><span>&nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class=comment>/** </span>&nbsp;
                <li class=alt><span><span class=comment>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;重定向的URL </span>&nbsp;</span>
                <li class=""><span><span class=comment>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span>
                <li class=alt><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class=keyword>private</span><span>&nbsp;String&nbsp;redirectURl&nbsp;=&nbsp;</span><span class=keyword>null</span><span>; &nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;</span>
                <li class=alt><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class=keyword>public</span><span>&nbsp;</span><span class=keyword>void</span><span>&nbsp;init(FilterConfig&nbsp;filterConfig)&nbsp;</span><span class=keyword>throws</span><span>&nbsp;ServletException&nbsp;{ &nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class=comment>//&nbsp;得到允许的角色,这个参数是由web.xml里的allowRole所指定 </span><span>&nbsp;&nbsp;</span>
                <li class=alt><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;allowRole&nbsp;=&nbsp;filterConfig.getInitParameter(</span><span class=string>"allowRole"</span><span>); &nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class=comment>//&nbsp;指定要重定向的页面 </span><span>&nbsp;&nbsp;</span>
                <li class=alt><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;redirectURl&nbsp;=&nbsp;</span><span class=string>"/locker/index.html"</span><span>; &nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
                <li class=alt><span>&nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class=comment>/** </span>&nbsp;
                <li class=alt><span><span class=comment>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;在过滤器中实现权限控制 </span>&nbsp;</span>
                <li class=""><span><span class=comment>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span>
                <li class=alt><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class=keyword>public</span><span>&nbsp;</span><span class=keyword>void</span><span>&nbsp;doFilter(ServletRequest&nbsp;sRequest,&nbsp;ServletResponse&nbsp;sResponse, &nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FilterChain&nbsp;filterChain)&nbsp;</span><span class=keyword>throws</span><span>&nbsp;IOException,&nbsp;ServletException&nbsp;{ &nbsp;&nbsp;</span>
                <li class=alt><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpServletRequest&nbsp;request&nbsp;=&nbsp;(HttpServletRequest)&nbsp;sRequest; &nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpServletResponse&nbsp;response&nbsp;=&nbsp;(HttpServletResponse)&nbsp;sResponse; &nbsp;&nbsp;</span>
                <li class=alt><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpSession&nbsp;session&nbsp;=&nbsp;request.getSession(); &nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;</span>
                <li class=alt><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class=comment>//&nbsp;如果回话中的用户为空,页面重新定向到登陆页面 </span><span>&nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class=keyword>if</span><span>&nbsp;(session.getAttribute(UserAction.CURRENT_USER)&nbsp;==&nbsp;</span><span class=keyword>null</span><span>)&nbsp;{ &nbsp;&nbsp;</span>
                <li class=alt><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.sendRedirect(redirectURl); &nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
                <li class=alt><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class=comment>//&nbsp;会话中存在用户，则验证用户是否存在当前页面的权限 </span><span>&nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class=keyword>else</span><span>&nbsp;{ &nbsp;&nbsp;</span>
                <li class=alt><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;User&nbsp;user&nbsp;=&nbsp;(User)&nbsp;session.getAttribute(UserAction.CURRENT_USER); &nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class=keyword>try</span><span>&nbsp;{ &nbsp;&nbsp;</span>
                <li class=alt><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class=comment>//&nbsp;如果用户没有当前页的权限,页面重新定向到登陆页面 </span><span>&nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class=keyword>if</span><span>&nbsp;(</span><span class=string>"0"</span><span>.equals(allowRole)&nbsp;||&nbsp;user.hasPower(allowRole))&nbsp;{ &nbsp;&nbsp;</span>
                <li class=alt><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;filterChain.doFilter(sRequest,&nbsp;sResponse); &nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class=keyword>else</span><span>&nbsp;{ &nbsp;&nbsp;</span>
                <li class=alt><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class=comment>//&nbsp;过滤器经过过滤后，过滤链继续传递请求和响应 </span><span>&nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.sendRedirect(redirectURl); &nbsp;&nbsp;</span>
                <li class=alt><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class=keyword>catch</span><span>&nbsp;(Throwable&nbsp;e)&nbsp;{ &nbsp;&nbsp;</span>
                <li class=alt><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LOG.error(</span><span class=string>"权限过滤时候出现错误"</span><span>,&nbsp;e); &nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class=keyword>throw</span><span>&nbsp;</span><span class=keyword>new</span><span>&nbsp;RuntimeException(</span><span class=string>"权限过滤时候出现错误"</span><span>,&nbsp;e); &nbsp;&nbsp;</span>
                <li class=alt><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
                <li class=alt><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;</span>
                <li class=alt><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class=keyword>public</span><span>&nbsp;</span><span class=keyword>void</span><span>&nbsp;destroy()&nbsp;{ &nbsp;&nbsp;</span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span>
                <li class=alt><span>&nbsp;&nbsp;</span>
                <li class=""><span>}&nbsp;&nbsp;</span> </li>
            </ol>
            </div>
            <p>&nbsp;</p>
            <p>在web.xml中配置 要过滤的页面和能进入当前页面的角色</p>
            <div class=code_title>xml 代码</div>
            <div class=dp-highlighter>
            <div class=bar></div>
            <ol class=dp-xml>
                <li class=alt><span><span class=comments>&lt;!--权限控制过滤器配置--&gt;</span><span>&nbsp;&nbsp;</span></span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class=tag>&lt;</span><span class=tag-name>filter</span><span class=tag>&gt;</span><span>&nbsp;&nbsp;</span>
                <li class=alt><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class=tag>&lt;</span><span class=tag-name>filter-name</span><span class=tag>&gt;</span><span>UserAdmin</span><span class=tag><span class=tag-name>filter-name</span><span class=tag>&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class=comments>&lt;!--&nbsp;指定进行权限过滤的类--&gt;</span><span>&nbsp;&nbsp;</span>
                <li class=alt><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class=tag>&lt;</span><span class=tag-name>filter-class</span><span class=tag>&gt;</span><span>com.emap.web.FilterServlet</span><span class=tag><span class=tag-name>filter-class</span><span class=tag>&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class=comments>&lt;!--&nbsp;初始化参数,这些参数对应类里变量--&gt;</span><span>&nbsp;&nbsp;</span>
                <li class=alt><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class=tag>&lt;</span><span class=tag-name>init-param</span><span class=tag>&gt;</span><span>&nbsp;&nbsp;</span>
                <li class=alt><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span class=comments>&lt;!--&nbsp;配置允许进入的角色，这里你可以自己定义任何参数--&gt;</span><span>&nbsp;&nbsp;</span></span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class=tag>&lt;</span><span class=tag-name>param-name</span><span class=tag>&gt;</span><span>allowRole</span><span class=tag><span class=tag-name>param-name</span><span class=tag>&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class=alt><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class=tag>&lt;</span><span class=tag-name>param-value</span><span class=tag>&gt;</span><span>1</span><span class=tag><span class=tag-name>param-value</span><span class=tag>&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class=tag><span class=tag-name>init-param</span><span class=tag>&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class=alt><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class=tag><span class=tag-name>filter</span><span class=tag>&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class=""><span>&nbsp;&nbsp;&nbsp; </span><span class=tag>&lt;</span><span class=tag-name>filter-mapping</span><span class=tag>&gt;</span><span>&nbsp;&nbsp;</span>
                <li class=alt><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class=tag>&lt;</span><span class=tag-name>filter-name</span><span class=tag>&gt;</span><span>UserAdmin</span><span class=tag><span class=tag-name>filter-name</span><span class=tag>&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class=tag>&lt;</span><span class=tag-name>url-pattern</span><span class=tag>&gt;</span><span>/jsp/security/*</span><span class=tag><span class=tag-name>url-pattern</span><span class=tag>&gt;</span><span>&nbsp;&nbsp;</span> </span>
                <li class=alt><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class=tag><span class=tag-name>filter-mapping</span><span class=tag>&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
            </ol>
            </div>
            <p>上面配置的意思是说，当用户进入<span>/jsp/security文件夹下的页面的时候，程序会进入FilterServlet&nbsp;里的doFilter方法里，进行权限判断。</span></p>
            <p><span></span>&nbsp;<strong>其他的页面权限控制：</strong></p>
            <p>&nbsp; 1.你可以在filter里判断用户是否登录，然后需要特殊权限能访问的页面，在页面里进行判断。</p>
            <p>&nbsp; 2.推荐使用开源框架ACEGI来进行权限控制</p>
            </td>
        </tr>
    </tbody>
</table>
</div>
<img src ="http://www.blogjava.net/baoyaer/aggbug/130478.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-07-16 09:32 <a href="http://www.blogjava.net/baoyaer/articles/130478.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jxl操作excel</title><link>http://www.blogjava.net/baoyaer/articles/127738.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Tue, 03 Jul 2007 01:22:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/127738.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/127738.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/127738.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/127738.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/127738.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: jxl是一个韩国人写的java操作excel的工具,&nbsp;在开源世界中，有两套比较有影响的API可供使用，一个是POI，一个是jExcelAPI。其中功能相对POI比较弱一点。但jExcelAPI对中文支持非常好，API是纯Java的，&nbsp;并不依赖Windows系统，即使运行在Linux下，它同样能够正确的处理Excel文件。&nbsp;另外需要说明的是，这套API对图形和图表的支持...&nbsp;&nbsp;<a href='http://www.blogjava.net/baoyaer/articles/127738.html'>阅读全文</a><img src ="http://www.blogjava.net/baoyaer/aggbug/127738.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-07-03 09:22 <a href="http://www.blogjava.net/baoyaer/articles/127738.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用JAVA操作EXCEL文件</title><link>http://www.blogjava.net/baoyaer/articles/127734.html</link><dc:creator>大田斗</dc:creator><author>大田斗</author><pubDate>Tue, 03 Jul 2007 01:10:00 GMT</pubDate><guid>http://www.blogjava.net/baoyaer/articles/127734.html</guid><wfw:comment>http://www.blogjava.net/baoyaer/comments/127734.html</wfw:comment><comments>http://www.blogjava.net/baoyaer/articles/127734.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/baoyaer/comments/commentRss/127734.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/baoyaer/services/trackbacks/127734.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: JAVA EXCEL API简介Java Excel是一开放源码项目，通过它Java开发人员可以读取Excel文件的内容、创建新的Excel文件、更新已经存在的Excel文件。使用该API非Windows操作系统也可以通过纯Java应用来处理Excel数据表。因为是使用Java编写的，所以我们在Web应用中可以通过JSP、Servlet来调用API实现对Excel数据表的访问。提供以下功能：...&nbsp;&nbsp;<a href='http://www.blogjava.net/baoyaer/articles/127734.html'>阅读全文</a><img src ="http://www.blogjava.net/baoyaer/aggbug/127734.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/baoyaer/" target="_blank">大田斗</a> 2007-07-03 09:10 <a href="http://www.blogjava.net/baoyaer/articles/127734.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>