<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>coolyzg</title>
    <description></description>
    <link>http://coolyzg.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>如何提供java的基于document/literal的webservice接口</title>
        <author>coolyzg</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://coolyzg.javaeye.com">coolyzg</a>&nbsp;
          链接：<a href="http://coolyzg.javaeye.com/blog/138876" style="color:red;">http://coolyzg.javaeye.com/blog/138876</a>&nbsp;
          发表时间: 2007年11月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          以前曾经调用过.NET发布的webservice接口，document/literal格式的，传入的参数是xml文档内容组合成的字符串，当时对这种方式还不是很了解。<br />服务提供方先给了一个xsd文档，然后给了wsdl文档，接下来在网上好不容易实现方法来调用。<br /><br />可是现在我要提供java的基于document/literal的webservice接口，要传入的参数也是xml文档内容组合成的字符串（而且是多条记录,可能将上千条记录一起传过来，避免多次调用接口影响性能和响应时间），所以就开始研究document/literal格式，不过没多少头绪，也有一些疑惑，希望能得到大家的帮助。<br /><br />1.首先，我要根据传入的参数的类型定义xsd文档？ <br />2.如果这样的话，我是不是要将接受的字符串先转化成xml文档并根据xsd来验证参数的合法性？请问如何实现？（最好给些code^_^）<br /><br />接下来就好办了，就卡在这地方了。<br />也许问题很浅显，那就请顺便指点一下，否则我走不下去了 呵呵<br />难者不会，会者不难<br /><br />ps:调用类似的接口方法也很难找，下面我将调用代码贴出来和大家共享
          <br/>
          <span style="color:red;">
            <a href="http://coolyzg.javaeye.com/blog/138876#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 07 Nov 2007 23:00:41 +0800</pubDate>
        <link>http://coolyzg.javaeye.com/blog/138876</link>
        <guid>http://coolyzg.javaeye.com/blog/138876</guid>
      </item>
      <item>
        <title>Cron表达式</title>
        <author>coolyzg</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://coolyzg.javaeye.com">coolyzg</a>&nbsp;
          链接：<a href="http://coolyzg.javaeye.com/blog/76056" style="color:red;">http://coolyzg.javaeye.com/blog/76056</a>&nbsp;
          发表时间: 2007年04月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Cron表达式是一个字符串，字符串以5或6个空格隔开，分开工6或7个域，每一个域代表一个含义,Cron有如下两种语法 <br />
格式： <br />
<span style="COLOR: blue">Seconds Minutes Hours DayofMonth Month DayofWeek Year 或 <br />
Seconds Minutes Hours DayofMonth Month DayofWeek</span>
<p>每一个域可出现的字符如下： <br />
</p>
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>Seconds:可出现,-&nbsp;&nbsp;*&nbsp;&nbsp;/&nbsp;四个字符，有效范围为</span><span class="number">0</span><span>-</span><span class="number">59</span><span>的整数 &nbsp;&nbsp;</span></span></li>
    <li class=""><span>Minutes:可出现,-&nbsp;&nbsp;*&nbsp;&nbsp;/&nbsp;四个字符，有效范围为</span><span class="number">0</span><span>-</span><span class="number">59</span><span>的整数 &nbsp;&nbsp;</span></li>
    <li class="alt"><span>Hours:可出现,-&nbsp;&nbsp;*&nbsp;&nbsp;/&nbsp;四个字符，有效范围为</span><span class="number">0</span><span>-</span><span class="number">23</span><span>的整数 &nbsp;&nbsp;</span></li>
    <li class=""><span>DayofMonth:可出现,-&nbsp;&nbsp;*&nbsp;&nbsp;/&nbsp;?&nbsp;L&nbsp;W&nbsp;C八个字符，有效范围为</span><span class="number">0</span><span>-</span><span class="number">31</span><span>的整数&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>Month:可出现,-&nbsp;&nbsp;*&nbsp;&nbsp;/&nbsp;四个字符，有效范围为</span><span class="number">1</span><span>-</span><span class="number">12</span><span>的整数或JAN-DEc &nbsp;&nbsp;</span></li>
    <li class=""><span>DayofWeek:可出现,-&nbsp;&nbsp;*&nbsp;&nbsp;/&nbsp;?&nbsp;L&nbsp;C&nbsp;#四个字符，有效范围为</span><span class="number">1</span><span>-</span><span class="number">7</span><span>的整数或SUN-SAT两个范围。</span><span class="number">1</span><span>表示星期天，</span><span class="number">2</span><span>表示星期一，&nbsp;依次类推 &nbsp;&nbsp;</span></li>
    <li class="alt"><span>Year:可出现,-&nbsp;&nbsp;*&nbsp;&nbsp;/&nbsp;四个字符，有效范围为</span><span class="number">1970</span><span>-</span><span class="number">2099</span><span>年&nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
<script>render_code();</script>
<p>&nbsp;</p>
<p>每一个域都使用数字，但还可以出现如下特殊字符，它们的含义是： <br />
</p>
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>(</span><span class="number">1</span><span>)*：表示匹配该域的任意值，假如在Minutes域使用*,即表示每分钟都会触发事件。 &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>(</span><span class="number">2</span><span>)?:只能用在DayofMonth和DayofWeek两个域。它也匹配域的任意值，但实际不会。因为DayofMonth和DayofWeek会相互影响。例如想在每月的</span><span class="number">20</span><span>日触发调度，不管</span><span class="number">20</span><span>日到底是星期几，则只能使用如下写法：&nbsp;</span><span class="number">13</span><span>&nbsp;&nbsp;</span><span class="number">13</span><span>&nbsp;</span><span class="number">15</span><span>&nbsp;</span><span class="number">20</span><span>&nbsp;*&nbsp;?,其中最后一位只能用？，而不能使用*，如果使用*表示不管星期几都会触发，实际上并不是这样。 &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>(</span><span class="number">3</span><span>)-:表示范围，例如在Minutes域使用</span><span class="number">5</span><span>-</span><span class="number">20</span><span>，表示从</span><span class="number">5</span><span>分到</span><span class="number">20</span><span>分钟每分钟触发一次 &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>(</span><span class="number">4</span><span>)/：表示起始时间开始触发，然后每隔固定时间触发一次，例如在Minutes域使用</span><span class="number">5</span><span>/</span><span class="number">20</span><span>,则意味着</span><span class="number">5</span><span>分钟触发一次，而</span><span class="number">25</span><span>，</span><span class="number">45</span><span>等分别触发一次. &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>(</span><span class="number">5</span><span>),:表示列出枚举值值。例如：在Minutes域使用</span><span class="number">5</span><span>,</span><span class="number">20</span><span>，则意味着在</span><span class="number">5</span><span>和</span><span class="number">20</span><span>分每分钟触发一次。 &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>(</span><span class="number">6</span><span>)L:表示最后，只能出现在DayofWeek和DayofMonth域，如果在DayofWeek域使用5L,意味着在最后的一个星期四触发。 &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>(</span><span class="number">7</span><span>)W:表示有效工作日(周一到周五),只能出现在DayofMonth域，系统将在离指定日期的最近的有效工作日触发事件。例如：在DayofMonth使用5W，如果</span><span class="number">5</span><span>日是星期六，则将在最近的工作日：星期五，即</span><span class="number">4</span><span>日触发。如果</span><span class="number">5</span><span>日是星期天，则在</span><span class="number">6</span><span>日触发；如果</span><span class="number">5</span><span>日在星期一到星期五中的一天，则就在</span><span class="number">5</span><span>日触发。另外一点，W的最近寻找不会跨过月份 &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>(</span><span class="number">8</span><span>)LW:这两个字符可以连用，表示在某个月最后一个工作日，即最后一个星期五。 &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>(</span><span class="number">9</span><span>)#:用于确定每个月第几个星期几，只能出现在DayofMonth域。例如在</span><span class="number">4</span><span>#</span><span class="number">2</span><span>，表示某月的第二个星期三。&nbsp;&nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
<script>render_code();</script>
<p>&nbsp;</p>
<p>举几个例子: <br />
</p>
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="number">0</span><span>&nbsp;</span><span class="number">0</span><span>&nbsp;&nbsp;</span><span class="number">2</span><span>&nbsp;&nbsp;</span><span class="number">1</span><span>&nbsp;*&nbsp;&nbsp;?&nbsp;*&nbsp;&nbsp;表示在每月的</span><span class="number">1</span><span>日的凌晨</span><span class="number">2</span><span>点调度任务&nbsp; &nbsp;&nbsp;</span></span></li>
    <li class=""><span></span><span class="number">0</span><span>&nbsp;</span><span class="number">15</span><span>&nbsp;</span><span class="number">10</span><span>&nbsp;?&nbsp;*&nbsp;&nbsp;MON-FRI&nbsp;表示周一到周五每天上午</span><span class="number">10</span><span>：</span><span class="number">15</span><span>执行作业&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="number">0</span><span>&nbsp;</span><span class="number">15</span><span>&nbsp;</span><span class="number">10</span><span>&nbsp;?&nbsp;6L&nbsp;</span><span class="number">2002</span><span>-</span><span class="number">2006</span><span>&nbsp;表示</span><span class="number">200</span><span>-</span><span class="number">2006</span><span>年的每个月的最后一个星期五上午</span><span class="number">10</span><span>:</span><span class="number">15</span><span>执行作业&nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
<script>render_code();</script><br />
          <br/>
          <span style="color:red;">
            <a href="http://coolyzg.javaeye.com/blog/76056#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 29 Apr 2007 11:00:51 +0800</pubDate>
        <link>http://coolyzg.javaeye.com/blog/76056</link>
        <guid>http://coolyzg.javaeye.com/blog/76056</guid>
      </item>
      <item>
        <title>项目管理实战之团队管理（转）</title>
        <author>coolyzg</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://coolyzg.javaeye.com">coolyzg</a>&nbsp;
          链接：<a href="http://coolyzg.javaeye.com/blog/75821" style="color:red;">http://coolyzg.javaeye.com/blog/75821</a>&nbsp;
          发表时间: 2007年04月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          一个系统不仅需要优秀的分析和设计，更需要一个良好的过程将其从蓝图转化为实现。这个过程中最重要的是对团队的管理，也就是人的管理。一个优秀的团队和一个糟糕的团队的效能是天壤之别，她们之间的比例不是1:100或1:1000这样量化的数字能够表示的。就像一个团队建造了一幢摩天大楼屹立于云霄，而另一个团队的建筑物还没有10米高便开始摇摇欲坠！这是质的差别，也是团队灵魂的差别。<br />
&nbsp;&nbsp;&nbsp; 而团队的领头人就是项目经理，他的能力/素质直接影响着项目的成败！我们不需要一个团队的所有成员个个都是优秀的，但是为了确保你的项目成功，请雇佣一个优秀的项目经理！<br />
&nbsp;&nbsp;&nbsp; 以前，自己通常都是单干，最多时也是两三个人合作，项目进展良好。现在负责一个较大项目开发，需要协调整个团队成员，保证项目的进展。原以为，这是一件很简单的事情，和以前一样嘛。结果随着项目的进展，问题越来越多，而其中的绝大多数问题都不是技术上的，而是对组员管理协调的问题。想使一个团队高效并保持高效，我们需要花不少的气力。以下几点是从我前段时间的实践中总结出来的，只是自己的经验小结，也并没有打算写成一篇完整的关于团队管理的论文，毕竟在这方面自己的功力还浅薄的很。希望和大家多多交流这方面的心得。对团队的管理需要重视以下几个方面：
<p>(1)让合适的人做合适的事。了解每一个组员的知识结构和背景，知道他们各自擅长什么，把任务安排给能最有效最迅速解决它的人。</p>
<p>(2)把项目的主要功能/任务以列表的形式形成文档、把每个组员的阶段任务以列表的形式形成文档。这是重要的，否则，你自己和你的组员将会常常忘记目标是什么、自己要做什么。</p>
<p>(3)不要给组员我们的项目不着急的感觉。让每个组员都有紧迫感。一个安逸/懒散的团体不可能按时按质提交项目，即使这个项目本质上并不紧迫。</p>
<p>(4)在组员的上一阶段任务提交之前，就应当安排好该组员的下一阶段任务。不要让任何一个组员闲散着。因为无论在什么时候，系统的任何一个模块都有改进/重构/整理的需要，我们的设计/实现永远都不够优秀。</p>
<p>(5)对某一特定的环节，清晰明确地告诉你的组员你想要的是什么，否则，你就准备把同样的事情告诉他第二遍第三遍。让另外一个人完整地了解你的意图不是一件简单的事情。</p>
<p>(6)充分地交流。就这个项目而言，你和你的组员之间的交流可能还远远不够！</p>
<p>(7)锻炼/指导你的组员、相信你的组员。如果作为项目经理的你是个优秀的程序员，那么千万不要相信自己能完成所有的主要/核心功能。你也许可以完成某一模块，但是更多的模块是由你的组员完成的。</p>
<p>(8)千万不要惟我独尊。也许你很坚信自己的方案是优秀的，但是如果你的组员提出了新的方案，那么请你重视这个新方案，并一视同仁的从这两个方案中抉择更适用于当前项目的那个。我就从组员那里吸收了很多精彩的想法，并将它们运用到项目中。</p>
<p>(9)坚决的执行力！前提是你必须有足够的判断力和决断力。当有些议题没有结论的时候，你需要来拍板。</p>
<p>(10)公平公正的对待每个组员。千万不要偏袒任何一个！</p>
<p>(11)请记住，项目经理不是&ldquo;官&rdquo;。</p>
          <br/>
          <span style="color:red;">
            <a href="http://coolyzg.javaeye.com/blog/75821#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 28 Apr 2007 10:48:13 +0800</pubDate>
        <link>http://coolyzg.javaeye.com/blog/75821</link>
        <guid>http://coolyzg.javaeye.com/blog/75821</guid>
      </item>
      <item>
        <title>dwrutil</title>
        <author>coolyzg</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://coolyzg.javaeye.com">coolyzg</a>&nbsp;
          链接：<a href="http://coolyzg.javaeye.com/blog/69212" style="color:red;">http://coolyzg.javaeye.com/blog/69212</a>&nbsp;
          发表时间: 2007年04月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <a>$(&quot;precloneNode1suf&quot;) 取得该对象;<br />
<br />
DWRUtil.selectRange(&quot;selectRangeBasic&quot;, 5, 15) 选中selectRangeBasic文本框里面从第五个字符到第15个字符之间的字符.<br />
<br />
DWRUtil._getSelection(&quot;selectRangeBasic&quot;) 得到selectRangeBasic文本框里选中的字符.<br />
<br />
var arrayFive = [ 'One', 'Two', 'Three', 'Four', 'Five' ];<br />
DWRUtil.addOptions('addOptionsBasic', arrayFive); 将数组添加到下拉菜单里面去;<br />
<br />
DWRUtil.getValue('addOptionsBasic') 得到 addOptionsBasic 对象的值;<br />
DWRUtil.getValue(&quot;precloneNode1Inner1suf&quot;, { textContent:true }); 后面加个参数,在 precloneNode1Inner1suf元素为&quot;UL&quot; 时,它返回了元素里面得值,也就是说去掉了HTML标签部分.<br />
<br />
DWRUtil.getText('addOptionsBasic') 得到下拉框 addOptionsBasic 显示的文本;<br />
<br />
var arrayObject = [<br />
{ name:'One', value:'1' },<br />
{ name:'Two', value:'2' },<br />
{ name:'Three', value:'3' },<br />
{ name:'Four', value:'4' },<br />
{ name:'Five', value:'5' }<br />
];<br />
DWRUtil.addOptions('addOptionsObject1', arrayObject, &quot;name&quot;); 将数组添加到下拉菜单里面去;后面的参数是确定那个是给用户显示的文本,同时也是值;<br />
<br />
DWRUtil.addOptions('addOptionsObject1', arrayObject, &quot;name&quot;,&quot;value&quot;); 同上,不过后面参数是: 3=文本;4=值;<br />
<br />
var map = { one:1, two:2, three:3, four:4, five:5 };<br />
DWRUtil.addOptions('addOptionsMap1', map); 同上, one 是值;1 是文本;<br />
DWRUtil.addOptions('addOptionsMap1', map,true); 同上, 1 是值;one 是文本;<br />
<br />
-------------------------------------------------------------------------------------<br />
&lt;ul id=&quot;removeItems&quot;&gt;<br />
&lt;li&gt;One&lt;/li&gt;&lt;li&gt;Two&lt;/li&gt;&lt;li&gt;Three&lt;/li&gt;&lt;li&gt;Four&lt;/li&gt;&lt;li&gt;Five&lt;/li&gt;<br />
&lt;/ul&gt;<br />
<br />
如果是列表显示,如上;则上面所有方法和select 下拉框使用一样;<br />
-------------------------------------------------------------------------------------<br />
DWRUtil.cloneNode('cloneNode1', { idPrefix:'pre', idSuffix:'suf' });克隆一个节点,参数一为要克隆的节点的id,第二个参数是在克隆的节点id前面加pre,后面加suf.(注意:如果该节点有子节点的话,子节点的名字也一样加)<br />
<br />
DWRUtil.addRows(id, array, cellfuncs, [options]);<br />
原理:<br />
<br />
for each member in array<br />
for each function in cellfuncs<br />
create cell from cellfunc(array[i])<br />
循环数组,循环函数,建立单元调用函数;(顺序决定)<br />
<br />
例如:<br />
DWRUtil.addRows('addRowsBasic', arrayFive, [<br />
function(data) { return data; },<br />
function(data) { return data.toUpperCase(); },<br />
function(data) {<br />
var input = document.createElement(&quot;input&quot;);<br />
input.setAttribute(&quot;type&quot;, &quot;button&quot;);<br />
input.setAttribute(&quot;value&quot;, &quot;DOM Test&quot;);<br />
input.setAttribute(&quot;onclick&quot;, &quot;alert('&quot; + data + &quot;');&quot;);<br />
return input;<br />
},<br />
function(data) { return &quot;&lt;input type='button' value='innerHTML Test' onclick='alert(\&quot;&quot; + data + &quot;\&quot;);'&gt;&quot;; }<br />
]);<br />
<br />
高级部分:<br />
第四个参数为对单元的高级操作,主要下面的两个方法;<br />
function defaultRowCreator(options) {<br />
return document.createElement(&quot;tr&quot;);<br />
};<br />
<br />
function defaultCellCreator(options) {<br />
return document.createElement(&quot;td&quot;);<br />
};<br />
<br />
例子:<br />
DWRUtil.addRows( &quot;demo2&quot;,[ 'Africa', 'America', 'Asia', 'Australasia', 'Europe' ] , cellFuncs, {<br />
rowCreator:function(options) {<br />
var row = document.createElement(&quot;tr&quot;);<br />
var index = options.rowIndex * 50;<br />
row.style.color = &quot;rgb(&quot; + index + &quot;,0,0)&quot;;<br />
return row;<br />
},<br />
cellCreator:function(options) {<br />
var td = document.createElement(&quot;td&quot;);<br />
var index = 255 - (options.rowIndex * 50);<br />
td.style.backgroundColor = &quot;rgb(&quot; + index + &quot;,255,255)&quot;;<br />
td.style.fontWeight = &quot;bold&quot;;<br />
return td;<br />
}<br />
});<br />
<br />
其中 options 参数的属性可用的为:(没试过,自己试试吧)<br />
<br />
rowData: the element value from the array (the same for all cells in a row) <br />
rowIndex: the key (if map) or index (if array) from the collection <br />
rowNum: The row number counting from 0 in this section (so if you are using tbody, it counts rows in the tbody and not the whole table) <br />
data: The 'computed' data value for the cell (cellCreators only) <br />
cellNum: The cell number that we are altering counting from 0 (cellCreators only) <br />
<br />
<br />
DWRUtil.setValues(); 批量设置值;<br />
var settings = {<br />
setValuesDiv:&quot;setValuesDiv&quot;,<br />
setValuesSpan:&quot;setValuesSpan&quot;,<br />
setValuesSelect:&quot;two&quot;,<br />
setValuesText:&quot;setValuesText&quot;,<br />
setValuesPassword:&quot;AB&quot;,<br />
setValuesTextarea:&quot;setValuesTextarea&quot;,<br />
setValuesButton1:&quot;B1-Two&quot;,<br />
setValuesButton2:&quot;B2-Two&quot;,<br />
setValuesRadio1:true,<br />
setValuesRadio2:false,<br />
setValuesRadio3:&quot;one&quot;,<br />
setValuesRadio4:&quot;two&quot;,<br />
setValuesCheckbox1:true,<br />
setValuesCheckbox2:false<br />
};<br />
DWRUtil.setValues(settings);<br />
<br />
DWRUtil.getValues(empty);批量获取值;<br />
var empty = {<br />
setValuesDiv:null,<br />
setValuesSpan:null,<br />
setValuesSelect:null,<br />
setValuesText:null,<br />
setValuesPassword:null,<br />
setValuesTextarea:null,<br />
setValuesButton1:null,<br />
setValuesButton2:null,<br />
setValuesRadio1:null,<br />
setValuesRadio2:null,<br />
setValuesRadio3:null,<br />
setValuesRadio4:null,<br />
setValuesCheckbox1:null,<br />
setValuesCheckbox2:null<br />
};<br />
DWRUtil.getValues(empty);<br />
<br />
DWRUtil.useLoadingMessage(&quot;Ping&quot;);//类似gmail那个样子,在右上角显示加载&quot;ping&quot;;可用自定样式,具体查询;</a><a href="http://getahead.ltd.uk/dwr/browser/util/useloadingmessage" target="_blank">http://getahead.ltd.uk/dwr/browser/util/useloadingmessage</a><br />
<br />
DWRUtil.toDescriptiveString(&quot;id&quot;,数字);弹出调试信息,数字为0,1,2.一级比一级高.<br />
<br />
DWRUtil.onReturn(event, submitFunction);一般在form表单里面,防止在文本框上按回车就提交表单.<br />
例如:<br />
&lt;input type=&quot;text&quot;<br />
onkeypress=&quot;DWRUtil.onReturn(event, submitFunction)&quot;/&gt;<br />
&lt;input type=&quot;button&quot; onclick=&quot;submitFunction()&quot;/&gt;<br />
          <br/>
          <span style="color:red;">
            <a href="http://coolyzg.javaeye.com/blog/69212#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 09 Apr 2007 14:40:37 +0800</pubDate>
        <link>http://coolyzg.javaeye.com/blog/69212</link>
        <guid>http://coolyzg.javaeye.com/blog/69212</guid>
      </item>
      <item>
        <title>DWRUtil 使用</title>
        <author>coolyzg</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://coolyzg.javaeye.com">coolyzg</a>&nbsp;
          链接：<a href="http://coolyzg.javaeye.com/blog/60727" style="color:red;">http://coolyzg.javaeye.com/blog/60727</a>&nbsp;
          发表时间: 2007年03月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <strong>util.js</strong> <br />
util.js包含了一些使用的方法，从而帮助你利用j avascript(可能)从服务器端更新你的web数据。<br />
你可以在DWR之外的地方使用它，因为它并不依赖与DWR而实现。<br />
它包含四个页面处理函数：getValue[s]()、setValue[s]()作用于除tables、lists和images以外的大多数html元素。getText()作用于select lists。<br />
addRows()和removeAllRows()用于编辑tables。addOptions()和removeAllOptions()用于编辑lists(如：select lists、ul、ol)。
<p><br />
<strong>$()<br />
</strong>$函数(在j avascript中，他的名字是合法的)的思想是从prototype引进的。一般说来，$ = document.getElementById。在以后你花大量时间进行ajax编程的时候，在合适的地方使用这种格式是很有益的。<br />
'$'通过给定的ID在当前HTML页面找到元素，如果多于一个的参数被提交，它就会返回一个包含已找到元素的数组。这个函数从prototype的library中得到的灵感，而且，它还能更好的工作在不同的浏览器中。</p>
<p><br />
<strong>Generating Lists</strong><br />
DWR的一个功能可以给一个下拉列表(select list)添加选项，只需使用DWRUtil.addOptions()。<br />
如果你在更新列表之前，希望保留一些选项，你需要写以下一些代码：<br />
var sel = DWRUtil.getValue(id);<br />
DWRUtil.removeAllOptions(id);<br />
DWRUtil.addOptions(id, ...);<br />
DWRUtil.setValue(id, sel);<br />
如果你想有个初始化选项，如：&ldquo;please select&rdquo;，你可以直接使用：<br />
DWRUtil.addOptions(id, [&quot;Please select&quot;]);<br />
DWRUtil.addOptions 有5种调用方法：Array: DWRUtil.addOptions(selectid, array) 。selectid为目标ID,array为每一项的text。<br />
Array of objects (option text = option value): DWRUtil.addOptions(selectid, data, prop) 用text和value的集合来为每一个数组元素创建一个选项，pro参数指定text和value的值。<br />
Array of objects (with differing option text and value): DWRUtil.addOptions(selectid, array, valueprop, textprop) 用text和value的集合来为每一个数组元素创建一个选项，valueprop确定value，textprop确定text。<br />
Object: DWRUtil.addOptions(selectid, map, reverse) 为map中每一个属性(property)创建一个选项，属性名作为选项的value，属性的value作为选项的text。这样做看起来是错的，但实际上这种做法的确是正确的。如果reverse参数被设置为true，则属性的value还是被用做选项的value。<br />
Map of objects: DWRUtil.addOptions(selectid, map, valueprop, textprop) 为map中的每一个对象创建一个选项，valueprop指定选项的value，textprop指定选项的text。</p>
<p><br />
<strong>Generating Tables</strong><br />
DWRUtil.addRows() 从一个数组(第二个参数)取得值，创建table的每一行。从另一个数组(第三个参数)去得值，为table的每一行创建若干列。<br />
DWRUtil.addRows()的用法：<br />
DWRUtil.addRows(&rdquo;items&rdquo;,items,cellFunctions);<br />
第一个items,应该是table的id，第2个items，是远程返回的结果集,cellFunctions,对表格行填充的回调函数一类的。<br />
var cellFunctions = [ function(item) { return item.name; },<br />
function(item) { return item.description; },<br />
function(item) { return item.formattedPrice; },<br />
function(item) { var btn = document.createElement(&rdquo;button&rdquo;); btn.innerHTML = &ldquo;Add to cart&rdquo;; btn.itemId = item.id; btn.onclick = addToCartButtonHandler; return btn; }<br />
应该是一个function(item)就代表一列，return的就是传入的结果集的某列的内容。那么这个表格就应该有4列。最后一列是静态的html代码了。不过没研究一下，return回去动静混合的内容，就是一个字串会如何。我猜应该也可以吧。</p>
<p>DWRUtil.getText(id)<br />
可以根据id取得text的值，这个方法只能用于select list<br />
DWRUtil.getValue(id)<br />
可以根据id取得value，使用这个方法，你不必在意div和select list的不同。<br />
DWRUtil.getValues()<br />
getValues() is similar to getValue() except that the input is a Javascript object that contains name/value pairs. The names are assumed to be the IDs of HTML elements, and the values are altered to reflect the contents of those IDs. This method does not return the object in question, it alters the value that you pass to it.<br />
这个方法和getValue()一样，只是它传入的是一个包含名字和数值的j avascript对象.这个名字就是HTML元素的ID。这个方法不会返回任何对象，它只会将ID的value映射给传入的value。例：<br />
function doGetValues() {<br />
var text= &quot;{<br />
div:null,<br />
textarea:null,<br />
select:null,<br />
text:null,<br />
password:null,<br />
formbutton:null,<br />
button:null<br />
}&quot;;<br />
var object = objectEval(text); //j avascript对象<br />
DWRUtil.getValues(object);<br />
var reply = DWRUtil.toDescriptiveString(object, 2); //toString<br />
reply = reply.replace(/n/g, &quot;&lt;br/&gt;&quot;); //转意<br />
DWRUtil.setValue(&quot;getvaluesret&quot;, reply); //显示<br />
}</p>
<p><br />
<strong>DWRUtil.onReturn</strong><br />
贴一段代码，暂时不理解，用onReturn和不用有什么区别<br />
&lt;script&gt;<br />
function submitFunction()<br />
{<br />
$(&quot;alert&quot;).style.display = &quot;inline&quot;;<br />
setTimeout(&quot;unsubmitFunction();&quot;, 1000);<br />
}<br />
function unsubmitFunction()<br />
{<br />
$(&quot;alert&quot;).style.display = &quot;none&quot;;<br />
}<br />
&lt;/script&gt;<br />
&lt;p&gt;&lt;input type=&quot;text&quot; onkeydown=&quot;DWRUtil.onReturn(event, submitFunction)&quot;/&gt;<br />
&lt;input type=&quot;button&quot; onclick=&quot;submitFunction()&quot; value=&quot;GO&quot;/&gt;<br />
&lt;span id=&quot;alert&quot; style=&quot;display:none; background:#FFFFDD; font-weight:bold;&quot;&gt;submitFunction called&lt;/span&gt;<br />
&lt;/p&gt;</p>
<p><br />
<strong>DWRUtil.selectRange</strong><br />
在一个input box里选一个范围<br />
DWRUtil.selectRange(&quot;sel-test&quot;, $(&quot;start&quot;).value, $(&quot;end&quot;).value);<br />
DWRUtil.setValue(id, value)<br />
用ID找到元素，并更新value<br />
DWRUtil.setValues()<br />
和setValue(id,value)一样，只是它需要的参数是个j avascript对象，如：<br />
DWRUtil.setValues({<br />
div: &quot;new div content&quot;,<br />
password: &quot;1234567890&quot;<br />
});</p>
<p><br />
<strong>DWRUtil.toDescriptiveString</strong><br />
带debug信息的toString，第一个为将要debug的对象，第二个参数为处理等级。等级如下：<br />
0: Single line of debug 单行调试<br />
1: Multi-line debug that does not dig into child objects 不分析子元素的多行调试<br />
2: Multi-line debug that digs into the 2nd layer of child objects 最多分析到第二层子元素的多行调试<br />
And so on. Level 2 and greater probably produce too much output.<br />
总结：DWR不但屏蔽了许多client与server交互的重复且复杂的代码，而且还提供了一些常用的方法，一些思想还是从prototype继承而来，并有一定的改进。同时，它也考虑到了与struts、hibernate、spring的结合问题。<br />
需要注意的是，DWR是一种把服务器端的java代码通过j avascript直接从浏览器调用的方法(DWR is a way of calling Java code on the server directly from Javascript in the browser.)，而不是一个j avascript的库</p>
          <br/>
          <span style="color:red;">
            <a href="http://coolyzg.javaeye.com/blog/60727#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 18 Mar 2007 18:02:18 +0800</pubDate>
        <link>http://coolyzg.javaeye.com/blog/60727</link>
        <guid>http://coolyzg.javaeye.com/blog/60727</guid>
      </item>
      <item>
        <title>Java开发工程师</title>
        <author>coolyzg</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://coolyzg.javaeye.com">coolyzg</a>&nbsp;
          链接：<a href="http://coolyzg.javaeye.com/blog/56486" style="color:red;">http://coolyzg.javaeye.com/blog/56486</a>&nbsp;
          发表时间: 2007年02月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          职位描述：<br />良好的团队精神和沟通、领悟能力； <br />有2年以上的J2EE开发经验，有至少二个大中型软件系统的开发经验； <br />良好的JAVA编程技巧和文档编写能力； <br />熟练应用最基本的Web开发技术（Jsp，Html，Css，JS，Servlet，XML）； <br />熟练应用Struts，Hibernate框架； <br />掌握Spring框架者优先； <br />熟悉SQL Server/Oracle等数据库的应用开发； <br />熟练应用Tomcat，JBoss；了解Websphere，Sun App Server； <br />熟悉Windows，Linux操作系统； <br />有UML分析设计经验者优先； <br />应届毕业生勿投； <br /><br />江苏思达辉科技有限公司是一家依托电力，面向市场，从事政府机关、企业事业单位应用软件开发，软件项目外包，CTI（computer telephony integration）以及电子新产品研发的高新技术企业。公司致力于利用先进的计算机网络技术、通讯技术，为用户建立以信息处理为基础的综合业务网络，帮助企业和政府机构迈上科学管理和业务自动化处理的新台阶。 <br />公司网站： http://www.bestthink.com.cn <br />地    址： 南京市虎踞北路72号国家科技园C楼201室 <br />邮政编码： 210000 <br />传    真： (025)83740212 <br />联 系 人： 章先生 <br />电    话： (025)83751234
          <br/>
          <span style="color:red;">
            <a href="http://coolyzg.javaeye.com/blog/56486#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 28 Feb 2007 13:43:41 +0800</pubDate>
        <link>http://coolyzg.javaeye.com/blog/56486</link>
        <guid>http://coolyzg.javaeye.com/blog/56486</guid>
      </item>
      <item>
        <title>反编译插件</title>
        <author>coolyzg</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://coolyzg.javaeye.com">coolyzg</a>&nbsp;
          链接：<a href="http://coolyzg.javaeye.com/blog/54589" style="color:red;">http://coolyzg.javaeye.com/blog/54589</a>&nbsp;
          发表时间: 2007年02月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>名称：Jode Decompiler.安装方法：点击Eclipse的Help菜单 --&gt; Software Updates --&gt; Find and install...，然后选择：Search for new features to install，在弹出的对话框中点击&quot;New Remote Site...&quot;菜单。填入：Name: Jode DecomopilerURL: http://www.technoetic.com/eclipse/update点击&quot;Finish&quot;。之后可以在Window菜单的Preferences --&gt; Java --&gt;Jode Decompiler中配置插件的信息。</p>
          <br/>
          <span style="color:red;">
            <a href="http://coolyzg.javaeye.com/blog/54589#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 15 Feb 2007 16:44:32 +0800</pubDate>
        <link>http://coolyzg.javaeye.com/blog/54589</link>
        <guid>http://coolyzg.javaeye.com/blog/54589</guid>
      </item>
      <item>
        <title>FCKEDITOR部分属性设置</title>
        <author>coolyzg</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://coolyzg.javaeye.com">coolyzg</a>&nbsp;
          链接：<a href="http://coolyzg.javaeye.com/blog/50777" style="color:red;">http://coolyzg.javaeye.com/blog/50777</a>&nbsp;
          发表时间: 2007年01月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          配置选项:<br />
<br />
AutoDetectLanguage=true/false 自动检测语言<br />
BaseHref=&quot;&quot; 相对链接的基地址<br />
ContentLangDirection=&quot;ltr/rtl&quot; 默认文字方向<br />
ContextMenu=字符串数组,右键菜单的内容<br />
CustomConfigurationsPath=&quot;&quot; 自定义配置文件路径和名称<br />
Debug=true/false 是否开启调试功能,这样,当调用FCKDebug.Output()时,会在调试窗中输出内容<br />
DefaultLanguage=&quot;&quot; 缺省语言<br />
EditorAreaCss=&quot;&quot; 编辑区的样式表文件<br />
EnableSourceXHTML=true/false 为TRUE时,当由可视化界面切换到代码页时,把HTML处理成XHTML<br />
EnableXHTML=true/false 是否允许使用XHTML取代HTML<br />
FillEmptyBlocks=true/false 使用这个功能,可以将空的块级元素用空格来替代<br />
FontColors=&quot;&quot; 设置显示颜色拾取器时文字颜色列表<br />
FontFormats=&quot;&quot; 设置显示在文字格式列表中的命名<br />
FontNames=&quot;&quot; 字体列表中的字体名<br />
FontSizes=&quot;&quot; 字体大小中的字号列表<br />
ForcePasteAsPlainText=true/false 强制粘贴为纯文本<br />
ForceSimpleAmpersand=true/false 是否不把&amp;符号转换为XML实体<br />
FormatIndentator=&quot;&quot; 当在源码格式下缩进代码使用的字符<br />
FormatOutput=true/false 当输出内容时是否自动格式化代码<br />
FormatSource=true/false 在切换到代码视图时是否自动格式化代码<br />
FullPage=true/false 是否允许编辑整个HTML文件,还是仅允许编辑BODY间的内容<br />
GeckoUseSPAN=true/false 是否允许SPAN标记代替B,I,U标记<br />
IeSpellDownloadUrl=&quot;&quot;下载拼写检查器的网址<br />
ImageBrowser=true/false 是否允许浏览服务器功能<br />
ImageBrowserURL=&quot;&quot; 浏览服务器时运行的URL<br />
ImageBrowserWindowHeight=&quot;&quot; 图像浏览器窗口高度<br />
ImageBrowserWindowWidth=&quot;&quot; 图像浏览器窗口宽度<br />
LinkBrowser=true/false 是否允许在插入链接时浏览服务器<br />
LinkBrowserURL=&quot;&quot; 插入链接时浏览服务器的URL<br />
LinkBrowserWindowHeight=&quot;&quot;链接目标浏览器窗口高度<br />
LinkBrowserWindowWidth=&quot;&quot;链接目标浏览器窗口宽度<br />
Plugins=object 注册插件<br />
PluginsPath=&quot;&quot; 插件文件夹<br />
ShowBorders=true/false 合并边框<br />
SkinPath=&quot;&quot; 皮肤文件夹位置<br />
SmileyColumns=12 图符窗列数<br />
SmileyImages=字符数组 图符窗中图片文件名数组<br />
SmileyPath=&quot;&quot; 图符文件夹路径<br />
SmileyWindowHeight 图符窗口高度<br />
SmileyWindowWidth 图符窗口宽度<br />
SpellChecker=&quot;ieSpell/Spellerpages&quot; 设置拼写检查器<br />
StartupFocus=true/false 开启时FOCUS到编辑器<br />
StylesXmlPath=&quot;&quot; 设置定义CSS样式列表的XML文件的位置<br />
TabSpaces=4 TAB键产生的空格字符数<br />
ToolBarCanCollapse=true/false 是否允许展开/折叠工具栏<br />
ToolbarSets=object 允许使用TOOLBAR集合<br />
ToolbarStartExpanded=true/false 开启是TOOLBAR是否展开<br />
UseBROnCarriageReturn=true/false 当回车时是产生BR标记还是P或者DIV标记<br />
<br />
如何自定义样式列表呢?<br />
FCKEDITOR的样式工具栏中提供了预定义的样式,样式是通过XML文件定义的,默认的XML样式文件存在于FCkEditor根文件夹下的FckStyls.xml文件中<br />
这个XML文件的结构分析如下:<br />
&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot; ?&gt;<br />
&lt;Styles &gt;<br />
&lt;Style name=&quot;My Image&quot; element=&quot;img&quot;&gt;<br />
&lt;Attribute name=&quot;style&quot; value=&quot;padding: 5px&quot; /&gt;<br />
&lt;Attribute name=&quot;border&quot; value=&quot;2&quot; /&gt;<br />
&lt;/Style &gt;<br />
&lt;Style name=&quot;Italic&quot; element=&quot;em&quot; /&gt;<br />
&lt;Style name=&quot;Title&quot; element=&quot;span&quot;&gt;<br />
&lt;Attribute name=&quot;class&quot; value=&quot;Title&quot; /&gt;<br />
&lt;/Style &gt;<br />
&lt;Style name=&quot;Title H3&quot; element=&quot;h3&quot; /&gt;<br />
&lt;/Styles&gt;<br />
<br />
每一个STYLE标记定义一种样式,NAME是显示在下拉列表中的样式名,ELEMENT属性指定此样式所适用的对象,因为FCKEDITOR中的样式是上下文敏感的,也就是说,选择不同的对象,仅会显示针对这类对象定义的样式<br />
<br />
拼写检查<br />
<br />
FCKEDITOR带了两种拼写检查工具,一种是ieSpell,默认情况下使用这种,使用这种方式的拼写检查,要求客户下载并安装iespell这个小软件,另外,也提供SpellPager的方式来进行拼写检查,不过,由于SPELLPAGER是由PHP编写的服务器端脚本,因此,要求你的WEB服务器必须支持PHP脚本语言方可<br />
更改拼写检查器的方式请参见有关配置文件的详细说明<br />
<br />
压缩脚本<br />
<br />
为了提供脚本载入的效率,FCKEDITOR采用以下方法对脚本尽量压缩以减少脚本尺寸:<br />
1,移除掉脚本中的注释<br />
2.移除掉脚本中所有无意义的空白<br />
另外,FCKEDITOR还提供了一个专门用于压缩脚本的工具以便 你在发布时能减小文件尺寸,<br />
你可以将_Packager文件夹中的Fckeditor.Packager.exe复制到FCKEDITOR根文件夹来运行并压缩脚本<br />
<br />
本地化FCKEDITOR<br />
如果FCKEDITOR没有提供您所需要的语言(实际上全有了),你也可以自行制作新的语言<br />
,你只需要复制出EN.JS,然后在其基础上进行翻译.另外,语言名称与对应的脚本文件名必须遵循RFC 3066标准,但是,需要小写,例如:Portuguess Language对应的脚本文件名必须为pt.js<br />
如果需要针对某个国家的某种语系,则可以在语系缩写后加上横线及国家缩写即可<br />
<br />
在使用时,系统会自动侦测客户端语系及国别而运用适当的界面语言.<br />
<br />
当建立一种新的语言后,你必须在&quot;Edit/lang/fcklanguagemanager.js&quot;中为其建立一个条目,如下所示:<br />
FCKLanguageManager.AvailableLanguages = <br />
{<br />
<br />
en : 'English',<br />
pt : 'Portuguese' <br />
} <br />
<br />
需要提醒的是,文件必须保存为UTF-8格式<br />
          <br/>
          <span style="color:red;">
            <a href="http://coolyzg.javaeye.com/blog/50777#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 27 Jan 2007 08:51:01 +0800</pubDate>
        <link>http://coolyzg.javaeye.com/blog/50777</link>
        <guid>http://coolyzg.javaeye.com/blog/50777</guid>
      </item>
      <item>
        <title>2006语录 </title>
        <author>coolyzg</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://coolyzg.javaeye.com">coolyzg</a>&nbsp;
          链接：<a href="http://coolyzg.javaeye.com/blog/45276" style="color:red;">http://coolyzg.javaeye.com/blog/45276</a>&nbsp;
          发表时间: 2007年01月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font face="Arial">1.先是超女冠军李宇春，后是奥斯卡奖的《断臂山》，中国同性恋们终于站起来了！ <br />
2.有看《金刚》不哭的MM吗？我想没有～但如果换成是女金刚和男帅哥的话，我想就完全不会有人哭了~</font></p>
<p><font face="Arial">3.欧盟一个劲儿指责中国打击盗版不力，因为全球限量生产的6辆法拉利仅在中国就有7辆！ <br />
4.&ldquo;不得穿内裤和拖鞋进教室！&rdquo;说实话，即便在南邮混了四年，我脸皮也没厚到不穿内裤进教室&hellip;&hellip;　　</font></p>
<p><font face="Arial">5.长得帅有个屁用，消费完了能用那张脸去刷卡么！！ <br />
6.五一长假，租女友，一日。　　</font></p>
<p><font face="Arial">7.特大喜讯：《实况足球10》终于有中国队啦！！！中国队唯一用途是高手在向周围人炫耀时说：&ldquo;来来来，我们切两把，我选中国队～&rdquo;　　</font></p>
<p><font face="Arial">8.小朋友们都站好，摆个pose照相啦！唉～小莉，站要有站相，不要像frjj那样~~~　　</font></p>
<p><font face="Arial">9.以前资本家宁可把牛奶倒掉也不给穷人喝，现在房产商宁可把房子空着也不给百姓住！ 　　</font></p>
<p><font face="Arial">10.不能成为举人，如何傍眼探花？ 　　</font></p>
<p><font face="Arial">11.今天一群日本人来我校参观&mdash;&mdash;说实话，这是我第一次看到穿衣服的日本人&hellip;&hellip; 　　</font></p>
<p><font face="Arial">12.中国石油十大化：干部贵族化，员工奴隶化，人际复杂化，加班日夜化，上班无偿化，业绩保密化，竟聘内定化，检查形式化，待遇民工化，加薪？那是TMD的神话！！！ 　　</font></p>
<p><font face="Arial">13.上帝欲使人灭亡，必先使其疯狂；上帝欲使人疯狂，必先使其买房！ 　　</font></p>
<p><font face="Arial">14.我宁愿接受你在流氓身下拼死反抗，也不愿承受你在男人身下飘飘欲仙！　　</font></p>
<p><font face="Arial">15.由于之前大阪钢巴队在国内联赛以6-1痛扫同城死敌大阪樱花队，所以今晚亚冠比赛有40名大阪樱花队的球迷来大连为实德队加油&hellip;&hellip;<br />
<font face="Arial">16.终于明白周杰伦的《范特西》是什么意思了&mdash;&mdash;粥！　　</font></font></p>
<p><font face="Arial"><font face="Arial">17.答辩难度要视答辩老师头天晚上的性生活质量而定～ 　　</font></font></p>
<p><font face="Arial"><font face="Arial">18.亚当一加班回去晚了，夏娃就数他肋骨&hellip;&hellip; 　　</font></font></p>
<p><font face="Arial"><font face="Arial">19.乡亲们，太监说了，只要交出土八路，红军是不会亏待你们滴～　　</font></font></p>
<p><font face="Arial"><font face="Arial">20.网通用户说：&ldquo;我不在刷新来福岛的页面中，就一直在登陆来福岛的过程中&hellip;&hellip;&rdquo; 　　</font></font></p>
<p><font face="Arial"><font face="Arial">21.小时候妈妈常唠叨：&ldquo;考不上清华啊咱就考北大。&rdquo;结果长大了我连北大也没考上&hellip;&hellip; 　　</font></font></p>
<p><font face="Arial"><font face="Arial">22.朋友们都说我是著名的音乐人，因为每次去k歌，他们唱的都是别人的歌，而我却总是自己谱曲&hellip;&hellip; 　　</font></font></p>
<p><font face="Arial"><font face="Arial">23.我女朋友曾经说过：&ldquo;我的愿望并不高～老公不用太有钱，能在我怀孕时开车接我上下班就行。&rdquo;后来，她嫁给了一个出租车司机&hellip;&hellip;　　</font></font></p>
<p><font face="Arial"><font face="Arial">24.昨天，我残忍地拒绝了一个令我无法拒绝的女人提出的无法拒绝的要求&mdash;&mdash;老妈心疼地对我说：&ldquo;娃啊，你也不小了，该找个女朋友了&hellip;&hellip;&rdquo; 　　</font></font></p>
<p><font face="Arial"><font face="Arial">25.远在老家的奶奶听我考上北大的消息后很伤心地说：&ldquo;娃呀，你怎么不上中央民族学院啊，那好歹也算是个中央院校啊，那破北京大学不就是个地方院校嘛～&rdquo;　　</font></font></p>
<p><font face="Arial"><font face="Arial">26.车比暗疮还要挤，心比六级更难过，校网像明一的玻璃一样劲破，自己像中东的天桥一样没用&hellip;&hellip;　　</font></font></p>
<p><font face="Arial"><font face="Arial">27.如果我是蒲公英该有多好：有漂亮的头饰，有特别的翅膀，而且妈妈不会阻止我远航&hellip;&hellip;　　</font></font></p>
<p><font face="Arial"><font face="Arial">28.我很穷，我家的佣人也很穷，我家的园丁也很穷，我家的司机也很穷&hellip;&hellip;　　</font></font></p>
<p><font face="Arial"><font face="Arial">29.起床从不叠被，学习从来不累；不进学生会，根本无所谓！　　常常夜不能寐，思考谁最般配；男女适当配对，青春不能浪费～ <br />
　　深知不学不对，仍然喝酒聚会；半夜三更不睡，上课常抹眼泪&hellip;&hellip;　　就是群雄荟萃，期末复习不背；考试啥也不会，重修不过就退！ <br />
30.我们为尿是不是由于地心引力而排出体外争论不休，我是持反对意见的一方。为证明我方观点正确，我一边倒立，一边小便给他们看&hellip;&hellip; </font></font></p>
<p><font face="Arial"><font face="Arial"><font face="Arial">31.热恋伤身，暗恋伤心&hellip;&hellip; <br />
32.如果这个世界上不存在性，那么我想爱情才会出现～ <br />
33.昵称叫&ldquo;我爱XXX&rdquo;的最终以分手的居多&hellip;&hellip; <br />
34.思想有多远，你就滚多远！！！　　</font></font></font></p>
<p><font face="Arial"><font face="Arial"><font face="Arial">35.最差的人品莫过于痴痴地盯着一个丑女看半晌，然后叹口气说：&ldquo;靠，这恐龙做得太像真的了&hellip;&hellip;&rdquo; <br />
36.mm叹口气道：&ldquo;终于见血了，这灾是不是就算躲过了&hellip;&hellip;&rdquo;　　</font></font></font></p>
<p><font face="Arial"><font face="Arial"><font face="Arial">37.从哪个床上跌倒，就再从哪个床上爬起来！！　　</font></font></font></p>
<p><font face="Arial"><font face="Arial"><font face="Arial">38.爱你，有种被枪指着头的感觉&hellip;&hellip;　　</font></font></font></p>
<p><font face="Arial"><font face="Arial"><font face="Arial">39.我把今生幸福郑重地交给了自己的左手&hellip;&hellip;　　　　</font></font></font></p>
<p><font face="Arial"><font face="Arial"><font face="Arial">40.亲爱的，死没？死的话抱紧我，好让收尸的知道我们是一对儿！　　</font></font></font></p>
<p><font face="Arial"><font face="Arial"><font face="Arial">41.天大的男生打女生&mdash;&mdash;打一游戏名&mdash;&mdash;反恐精英；天大的女生打女生&mdash;&mdash;打一游戏名&mdash;&mdash;魔兽争霸！ <br />
42.刚毕业时：弟兄们，后会有期啊；毕业一年：兄弟们，后会有妻啊；后来：兄弟们，后悔有妻啊；再后来：兄弟们，会有后妻啊；最后：兄弟们，悔有后妻啊！ <br />
43.J总书记在交大校庆时说：&ldquo;前几年上海交大还排21，现在都第三了，看来我的影响还是深远的～&rdquo; 如今总书记退休了，一些官员过河拆桥，交大汉芯丑闻立刻被暴光！唉～今年7月我就要毕业离开农大了，不知道农大会出什么乱子&hellip;&hellip; <br />
44.班里女同学下晚自习不敢回去，后来她们每人带了个手电筒&mdash;&mdash;这样每当遇到草丛里蹦出来的人时，只要冷静地掏出手电筒对着自己的脸照一照就一切都安全了&hellip;&hellip; </font></font></font></p>
<p><font face="Arial"><font face="Arial"><font face="Arial">45.日本人把&ldquo;纪念&rdquo;写做&ldquo;记念&rdquo;，鲁迅先生在日本几年可能写习惯了，所以在《记念刘和珍君》中写了错别字，也就是现在汉语说的通假字，但如果我们也那样写就是错别字了～看来历史都是由人写的，位高权重者驾驭历史&hellip;&hellip; <br />
46.跳棋高手谈获胜秘诀：1.要不惜一切代价为自己铺路搭桥；2.当自己目的达到时要立即过河拆桥；3.万一自己陷入不利的境地，要死死地拖住对家的一个子不放，你赢不了对手对手也别想轻易赢！ <br />
47.怎样争夺女主角？当不了男主角，就努力当个大反角；当不了大反角，争取当个够酷的男配角；当不了男配角，至少得当个不和主角正面拼的悲情角；当不了悲情角，那只好去当个主角身边的小丑角；要是连小丑角都当不了&mdash;&mdash;我这里有本10块钱的宝典，可以教你如何取代女主角&hellip;&hellip; <br />
48.大家一定要抵制日货&mdash;&mdash;因为我刚买的索尼手机才用了俩礼拜就坏了！！ <br />
49.没能力危害祖国，没理由背离人民， <br />
　　没资本好逸恶劳，没本事损人利己， <br />
　　没机会见利忘义，没胆量违法乱纪， <br />
　　没钞票骄奢淫逸，只好愚昧无知了！ <br />
50.上班/上学族每天最期盼的时刻： <br />
　　　　　　　　　　　　　　, <br />
　　　　　　 ﹋ ﹌ ﹌ (╰╮╮ <br />
　　　　　　　﹋﹌ &infin;╭⌒ヽ .. <br />
　　　冲啊﹋ ﹋﹌╰( 　　　(_Q <br />
　　　　吃饭啦﹋﹌﹋ 〆～〆〆</font><br />
</font></font></p>
          <br/>
          <span style="color:red;">
            <a href="http://coolyzg.javaeye.com/blog/45276#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 09 Jan 2007 18:00:00 +0800</pubDate>
        <link>http://coolyzg.javaeye.com/blog/45276</link>
        <guid>http://coolyzg.javaeye.com/blog/45276</guid>
      </item>
      <item>
        <title>junit使用简明手册[转载]- </title>
        <author>coolyzg</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://coolyzg.javaeye.com">coolyzg</a>&nbsp;
          链接：<a href="http://coolyzg.javaeye.com/blog/43189" style="color:red;">http://coolyzg.javaeye.com/blog/43189</a>&nbsp;
          发表时间: 2007年01月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在使用XP进行开发的过程，unit test是必不可少的环节。作为unit test，junit是首选的工具。本文从使用目的、如何使用、以及使用中需要考虑的问题，简略描述了junit的基本用法。<span>
<div></div>
<div style="MARGIN: 13pt 0cm"><strong><font size="5"><font size="3">使用目的</font></font></strong></div>
<p><font size="3"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; junit</span>是java中书写unit test的framework，目前一些流行的unit test工具大都都是在junit上扩展而来的。目前它的版本是junit3.8.1，可以从<a href="http://www.junit.org/">www.junit.org</a>上下载。<span> </span></font></p>
<div></div>
<div style="MARGIN: 13pt 0cm"><strong><font size="5"><font size="3">用法</font></font></strong></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt"><font size="3"><span>1.<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>基本使用步骤，Junit的使用非常简单，它的基本使用步骤：</font></div>
<div style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt"><font size="3"><span>-<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong>创建</strong>，从<span style="COLOR: blue">junit.framework.TestCase</span>派生unit test需要的test case</font></div>
<div style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt"><font size="3"><span>-<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong>书写测试方法</strong>，提供类似于如下函数签名的测试方法：</font></div>
<p style="MARGIN: 0cm 0cm 0pt 39pt"><span style="COLOR: blue"><font size="+0"><font size="3">public void testXXXXX(); </font></font></span></p>
<div></div>
<div style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt"><font size="3"><span>-<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong>编译</strong>，书写完test case后，编译所写的test case类</font></div>
<div style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt"><font size="3"><span>-<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong>运行</strong>，启动junit test runner，来运行这个test case。</font></div>
<div style="MARGIN: 0cm 0cm 0pt 21pt; TEXT-INDENT: 18pt"><font size="3">Junit提供了2个基本的test runner：字符界面和图形界面。启动命令分别如下：</font></div>
<div style="MARGIN: 0cm 0cm 0pt 39pt"><font size="3">a 图形界面：</font></div>
<p style="MARGIN: 0cm 0cm 0pt 60pt; TEXT-INDENT: 3pt"><span style="COLOR: blue"><font size="+0"><font size="3">java junit.swingui.TestRunner XXXXX </font></font></span></p>
<div></div>
<div style="MARGIN: 0cm 0cm 0pt 39pt"><font size="3">b 字符界面：</font></div>
<div style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: 21pt"><span style="COLOR: blue"><font size="3">java junit.textui.TestRunner XXXXX</font></span></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt"><font size="3"><span>2.<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>使用例子：</font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt"><font size="3">import junit.frmework.TestCase;</font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt"><font size="3">public class TestSample extends TestCaset{</font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt"><font size="3"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void testMethod1(){</span></font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt"><font size="3"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; assertTrue( true);</span></font></div>
<div style="MARGIN: 0cm 0cm 0pt 42pt"><font size="3">}</font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt"><font size="3">}</font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt"><font size="3"><span>3.<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="COLOR: blue">setUp</span>与<span style="COLOR: blue">tearDown</span>，这两个函数是junit framework中提供<strong>初始化和反初始化</strong>每个测试方法的。setUp在每个测试方法调用前被调用，负责初始化测试方法所需要的测试环境；tearDown在每个测试方法被调用之后被调用，负责撤销测试环境。它们与测试方法的关系可以描述如下：</font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt">&nbsp;</div>
<div style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt"><font size="3">&nbsp;&nbsp;&nbsp;&nbsp; 测试开始 -&gt; setUp -&gt; testXXXX -&gt; tearDown -&gt;测试结束</font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt">&nbsp;</div>
<div align="center"><shapetype o:spt="75" coordsize="21600,21600" filled="f" stroked="f" id="_x0000_t75" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t"></shapetype><stroke joinstyle="miter"></stroke>
<formulas>
</formulas>
<f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f>
<path o:extrusionok="f" o:connecttype="rect" gradientshapeok="t"></path>
<lock v:ext="edit" aspectratio="t"></lock></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt"><font size="3"><span>4.<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>使用例子：</font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt"><font size="3">import junit.frmework.TestCase;</font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt"><font size="3">public class TestSample extends TestCaset{</font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt"><font size="3"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protected void setUp(){</span></font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt"><font size="3"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //</span>初始化&hellip;&hellip;</font></div>
<div style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: 3pt"><font size="3">}</font></div>
<p style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: 3pt"><span></span>
<div style="MARGIN: 0cm 0cm 0pt 18pt"><font size="3"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void testMethod1(){</span></font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt"><font size="3"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; assertTrue( true);</span></font></div>
<div style="MARGIN: 0cm 0cm 0pt 42pt"><font size="3">}</font></div>
<p style="MARGIN: 0cm 0cm 0pt 42pt"><span></span>
<div style="MARGIN: 0cm 0cm 0pt 42pt"><font size="3">potected void tearDown(){</font></div>
<div style="MARGIN: 0cm 0cm 0pt 42pt"><font size="3"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //</span>撤销初始化&hellip;&hellip;</font></div>
<div style="MARGIN: 0cm 0cm 0pt 42pt"><font size="3">}</font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt"><font size="3">}</font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt"><font size="3"><span>5.<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>区分fail、exception。</font></div>
<div style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt"><font size="3"><span>-<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>fail，期望出现的错误。产生原因：assert函数出错（如assertFalse(true)）；fail函数产生（如fail(&hellip;&hellip;)）。</font></div>
<div style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt"><font size="3"><span>-<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>exception，不期望出现的错误，属于unit test程序运行时抛出的异常。它和普通代码运行过程中抛出的runtime异常属于一种类型。</font></div>
<div style="MARGIN: 0cm 0cm 0pt 21pt"><font size="3">对于assert、fail等函数请参见junit的javadoc。</font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt"><font size="3"><span>6.<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>使用例子：</font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt"><font size="3">import junit.frmework.TestCase;</font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt"><font size="3">public class TestSample extends TestCaset{</font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt"><font size="3"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protected void setUp(){</span></font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt"><font size="3"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //</span>初始化&hellip;&hellip;</font></div>
<div style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: 3pt"><font size="3">}</font></div>
<p style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: 3pt"><span></span>
<div style="MARGIN: 0cm 0cm 0pt 18pt"><font size="3"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void testMethod1(){</span></font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt"><font size="3"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &hellip;&hellip;</span></font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt"><font size="3"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try{</span></font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt"><font size="3"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; boolean b= &hellip;&hellip;</span></font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt"><font size="3"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; assertTrue( b);</span></font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt"><font size="3"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; throw new Exception( &ldquo;This is a test.&rdquo;);</span></font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt"><font size="3"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fail( &ldquo;Unable point.&rdquo;);&nbsp;&nbsp;&nbsp;&nbsp; //</span>不可能到达</font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt"><font size="3"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }catch(Exception e){</span></font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt"><font size="3"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fail( &ldquo;Yes, I catch u&rdquo;); //</span>应该到达点</font></div>
<div style="MARGIN: 0cm 0cm 0pt 60pt; TEXT-INDENT: 3pt"><font size="3">}</font></div>
<div style="MARGIN: 0cm 0cm 0pt 60pt; TEXT-INDENT: 3pt"><font size="3">&hellip;&hellip;</font></div>
<div style="MARGIN: 0cm 0cm 0pt 42pt"><font size="3">}</font></div>
<p style="MARGIN: 0cm 0cm 0pt 42pt"><span></span>
<div style="MARGIN: 0cm 0cm 0pt 42pt"><font size="3">potected void tearDown(){</font></div>
<div style="MARGIN: 0cm 0cm 0pt 42pt"><font size="3"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //</span>撤销初始化&hellip;&hellip;</font></div>
<div style="MARGIN: 0cm 0cm 0pt 42pt"><font size="3">}</font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt"><font size="3">}</font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt"><font size="3"><span>7.<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>组装<span style="COLOR: blue">TestSuite</span>，运行更多的test。在junit中，Test、TestCase和TestSuite</font><font size="3">三者组成了composiste pattern。通过组装自己的TestSuite，可以完成对添加到这个TestSuite中的所有的TestCase的调用。而且这些定义的TestSuite还可以组装成更大的TestSuite，这样同时也方便了对于不断增加的TestCase的管理和维护。</font></div>
<div><font size="3"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>它的另一个好处就是，可以从这个TestCase树的任意一个节点（TestSuite或TestCase）开始调用，来完成这个节点以下的所有TestCase的调用。提高了unit test的灵活性。</font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt"><font size="3"><span>8.<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>使用例子：</font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt"><font size="3">import junit.framework.Test;</font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt"><font size="3">import junit.framework.TestSuite;</font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt"><font size="3">public class TestAll{</font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt"><font size="3">public class TestAll{</font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt"><font size="3"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //</span>定义一个suite，对于junit的作用可以视为类似于java应用程序的main。</font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt"><font size="3"><span>&nbsp;&nbsp;&nbsp; public static Test <span style="COLOR: blue">suite</span>(){</span></font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt"><font size="3"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TestSuite suite = new TestSuite(&quot;Running all tests.&quot;);</span></font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt"><font size="3"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; suite.addTestSuite( TestCase1.class);</span></font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt"><font size="3"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; suite.addTestSuite( TestCase2.class);</span></font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt"><font size="3"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return suite;</span></font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt"><font size="3"><span>&nbsp;&nbsp;&nbsp; }</span></font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt"><font size="3">}</font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt"><font size="3">运行同运行单独的一个TestCase是一样的，参见step 1 &ldquo;运行&rdquo;。</font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt"><font size="3"><span>9.<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>使用Ant junit task。我们除了使用java来直接运行junit之外，我们还可以使用junit提供的junit task与ant结合来运行。涉及的几个主要的ant task如下：</font></div>
<div style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt"><font size="3"><span>-<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>&lt;junit&gt;，定义一个junit task</font></div>
<div style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt"><font size="3"><span>-<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>&lt;batchtest&gt;，位于&lt;junit&gt;中，运行多个TestCase</font></div>
<div style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt"><font size="3"><span>-<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>&lt;test&gt;，位于&lt;junit&gt;中，运行单个TestCase</font></div>
<div style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt"><font size="3"><span>-<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>&lt;formatter&gt;，位于&lt;junit&gt;中，定义一个测试结果输出格式</font></div>
<div style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt"><font size="3"><span>-<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>&lt;junitreport&gt;，定义一个junitreport task</font></div>
<div style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt"><font size="3"><span>-<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>&lt;report&gt;，位于&lt;junitreport&gt;中，输出一个junit report</font></div>
<div style="MARGIN: 0cm 0cm 0pt 21pt"><font size="3">具体的语法请参见相关文档。</font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt"><font size="3"><span>10.<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp; </span></span>使用例子：</font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt"><font size="3">&lt;junit printsummary=&quot;yes&quot; haltonfailure=&quot;no&quot;&gt;</font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt"><font size="3"><span>&nbsp;&nbsp;&nbsp; &lt;classpath&gt;</span></font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt"><font size="3"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;path refid=&quot;classpath&quot;/&gt;</span></font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt"><font size="3"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;pathelement location=&quot;${dist.junit}&quot;/&gt;</span></font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt"><font size="3"><span>&nbsp;&nbsp;&nbsp; &lt;/classpath&gt;</span></font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt"><span><font size="3">&nbsp;&nbsp;&nbsp; </font></span></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt"><font size="3"><span>&nbsp;&nbsp;&nbsp; &lt;formatter type=&quot;brief&quot; usefile=&quot;false&quot;/&gt;</span></font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt"><font size="3"><span>&nbsp;&nbsp;&nbsp; &lt;formatter type=&quot;xml&quot;/&gt;</span></font></div>
<p style="MARGIN: 0cm 0cm 0pt 18pt"><span></span>
<div style="MARGIN: 0cm 0cm 0pt 18pt"><font size="3"><span>&nbsp;&nbsp;&nbsp; &lt;batchtest todir=&quot;${doc.junitReport}&quot;&gt;</span></font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt"><font size="3"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;fileset dir=&quot;${dist.junit}&quot; includes=&quot;**/*Test.class&quot; /&gt;</span></font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt"><font size="3"><span>&nbsp;&nbsp;&nbsp; &lt;/batchtest&gt;</span></font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt"><font size="3">&lt;/junit&gt;</font></div>
<p style="MARGIN: 0cm 0cm 0pt 18pt"><span></span>
<div style="MARGIN: 0cm 0cm 0pt 18pt"><font size="3">&lt;junitreport todir=&quot;${doc.junitReport}&quot;&gt;</font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt"><font size="3"><span>&nbsp;&nbsp;&nbsp; &lt;fileset dir=&quot;${doc.junitReport}&quot;&gt;</span></font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt"><font size="3"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;include name=&quot;TEST*-*.xml&quot;/&gt;</span></font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt"><font size="3"><span>&nbsp;&nbsp;&nbsp; &lt;/fileset&gt;</span></font></div>
<div style="MARGIN: 0cm 0cm 0pt 18pt"><font size="3"><span>&nbsp;&nbsp;&nbsp; &lt;report format=&quot;frames&quot; styledir=&quot;${junit.styleDir}&quot; todir=&quot;${doc.junitReport}&quot;/&gt;</span></font></div>
<p style="MARGIN: 0cm 0cm 0pt 18pt"><span><font size="+0"><font size="3">&lt;/junitreport&gt; </font></font></span></p>
<div></div>
<div style="MARGIN: 13pt 0cm"><strong><font size="5"><font size="3">检查表</font></font></strong></div>
<div><font size="3"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; junit</span>的使用并不很难，然而要书写一个好的TestCase却并非易事。一个不好的TestCase往往是既浪费了时间，也起不了实际的作用。相反，一个好的TestCase，不仅可以很好的指出代码中存在的问题，而且也可以作为代码更准确的文档，同时还在持续集成的过程中起非常重要的作用。在此给出书写TestCase时需要注意的几点：</font></div>
<div style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt"><font size="3"><span>-<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong>测试的独立性</strong>：一次只测试一个对象，方便定位出错的位置。这有2层意思：一个TestCase，只测试一个对象；一个TestMethod，只测试这个对象中的一个方法。</font></div>
<div style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt"><font size="3"><span>-<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong>给测试方法一个合适的名字</strong>。</font></div>
<div style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt"><font size="3"><span>-<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong>在assert</strong><strong>函数中给出失败的原因</strong>，如：assertTrue( &ldquo;&hellip; should be true&rdquo;,&nbsp;&hellip;&hellip;)，方便查错。在这个例子中，如果无法通过assertTrue，那么给出的消息将被显示。在junit中每个assert函数都有第一个参数是<span style="COLOR: blue">出错时显示消息的函数原型。</span></font></div>
<div style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt"><font size="3"><span>-<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><strong>测试所有可能引起失败的地方</strong>，如：一个类中频繁改动的函数。对于那些仅仅只含有getter/setter的类，如果是由<span style="COLOR: blue">IDE</span>（如Eclipse）产生的，则可不测；如果是<span style="COLOR: blue">人工写，那么最好测试一下。</span></font></div>
<div style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt"><font size="3"><span>-<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>在setUp和tearDown中的代码不应该是与测试方法相关的，而应该是<strong>全局相关</strong>的。如针对与测试方法A和B，在setUp和tearDown中的代码应该是A和B都需要的代码。</font></div>
<div style="MARGIN: 0cm 0cm 0pt 39pt; TEXT-INDENT: -18pt"><font size="3"><span>-<span style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span>测试代码的组织：<strong>相同的包，不同的目录</strong>。这样，测试代码可以访问被测试类的protected变量/方法，方便测试代码的编写。放在不同的目录，则方便了测试代码的管理以及代码的打包和发布。一个例子如下：</font></div>
<div style="MARGIN: 0cm 0cm 0pt 63pt"><font size="3">src<span>&nbsp;&nbsp; &lt;=</span>源代码根目录</font></div>
<div style="MARGIN: 0cm 0cm 0pt 63pt"><font size="3">&nbsp;|---com</font></div>
<div style="MARGIN: 0cm 0cm 0pt 63pt"><font size="3"><span>&nbsp;&nbsp;&nbsp;&nbsp; |---mod1</span></font></div>
<div style="MARGIN: 0cm 0cm 0pt 63pt"><font size="3"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---class1</span></font></div>
<div style="MARGIN: 0cm 0cm 0pt 63pt"><font size="3">junit<span>&nbsp;&nbsp; &lt;=</span>测试代码根目录</font></div>
<div style="MARGIN: 0cm 0cm 0pt 63pt"><font size="3">&nbsp;|---com</font></div>
<div style="MARGIN: 0cm 0cm 0pt 63pt"><font size="3"><span>&nbsp;&nbsp;&nbsp;&nbsp; |---mod1</span></font></div>
<p style="MARGIN: 0cm 0cm 0pt 63pt"><font size="+0"><font size="3"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |---class1 </span></font></font></p>
<div></div>
</p>
<div><font size="3">&nbsp;</font></div>
</p>
<div><font size="3">&nbsp;</font></div>
</p>
<div><font size="3">&nbsp;</font></div>
</p>
<div><font size="3">&nbsp;</font></div>
</p>
<div><font size="3">&nbsp;</font></div>
</p>
<div><font size="3">&nbsp;</font></div>
</span>
          <br/>
          <span style="color:red;">
            <a href="http://coolyzg.javaeye.com/blog/43189#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 05 Jan 2007 11:17:46 +0800</pubDate>
        <link>http://coolyzg.javaeye.com/blog/43189</link>
        <guid>http://coolyzg.javaeye.com/blog/43189</guid>
      </item>
      <item>
        <title>JDK 在 Linux 安装</title>
        <author>coolyzg</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://coolyzg.javaeye.com">coolyzg</a>&nbsp;
          链接：<a href="http://coolyzg.javaeye.com/blog/42982" style="color:red;">http://coolyzg.javaeye.com/blog/42982</a>&nbsp;
          发表时间: 2007年01月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <table width="100%">
    <tbody>
        <tr>
            <td>
            <p>Sun发布的JDK/JRE有两种版本，一种是.rpm.bin格式的，另一种则是.bin格式的，前者我没有试，但是我想应该是适合于rpm的，可能会安装到/usr里面去，而且自动化程度可以高一些。后者则完全是绿色软件，只是做一个解压的动作。下面我就来讲后者的安装全攻略。</p>
            <p>1、首先我们要到Sun的网站上去下载JDK/JRE（点这里进入），最新的正式版本已经是6.0（也就是1.6），当然老的版本Sun也仍然提供下载，点上面的&ldquo;Previous Releases&rdquo;就可以找到了。下载.bin文件，下面假设这个文件的名字是jdk1.x.bin。</p>
            <p>2、把安装文件解压出来。假设我们下载的文件保存在/opt下。</p>
            <p>打开终端，运行以下命令： <br />
            引用: <br />
            cd /opt <br />
            chmod a+x jdk1.x.bin <br />
            ./jdk1.x.bin</p>
            <p>你会看到版权提示，不管它，按空格键翻页。然后会提示你是否同意版权协议[yes/no]，此时输入yes，回车，安装程序就会把文件解压到当前目录下的jdk1.x这样的目录下面（JRE应该大体相同）。</p>
            <p>3、让JDK/JRE支持中文。由于默认安装的JDK/JRE不带中文字体，不支持中文显示，所以我们要自行修改某些字体相关的配置，让它们支持中文。</p>
            <p>设定字体有两种方法：</p>
            <p>第一种方法是把你的中文字体目录做个连接到jdk/jre/lib/fonts里面，这种方法很简便。看命令： <br />
            引用: <br />
            cd /opt/jdk1.x/jre/lib/fonts <br />
            ln -s /usr/share/fonts/truetype/windows fallback （假设我们的中文字体放在/usr/share/fonts/truetype/windows目录里，这个目录里我放的是从Windows那边copy过来的字体）</p>
            <p>为什么要做fallback这个连接，我也是从网上看到的，我想应该是Sun做的设定吧，设定JDK/JRE在运行时会到这个目录里去找那些非西方字体。这种方法对JDK/JRE 1.4/1.5/1.6都适用，但是由于没有在fontconfig.properties文件里面详细设定字体，所以这种方法显示出来的字体很难看。</p>
            <p>第二种方法是把配置好的fontconfig.properties做个连接到jdk1.x/jre/lib里面。看命令： <br />
            引用: <br />
            cd /opt/jdk1.x/jre/lib <br />
            ln -s /etc/java/fontconfig.properties （假设我们的fontconfig.properties放在/etc/java目录里）</p>
            <p>这种方法对JDK/JRE 1.4/1.5/1.6都适用，只不过1.4版本的文件名是font.properties而不是fontconfig.properties。当然你也可以直接把fontconfig.properties文件复制到/opt/jdk1.x/jre/lib里面，这样就不用做连接，但是如果你同时安装几个不同版本的JDK，还是做连接比较方便。在下面我会把我配置好的font.properties和fontconfig.properties的内容贴出来，大家稍作修改就可以用了。</p>
            <p>3、让Web浏览器支持Java插件（也就是支持Java Applets）。</p>
            <p>做一个连接就可以了。看命令： <br />
            引用: <br />
            cd /usr/lib/firefox/plugins （Ubuntu的firefox插件目录在这里，其它版本以此参考） <br />
            ln -s /opt/jdk1.x/jre/plugin/i386/ns7/libjavaplugin_oji.so</p>
            <p>然后运行firefox，在地址栏里打入about:plugins，回车，可以看到firefox的插件列表里已经有了Java插件。</p>
            <p>如果你用的是其它的浏览器，方法大体也差不多，就是进入浏览器的plugins目录，做一个连接。不过要注意的是，如果你用的浏览器是 mozilla 1.4/netscape 7.0以上的版本，用上面的命令没问题，但是如果你用的浏览器是mozilla 1.2/netscape 7.0以下的版本，Sun有提供另一个插件。这样的话，命令就要改一下了： <br />
            引用: <br />
            cd /usr/lib/mozilla/plugins <br />
            ln -s /opt/jdk1.x/jre/plugin/i386/ns7-gcc29/libjavaplugin_oji.so</p>
            <p>4、让Web浏览器支持Java Web Start程序。（可选安装）</p>
            <p>如果你不知道Java Web Start程序是什么，看这里： <br />
            <a href="http://www.stcore.com/java/2006/06/18/1150640682d28890.html" target="blank">http://www.stcore.com/java/2006/06/18/1150640682d28890.html</a> </p>
            <p>所谓安装，其实就是添加一个mimetype（类似于文件关联），让浏览器知道，遇到Java Web Start程序该用什么程序来处理。</p>
            <p>对应mozilla/netscape浏览器的方法： <br />
            点击菜单：Edit-&gt;Preferences-&gt;Navigator-&gt;Helper Applications <br />
            然后新建一个mimetype： <br />
            mimetype是：application/x-java-jnlp-file <br />
            extention是：jnlp <br />
            关联程序是：/opt/jdk1.x/jre/bin/javaws</p>
            <p>对应firefox浏览器的方法： <br />
            由于firefox没有直接添加mimetype的方法，所以要改的话需要安装一个Mime Type Editor扩展，看这里： <br />
            <a href="http://forums.mozine.org/index.php?showtopic=5521" target="blank">http://forums.mozine.org/index.php?showtopic=5521</a> </p>
            <p>5、为firefox浏览器加入Java Console菜单项。（可选安装）</p>
            <p>mozilla/netscape装好java插件之后就有Java Console菜单项，可以方便地调用Java控制台，这对程序员调试程序有用。但是firefox还没有这个菜单项，添加的方法就是解压一个zip文件到firefox/extension目录。现在我们就来添加，看命令：</p>
            <p>引用: <br />
            cd /usr/lib/firefox/extensions <br />
            unzip /opt/jdk1.x/jre/lib/deploy/ffjcext.zip</p>
            <p>重启firefox，就可以看到工具菜单里多了一个Java Console菜单项。</p>
            <p>JDK/JRE 1.5及以下版本并没有提供这个firefox扩展，如果要安装的话到这里安装：</p>
            <p><a href="https://addons.mozilla.org/firefox/141/" target="blank">https://addons.mozilla.org/firefox/141/</a></p>
            <p>6、把Java工具加入系统菜单。（可选安装）</p>
            <p>Ubuntu自带的JDK/JRE会在系统菜单中添加两个Java工具，就是Java Plugin Control Panel和Java Policy Tool。下面我们也为自己安装的JDK/JRE添加两个菜单项。</p>
            <p>在Ubuntu的主菜单上点击右键-&gt;编辑菜单-&gt;首选项-&gt;新建项目：</p>
            <p>第一项： <br />
            图标是：/opt/jdk1.x/jre/plugin/desktop/sun_java.png <br />
            名称是：Java Plugin Control Panel （这个随便写） <br />
            命令是：/opt/jdk1.x/jre/bin/ControlPanel</p>
            <p>第二项： <br />
            图标是：/opt/jdk1.x/jre/plugin/desktop/sun_java.png <br />
            名称是：Java Policy Tool （这个随便写） <br />
            命令是：/opt/jdk1.x/jre/bin/policytool</p>
            <p>7、添加JAVA_HOME/JRE_HOME环境变量。（Java开发人员必备）</p>
            <p>这里以最常用的bash命令解释器为例，编辑用户目录下的.bashrc或.profile文件。如果你想在所有用户的shell下都生效，就编辑/etc/profile文件。同样都是加入以下内容：</p>
            <p>引用: <br />
            export JAVA_HOME=/opt/jdk1.x <br />
            export JRE_HOME=/opt/jdk1.x/jre <br />
            export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH <br />
            export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH</p>
            <p>至此，Sun JDK/JRE在Linux上的安装过程结束。</p>
            </td>
        </tr>
    </tbody>
</table>
<div class="topic_summary">
<table width="100%">
    <tbody>
        <tr>
            <td valign="bottom" width="90%">最后更新：2006-12-24 22:20<br />
            22:38&nbsp;&nbsp;|&nbsp;&nbsp; <a href="javascript:Element.toggle('link40448');">永久链接</a>&nbsp;&nbsp;|&nbsp;&nbsp; 浏览&nbsp;(264)&nbsp;&nbsp;|&nbsp;&nbsp; <a href="http://ubuntu.javaeye.com/blog/40448#comments">评论</a>&nbsp;(4)&nbsp;&nbsp;| &nbsp;&nbsp; <a href="http://ubuntu.javaeye.com/blog/40448#comment_from">添加评论</a>&nbsp;&nbsp;|&nbsp;&nbsp; <a href="http://ubuntu.javaeye.com/admin/favorite/191897">收藏</a>&nbsp;&nbsp;|&nbsp;&nbsp; <a href="http://ubuntu.javaeye.com/category/30555?category=7951">Linux</a>&nbsp;&nbsp;|&nbsp;&nbsp; 发布在 <a href="http://ubuntu.javaeye.com/">Ubuntu For Fun</a> 圈子 <span style="COLOR: #006699"></span></td>
            <td width="10%">&nbsp;</td>
        </tr>
    </tbody>
</table>
</div>
<div class="topic_link" id="link40448" style="DISPLAY: none">
<table border="0" align="center" width="90%">
    <tbody>
        <tr>
            <td height="30" align="left"><span class="date_show">永久链接</span></td>
        </tr>
        <tr>
            <td align="left"><a href="http://zhupan.javaeye.com/blog/40448">http://zhupan.javaeye.com/blog/40448</a> </td>
        </tr>
    </tbody>
</table>
</div>
<div><a name="comments"></a>
<div style="BORDER-TOP: gray 1px solid; MARGIN-TOP: 15px">
<div id="comment-list" style="MARGIN: 10px 20px 0px">
<div>
<table width="100%">
    <tbody>
        <tr valign="top">
            <td width="50%"><strong class="title">评论</strong> &nbsp;&nbsp;&nbsp;共 4 条 </td>
            <td align="right" width="50%"><a href="javascript:Field.focus('message');">发表评论</a> </td>
        </tr>
    </tbody>
</table>
</div>
<div style="MARGIN-TOP: 10px">
<div id="post_191911">
<div class="light_b" style="PADDING-RIGHT: 2px; MARGIN-TOP: 10px; PADDING-LEFT: 2px; PADDING-BOTTOM: 2px; PADDING-TOP: 2px"><a href="http://digitalsonic.javaeye.com/">DigitalSonic</a> &nbsp;&nbsp;&nbsp; 2006-12-23 23:15 </div>
<div style="MARGIN-TOP: 5px">
<table width="100%">
    <tbody>
        <tr>
            <td>
            <p>在debian其他的可以使用apt的linux系统下已经可以使用apt-get来安装jdk了，只是版本可能不是最新的。 <br />
            另外也能够用fakeroot和jpkg来自己做deb安装文件，在ubuntu这样的系统里安装就变的十分容易了</p>
            </td>
        </tr>
    </tbody>
</table>
</div>
</div>
<div id="post_192669">
<div class="light_b" style="PADDING-RIGHT: 2px; MARGIN-TOP: 10px; PADDING-LEFT: 2px; PADDING-BOTTOM: 2px; PADDING-TOP: 2px"><a href="http://sam1860.javaeye.com/">Sam1860</a> &nbsp;&nbsp;&nbsp; 2006-12-25 18:07 </div>
<div style="MARGIN-TOP: 5px">
<table width="100%">
    <tbody>
        <tr>
            <td>
            <p>好详细<img src="http://ubuntu.javaeye.com/images/forum/smiles/icon_smile.gif" alt="" /> </p>
            </td>
        </tr>
    </tbody>
</table>
</div>
</div>
<div id="post_193137">
<div class="light_b" style="PADDING-RIGHT: 2px; MARGIN-TOP: 10px; PADDING-LEFT: 2px; PADDING-BOTTOM: 2px; PADDING-TOP: 2px"><a href="http://lighter.javaeye.com/">lighter</a> &nbsp;&nbsp;&nbsp; 2006-12-26 15:42 </div>
<div style="MARGIN-TOP: 5px">
<table width="100%">
    <tbody>
        <tr>
            <td>
            <p>如果你用Ubuntu的话,很简单的事情 <br />
            只要几条指令就可以搞定----前提是要连接上网</p>
            </td>
        </tr>
    </tbody>
</table>
</div>
</div>
<div id="post_193260">
<div class="light_b" style="PADDING-RIGHT: 2px; MARGIN-TOP: 10px; PADDING-LEFT: 2px; PADDING-BOTTOM: 2px; PADDING-TOP: 2px"><a href="http://together.javaeye.com/">together</a> &nbsp;&nbsp;&nbsp; 2006-12-26 17:22 </div>
<div style="MARGIN-TOP: 5px">
<table width="100%">
    <tbody>
        <tr>
            <td>
            <p>&nbsp;</p>
            <div class="quote_title">引用</div>
            <div class="quote_div">3、让Web浏览器支持Java插件（也就是支持Java Applets）。 <br />
            cd /usr/lib/firefox/plugins （Ubuntu的firefox插件目录在这里，其它版本以此参考） <br />
            ln -s /opt/jdk1.x/jre/plugin/i386/ns7/libjavaplugin_oji.so</div>
            <br />
            我试过的情况是JDK必须是sun的1.5以上的。或者jrocket1.4.2以上。</td>
        </tr>
    </tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
          <br/>
          <span style="color:red;">
            <a href="http://coolyzg.javaeye.com/blog/42982#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 04 Jan 2007 12:43:08 +0800</pubDate>
        <link>http://coolyzg.javaeye.com/blog/42982</link>
        <guid>http://coolyzg.javaeye.com/blog/42982</guid>
      </item>
      <item>
        <title>警报响了!!</title>
        <author>coolyzg</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://coolyzg.javaeye.com">coolyzg</a>&nbsp;
          链接：<a href="http://coolyzg.javaeye.com/blog/38817" style="color:red;">http://coolyzg.javaeye.com/blog/38817</a>&nbsp;
          发表时间: 2006年12月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font face="Arial">今天是大屠杀纪念日，同胞们不能忘记历史的耻辱，要振奋啊~~</font></p>
<p><font face="Arial">偶现在就是坚决的抵制日货，看着南京大街上那么多的本田、丰田真是郁闷...<br />
ps：今天google.cn的图标变了 <img src="http://www.google.cn/logos/edvard_munch.gif" alt="" />是什么意思？</font></p>
          <br/>
          <span style="color:red;">
            <a href="http://coolyzg.javaeye.com/blog/38817#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 13 Dec 2006 10:24:07 +0800</pubDate>
        <link>http://coolyzg.javaeye.com/blog/38817</link>
        <guid>http://coolyzg.javaeye.com/blog/38817</guid>
      </item>
      <item>
        <title>Hibernate Validator 简介        </title>
        <author>coolyzg</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://coolyzg.javaeye.com">coolyzg</a>&nbsp;
          链接：<a href="http://coolyzg.javaeye.com/blog/37656" style="color:red;">http://coolyzg.javaeye.com/blog/37656</a>&nbsp;
          发表时间: 2006年12月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font color="#008000">在项目的业务属性中,你是不是要经常验证属性的取值范围呢. 想要了解比较优美的解决方案吗?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></p>
<p align="left"><font color="#008000">看看Hibernate Validator 是怎么做的吧.一见到她,相信你就会说: Oh God, 这就是我需要的.</font></p>
<p align="left"><span style="COLOR: red">任何获得Matrix授权的网站，转载请保留以下作者信息和链接：</span><br />
作者：icess(作者的blog:<a href="http://blog.matrix.org.cn/page/icess" target="_new">http://blog.matrix.org.cn/page/icess</a>)<br />
关键字：Hibernate Validator</p>
<p>用Annotations 给类或者类的属性加上约束(constraint),在运行期检查属性值是很优雅的.Hibernate Validator就是这样的一个框架.该框架是十分容易的(就像参考文档中宣称的那样),几乎没有什么学习曲线,Validator 是一个验证框架 不需要和Hibernate的其他部分绑定就可以使用,只要在你的项目中添加Hibernate-annotations.jar库就可以了.那么下面就让我们看看怎么使用吧.</p>
<p align="left"><code style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New', Courier"><font color="#3f7f5f">Person.java 类</font></code></p>
<p align="left"><code style="FONT-SIZE: 10pt; MARGIN: 0px; FONT-FAMILY: 'Courier New', Courier"><font color="#3f7f5f">/*</font><br />
<font color="#ffffff">&nbsp;</font><font color="#3f7f5f">*&nbsp;Created&nbsp;on&nbsp;2006-1-12 Person.java</font><br />
<font color="#ffffff">&nbsp;</font><font color="#3f7f5f">*&nbsp;@author&nbsp;</font><br />
<font color="#ffffff">&nbsp;</font><font color="#3f7f5f">*/</font><br />
<font color="#7f0055"><strong>package&nbsp;</strong></font><font color="#000000">test.annotation.validator;</font><br />
<br />
<font color="#7f0055"><strong>import&nbsp;</strong></font><font color="#000000">org.hibernate.validator.Length;</font><br />
<font color="#7f0055"><strong>import&nbsp;</strong></font><font color="#000000">org.hibernate.validator.Min;</font><br />
<font color="#7f0055"><strong>import&nbsp;</strong></font><font color="#000000">org.hibernate.validator.Valid;</font><br />
　</code></p>
<p align="left"><code><font size="2"><span style="FONT-FAMILY: 'Courier New', Courier">/<font color="#808000">/@Serializability&nbsp; //测试自定义约束</font></span></font></code><code style="FONT-SIZE: 10pt; MARGIN: 0px; FONT-FAMILY: 'Courier New', Courier"><br />
<font color="#7f0055"><strong>public&nbsp;class&nbsp;</strong></font><font color="#000000">Person&nbsp;{</font><br />
<br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><strong>private&nbsp;</strong></font><font color="#000000">String&nbsp;name;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><strong>private&nbsp;int&nbsp;</strong></font><font color="#000000">age;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><strong>private&nbsp;</strong></font><font color="#000000">Address&nbsp;address;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><strong>public&nbsp;</strong></font><font color="#000000">Person()&nbsp;{}</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#ff0000">@Valid //注意此处</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><strong>public&nbsp;</strong></font><font color="#000000">Address&nbsp;getAddress()&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><strong>return&nbsp;</strong></font><font color="#000000">address;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><strong>public&nbsp;void&nbsp;</strong></font><font color="#000000">setAddress(Address&nbsp;address)&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><strong>this</strong></font><font color="#000000">.address&nbsp;=&nbsp;address;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#000000">@Min(value&nbsp;=&nbsp;</font><font color="#990000">1</font><font color="#000000">)</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><strong>public&nbsp;int&nbsp;</strong></font><font color="#000000">getAge()&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><strong>return&nbsp;</strong></font><font color="#000000">age;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><strong>public&nbsp;void&nbsp;</strong></font><font color="#000000">setAge(</font><font color="#7f0055"><strong>int&nbsp;</strong></font><font color="#000000">age)&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><strong>this</strong></font><font color="#000000">.age&nbsp;=&nbsp;age;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#000000">@Length(min&nbsp;=&nbsp;</font><font color="#990000">4</font><font color="#000000">)</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><strong>public&nbsp;</strong></font><font color="#000000">String&nbsp;getName()&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><strong>return&nbsp;</strong></font><font color="#000000">name;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><strong>public&nbsp;void&nbsp;</strong></font><font color="#000000">setName(String&nbsp;name)&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><strong>this</strong></font><font color="#000000">.name&nbsp;=&nbsp;name;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#000000">}</font></code> </p>
<p align="left">　 </p>
<p align="left"><code style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New', Courier"><font color="#3f7f5f">Address.java 类</font></code></p>
<p align="left"><code style="FONT-SIZE: 10pt; MARGIN: 0px; FONT-FAMILY: 'Courier New', Courier"><font color="#3f7f5f">/*</font><br />
<font color="#ffffff">&nbsp;</font><font color="#3f7f5f">*&nbsp;Created&nbsp;on&nbsp;2006-1-12 Address.java</font><br />
<font color="#ffffff">&nbsp;</font><font color="#3f7f5f">*&nbsp;@author&nbsp;</font><br />
<font color="#ffffff">&nbsp;</font><font color="#3f7f5f">*/</font><br />
<font color="#7f0055"><strong>package&nbsp;</strong></font><font color="#000000">test.annotation.validator;</font><br />
<br />
<font color="#7f0055"><strong>import&nbsp;</strong></font><font color="#000000">org.hibernate.validator.Length;</font><br />
<font color="#7f0055"><strong>import&nbsp;</strong></font><font color="#000000">org.hibernate.validator.Max;</font><br />
<font color="#7f0055"><strong>import&nbsp;</strong></font><font color="#000000">org.hibernate.validator.Min;</font><br />
<br />
<font color="#7f0055"><strong>public&nbsp;class&nbsp;</strong></font><font color="#000000">Address&nbsp;{</font><br />
<br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><strong>private&nbsp;</strong></font><font color="#000000">String&nbsp;street;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><strong>private&nbsp;int&nbsp;</strong></font><font color="#000000">num;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><strong>public&nbsp;</strong></font><font color="#000000">Address()&nbsp;{}</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#000000">@Min(value&nbsp;=&nbsp;</font><font color="#990000">1</font><font color="#000000">)</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#000000">@Max(value&nbsp;=&nbsp;</font><font color="#990000">100</font><font color="#000000">)</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><strong>public&nbsp;int&nbsp;</strong></font><font color="#000000">getNum()&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><strong>return&nbsp;</strong></font><font color="#000000">num;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><strong>public&nbsp;void&nbsp;</strong></font><font color="#000000">setNum(</font><font color="#7f0055"><strong>int&nbsp;</strong></font><font color="#000000">num)&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><strong>this</strong></font><font color="#000000">.num&nbsp;=&nbsp;num;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#000000">@Length(min&nbsp;=&nbsp;</font><font color="#990000">3</font><font color="#000000">,max&nbsp;=&nbsp;</font><font color="#990000">8</font><font color="#000000">)</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><strong>public&nbsp;</strong></font><font color="#000000">String&nbsp;getStreet()&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><strong>return&nbsp;</strong></font><font color="#000000">street;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><strong>public&nbsp;void&nbsp;</strong></font><font color="#000000">setStreet(String&nbsp;street)&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><strong>this</strong></font><font color="#000000">.street&nbsp;=&nbsp;street;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#000000">}</font></code> </p>
<div class="java" align="left">
<p>上面是两个用 Validator Annotations 注释的 类. 每个属性都用 约束限制了.&nbsp; 下面看看测试的类吧:</p>
</div>
<p align="left"><!-- ======================================================== --><!-- = Java Sourcecode to HTML automatically converted code = --><!-- =   Java2Html Converter V4.1 2004 by Markus Gebhard  markus@jave.de   = --><!-- =     Further information: http://www.java2html.de     = --><font color="#000000"><code style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New', Courier">TestValidator.java 类</code></font></p>
<p align="left"><code style="FONT-SIZE: 10pt; MARGIN: 0px; FONT-FAMILY: 'Courier New', Courier"><font color="#3f7f5f">/*</font><br />
<font color="#ffffff">&nbsp;</font><font color="#3f7f5f">*&nbsp;Created&nbsp;on&nbsp;2006-1-12</font><br />
<font color="#ffffff">&nbsp;</font><font color="#3f7f5f">*&nbsp;@author&nbsp;icerain</font><br />
<font color="#ffffff">&nbsp;</font><font color="#3f7f5f">*/</font><br />
<font color="#7f0055"><strong>package&nbsp;</strong></font><font color="#000000">test.annotation.validator;</font><br />
<br />
<font color="#7f0055"><strong>import&nbsp;</strong></font><font color="#000000">org.hibernate.validator.ClassValidator;</font><br />
<font color="#7f0055"><strong>import&nbsp;</strong></font><font color="#000000">org.hibernate.validator.InvalidValue;</font><br />
<br />
<br />
<font color="#7f0055"><strong>public&nbsp;class&nbsp;</strong></font><font color="#000000">TestValidator&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><strong>public&nbsp;void&nbsp;</strong></font><font color="#000000">test()&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">Address&nbsp;add&nbsp;=&nbsp;</font><font color="#7f0055"><strong>new&nbsp;</strong></font><font color="#000000">Address();</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">add.setNum(</font><font color="#990000">0</font><font color="#000000">);</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">add.setStreet(</font><font color="#2a00ff">&quot;1&quot;</font><font color="#000000">);</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">Person&nbsp;p&nbsp;=&nbsp;</font><font color="#7f0055"><strong>new&nbsp;</strong></font><font color="#000000">Person();</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">p.setAddress(add);</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">p.setAge(</font><font color="#990000">0</font><font color="#000000">);</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">p.setName(</font><font color="#2a00ff">&quot;ice&quot;</font><font color="#000000">);</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#3f5fbf">/******************Test&nbsp;validator&nbsp;********/</font></code></p>
<p align="left"><code style="FONT-SIZE: 10pt; MARGIN: 0px; FONT-FAMILY: 'Courier New', Courier"><font color="#000000">&nbsp;&nbsp;&nbsp; </font><font color="#ff0000">// 注意该处只验证了Person 为了说明 @Valid 注释的使用</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">ClassValidator&lt;Person&gt;&nbsp;classValidator&nbsp;=&nbsp;</font><font color="#7f0055"><strong>new&nbsp;</strong></font><font color="#000000">ClassValidator&lt;Person&gt;&nbsp;(Person.</font><font color="#7f0055"><strong>class</strong></font><font color="#000000">);</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">InvalidValue[]&nbsp;validMessages&nbsp;=&nbsp;classValidator.getInvalidValues(p);</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><strong>for&nbsp;</strong></font><font color="#000000">(InvalidValue&nbsp;value&nbsp;:&nbsp;validMessages)&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">System.out.println(</font><font color="#2a00ff">&quot;InvalidValue&nbsp;的长度是:&quot;&nbsp;</font><font color="#000000">+&nbsp;validMessages.length</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">+</font><font color="#2a00ff">&quot;&nbsp;.&nbsp;验证消息是:&nbsp;&quot;&nbsp;</font><font color="#000000">+&nbsp;value.getMessage()&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">+&nbsp;</font><font color="#2a00ff">&quot;&nbsp;.&nbsp;PropertyPath&nbsp;是:&quot;&nbsp;</font><font color="#000000">+&nbsp;value.getPropertyPath()</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">+</font><font color="#2a00ff">&quot;&nbsp;.\n\t&nbsp;PropertyName&nbsp;是:&nbsp;&quot;&nbsp;</font><font color="#000000">+value.getPropertyName()</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">+&nbsp;</font><font color="#2a00ff">&quot;Value&nbsp;是:&nbsp;&quot;&nbsp;</font><font color="#000000">+&nbsp;value.getValue()</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">+</font><font color="#2a00ff">&quot;&nbsp;Bean&nbsp;是:&nbsp;&quot;</font><font color="#000000">+&nbsp;value.getBean()</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">+</font><font color="#2a00ff">&quot;\n\t&nbsp;BeanClass&nbsp;是:&quot;&nbsp;</font><font color="#000000">+&nbsp;value.getBeanClass());</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><strong>public&nbsp;static&nbsp;void&nbsp;</strong></font><font color="#000000">main(String[]&nbsp;args)&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><strong>new&nbsp;</strong></font><font color="#000000">TestValidator().test();</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#000000">}</font></code> </p>
<p align="left">　</p>
<p align="left">程序的输出如下 <font size="2"></font>
<p align="left"><code><span style="FONT-FAMILY: 'Courier New', Courier">可以看出 没有验证 Address.</span></code></p>
<p align="left"><code><span style="FONT-FAMILY: 'Courier New', Courier">当然了 ,你还可以只验证一个属性 , 没有必要验证整个类.只需要在调用</span><font face="Courier New, Courier">classValidator.getInvalidValues(p,&quot;age&quot;)方法时 加上你要验证的属性就可以了.如我们只想验证age 属性 把代码改为如下所示:</font></code></p>
<p align="left"><code><font color="#ff0000" face="Courier New, Courier">InvalidValue[] validMessages = classValidator.getInvalidValues(p,&quot;age&quot;); /</font><font color="#0000ff" face="Courier New, Courier">/只验证age 属性</font></code></p>
<p align="left"><code><span style="FONT-FAMILY: 'Courier New', Courier">运行结果如下:</span></code></p>
<p align="left"><font color="#ff00ff">InvalidValue 的长度是:1 . 验证消息是: 必须大于等于 1 . PropertyPath 是:age .</font></p>
<p align="left"><font color="#ff00ff">PropertyName 是: age. Value 是: 0 Bean 是: test.annotation.validator.Person@1457cb</font></p>
<p align="left"><font color="#ff00ff">BeanClass 是:class test.annotation.validator.Person</font></p>
<p align="left"><code><span style="FONT-FAMILY: 'Courier New', Courier">只是验证了 age 属性.</span></code></p>
<p align="left"><code><span style="FONT-FAMILY: 'Courier New', Courier">怎么样 ,很简单吧. 关于 Hibernate Validator 内建的验证Annotations 大家可以看看 API 或者 参考文档(中文版我正在翻译中 请访问我的 <a href="http://blog.matrix.org.cn/page/icess">Blog </a>获得最新信息).</span></code></p>
<p align="left"><code><span style="FONT-FAMILY: 'Courier New', Courier">如果你要写自己的约束呢 , 你不用担心 ,这也是很容易的. </span></code>任何约束有两部分组成: [约束描述符 即注释]the constraint <span class="emphasis"><em>descriptor</em></span> (the annotation) 和[约束validator 即 实现类] the constraint <span class="emphasis"><em>validator</em></span> (the implementation class).<code><span style="FONT-FAMILY: 'Courier New', Courier">下面我们扩展Hibernate Test suit 中的一个Test 来讲解一下.</span></code></p>
<font size="2">
<p align="left"><code><span style="FONT-FAMILY: 'Courier New', Courier">首先: 要声明一个</span></code>constraint <span class="emphasis"><em>descriptor .如下:</em></span></p>
<p align="left"><code style="FONT-SIZE: 10pt; MARGIN: 0px; FONT-FAMILY: 'Courier New', Courier"><font color="#7f0055"><strong>package&nbsp;</strong></font><font color="#000000">test.annotation.validator;</font><br />
<br />
<font color="#7f0055"><strong>import&nbsp;</strong></font><font color="#000000">java.lang.annotation.Documented;</font><br />
<font color="#7f0055"><strong>import&nbsp;static&nbsp;</strong></font><font color="#000000">java.lang.annotation.ElementType.TYPE;</font><br />
<font color="#7f0055"><strong>import&nbsp;static&nbsp;</strong></font><font color="#000000">java.lang.annotation.ElementType.FIELD;</font><br />
<font color="#7f0055"><strong>import&nbsp;static&nbsp;</strong></font><font color="#000000">java.lang.annotation.ElementType.METHOD;</font><br />
<font color="#7f0055"><strong>import&nbsp;</strong></font><font color="#000000">java.lang.annotation.Retention;</font><br />
<font color="#7f0055"><strong>import&nbsp;static&nbsp;</strong></font><font color="#000000">java.lang.annotation.RetentionPolicy.RUNTIME;</font><br />
<font color="#7f0055"><strong>import&nbsp;</strong></font><font color="#000000">java.lang.annotation.Target;</font><br />
<br />
<font color="#7f0055"><strong>import&nbsp;</strong></font><font color="#000000">org.hibernate.validator.ValidatorClass;</font><br />
<br />
<font color="#3f5fbf">/**</font><br />
<font color="#ffffff">&nbsp;</font><font color="#3f5fbf">*&nbsp;Dummy&nbsp;sample&nbsp;of&nbsp;a&nbsp;bean-level&nbsp;validation&nbsp;annotation</font><br />
<font color="#ffffff">&nbsp;</font><font color="#3f5fbf">*</font><br />
<font color="#ffffff">&nbsp;</font><font color="#3f5fbf">*&nbsp;</font><font color="#7f9fbf">@author&nbsp;</font><font color="#3f5fbf">Emmanuel&nbsp;Bernard</font><br />
<font color="#ffffff">&nbsp;</font><font color="#3f5fbf">*/</font><br />
<font color="#000000">@ValidatorClass(SerializabilityValidator.</font><font color="#7f0055"><strong>class</strong></font><font color="#000000">)</font><br />
<font color="#000000">@Target({METHOD,FIELD,TYPE})</font><br />
<font color="#000000">@Retention(RUNTIME)</font><br />
<font color="#000000">@Documented</font><br />
<font color="#7f0055"><strong>public&nbsp;</strong></font><font color="#000000">@interface&nbsp;Serializability&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><strong>int&nbsp;</strong></font><font color="#000000">num()&nbsp;</font><font color="#7f0055"><strong>default&nbsp;</strong></font><font color="#990000">11</font><font color="#000000">; </font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#000000">String&nbsp;message()&nbsp;</font><font color="#7f0055"><strong>default&nbsp;</strong></font><font color="#2a00ff">&quot;bean&nbsp;must&nbsp;be&nbsp;serialiable&quot;</font><font color="#000000">;</font><br />
<font color="#000000">}</font></code> </p>
</font>
<p align="left"><font size="2"><code style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New', Courier"><font color="#000000">@ValidatorClass(SerializabilityValidator.</font><font color="#7f0055"><strong>class</strong></font><font color="#000000">) 指出了 </font></code>constraint <span class="emphasis"><em>validator 类.</em></span></font> </p>
<p align="left"><font size="2"><code style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New', Courier"><font color="#000000">@Target({METHOD,FIELD,TYPE})</font><br />
<font color="#000000">@Retention(RUNTIME)</font><br />
<font color="#000000">@Documented&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </font></code></font></p>
<p align="left"><code style="FONT-FAMILY: 'Courier New', Courier"><font color="#000000">这几个我就不用解释了吧.</font></code> </p>
<p align="left"><code style="FONT-FAMILY: 'Courier New', Courier"><font color="#000000">Serializability&nbsp;里面声明了一个 message 显示约束的提示信息. num 只是为了说明一个方面 在这里面没有实际用途用 .</font></code> </p>
<p align="left"><code><span style="FONT-FAMILY: 'Courier New', Courier">然后就是 实现一个</span></code>constraint <em><span class="emphasis">validator 类 该类要实现</span></em><tt class="literal">Validator&lt;ConstraintAnnotation&gt;</tt><em><span class="emphasis">.这里是</span></em><font size="2"><code style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New', Courier"><font color="#000000">SerializabilityValidator.java 如下:</font></code></font> </p>
<p align="left"><code style="FONT-SIZE: 10pt; MARGIN: 0px; FONT-FAMILY: 'Courier New', Courier"><font color="#3f7f5f">//$Id:&nbsp;SerializabilityValidator.java,v&nbsp;1.3&nbsp;2005/11/17&nbsp;18:12:11&nbsp;epbernard&nbsp;Exp&nbsp;$</font><br />
<font color="#7f0055"><strong>package&nbsp;</strong></font><font color="#000000">test.annotation.validator;</font><br />
<br />
<font color="#7f0055"><strong>import&nbsp;</strong></font><font color="#000000">java.io.Serializable;</font><br />
<br />
<font color="#7f0055"><strong>import&nbsp;</strong></font><font color="#000000">org.hibernate.validator.Validator;</font><br />
<br />
<font color="#3f5fbf">/**</font><br />
<font color="#ffffff">&nbsp;</font><font color="#3f5fbf">*&nbsp;Sample&nbsp;of&nbsp;a&nbsp;bean-level&nbsp;validator</font><br />
<font color="#ffffff">&nbsp;</font><font color="#3f5fbf">*</font><br />
<font color="#ffffff">&nbsp;</font><font color="#3f5fbf">*&nbsp;</font><font color="#7f9fbf">@author&nbsp;</font><font color="#3f5fbf">Emmanuel&nbsp;Bernard</font><br />
<font color="#ffffff">&nbsp;</font><font color="#3f5fbf">*/</font><br />
<font color="#7f0055"><strong>public&nbsp;class&nbsp;</strong></font><font color="#000000">SerializabilityValidator&nbsp;</font><font color="#7f0055"><strong>implements&nbsp;</strong></font><font color="#000000">Validator&lt;Serializability&gt;,&nbsp;Serializable&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><strong>public&nbsp;boolean&nbsp;</strong></font><font color="#000000">isValid(Object&nbsp;value)&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;</font><font color="#00ff00">//这里只是Validator 里面的 实现验证规则的 方法. value 是要验证的值.</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">System.out.println(</font><font color="#2a00ff">&quot;IN&nbsp;SerializabilityValidator&nbsp;isValid:&quot;</font><font color="#000000">+value.getClass()+</font><font color="#2a00ff">&quot;:&nbsp;&quot;&nbsp;</font><font color="#000000">+value.toString()); </font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><strong>return&nbsp;</strong></font>value<font color="#3f7f5f">&nbsp;</font><font color="#800080">instanceof</font><font color="#3f7f5f">&nbsp;</font>Serializable<font color="#3f7f5f">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><strong>public&nbsp;void&nbsp;</strong></font><font color="#000000">initialize(Serializability&nbsp;parameters)&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#3f7f5f">//&nbsp;在这里可以 取得 </font></code><font size="2">constraint <em><span class="emphasis">descriptor 里面的属性 如上面我们声明的 num </span></em></font><code style="FONT-SIZE: 10pt; MARGIN: 0px; FONT-FAMILY: 'Courier New', Courier"><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">System.out.println(</font><font color="#2a00ff">&quot;IN&nbsp;SerializabilityValidator:&nbsp;parameters:&quot;</font><font color="#000000">+&nbsp;parameters.num()&nbsp;);</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#000000">}</font></code> </p>
<p align="left">然后在你的类中应用@<font size="2"><code style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New', Courier"><font color="#000000">Serializability&nbsp; 就可以约束一个类实现</font></code></font><code style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New', Courier">Serializable 接口了. 如下:</code> </p>
<p align="left">在我们的Person.java类 添加@<font size="2"><code style="FONT-SIZE: 10pt; FONT-FAMILY: 'Courier New'