﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-新手区</title><link>http://www.blogjava.net/beginner</link><description>专注于Java技术</description><language>zh-cn</language><lastBuildDate>Fri, 09 Jan 2009 02:34:02 GMT</lastBuildDate><pubDate>Fri, 09 Jan 2009 02:34:02 GMT</pubDate><ttl>60</ttl><item><title>从配置文件中获取数据库连接</title><link>http://www.blogjava.net/huamengxing/archive/2009/01/09/250629.html</link><dc:creator>华梦行</dc:creator><author>华梦行</author><pubDate>Fri, 09 Jan 2009 02:27:00 GMT</pubDate><guid>http://www.blogjava.net/huamengxing/archive/2009/01/09/250629.html</guid><wfw:comment>http://www.blogjava.net/huamengxing/comments/250629.html</wfw:comment><comments>http://www.blogjava.net/huamengxing/archive/2009/01/09/250629.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huamengxing/comments/commentRss/250629.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huamengxing/services/trackbacks/250629.html</trackback:ping><description><![CDATA[  ServletContext context = servlet.getServletContext();<br />      <br /> DataSource ds = (DataSource)context.getAttribute("dataSource");<br />从配置文件中获取数据库连接<br />       <img src ="http://www.blogjava.net/huamengxing/aggbug/250629.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huamengxing/" target="_blank">华梦行</a> 2009-01-09 10:27 <a href="http://www.blogjava.net/huamengxing/archive/2009/01/09/250629.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>哈哈！！</title><link>http://www.blogjava.net/Jeffry/archive/2009/01/09/250607.html</link><dc:creator>余鹏</dc:creator><author>余鹏</author><pubDate>Fri, 09 Jan 2009 02:04:00 GMT</pubDate><guid>http://www.blogjava.net/Jeffry/archive/2009/01/09/250607.html</guid><wfw:comment>http://www.blogjava.net/Jeffry/comments/250607.html</wfw:comment><comments>http://www.blogjava.net/Jeffry/archive/2009/01/09/250607.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Jeffry/comments/commentRss/250607.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Jeffry/services/trackbacks/250607.html</trackback:ping><description><![CDATA[<p>我的第一个博客！！！！！！！！！！！！！！！</p>
<img src ="http://www.blogjava.net/Jeffry/aggbug/250607.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Jeffry/" target="_blank">余鹏</a> 2009-01-09 10:04 <a href="http://www.blogjava.net/Jeffry/archive/2009/01/09/250607.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>org.apache.commons.lang.math学习笔记</title><link>http://www.blogjava.net/zhengzhili/archive/2009/01/08/250533.html</link><dc:creator>Brian</dc:creator><author>Brian</author><pubDate>Thu, 08 Jan 2009 11:43:00 GMT</pubDate><guid>http://www.blogjava.net/zhengzhili/archive/2009/01/08/250533.html</guid><wfw:comment>http://www.blogjava.net/zhengzhili/comments/250533.html</wfw:comment><comments>http://www.blogjava.net/zhengzhili/archive/2009/01/08/250533.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhengzhili/comments/commentRss/250533.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhengzhili/services/trackbacks/250533.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;在org.apache.commons.lang.math包中，一共有11个类。可以分成四组：<br />
&nbsp;&nbsp;&nbsp;&nbsp;1. 处理分数的Fraction类；<br />
&nbsp;&nbsp;&nbsp;&nbsp;2.处理数值的NumberUtils和IEEE754rUtils类，这里IEEE745r代表的是IEEE 754的标准，是一种浮点数的处理标准。<br />
&nbsp;&nbsp;&nbsp;&nbsp;3.处理随机数的JVMRandom和RandomUtils类。<br />
&nbsp;&nbsp;&nbsp;&nbsp;4.处理数值范围的Range, DoubleRange, FloatRange, IntRange, LangRange, NumberRange类。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;Fraction类能很方便地处理分数，并能进行分数的约分，加减乘除和指数运算以及求相对值。如：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_29_1164_Open_Image" onclick="this.style.display='none'; Codehighlighter1_29_1164_Open_Text.style.display='none'; Codehighlighter1_29_1164_Closed_Image.style.display='inline'; Codehighlighter1_29_1164_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_29_1164_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_29_1164_Closed_Text.style.display='none'; Codehighlighter1_29_1164_Open_Image.style.display='inline'; Codehighlighter1_29_1164_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;FractionDemo()&nbsp;</span><span id="Codehighlighter1_29_1164_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_29_1164_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Fraction&nbsp;fraction&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Fraction.getFraction(</span><span style="color: #000000">0.5</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(fraction.getNumerator());<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(fraction.getDenominator());<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fraction&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Fraction.getFraction(</span><span style="color: #000000">"</span><span style="color: #000000">1/2</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(fraction.doubleValue());<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fraction&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Fraction.getFraction(</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(fraction.doubleValue());<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fraction&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Fraction.getFraction(</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(fraction.doubleValue());<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fraction&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Fraction.getFraction(</span><span style="color: #000000">2</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">4</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(fraction.doubleValue());<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fraction&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Fraction.getReducedFraction(</span><span style="color: #000000">2</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">4</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(fraction.doubleValue());<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(Fraction.getFraction(</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">).abs());<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(Fraction.getFraction(</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">2</span><span style="color: #000000">).abs());<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(Fraction.getFraction(</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">).add(<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Fraction.getFraction(</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">)));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(Fraction.getFraction(</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">).subtract(<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Fraction.getFraction(</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">)));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(Fraction.getFraction(</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">).multiplyBy(<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Fraction.getFraction(</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">)));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(Fraction.getFraction(</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">).divideBy(<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Fraction.getFraction(</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">)));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(Fraction.getFraction(</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">2</span><span style="color: #000000">).pow(</span><span style="color: #000000">2</span><span style="color: #000000">));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
<br />
&nbsp;&nbsp;&nbsp;&nbsp;NumberUtils的功能相对来说就有点鸡肋了，他能通过createXXX(String str)创建各种类型的数值，即使你传入的参数是0X123这样代表16进制的数，它也能正确解析出来。同时它还具有获取数组最大最小数的功能。<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_38_364_Open_Image" onclick="this.style.display='none'; Codehighlighter1_38_364_Open_Text.style.display='none'; Codehighlighter1_38_364_Closed_Image.style.display='inline'; Codehighlighter1_38_364_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_38_364_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_38_364_Closed_Text.style.display='none'; Codehighlighter1_38_364_Open_Image.style.display='inline'; Codehighlighter1_38_364_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;NumberUtilsDemo()&nbsp;</span><span id="Codehighlighter1_38_364_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_38_364_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">Is&nbsp;0x3F&nbsp;a&nbsp;number?&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;NumberUtils.isNumber(</span><span style="color: #000000">"</span><span style="color: #000000">0x3F</span><span style="color: #000000">"</span><span style="color: #000000">));<br />
<img id="Codehighlighter1_134_160_Open_Image" onclick="this.style.display='none'; Codehighlighter1_134_160_Open_Text.style.display='none'; Codehighlighter1_134_160_Closed_Image.style.display='inline'; Codehighlighter1_134_160_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_134_160_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_134_160_Closed_Text.style.display='none'; Codehighlighter1_134_160_Open_Image.style.display='inline'; Codehighlighter1_134_160_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">double</span><span style="color: #000000">[]&nbsp;array&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_134_160_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_134_160_Open_Text"><span style="color: #000000">{&nbsp;</span><span style="color: #000000">1.0</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">3.4</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">0.8</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">7.1</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">4.6</span><span style="color: #000000">&nbsp;}</span></span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">double</span><span style="color: #000000">&nbsp;max&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;NumberUtils.max(array);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">double</span><span style="color: #000000">&nbsp;min&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;NumberUtils.min(array);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">Max&nbsp;of&nbsp;array&nbsp;is:&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;max);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">Min&nbsp;of&nbsp;array&nbsp;is:&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;min);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JVMRandom继承了java.util.Random类，其功能和Random差不多，只不过封装了返回不同数据类型的方法而已。而RandomUtils则把JVMRandom的方法静态化了。<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_41_183_Open_Image" onclick="this.style.display='none'; Codehighlighter1_41_183_Open_Text.style.display='none'; Codehighlighter1_41_183_Closed_Image.style.display='inline'; Codehighlighter1_41_183_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_41_183_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_41_183_Closed_Text.style.display='none'; Codehighlighter1_41_183_Open_Image.style.display='inline'; Codehighlighter1_41_183_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;RandomUtilsDemo()&nbsp;</span><span id="Codehighlighter1_41_183_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_41_183_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_79_147_Open_Image" onclick="this.style.display='none'; Codehighlighter1_79_147_Open_Text.style.display='none'; Codehighlighter1_79_147_Closed_Image.style.display='inline'; Codehighlighter1_79_147_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_79_147_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_79_147_Closed_Text.style.display='none'; Codehighlighter1_79_147_Open_Image.style.display='inline'; Codehighlighter1_79_147_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;i&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">5</span><span style="color: #000000">;&nbsp;i</span><span style="color: #000000">++</span><span style="color: #000000">)&nbsp;</span><span id="Codehighlighter1_79_147_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_79_147_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(RandomUtils.nextInt(</span><span style="color: #000000">100</span><span style="color: #000000">));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println();<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
<br />
&nbsp;&nbsp;&nbsp;&nbsp;Range是一个abstract类，主要处理数值范围的。DoubleRange, FloatRange, IntRange, LangRange和NumberRange都继承了Range类，它们差不多，只是处理的数据类型不同而已。所以看一个类的使用方法就等于看了所有类的使用方法。<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_32_485_Open_Image" onclick="this.style.display='none'; Codehighlighter1_32_485_Open_Text.style.display='none'; Codehighlighter1_32_485_Closed_Image.style.display='inline'; Codehighlighter1_32_485_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_32_485_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_32_485_Closed_Text.style.display='none'; Codehighlighter1_32_485_Open_Image.style.display='inline'; Codehighlighter1_32_485_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" /><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;NumberRangeDemo()&nbsp;</span><span id="Codehighlighter1_32_485_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_32_485_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Range&nbsp;normalScoreRange&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;DoubleRange(</span><span style="color: #000000">90</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">120</span><span style="color: #000000">);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">double</span><span style="color: #000000">&nbsp;score1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">102.5</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">double</span><span style="color: #000000">&nbsp;score2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">79.9</span><span style="color: #000000">;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">Normal&nbsp;score&nbsp;range&nbsp;is:&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;normalScoreRange);<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">Is&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;score1&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;a&nbsp;normal&nbsp;score?&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;normalScoreRange.containsDouble(score1));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">Is&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;score2&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;a&nbsp;normal&nbsp;score?&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;normalScoreRange.containsDouble(score2));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(normalScoreRange.overlapsRange(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;IntRange(</span><span style="color: #000000">92</span><span style="color: #000000">,</span><span style="color: #000000">119</span><span style="color: #000000">)));<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
<img src ="http://www.blogjava.net/zhengzhili/aggbug/250533.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhengzhili/" target="_blank">Brian</a> 2009-01-08 19:43 <a href="http://www.blogjava.net/zhengzhili/archive/2009/01/08/250533.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>springside mini-web学习总结。</title><link>http://www.blogjava.net/Supershen/archive/2009/01/08/250512.html</link><dc:creator>Super·shen BLOG  李禄燊 </dc:creator><author>Super·shen BLOG  李禄燊 </author><pubDate>Thu, 08 Jan 2009 09:01:00 GMT</pubDate><guid>http://www.blogjava.net/Supershen/archive/2009/01/08/250512.html</guid><wfw:comment>http://www.blogjava.net/Supershen/comments/250512.html</wfw:comment><comments>http://www.blogjava.net/Supershen/archive/2009/01/08/250512.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Supershen/comments/commentRss/250512.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Supershen/services/trackbacks/250512.html</trackback:ping><description><![CDATA[springside3背景struts2.1.2 spring2.5.6 Hibernate3.4GA<br />
<br />
<br />
<span style="font-family: 黑体"><strong>1.struts2 <br style="font-family: " />
</strong></span><br />
使用ZeroConfig + CodeBehind插件,实现约定大于配置的零配置文件风格.<br />
<br />
根本不用配置struts.xml文件 <br />
<br />
<br />
<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/supershen/s1.jpg" border="0" /><br />
<br />
这里就是action实现annotation&nbsp;&nbsp;CodeBehind。<br />
如方法<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/supershen/2s.jpg" border="0" /><br />
<br />
通过 /user/user!input.action访问， 并转到 /user/user-xxx.jsp页面<br />
即namespace + action name + "-" + "xxx.jsp"<br />
<br />
<br />
&nbsp;另外其中 action中需要注入的 service 使用annotation ，在set方法前 加入@request 或 @ autowired 或 @resource<br />
注释（具体是用那个暂时无法搞清楚，总之我用request 就不行，另外两个都可以）<br />
<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/supershen/222.jpg" border="0" /><br />
<br />
有了这个代码之后 就能注入spring 环境中的 id = userManager 的bean （我个人理解）<br />
<br />
而spring中&nbsp;&nbsp;id = userManager 的bean&nbsp; 也是通过自动注入完成的<br />
<br />
主要代码是 applicationContext.xml文件中的<br />
代码：<br />
<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/supershen/2222.jpg" border="0" /><br />
<br />
<br />
<span style="font-family: 黑体"><strong>2.spring<br />
</strong></span><br />
spring2.5.6的annotation特性用的比较泛滥。 新手刚开始看的一头雾水很正常。<br />
<br />
xml文件中配置自动注册bean，通过扫描包中的带注解的类。即这个代码：<br />
<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/supershen/2222.jpg" border="0" /><br />
<br />
<br />
扫描到下面的类，就自动注册成 id=userManager<br />
<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/supershen/223.jpg" border="0" /><br />
<br />
<br />
<br />
<span style="font-family: 黑体"><strong>3.hibernate <br />
</strong></span>使用hiberante3 注解，不要XML配置，实体类注解不用多说。<br />
<br />
需要注意的是entity类的扫描配置<br />
<br />
<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/supershen/33.jpg" border="0" /><br />
<br />
看清楚是扫描包，不是扫描类！ 所以实体类com.mylu.User是无法扫描到，要放在 com.mylu.xxx.User才能扫描到！<br />
<br />
<br />
<br />
<br />
下边按照ss3风格做的例子，去掉spring security 框架的， 结构更清晰。<br />
<br />
<a title="按照springside3风格做的例子 无安全框架的" href="/Files/Supershen/s2s2.rar">下载：实例代码</a><br />
<br />
<br />
附：<br />
类库<br />
<img alt="" src="http://www.blogjava.net/images/blogjava_net/supershen/211.jpg" border="0" /> 
<img src ="http://www.blogjava.net/Supershen/aggbug/250512.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Supershen/" target="_blank">Super·shen BLOG  李禄燊 </a> 2009-01-08 17:01 <a href="http://www.blogjava.net/Supershen/archive/2009/01/08/250512.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate 更新需要注意的事情</title><link>http://www.blogjava.net/huamengxing/archive/2009/01/08/250504.html</link><dc:creator>华梦行</dc:creator><author>华梦行</author><pubDate>Thu, 08 Jan 2009 08:11:00 GMT</pubDate><guid>http://www.blogjava.net/huamengxing/archive/2009/01/08/250504.html</guid><wfw:comment>http://www.blogjava.net/huamengxing/comments/250504.html</wfw:comment><comments>http://www.blogjava.net/huamengxing/archive/2009/01/08/250504.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huamengxing/comments/commentRss/250504.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huamengxing/services/trackbacks/250504.html</trackback:ping><description><![CDATA[Hibernate 更新需要注意的事情。知道他的id  Entity e=new Entity();<br />e.setId(2);<br />ado.update(e);就会执行<br /><br />update enp set id=? name=? passwd=?  <br />这样就会把不想更新的也更新掉了。<br />但是如果用<br />Entity e=new Entity();<br />e=dao.load(id);<br />ado.update(e);就不会执行Update 了，这样就可以只更新特定的列<br /><img src ="http://www.blogjava.net/huamengxing/aggbug/250504.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huamengxing/" target="_blank">华梦行</a> 2009-01-08 16:11 <a href="http://www.blogjava.net/huamengxing/archive/2009/01/08/250504.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>开始学习struts2(四)</title><link>http://www.blogjava.net/liuspring/archive/2009/01/08/250480.html</link><dc:creator>猪</dc:creator><author>猪</author><pubDate>Thu, 08 Jan 2009 05:30:00 GMT</pubDate><guid>http://www.blogjava.net/liuspring/archive/2009/01/08/250480.html</guid><wfw:comment>http://www.blogjava.net/liuspring/comments/250480.html</wfw:comment><comments>http://www.blogjava.net/liuspring/archive/2009/01/08/250480.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuspring/comments/commentRss/250480.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuspring/services/trackbacks/250480.html</trackback:ping><description><![CDATA[关于类型转换还有一种写法：
<div style="background-color: #f9f7ed;" id="codee_html">
<div style="font-family: &quot;Courier New&quot;,&quot;Lucida Console&quot;,&quot;monospace&quot;; background-color: #f9f7ed;" class="source"><span style="color: #000080; font-weight: bold;">public</span> <span style="color: #000080; font-weight: bold;">class</span> ConverterPoint <span style="color: #000080; font-weight: bold;">extends</span> StrutsTypeConverter {<br />
<br />
<span style="color: #008800; font-style: italic;">//&nbsp;&nbsp;&nbsp; @Override</span><br />
<span style="color: #008800; font-style: italic;">//&nbsp;&nbsp;&nbsp; public Object convertValue(Map context, Object value, Class toType) {</span><br />
<span style="color: #008800; font-style: italic;">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(Point.class == toType){</span><br />
<span style="color: #008800; font-style: italic;">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String[] params = (String[])value;</span><br />
<span style="color: #008800; font-style: italic;">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; params = params[0].split(",");</span><br />
<span style="color: #008800; font-style: italic;">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Point point = new Point();</span><br />
<span style="color: #008800; font-style: italic;">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; point.setX(Integer.parseInt(params[0]));</span><br />
<span style="color: #008800; font-style: italic;">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; point.setY(Integer.parseInt(params[1]));</span><br />
<span style="color: #008800; font-style: italic;">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return point;</span><br />
<span style="color: #008800; font-style: italic;">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><br />
<span style="color: #008800; font-style: italic;">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }else if(String.class == toType){</span><br />
<span style="color: #008800; font-style: italic;">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Point point = (Point)value;</span><br />
<span style="color: #008800; font-style: italic;">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return "x=" + point.getX() + ",y=" + point.getY();</span><br />
<span style="color: #008800; font-style: italic;">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span><br />
<span style="color: #008800; font-style: italic;">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return super.convertValue(context, value, toType);</span><br />
<span style="color: #008800; font-style: italic;">//&nbsp;&nbsp;&nbsp; }</span><br />
<br />
&nbsp;&nbsp;&nbsp; @Override<br />
&nbsp;&nbsp;&nbsp; <span style="color: #000080; font-weight: bold;">public</span> Object convertFromString(Map arg0, String[] arg1, Class arg2) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String[] params = arg1;<span style="color: #008800; font-style: italic;">//(String[])value;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; params = params[<span style="color: #0000ff;">0</span>].<span style="color: #ff0000;">split</span>(<span style="color: #0000ff;">","</span>);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Point point = <span style="color: #000080; font-weight: bold;">new</span> Point();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; point.<span style="color: #ff0000;">setX</span>(Integer.<span style="color: #ff0000;">parseInt</span>(params[<span style="color: #0000ff;">0</span>]));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; point.<span style="color: #ff0000;">setY</span>(Integer.<span style="color: #ff0000;">parseInt</span>(params[<span style="color: #0000ff;">1</span>]));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #000080; font-weight: bold;">return</span> point;<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; @Override<br />
&nbsp;&nbsp;&nbsp; <span style="color: #000080; font-weight: bold;">public</span> String convertToString(Map arg0, Object arg1) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Point point = (Point)arg1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #000080; font-weight: bold;">return</span> <span style="color: #0000ff;">"x="</span> + point.<span style="color: #ff0000;">getX</span>() + <span style="color: #0000ff;">",y="</span> + point.<span style="color: #ff0000;">getY</span>();<br />
&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp; <br />
}<br />
</div>
</div>
<br />
原来是继承ognl.DefaultTypeConverter类，现在改成继承org.apache.struts2.util.StrutsTypeConverter类了，看org.apache.struts2.util.StrutsTypeConverter的源码可知道org.apache.struts2.util.StrutsTypeConverter是个抽象类，并实现了ognl.TypeConverter，org.apache.struts2.util.StrutsTypeConverter中有两个要实现的方法一个convertFromString，一个convertToString，看方法名字就知道一个从字符串转换成Object，一个是将Object转换成String，这样好像更加清晰<br />
<br />
另外还有一种全局转换的配置，就是建立一个统一的属性文件，文件名为xwork-conversion.properties，与struts.xml位于统一目录下，里面的配置改成了<br />
com.test.struts2.data.Point=com.test.struts2.action.ConverterPoint<br />
意思是所有com.test.struts2.data.Point类型的对象都要通过com.test.struts2.action.ConverterPoint来转换<br />
<br />
<img src ="http://www.blogjava.net/liuspring/aggbug/250480.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuspring/" target="_blank">猪</a> 2009-01-08 13:30 <a href="http://www.blogjava.net/liuspring/archive/2009/01/08/250480.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>笔记三.  类和对象</title><link>http://www.blogjava.net/zhengzhili/archive/2009/01/07/250407.html</link><dc:creator>Brian</dc:creator><author>Brian</author><pubDate>Wed, 07 Jan 2009 13:01:00 GMT</pubDate><guid>http://www.blogjava.net/zhengzhili/archive/2009/01/07/250407.html</guid><wfw:comment>http://www.blogjava.net/zhengzhili/comments/250407.html</wfw:comment><comments>http://www.blogjava.net/zhengzhili/archive/2009/01/07/250407.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/zhengzhili/comments/commentRss/250407.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhengzhili/services/trackbacks/250407.html</trackback:ping><description><![CDATA[3.1 类的基本写法<br />
&nbsp;&nbsp;&nbsp;&nbsp;我们直接看代码，比较容易说明：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">&nbsp;1</span><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Animal<br />
</span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;attr_reader&nbsp;:color<br />
</span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;attr_writer&nbsp;:color<br />
</span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;initialize(color)<br />
</span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@color&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;color<br />
</span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;end<br />
</span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
</span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />end<br />
</span><span style="color: #008080">10</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
</span><span style="color: #008080">11</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />animal&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Animal.</span><span style="color: #0000ff">new</span><span style="color: #000000">(</span><span style="color: #000000">"</span><span style="color: #000000">red</span><span style="color: #000000">"</span><span style="color: #000000">)<br />
</span><span style="color: #008080">12</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />puts&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">The&nbsp;new&nbsp;animal&nbsp;is&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;animal.color<br />
</span><span style="color: #008080">13</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />animal.color&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">blue</span><span style="color: #000000">"</span><span style="color: #000000"><br />
</span><span style="color: #008080">14</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />puts&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">The&nbsp;new&nbsp;animal&nbsp;is&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;animal.color</span></div>
&nbsp;&nbsp;&nbsp;&nbsp;上述代码，有程序经验的人基本就能了解大概了。第一行class Aminal是申明了一个叫做Animal的类。这个类有一个initialize的方法，实际上这个方法就是一个构造器，11行代码中的new一个实例，实际上调用的就是initialize方法。请注意这个构造器有一个参数，根据实际情况，可以没有参数或者多个参数。在构造器中，也就是第6行，@color = color，@color叫做实例对象，一个实例就有一个这样的对象，用于保存实例数据。第2，3行建立了一个color的属性，这个属性可以访问@color实例对象，从代码解释来看，这个color对象可读可写，所以在代码12，13行分别对color属性进行了读写。实际上，对于可读可写的属性，只需要使用attr_accessor即可。故代码的第2，3行可合并成attr_accessor :color即可。<br />
<br />
3.2&nbsp; 类的继承<br />
&nbsp;&nbsp;&nbsp;&nbsp;Ruby中类的继承表示为&lt;，如下面的代码：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Animal<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;initialize(color)<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@color&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;color<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;end<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;get_color<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;@color<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;end<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />end<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Dog&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;Animal<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;initialize(color,&nbsp;sound)<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">super</span><span style="color: #000000">(color)<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@sound&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;sound<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;end<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;get_sound<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;@sound<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;end<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />end<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />dog&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Dog.</span><span style="color: #0000ff">new</span><span style="color: #000000">(</span><span style="color: #000000">"</span><span style="color: #000000">brown</span><span style="color: #000000">"</span><span style="color: #000000">,</span><span style="color: #000000">"</span><span style="color: #000000">Bark</span><span style="color: #000000">"</span><span style="color: #000000">)<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />puts&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">The&nbsp;new&nbsp;dog&nbsp;is&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;dog.get_color<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />puts&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">The&nbsp;new&nbsp;dog&nbsp;is&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;dog.get_sound</span></div>
<p>&nbsp;&nbsp;&nbsp;&nbsp;上述代码表示了Dog继承了Animal类，并在构造器中使用了Ruby内置的super方法。<br />
<br />
3.3 理解Ruby中的对象访问<br />
&nbsp;&nbsp;&nbsp;&nbsp;公共方法(publilc method)----可以在代码的任何地方调用这类方法。没有任何限制。也是Ruby默认的访问级别。<br />
&nbsp;&nbsp;&nbsp;&nbsp;受保护方法(protected method)----只能在定义这些方法的类的对象内部或是从这个类派生出来的类的对象内部调用这类的方法，也就是说只有&#8220;家族成员&#8221;才能访问。<br />
&nbsp;&nbsp;&nbsp;&nbsp;私有方法(private method)----只能在当前对象内部调用这类方法。这是所有方法中限制最严格的。</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">&nbsp;1</span><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Animal&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;initialize(color)<br />
</span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@color&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;color<br />
</span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;end<br />
</span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;get_color<br />
</span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;@color<br />
</span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;end<br />
</span><span style="color: #008080">10</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">11</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000"><br />
</span><span style="color: #008080">12</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;get_feet<br />
</span><span style="color: #008080">13</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;four<br />
</span><span style="color: #008080">14</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;end<br />
</span><span style="color: #008080">15</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">16</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;get_head<br />
</span><span style="color: #008080">17</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;one<br />
</span><span style="color: #008080">18</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;end<br />
</span><span style="color: #008080">19</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">20</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000"><br />
</span><span style="color: #008080">21</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;get_eyes<br />
</span><span style="color: #008080">22</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;two<br />
</span><span style="color: #008080">23</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;end<br />
</span><span style="color: #008080">24</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
</span><span style="color: #008080">25</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />end</span></div>
&nbsp;&nbsp;&nbsp;&nbsp;上述代码中，从第6行开始声明是public访问修饰符，说明从第6行一下都是public访问级别，直到碰到下一个访问修饰符，即第11行的protected。故可得知，get_feet和get_head方法是protected，而get_eyes则是private的。<br />
<br />
3.4 重写方法<br />
&nbsp;&nbsp;&nbsp;&nbsp;Ruby中也可重写方法，即派生类重新定义方法。如：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Animal<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;initialize(color)<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@color&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;color<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;end<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;get_color<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;@color<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;end<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />end<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Dog&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;Animal<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;initialize(color,&nbsp;sound)<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">super</span><span style="color: #000000">(color)<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@sound&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;sound<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;end<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;get_color<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">blue</span><span style="color: #000000">"</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;end<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />end</span></div>
<br />
3.5 创建类变量<br />
&nbsp;&nbsp;&nbsp;&nbsp;在变量名之前加@可以创建实例变量，加@@则就可以创建类变量。类的所有实例都共享一个类变量。通过下面代码可以学习什么是类变量：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; height: 301px; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Animal<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;@@number_animals&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;initialize(color)<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@color&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;color<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@@number_animals&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;end<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;get_number<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;@@number_animals<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;end<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />end<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />cat&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Animal.</span><span style="color: #0000ff">new</span><span style="color: #000000">(</span><span style="color: #000000">"</span><span style="color: #000000">red</span><span style="color: #000000">"</span><span style="color: #000000">)<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />puts&nbsp;cat.get_number<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />dog&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Animal.</span><span style="color: #0000ff">new</span><span style="color: #000000">(</span><span style="color: #000000">"</span><span style="color: #000000">blue</span><span style="color: #000000">"</span><span style="color: #000000">)<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />puts&nbsp;dog.get_number<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>
<br />
3.6 声明类方法<br />
&nbsp;&nbsp;&nbsp;&nbsp;声明类方法可以不用实例化类而直接访问类方法。类方法的声明只要类名+.+方法名即可。如：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Mathematics<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;Mathematics.add(operand_one,&nbsp;operand_two)<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;operand_one&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;operand_two<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;end<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />end<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />puts&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">1&nbsp;+&nbsp;2&nbsp;=&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;Mathematics.add(</span><span style="color: #000000">1</span><span style="color: #000000">,</span><span style="color: #000000">2</span><span style="color: #000000">).to_s</span></div>
<br />
3.7 创建模块<br />
&nbsp;&nbsp;&nbsp;&nbsp;当你使用大量类的时候，可能想将这些类分组成模块。这样就能方便使用大量的类。创建模块要使用module关键字。<br />
Mathematics.rb<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">module&nbsp;Mathematics<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;Mathematics.add(operand_one,&nbsp;operand_two)<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;operand_one&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;operand_two<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;end<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />end</span></div>
Sentence.rb<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">module&nbsp;Sentence<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;Sentence.add(operand_one,&nbsp;operand_two)<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;operand_one&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;operand_two<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;end<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />end</span></div>
usemodules.rb<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />include<span style="color: #000000">&nbsp;</span><span style="color: #000000">'</span><span style="color: #000000">Mathematics.rb</span><span style="color: #000000">'</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />include&nbsp;</span><span style="color: #000000">'</span><span style="color: #000000">Sentence.rb</span><span style="color: #000000">'</span><span style="color: #000000"><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />puts&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">2&nbsp;+&nbsp;3&nbsp;=&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;Mathematics.add(</span><span style="color: #000000">2</span><span style="color: #000000">,</span><span style="color: #000000">3</span><span style="color: #000000">).to_s</span></div>
&nbsp;&nbsp;&nbsp;&nbsp;上述示例中，Mathematics模块的add方法是两个数相加，Sentence模块的add方法是两个单词用单词连接。add方法看上去很像类方法，但实际和类不同，在Ruby中不能使用模块创建实例(也就是对象)。看usemodules的调用方法。<br />
&nbsp;&nbsp;&nbsp;&nbsp;除了使用include，还可使用require更简洁，如: require 'mathematics'。<br />
&nbsp;&nbsp;&nbsp;&nbsp;当然类也可以存储进模块中，如：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">module&nbsp;Mathematics<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Adder<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;Adder.add(operand_one,&nbsp;operand_two)<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;operand_one&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;operand_two<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;end<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />end<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />puts&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">2&nbsp;+&nbsp;3&nbsp;=&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;Mathematics::Adder.add(</span><span style="color: #000000">2</span><span style="color: #000000">,</span><span style="color: #000000">3</span><span style="color: #000000">).to_s<br />
<img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span></div>
&nbsp;&nbsp;&nbsp;&nbsp;注意，需要使用范围解析操作符(::)访问模块中的类方法。<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
3.8 创建混合插入<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">module&nbsp;Adder<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;add(operand_one,&nbsp;operand_two)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;operand_one&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;operand_two<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;end<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />end<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />module&nbsp;Subtracter<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;subtract(operand_one,&nbsp;operand_two)<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;operand_one&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;operand_two<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;end<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />end<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Calculator<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;include&nbsp;Adder<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;include&nbsp;Subtracter<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />end<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />calculator&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Calculator.</span><span style="color: #0000ff">new</span><span style="color: #000000">()<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />puts&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">2&nbsp;+&nbsp;3&nbsp;=&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;calculator.add(</span><span style="color: #000000">2</span><span style="color: #000000">,</span><span style="color: #000000">3</span><span style="color: #000000">).to_s<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span></div>
<img src ="http://www.blogjava.net/zhengzhili/aggbug/250407.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhengzhili/" target="_blank">Brian</a> 2009-01-07 21:01 <a href="http://www.blogjava.net/zhengzhili/archive/2009/01/07/250407.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>涉及JSP的经验</title><link>http://www.blogjava.net/xiaodi/archive/2009/01/07/250388.html</link><dc:creator>小弟</dc:creator><author>小弟</author><pubDate>Wed, 07 Jan 2009 09:53:00 GMT</pubDate><guid>http://www.blogjava.net/xiaodi/archive/2009/01/07/250388.html</guid><wfw:comment>http://www.blogjava.net/xiaodi/comments/250388.html</wfw:comment><comments>http://www.blogjava.net/xiaodi/archive/2009/01/07/250388.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/xiaodi/comments/commentRss/250388.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xiaodi/services/trackbacks/250388.html</trackback:ping><description><![CDATA[<p>学编程已经三四年了，但是一直都没有写过相关的文章。今天，终于憋出一篇来。一来作为总结，二来可以给师弟师妹作为参考。<br />
我读大一的时候，老师教会了我if,while,for,等关键词之后，我就开始自学了。大一的时候教的是C语言，从此之后，我迷上了C语言。因为C能实现我的想法。接下来我自学了java，jsp。当然，自学走了很多的弯路，直到现在我很后悔。~~~~（&gt;_&lt;)~~~~ 。交了学费不在老师那里学点东西的人的确很SB。<br />
我现在主要说说我学java的经验。学东西，要知道学来做什么吗？java干什么用呢？当然不是生孩子用的，也不是下酒菜。java有两个方向，一个是做网站，另外一个是做手机软件。你选择那个方向呢？<br />
我选择是做网站，虽然我一度鄙视做网站的（但我现在连鄙视的行业也进不去）。但选择了java，再选别的就没什么必要，我是这样想的，肉吃了一半就丢掉吗？多可惜。<br />
java是完全面向对象的语言，面向对象主要讲的是封装，继承，多态。但是老师对于这些至关重要的知识只用了一节课，我不想说，老师很SB，或者是她不知道如何使用这些特性。我现在告诉读者，这些特性会让你很爽。<br />
我记得，我学java的时候，我用swing组件做了一个同学录的软件。当时的心情是自豪的，现在看里是傻B呼呼。首先，swing已经是一门过时的技术，过时的东西是被历史淘汰了，我却当做宝贝。是多么的无知。<br />
我现在分析我那个软件。我当然写的同学录只有一个类。一个主类，类里再套类，看得我头昏脑胀，改一点就得改好多，然后调试的时候就出现好多错误。遇到这样的问题谁都头痛。为什么出现这样的情况。因为只有一个类呀，所有的东西都放在一个类里，不乱才怪。就像一个箩筐里什么都放，当然乱了。这个时候，我们应该用到封装来改变代码的质量。<br />
怎么做呢？<br />
首先，界面和业务逻辑分开。对于界面，很多人都知道，但是业务逻辑有可能不明白的，我比喻一下。比如，同学录。你想看我的同学录，你就得知道我的登陆密码，你输入密码的时候，代码会校验密码，校验密码就是一个业务逻辑。界面和业务逻辑分开有什么好处？起码，代码分工分明。这些类负责界面，那些类负责业务逻辑。分工分明是有好处的。避免大家手忙脚乱做错事，还有谁出错了就找谁算账就行。<br />
这样的话你的代码就得这样写了<br />
class 界面<br />
{<br />
}<br />
class 业务逻辑<br />
{<br />
}<br />
这样总比<br />
class 界面+业务逻辑<br />
{<br />
}<br />
好管理吧。<br />
这样的话，界面的一些按钮的位置改变了，对业务逻辑影响不大。这就是书上说的耦合度。</p>
<p>接着说业务逻辑。因为业务逻辑比较重要。<br />
业务逻辑这么写呢？我以前是这样写的，比如说，我想我的同学了，我想查一下她的电话然后call她。我很懒，不想翻电话部，我就用同学录软件查询我的同学录，那么软件就得有查询的功能。代码是这样的<br />
class select同学name<br />
{<br />
}<br />
删除<br />
class delete同学<br />
{<br />
}<br />
但是，想用我的同学录你得知道密码，你就输入密码。那么我的代码是<br />
class select密码<br />
{<br />
}<br />
这样写下去，我感觉很无头绪。这个时候就很适合用接口。什么是接口，我当时学java的时候，我也在想什么是接口，不就是一个interface吗？<br />
基本语法是这样的<br />
interface 接口名<br />
{<br />
&nbsp;抽象方法1;<br />
&nbsp;抽象方法2；<br />
}</p>
<p>当时我琢磨了很长时间，想不到interface怎么个好用？<br />
现在我明白了。<br />
你查询密码，查询同学的电话，或者是更新同学的电话。你就得查询数据库吧。对于数据的操作不就是select,delete,update吗？<br />
那么这样的话，我们可以这样写<br />
public interface DataBase<br />
{<br />
&nbsp;// 增加操作<br />
&nbsp;public void insert(name) throws Exception ;<br />
&nbsp;// 修改操作<br />
&nbsp;public void update(name) throws Exception ;<br />
&nbsp;// 删除操作<br />
&nbsp;public void delete(String id) throws Exception ;<br />
&nbsp;// 按ID查询操作<br />
&nbsp;public Person queryById(String id) throws Exception ;<br />
&nbsp;// 查询全部<br />
&nbsp;public List queryAll() throws Exception ;<br />
&nbsp;// 模糊查询<br />
&nbsp;public List queryByLike(String guanjianci) throws Exception ;<br />
}<br />
然后你就可以在各个功能类里implements DataBase了。什么是接口，就是规定你按照上面的格式去做，有规定了，就好办事，对吗？这个最好看看简单工厂设计模式.</p>
<p>&nbsp;</p>
<p><br />
接下来说JSP吧<br />
学完java就该学JSP了。我们发的是电子工业出版社出版的《JSP动态网页编程技术》第七章说的是JSP操作数据库。用的是JDBC-ODBC桥，如果堂哥没有这样提醒我的话,我现在可能还在配置数据源-----java的优势是跨平台，你这样连接数据库的话，就和操作系统绑定在一起了。于是我在网上查了，用JDBC驱动包。因为这样的话速度快，如果是配置connection poll（连接池）性能就更加高了，好的东西我们为什么不用呢？第九章是servlet编程技术，但是老师没有讲，我忘记什么理由了。好像是用得不多。但是在接下来的自学过程中。我知道servlet用得很多，而且很重要。包括MVC设计模式和struts框架。不懂servelet就不懂java。servlet有很多精彩的地方。我这不是教程，所以就不详细说servlet的语法。但是servlet的路径问题得好好研究。对于servlet就学会配置web.xml和获取，跳转就可以了。<br />
但是你要是有很多servlet的话。你就得配置很多，这样的话，web.xml的文件就显得很臃肿，有没有更高的解决方法？有的。&lt;url-pattern&gt;*.do&lt;/url-pattern&gt;，你可以试一下，不管你什么请求，你请求的路径是什么，只要.do结尾的都能找到那个servlet。这就是从多个名称映射同一个servlet。<br />
servlet可以用request.getRequestURL()获取路径，然后用字符串截取函数substring（）截取请求后面的路径。然后根据请求的路径跳转到哪个类。当然，跳转到哪个类，最好的解决方法是在.xml中配置。避免了大量的if语句。而且很灵活。所以，在struts1.x中有个默认的配置文件struts-config.xml配置映射。在struts中，actionServlet就做上面的截取路径的动作。然后由struts-config.xml提供的映射分发到Action。对于struts我不易多说，因为我现在在学习。我感觉它是个好东西。很经典，很多设计模式都在里面找到。<br />
我愿意和你们一起学习struts。<br />
</p>
<img src ="http://www.blogjava.net/xiaodi/aggbug/250388.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xiaodi/" target="_blank">小弟</a> 2009-01-07 17:53 <a href="http://www.blogjava.net/xiaodi/archive/2009/01/07/250388.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>odbc 连接excel时sql应注意的事情</title><link>http://www.blogjava.net/gf7/archive/2009/01/07/250354.html</link><dc:creator>风</dc:creator><author>风</author><pubDate>Wed, 07 Jan 2009 08:00:00 GMT</pubDate><guid>http://www.blogjava.net/gf7/archive/2009/01/07/250354.html</guid><wfw:comment>http://www.blogjava.net/gf7/comments/250354.html</wfw:comment><comments>http://www.blogjava.net/gf7/archive/2009/01/07/250354.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gf7/comments/commentRss/250354.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gf7/services/trackbacks/250354.html</trackback:ping><description><![CDATA[查找一个sheet中的数据是用找个语句"SELECT &nbsp; * &nbsp; from &nbsp; [Sheet1$]",如果sheet的名字是aaa应该写成[aaa$]。&nbsp;&nbsp; 语句应该是这样"SELECT &nbsp; * &nbsp; from &nbsp; [aaa$]"。
<img src ="http://www.blogjava.net/gf7/aggbug/250354.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gf7/" target="_blank">风</a> 2009-01-07 16:00 <a href="http://www.blogjava.net/gf7/archive/2009/01/07/250354.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Action 自动跑到result input</title><link>http://www.blogjava.net/huamengxing/archive/2009/01/07/250322.html</link><dc:creator>华梦行</dc:creator><author>华梦行</author><pubDate>Wed, 07 Jan 2009 06:51:00 GMT</pubDate><guid>http://www.blogjava.net/huamengxing/archive/2009/01/07/250322.html</guid><wfw:comment>http://www.blogjava.net/huamengxing/comments/250322.html</wfw:comment><comments>http://www.blogjava.net/huamengxing/archive/2009/01/07/250322.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/huamengxing/comments/commentRss/250322.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/huamengxing/services/trackbacks/250322.html</trackback:ping><description><![CDATA[一般是类型转换的错误，在提交form的时候<img src ="http://www.blogjava.net/huamengxing/aggbug/250322.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/huamengxing/" target="_blank">华梦行</a> 2009-01-07 14:51 <a href="http://www.blogjava.net/huamengxing/archive/2009/01/07/250322.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何查看sql的执行计划</title><link>http://www.blogjava.net/wphmoon/archive/2009/01/07/250303.html</link><dc:creator>月挂夜中央</dc:creator><author>月挂夜中央</author><pubDate>Wed, 07 Jan 2009 04:00:00 GMT</pubDate><guid>http://www.blogjava.net/wphmoon/archive/2009/01/07/250303.html</guid><wfw:comment>http://www.blogjava.net/wphmoon/comments/250303.html</wfw:comment><comments>http://www.blogjava.net/wphmoon/archive/2009/01/07/250303.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/wphmoon/comments/commentRss/250303.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/wphmoon/services/trackbacks/250303.html</trackback:ping><description><![CDATA[在pl/sql developer中，直接写条sql，按F5，就可以调出执行计划，但在只有sql plus的情况下，只能用下面这个语句了，<br />
explain plan for select ....<br />
然后再来一句<br />
select * from table(dbms_xplan.display());<br />
就会出现一个类似下面的信息<br />
PLAN_TABLE_OUTPUT<br />
--------------------------------------------------------------------------------<br />
<br />
----------------------------------------------------------------------------<br />
| Id&nbsp; | Operation&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp; Name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | Rows&nbsp; | Bytes | Cost&nbsp; |<br />
----------------------------------------------------------------------------<br />
|&nbsp;&nbsp; 0 | SELECT STATEMENT&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br />
|&nbsp;&nbsp; 1 |&nbsp; NESTED LOOPS&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br />
|&nbsp;&nbsp; 2 |&nbsp;&nbsp; TABLE ACCESS FULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | AC01&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br />
|&nbsp;&nbsp; 3 |&nbsp;&nbsp; TABLE ACCESS BY INDEX ROWID| AB01&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br />
|&nbsp;&nbsp; 4 |&nbsp;&nbsp;&nbsp; INDEX UNIQUE SCAN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; | PK_AB01&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br />
----------------------------------------------------------------------------<br />
<br />
<br />
PLAN_TABLE_OUTPUT<br />
--------------------------------------------------------------------------------<br />
Note: rule based optimization, PLAN_TABLE' is old version<br />
<br />
就能看到执行计划了。<br />
<br />
<img src ="http://www.blogjava.net/wphmoon/aggbug/250303.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/wphmoon/" target="_blank">月挂夜中央</a> 2009-01-07 12:00 <a href="http://www.blogjava.net/wphmoon/archive/2009/01/07/250303.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts开发中碰到的问题</title><link>http://www.blogjava.net/zoninge/archive/2009/01/07/250300.html</link><dc:creator>JasonChou</dc:creator><author>JasonChou</author><pubDate>Wed, 07 Jan 2009 03:45:00 GMT</pubDate><guid>http://www.blogjava.net/zoninge/archive/2009/01/07/250300.html</guid><wfw:comment>http://www.blogjava.net/zoninge/comments/250300.html</wfw:comment><comments>http://www.blogjava.net/zoninge/archive/2009/01/07/250300.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zoninge/comments/commentRss/250300.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zoninge/services/trackbacks/250300.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1.  No action config found for the specified url<br>造成这个问题有两个原因，第一个原因是struts-config.xml的配置有问题，具体是<action attribute="" input=""  name="" path="" scope="" type="" />中的path属性写错了。第二个原因是JSP文件中的action写错了<br><br>2.  org.apache.struts.config.FormBeanConfig.createActionForm<br>造成这个问题的原因是<form-bean name="" type="" /> 中的type属性出错&nbsp;&nbsp;<a href='http://www.blogjava.net/zoninge/archive/2009/01/07/250300.html'>阅读全文</a><img src ="http://www.blogjava.net/zoninge/aggbug/250300.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zoninge/" target="_blank">JasonChou</a> 2009-01-07 11:45 <a href="http://www.blogjava.net/zoninge/archive/2009/01/07/250300.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Struts Validator验证器使用指南(转)</title><link>http://www.blogjava.net/hill/archive/2009/01/07/250223.html</link><dc:creator>Hill</dc:creator><author>Hill</author><pubDate>Wed, 07 Jan 2009 01:52:00 GMT</pubDate><guid>http://www.blogjava.net/hill/archive/2009/01/07/250223.html</guid><wfw:comment>http://www.blogjava.net/hill/comments/250223.html</wfw:comment><comments>http://www.blogjava.net/hill/archive/2009/01/07/250223.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hill/comments/commentRss/250223.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hill/services/trackbacks/250223.html</trackback:ping><description><![CDATA[<table style="table-layout: fixed">
    <tbody>
        <tr>
            <td>
            <div class="cnt" id="blog_text">
            <p>Struts Validator验证器使用指南</p>
            <p><br />
            验证器：</p>
            <p>从0.5版，验证器在一些form中就已经实现了，他最初包含在开发人员包中，后来核心代码挪到Jakarta Commons包中和Struts特别扩展中作为 Struts 1.1的一部分。许多开发者为方便一直使用struts验证器，这篇文档首先概述验证器的核心功能性，然后大概介绍在 struts1.1中的变化和新增功能。</p>
            <p>如果你配置好验证器插件，你应该扩展ValidatorForm而不是ActionForm，以便它能加载你的Validator资源。他根据struts-config.xml文件中的action的name属性为当前form的调用相应的验证器，因此在validator-rules.xml中的form元素的名称属性应该与action的name属性值相匹配。</p>
            <p>另外一种选择是扩展ValidatorActionForm 而不是ValidatorForm，ValidatorActionForm使用struts-config.xml中action的path属性，所以path属性的值相应的应该与validator-rules.xml中的Form的name属性匹配。</p>
            <p>一个分离的action可以定义给多页form的每个页面，而且验证规则可以与action关联而不是与页码，就像验证范例中的多页form范例那样。<br />
            国际化</p>
            <p>在validator-rules.xml 文件中form的验证规则可以组织为FormSet。FormSet 有与java.util.Locale 类相应的属性：如语言, 国家以及变量型属性，如果他们未定义，FormSet 将把它设置为默认值。一个FormSet 也可以有关联的常量。另外还可以定义与FormSet 同一级别的全局global元素，他与FormSet同样也有常量。</p>
            <p>注意：你必须在国际化的FormSet前声明一个没有国际化的默认FormSet。这样如果Validator没有找到locale时可以有一个默认版本。</p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可插入验证器的默认错误信息值可以被msg元素覆盖。所以为mask验证器生成错误信息的替代方法就是使用msg属性，如果字段的name属性与验证器的name属性匹配，那末将使用字段的msg属性。</p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; error messages的可以设置arg0-arg3 等参数元素。如果没有设置arg0-arg3的name属性， error messages将使用他们作为默认的构建参数值。如果设置了name属性，你就可以把参数指定给一特定的可插入验证器，然后这些参数将在构造错误信息时被使用。</p>
            <p>&lt;field </p>
            <p>property="lastName" </p>
            <p>depends="required,mask"&gt;</p>
            <p>&lt;msg </p>
            <p>name="mask" </p>
            <p>key="registrationForm.lastname.maskmsg"/&gt;</p>
            <p>&lt;arg0 key="registrationForm.lastname.displayname"/&gt;</p>
            <p>&lt;var&gt;</p>
            <p>&lt;var-name&gt;mask&lt;/var-name&gt;</p>
            <p>&lt;var-value&gt;^[a-zA-Z]*$&lt;/var-value&gt;</p>
            <p>&lt;/var&gt;</p>
            <p>&lt;/field&gt;</p>
            <p>默认的arg0-arg3元素将在消息资源中查找相应的key，如果资源属性设为false，她将把值直接传进去，而不从消息资源中查找。注意1.1版本中，你必须为每个模块中明确地定义在验证中用到的消息资源，否则将使用top-level资源。</p>
            <p>&lt;field</p>
            <p>property="integer" </p>
            <p>depends="required,integer,intRange"&gt;</p>
            <p>&lt;arg0 key="typeForm.integer.displayname"/&gt;</p>
            <p>&lt;arg1</p>
            <p>name="range"</p>
            <p>key="${var:min}"</p>
            <p>resource="false"/&gt;</p>
            <p>&lt;arg2 </p>
            <p>name="range"</p>
            <p>key="${var:max}"</p>
            <p>resource="false"/&gt;</p>
            <p>&lt;var&gt;</p>
            <p>&lt;var-name&gt;min&lt;/var-name&gt;</p>
            <p>&lt;var-value&gt;10&lt;/var-value&gt;</p>
            <p>&lt;/var&gt;</p>
            <p>&lt;var&gt;</p>
            <p>&lt;var-name&gt;max&lt;/var-name&gt;</p>
            <p>&lt;var-value&gt;20&lt;/var-value&gt;</p>
            <p>&lt;/var&gt;</p>
            <p>&lt;/field&gt;<br />
            常量/变量</p>
            <p>全局的常量可以在全局标签中定义，FormSet/本地常量能在formset 标签中创建。常量当前仅仅是代替字段的property属性，字段的var 元素的 value属性，字段的msg 元素的 key属性，字段的arg0-arg3 元素的 key属性。字段的变量也可以在arg0-arg3 元素中被代替（例如：${var:min}））。替换的顺序是FormSet/Locale常量第一，全局的常量第二，</p>
            <p>arg elements 变量最后。</p>
            <p>&lt;global&gt;</p>
            <p>&lt;constant&gt;</p>
            <p>&lt;constant-name&gt;zip&lt;/constant-name&gt;</p>
            <p>&lt;constant-value&gt;^\d{5}(-\d{4})?$&lt;/constant-value&gt;</p>
            <p>&lt;/constant&gt;</p>
            <p>&lt;/global&gt;</p>
            <p>&nbsp;</p>
            <p>&lt;field </p>
            <p>property="zip" </p>
            <p>depends="required,mask"&gt;</p>
            <p>&lt;arg0 key="registrationForm.zippostal.displayname"/&gt;</p>
            <p>&lt;var&gt;</p>
            <p>&lt;var-name&gt;mask&lt;/var-name&gt;</p>
            <p>&lt;var-value&gt;${zip}&lt;/var-value&gt;</p>
            <p>&lt;/var&gt;</p>
            <p>&lt;/field&gt;</p>
            <p>验证器可以使用字段下面的变量部分来存储变量，这些变量通过字段的getVar（(String key)方法取得。</p>
            <p>&lt;field </p>
            <p>property="integer" </p>
            <p>depends="required,integer,intRange"&gt;</p>
            <p>&lt;arg0 key="typeForm.integer.displayname"/&gt;</p>
            <p>&lt;arg1 </p>
            <p>name="range" </p>
            <p>key="${var:min}" resource="false"/&gt;</p>
            <p>&lt;arg2 </p>
            <p>name="range" </p>
            <p>key="${var:max}" resource="false"/&gt;</p>
            <p>&lt;var&gt;</p>
            <p>&lt;var-name&gt;min&lt;/var-name&gt;</p>
            <p>&lt;var-value&gt;10&lt;/var-value&gt;</p>
            <p>&lt;/var&gt;</p>
            <p>&lt;var&gt;</p>
            <p>&lt;var-name&gt;max&lt;/var-name&gt;</p>
            <p>&lt;var-value&gt;20&lt;/var-value&gt;</p>
            <p>&lt;/var&gt;</p>
            <p>&lt;/field&gt;<br />
            使用validwhen设计复杂的验证</p>
            <p>使用validwhen来设计复杂验证的一个经常的要求就是根据一个字段验证另外一个字段（比如, 如果你要用户两次输入口令来确认值口令一致），另外一个就是表单中的一个字段只有另外一个字段有确定值的时候才是必须输入的。新的validwhen验证规则将很快被包含在1.1后的STRUTS版本中，她就是用来处理这种情况的。</p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; validwhen 规则处理单个的变量字段，叫测试。这变量的值是一个布尔的表达式，如果验证有效则它必须为真。可以包含这种变量的表达式有：</p>
            <p>u&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 单引号或双引号字符串literals，</p>
            <p>u&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 十进制、十六进制、八进制的Integer literals，</p>
            <p>u&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; null与null和空字符串匹配，</p>
            <p>u&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其它可以用属性名引用的form字段,例如customerAge，</p>
            <p>u&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可以在外部因用得索引字段, 例如childLastName[2]，</p>
            <p>u&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可以默认implicit因用得索引字段, 例如childLastName[], 她将作为被索引的字段使用同样的索引到数组中，</p>
            <p>The literal *这里指它包含当前测试字段的值，</p>
            <p>作为例子，考虑一个包含通讯地址和邮箱字段的form。如果通讯地址不为空则邮箱字段是必须的required。你能这样定义validwhen 规则：</p>
            <p>&lt;field property="emailAddress" depends="validwhen"&gt;</p>
            <p>&lt;arg0 key="userinfo.emailAddress.label"/&gt;</p>
            <p>&lt;var&gt;</p>
            <p>&lt;var-name&gt;test&lt;/var-name&gt;</p>
            <p>&lt;var-value&gt;((sendNewsletter == null) or (*this* != null))&lt;/var-value&gt;</p>
            <p>&lt;/var&gt;</p>
            <p>&lt;/field&gt;</p>
            <p>上面定义的意思是：如果通讯地址是空或不空时这个字段时有效的。</p>
            <p>这里有个稍微复杂的例子，它使用了索引字段。假定有一个表单，允许用户输入他们希望定购的部件号和数量。类orderLine 的bean的一数组被用来在称为orderLines 的一属性保持输入项。</p>
            <p>If you wished to verify that every line with part number also had a quantity entered, you could do it with:</p>
            <p>如果你希望校验订单中有数量输入得每一行，你可以这样：</p>
            <p>&lt;field </p>
            <p>property="quantity" </p>
            <p>indexedListProperty="orderLines" </p>
            <p>depends="validwhen"&gt;</p>
            <p>&lt;arg0 key="orderform.quantity.label"/&gt;</p>
            <p>&lt;var&gt;</p>
            <p>&lt;var-name&gt;test&lt;/var-name&gt;</p>
            <p>&lt;var-value&gt;((orderLines[].partNumber == null) or (*this* != null))&lt;/var-value&gt;</p>
            <p>&lt;/var&gt;</p>
            <p>&lt;/field&gt;</p>
            <p>这里的意思是：如果相应的partNumber 字段是空, 或这字段是不空的，则这字段是有效的。</p>
            <p>最后一个例子，想象一表单，用户必须输入他们的以英寸为单位的高度，如果他们在高度在60英寸以下，则出一错误。（it is an error to have checked off nbaPointGuard as a career.）</p>
            <p>&lt;field property="nbaPointGuard" depends="validwhen"&gt;</p>
            <p>&lt;arg0 key="careers.nbaPointGuard.label"/&gt;</p>
            <p>&lt;var&gt;</p>
            <p>&lt;var-name&gt;test&lt;/var-name&gt;</p>
            <p>&lt;var-value&gt;((heightInInches &gt;= 60) or (*this* == null))&lt;/var-value&gt;</p>
            <p>&lt;/var&gt;</p>
            <p>&lt;/field&gt;</p>
            <p>&nbsp;</p>
            <p>给程序员的简单说明：</p>
            <p>所有的比较关系必须在parens 封装。All comparisons must be enclosed in parens.</p>
            <p>只有两个itme时可以and或or链接。</p>
            <p>如果比较的两item都可以转为整数，则使用numeric比较，否则使用字符串比较。<br />
            可插入验证器</p>
            <p>验证是从validation.xml 文件中加载的，默认的验证规则定义在validation.xml 文件中，默认定义了required, mask ,byte, short, int, long, float, double, date (没有本地支持), and a numeric range。</p>
            <p>" mask "方式依赖于默认值安装要求，那意味着"required "可以完成，在"'mask "将运行以前"required "和" mask "方式被默认包含进框架中了。任何字段如果不是"required "而且是空或有零长度将跳过其他验证。</p>
            <p>如果使用了Javascript 标签，客户端javascript在validator's javascript 属性中查找值而且产生一个有验证form方法的对象，要得到更多的关于Javascript Validator 标签工作细节的详细的解释,参阅html标签API参考。</p>
            <p>"'mask' "方式让你用一正则表达式掩码验证字段，它使用jakarta的正规表达式包，所有的有效性规则存储在validator-rules.xml 文件，使用的主类是org.apache.regexp.RE。</p>
            <p>validation.xml文件中的验证器配置范例：</p>
            <p>&lt;validator name="required"</p>
            <p>classname="org.apache.struts.validator.FieldChecks"</p>
            <p>method="validateRequired"</p>
            <p>methodParams="java.lang.Object,</p>
            <p>org.apache.commons.validator.ValidatorAction, </p>
            <p>org.apache.commons.validator.Field,</p>
            <p>org.apache.struts.action.ActionErrors,</p>
            <p>javax.servlet.http.HttpServletRequest"</p>
            <p>msg="errors.required"&gt;</p>
            <p>&lt;validator name="mask"</p>
            <p>classname="org.apache.struts.validator.FieldChecks"</p>
            <p>method="validateMask" </p>
            <p>methodParams="java.lang.Object, </p>
            <p>org.apache.commons.validator.ValidatorAction, </p>
            <p>org.apache.commons.validator.Field, </p>
            <p>org.apache.struts.action.ActionErrors,</p>
            <p>javax.servlet.http.HttpServletRequest" </p>
            <p>msg="errors.invalid"&gt;</p>
            <p><br />
            定义可插入验证器</p>
            <p>方法的参数是用逗号分隔的一些类名称列表，方法属性需要有一个符合上面的列表的签名。列表由以下组合而成：</p>
            <p>java.lang.Object &#8211; 要验证的Bean。</p>
            <p>org.apache.commons.validator.ValidatorAction &#8211; 当前ValidatorAction。</p>
            <p>org.apache.commons.validator.Field &#8211; 要验证的字段</p>
            <p>org.apache.struts.action.ActionErrors &#8211; 如果验证错误将加入ActionError的错误对象javax.servlet.http.HttpServletRequest &#8211;当前request 对象。</p>
            <p>javax.servlet.ServletContext &#8211; 应用的ServletContext。</p>
            <p>org.apache.commons.validator.Validator&#8211;当前的org.apache.commons.validator.Validator实例。</p>
            <p>java.util.Locale &#8211; 当前用户的Locale。<br />
            多页面form</p>
            <p>字段部分有一可选的页面属性，它可以被设为整数，页上字段的所有验证小于或等于服务器端验证的当前页，页上字段的所有验证小于或等于客户端页上所有字段的验证小于或等于服务器端验证的当前页验证的当前页。一个mutli-part表单需要定义页面属性：</p>
            <p>&lt;html:hidden property="page" value="1"/&gt;。<br />
            比较两个字段</p>
            <p>这是一个展示你怎样才能比较两个字段是否有一样的值的例子。比如&#8220;用户改变他们的口令&#8220;一般会有口令字段和一确认字段。</p>
            <p>&lt;validator name="twofields" </p>
            <p>classname="com.mysite.StrutsValidator" </p>
            <p>method="validateTwoFields" </p>
            <p>msg="errors.twofields"/&gt;</p>
            <p>&lt;field property="password" depends="required,twofields"&gt;</p>
            <p>&lt;arg0 key="typeForm.password.displayname"/&gt;</p>
            <p>&lt;var&gt;</p>
            <p>&lt;var-name&gt;secondProperty&lt;/var-name&gt;</p>
            <p>&lt;var-value&gt;password2&lt;/var-value&gt;</p>
            <p>&lt;/var&gt;</p>
            <p>&lt;/field&gt;</p>
            <p>&nbsp;</p>
            <p>public static boolean validateTwoFields( </p>
            <p>Object bean, ValidatorAction va,&nbsp;&nbsp;</p>
            <p>Field field, ActionErrors errors, HttpServletRequest request,&nbsp;&nbsp;</p>
            <p>ServletContext application) {</p>
            <p>String value = ValidatorUtils.getValueAsString( bean,&nbsp;&nbsp; field.getProperty());</p>
            <p>String sProperty2 = field.getVarValue("secondProperty");</p>
            <p>String value2 = ValidatorUtils.getValueAsString( bean,&nbsp;&nbsp; sProperty2);</p>
            <p>&nbsp;</p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!GenericValidator.isBlankOrNull(value)) { </p>
            <p>try { </p>
            <p>if (!value.equals(value2)) { </p>
            <p>errors.add(field.getKey(), </p>
            <p>Resources.getActionError( application, request, va, field));</p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return false;</p>
            <p>}</p>
            <p>} catch (Exception e) { </p>
            <p>errors.add(field.getKey(), Resources.getActionError( application, request, va, field));</p>
            <p>return false;</p>
            <p>}</p>
            <p>}</p>
            <p>}<br />
            已知的bug</p>
            <p>Struts Validator依赖于Commons Validator包，所以问题报告和增强需求可能在两个产品中列出。</p>
            <p>&#183;&nbsp;&nbsp;&nbsp; Struts Validator Bugzilla Reports </p>
            <p>&#183;&nbsp;&nbsp;&nbsp; Commons Validator Bugzilla Reports <br />
            变更和deprecations </p>
            <p>新建的标记属性。</p>
            <p>&lt;html:javascript&gt;标记有新的属性定义.</p>
            <p>使用commons-validator.jar中的DTD验证。</p>
            <p>当前使用的验证XML文件是根据commons-validator.jar中的DTD。Struts不在为validator-rules.xml and validator.xml.单独维护一个分离的DTD，另外,commons-validator 现在维护一个统一的validator.dtd。修改所有validator.xml文件的DTD引用为</p>
            <p>&lt;!DOCTYPE form-validation PUBLIC</p>
            <p>"-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.0//EN"</p>
            <p>"<a href="http://jakarta.apache.org/commons/dtds/validator_1_0.dtd">http://jakarta.apache.org/commons/dtds/validator_1_0.dtd</a>"&gt;</p>
            <p>空字段。</p>
            <p>当前默认在所有得基础验证类型中忽略空白的字段，如果你要求一个字段必须输入，那末在你的应用的validator.xml 文件相应的字段定义的depends属性中添加 " required "。</p>
            <p>新建的范围RANGE方法.</p>
            <p>JavaScript 和JAVA中都添加了intRange &amp; floatRange 方法。</p>
            <p>有条件地REQUIRED字段.</p>
            <p>最大的修改是添加了基于其她字段的值的有条件地require验证的能力。它允许你定义逻辑如：&#8220;只有X字段非空的时候Y字段为&#8217;male&#8217;才有效&#8221;，这是实现上述逻辑的推荐方法，这种方法在1.1版后的第一版将实现。在1.1版中添加的Requiredif验证规则，将在新版中去掉。不过，如果你正准备使用requiredif，这里有一个简短的教程。</p>
            <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 让我们假定你有一个有3个字段的医药的信息表单，性别sex，怀孕测试pregnancyTest，测试结果testResult，如果性别为'f' or 'F'，则怀孕测试pregnancyTest是required，如果pregnancyTest不是空，测试结果testResult是required。</p>
            <p>你的validation.xml 文件的输入项应该是这样的：</p>
            <p>&lt;form name="medicalStatusForm"&gt;</p>
            <p>&lt;field property="pregnancyTest" depends="requiredif"&gt;</p>
            <p>&lt;arg0 key="medicalStatusForm.pregnancyTest.label"/&gt;</p>
            <p>&lt;var&gt;</p>
            <p>&lt;var-name&gt;field[0]&lt;/var-name&gt;</p>
            <p>&lt;var-value&gt;sex&lt;/var-value&gt;</p>
            <p>&lt;/var&gt;</p>
            <p>&lt;var&gt;</p>
            <p>&lt;var-name&gt;fieldTest[0]&lt;/var-name&gt;</p>
            <p>&lt;var-value&gt;EQUAL&lt;/var-value&gt;</p>
            <p>&lt;/var&gt;</p>
            <p>&lt;var&gt;</p>
            <p>&lt;var-name&gt;fieldValue[0]&lt;/var-name&gt;</p>
            <p>&lt;var-value&gt;F&lt;/var-value&gt;</p>
            <p>&lt;/var&gt;</p>
            <p>&lt;var&gt;</p>
            <p>&lt;var-name&gt;field[1]&lt;/var-name&gt;</p>
            <p>&lt;var-value&gt;sex&lt;/var-value&gt;</p>
            <p>&lt;/var&gt;</p>
            <p>&lt;var&gt;</p>
            <p>&lt;var-name&gt;fieldTest[1]&lt;/var-name&gt;</p>
            <p>&lt;var-value&gt;EQUAL&lt;/var-value&gt;</p>
            <p>&lt;/var&gt;</p>
            <p>&lt;var&gt;</p>
            <p>&lt;var-name&gt;fieldValue[1]&lt;/var-name&gt;</p>
            <p>&lt;var-value&gt;f&lt;/var-value&gt;</p>
            <p>&lt;/var&gt;</p>
            <p>&lt;var&gt;</p>
            <p>&lt;var-name&gt;fieldJoin&lt;/var-name&gt;</p>
            <p>&lt;var-value&gt;OR&lt;/var-value&gt;</p>
            <p>&lt;/var&gt;</p>
            <p>&lt;/field&gt;</p>
            <p>&lt;field property="testResult" depends="requiredif"&gt;</p>
            <p>&lt;arg0 key="medicalStatusForm.testResult.label"/&gt;</p>
            <p>&lt;var&gt;</p>
            <p>&lt;var-name&gt;field[0]&lt;/var-name&gt;</p>
            <p>&lt;var-value&gt;pregnancyTest&lt;/var-value&gt;</p>
            <p>&lt;/var&gt;</p>
            <p>&lt;var&gt;</p>
            <p>&lt;var-name&gt;fieldTest[0]&lt;/var-name&gt;</p>
            <p>&lt;var-value&gt;NOTNULL&lt;/var-value&gt;</p>
            <p>&lt;/var&gt;</p>
            <p>&lt;/field&gt;</p>
            <p>&lt;/form&gt;</p>
            <p>&nbsp;</p>
            <p>这里有一个使用索引的属性更复杂的例子，如果你的struts-config.xml 有这下面：</p>
            <p>&lt;form-bean name="dependentlistForm" </p>
            <p>type="org.apache.struts.webapp.validator.forms.ValidatorForm"&gt;</p>
            <p>&lt;form-property </p>
            <p>name="dependents" </p>
            <p>type="org.apache.struts.webapp.validator.Dependent[]" size="10"/&gt;</p>
            <p>&lt;form-property name="insureDependents" type="java.lang.Boolean" initial="false"/&gt;</p>
            <p>&lt;/form-bean&gt;</p>
            <p>这里dependentlistForm bean有lastName，firstName，dob，coverageType四个属性，你可以这样定义一验证规则：</p>
            <p>&lt;form name="dependentlistForm"&gt;</p>
            <p>&lt;field </p>
            <p>property="firstName" indexedListProperty="dependents" depends="requiredif"&gt;</p>
            <p>&lt;arg0 key="dependentlistForm.firstName.label"/&gt;</p>
            <p>&lt;var&gt;</p>
            <p>&lt;var-name&gt;field[0]&lt;/var-name&gt;</p>
            <p>&lt;var-value&gt;lastName&lt;/var-value&gt;</p>
            <p>&lt;/var&gt;</p>
            <p>&lt;var&gt;</p>
            <p>&lt;var-name&gt;fieldIndexed[0]&lt;/var-name&gt;</p>
            <p>&lt;var-value&gt;true&lt;/var-value&gt;</p>
            <p>&lt;/var&gt;</p>
            <p>&lt;var&gt;</p>
            <p>&lt;var-name&gt;fieldTest[0]&lt;/var-name&gt;</p>
            <p>&lt;var-value&gt;NOTNULL&lt;/var-value&gt;</p>
            <p>&lt;/var&gt;</p>
            <p>&lt;/field&gt;</p>
            <p>&nbsp;</p>
            <p>&lt;field </p>
            <p>property="dob" indexedListProperty="dependents" depends="requiredif,date"&gt;</p>
            <p>&lt;arg0 key="dependentlistForm.dob.label"/&gt;</p>
            <p>&lt;var&gt;</p>
            <p>&lt;var-name&gt;field[0]&lt;/var-name&gt;</p>
            <p>&lt;var-value&gt;lastName&lt;/var-value&gt;</p>
            <p>&lt;/var&gt;</p>
            <p>&lt;var&gt;</p>
            <p>&lt;var-name&gt;fieldIndexed[0]&lt;/var-name&gt;</p>
            <p>&lt;var-value&gt;true&lt;/var-value&gt;</p>
            <p>&lt;/var&gt;</p>
            <p>&lt;var&gt;</p>
            <p>&lt;var-name&gt;fieldTest[0]&lt;/var-name&gt;</p>
            <p>&lt;var-value&gt;NOTNULL&lt;/var-value&gt;</p>
            <p>&lt;/var&gt;</p>
            <p>&lt;/field&gt;</p>
            <p>&nbsp;</p>
            <p>&lt;field </p>
            <p>property="coverageType" indexedListProperty="dependents" depends="requiredif"&gt;</p>
            <p>&lt;arg0 key="dependentlistForm.coverageType.label"/&gt;</p>
            <p>&lt;var&gt;</p>
            <p>&lt;var-name&gt;field[0]&lt;/var-name&gt;</p>
            <p>&lt;var-value&gt;lastName&lt;/var-value&gt;</p>
            <p>&lt;/var&gt;</p>
            <p>&lt;var&gt;</p>
            <p>&lt;var-name&gt;fieldIndexed[0]&lt;/var-name&gt;</p>
            <p>&lt;var-value&gt;true&lt;/var-value&gt;</p>
            <p>&lt;/var&gt;</p>
            <p>&lt;var&gt;</p>
            <p>&lt;var-name&gt;fieldTest[0]&lt;/var-name&gt;</p>
            <p>&lt;var-value&gt;NOTNULL&lt;/var-value&gt;</p>
            <p>&lt;/var&gt;</p>
            <p>&lt;var&gt;</p>
            <p>&lt;var-name&gt;field[1]&lt;/var-name&gt;</p>
            <p>&lt;var-value&gt;insureDependents&lt;/var-value&gt;</p>
            <p>&lt;/var&gt;</p>
            <p>&lt;var&gt;</p>
            <p>&lt;var-name&gt;fieldTest[1]&lt;/var-name&gt;</p>
            <p>&lt;var-value&gt;EQUAL&lt;/var-value&gt;</p>
            <p>&lt;/var&gt;</p>
            <p>&lt;var&gt;</p>
            <p>&lt;var-name&gt;fieldValue[1]&lt;/var-name&gt;</p>
            <p>&lt;var-value&gt;true&lt;/var-value&gt;</p>
            <p>&lt;/var&gt;</p>
            <p>&lt;var&gt;</p>
            <p>&lt;var-name&gt;fieldJoin&lt;/var-name&gt;</p>
            <p>&lt;var-value&gt;AND&lt;/var-value&gt;</p>
            <p>&lt;/var&gt;</p>
            <p>&lt;/field&gt;</p>
            <p>&lt;/form&gt;</p>
            <p>这里的意思是：</p>
            <p>如果lastName 字段是非空的，firstName 字段required。因为字段Indexed 为真，这它意味着lastName的indexed 必须与firstName 的索引的一样，dob同理，除非date不为空。</p>
            <p>如果lastName 用样索引时的值不空, 而且非索引字段insureDependents为真，则coverageType 是only require。</p>
            <p>你可以对字段在[n]中使用任意数字，唯一的限制是他们必须都是AND或OR,你无法混合使用。</p>
            <p>Deprecation：</p>
            <p>u&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JavaScript 和Java的range方法.</p>
            <p>u&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StrutsValidator &amp;StrutsValidatorUtil 类中的Deprecation方法<br />
            验证器api指南</p>
            <p>一个简明的Struts验证器API指南 可以帮助你开始。<br />
            验证器资源</p>
            <p>Struts Validator: Validating Two Fields Match 作者Matt Raible。（两个字段匹配验证）关于使用方法的文章。（范例部分为翻译此文内容）</p>
            <p>DynaForms and the Validator 作者James Turner and Kevin Bedell。Struts Kickstart的其中一章（动态form和验证器），可以自由下载PDF). </p>
            <p>Validating user input 作者 David Winterfeldt and Ted Husted。Struts in Action的其中一章，可以自由下载(PDF)。</p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/hill/aggbug/250223.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hill/" target="_blank">Hill</a> 2009-01-07 09:52 <a href="http://www.blogjava.net/hill/archive/2009/01/07/250223.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[导入][English]丛林怪兽的真名</title><link>http://www.blogjava.net/lizhgcn/archive/2009/01/07/250241.html</link><dc:creator>骷髅</dc:creator><author>骷髅</author><pubDate>Wed, 07 Jan 2009 01:03:00 GMT</pubDate><guid>http://www.blogjava.net/lizhgcn/archive/2009/01/07/250241.html</guid><wfw:comment>http://www.blogjava.net/lizhgcn/comments/250241.html</wfw:comment><comments>http://www.blogjava.net/lizhgcn/archive/2009/01/07/250241.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.b