??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲精品2区,黄色免费在线播放,欧美日韩中文字幕综合视频http://www.aygfsteel.com/jzone/category/39472.htmljava web, java wap ..My laboratory..zh-cnMon, 14 Jun 2010 15:54:48 GMTMon, 14 Jun 2010 15:54:48 GMT60commons-lang-2.4.jar 包常用方法集?/title><link>http://www.aygfsteel.com/jzone/articles/323107.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Tue, 08 Jun 2010 16:04:00 GMT</pubDate><guid>http://www.aygfsteel.com/jzone/articles/323107.html</guid><description><![CDATA[<p>import java.util.Iterator;<br /> import java.util.Map;</p> <p>import org.apache.commons.lang.ArrayUtils;<br /> import org.apache.commons.lang.ClassUtils;<br /> import org.apache.commons.lang.RandomStringUtils;<br /> import org.apache.commons.lang.StringEscapeUtils;<br /> import org.apache.commons.lang.StringUtils;<br /> import org.apache.commons.lang.math.NumberUtils;</p> <p>/**<br />  * commons-lang-2.4.jar 包常用方法集?br />  *<br />  */<br /> public class CommonsLang {</p> <p> public static void main(String[] args) {<br />   String[] test = {"33", "ddffd"};<br />   String[] test1 = {"ddffd", "33"};<br />   <br />   // 1.判断两个数据是否相等<br />   System.out.println(ArrayUtils.isEquals(test, test1));<br />   // 2.{33,ddffd} 数l内容以{,}形式输出Q?br />   System.out.println(ArrayUtils.toString(test));<br />   Map map = ArrayUtils.toMap(new String[][] { { "RED", "#FF0000" }, { "GREEN", "#00FF00" }, { "BLUE", "#0000FF" } });<br />   // 3.toMap 一个数l,但每个元?Each element of the array<br />   // must be either a {@link java.util.Map.Entry} or an Array,<br />   // 方式一 下面是遍历map的方式,取得其keySet.iterator();<br />   Iterator it = map.keySet().iterator();<br />   while (it.hasNext()) {<br />    String key = (String) it.next();<br />    // it.next()只包含key<br />    System.out.println("key:" + key + "value:" + map.get(key));<br />   }<br />   // 方式?取得其entrySet()集合,<br />   Iterator it1 = map.entrySet().iterator();<br />   while (it.hasNext()) {<br />    Map.Entry entry = (Map.Entry) it1.next();<br />    // it1.next()中包含key和value<br />    System.out.println("key :" + entry.getKey() + "value :" + entry.getValue());<br />   }</p> <p>  // 4.取得cd<br />   System.out.println(ClassUtils.getShortClassName(Test.class));<br />   // 取得其包?br />   System.out.println(ClassUtils.getPackageName(Test.class));<br />   // 5.NumberUtils<br />   System.out.println(NumberUtils.stringToInt("6"));<br />   System.out.println(NumberUtils.stringToInt("7", 10));<br />   // 6.五位的随机字母和数字<br />   System.out.println(RandomStringUtils.randomAlphanumeric(5));<br />   // 7.StringEscapeUtils<br />   System.out.println(StringEscapeUtils.escapeHtml("<html>"));<br />   // 输出l果?amp;lt;html&gt;<br />   System.out.println(StringEscapeUtils.escapeJava("String"));<br />   // 8.StringUtils,判断是否是空格字W?br />   System.out.println(StringUtils.isBlank("   "));<br />   // 数l中的内容以,分隔<br />   System.out.println(StringUtils.join(test, ","));<br />   // 在右边加下字W?使之总长度ؓ(f)6<br />   System.out.println(StringUtils.rightPad("abc", 6, 'T'));<br />   // 首字母大?br />   System.out.println(StringUtils.capitalize("abc"));<br />   // Deletes all whitespaces from a String 删除所有空?br />   System.out.println(StringUtils.deleteWhitespace("   ab  c  "));<br />   // 判断是否包含q个字符<br />   System.out.println(StringUtils.contains("abc", "ba"));<br />   // 表示左边两个字符<br />   System.out.println(StringUtils.left("abc", 2));<br />   System.out.println(StringUtils.right("abcd", 3));<br />  }<br /> }<br /> </p> <img src ="http://www.aygfsteel.com/jzone/aggbug/323107.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/jzone/" target="_blank">Gavin.lee</a> 2010-06-09 00:04 <a href="http://www.aygfsteel.com/jzone/articles/323107.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>String&InputStream的相互{?/title><link>http://www.aygfsteel.com/jzone/articles/311849.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Wed, 03 Feb 2010 14:15:00 GMT</pubDate><guid>http://www.aygfsteel.com/jzone/articles/311849.html</guid><description><![CDATA[1.InputStream ---> String<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.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" /><span style="color: #000000">            InputStream is </span><span style="color: #000000">=</span><span style="color: #000000"> getMethod.getResponseBodyAsStream();<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" />            BufferedReader br </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> BufferedReader(</span><span style="color: #0000ff">new</span><span style="color: #000000"> InputStreamReader(is, </span><span style="color: #000000">"</span><span style="color: #000000">UTF-8</span><span style="color: #000000">"</span><span style="color: #000000">));<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" />            StringBuffer buffer </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> StringBuffer();<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" />            String str </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">""</span><span style="color: #000000">, response </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">""</span><span style="color: #000000">;<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" />            <br /> <img id="Codehighlighter1_257_307_Open_Image" onclick="this.style.display='none'; Codehighlighter1_257_307_Open_Text.style.display='none'; Codehighlighter1_257_307_Closed_Image.style.display='inline'; Codehighlighter1_257_307_Closed_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_257_307_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_257_307_Closed_Text.style.display='none'; Codehighlighter1_257_307_Open_Image.style.display='inline'; Codehighlighter1_257_307_Open_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedBlock.gif" align="top" alt="" />            </span><span style="color: #0000ff">while</span><span style="color: #000000">((str </span><span style="color: #000000">=</span><span style="color: #000000"> br.readLine())</span><span style="color: #000000">!=</span><span style="color: #0000ff">null</span><span style="color: #000000">)</span><span id="Codehighlighter1_257_307_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.aygfsteel.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_257_307_Open_Text"><span style="color: #000000">{<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />                response </span><span style="color: #000000">=</span><span style="color: #000000">buffer.append(str).toString();<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" alt="" />            }</span></span></div> <br /> 2.String --->InputStream<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.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" /><span style="color: #000000">InputStream stream </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> ByteArrayInputStream(</span><span style="color: #000000">""</span><span style="color: #000000">.getBytes());</span></div> ByteArrayInputStream 是InputStream 的子c?br /> <img src ="http://www.aygfsteel.com/jzone/aggbug/311849.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/jzone/" target="_blank">Gavin.lee</a> 2010-02-03 22:15 <a href="http://www.aygfsteel.com/jzone/articles/311849.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java 堆与栈的详细介绍http://www.aygfsteel.com/jzone/articles/309598.htmlGavin.leeGavin.leeThu, 14 Jan 2010 15:10:00 GMThttp://www.aygfsteel.com/jzone/articles/309598.htmlhttp://yysct2005.javaeye.com/category/8938

Gavin.lee 2010-01-14 23:10 发表评论
]]>
HttpClient 一文?Q摘Q?/title><link>http://www.aygfsteel.com/jzone/articles/309594.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Thu, 14 Jan 2010 15:08:00 GMT</pubDate><guid>http://www.aygfsteel.com/jzone/articles/309594.html</guid><description><![CDATA[<p>原文出处--------http://hi.baidu.com/wader2006/blog/item/7e7b3a291f7801fd99250a91.html  </p> <p>虽然用telnetq样的程序都可把面取回来,但是在与web服务器的交互中,如果涉及(qing)cookie或https或ssl{内容,一般功能相对完备的http客户端还是非常必要的。IE或NetScape{浏览器实不错Q可是如果ؓ(f)实现持箋(hu)互动而在E序调用览器,我个为其中的工作量还是不的Q这q没考虑版权问题。最好的办法Q就是能有一个开源的包,能实现http客户端的功能Q供我们开发的E序调用?a >httpclient</a>是q么一个包Q我怿可能有比它的实现更好的,但目前我只关注这个。:(x)Q?br /> <a name="more">  下面是nogoop做的功能比较表:(x)<br /> </p> <table cellspacing="1" cellpadding="4" border="1"> <tbody> <tr> <td>Features</td> <td>nogoop</td> <td>Sun JRE < 1.4.2</td> <td>Sun JRE 1.4.2</td> <td>Innovation</td> <td>Apache/Jakarta</td> </tr> <tr> <td>cookies</td> <td> </td> <td> </td> <td> </td> <td>X</td> <td>X</td> </tr> <tr> <td>plug compatible</td> <td>X</td> <td>X</td> <td>X</td> <td>X</td> <td>[partial]</td> </tr> <tr> <td>true request output stream</td> <td> </td> <td> </td> <td> </td> <td>X</td> <td>X</td> </tr> <tr> <td>true response input stream</td> <td>X</td> <td> </td> <td> </td> <td>X</td> <td>X</td> </tr> <tr> <td>connection keep alive</td> <td>X</td> <td>X</td> <td>X</td> <td>X</td> <td>X</td> </tr> <tr> <td>connection pool throttling</td> <td>X</td> <td> </td> <td> </td> <td> </td> <td>X</td> </tr> <tr> <td>connection/request timeout</td> <td>X</td> <td> </td> <td>X [uns]</td> <td>X</td> <td>X</td> </tr> <tr> <td>idle connection timeout</td> <td>X</td> <td> </td> <td> </td> <td> </td> <td>X</td> </tr> <tr> <td>pipelining of requests</td> <td> </td> <td> </td> <td> </td> <td>X</td> <td> </td> </tr> <tr> <td>alternate DNS resolution (dnsjava)</td> <td>X</td> <td> </td> <td> </td> <td> </td> <td> </td> </tr> <tr> <td>SSL</td> <td>X</td> <td>X</td> <td>X</td> <td>X</td> <td>X</td> </tr> <tr> <td>basic authentication</td> <td>X</td> <td>X</td> <td>X</td> <td>X</td> <td>X</td> </tr> <tr> <td>digest authentication</td> <td>X</td> <td>X</td> <td>X</td> <td>X</td> <td>X</td> </tr> <tr> <td>NTLM authentication</td> <td>X</td> <td> </td> <td>[Windows only]</td> <td> </td> <td>X</td> </tr> <tr> <td>proxy authentication</td> <td>X</td> <td>X</td> <td>X</td> <td>X</td> <td>X</td> </tr> <tr> <td>minimum JRE version</td> <td>1.2</td> <td>1</td> <td>01q???/td> <td>1.2</td> <td>1.2</td> </tr> <tr> <td>price</td> <td>$499</td> <td>free</td> <td>free</td> <td>free</td> <td>free</td> </tr> <tr> <td>source available</td> <td>X</td> <td> </td> <td> </td> <td>X</td> <td>X</td> </tr> <tr> <td>diagnostic tracing</td> <td>X</td> <td> </td> <td> </td> <td>X</td> <td>X</td> </tr> <tr> <td>actively supported</td> <td>X</td> <td>X</td> <td>X</td> <td> </td> <td>X</td> </tr> <tr> <td>fix turnaround</td> <td>fast</td> <td>slow</td> <td>slow</td> <td>none</td> <td>medium</td> </tr> <tr> <td>license</td> <td>purchase</td> <td>Sun JRE</td> <td>Sun JRE</td> <td>LGPL</td> <td>Apache</td> </tr> </tbody> </table> <p> <h4>1、HttpClient的功?/h4> <ol> <li>Z标准Q纯正javaQ实C(jin)http1.0?.1? <li>在一个可扩展的OO框架内,实现?jin)HTTP的全部方?GET, POST, <br /> PUT, DELETE, HEAD, OPTIONS, and TRACE) <li>支持HTTPS(ssl上的HTTP)的加密操? <li>透明地穿qHTTP代理建立q接 <li>通过CONNECTҎ(gu)Q利用通过建立I过HTTP代理的HTTPSq接 <li>利用本地Java socketQ透明地穿qSOCKS(版本5?Q代理徏立连? <li>支持利用Basic、Digest和NTLM加密的认? <li>支持用于上传大文件的Multi-Part表单POSTҎ(gu) <li>插g式安全socket实现Q易于用第三方的解x(chng)? <li>q接理Q支持多U程应用Q支持设定单个主机总连接和最高连接数?自动(g)和关闭失效q接 <li>直接请求信息流送到服务器的端口 <li>直接d从服务器的端口送出的应{信? <li>支持HTTP/1.0中用KeepAlive和HTTP/1.1中用persistance讄的持久连? <li>直接讉K由服务器送出的应{代码和头部信息 <li>可设|连接超时时? <li>HttpMethods 实现Command PatternQ以允许q行h或高效连接复? <li>遵@the Apache Software License协议Q源码免费可?nbsp; </li> </ol> <h4>2、预备工?/h4> <p><br />   对jre1.3.*Q如果要HttpClient支持httpsQ则需要下载ƈ安装<a >jsse</a>?a >jce</a>.安装的步骤如下:(x)<br /> 1)下蝲jsse和jce.<br /> 2)(g)查CLASSPATH中没有与jsse和jce相关的jar?br /> 3)?US_export_policy.jar、local_policy.jar、jsse.jar、jnet.jar、jce1_2_x.jar、sunjce_provider.jar、jcert.jar复制到目录:(x)<br /> UNIX:$JDK_HOME/jre/lib/ext<br /> Windows:%JDK_HOME%\jre\lib\ext<br /> 4)修改下述目录下的java.security文g?br /> UNIX:$JDK_HOME/jre/lib/security/<br /> Windows:%JDK_HOME%\jre\lib\security\<br /> 5)</p> <div id="wmqeeuq" class="code">?br /> #<br /> # List of providers and their preference orders:<br /> #<br /> security.provider.1=sun.security.provider.Sun<br /> security.provider.2=com.sun.rsajca.Provider<br /> 改ؓ(f)Q?br /> #<br /> # List of providers and their preference orders:<br /> #<br /> security.provider.1=com.sun.crypto.provider.SunJCE<br /> security.provider.2=sun.security.provider.Sun<br /> security.provider.3=com.sun.rsajca.Provider<br /> security.provider.4=com.sun.net.ssl.internal.ssl.Provider</div> <p><br />   HttpClientq要求安装commons-loggingQ下面跟httpclient一块安装?/p> <h4>3、取得源?nbsp;</h4> <div id="wmqeeuq" class="code">cvs -d :pserver:anoncvs@cvs.apache.org:/home/cvspublic login<br /> password: anoncvs<br /> cvs -d :pserver:anoncvs@cvs.apache.org:/home/cvspublic checkout jakarta-commons/logging<br /> cvs -d :pserver:anoncvs@cvs.apache.org:/home/cvspublic checkout jakarta-commons/httpclient</div> <p><br />   ~译Q?/p> <div id="wmqeeuq" class="code">cd jakarta-commons/logging<br /> ant dist<br /> cp dis/*.jar ../httpclient/lib/<br /> cd ../httpclient<br /> ant dist</div> <p> </p> <h4>4、用HttpClient~程的基本步?nbsp;</h4> <ol> <li>创徏 HttpClient 的一个实? <li>创徏某个Ҏ(gu)QDeleteMethodQEntityEnclosingMethodQExpectContinueMethodQGetMethodQHeadMethodQMultipartPostMethodQOptionsMethodQPostMethodQPutMethodQTraceMethodQ的一个实例,一般可用要目标URL为参数? <li>?HttpClient 执行q个Ҏ(gu). <li>d应答信息. <li>释放q接. <li>处理应答. </li> </ol> <p><br />   在执行方法的q程中,有两U异常,一U是HttpRecoverableExceptionQ表C偶然性错误发生,一般再试可能成功,另一U是IOExceptionQ严重错误?br />   q儿有这个教E中的一个例E,可以<a >下蝲</a>?/p> <h4>5、认?/h4> <p><br />   HttpClient三种不同的认证方? Basic, Digest and NTLM. q些Ҏ(gu)可用于服务器或代理对客户端的认证Q简U服务器认证或代理认证?br /> 1)服务器认?Server Authentication)<br />   HttpClient处理服务器认证几乎是透明的,仅需要开发h员提供登录信?login credentials)。登录信息保存在HttpStatecȝ实例中,可以通过 setCredentials(String realm, Credentials cred)和getCredentials(String realm)来获取或讄。注意,讑֮寚w特定站点讉K所需要的d信息Q将realm参数|ؓ(f)null. HttpClient内徏的自动认证,可以通过HttpMethodcȝsetDoAuthentication(boolean doAuthentication)Ҏ(gu)关闭Q而且q次关闭只媄(jing)响HttpMethod当前的实例?br />   抢先认证(Preemptive Authentication)可以通过下述Ҏ(gu)打开.</p> <div id="wmqeeuq" class="code">client.getState().setAuthenticationPreemptive(true);</div> <p>  在这U模式时QHttpClient?x)主动将basic认证应答信息传给服务器,即在某U情况下服务器可能返回认证失败的应答Q这样做主要是ؓ(f)?jin)减连接的建立。ؓ(f)使每个新建的 HttpState实例都实行抢先认证,可以如下讄pȝ属性?/p> <div id="wmqeeuq" class="code">setSystemProperty(Authenticator.PREEMPTIVE_PROPERTY, "true");</div> <p><br /> Httpclient实现的抢先认证遵循rfc2617.<br /> 2)代理认证(proxy authentication)<br />   除了(jin)d信息需单独存放以外Q代理认证与服务器认证几乎一致。用 setProxyCredentials(String realm, Credentials cred)?getProxyCredentials(String realm)设、取d信息?br /> 3)认证Ҏ(gu)(authentication schemes)<br />   Basic<br />   是HTTP中规定最早的也是最兼容(?)的方案,遗憾的是也是最不安全的一个方案,因ؓ(f)它以明码传送用户名和密码。它要求一个UsernamePasswordCredentials实例Q可以指定服务器端的讉KI间或采用默认的d信息?br />   Digest<br />   是在HTTP1.1中增加的一个方案,虽然不如Basic得到的Y件支持多Q但q是有广泛的使用。DigestҎ(gu)比BasicҎ(gu)安全得多Q因它根本就不通过|络传送实际的密码Q传送的是利用这个密码对从服务器传来的一个随机数(nonce)的加密串。它要求一个UsernamePasswordCredentials实例Q可以指定服务器端的讉KI间或采用默认的d信息?br />   NTLM<br />   q是HttpClient支持的最复杂的认证协议。它M$设计的一个私有协议,没有公开的规范说明。一开始由于设计的~陷QNTLM的安全性比Digest差,后来l过一个ServicePack补丁后,安全性则比较Digest高。NTLM需要一个NTCredentials实例. 注意Q由于NTLM不用访问空?realms)的概念,HttpClient利用服务器的域名作访问空间的名字。还需要注意,提供lNTCredentials的用户名Q不要用域名的前~ - ? "adrian" 是正的Q?"DOMAIN\adrian" 则是错的.<br />   NTLM认证的工作机制与basic和digest有很大的差别。这些差别一般由HttpClient处理Q但理解q些差别有助避免在用NTLM认证时出现错误?/p> <ol> <li>从HttpClientAPI的角度来看,NTLM与其它认证方式一L(fng)工作Q差别是需要提?NTCredentials'实例而不?UsernamePasswordCredentials'(其实Q前者只是扩展了(jin)后? <li>对NTLM认证Q访问空间是q接到的机器的域名,q对多域名主Z(x)有一些麻?只有HttpClientq接中指定的域名才是认证用的域名。徏议将realm设ؓ(f)null以用默认的讄? <li>NTLM只是认证?jin)一个连接而不是一hQ所以每当一个新的连接徏立就要进行一ơ认证,且在认证的过E中保持q接是非帔R要的?因此QNTLM不能同时用于代理认证和服务器认证Q也不能用于http1.0q接或服务器不支持持久连接的情况?</li> </ol> <h4>6、重定向</h4> <p><br />   ׃技术限Ӟ以及(qing)Z?.0发布版API的稳定,HttpClientq(sh)能自动处重定向,但对重定向到同一L、同一端口且采用同一协议的情况HttpClient可以支持。不能自动的处理的情况,包括需要h工交互的情况Q或出httpclient的能力?br />   当服务器重定向指令指C同的LӞHttpClient只是单地重定向状态码作ؓ(f)应答状态。所有的300?99Q包含两端)(j)的返回码Q都表示是重定向应答。常见的有:(x)</p> <ol> <li>301 怹Ud. HttpStatus.SC_MOVED_PERMANENTLY <li>302 临时Ud. HttpStatus.SC_MOVED_TEMPORARILY <li>303 See Other. HttpStatus.SC_SEE_OTHER <li>307 临时重定? HttpStatus.SC_TEMPORARY_REDIRECT </li> </ol> <p><br />   当收到简单的重定向时Q程序应从HttpMethod对象中抽取新的URLq将其下载。另?限制一下重定向ơ数是个好的LQ这可以避免递归循环。新的URL可以从头字段Location中抽取,如下Q?/p> <div id="wmqeeuq" class="code">String redirectLocation;<br /> Header locationHeader = method.getResponseHeader("location");<br /> if (locationHeader != null) {<br /> redirectLocation = locationHeader.getValue();<br /> } else {<br /> // The response is invalid and did not provide the new location for<br /> // the resource. Report an error or possibly handle the response<br /> // like a 404 Not Found error.<br /> }</div> <p><br /> Ҏ(gu)重定向:(x)</p> <ol> <li>300 多重选择. HttpStatus.SC_MULTIPLE_CHOICES <li>304 没有改动. HttpStatus.SC_NO T_MODIFIED <li>305 使用代理. HttpStatus.SC_USE_PROXY   </li> </ol> <h4>7、字W编?character encoding)</h4> <p><br />   一个HTTP协议的请求或应答的头?在http协议中,数据包分Z部分Q一部分是头部,׃些名值对构成Q一部分是主?body)Q是真正传办理的数据Q如HTML面{)(j)Q,必须以US-ASCII~码Q这是因为头部不传数据而只描述被要传输的数据的一些信息,一个例外是cookieQ它是数据但是通过头部q行传输的,所以它也要用US-ASCII~码?br />   HTTP数据包的M部分Q可以用M一U方式进行编码,默认是ISO-8859-1Q具体可以用头部字段Content-Type指定。可以利?addRequestHeaderҎ(gu)Q设定编码方式;?getResponseCharSet取得~码方式。对HTML或XML{类型的文档Q它们的本n的Content-Type也可以指定编码方式,主要区分两者的作用范围以得到正实的解码?br />   URL的编码标准,由RFC1738指定为,只能是由可打??字节的us-ascii字符l成Q?0-ff不是us-ascii字符Q?0-1F是控制字W,q两个区域中用的字符都须加以~码(encoded)?br />   </p> <h4>8、Cookies</h4> <p><br />    HttpClient能自动管理cookie,包括允许服务器设|cookieq在需要的时候自动将cookieq回服务器,它也支持手工讄cookie后发送到服务器端。不q的是,对如何处理cookieQ有几个规范互相冲突QNetscape Cookie 草案, RFC2109, RFC2965Q而且q有很大数量的Y件商的cookie实现不遵循Q何规? Z(jin)处理q种状况QHttpClient提供?jin)策略驱动的cookie理方式。HttpClient支持的cookie规范有:(x)</p> <ol> <li><a >Netscape cookie草案</a>Q是最早的cookie规范Q基于rfc2109。尽这个规范与rc2109有较大的差别Q这样做可以与一些服务器兼容? <li><a title="cookie specification" >rfc2109</a>Q是w3c发布的第一个官方cookie规范。理ZԌ所有的服务器在处理cookie(版本1)Ӟ都要遵@此规范,正因如此QHttpClient其设ؓ(f)默认的规范。遗憄是,q个规范太严g(jin)Q以致很多服务器不正的实施?jin)该规范或仍在作用Netscape规范。在q种情况下,应用兼容规范? <li>兼容性规范,设计用来兼容可能多的服务器Q即使它们ƈ没有遵@标准规范。当解析cookie出现问题Ӟ应考虑采用兼容性规范?</li> </ol> <p><br />    RFC2965规范暂时没有被HttpClient支持Q在以后的版本ؓ(f)?x)加上?j)Q它定义?jin)cookie版本2Qƈ说明?jin)版?cookie的不IRFC2965有意有久取代rfc2109.<br />   在HttpClient中,有两U方法来指定cookie规范的用,</p> <ol> <li> <div id="wmqeeuq" class="code">HttpClient client = new HttpClient();<br /> client.getState().setCookiePolicy(CookiePolicy.COMPATIBILITY);</div> q种Ҏ(gu)讄的规范只对当前的HttpState有效Q参数可取值CookiePolicy.COMPATIBILITYQCookiePolicy.NETSCAPE_DRAFT或CookiePolicy.RFC2109? <li> <div id="wmqeeuq" class="code">System.setProperty("apache.commons.httpclient.cookiespec", "COMPATIBILITY");</div> 此法指的规范Q对以后每个新徏立的HttpState对象都有效,参数可取?COMPATIBILITY","NETSCAPE_DRAFT"?RFC2109"?br />   常有不能解析cookie的问题,但更换到兼容规范大都能解冟?</li> </ol> <p>  </p> <h4>9、用HttpClient遇到问题怎么? </h4> <ol> <li>用一个浏览器讉K服务器,以确认服务器应答正常 <li>如果在代理Q关掉代理试? <li>另找一个服务器来试试(如果q行着不同的服务器软g更好Q? <li>(g)查代码是否按教程中讲的思\~写 <li>讄logU别为debugQ找出问题出现的原因 <li>打开wiretraceQ来q踪客户端与服务器的通信Q以实问题出现在什么地? <li>用telnet或netcat手工信息发送到服务器,适合于猜已l找C(jin)原因而进行试验时 <li>netcat以监听方式运行,用作服务器以(g)查httpclient如何处理应答的? <li>利用最新的httpclient试试Qbug可能在最新的版本中修复了(jin) <li>向邮件列表求帮助 <li>向bugzilla报告bug.   </li> </ol> <h4>10、SSL</h4> <p><br />   借助Java Secure Socket Extension (JSSE)QHttpClient全面支持Secure Sockets Layer (SSL)或IETF Transport Layer Security (TLS)协议上的HTTP。JSSE已经jre1.4?qing)以后的版本中,以前的版本则需要手工安装设|,具体q程参见<a >Sun|站</a>或本学习(fn)W记?br />   HttpClient中用SSL非常单,参考下面两个例?</p> <div id="wmqeeuq" class="code">HttpClient httpclient = new HttpClient();<br /> GetMethod httpget = new GetMethod("https://www.verisign.com/"); <br /> httpclient.executeMethod(httpget);<br /> System.out.println(httpget.getStatusLine().toString());</div> <p>Q如果通过需要授权的代理Q则如下Q?/p> <div id="wmqeeuq" class="code">HttpClient httpclient = new HttpClient();<br /> httpclient.getHostConfiguration().setProxy("myproxyhost", 8080);<br /> httpclient.getState().setProxyCredentials("my-proxy-realm", " myproxyhost",<br /> new UsernamePasswordCredentials("my-proxy-username", "my-proxy-password"));<br /> GetMethod httpget = new GetMethod("https://www.verisign.com/"); <br /> httpclient.executeMethod(httpget);<br /> System.out.println(httpget.getStatusLine().toString());</div> <p><br />   在HttpClient中定制SSL的步骤如下:(x)</p> <ol> <li>提供?jin)一个实C(jin)org.apache.commons.httpclient.protocol.SecureProtocolSocketFactory接口的socket factory。这?socket factory负责打一个到服务器的端口Q用标准的或第三方的SSL函数库,q进行象q接握手{初始化操作。通常情况下,q个初始化操作在端口被创建时自动q行的? <li>实例化一个org.apache.commons.httpclient.protocol.Protocol对象。创个实例时Q需要一个合法的协议cd(如https)Q一个定制的socket factoryQ和一个默认的端中?如https?43端口). <div id="wmqeeuq" class="code">Protocol myhttps = new Protocol("https", new MySSLSocketFactory(), 443);</div> 然后Q这个实例可被设|ؓ(f)协议的处理器? <div id="wmqeeuq" class="code">HttpClient httpclient = new HttpClient();<br /> httpclient.getHostConfiguration().setHost("www.whatever.com", 443, myhttps);<br /> GetMethod httpget = new GetMethod("/");<br /> httpclient.executeMethod(httpget);</div> <li>通过调用Protocol.registerProtocolҎ(gu)Q将此定制的实例Q注册ؓ(f)某一特定协议的默认的处理器。由此,可以很方便地定制自己的协议类?如myhttps)? <div id="wmqeeuq" class="code">Protocol.registerProtocol("myhttps", <br /> new Protocol("https", new MySSLSocketFactory(), 9443));<br /> ...<br /> HttpClient httpclient = new HttpClient();<br /> GetMethod httpget = new GetMethod("myhttps://www.whatever.com/");<br /> httpclient.executeMethod(httpget);</div> 如果想用自己定制的处理器取代https默认的处理器Q只需要将其注册ؓ(f)"https"卛_? <div id="wmqeeuq" class="code">Protocol.registerProtocol("https", <br /> new Protocol("https", new MySSLSocketFactory(), 443));<br /> HttpClient httpclient = new HttpClient();<br /> GetMethod httpget = new GetMethod("https://www.whatever.com/");<br /> httpclient.executeMethod(httpget);</div> </li> </ol> <p><br />   已知的限制和问题</p> <ol> <li>持箋(hu)的SSLq接在Sun的低?.4JVM上不能工作,q是׃JVM的bug造成? <li>通过代理讉K服务器时Q非抢先认证Q?Non-preemptive authenticationQ会(x)p|Q这是由于HttpClient的设计缺陷造成的,以后的版本中?x)修攏V?</li> </ol> <p><br />   遇到问题的处?br />   很多问题Q特别是在jvm低于1.4Ӟ是由jsse的安装造成的?br />   下面的代码,可作为最l的(g)手Dc(din)?/p> <div id="wmqeeuq" class="code">import java.io.BufferedReader;<br /> import java.io.InputStreamReader;<br /> import java.io.OutputStreamWriter;<br /> import java.io.Writer;<br /> import java.net.Socket; import javax.net.ssl.SSLSocketFactory; public class Test {<br /> <br /> public static final String TARGET_HTTPS_SERVER = "www.verisign.com"; <br /> public static final int TARGET_HTTPS_PORT = 443; <br /> <br /> public static void main(String[] args) throws Exception {<br /> <br /> Socket socket = SSLSocketFactory.getDefault().<br /> createSocket(TARGET_HTTPS_SERVER, TARGET_HTTPS_PORT);<br /> try {<br /> Writer out = new OutputStreamWriter(<br /> socket.getOutputStream(), "ISO-8859-1");<br /> out.write("GET / HTTP/1.1\r\n"); <br /> out.write("Host: " + TARGET_HTTPS_SERVER + ":" + <br /> TARGET_HTTPS_PORT + "\r\n"); <br /> out.write("Agent: SSL-TEST\r\n"); <br /> out.write("\r\n"); <br /> out.flush(); <br /> BufferedReader in = new BufferedReader(<br /> new InputStreamReader(socket.getInputStream(), "ISO-8859-1"));<br /> String line = null;<br /> while ((line = in.readLine()) != null) {<br /> System.out.println(line);<br /> }<br /> } finally {<br /> socket.close(); <br /> }<br /> }<br /> }</div> <p>1、httpclient的多U程处理</p> <p><br />   使用多线E的主要目的Q是Z(jin)实现q行的下载。在httpclientq行的过E中Q每个http协议的方法,使用一个HttpConnection实例。由于连接是一U有限的资源Q每个连接在某一时刻只能供一个线E和Ҏ(gu)使用Q所以需要确保在需要时正确地分配连接。HttpClient采用?jin)一U类似jdbcq接池的Ҏ(gu)来管理连接,q个理工作?MultiThreadedHttpConnectionManager完成?/p> <div id="wmqeeuq" class="code">MultiThreadedHttpConnectionManager connectionManager = <br /> new MultiThreadedHttpConnectionManager();<br /> HttpClient client = new HttpClient(connectionManager);</div> <p>此是Qclient可以在多个线E中被用来执行多个方法。每ơ调用HttpClient.executeMethod() Ҏ(gu)Q都?x)去链接理器申请一个连接实例,甌成功q个链接实例被签?checkout)Q随之在链接使用完后必须归还理器。管理器支持两个讄Q?</p> <table border="1"> <tbody> <tr> <td>maxConnectionsPerHost</td> <td>每个L的最大ƈ行链接数Q默认ؓ(f)2</td> </tr> <tr> <td>maxTotalConnections</td> <td>客户端dƈ行链接最大数Q默认ؓ(f)20</td> </tr> </tbody> </table> <br />   理器重新利用链接时Q采取早归还者先重用的方式(least recently used approachQ?br />   ׃是用HttpClient的程序而不是HttpClient本n来读取应{包的主体,所以HttpClient无法军_什么时间连接不再用了(jin)Q这也就要求在读完应{包的主体后必须手工昑ּ地调用releaseConnection()来释攄L(fng)链接? <p> <div id="wmqeeuq" class="code">MultiThreadedHttpConnectionManager connectionManager = new MultiThreadedHttpConnectionManager();<br /> HttpClient client = new HttpClient(connectionManager);<br /> ...<br /> // 在某个线E中?br /> GetMethod get = new GetMethod("http://jakarta.apache.org/");<br /> try {<br /> client.executeMethod(get);<br /> // print response to stdout<br /> System.out.println(get.getResponseBodyAsStream());<br /> } finally {<br /> // be sure the connection is released back to the connection <br /> // manager<br /> get.releaseConnection();<br /> }</div> <p>Ҏ(gu)一个HttpClient.executeMethodL一个method.releaseConnection()与之匚w.</p> <h4>12、HTTPҎ(gu)</h4> <p><br />   HttpClient支持的HTTPҎ(gu)?U,下面分述之?br /> <br />   1、Options<br /> <br />   HTTPҎ(gu)Options用来向服务器发送请求,希望获得针对p求URL(request url)标志的资源在h/应答的通信q程可以使用的功能选项。通过q个Ҏ(gu)Q客L(fng)可以在采取具体行动之前,可Ҏ(gu)一资源军_采取什么动作和/或以?qing)一些必要条Ӟ或者了(jin)解服务器提供的功能。这个方法最典型的应用,是用来获取服务器支持哪些HTTPҎ(gu)?br />   HttpClient中有一个类叫OptionsMethodQ来支持q个HTTPҎ(gu)Q利用这个类的getAllowedMethodsҎ(gu)Q就可以很简单地实现上述的典型应用?/p> <div id="wmqeeuq" class="code">OptionsMethod options = new OptionsMethod("http://jakarta.apache.org");<br /> // 执行Ҏ(gu)q做相应的异常处?br /> ...<br /> Enumeration allowedMethods = options.getAllowedMethods();<br /> options.releaseConnection();</div> <p><br />   2、Get<br /> <br />    HTTPҎ(gu)GET用来取回hURIQrequest-URIQ标志的M信息Q以实体(entity)的Ş式)(j)Q?get"q个单词本意是”获取“的意思。如果请求URI指向的一个数据处理过E,那这个过E生成的数据Q在应答中以实体的Ş式被q回Q而不是将q个q程的代码的q回?br />   如果HTTP包中含有If-ModifiedSince, If-Unmodified-Since, If-Match, If-None-Match, ?If-Range{头字段Q则GET也就变成?#8221;条gGET“Q即只有满上述字段描述的条件的实体才被取回Q这样可以减一些非必需的网l传输,或者减ؓ(f)获取某一资源的多ơ请求(如第一ơ检查,W二ơ下载)(j)。(一般的览器,都有一个(f)时目录,用来~存?sh)些网信息,当再ơ浏览某个页面的时候,只下载那些修改过的内容,以加快浏览速度Q就是这个道理。至于检查,则常用比GET更好的方法HEAD来实现。)(j)如果HTTP包中含有Range头字D,那么hURI指定的实体中Q只有决定范围条件的那部分才被取回来。(用过多线E下载工L(fng)朋友Q可能比较容易理解这一点)(j)<br />   q个Ҏ(gu)的典型应用,用来从web服务器下载文档。HttpClient定义?jin)一个类叫GetMethod来支持这个方法,用GetMethodcMgetResponseBody, getResponseBodyAsStream ?getResponseBodyAsString函数可以取到应{包包体中的文档Q如HTML面Q信息。这q三个函CQgetResponseBodyAsStream通常是最好的Ҏ(gu)Q主要是因ؓ(f)它可以避免在处理下蝲的文档之前缓存所有的下蝲的数据?/p> <div id="wmqeeuq" class="code">GetMethod get = new GetMethod("http://jakarta.apache.org");<br /> // 执行Ҏ(gu)Qƈ处理p|的请?<br /> ...<br /> InputStream in = get.getResponseBodyAsStream();<br /> // 利用输入来处理信息?br /> get.releaseConnection();</div> <p><br />   对GetMethod的最常见的不正确的用,是没有将全部的应{主体的数据d来。还有,必须注意要手工明地链接释放?br /> <br />   3、Head<br /> <br />   HTTP的HeadҎ(gu)Q与GetҎ(gu)完全一_(d)唯一的差别是服务器不能在应答包中包含M(message-body)Q而且一定不能包含主体。用这个方法,可以使得客户无需资源下载回可׃得到一些关于它的基本信息。这个方法常用来(g)查超铄可访问性以?qing)资源最q有没有被修攏V?br />   HTTP的headҎ(gu)最典型的应用,是获取资源的基本信息。HttpClient定义?jin)HeadMethodcL持这个方法,HeadMethodcM其它*MethodcMP?getResponseHeaders()取回头部信息Q而没有自qҎ(gu)Ҏ(gu)?/p> <div id="wmqeeuq" class="code">HeadMethod head = new HeadMethod("http://jakarta.apache.org");<br /> // 执行Ҏ(gu)Qƈ处理p|的请?<br /> ...<br /> // 取回应答包的头字D信?<br /> Header[] headers = head.getResponseHeaders(); // 只取回最后修Ҏ(gu)期字D늚信息.<br /> String lastModified = head.getResponseHeader("last-modified").getValue();</div> <p><br /> <br />   4、Post<br /> <br />   Post在英文有“zN”的意思,HTTPҎ(gu)POST是要求服务器接受请求包中的实体Qƈ其作ؓ(f)hURI的下属资源。从本质上说Q这意味着服务器要保存q个实体信息Q而且通常由服务器端的E序q行处理。PostҎ(gu)的设计意图,是要以一U统一的方式实C列功能:(x)</p> <ol> <li>对已有的资源做评? <li>信息发布到BBS、新ȝ、邮件列表,或类似的文章l中 <li>一块数据,提交l数据处理进E? <li>通过q加操作Q来扩展一个数据库 </li> </ol> <p>  q些都操作期待着在服务器端生一定的“副作?#8221;Q如修改?jin)数据库{?br />   HttpClient定义PostMethodcM支持该HTTPҎ(gu)Q在httpclient中,使用postҎ(gu)有两个基本的步骤Qؓ(f)h包准备数据,然后d服务器来的应{包的信息。通过调用 setRequestBody()函数Q来求包提供数据Q它可以接收三类参数Q输入流、名值对数组或字W串。至于读取应{包需要调?getResponseBody* 那一pd的方法,与GETҎ(gu)处理应答包的Ҏ(gu)相同?br />   常见问题是,没有全部应{读取(无论它对E序是否有用Q,或没有释N接资源?/p> <img src ="http://www.aygfsteel.com/jzone/aggbug/309594.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/jzone/" target="_blank">Gavin.lee</a> 2010-01-14 23:08 <a href="http://www.aygfsteel.com/jzone/articles/309594.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java List 分页应用Q二Q?/title><link>http://www.aygfsteel.com/jzone/articles/308885.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Sat, 09 Jan 2010 18:22:00 GMT</pubDate><guid>http://www.aygfsteel.com/jzone/articles/308885.html</guid><description><![CDATA[     摘要: 应用c:(x) package com.Gavin.tools.util; import java.util.*; /** *//**  * 为List分页  * 样式比较单,适合WAP使用Q直接输出页码到面  */ public class PagerUtil {...  <a href='http://www.aygfsteel.com/jzone/articles/308885.html'>阅读全文</a><img src ="http://www.aygfsteel.com/jzone/aggbug/308885.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/jzone/" target="_blank">Gavin.lee</a> 2010-01-10 02:22 <a href="http://www.aygfsteel.com/jzone/articles/308885.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java List 分页应用Q一Q?/title><link>http://www.aygfsteel.com/jzone/articles/308842.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Sat, 09 Jan 2010 06:35:00 GMT</pubDate><guid>http://www.aygfsteel.com/jzone/articles/308842.html</guid><description><![CDATA[     摘要: 应用c:(x) package com.Gavin.tools.util; /** *//**    * List分页  * 实现Q利用List的获取子ListҎ(gu)Q实现对List的分? * @author 显武  * @date 2010-1-8...  <a href='http://www.aygfsteel.com/jzone/articles/308842.html'>阅读全文</a><img src ="http://www.aygfsteel.com/jzone/aggbug/308842.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/jzone/" target="_blank">Gavin.lee</a> 2010-01-09 14:35 <a href="http://www.aygfsteel.com/jzone/articles/308842.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java 有效的防止SQL注入http://www.aygfsteel.com/jzone/articles/307959.htmlGavin.leeGavin.leeThu, 31 Dec 2009 16:38:00 GMThttp://www.aygfsteel.com/jzone/articles/307959.html归纳一下,主要有以下几点:(x)
1.永远不要信Q用户的输入。对用户的输入进行校验,可以通过正则表达式,或限刉度;对单引号和双"-"q行转换{?
2.永远不要使用动态拼装sqlQ可以用参数化的sql或者直接用存储过E进行数据查询存取?
3.永远不要使用理员权限的数据库连接,为每个应用用单独的权限有限的数据库q接?
4.不要把机密信息直接存放,加密或者hash掉密码和敏感的信息?
5.应用的异怿息应该给出尽可能的提示Q最好用自定义的错误信息对原始错误信息q行包装?

参考:(x)
http://msdn.microsoft.com/en-us/magazine/cc163917.aspx
http://www.unixwiz.net/techtips/sql-injection.html
http://www.nextgenss.com/papers/more_advanced_sql_injection.pdf
http://www.securiteam.com/securityreviews/5DP0N1P76E.html
http://xkcd.com/327/
http://ferruh.mavituna.com/makale/sql-injection-cheatsheet/


http://bbs.xiakexing.com/cgi-bin/topic.cgi?forum=34&topic=18&show=0
http://www.cnblogs.com/iloveu/archive/2009/03/17/1414145.html
http://dang.javaeye.com/blog/338367



Gavin.lee 2010-01-01 00:38 发表评论
]]>
java clonehttp://www.aygfsteel.com/jzone/articles/307738.htmlGavin.leeGavin.leeWed, 30 Dec 2009 04:27:00 GMThttp://www.aygfsteel.com/jzone/articles/307738.htmlhttp://lavasoft.blog.51cto.com/62575/43480

Gavin.lee 2009-12-30 12:27 发表评论
]]>
Java 序列化与反序列化http://www.aygfsteel.com/jzone/articles/307577.htmlGavin.leeGavin.leeMon, 28 Dec 2009 16:39:00 GMThttp://www.aygfsteel.com/jzone/articles/307577.htmlhttp://blog.csdn.net/longronglin/archive/2009/02/09/3871682.aspx

Gavin.lee 2009-12-29 00:39 发表评论
]]>
Junit 单元试http://www.aygfsteel.com/jzone/articles/307576.htmlGavin.leeGavin.leeMon, 28 Dec 2009 16:38:00 GMThttp://www.aygfsteel.com/jzone/articles/307576.htmlhttp://blog.csdn.net/longronglin/archive/2008/04/15/2295237.aspx

Gavin.lee 2009-12-29 00:38 发表评论
]]>
压羃 XML 文g以便有效C?/title><link>http://www.aygfsteel.com/jzone/articles/307561.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Mon, 28 Dec 2009 13:32:00 GMT</pubDate><guid>http://www.aygfsteel.com/jzone/articles/307561.html</guid><description><![CDATA[<a >http://www.ibm.com/developerworks/cn/xml/x-tipcomp.html</a> <img src ="http://www.aygfsteel.com/jzone/aggbug/307561.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/jzone/" target="_blank">Gavin.lee</a> 2009-12-28 21:32 <a href="http://www.aygfsteel.com/jzone/articles/307561.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java ClassLoader cd载的学习(fn)http://www.aygfsteel.com/jzone/articles/307447.htmlGavin.leeGavin.leeSun, 27 Dec 2009 11:51:00 GMThttp://www.aygfsteel.com/jzone/articles/307447.html

Gavin.lee 2009-12-27 19:51 发表评论
]]>
使用 XStream ?JavaBean ?XML/JSON 之间怺转换Q摘Q?/title><link>http://www.aygfsteel.com/jzone/articles/307446.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Sun, 27 Dec 2009 11:40:00 GMT</pubDate><guid>http://www.aygfsteel.com/jzone/articles/307446.html</guid><description><![CDATA[<a href="http://www.aygfsteel.com/Unmi/archive/2009/08/11/290710.html">http://www.aygfsteel.com/Unmi/archive/2009/08/11/290710.html</a> <img src ="http://www.aygfsteel.com/jzone/aggbug/307446.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/jzone/" target="_blank">Gavin.lee</a> 2009-12-27 19:40 <a href="http://www.aygfsteel.com/jzone/articles/307446.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用java构徏http服务器(摘)(j)http://www.aygfsteel.com/jzone/articles/307398.htmlGavin.leeGavin.leeSat, 26 Dec 2009 16:12:00 GMThttp://www.aygfsteel.com/jzone/articles/307398.html阅读全文

Gavin.lee 2009-12-27 00:12 发表评论
]]>
java 实现URL重写http://www.aygfsteel.com/jzone/articles/307331.htmlGavin.leeGavin.leeFri, 25 Dec 2009 17:56:00 GMThttp://www.aygfsteel.com/jzone/articles/307331.html

Gavin.lee 2009-12-26 01:56 发表评论
]]>
HttpsURLConnection 安全传输QHTTPS--Secure Hypertext Transfer Protocol-安全文本传输协议)(j)http://www.aygfsteel.com/jzone/articles/307329.htmlGavin.leeGavin.leeFri, 25 Dec 2009 16:56:00 GMThttp://www.aygfsteel.com/jzone/articles/307329.html阅读全文

Gavin.lee 2009-12-26 00:56 发表评论
]]>
Map<K, V> 遍历http://www.aygfsteel.com/jzone/articles/306869.htmlGavin.leeGavin.leeTue, 22 Dec 2009 01:21:00 GMThttp://www.aygfsteel.com/jzone/articles/306869.htmlpackage com.Gavin.tools.util;

import java.util.Hashtable;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

/**  
 * 
@author Gavin.lee  
 * @date 2009-05-04 11:45am
 * 
@param <K>  
 * 
@param <V>  
 
*/

public class MapUtil<K, V> {
    
    
public void filter1(Map map) {
        Iterator it 
= map.entrySet().iterator();
        
while (it.hasNext()) {
            Map.Entry me 
= (Map.Entry) it.next();
            System.out.println(
"key:" + me.getKey() + ",value:" + me.getValue());
        }

        System.out.println(
"************************************filter1");
    }


    
public void filter2(Map map) {
        Hashtable
<String, String> ht = new Hashtable<String, String>();
        ht.put(
"Gavin""Kathy");
        ht.put(
"杨过""龙?/span>");
        
        
for (Map.Entry<String, String> me : ht.entrySet()) {
            System.out.println(
"key:" + me.getKey() + ",value:" + me.getValue());
        }

        System.out.println(
"************************************filter2");
    }


    
public void filter3(Map map) {
        Iterator it 
= map.keySet().iterator();
        
while (it.hasNext()) {
            String key;
            key 
= (String) it.next();
            System.out.println(
"key:" + key + ",value:" + map.get(key));
        }

        System.out.println(
"************************************filter3");
    }


    
public void filter4(Map map) {
        
for (Object o : map.keySet()) {
            System.out.println(
"key:" + o + ",value:" + map.get(o));
        }

        System.out.println(
"************************************filter4");
    }

    
    
/**  
     * 获得Map中特定value的key?nbsp;    
     * 
@param map  
     * 
@param value  
     * 
@return  
     
*/

    
public K getMapKeyFromValue(Map<K, V> map, V value) {
        Set set 
= map.keySet();
        K key 
= null;
        Iterator it 
= set.iterator();
        
while (it.hasNext()) {
            key 
= (K) it.next();
            
if (value.equals(map.get(key))) {
                
return key;
            }

        }

        
return null;
    }


}



Gavin.lee 2009-12-22 09:21 发表评论
]]>
Apache Common HttpClient的?/title><link>http://www.aygfsteel.com/jzone/articles/305967.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Mon, 14 Dec 2009 14:38:00 GMT</pubDate><guid>http://www.aygfsteel.com/jzone/articles/305967.html</guid><description><![CDATA[     摘要: HttpClient ?Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客L(fng)~程工具包,q且它支?HTTP 协议最新的版本和徏议?HTTP 协议可能是现?Internet 上用得最多、最重要的协议了(jin)Q越来越多的 Java 应用E序需要直接通过 HTTP 协议来访问网l资源。虽然在 JDK ?java.net 包中?..  <a href='http://www.aygfsteel.com/jzone/articles/305967.html'>阅读全文</a><img src ="http://www.aygfsteel.com/jzone/aggbug/305967.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/jzone/" target="_blank">Gavin.lee</a> 2009-12-14 22:38 <a href="http://www.aygfsteel.com/jzone/articles/305967.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Apache commons 各种lgQ摘Q?/title><link>http://www.aygfsteel.com/jzone/articles/305966.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Mon, 14 Dec 2009 14:36:00 GMT</pubDate><guid>http://www.aygfsteel.com/jzone/articles/305966.html</guid><description><![CDATA[<p>原文Q?a href="http://www.aygfsteel.com/fatbear/archive/2007/05/23/119346.html">http://www.aygfsteel.com/fatbear/archive/2007/05/23/119346.html</a> <strong><br /> Apache Commons </strong><font size="2">是一个非常有用的工具包,解决各种实际的通用问题Q你?x)发现它们正是你冥思苦x(chng)需?br /> <br /> 的东ѝ它们不是绝世武功,但确是个随手可用的擒拿手QCommons一出,问题手到擒来?/font></p> <p><font size="2">下面是一个全面的q表Q?/font></p> <p> <table cellspacing="0" cellpadding="0" width="80%" border="1"> <tbody> <tr> <td> <p align="left"><font size="2"><strong>lg</strong></font></p> </td> <td><font size="2"><strong>说明</strong></font></td> </tr> <tr> <td width="100"><font size="2"><strong>BeanUtils</strong></font></td> <td><font size="2">Commons-BeanUtils 提供?Java 反射和自省API的包?/font></td> </tr> <tr> <td><font size="2"><strong>Betwixt</strong></font></td> <td><font size="2">Betwixt提供?JavaBean 映射?XML 文档Q以?qing)相反映的服?</font></td> </tr> <tr> <td> <p align="left"><font size="2"><strong>Chain</strong></font></p> </td> <td> <p align="left"><font size="2">Chain 提供实现l织复杂的处理流E的“责Q链模?#8221;.</font></p> </td> </tr> <tr> <td> <p align="left"><font size="2"><strong>CLI</strong></font></p> </td> <td> <p align="left"><font size="2">CLI 提供针对命o(h)行参敎ͼ选项Q选项l,强制选项{的单API.</font></p> </td> </tr> <tr> <td> <p align="left"><font size="2"><strong>Codec</strong> </font></p> </td> <td> <p align="left"><font size="2">Codec 包含一些通用的编码解码算法。包括一些语音编码器Q?Hex, Base64, 以及(qing)URL encoder.</font></p> </td> </tr> <tr> <td> <p align="left"><font size="2"><strong>Collections</strong> </font></p> </td> <td> <p align="left"><font size="2">Commons-Collections 提供一个类包来扩展和增加标准的 Java Collection框架</font></p> </td> </tr> <tr> <td> <p align="left"><font size="2"><strong>Configuration</strong></font></p> </td> <td> <p align="left"><font size="2">Commons-Configuration 工具对各U各式的配置和参考文件提供读取帮? </font></p> </td> </tr> <tr> <td> <p align="left"><font size="2"><strong>Daemon</strong></font></p> </td> <td> <p align="left"><font size="2">一U?unix-daemon-like java 代码的替代机?/font></p> </td> </tr> <tr> <td> <p align="left"><font size="2"><strong>DBCP</strong> </font></p> </td> <td> <p align="left"><font size="2">Commons-DBCP 提供数据库连接池服务 </font></p> </td> </tr> <tr> <td> <p align="left"><font size="2"><strong>DbUtils</strong> </font></p> </td> <td> <p align="left"><font size="2">DbUtils 是一?JDBC helper cdQ完成数据库d的简单的资源清除代码. </font></p> </td> </tr> <tr> <td> <p align="left"><font size="2"><strong>Digester</strong> </font></p> </td> <td> <p align="left"><font size="2">Commons-Digester 是一?XML-Java对象的映工P用于解析 XML配置文g. </font></p> </td> </tr> <tr> <td> <p align="left"><font size="2"><strong>Discovery</strong></font></p> </td> <td><font size="2">Commons-Discovery 提供工具来定位资?(包括c? Q通过使用各种模式来映服?引用名称和资源名U?</font></td> </tr> <tr> <td> <p align="left"><font size="2"><strong>EL</strong> </font></p> </td> <td> <p align="left"><font size="2">Commons-EL 提供在JSP2.0规范中定义的EL表达式的解释?</font></p> </td> </tr> <tr> <td> <p align="left"><font size="2"><strong>FileUpload</strong> </font></p> </td> <td> <p align="left"><font size="2">FileUpload 使得在你可以在应用和Servlet中容易的加入强大和高性能的文件上传能?</font></p> </td> </tr> <tr> <td> <p align="left"><font size="2"><strong>HttpClient</strong></font></p> </td> <td> <p align="left"><font size="2">Commons-HttpClient 提供?jin)可以工作于HTTP协议客户端的一个框?</font></p> </td> </tr> <tr> <td> <p align="left"><font size="2"><strong>IO</strong></font></p> </td> <td> <p align="left"><font size="2">IO 是一?I/O 工具?</font></p> </td> </tr> <tr> <td> <p align="left"><font size="2"><strong>Jelly</strong></font></p> </td> <td><font size="2">Jelly是一个基?XML 的脚本和处理引擎?Jelly 借鉴?JSP 定指标签QVelocity, Cocoon和Xdoclet中的脚本引擎的许多优炏VJelly 可以用在命o(h)行, Ant 或?Servlet之中.</font></td> </tr> <tr> <td> <p align="left"><font size="2"><strong>Jexl</strong></font></p> </td> <td><font size="2">Jexl是一个表辑ּ语言Q通过借鉴来自于Velocity的经验扩展了(jin)JSTL定义的表辑ּ语言. </font></td> </tr> <tr> <td> <p align="left"><font size="2"><strong>JXPath</strong></font></p> </td> <td><font size="2">Commons-JXPath 提供?jin)用Xpath语法操纵W合Javacd名规范的 JavaBeans的工兗也支持 maps, DOM 和其他对象模? </font></td> </tr> <tr> <td> <p align="left"><font size="2"><strong>Lang</strong></font></p> </td> <td> <p align="left"><font size="2">Commons-Lang 提供?jin)许多许多通用的工L(fng)集,提供?jin)一些java.lang中类的扩展功?</font></p> </td> </tr> <tr> <td> <p align="left"><font size="2"><strong>Latka</strong></font></p> </td> <td> <p align="left"><font size="2">Commons-Latka 是一个HTTP 功能试包,用于自动化的QA,验收和衰减测?</font></p> </td> </tr> <tr> <td> <p align="left"><font size="2"><strong>Launcher</strong></font></p> </td> <td> <p align="left"><font size="2">Launcher lg是一个交叉^台的Java 应用载入器?Commons-launcher 消除?jin)需要批处理或者Shell脚本来蝲入Java cR?原始?Java cL自于Jakarta Tomcat 4.0 目.</font></p> </td> </tr> <tr> <td> <p align="left"><font size="2"><strong>Logging</strong></font></p> </td> <td> <p align="left"><font size="2">Commons-Logging 是一个各U?logging API实现的包裹类. </font></p> </td> </tr> <tr> <td> <p align="left"><font size="2"><strong>Math</strong></font></p> </td> <td> <p align="left"><font size="2">Math 是一个轻量的Q自包含的数学和l计lgQ解决了(jin)许多非常通用但没有及(qing)时出现在Java标准语言中的实践问题.</font></p> </td> </tr> <tr> <td> <p align="left"><font size="2"><strong>Modeler</strong></font></p> </td> <td> <p align="left"><font size="2">Commons-Modeler 提供?jin)徏模兼容JMX规范?Mbean的机?</font></p> </td> </tr> <tr> <td> <p align="left"><font size="2"><strong>Net</strong></font></p> </td> <td><font size="2">Net 是一个网l工具集Q基?NetComponents 代码Q包?FTP 客户端等{? </font></td> </tr> <tr> <td> <p align="left"><font size="2"><strong>Pool</strong></font></p> </td> <td><font size="2">Commons-Pool 提供?jin)通用对象池接口,一个用于创建模块化对象池的工具包,以及(qing)通常的对象池实现.</font></td> </tr> <tr> <td> <p align="left"><font size="2"><strong>Primitives</strong></font></p> </td> <td><font size="2">Commons-Primitives提供?jin)一个更,更快和更易用的对Java基本cd的支持。当前主要是针对基本cd?collection.</font></td> </tr> <tr> <td> <p align="left"><font size="2"><strong>Validator</strong></font></p> </td> <td><font size="2">The commons-validator提供?jin)一个简单的Q可扩展的框架来在一个XML文g中定义校验器 (校验Ҏ(gu))和校验规则。支持校验规则的和错误消息的国际?</font></td> </tr> </tbody> </table> </p> <p><font size="2">详细信息位于Q?a ><u><font color="#0000ff">http://jakarta.apache.org/commons/index.html</font></u></a></font></p> <p><font size="2">以及(qing)<a id="_da5a5345c8dc6105_HomePageDays_DaysList__ctl1_DayItem_DayList__ctl0_TitleUrl" ><u><font color="#800080">Jakarta Commons:巧用cdlg</font></u></a></font></p> <img src ="http://www.aygfsteel.com/jzone/aggbug/305966.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/jzone/" target="_blank">Gavin.lee</a> 2009-12-14 22:36 <a href="http://www.aygfsteel.com/jzone/articles/305966.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java路径问题最l解x(chng)案(可定位所有资源的相对路径dQ?/title><link>http://www.aygfsteel.com/jzone/articles/305753.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Sat, 12 Dec 2009 15:18:00 GMT</pubDate><guid>http://www.aygfsteel.com/jzone/articles/305753.html</guid><description><![CDATA[     摘要: 摘自Qhttp://www.matrix.org.cn/thread.shtml?topicId=6d0bbeed-9157-11db-ab77-2bbe780ebfbf&forumId=19 Java的\径问题,非常难搞。最q的工作涉及(qing)到创建和d文g的工作,q里我就l大家彻底得解决Java路径问题?我编写了(jin)一个方法,比ClassLoader.getResource(String...  <a href='http://www.aygfsteel.com/jzone/articles/305753.html'>阅读全文</a><img src ="http://www.aygfsteel.com/jzone/aggbug/305753.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/jzone/" target="_blank">Gavin.lee</a> 2009-12-12 23:18 <a href="http://www.aygfsteel.com/jzone/articles/305753.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>十四UJava开发工?---?jin)?/title><link>http://www.aygfsteel.com/jzone/articles/304447.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Tue, 01 Dec 2009 14:54:00 GMT</pubDate><guid>http://www.aygfsteel.com/jzone/articles/304447.html</guid><description><![CDATA[<p> <br /> 原文Q?a >http://www.yesky.com/471/1825471.shtml</a> </p> 1、JDK QJava Development KitQ?br /> 2、Java Workshop <br /> 3、NetBeans 与Sun Java Studio 5<br /> 4、Borland 的JBuilder <br /> 5、Oracle 的JDeveloper<br /> 6、IBM的Visual Age for Java<br /> 7、BEA ?WebLogic Workshop<br /> 8、WebGain 的Visual Cafe for Java<br /> 9、Macromedia的JRUN<br /> 10、JCreator<br /> 11、Microsoft VJ++ <br /> 12、Eclipse<br /> 13、Ant Another Neat Tool(Ant)<br /> 14、IntelliJ<br /> <img src ="http://www.aygfsteel.com/jzone/aggbug/304447.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/jzone/" target="_blank">Gavin.lee</a> 2009-12-01 22:54 <a href="http://www.aygfsteel.com/jzone/articles/304447.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java:U程?--l自ql中的线E命名,然后通过dump察看你的pȝhttp://www.aygfsteel.com/jzone/articles/304328.htmlGavin.leeGavin.leeMon, 30 Nov 2009 15:41:00 GMThttp://www.aygfsteel.com/jzone/articles/304328.html   
  q运的是Q有几种工具Q例如logging应用E序接口QAPIQ或者Java Debugger可以用来调试Java服务器程序。开发者还能用一个系l的U程堆在M时候观察系l的状态。  
  
  q行服务器,然后按[ctrl] [/]Q会(x)q行一个系l线E堆Q这样将输出当前q行的所有线E,例如Q?  
    
  ^\Full thread dump:   
  
  Thread-1" prio=5 tid=0x87fe0 nid=0x800013b8 waiting on monitor [0..0xbfffe9f8]   
  
  "Thread-0" prio=5 tid=0xafde0 nid=0x72a00 runnable [0x173f000..0x173fb48]
  
  at java.net.PlainSocketImpl.socketAccept(Native Method)
  
  at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:421)
  
  at java.net.ServerSocket.implAccept(ServerSocket.java:243)
  
  at java.net.ServerSocket.accept(ServerSocket.java:222)
  
  at com.generationjava.net.PortListener.run(PortListener.java:38)
  
  at java.lang.Thread.run(Thread.java:496)    
  
  "Signal Dispatcher" daemon prio=10 tid=0xa5f80 nid=0x52af0 waiting on monitor [0..0]     
  
  "Finalizer" daemon prio=8 tid=0xa46c0 nid=0x4d930 waiting on monitor [0x10a8000..0x10a8b48]
  
  at java.lang.Object.wait(Native Method)
  
  at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:108)
  
  at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:123)
  
  at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:162)     
  
  "Reference Handler" daemon prio=10 tid=0xa3b70 nid=0x4cca0 waiting on monitor [0x1027000..0x1027b48]
  
  at java.lang.Object.wait(Native Method)
  
  at java.lang.Object.wait(Object.java:420)
  
  at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:110)     
  
  "VM Thread" prio=5 tid=0xa2de0 nid=0x4ca20 runnable   
  
  "VM Periodic Task Thread" prio=10 tid=0xa56b0 nid=0x52890 waiting on monitor   
  
  后面的四个线E是标准U程Q而其他的则跟q行的服务器E序有关。这两个U程被命名ؓ(f)Thread-1和Thread-0Q假如用Thread th = new Thread(runnable,"Server")代替Thread th = new Thread(runnable)dE,你就可以命名自己要创建的U程。  
  
  另外Q假如你调用java.lang.Thread的setName(String)Ҏ(gu)Q你也能命名你的U程Qƈ且可以很L从线E堆的输Z发现原来的Thread-0是服务器E序。  
  
  "Server" prio=5 tid=0xafde0 nid=0x72a00 runnable [0x173f000..0x173fb48]   
  
  而原来的Thread-1U程现在变成?jin)Thread-0?    
  
  通过命名U程和取得线E堆Q开发者就能看到Java虚拟机(JVMQ的内部状态。假如想得到更多信息的话Q你得ȝIJava Debugger?jin)?
资料来源:学网(www.xue5.com),原文地址:http://www.xue5.com/itedu/200702/91976.html

Gavin.lee 2009-11-30 23:41 发表评论
]]>
Java代码触发生成ThreadDumphttp://www.aygfsteel.com/jzone/articles/304324.htmlGavin.leeGavin.leeMon, 30 Nov 2009 15:13:00 GMThttp://www.aygfsteel.com/jzone/articles/304324.html
package yixun.wap.tools;

import java.util.Map;

/**  
 * 使用 Java q程代码生成 ThreadDump. 适用?nbsp;JDK 1.5+.  
 * 参? {
@link ThreadgetStackTrace()}  
 * {
@link ThrowablegetStackTrace()}  
 * 
@see StackTraceElement  
 
*/

public class ThreadDumpBuilder {
    
/**  
     * 生成q返?nbsp;Thread Dump.  
     * 
@return  
     
*/

    
public String build() {
        StringBuilder output 
= new StringBuilder(1000);
        
for (Map.Entry stackTrace : Thread.getAllStackTraces().entrySet()) {
            appendThreadStackTrace(output, (Thread) stackTrace.getKey(),
                    (StackTraceElement[]) stackTrace.getValue());
        }

        
return output.toString();
    }


    
/**  
     * 处理q输出堆栈信?  
     * 
@param output  
     *            输出内容  
     * 
@param thread  
     *            U程  
     * 
@param stack  
     *            U程堆栈  
     
*/

    
private void appendThreadStackTrace(StringBuilder output, Thread thread,
            StackTraceElement[] stack) 
{
        
// 忽略当前U程的堆栈信?nbsp;  
        if (thread.equals(Thread.currentThread())) {
            
return;
        }


        output.append(thread).append(
"<br/>");
        
for (StackTraceElement element : stack) {
            output.append(
"\t").append(element).append("\n<br/>");
        }

    }


}


然后在一个JSP里或者Servlet中Q意调用即?
<%=new ThreadDumpBuilder().build() %>
===== END OF THREAD DUMP ===============
参考资?
1. Atlassian Confluence 3.0 理控制?/pre>
2. JDK的DEMO
jdk1.5.0\demo\management\FullThreadDump
原文Q?a >http://ajava.org/course/java/13843.html 
java.lang
c?StackTraceElement Ҏ(gu)Q?/pre>
 boolean  equals(Object obj)
          如果指定的对象是另一?StackTraceElement 实例Qƈ且该对象表示的执行点与该实例的相同,则返?ture?br />  String  getClassName()
          q回cȝ完全限定名,该类包含p堆栈跟踪元素所表示的执行点?br />  String  getFileName()
          q回源文件名Q该文g包含p堆栈跟踪元素所表示的执行点?br />  int  getLineNumber()
          q回源行的行P该行包含p堆栈该跟t元素所表示的执行点?br />  String  getMethodName()
          q回Ҏ(gu)名,此方法包含由该堆栈跟t元素所表示的执行点?br />  int  hashCode()
          q回此堆栈跟t元素的哈希码倹{?br />  boolean  isNativeMethod()
          如果包含p堆栈跟踪元素所表示的执行点的方法是一个本机方法,则返?true?br />  String  toString()
          q回表示该堆栈跟t元素的字符丌Ӏ?/pre>
 


Gavin.lee 2009-11-30 23:13 发表评论
]]>JAVAU程dump的分?--- jstack pidhttp://www.aygfsteel.com/jzone/articles/303979.htmlGavin.leeGavin.leeFri, 27 Nov 2009 14:02:00 GMThttp://www.aygfsteel.com/jzone/articles/303979.html 

Java 的线E?/h3>
U程是指能独立于E序的其它部分运行的执行单元?JAVA语言能够很好的实现多U程的程序。我们在调试E序Q或者在开发后期需要做性能调优的时候,往往也需要了(jin)解当前程序正在运行的U程的状态,正在执行的操作,从而分析系l可能存在的问题?

在阅L文之_(d)应对 JavaU程的编E原理,同步机制有一定了(jin)?.

产生 JAVAU程 dump


JAVA 的线E?DUMPQ就象当?JAVAq程的一个快照,打印出所有线E的状态和调用堆栈Q以?Monitor的状态。在不同的操作系l下Q生线E?DUMP的方式是不同的?

  • ·?windows环境中,
            在启动程序的控制台里Ԍ(x) Ctrl - BreakQ线E的 dump?x)生在标准输出中?~省标准输出是控制収ͼ如果对输?gu)行?jin)重定向,则要查看输出文gQ?
  • ?unixQ?linux?MacOS 环境中,
            在控制台中敲Q?Ctrl-\Q或者,
            ?“kill -3 <pid>” Q或?“kill – QUIT <pid>”?Pid是用所x(chng)?JAVAq程P(zhn)可以用 “ps -ef | grep java” 扑ֈQ或者?JDK 5.0中的 “jps -v” 命o(h)获得?
  • 在各个操作系l^収ͼ都可以用 JDK 5.0工具包中?jstack <pid>

q里要注意的是:(x)

1.     不同?JAVA虚机的线E?DUMP的创建方法和文g格式是不一L(fng)Q不同的 JVM版本Q?dump信息也有差别。本文中Q只?SUN?hotspot JVM 5.0_06 Z?

2.     在实际运行中Q往往一?dump的信息,q(sh)以认问题。徏议生三?dump信息Q如果每?dump都指向同一个问题,我们才确定问题的典型性?

U程分析 Q?/h3>
1.     JVM U程
在线E中Q有一?JVM内部的后台线E,来执行譬如垃圑֛Ӟ或者低内存的检等{Q务,q些U程往往?JVM初始化的时候就存在Q如下所C:(x)

        "Low Memory Detector" daemon prio=10 tid=0x081465f8 nid=0x7 runnable [0x00000000..0x00000000]

        "CompilerThread0" daemon prio=10 tid=0x08143c58 nid=0x6 waiting on condition [0x00000000..0xfb5fd798]

        "Signal Dispatcher" daemon prio=10 tid=0x08142f08 nid=0x5 waiting on condition [0x00000000..0x00000000]

        "Finalizer" daemon prio=10 tid=0x08137ca0 nid=0x4 in Object.wait() [0xfbeed000..0xfbeeddb8]

        at java.lang.Object.wait(Native Method)

        - waiting on <0xef600848> (a java.lang.ref.ReferenceQueue$Lock)

        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:116)

        - locked <0xef600848> (a java.lang.ref.ReferenceQueue$Lock)

        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:132)

        at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:159)

        "Reference Handler" daemon prio=10 tid=0x081370f0 nid=0x3 in Object.wait() [0xfbf4a000..0xfbf4aa38]

        at java.lang.Object.wait(Native Method)

        - waiting on <0xef600758> (a java.lang.ref.Reference$Lock)

        at java.lang.Object.wait(Object.java:474)

        at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:116)

        - locked <0xef600758> (a java.lang.ref.Reference$Lock)

        "VM Thread" prio=10 tid=0x08134878 nid=0x2 runnable

        "VM Periodic Task Thread" prio=10 tid=0x08147768 nid=0x8 waiting on condition

               

                我们更多的是要观察用L(fng)别的U程Q如下所C:(x)

 

        "Thread-1" prio=10 tid=0x08223860 nid=0xa waiting on condition [0xef47a000..0xef47ac38]

        at java.lang.Thread.sleep(Native Method)

        at testthread.MySleepingThread.method2(MySleepingThread.java:53)

        - locked <0xef63d600> (a testthread.MySleepingThread)

        at testthread.MySleepingThread.run(MySleepingThread.java:35)

        at java.lang.Thread.run(Thread.java:595)

 

        我们能看刎ͼ(x)

  • U程的状态:(x) waiting on condition
  • U程的调用栈
  • U程的当前锁住的资源Q?<0xef63d600>

        q些信息Ҏ(gu)们随后的分析都有用处?

2.     U程的状态分?

正如我们刚看到的那样Q线E的状态是一个重要的指标Q它?x)显C在U程 Stacktrace的头一行结地方。那么线E常见的有哪些状态呢Q线E在什么样的情况下?x)进入这U状态呢Q我们能从中发现什么线索?< /span>

1.1 Runnable

该状态表C线E具备所有运行条Ӟ在运行队列中准备操作pȝ的调度,或者正在运行?

1.2 Wait on condition

该状态出现在U程{待某个条g的发生。具体是什么原因,可以l合 stacktrace来分析。最常见的情冉|U程在等待网l的dQ比如当|络数据没有准备好读ӞU程处于q种{待状态,而一旦有数据准备好读之后Q线E会(x)重新Ȁz,dq处理数据。在 Java引入 NewIO之前Q对于每个网l连接,都有一个对应的U程来处理网l的d操作Q即使没有可d的数据,U程仍然d在读写操作上Q这h可能造成资源费Q而且l操作系l的U程调度也带来压力。在 NewIO里采用了(jin)新的机制Q编写的服务器程序的性能和可扩展性都得到提高?

如果发现有大量的U程都在处在 Wait on conditionQ从U程 stack看, 正等待网l读写,q可能是一个网l瓶颈的征兆。因为网l阻塞导致线E无法执行。一U情冉||络非常忙,?乎消耗了(jin)所有的带宽Q仍然有大量数据{待|络?写;另一U情况也可能是网l空Ԍ但由于\q问题Q导致包无法正常的到达。所以要l合pȝ的一些性能观察工具来综合分析,比如 netstatl计单位旉的发送包的数目,如果很明显超q了(jin)所在网l带宽的限制 ; 观察 cpu的利用率Q如果系l态的 CPU旉Q相对于用户态的 CPU旉比例较高Q如果程序运行在 Solaris 10q_上,可以?dtrace工具看系l调用的情况Q如果观察到 read/write的系l调用的ơ数或者运行时间遥遥领先;q些都指向由于网l带宽所限导致的|络瓉?

另外一U出?Wait on condition的常见情冉|该线E在 sleepQ等?sleep的时间到?jin)时候,被唤醒?

1.3 Waiting for monitor entry ?in Object.wait()

在多U程?JAVAE序中,实现U程之间的同步,p说说 Monitor?Monitor?Java中用以实现线E之间的互斥与协作的主要手段Q它可以看成是对象或?Class的锁。每一个对象都有,也仅有一?monitor。下 面这个图Q描qC(jin)U程?Monitor之间关系Q以 ?qing)线E的状态{换图Q?nbsp;


从图中可以看出,每个 Monitor在某个时刻,只能被一个线E拥有,该线E就?“Active Thread”Q而其它线E都?“Waiting Thread”Q分别在两个队列 “ Entry Set”?“Wait Set”里面{候。在 “Entry Set”中等待的U程状态是 “Waiting for monitor entry”Q而在 “Wait Set”中等待的U程状态是 “in Object.wait()”?

先看 “Entry Set”里面的线E。我们称?synchronized保护h的代码段Z(f)界区。当一个线E申误入(f)界区Ӟ它就q入?“Entry Set”队列。对应的 code像Q?

synchronized(obj) {
.........

}

q时有两U可能性:(x)

·          ?monitor不被其它U程拥有Q?Entry Set里面也没有其它等待线E。本U程x(chng)为相应类或者对象的 Monitor?OwnerQ执行(f)界区的代?

·          ?monitor被其它线E拥有,本线E在 Entry Set队列中等待?

在第一U情况下Q线E将处于 “Runnable”的状态,而第二种情况下,U程 DUMP?x)显C处?“waiting for monitor entry”。如下所C:(x)

 

"Thread-0" prio=10 tid=0x08222eb0 nid=0x9 waiting for monitor entry [0xf927b000..0xf927bdb8]

at testthread.WaitThread.run(WaitThread.java:39)

- waiting to lock <0xef63bf08> (a java.lang.Object)

- locked <0xef63beb8> (a java.util.ArrayList)

at java.lang.Thread.run(Thread.java:595)

 

临界区的讄Q是Z(jin)保证其内部的代码执行的原子性和完整性。但是因Z(f)界区在Q何时间只允许U程串行通过Q这 和我们多U程的程序的初衷是相反的?如果在多U程的程序中Q大量?synchronizedQ或者不适当的用了(jin)它,?x)造成大量U程在(f)界区的入口等待,造成pȝ的性能大幅下降。如果在U程 DUMP中发C(jin)q个情况Q应该审查源码,改进E序?

现在我们再来看现在线Eؓ(f)什么会(x)q入 “Wait Set”。当U程获得?MonitorQ进入了(jin)临界Z后,如果发现U程l箋(hu)q行的条件没有满I它则调用对象Q一般就是被 synchronized 的对象)(j)?wait() Ҏ(gu)Q放弃了(jin) MonitorQ进?“Wait Set”队列。只有当别的U程在该对象上调用了(jin) notify() 或?notifyAll() Q?“ Wait Set”队列中线E才得到Z(x)ȝ争,但是只有一个线E获得对象的 MonitorQ恢复到q行态。在 “Wait Set”中的U程Q?DUMP中表Cؓ(f)Q?in Object.wait()Q类gQ?

        "Thread-1" prio=10 tid=0x08223250 nid=0xa in Object.wait() [0xef47a000..0xef47aa38]

        at java.lang.Object.wait(Native Method)

        - waiting on <0xef63beb8> (a java.util.ArrayList)

        at java.lang.Object.wait(Object.java:474)

        at testthread.MyWaitThread.run(MyWaitThread.java:40)

        - locked <0xef63beb8> (a java.util.ArrayList)

        at java.lang.Thread.run(Thread.java:595)

 
仔细观察上面?DUMP信息Q你?x)发现它有以下两行?x)

- locked <0xef63beb8> (a java.util.ArrayList)

- waiting on <0xef63beb8> (a java.util.ArrayList)

q里需要解释一下,Z么先 lock?jin)这个对象,然后?waiting on同一个对象呢Q让我们看看q个U程对应的代码:(x)

 

        synchronized(obj) {
               .........
               obj.wait();
               .........
        }

U程的执行中Q先?synchronized 获得?jin)这个对象?MonitorQ对应于 locked <0xef63beb8> Q。当执行?obj.wait(), U程x(chng)弃了(jin) Monitor的所有权Q进?“wait set”队列Q对应于 waiting on <0xef63beb8> Q?

往往在你的程序中Q会(x)出现多个cM的线E,他们都有怼?DUMP信息。这也可能是正常的。比如,在程序中Q有多个服务U程Q设计成从一个队列里面读取请求数据。这个队列就?lock以及(qing) waiting on的对象。当队列为空的时候,q些U程都会(x)在这个队列上{待Q直到队列有?jin)数据,q些U程?NotifyQ当然只有一个线E获得了(jin) lockQ(h)l执行,而其它线E(h)l等待?

3.     JDK 5.0 ?lock

上面我们提到如果 synchronized?monitor机制q用不当Q可能会(x)造成多线E程序的性能问题。在 JDK 5.0中,引入?Lock机制Q从而开发者能更灵zȝ开发高性能的ƈ发多U程E序Q可以替代以往 JDK中的 synchronized?Monitor?机制。但是,要注意的是,因ؓ(f) Lockcd是一个普通类Q?JVM无从得知 Lock对象的占用情况,所以在U程 DUMP中,也不?x)包含关?Lock的信息, 关于死锁{问题,׃如用 synchronized的编E方式容易识别?

案例分析


1.     死锁

在多U程E序的编写中Q如果不适当的运用同步机Ӟ则有可能造成E序的死锁,l常表现为程序的停顿Q或者不再响应用L(fng)h?

比如在下面这个示例中Q是个较为典型的死锁情况Q?

 

"Thread-1" prio=5 tid=0x00acc490 nid=0xe50 waiting for monitor entry [0x02d3f000

..0x02d3fd68]

at deadlockthreads.TestThread.run(TestThread.java:31)

- waiting to lock <0x22c19f18> (a java.lang.Object)

- locked <0x22c19f20> (a java.lang.Object)

 

"Thread-0" prio=5 tid=0x00accdb0 nid=0xdec waiting for monitor entry [0x02cff000

..0x02cff9e8]

at deadlockthreads.TestThread.run(TestThread.java:31)

- waiting to lock <0x22c19f20> (a java.lang.Object)

- locked <0x22c19f18> (a java.lang.Object)

?JAVA 5中加Z(jin)Ҏ(gu)锁的(g)。线E?Dump中可以直接报告出 JavaU别的死锁,如下所C:(x)

 

Found one Java-level deadlock:

=============================

"Thread-1":

waiting to lock monitor 0x0003f334 (object 0x22c19f18, a java.lang.Object),

which is held by "Thread-0"

"Thread-0":

waiting to lock monitor 0x0003f314 (object 0x22c19f20, a java.lang.Object),

which is held by "Thread-1"

2.     热锁

热锁Q也往往是导致系l性能瓉的主要因素。其表现特征为,׃多个U程对(f)界区Q或者锁的竞争,可能出现Q?amp; amp; lt; /span>

  • 频繁的线E的上下文切换:(x)从操作系l对U程的调度来看,?U程在等待资源而阻塞的时候,操作pȝ?x)将之切换出来,攑ֈ{待的队列,当线E获得资源之后,调度法?x)将q个U程切换q去Q放到执行队列中?amp; amp; amp; amp; lt; /li>
  • 大量的系l调用:(x)因ؓ(f)U程的上下文切换Q以?qing)热锁的竞争Q或 者(f)界区的频J的q出Q都可能D大量的系l调用。M t < /span>
  • 大部?CPU开销用在 “pȝ?”Q线E上下文切换Q和pȝ调用Q都?x)导?CPU?“pȝ?”q行Q换而言之,虽然pȝ很忙,但是 CPU用在 “用户?”的比例较?yu),应用E序得不到充分的 CPU资源?
  • 随着 CPU数目的增多,pȝ的性能反而下降。因?CPU数目多,?时运行的U程p多,可能׃(x)造成更频J的U程上下文切换和pȝ态的 CPU开销Q从而导致更p糕的性能?

上面的描qͼ都是一?scalabilityQ可扩展性)(j)很差的系l的表现。从整体的性能指标看,׃U程热锁的存在,E序的响应时间会(x)变长Q吞吐量?x)降低?lt; /span>

那么Q怎么M(jin)?“热锁 ”出现在什么地方呢Q一个重要的Ҏ(gu)q是l合操作pȝ的各U工兯察系l资源用状况,以及(qing)攉 JavaU程?DUMP信息Q看U程都阻塞在什么方法上Q了(jin)解原因,才能扑ֈ对应的解x(chng)法?

我们曄遇到q这L(fng)例子Q程序运行时Q出C(jin)以上指出的各U现象,通过观察操作pȝ的资源用统计信息,以及(qing)U程 DUMP信息Q确定了(jin)E序中热锁的存在Qƈ发现大多数的U程状态都?Waiting for monitor entry或?Wait on monitorQ且是阻塞在压羃和解压羃的方法上。后来采用第三方的压~包 javalib替代 JDK自带的压~包后,pȝ的性能提高?sh)(jin)几倍?

ȝ


本文׃l了(jin) JavaU程 DUMP的基本知识和分析的基本方法,q且解释?jin)如何利用线E的 DUMP信息Q以?qing)结合操作系l的各种资源使用情况Q分析程序的性能问题Q从而达到改q程序,提高性能的目的?

Gavin.lee 2009-11-27 22:02 发表评论
]]>
判断字符串是否是数字?/title><link>http://www.aygfsteel.com/jzone/articles/303312.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Mon, 23 Nov 2009 03:33:00 GMT</pubDate><guid>http://www.aygfsteel.com/jzone/articles/303312.html</guid><description><![CDATA[在我们日常开发过E中Qؓ(f)?jin)安全考虑Q会(x)用到对传D行限Ӟ下面q段是先人用?个方法,都是可行?jin),现?chung)如下<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.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" /><span style="color: #008000">//</span><span style="color: #008000">    1.使用Character.isDigit(char)判断     </span><span style="color: #008000"><br /> <img id="Codehighlighter1_73_264_Open_Image" onclick="this.style.display='none'; Codehighlighter1_73_264_Open_Text.style.display='none'; Codehighlighter1_73_264_Closed_Image.style.display='inline'; Codehighlighter1_73_264_Closed_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_73_264_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_73_264_Closed_Text.style.display='none'; Codehighlighter1_73_264_Open_Image.style.display='inline'; Codehighlighter1_73_264_Open_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedBlock.gif" align="top" alt="" /></span><span style="color: #000000">    </span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">boolean</span><span style="color: #000000"> isNumeric(String str) </span><span id="Codehighlighter1_73_264_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.aygfsteel.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_73_264_Open_Text"><span style="color: #000000">{<br /> <img id="Codehighlighter1_112_133_Open_Image" onclick="this.style.display='none'; Codehighlighter1_112_133_Open_Text.style.display='none'; Codehighlighter1_112_133_Closed_Image.style.display='inline'; Codehighlighter1_112_133_Closed_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_112_133_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_112_133_Closed_Text.style.display='none'; Codehighlighter1_112_133_Open_Image.style.display='inline'; Codehighlighter1_112_133_Open_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" alt="" />        </span><span style="color: #0000ff">if</span><span style="color: #000000"> (str </span><span style="color: #000000">==</span><span style="color: #000000"> </span><span style="color: #0000ff">null</span><span style="color: #000000"> </span><span style="color: #000000">||</span><span style="color: #000000"> str.equals(</span><span style="color: #000000">""</span><span style="color: #000000">)) </span><span id="Codehighlighter1_112_133_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.aygfsteel.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_112_133_Open_Text"><span style="color: #000000">{<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />            </span><span style="color: #0000ff">return</span><span style="color: #000000"> </span><span style="color: #0000ff">false</span><span style="color: #000000">;<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />        }</span></span><span style="color: #000000"><br /> <img id="Codehighlighter1_175_246_Open_Image" onclick="this.style.display='none'; Codehighlighter1_175_246_Open_Text.style.display='none'; Codehighlighter1_175_246_Closed_Image.style.display='inline'; Codehighlighter1_175_246_Closed_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_175_246_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_175_246_Closed_Text.style.display='none'; Codehighlighter1_175_246_Open_Image.style.display='inline'; Codehighlighter1_175_246_Open_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" alt="" />        </span><span style="color: #0000ff">for</span><span style="color: #000000"> (</span><span style="color: #0000ff">int</span><span style="color: #000000"> i </span><span style="color: #000000">=</span><span style="color: #000000"> str.length(); </span><span style="color: #000000">--</span><span style="color: #000000">i </span><span style="color: #000000">>=</span><span style="color: #000000"> </span><span style="color: #000000">0</span><span style="color: #000000">;) </span><span id="Codehighlighter1_175_246_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.aygfsteel.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_175_246_Open_Text"><span style="color: #000000">{<br /> <img id="Codehighlighter1_219_242_Open_Image" onclick="this.style.display='none'; Codehighlighter1_219_242_Open_Text.style.display='none'; Codehighlighter1_219_242_Closed_Image.style.display='inline'; Codehighlighter1_219_242_Closed_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_219_242_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_219_242_Closed_Text.style.display='none'; Codehighlighter1_219_242_Open_Image.style.display='inline'; Codehighlighter1_219_242_Open_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" alt="" />            </span><span style="color: #0000ff">if</span><span style="color: #000000"> (</span><span style="color: #000000">!</span><span style="color: #000000">Character.isDigit(str.charAt(i))) </span><span id="Codehighlighter1_219_242_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.aygfsteel.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_219_242_Open_Text"><span style="color: #000000">{<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />                </span><span style="color: #0000ff">return</span><span style="color: #000000"> </span><span style="color: #0000ff">false</span><span style="color: #000000">;<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />            }</span></span><span style="color: #000000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />        }</span></span><span style="color: #000000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />        </span><span style="color: #0000ff">return</span><span style="color: #000000"> </span><span style="color: #0000ff">true</span><span style="color: #000000">;<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" alt="" />    }</span></span><span style="color: #000000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" />     <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" /><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">    2.使用cd转换判断</span><span style="color: #008000"><br /> <img id="Codehighlighter1_324_435_Open_Image" onclick="this.style.display='none'; Codehighlighter1_324_435_Open_Text.style.display='none'; Codehighlighter1_324_435_Closed_Image.style.display='inline'; Codehighlighter1_324_435_Closed_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_324_435_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_324_435_Closed_Text.style.display='none'; Codehighlighter1_324_435_Open_Image.style.display='inline'; Codehighlighter1_324_435_Open_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedBlock.gif" align="top" alt="" /></span><span style="color: #000000">    </span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">boolean</span><span style="color: #000000"> isNumeric2 (String str) </span><span id="Codehighlighter1_324_435_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.aygfsteel.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_324_435_Open_Text"><span style="color: #000000">{<br /> <img id="Codehighlighter1_332_383_Open_Image" onclick="this.style.display='none'; Codehighlighter1_332_383_Open_Text.style.display='none'; Codehighlighter1_332_383_Closed_Image.style.display='inline'; Codehighlighter1_332_383_Closed_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_332_383_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_332_383_Closed_Text.style.display='none'; Codehighlighter1_332_383_Open_Image.style.display='inline'; Codehighlighter1_332_383_Open_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" alt="" />        </span><span style="color: #0000ff">try</span><span style="color: #000000"> </span><span id="Codehighlighter1_332_383_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.aygfsteel.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_332_383_Open_Text"><span style="color: #000000">{   <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />            Integer.valueOf(str);   <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />            </span><span style="color: #0000ff">return</span><span style="color: #000000"> </span><span style="color: #0000ff">true</span><span style="color: #000000">;<br /> <img id="Codehighlighter1_405_430_Open_Image" onclick="this.style.display='none'; Codehighlighter1_405_430_Open_Text.style.display='none'; Codehighlighter1_405_430_Closed_Image.style.display='inline'; Codehighlighter1_405_430_Closed_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_405_430_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_405_430_Closed_Text.style.display='none'; Codehighlighter1_405_430_Open_Image.style.display='inline'; Codehighlighter1_405_430_Open_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" alt="" />        }</span></span><span style="color: #000000"> </span><span style="color: #0000ff">catch</span><span style="color: #000000"> (Exception e) </span><span id="Codehighlighter1_405_430_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.aygfsteel.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_405_430_Open_Text"><span style="color: #000000">{   <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />            </span><span style="color: #0000ff">return</span><span style="color: #000000"> </span><span style="color: #0000ff">false</span><span style="color: #000000">; <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />        }</span></span><span style="color: #000000">  <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" alt="" />    }</span></span><span style="color: #000000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" /><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">    3.使用正则表达式判?/span><span style="color: #008000"><br /> <img id="Codehighlighter1_492_617_Open_Image" onclick="this.style.display='none'; Codehighlighter1_492_617_Open_Text.style.display='none'; Codehighlighter1_492_617_Closed_Image.style.display='inline'; Codehighlighter1_492_617_Closed_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_492_617_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_492_617_Closed_Text.style.display='none'; Codehighlighter1_492_617_Open_Image.style.display='inline'; Codehighlighter1_492_617_Open_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedBlock.gif" align="top" alt="" /></span><span style="color: #000000">    </span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">boolean</span><span style="color: #000000"> isNumeric3(String str) </span><span id="Codehighlighter1_492_617_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.aygfsteel.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_492_617_Open_Text"><span style="color: #000000">{<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />        </span><span style="color: #0000ff">return</span><span style="color: #000000"> str.matches(</span><span style="color: #000000">"</span><span style="color: #000000">[0-9]+</span><span style="color: #000000">"</span><span style="color: #000000">);    <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />        </span><span style="color: #008000">//</span><span style="color: #008000">    +表示1个或多个Q如"3"?225"Q,*表示0个或多个Q[0-9]*Q(?"?1"?22"Q,?表示0个或1?[0-9]?)(?"?7")   </span><span style="color: #008000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" alt="" /></span><span style="color: #000000">    }</span></span><span style="color: #000000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" />    <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">    4.使用PatterncdMatcher</span><span style="color: #008000"><br /> <img id="Codehighlighter1_684_828_Open_Image" onclick="this.style.display='none'; Codehighlighter1_684_828_Open_Text.style.display='none'; Codehighlighter1_684_828_Closed_Image.style.display='inline'; Codehighlighter1_684_828_Closed_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_684_828_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_684_828_Closed_Text.style.display='none'; Codehighlighter1_684_828_Open_Image.style.display='inline'; Codehighlighter1_684_828_Open_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedBlock.gif" align="top" alt="" /></span><span style="color: #000000">    </span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">boolean</span><span style="color: #000000"> isNumeric4(String str) </span><span id="Codehighlighter1_684_828_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.aygfsteel.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_684_828_Open_Text"><span style="color: #000000">{<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />        Pattern pattern </span><span style="color: #000000">=</span><span style="color: #000000"> Pattern.compile(</span><span style="color: #000000">"</span><span style="color: #000000">[0-9]+</span><span style="color: #000000">"</span><span style="color: #000000">);   <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />        Matcher matcher </span><span style="color: #000000">=</span><span style="color: #000000"> pattern.matcher((CharSequence) str);   <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />        </span><span style="color: #0000ff">return</span><span style="color: #000000"> matcher.matches();   <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" alt="" />    }</span></span></div> <img src ="http://www.aygfsteel.com/jzone/aggbug/303312.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/jzone/" target="_blank">Gavin.lee</a> 2009-11-23 11:33 <a href="http://www.aygfsteel.com/jzone/articles/303312.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>BigDecimal --判断两数盔R是否为无I?/title><link>http://www.aygfsteel.com/jzone/articles/299218.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Wed, 21 Oct 2009 08:27:00 GMT</pubDate><guid>http://www.aygfsteel.com/jzone/articles/299218.html</guid><description><![CDATA[     摘要: import java.math.BigDecimal; public class Test {     public static void main(String args[]) {       &n...  <a href='http://www.aygfsteel.com/jzone/articles/299218.html'>阅读全文</a><img src ="http://www.aygfsteel.com/jzone/aggbug/299218.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/jzone/" target="_blank">Gavin.lee</a> 2009-10-21 16:27 <a href="http://www.aygfsteel.com/jzone/articles/299218.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Math 取整函数http://www.aygfsteel.com/jzone/articles/298677.htmlGavin.leeGavin.leeSat, 17 Oct 2009 05:42:00 GMThttp://www.aygfsteel.com/jzone/articles/298677.html/**
 * 取整函数
 
*/

public class QuZheng {
    
public static void main(String[] args) {
        
//四舍五入   
        System.out.println(Math.round(3.40d));   //3
        System.out.println(Math.round(3.60d));   //4
        
//上取?nbsp;  
        System.out.println(Math.ceil(3.4));   //4.0
        
//下取?nbsp;  
        System.out.println(Math.floor(3.40));   //3.0
        
        System.out.println((
int)3.45);    //3
    }

}


Gavin.lee 2009-10-17 13:42 发表评论
]]>
DecimalFormat 数据格式化类的用小l?/title><link>http://www.aygfsteel.com/jzone/articles/292581.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Tue, 25 Aug 2009 16:06:00 GMT</pubDate><guid>http://www.aygfsteel.com/jzone/articles/292581.html</guid><description><![CDATA[<p>apiQ?code>DecimalFormat</code> ?<code>NumberFormat</code> 的一个具体子c,用于格式化十q制数字。该c设计有各种功能Q其能够解析和格式化Q意语a环境中的敎ͼ包括对西方语a、阿拉伯语和印度语数字的支持。它q支持不同类型的敎ͼ包括整数 (123)、定Ҏ(gu) (123.4)、科学记数法表示的数 (1.23E4)、百分数 (12%) 和金?($123)。所有这些内定w可以本地化?/p> <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" /><span style="color: #0000ff">import</span><span style="color: #000000"> java.text.DecimalFormat;<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000"> java.util.Random;<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000"> java.util.Locale;<br /> <img id="Codehighlighter1_112_1741_Open_Image" onclick="this.style.display='none'; Codehighlighter1_112_1741_Open_Text.style.display='none'; Codehighlighter1_112_1741_Closed_Image.style.display='inline'; Codehighlighter1_112_1741_Closed_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_112_1741_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_112_1741_Closed_Text.style.display='none'; Codehighlighter1_112_1741_Open_Image.style.display='inline'; Codehighlighter1_112_1741_Open_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedBlock.gif" align="top" alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">class</span><span style="color: #000000"> TestNumberFormat </span><span id="Codehighlighter1_112_1741_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.aygfsteel.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_112_1741_Open_Text"><span style="color: #000000">{<br /> <img id="Codehighlighter1_154_1739_Open_Image" onclick="this.style.display='none'; Codehighlighter1_154_1739_Open_Text.style.display='none'; Codehighlighter1_154_1739_Closed_Image.style.display='inline'; Codehighlighter1_154_1739_Closed_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_154_1739_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_154_1739_Closed_Text.style.display='none'; Codehighlighter1_154_1739_Open_Image.style.display='inline'; Codehighlighter1_154_1739_Open_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" alt="" />    </span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">static</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> main(String[] args) </span><span id="Codehighlighter1_154_1739_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.aygfsteel.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_154_1739_Open_Text"><span style="color: #000000">{<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />        </span><span style="color: #0000ff">double</span><span style="color: #000000"> pi </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">3.1415927</span><span style="color: #000000">;</span><span style="color: #008000">//</span><span style="color: #008000"> 圆周?br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />        <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />        </span><span style="color: #008000">//</span><span style="color: #008000"> 取一位整?/span><span style="color: #008000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #000000">        System.out.println(</span><span style="color: #0000ff">new</span><span style="color: #000000"> DecimalFormat(</span><span style="color: #000000">"</span><span style="color: #000000">0</span><span style="color: #000000">"</span><span style="color: #000000">).format(pi)); </span><span style="color: #008000">//</span><span style="color: #008000"> 3<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />        </span><span style="color: #008000">//</span><span style="color: #008000"> 取一位整数和两位数</span><span style="color: #008000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #000000">        System.out.println(</span><span style="color: #0000ff">new</span><span style="color: #000000"> DecimalFormat(</span><span style="color: #000000">"</span><span style="color: #000000">0.00</span><span style="color: #000000">"</span><span style="color: #000000">).format(pi)); </span><span style="color: #008000">//</span><span style="color: #008000"> 3.14        <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />        </span><span style="color: #008000">//</span><span style="color: #008000"> 取两位整数和三位数Q整C部分以0填补?/span><span style="color: #008000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #000000">        System.out.println(</span><span style="color: #0000ff">new</span><span style="color: #000000"> DecimalFormat(</span><span style="color: #000000">"</span><span style="color: #000000">00.000</span><span style="color: #000000">"</span><span style="color: #000000">).format(pi)); </span><span style="color: #008000">//</span><span style="color: #008000"> 03.142<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />        </span><span style="color: #008000">//</span><span style="color: #008000"> 取所有整数部?/span><span style="color: #008000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #000000">        System.out.println(</span><span style="color: #0000ff">new</span><span style="color: #000000"> DecimalFormat(</span><span style="color: #000000">"</span><span style="color: #000000">#</span><span style="color: #000000">"</span><span style="color: #000000">).format(pi)); </span><span style="color: #008000">//</span><span style="color: #008000"> 3<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />        </span><span style="color: #008000">//</span><span style="color: #008000"> 以百分比方式计数Qƈ取两位小?/span><span style="color: #008000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #000000">        System.out.println(</span><span style="color: #0000ff">new</span><span style="color: #000000"> DecimalFormat(</span><span style="color: #000000">"</span><span style="color: #000000">#.##%</span><span style="color: #000000">"</span><span style="color: #000000">).format(pi)); </span><span style="color: #008000">//</span><span style="color: #008000"> 314.16%</span><span style="color: #008000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #000000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />        </span><span style="color: #0000ff">long</span><span style="color: #000000"> c </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">299792458</span><span style="color: #000000">;</span><span style="color: #008000">//</span><span style="color: #008000"> 光?br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />        </span><span style="color: #008000">//</span><span style="color: #008000"> 昄为科学计数法Qƈ取五位小?/span><span style="color: #008000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #000000">        System.out.println(</span><span style="color: #0000ff">new</span><span style="color: #000000"> DecimalFormat(</span><span style="color: #000000">"</span><span style="color: #000000">#.#####E0</span><span style="color: #000000">"</span><span style="color: #000000">).format(c)); </span><span style="color: #008000">//</span><span style="color: #008000"> 2.99792E8<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />        </span><span style="color: #008000">//</span><span style="color: #008000"> 昄Z位整数的U学计数法,q取四位数</span><span style="color: #008000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #000000">        System.out.println(</span><span style="color: #0000ff">new</span><span style="color: #000000"> DecimalFormat(</span><span style="color: #000000">"</span><span style="color: #000000">00.####E0</span><span style="color: #000000">"</span><span style="color: #000000">).format(c)); </span><span style="color: #008000">//</span><span style="color: #008000"> 29.9792E7<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />        </span><span style="color: #008000">//</span><span style="color: #008000"> 每三位以逗号q行分隔?/span><span style="color: #008000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #000000">        System.out.println(</span><span style="color: #0000ff">new</span><span style="color: #000000"> DecimalFormat(</span><span style="color: #000000">"</span><span style="color: #000000">,###</span><span style="color: #000000">"</span><span style="color: #000000">).format(c)); </span><span style="color: #008000">//</span><span style="color: #008000"> 299,792,458<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />        </span><span style="color: #008000">//</span><span style="color: #008000"> 格式嵌入文?/span><span style="color: #008000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #000000">        System.out.println(</span><span style="color: #0000ff">new</span><span style="color: #000000"> DecimalFormat(</span><span style="color: #000000">"</span><span style="color: #000000">光速大ؓ(f)每秒,###c?/span><span style="color: #000000">"</span><span style="color: #000000">).format(c));        </span><span style="color: #008000">//</span><span style="color: #008000">光速大ؓ(f)每秒299,792,458c?br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />        <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />        </span><span style="color: #008000">//</span><span style="color: #008000">直接截取</span><span style="color: #008000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #000000">        System.out.println(Math.floor(</span><span style="color: #000000">24.335</span><span style="color: #000000">*</span><span style="color: #000000">100</span><span style="color: #000000">)</span><span style="color: #000000">/</span><span style="color: #000000">100</span><span style="color: #000000">);            </span><span style="color: #008000">//</span><span style="color: #008000">24.33</span><span style="color: #008000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #000000">        <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />        System.out.println((</span><span style="color: #0000ff">int</span><span style="color: #000000">)Math.floor(</span><span style="color: #000000">23.45</span><span style="color: #000000">));        </span><span style="color: #008000">//</span><span style="color: #008000">截取整数    23</span><span style="color: #008000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #000000">        System.out.println((</span><span style="color: #0000ff">int</span><span style="color: #000000">)Math.ceil(</span><span style="color: #000000">23.2</span><span style="color: #000000">));        </span><span style="color: #008000">//</span><span style="color: #008000">凑整    24</span><span style="color: #008000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #000000">        System.out.println((</span><span style="color: #0000ff">int</span><span style="color: #000000">)Math.rint(</span><span style="color: #000000">23.567</span><span style="color: #000000">));        </span><span style="color: #008000">//</span><span style="color: #008000">四舍五入取整    24</span><span style="color: #008000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #000000">        System.out.println(</span><span style="color: #0000ff">new</span><span style="color: #000000"> DecimalFormat(</span><span style="color: #000000">"</span><span style="color: #000000">0</span><span style="color: #000000">"</span><span style="color: #000000">).format(</span><span style="color: #000000">25.5</span><span style="color: #000000">));        </span><span style="color: #008000">//</span><span style="color: #008000">四舍五入取整    26</span><span style="color: #008000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #000000">        <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />        System.out.println(Math.random());        </span><span style="color: #008000">//</span><span style="color: #008000">随机double 0.9786833725139645</span><span style="color: #008000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #000000">        System.out.println(</span><span style="color: #0000ff">new</span><span style="color: #000000"> Random().nextFloat());        </span><span style="color: #008000">//</span><span style="color: #008000">随机点?nbsp;0.5196178</span><span style="color: #008000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #000000">        System.out.println(</span><span style="color: #0000ff">new</span><span style="color: #000000"> Random().nextBoolean());        </span><span style="color: #008000">//</span><span style="color: #008000">随机boolean<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />        <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">        Locale.setDefault(Locale.ENGLISH);<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">        DecimalFormat df = new DecimalFormat();<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">        df.applyPattern("00.00");        <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">        System.out.println(df.format(4.2355));</span><span style="color: #008000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" /></span><span style="color: #000000">    }</span></span><span style="color: #000000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" alt="" />}</span></span></div> <img src ="http://www.aygfsteel.com/jzone/aggbug/292581.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/jzone/" target="_blank">Gavin.lee</a> 2009-08-26 00:06 <a href="http://www.aygfsteel.com/jzone/articles/292581.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>多态ȝhttp://www.aygfsteel.com/jzone/articles/292310.htmlGavin.leeGavin.leeSun, 23 Aug 2009 14:42:00 GMThttp://www.aygfsteel.com/jzone/articles/292310.html 它用不同的实例而执行不同操?br /> 多态包括静(rn)态多态性和动态多态?br />
1).?rn)态多态?--~译时多?br /> 即用相同的方法名定义不同的方法内宏V编译时Ҏ(gu)它们的特征来q行~译. 卻I(x)Ҏ(gu)重蝲

2).动态多态?--q行时多?br /> 一U在q行时调用重写方法的机制。子cd象可以作为父cd象用,q是因ؓ(f)子类通过l承具备?jin)父cȝ所有属性。在E序中凡是可以用父cd象的地方Q都有可以用子类对象来代ѝ?br />
Java提供?instanceof q算W,来判断一个对象属于哪个类的实例?

(重蝲是根据需要重写一个方法或在其中加功能     
多态是Ҏ(gu)需要传入不同参数构Z同的实例)

重写Q动态多态?--q行时多?
package com.yixun.wap;

class Father {
    
protected void showInfo() {
        System.out.println(
"Father");
    }

}


class Son extends Father {
    
protected void showInfo() {
        System.out.println(
"Son");
    }


    
protected void showSex() {
        System.out.println(
"?/span>");
    }

}


class Daughter extends Father {
    
protected void showInfo() {
        System.out.println(
"Daughter");
    }


    
protected void showSex() {
        System.out.println(
"?/span>");
    }

}

/**
 * ******************************************
 * @descripte q行时多态,动态多态?br />  * 父类引用指向子类对象Q实际对象ؓ(f)子类
 * java的这U机刉循一个原则:(x)当超cd象引用变量引用子cd象时, 
 * 是被引用对象的类型而不是引用变量的cd军_?jin)调用谁的成员方? 
 * 但是q个被调用的Ҏ(gu)必须是在类中定义过?也就是说被子c覆盖的Ҏ(gu)?br />  * 
@author Gavin.lee
 * @date 2009-8-24下午05:21:49
 * 
@version 1.0
 *
 ********************************************
 
*/

public class TestSon {
    
public static void main(String args[]) {
        Father fa;
        
        fa 
= new Son();     //向上转型Q父cd用指向子cd?/span>
        fa.showInfo();
        
//        fa.showSex();    //无法调用Q父cL此方?nbsp;       
        Son son = (Son)fa;    //向下转型
        son.showSex();

        fa 
= new Daughter();        
        fa.showInfo();
    }

}

/**
 *    Son
 *    ?br />  *    Daughter
 *同一个引用调用了(jin)相同名称的方法,l果却不一?--多态的体现
 
*/



Gavin.lee 2009-08-23 22:42 发表评论
]]>
java enum c?/title><link>http://www.aygfsteel.com/jzone/articles/289678.html</link><dc:creator>Gavin.lee</dc:creator><author>Gavin.lee</author><pubDate>Mon, 03 Aug 2009 14:49:00 GMT</pubDate><guid>http://www.aygfsteel.com/jzone/articles/289678.html</guid><description><![CDATA[<a >http://zhangli-lisa.javaeye.com/blog/394951</a> 关于enum的详l介l了(jin)Q?br /> <br /> <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" /><span style="color: #0000ff">package</span><span style="color: #000000"> com.Gavin.testenum;<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" /><br /> <img id="Codehighlighter1_50_86_Open_Image" onclick="this.style.display='none'; Codehighlighter1_50_86_Open_Text.style.display='none'; Codehighlighter1_50_86_Closed_Image.style.display='inline'; Codehighlighter1_50_86_Closed_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_50_86_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_50_86_Closed_Text.style.display='none'; Codehighlighter1_50_86_Open_Image.style.display='inline'; Codehighlighter1_50_86_Open_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedBlock.gif" align="top" alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">enum</span><span style="color: #000000"> TestEnum </span><span id="Codehighlighter1_50_86_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.aygfsteel.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_50_86_Open_Text"><span style="color: #000000">{<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />    <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />one,two,three,middle,four,five;<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" alt="" />}</span></span></div> <br /> <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" /><span style="color: #0000ff">package</span><span style="color: #000000"> com.Gavin.testenum;<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" /><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000"> org.apache.log4j.Logger;<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" /><br /> <img id="Codehighlighter1_80_839_Open_Image" onclick="this.style.display='none'; Codehighlighter1_80_839_Open_Text.style.display='none'; Codehighlighter1_80_839_Closed_Image.style.display='inline'; Codehighlighter1_80_839_Closed_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_80_839_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_80_839_Closed_Text.style.display='none'; Codehighlighter1_80_839_Open_Image.style.display='inline'; Codehighlighter1_80_839_Open_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedBlock.gif" align="top" alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">class</span><span style="color: #000000"> Test </span><span id="Codehighlighter1_80_839_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.aygfsteel.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_80_839_Open_Text"><span style="color: #000000">{<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" /><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />    </span><span style="color: #0000ff">private</span><span style="color: #000000"> </span><span style="color: #0000ff">static</span><span style="color: #000000"> Logger logger </span><span style="color: #000000">=</span><span style="color: #000000"> Logger.getLogger(Test.</span><span style="color: #0000ff">class</span><span style="color: #000000">);<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />    <br /> <img id="Codehighlighter1_187_367_Open_Image" onclick="this.style.display='none'; Codehighlighter1_187_367_Open_Text.style.display='none'; Codehighlighter1_187_367_Closed_Image.style.display='inline'; Codehighlighter1_187_367_Closed_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_187_367_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_187_367_Closed_Text.style.display='none'; Codehighlighter1_187_367_Open_Image.style.display='inline'; Codehighlighter1_187_367_Open_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" alt="" />    </span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">static</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> main(String[] args) </span><span id="Codehighlighter1_187_367_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.aygfsteel.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_187_367_Open_Text"><span style="color: #000000">{<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />        Test t </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> Test();<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />        logger.debug(TestEnum.one);        </span><span style="color: #008000">//</span><span style="color: #008000">one</span><span style="color: #008000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #000000">        <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />        logger.debug(TestEnum.values().length);        </span><span style="color: #008000">//</span><span style="color: #008000">5</span><span style="color: #008000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #000000">        <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />        t.enumvalues();        </span><span style="color: #008000">//</span><span style="color: #008000">依次打印</span><span style="color: #008000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #000000">        <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />        logger.debug(t.getRandomEnum());<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />    }</span></span><span style="color: #000000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />    <br /> <img id="Codehighlighter1_397_465_Open_Image" onclick="this.style.display='none'; Codehighlighter1_397_465_Open_Text.style.display='none'; Codehighlighter1_397_465_Closed_Image.style.display='inline'; Codehighlighter1_397_465_Closed_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_397_465_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_397_465_Closed_Text.style.display='none'; Codehighlighter1_397_465_Open_Image.style.display='inline'; Codehighlighter1_397_465_Open_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" alt="" />    </span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> enumvalues() </span><span id="Codehighlighter1_397_465_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.aygfsteel.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_397_465_Open_Text"><span style="color: #000000">{<br /> <img id="Codehighlighter1_437_462_Open_Image" onclick="this.style.display='none'; Codehighlighter1_437_462_Open_Text.style.display='none'; Codehighlighter1_437_462_Closed_Image.style.display='inline'; Codehighlighter1_437_462_Closed_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_437_462_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_437_462_Closed_Text.style.display='none'; Codehighlighter1_437_462_Open_Image.style.display='inline'; Codehighlighter1_437_462_Open_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" alt="" />        </span><span style="color: #0000ff">for</span><span style="color: #000000">(TestEnum te: TestEnum.values()) </span><span id="Codehighlighter1_437_462_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.aygfsteel.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_437_462_Open_Text"><span style="color: #000000">{<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />            logger.debug(te);<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />        }</span></span><span style="color: #000000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />    }</span></span><span style="color: #000000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />    <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />    </span><span style="color: #0000ff">private</span><span style="color: #000000"> </span><span style="color: #0000ff">static</span><span style="color: #000000"> </span><span style="color: #0000ff">int</span><span style="color: #000000"> number </span><span style="color: #000000">=</span><span style="color: #000000"> TestEnum.values().length ; </span><span style="color: #008000">//</span><span style="color: #008000">枚Dcȝ数目</span><span style="color: #008000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #000000">    <br /> <img id="Codehighlighter1_568_832_Open_Image" onclick="this.style.display='none'; Codehighlighter1_568_832_Open_Text.style.display='none'; Codehighlighter1_568_832_Closed_Image.style.display='inline'; Codehighlighter1_568_832_Closed_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_568_832_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_568_832_Closed_Text.style.display='none'; Codehighlighter1_568_832_Open_Image.style.display='inline'; Codehighlighter1_568_832_Open_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" alt="" />    </span><span style="color: #0000ff">public</span><span style="color: #000000"> TestEnum getRandomEnum()</span><span id="Codehighlighter1_568_832_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.aygfsteel.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_568_832_Open_Text"><span style="color: #000000">{    <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />        </span><span style="color: #0000ff">long</span><span style="color: #000000"> random </span><span style="color: #000000">=</span><span style="color: #000000"> System.currentTimeMillis() </span><span style="color: #000000">%</span><span style="color: #000000"> number;    <br /> <img id="Codehighlighter1_654_825_Open_Image" onclick="this.style.display='none'; Codehighlighter1_654_825_Open_Text.style.display='none'; Codehighlighter1_654_825_Closed_Image.style.display='inline'; Codehighlighter1_654_825_Closed_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_654_825_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_654_825_Closed_Text.style.display='none'; Codehighlighter1_654_825_Open_Image.style.display='inline'; Codehighlighter1_654_825_Open_Text.style.display='inline';" src="http://www.aygfsteel.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" alt="" />        </span><span style="color: #0000ff">switch</span><span style="color: #000000"> ((</span><span style="color: #0000ff">int</span><span style="color: #000000">) random)</span><span id="Codehighlighter1_654_825_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.aygfsteel.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_654_825_Open_Text"><span style="color: #000000">{    <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />        </span><span style="color: #0000ff">case</span><span style="color: #000000"> </span><span style="color: #000000">0</span><span style="color: #000000">:    <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />            </span><span style="color: #0000ff">return</span><span style="color: #000000"> TestEnum.one; <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />        </span><span style="color: #0000ff">case</span><span style="color: #000000"> </span><span style="color: #000000">1</span><span style="color: #000000">:    <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />            </span><span style="color: #0000ff">return</span><span style="color: #000000"> TestEnum.two;  <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />        </span><span style="color: #0000ff">case</span><span style="color: #000000"> </span><span style="color: #000000">2</span><span style="color: #000000">:    <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />            </span><span style="color: #0000ff">return</span><span style="color: #000000"> TestEnum.three;    <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />        </span><span style="color: #0000ff">default</span><span style="color: #000000">:<br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />            </span><span style="color: #0000ff">return</span><span style="color: #000000">    TestEnum.middle;  <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />        }</span></span><span style="color: #000000">    <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />    }</span></span><span style="color: #000000">    <br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" /><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" alt="" />}</span></span><span style="color: #000000"><br /> <img src="http://www.aygfsteel.com/images/OutliningIndicators/None.gif" align="top" alt="" /></span></div> <img src ="http://www.aygfsteel.com/jzone/aggbug/289678.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/jzone/" target="_blank">Gavin.lee</a> 2009-08-03 22:49 <a href="http://www.aygfsteel.com/jzone/articles/289678.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> վ֩ģ壺 <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ɼ</a>| <a href="http://" target="_blank">տ</a>| <a href="http://" target="_blank">ǭ</a>| <a href="http://" target="_blank">Ԫ</a>| <a href="http://" target="_blank">¹</a>| <a href="http://" target="_blank">Ϫ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">¦</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Դ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ͷ</a>| <a href="http://" target="_blank">ԭ</a>| <a href="http://" target="_blank">ɽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ƺ</a>| <a href="http://" target="_blank">ͼ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ӫɽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ī񹤿</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ľ˹</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ϫ</a>| <a href="http://" target="_blank">Ϳ</a>| <a href="http://" target="_blank">̴</a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>