﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-日出而作兮勤于外，日落而归兮忙于内-随笔分类-j2se</title><link>http://www.blogjava.net/cherishchen/category/23923.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 12 May 2010 02:35:11 GMT</lastBuildDate><pubDate>Wed, 12 May 2010 02:35:11 GMT</pubDate><ttl>60</ttl><item><title>关于Java String的intern and ==的笔试题，没有全答对</title><link>http://www.blogjava.net/cherishchen/archive/2008/03/17/186782.html</link><dc:creator>凭栏观海</dc:creator><author>凭栏观海</author><pubDate>Mon, 17 Mar 2008 07:43:00 GMT</pubDate><guid>http://www.blogjava.net/cherishchen/archive/2008/03/17/186782.html</guid><wfw:comment>http://www.blogjava.net/cherishchen/comments/186782.html</wfw:comment><comments>http://www.blogjava.net/cherishchen/archive/2008/03/17/186782.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cherishchen/comments/commentRss/186782.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cherishchen/services/trackbacks/186782.html</trackback:ping><description><![CDATA[<blockquote>
<pre>package testPackage;<br />
class Test {<br />
public static void main(String[] args) {<br />
String hello = "Hello", lo = "lo";<br />
System.out.print((hello == "Hello") + " ");<br />
System.out.print((Other.hello == hello) + " ");<br />
System.out.print((other.Other.hello == hello) + " ");<br />
System.out.print((hello == ("Hel"+"lo")) + " ");<br />
System.out.print((hello == ("Hel"+lo)) + " ");<br />
System.out.println(hello == ("Hel"+lo).intern());<br />
}<br />
}<br />
class Other { static String hello = "Hello"; }<br />
</pre>
</blockquote>
<p><a name="229778"></a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; and the compilation unit: </p>
<blockquote>
<pre>package other;<br />
public class Other { static String hello = "Hello"; }</pre>
</blockquote>
<pre> 正确答案：true true true true false true</pre>
<pre>&nbsp;</pre>
<p>This example illustrates six points:
</p>
<ul><a name="241676"></a>
    <li>Literal strings within the same class <a href="http://java.sun.com/docs/books/jls/second_edition/html/classes.doc.html#3857">(&#167;8)</a> in the same package <a href="http://java.sun.com/docs/books/jls/second_edition/html/packages.doc.html#34412">(&#167;7)</a> represent references to the same <code>String</code> object <a href="http://java.sun.com/docs/books/jls/second_edition/html/typesValues.doc.html#12028">(&#167;4.3.1)</a>. <a name="229807"></a>
    </li>
    <li>Literal strings within different classes in the same package represent references to the same <code>String</code> object. <a name="229797"></a>
    </li>
    <li>Literal strings within different classes in different packages likewise represent references to the same <code>String</code> object. <a name="23858"></a>
    </li>
    <li>Strings computed by constant expressions <a href="http://java.sun.com/docs/books/jls/second_edition/html/expressions.doc.html#5313">(&#167;15.28)</a> are <strong>computed a</strong>t compile time and then treated as if they were literals. <a name="23859"></a>
    </li>
    <li><strong>Strings computed at run time are newly created and therefore distinct</strong>. <a name="23865"></a>
    </li>
    <li>The result of explicitly interning a computed string is the same string as any pre-existing literal string with the same contents. </li>
</ul>
<p>&nbsp;</p>
<p>呵呵，我是没有能够全部答对</p>
<p>&nbsp;</p>
<p>另外一篇关于String intern的文章：</p>
<p><a title="http://laiseeme.javaeye.com/blog/102442" href="http://laiseeme.javaeye.com/blog/102442">http://laiseeme.javaeye.com/blog/102442</a></p>
<img src ="http://www.blogjava.net/cherishchen/aggbug/186782.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cherishchen/" target="_blank">凭栏观海</a> 2008-03-17 15:43 <a href="http://www.blogjava.net/cherishchen/archive/2008/03/17/186782.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设计及设计模式：关于Java权限控制算法(转）</title><link>http://www.blogjava.net/cherishchen/archive/2008/02/25/181882.html</link><dc:creator>凭栏观海</dc:creator><author>凭栏观海</author><pubDate>Mon, 25 Feb 2008 01:20:00 GMT</pubDate><guid>http://www.blogjava.net/cherishchen/archive/2008/02/25/181882.html</guid><wfw:comment>http://www.blogjava.net/cherishchen/comments/181882.html</wfw:comment><comments>http://www.blogjava.net/cherishchen/archive/2008/02/25/181882.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cherishchen/comments/commentRss/181882.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cherishchen/services/trackbacks/181882.html</trackback:ping><description><![CDATA[<p>http://publish.itpub.net/j/2008-01-24/200801240919412.shtml</p>
<p>
作者：<strong class="red">来自ITPUB论坛</strong>&nbsp;&nbsp;2008-01-24</p>
<p><br />
</p>
<p>向大家介绍一种很不错，也是Linux中的权限管理算法。
</p>
<p>　　定义a^b为：a的b次方</p>
<p>　　假如，我们为每一个操作设定一个唯一的整数值，比如：</p>
<p>　　删除A---0</p>
<p>　　修改A---1</p>
<p>　　添加A---2</p>
<p>　　删除B---3</p>
<p>　　修改B---4</p>
<p>　　添加B---5</p>
<p>　　。。。</p>
<p>　　理论上可以有N个操作，这取决于你用于储存用户权限值的数据类型了。</p>
<p>　　这样，如果用户有权限：添加A---2;删除B---3;修改B---4</p>
<p>　　那用户的权限值 purview =2^2+2^3+2^4=28，也就是2的权的和了</p>
<p>　　化成二进制可以表示为11100</p>
<p>　　如果要验证用户是否有删除B的权限，就可以通过位与运算来实现。</p>
<p>　　在Java里，位与运算运算符号为&amp;</p>
<p>　　即是：int value = purview &amp;((int)Math.pow(2,3));</p>
<p>　　你会发现，当用户有操作权限时，运算出来的结果都会等于这个操作需要的权限值!</p>
<p>　　原理：</p>
<p>　　位与运算，顾名思义就是对位进行与运算：</p>
<p>　　以上面的式子为例：purview &amp; 2^3 也就是　28&amp;8</p>
<p>　　将它们化成二进制有</p>
<p>　　11100</p>
<p>　　&amp; 01000</p>
<p>　　-------------------</p>
<p>　　01000 == 8(十进制)　==　2^3</p>
<p>　　同理，如果要验证是否有删除A---0的权限</p>
<p>　　可以用：purview &amp;((int)Math.pow(2,0));</p>
<p>　　即：</p>
<p>　　11100</p>
<p>　　&amp; 00001</p>
<p>　　------------------------</p>
<p>　　00000 == 0(十进制)　　!=　2^0</p>
<p>　　这种算法的一个优点是速度快。可以同时处理N个权限，设置N种角色.</p>
<p>　　如果想验证是否同时有删除A---0和删除B---3的权限</p>
<p>　　可以用purview&amp;(2^0+2^3)==(2^0+2^3)?true:false;</p>
<p>　　设置多角色用户。根据权限值判断用户的角色。。。</p>
<p>　　下面提供一个java的单操作权限判断的代码：</p>
<div style="overflow: auto; width: 500px;">
<pre style="border: 1px solid black; padding: 4px; background-color: #ededed;">
<div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/
--><span style="color: #000000;">　　</span><span style="color: #008000;">//</span><span style="color: #008000;">userPurview是用户具有的总权限<br />
</span><span style="color: #008000;">//</span><span style="color: #008000;">optPurview是一个操作要求的权限为一个整数(没有经过权的!)</span><span style="color: #008000;"><br />
</span><span style="color: #000000;"><br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> boolean checkPower(</span><span style="color: #0000ff;">int</span><span style="color: #000000;"> userPurview, </span><span style="color: #0000ff;">int</span><span style="color: #000000;"> optPurview){<br />
</span><span style="color: #0000ff;">int</span><span style="color: #000000;"> purviewValue </span><span style="color: #000000;">=</span><span style="color: #000000;"> (</span><span style="color: #0000ff;">int</span><span style="color: #000000;">)Math.pow(</span><span style="color: #000000;">2</span><span style="color: #000000;">, optPurview);<br />
</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> (userPurview </span><span style="color: #000000;">&amp;</span><span style="color: #000000;"> purviewValue) </span><span style="color: #000000;">==</span><span style="color: #000000;"> purviewValue;<br />
}</span></div>
<br />
</pre>
</div>
<p>　　当然，多权限的验证只要扩展一下就可以了。</p>
<p>　　几点注意事项：首先，一个系统可能有很多的操作，因此，请建立数据字典，以便查阅，修改时使用。其次，如果用数据库储存用户权限，请注意数值的
有效范围。操作权限值请用唯一的整数!Java的int类型最多可以储存11个权限和.如果超过，可以选择其它数据类型，而且建议不同模块，使用多个权限
变量.</p>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/cherishchen/aggbug/181882.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cherishchen/" target="_blank">凭栏观海</a> 2008-02-25 09:20 <a href="http://www.blogjava.net/cherishchen/archive/2008/02/25/181882.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java基础：byte与int</title><link>http://www.blogjava.net/cherishchen/archive/2007/07/31/133588.html</link><dc:creator>凭栏观海</dc:creator><author>凭栏观海</author><pubDate>Tue, 31 Jul 2007 07:54:00 GMT</pubDate><guid>http://www.blogjava.net/cherishchen/archive/2007/07/31/133588.html</guid><wfw:comment>http://www.blogjava.net/cherishchen/comments/133588.html</wfw:comment><comments>http://www.blogjava.net/cherishchen/archive/2007/07/31/133588.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cherishchen/comments/commentRss/133588.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cherishchen/services/trackbacks/133588.html</trackback:ping><description><![CDATA[<p>byte与int的区别：</p> <ul> <li>byte uses 1 byte while int uses 4 bytes.  <li>integer literals like "45" are of int not byte.If you want a literal to be a byte, you have to cast it: "(byte)45".  <li>When values are promoted as part of an expression or as parameters to a method call, they may be promoted to int, but never to byte.  <li>Many parts of the Java language used int, but none of them use byte. For example, the length of an array is an int. </li></ul> <h4><strong>byte类型的使用场合：</strong></h4> <p>由于不同的机器对于<strong>多字节数据(int 就是采用4个byte保存数据）</strong>的存储方式不同,可能是 低字节向高字节存储,也可能是从高字节向低字节存储,这样,<strong>在 分析网络协议或文件格时</strong>,为了解决不同机器上的字节存储顺序问题,用byte类型来表示数据是合适的。<strong>而通常情况下,由于其表示的数据范围很小,容易造成溢出,应避免使用。</strong></p> <p><br>/**<br>&nbsp;&nbsp;&nbsp;&nbsp; * Convert&nbsp; an int to a byte array<br>&nbsp;&nbsp;&nbsp;&nbsp; *<br>&nbsp;&nbsp;&nbsp;&nbsp; * @param value int<br>&nbsp;&nbsp;&nbsp;&nbsp; * @return byte[]<br>&nbsp;&nbsp;&nbsp;&nbsp; */<br>public static byte[] intToByteArray(int value) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte[] b = new byte[4];</p> <p>&nbsp;&nbsp;&nbsp;&nbsp; // 使用4个byte表示int<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; 4; i++) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int offset = (b.length - 1 - i) * 8;&nbsp; // 偏移量<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b[i] = (byte) ((value &gt;&gt; offset) &amp; 0xFF); //每次取8bit<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return b;<br>&nbsp;&nbsp;&nbsp; }</p> <p><br>&nbsp;&nbsp;&nbsp; /**<br>&nbsp;&nbsp;&nbsp;&nbsp; * Convert the byte array to an int starting from the given offset.<br>&nbsp;&nbsp;&nbsp;&nbsp; *<br>&nbsp;&nbsp;&nbsp;&nbsp; * @param b The byte array<br>&nbsp;&nbsp;&nbsp;&nbsp; * @param offset The array offset,如果byte数组长度就是4，则该值为0<br>&nbsp;&nbsp;&nbsp;&nbsp; * @return The integer<br>&nbsp;&nbsp;&nbsp;&nbsp; */&nbsp;&nbsp; </p> <p>public static int byteArrayToInt(byte[] b, int offset) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int value = 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; b.length; i++) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int shift = (b.length - 1 - i) * 8;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; value += (b[i + offset] &amp; 0xFF) &lt;&lt; shift;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return value;<br>&nbsp;&nbsp;&nbsp; }  <p>&nbsp;</p> <p>public static void main(String[] args) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte[] bb=intToByteArray(255);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i=0;i&lt;bb.length;i++){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(bb[i]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; }  <p>输出结果：</p> <p>0<br>0<br>0<br>-1  <p>这是补码的形式（10000001），取反加1可以得到源码（11111111）  <img src ="http://www.blogjava.net/cherishchen/aggbug/133588.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cherishchen/" target="_blank">凭栏观海</a> 2007-07-31 15:54 <a href="http://www.blogjava.net/cherishchen/archive/2007/07/31/133588.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>判断resultset是否含有记录</title><link>http://www.blogjava.net/cherishchen/archive/2007/07/30/133368.html</link><dc:creator>凭栏观海</dc:creator><author>凭栏观海</author><pubDate>Mon, 30 Jul 2007 08:42:00 GMT</pubDate><guid>http://www.blogjava.net/cherishchen/archive/2007/07/30/133368.html</guid><wfw:comment>http://www.blogjava.net/cherishchen/comments/133368.html</wfw:comment><comments>http://www.blogjava.net/cherishchen/archive/2007/07/30/133368.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cherishchen/comments/commentRss/133368.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cherishchen/services/trackbacks/133368.html</trackback:ping><description><![CDATA[<p>boolean hasRows = false;<br>while (rs.next()){<br>&nbsp; hasRows&nbsp; = true;<br>&nbsp; //Do your stuff<br>}<br>if (!hasRows ){<br>&nbsp; //Empty result set<br>}<br>//You dont have to test for null result set </p><img src ="http://www.blogjava.net/cherishchen/aggbug/133368.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cherishchen/" target="_blank">凭栏观海</a> 2007-07-30 16:42 <a href="http://www.blogjava.net/cherishchen/archive/2007/07/30/133368.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java的数据类型（备用）</title><link>http://www.blogjava.net/cherishchen/archive/2007/07/27/132720.html</link><dc:creator>凭栏观海</dc:creator><author>凭栏观海</author><pubDate>Fri, 27 Jul 2007 03:11:00 GMT</pubDate><guid>http://www.blogjava.net/cherishchen/archive/2007/07/27/132720.html</guid><wfw:comment>http://www.blogjava.net/cherishchen/comments/132720.html</wfw:comment><comments>http://www.blogjava.net/cherishchen/archive/2007/07/27/132720.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cherishchen/comments/commentRss/132720.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cherishchen/services/trackbacks/132720.html</trackback:ping><description><![CDATA[&nbsp; 结合了前段时间看unicode的知识补补基础<br><br>
<ul>
    <li><strong>byte</strong>: The <code>byte</code> data type is an 8-bit signed two's complement integer. It has a minimum value of -128 and a maximum value of 127 (inclusive). The <code>byte</code> data type can be useful for saving memory in large <a href="http://java.sun.com/docs/books/tutorial/java/nutsandbolts/arrays.html">arrays</a>, where the memory savings actually matters. They can also be used in place of <code>int</code> where their limits help to clarify your code; the fact that a variable's range is limited can serve as a form of documentation.  </li>
    <li><strong>short</strong>: The <code>short</code> data type is a 16-bit signed two's complement integer. It has a minimum value of -32,768 and a maximum value of 32,767 (inclusive). As with <code>byte</code>, the same guidelines apply: you can use a <code>short</code> to save memory in large arrays, in situations where the memory savings actually matters.  </li>
    <li><strong>int</strong>: The <code>int</code> data type is a 32-bit signed two's complement integer. It has a minimum value of -2,147,483,648 and a maximum value of 2,147,483,647 (inclusive). For integral values, this data type is generally the default choice unless there is a reason (like the above) to choose something else. This data type will most likely be large enough for the numbers your program will use, but if you need a wider range of values, use <code>long</code> instead.  </li>
    <li><strong>long</strong>: The <code>long</code> data type is a 64-bit signed two's complement integer. It has a minimum value of -9,223,372,036,854,775,808 and a maximum value of 9,223,372,036,854,775,807 (inclusive). Use this data type when you need a range of values wider than those provided by <code>int</code>.  </li>
    <li><strong>float</strong>: The <code>float</code> data type is a single-precision 32-bit IEEE 754 floating point. Its range of values is beyond the scope of this discussion, but is specified in section <a href="http://java.sun.com/docs/books/jls/third_edition/html/typesValues.html#4.2.3">4.2.3</a> of the Java Language Specification. As with the recommendations for <code>byte</code> and <code>short</code>, use a <code>float</code> (instead of <code>double</code>) if you need to save memory in large arrays of floating point numbers. This data type should never be used for precise values, such as currency. For that, you will need to use the <a href="http://java.sun.com/javase/6/docs/api/java/math/BigDecimal.html">java.math.BigDecimal</a> class instead. <a href="http://java.sun.com/docs/books/tutorial/java/data/index.html">Numbers and Strings</a> covers <code>BigDecimal</code> and other useful classes provided by the Java platform.  </li>
    <li><strong>double</strong>: The <code>double</code> data type is a double-precision 64-bit IEEE 754 floating point. Its range of values is beyond the scope of this discussion, but is specified in section <a href="http://java.sun.com/docs/books/jls/third_edition/html/typesValues.html#4.2.3">4.2.3</a> of the Java Language Specification. For decimal values, this data type is generally the default choice. As mentioned above, this data type should never be used for precise values, such as currency.  </li>
    <li><strong>boolean</strong>: The <code>boolean</code> data type has only two possible values: <code>true</code> and <code>false</code>. Use this data type for simple flags that track true/false conditions. This data type represents one bit of information, but its "size" isn't something that's precisely defined.  </li>
    <li><strong>char</strong>: The <code>char</code> data type is a single 16-bit Unicode character. It has a minimum value of <code>'\u0000'</code> (or 0) and a maximum value of <code>'\uffff'</code> (or 65,535 inclusive). </li>
</ul>
<p>&nbsp;</p>
<table unselectable="on" border="0" cellpadding="2" cellspacing="0" width="828">
    <tbody>
        <tr>
            <td valign="top" width="173">
            <p><strong>类型名称</strong></p>
            </td>
            <td valign="top" width="177"><strong>类型定义</strong></td>
            <td valign="top" width="474"><strong>类型取值</strong></td>
        </tr>
        <tr>
            <td valign="top" width="173"><em>boolean</em></td>
            <td valign="top" width="177">布尔值</td>
            <td valign="top" width="473"><em>true</em>, <em>false</em></td>
        </tr>
        <tr>
            <td valign="top" width="173"><em>byte</em></td>
            <td valign="top" width="177">8位<strong>有符号整数</strong></td>
            <td valign="top" width="473">最小值-128，最大值127</td>
        </tr>
        <tr>
            <td valign="top" width="173"><em>short</em></td>
            <td valign="top" width="177">16位<strong>有符号整数</strong></td>
            <td valign="top" width="472">
            <p>最小值-32768（-2<sup>15</sup>），最大值32767（2<sup>15</sup>-1）</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="173"><em>int</em></td>
            <td valign="top" width="177">32位<strong>有符号整数</strong></td>
            <td valign="top" width="472">最小值-2147483648（-2<sup>31</sup>），最大值2147483647（2<sup>31</sup>-1）</td>
        </tr>
        <tr>
            <td valign="top" width="173"><em>long</em></td>
            <td valign="top" width="177">64位<strong>有符号整数</strong></td>
            <td valign="top" width="472">
            <p>-2<sup>63</sup>~(2<sup>63</sup>-1)</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="173"><em>float</em></td>
            <td valign="top" width="177">32位浮点数</td>
            <td valign="top" width="472">
            <p>1.4E-45~3.4028235E38</p>
            </td>
        </tr>
        <tr>
            <td valign="top" width="173"><em>double</em></td>
            <td valign="top" width="177">64位浮点数</td>
            <td valign="top" width="472">4.9E-324~1.7976931348623157E308</td>
        </tr>
        <tr>
            <td valign="top" width="173">char</td>
            <td valign="top" width="177">16位Unicode字符</td>
            <td valign="top" width="472">&nbsp;</td>
        </tr>
        <tr>
            <td valign="top" width="173">&nbsp;</td>
            <td valign="top" width="177">&nbsp;</td>
            <td valign="top" width="472">&nbsp;</td>
        </tr>
    </tbody>
</table>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<div class="ad_in_page"> <script type="text/javascript"><!--
google_ad_client = "pub-7843511305731432";
google_ad_width =" 468;
google_ad_height" = 60;
google_ad_format =" "468x60_as";
google_ad_type" = "text_image";
//2007-07-22: test
google_ad_channel =" "2043099642";
google_color_border" = "ffffff";
google_color_bg =" "ffffff";
google_color_link" = "ffffff";
google_color_text =" "000000";
google_color_url" = "000033";
//-->
</script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script> </div><img src ="http://www.blogjava.net/cherishchen/aggbug/132720.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cherishchen/" target="_blank">凭栏观海</a> 2007-07-27 11:11 <a href="http://www.blogjava.net/cherishchen/archive/2007/07/27/132720.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java语言中的bit 移位操作</title><link>http://www.blogjava.net/cherishchen/archive/2007/07/27/132717.html</link><dc:creator>凭栏观海</dc:creator><author>凭栏观海</author><pubDate>Fri, 27 Jul 2007 03:08:00 GMT</pubDate><guid>http://www.blogjava.net/cherishchen/archive/2007/07/27/132717.html</guid><wfw:comment>http://www.blogjava.net/cherishchen/comments/132717.html</wfw:comment><comments>http://www.blogjava.net/cherishchen/archive/2007/07/27/132717.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cherishchen/comments/commentRss/132717.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cherishchen/services/trackbacks/132717.html</trackback:ping><description><![CDATA[<div class="ad_in_page"> <script type="text/javascript"><!--
google_ad_client = "pub-7843511305731432";
google_ad_width = 468;
google_ad_height = 60;
google_ad_format = "468x60_as";
google_ad_type = "text_image";
//2007-07-22: test
google_ad_channel = "2043099642";
google_color_border = "FFFFFF";
google_color_bg = "FFFFFF";
google_color_link = "FFFFFF";
google_color_text = "000000";
google_color_url = "000033";
//-->
</script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script> </div>  <div class="ad_in_page">&nbsp;</div> <h4><strong>java 位操作符：</strong></h4> <p><strong>取反：</strong>~x<br>- flips each bit to the opposite value.  <p><b>与操作：AND</b>  <p>x &amp; y<br>- AND operation between the corresponding bits in x and y.  <p><b>或操作：OR</b><br>x | y<br>- OR operation between the corresponding bits in x and y.  <p><b>异或操作：XOR</b><br>x ^ y<br>- XOR operation between the corresponding bits in x and y.  <p><strong>左移操作：Shift left</strong><br>x &lt;&lt; y<br>- shifts x to the left by y bits. The high order bits are lost while zeros fill the right bits.  <p>将x左移y位，移动过程中，高位会丢失  <p><b>有符号数右移操作：Shift Right - Signed</b><br>x &gt;&gt; y<br>- shifts x to the right by y bits. The low order bits are lost while the sign bit value (0 for positive numbers, 1 for negative) fills in the left bits.  <p><b>无符号数右移：Shift Right - Unsigned</b><br>x &gt;&gt;&gt; y <br>- shifts x to the right by y bits. The low order bits are lost while zeros fill in the left bits regardless of the sign.  <h4><strong>例子：</strong></h4> <p>下面的例子显示如何将一个int数组通过移位操作压缩到一个int内保存，其原理是在java语言中，int类型使用4 bytes来保存，因此对于需要压缩的int数组，其中的每一个int值的大小不能超过255（2的8次方-1），因此这只是一个实例：</p> <p>&nbsp;&nbsp;int [] aRGB = {0x56, 0x78, 0x9A, 0xBC};&nbsp;&nbsp;&nbsp;//&nbsp;是用16进制保存的4种颜色值<br>&nbsp;&nbsp;int color_val = aRGB[3];&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;color_val = color_val | (aRGB[2] &lt;&lt; 8);&nbsp; //&nbsp;为了压缩，需要放置到color_val值的第二个字节位置上：将aRGB[2]&nbsp;左移到第二个byte，同时与color_val进行或操作，下面同理<br>&nbsp;&nbsp;color_val = color_val | (aRGB[1] &lt;&lt; 16);&nbsp;&nbsp;<br>&nbsp;&nbsp;color_val = color_val | (aRBG[0] &lt;&lt; 24);  <p>操作完的结果是56 78 9A BC  <p>如果要从colorVal 还原为int数组，或者得到数组中的某个值，只需要对colorVal 进行相应的右移操作即可：  <p>&nbsp;&nbsp;int alpha_val = (colorVal &gt;&gt;&gt; 24) &amp; 0xFF;<br>&nbsp;&nbsp;int red_val &nbsp;&nbsp;= (colorVal &gt;&gt;&gt; 16) &amp; 0xFF;<br>&nbsp;&nbsp;int green_val = (colorVal &gt;&gt;&gt; &nbsp;8) &amp; 0xFF;<br>&nbsp;&nbsp;int blue_val &nbsp;= &nbsp;colorVal &amp; 0xFF;  <p>参考资料：  <p><a href="http://www.particle.kth.se/%7Elindsey/JavaCourse/Book/Part1/Tech/Chapter10/bits.html" target="_blank">Bits in Java</a></p><img src ="http://www.blogjava.net/cherishchen/aggbug/132717.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cherishchen/" target="_blank">凭栏观海</a> 2007-07-27 11:08 <a href="http://www.blogjava.net/cherishchen/archive/2007/07/27/132717.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JPA --Java EE 5.0 ORM 规范（转）</title><link>http://www.blogjava.net/cherishchen/archive/2007/07/21/131658.html</link><dc:creator>凭栏观海</dc:creator><author>凭栏观海</author><pubDate>Sat, 21 Jul 2007 12:50:00 GMT</pubDate><guid>http://www.blogjava.net/cherishchen/archive/2007/07/21/131658.html</guid><wfw:comment>http://www.blogjava.net/cherishchen/comments/131658.html</wfw:comment><comments>http://www.blogjava.net/cherishchen/archive/2007/07/21/131658.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/cherishchen/comments/commentRss/131658.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cherishchen/services/trackbacks/131658.html</trackback:ping><description><![CDATA[<p>作者: 它山 出处:<a href="http://www.it168.com/">IT168</a></p> <p><a title="http://tech.it168.com/j/n/2007-03-05/200703051354348.shtml" href="http://tech.it168.com/j/n/2007-03-05/200703051354348.shtml">http://tech.it168.com/j/n/2007-03-05/200703051354348.shtml</a></p> <p>PA作为一项对象持久化的标准，不但可以获得Java EE应用服务器的支持，还可以直接在Java SE中使用。</p> <p>介绍得很清楚的文章</p> <p>&nbsp;</p> <p><strong>JPA概述</strong>  <p>JPA(Java Persistence API)作为Java EE 5.0平台标准的ORM规范，将得到所有Java EE服务器的支持。Sun这次吸取了之前EJB规范惨痛失败的经历，在充分吸收现有ORM框架的基础上，得到了一个易于使用、伸缩性强的ORM规范。从目前的开发社区的反应上看，JPA受到了极大的支持和赞扬，JPA作为ORM领域标准化整合者的目标应该不难实现。&nbsp;  <p>JPA通过JDK 5.0注解或XML描述对象－关系表的映射关系，并将运行期的实体对象持久化到数据库中，图 1很好地描述了JPA的结构：  <p><img height="305" alt="" src="http://developer.51cto.com/files/uploadimg/20070305/1547200.JPG" width="450">  <p>Sun引入新的JPA ORM规范出于两个原因：其一，简化现有Java EE和Java SE应用的对象持久化的开发工作；其二，Sun希望整合对ORM技术，实现天下归一。&nbsp;  <p>JPA由EJB 3.0软件专家组开发，作为JSR-220实现的一部分。但它不囿于EJB 3.0，你可以在Web应用、甚至桌面应用中使用。JPA的宗旨是为POJO提供持久化标准规范，由此可见，经过这几年的实践探索，能够脱离容器独立运行，方便开发和测试的理念已经深入人心了。目前Hibernate 3.2、TopLink 10.1.3以及OpenJpa都提供了JPA的实现。  <p>JPA的总体思想和现有Hibernate、TopLink，JDO等ORM框架大体一致。总的来说，JPA包括以下3方面的技术：&nbsp;  <ul> <li>ORM映射元数据，JPA支持XML和JDK 5.0注解两种元数据的形式，元数据描述对象和表之间的映射关系，框架据此将实体对象持久化到数据库表中；&nbsp;  <li>JPA 的API，用来操作实体对象，执行CRUD操作，框架在后台替我们完成所有的事情，开发者从繁琐的JDBC和SQL代码中解脱出来。&nbsp;  <li>查询语言，这是持久化操作中很重要的一个方面，通过面向对象而非面向数据库的查询语言查询数据，避免程序的SQL语句紧密耦合。&nbsp;</li></ul><img src ="http://www.blogjava.net/cherishchen/aggbug/131658.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cherishchen/" target="_blank">凭栏观海</a> 2007-07-21 20:50 <a href="http://www.blogjava.net/cherishchen/archive/2007/07/21/131658.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个简单blog备份工具的实现</title><link>http://www.blogjava.net/cherishchen/archive/2007/07/16/130508.html</link><dc:creator>凭栏观海</dc:creator><author>凭栏观海</author><pubDate>Mon, 16 Jul 2007 03:22:00 GMT</pubDate><guid>http://www.blogjava.net/cherishchen/archive/2007/07/16/130508.html</guid><wfw:comment>http://www.blogjava.net/cherishchen/comments/130508.html</wfw:comment><comments>http://www.blogjava.net/cherishchen/archive/2007/07/16/130508.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.blogjava.net/cherishchen/comments/commentRss/130508.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cherishchen/services/trackbacks/130508.html</trackback:ping><description><![CDATA[<p>&nbsp;</p> <p>为了备份blog，简单写了一个适用于blogjava等metaWeblog的blog备份工具，功能：</p> <p>（1）备份post的正文到本地</p> <p>（2）备份正文中的图片、css文件到本地</p> <p>（3）基于以上两的步骤，修改相关的链接，实现本地脱机浏览</p> <p>想到了但是未实现的功能：</p> <p>（1）评论无法保存</p> <p>（2）合适的话可以考虑以Eclipes RCP形式包装</p> <p>&nbsp;</p> <div class="ad_in_page"> <script type="text/javascript"><!--
google_ad_client = "pub-7843511305731432";
google_ad_width = 468;
google_ad_height = 60;
google_ad_format = "468x60_as";
google_ad_type = "text_image";
//2007-07-22: test
google_ad_channel = "2043099642";
google_color_border = "FFFFFF";
google_color_bg = "FFFFFF";
google_color_link = "FFFFFF";
google_color_text = "000000";
google_color_url = "000033";
//-->
</script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script> </div> <h2>一、实现原理</h2> <p>（1）获取post的方法：使用MetaWeblog提供的API接口</p> <p>metaWeblog.getRecentPosts (blogid, username, password, numberOfPosts) returns array of structs,</p> <p>Each struct represents a recent weblog post, containing the same information that a call to metaWeblog.getPost would return. </p> <p>If numberOfPosts is 1, you get the most recent post. If it's 2 you also get the second most recent post, as the second array element. If numberOfPosts is greater than the number of posts in the weblog you get all the posts in the weblog. </p> <p>&nbsp;</p> <p>(2) 使用正则表达式分析获取下来的post，解析出post中包含的css和图片文件的地址，执行两步操作</p> <ul> <li>根据地址，抓取图片保存到本地  <li>修改post中的地址为本地保存地址 </li></ul> <p>(3) 使用xml-rpc来简化远程调用过程的编程</p> <p>&nbsp;</p> <h2>二、主要的代码</h2> <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%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;ArrayList</span><span style="color: #000000">&lt;</span><span style="color: #000000">SimplePost</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;getAllPosts(String&nbsp;blogID,&nbsp;String&nbsp;name,String&nbsp;password,&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;num)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;XmlRpcException&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ArrayList</span><span style="color: #000000">&lt;</span><span style="color: #000000">SimplePost</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;posts&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ArrayList</span><span style="color: #000000">&lt;</span><span style="color: #000000">SimplePost</span><span style="color: #000000">&gt;</span><span style="color: #000000">();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object[]&nbsp;params&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Object[]&nbsp;{&nbsp;blogID,&nbsp;name,&nbsp;password,</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Integer(num)&nbsp;};<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object[]&nbsp;result&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(Object[])&nbsp;client.execute(</span><span style="color: #000000">"</span><span style="color: #000000">metaWeblog.getRecentPosts</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;params);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;i&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;result.length;&nbsp;i</span><span style="color: #000000">++</span><span style="color: #000000">)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Map&nbsp;map&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(Map)&nbsp;result[i];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;postUrl&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(String)&nbsp;map.get(</span><span style="color: #000000">"</span><span style="color: #000000">link</span><span style="color: #000000">"</span><span style="color: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;title&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(String)&nbsp;map.get(</span><span style="color: #000000">"</span><span style="color: #000000">title</span><span style="color: #000000">"</span><span style="color: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;postId&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(String)&nbsp;map.get(</span><span style="color: #000000">"</span><span style="color: #000000">postid</span><span style="color: #000000">"</span><span style="color: #000000">);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;post的内容</span><span style="color: #008000"><br></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;description&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(String)&nbsp;map.get(</span><span style="color: #000000">"</span><span style="color: #000000">description</span><span style="color: #000000">"</span><span style="color: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Map</span><span style="color: #000000">&lt;</span><span style="color: #000000">String,&nbsp;String</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;images&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;HashMap</span><span style="color: #000000">&lt;</span><span style="color: #000000">String,&nbsp;String</span><span style="color: #000000">&gt;</span><span style="color: #000000">();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;images&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;getImagesURL(description);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;newDes&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;handleImagesURL(description,postId);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;descriptioFileName&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;savePostContent(savePath,&nbsp;title,postId,&nbsp;newDes,&nbsp;css);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SimplePost&nbsp;post&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;SimplePost(postUrl,&nbsp;title,&nbsp;postId,descriptioFileName);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">从postContent获取图像的地址和名称，以便获取图片并保存</span><span style="color: #008000"><br></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;post.setImages(images);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;posts.add(post);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.debug(</span><span style="color: #000000">"</span><span style="color: #000000">postID:&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;postId&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">postTitle&nbsp;:</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;title);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;posts;<br>&nbsp;&nbsp;&nbsp;&nbsp;}</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%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;Map</span><span style="color: #000000">&lt;</span><span style="color: #000000">String,&nbsp;String</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;getImagesURL(String&nbsp;description)&nbsp;{<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #008000"></span><span style="color: #000000">&nbsp; Map</span><span style="color: #000000">&lt;</span><span style="color: #000000">String,&nbsp;String</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;map&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;HashMap</span><span style="color: #000000">&lt;</span><span style="color: #000000">String,&nbsp;String</span><span style="color: #000000">&gt;</span><span style="color: #000000">();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;img&nbsp;的正则表达式<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #008000"></span><span style="color: #000000">&nbsp; String&nbsp;imgPattern&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&lt;\\s*img\\s+([^&gt;]+)\\s*&gt;</span><span style="color: #000000">"</span><span style="color: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Pattern&nbsp;p&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Pattern.compile(imgPattern,&nbsp;Pattern.CASE_INSENSITIVE);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Matcher&nbsp;matcher&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;p.matcher(description);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;img&nbsp;src元素的正则表达式</span><span style="color: #008000"><br></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;srcPattern&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">\\s*src\\s*=\\s*\</span><span style="color: #000000">"</span><span style="color: #000000">([</span><span style="color: #000000">^</span><span style="color: #000000">\</span><span style="color: #000000">"</span><span style="color: #000000">]+)\\s*\</span><span style="color: #000000">""</span><span style="color: #000000">;</span><span style="color: #000000"><br></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: #008000"></span><span style="color: #000000">&nbsp; Pattern&nbsp;p2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Pattern.compile(srcPattern,&nbsp;Pattern.CASE_INSENSITIVE);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(matcher.find())&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Matcher&nbsp;matcher2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;p2.matcher(matcher.group());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;一定要find(),这是实际的匹配动作</span><span style="color: #008000"><br></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(matcher2.find())&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;src&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;matcher2.group();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.info(src);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;src.lastIndexOf(</span><span style="color: #000000">'</span><span style="color: #000000">/</span><span style="color: #000000">'</span><span style="color: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i1&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;src.indexOf(</span><span style="color: #000000">"</span><span style="color: #000000">http</span><span style="color: #000000">"</span><span style="color: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(i1&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map.put(src.substring(i2&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">,&nbsp;src.length()&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">),&nbsp;src<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.substring(i1,&nbsp;src.length()&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.debug(</span><span style="color: #000000">"</span><span style="color: #000000">图片：</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;map);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;map;<br>&nbsp;&nbsp;&nbsp;&nbsp;}</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%; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #008000">/**</span><span style="color: #008000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;替换description的图片链接为本地的相对链接，结构为blogFiles/images/postid/<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;description<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;userName<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@param</span><span style="color: #008000">&nbsp;postId<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080">@return</span><span style="color: #008000"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">*/</span><span style="color: #000000"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;String&nbsp;handleImagesURL(String&nbsp;description,&nbsp;String&nbsp;postId)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;tmp&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;description;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;address</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">images/</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;postId&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">/</span><span style="color: #000000">"</span><span style="color: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;imgPattern&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">&lt;\\s*img\\s+([^&gt;]+)\\s*&gt;</span><span style="color: #000000">"</span><span style="color: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Pattern&nbsp;p&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Pattern.compile(imgPattern,&nbsp;Pattern.CASE_INSENSITIVE);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Matcher&nbsp;matcher&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;p.matcher(tmp);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;img&nbsp;src元素的正则表达式</span><span style="color: #008000"><br></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;srcPattern&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">\\s*src\\s*=\\s*\</span><span style="color: #000000">"</span><span style="color: #000000">([</span><span style="color: #000000">^</span><span style="color: #000000">\</span><span style="color: #000000">"</span><span style="color: #000000">]+)\\s*\</span><span style="color: #000000">""</span><span style="color: #000000">;</span><span style="color: #000000"><br></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;String&nbsp;srcPattern&nbsp;=&nbsp;"\\s*src\\s*=\\s*\'([^\']+)\\s*\'";</span><span style="color: #008000"><br></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Pattern&nbsp;p2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Pattern.compile(srcPattern,&nbsp;Pattern.CASE_INSENSITIVE);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(matcher.find())&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Matcher&nbsp;matcher2&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;p2.matcher(matcher.group());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;一定要find(),这是实际的匹配动作</span><span style="color: #008000"><br></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(matcher2.find())&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;src&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;matcher2.group();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.info(src);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;l2</span><span style="color: #000000">=</span><span style="color: #000000">src.lastIndexOf(</span><span style="color: #000000">'</span><span style="color: #000000">/</span><span style="color: #000000">'</span><span style="color: #000000">)</span><span style="color: #000000">+</span><span style="color: #000000">1</span><span style="color: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.info(src.substring(l2,src.length()</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp</span><span style="color: #000000">=</span><span style="color: #000000">tmp.replace(src,</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;&nbsp;src=\</span><span style="color: #000000">""</span><span style="color: #000000">+address+src.substring(l2,src.length()-1)+</span><span style="color: #000000">"</span><span style="color: #000000">\</span><span style="color: #000000">""</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;tmp;<br>&nbsp;&nbsp;&nbsp;&nbsp;}</span></div><img src ="http://www.blogjava.net/cherishchen/aggbug/130508.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cherishchen/" target="_blank">凭栏观海</a> 2007-07-16 11:22 <a href="http://www.blogjava.net/cherishchen/archive/2007/07/16/130508.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>正则表达式的总结</title><link>http://www.blogjava.net/cherishchen/archive/2007/07/12/129757.html</link><dc:creator>凭栏观海</dc:creator><author>凭栏观海</author><pubDate>Thu, 12 Jul 2007 01:44:00 GMT</pubDate><guid>http://www.blogjava.net/cherishchen/archive/2007/07/12/129757.html</guid><wfw:comment>http://www.blogjava.net/cherishchen/comments/129757.html</wfw:comment><comments>http://www.blogjava.net/cherishchen/archive/2007/07/12/129757.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/cherishchen/comments/commentRss/129757.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cherishchen/services/trackbacks/129757.html</trackback:ping><description><![CDATA[<h1>一、JDK提供的正则表达式</h1>
<p>Java's java.util.regex 包包括：Pattern类、Matcher类、MatchResult接口和PatternSyntaxException异常：</p>
<ul>
    <li>Pattern 对象代表了编译了的正则表达式（A compiled representation of a regular expression.）。  </li>
    <li>Matcher ，An engine that performs match operations on a <a href="/jdk150/api/java/lang/CharSequence.html"><code></code>character sequence<code></code></a> by interpreting a <a href="/jdk150/api/java/util/regex/Pattern.html"><code>Pattern</code></a>.  </li>
    <li>MatchResult接口：The result of a match operation.  </li>
    <li>PatternSyntaxException对象，描述非法的regex patterns，Unchecked exception thrown to indicate a syntax error in a regular-expression pattern.</li>
</ul>
<p>&nbsp;同时还需要了解是CharSequence，JDK 1.4定义的新的接口，它提供了String和StringBuffer这两个类的字符序列的抽象</p>
<blockquote>
<pre>interface CharSequence {<br />
<br />
charAt(int i);<br />
<br />
length();<br />
<br />
subSequence(int start, int end);<br />
<br />
toString();<br />
<br />
}</pre>
</blockquote>
<p>为了实现这个新的CharSequence接口，String，StringBuffer以及CharBuffer都作了修改，很多的正则表达式的操作都要拿CharSequence作参数。
</p>
<p>&nbsp;
</p>
<h2>Matcher类的几个重要的方法：</h2>
<ul>
    <li>boolean matches()：Pattern匹配整个字符串
    </li>
    <li>boolean lookingAt()：Pattern匹配字符串的开头
    </li>
    <li>boolean find()：发现CharSequence里的，与pattern相匹配的多个字符序列<br />
    boolean find(int start)：告诉方法从参数start位置开始查找</li>
</ul>
<h2>group的概念</h2>
<p>Group是指里用括号括起来的，能被后面的表达式调用的正则表达式。</p>
<p>Group 0 表示整个表达式，group 1表示第一个被括起来的group，以此类推。所以；
</p>
<blockquote>
<pre>A(B(C))D</pre>
</blockquote>
<p>里面有三个group：group 0是ABCD， group 1是BC，group 2是C。
</p>
<p>你可以用下述Matcher方法来使用group：
</p>
<ul>
    <li>public int groupCount( )返回matcher对象中的group的数目。不包括group0。
    </li>
    <li>public String group( ) 返回上次匹配操作(比方说find( ))的group 0(整个匹配)
    </li>
    <li>public String group(int i)返回上次匹配操作的某个group。如果匹配成功，但是没能找到group，则返回null。
    </li>
    <li>public int start(int group)返回上次匹配所找到的group的开始位置。
    </li>
    <li>public int end(int group)返回上次匹配所找到的group的结束位置，最后一个字符的下标加一。
    </li>
    <li>split( ) 是指将以正则表达式为界，将字符串分割成String数组,如果带有limit参数，split( )会限定分割的次数。
    </li>
    <li>replaceFirst(String replacement)将字符串里，第一个与模式相匹配的子串替换成replacement。
    </li>
    <li>replaceAll(String replacement)，将输入字符串里所有与模式相匹配的子串全部替换成replacement。
    </li>
    <li>appendReplacement(StringBuffer sbuf, String replacement)对sbuf进行逐次替换，而不是像replaceFirst( )或replaceAll( )那样，只替换第一个或全部子串。这是个非常重要的方法，因为replacement(replaceFirst( )和replaceAll( )只允许用固定的字符串来充当replacement)。有了这个方法，你就可以编程区分group，从而实现更强大的替换功能。
    </li>
    <li>调用完appendReplacement( )之后，为了把剩余的字符串拷贝回去，必须调用appendTail(StringBuffer sbuf, String replacement)。 </li>
</ul>
<p>&nbsp;</p>
<p>使用group可以做到逐步缩小匹配的范围，直至精确匹配的目的。 </p>
<p>start( )和end( )：如果匹配成功，start( )会返回此次匹配的开始位置，end( )会返回此次匹配的结束位置，即最后一个字符的下标加一。如果之前的匹配不成功(或者没匹配)，那么无论是调用start( )还是end( )，都会引发一个IllegalStateException。</p>
<p>&nbsp;
</p>
<h1>二、4大使用方法：</h1>
<h2><strong>查询</strong></h2>
<p>String str="abc efg ABC";
</p>
<p>&nbsp;</p>
String regEx="a|f"; //表示a或f
<p>&nbsp;</p>
Pattern p=Pattern.compile(regEx);
<p>&nbsp;</p>
Matcher m=p.matcher(str);
<p>&nbsp;</p>
boolean rs=m.find();
<p>&nbsp;</p>
如果str中有regEx，那么rs为true，否则为flase。如果想在查找时忽略大小写，则可以写成Pattern p=Pattern.compile(regEx,Pattern.CASE_INSENSITIVE);
<p>&nbsp;</p>
<strong></strong>
<p>&nbsp;</p>
<h2><strong>提取</strong></h2>
<strong></strong>
<p>String regEx=".+\\\\(.+)$";
</p>
<p>&nbsp;</p>
String str="c:\\dir1\\dir2\\name.txt";
<p>&nbsp;</p>
Pattern p=Pattern.compile(regEx);
<p>&nbsp;</p>
Matcher m=p.matcher(str);
<p>&nbsp;</p>
boolean rs=m.find();
<p>&nbsp;</p>
for(int i=1;i&lt;=m.groupCount();i++){
<p>&nbsp;</p>
System.out.println(m.group(i));
<p>&nbsp;</p>
}
<p>&nbsp;</p>
以上的执行结果为name.txt，提取的字符串储存在m.group(i)中，其中i最大值为m.groupCount();
<p>&nbsp;</p>
<h2></h2>
<p><strong></strong>&nbsp;</p>
<h2><strong>分割</strong></h2>
<p><strong></strong>
</p>
<p>&nbsp;</p>
String regEx="::";
<p>&nbsp;</p>
Pattern p=Pattern.compile(regEx);
<p>&nbsp;</p>
String[] r=p.split("xd::abc::cde");
<p>&nbsp;</p>
执行后，r就是{"xd","abc","cde"}，其实分割时还有跟简单的方法：
<p>&nbsp;</p>
String str="xd::abc::cde";
<p>&nbsp;</p>
String[] r=str.split("::");
<p>&nbsp;</p>
<p>&nbsp;</p>
<h2><strong><strong>替换或者删除</strong></strong></h2>
<p>String regEx="a+"; //表示一个或多个a
</p>
<p>&nbsp;</p>
Pattern p=Pattern.compile(regEx);
<p>&nbsp;</p>
Matcher m=p.matcher("aaabbced a ccdeaa");
<p>&nbsp;</p>
String s=m.replaceAll("A");
<p>&nbsp;</p>
结果为"Abbced A ccdeA"
<p>&nbsp;</p>
如果写成空串，既可达到删除的功能，比如：
<p>&nbsp;</p>
String s=m.replaceAll("");
<p>&nbsp;</p>
结果为"bbced ccde"
<p>&nbsp;</p>
<p>&nbsp;</p>
<h1>三、一个实际的例子</h1>
<p>下面的函数是一个实际应用的例子，需求是需要将抓取的网页中的&lt;img src=''http://aa.bb.cc.com/images/**.jpg"&gt; 中的地址，保存到一个地址列表中（以供抓取图片使用），并将绝对地址替换成本地的相对地址，即&lt;img src="images/**.jpg"&gt;。</p>
<p>public static Map&lt;String, String&gt; getImagesURL(String description) {
</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Map&lt;String, String&gt; map = new HashMap&lt;String, String&gt;();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // img 的正则表达式:匹配&lt;img&gt;标签&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String imgPattern = "&lt;\\s*img\\s+([^&gt;]+)\\s*&gt;";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Pattern pattern1 = Pattern.compile(imgPattern, Pattern.CASE_INSENSITIVE);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Matcher matcher = pattern1.matcher(description);
</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // img src元素的正则表达式：匹配img标签内的src属性<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String srcPattern = "\\s*src\\s*=\\s*\"([^\"]+)\\s*\"";<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Pattern pattern2 = Pattern.compile(srcPattern, Pattern.CASE_INSENSITIVE);
</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (matcher.find()) {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //group()返回符合表达式的内容<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Matcher matcher2 = pattern2 .matcher(matcher.group());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 一定要find(),这是实际的匹配动作<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (matcher2.find()) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String src = matcher2.group();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log.info(src);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int i2 = src.lastIndexOf('/');<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int i1 = src.indexOf("http");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (i1 != -1) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map.put(src.substring(i2 + 1, src.length() - 1), src<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .substring(i1, src.length() - 1));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; log.debug("图片：" + map);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return map;<br />
&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;</p>
<p>整体思路是先匹配到img标签，然后匹配src属性，并修改src的属性</p>
<p>"&lt;\\s*img\\s+([^&gt;]+)\\s*&gt;" 的解释：</p>
<p><a href="file://\\s">\\s</a>* :0 或多个空格&nbsp;&nbsp; <a href="file://\\s">\\s</a>+: 至少一个空格</p>
<p>([^&gt;]+)：指的是非&gt;的所有的字符，至少一个</p>
<p>&nbsp;</p>
<h1>常用的正则表达式（参考jdk的regex文档）</h1>
<blockquote>
<p><strong>字符集类</strong></p>
</blockquote>
<p>.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 表示任意一个字符
</p>
<p>[abc]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 表示字符a，b，c中的任意一个(与a|b|c相同)
</p>
<p>[^abc]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 除a，b，c之外的任意一个字符(否定)
</p>
<p>[a-zA-Z]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 从a到z或A到Z当中的任意一个字符(范围)
</p>
<p>[abc[hij]]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a,b,c,h,i,j中的任意一个字符(与a|b|c|h|i|j相同)(并集)
</p>
<p>[a-z&amp;&amp;[hij]]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; h,i,j中的一个(交集)
</p>
<p>\s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 空格字符(空格键, tab, 换行, 换页, 回车)
</p>
<p>\S&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 非空格字符([^\s])
</p>
<p>\d&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一个数字，也就是[0-9]
</p>
<p>\D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一个非数字的字符，也就是[^0-9]
</p>
<p>\w&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一个单词字符(word character)，即[a-zA-Z_0-9]
</p>
<p>\W&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;一个非单词的字符，[^\w]
</p>
<blockquote>
<p><strong>字符类：</strong></p>
</blockquote>
<p>B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 字符B
</p>
<p>\xhh&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 16进制值0xhh所表示的字符
</p>
<p>\uhhhh&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 16进制值0xhhhh所表示的Unicode字符
</p>
<p>\t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Tab
</p>
<p>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 换行符
</p>
<p>\r&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 回车符
</p>
<p>\f&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 换页符
</p>
<p>\e&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Escape
</p>
<p><strong>逻辑运算符</strong>
</p>
<p>XY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; X 后面跟着 Y
</p>
<p>X|Y&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; X或Y
</p>
<p>(X)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;一个"要匹配的组(capturing group)". 以后可以用\i来表示第i个被匹配的组。
</p>
<p><strong>边界匹配符</strong>
</p>
<p>^&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一行的开始
</p>
<p>$&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一行的结尾
</p>
<p>\b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一个单词的边界
</p>
<p>\B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一个非单词的边界
</p>
<p>\G&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;前一个匹配的结束
</p>
<p>&nbsp;
</p>
<p><strong>数量表示符</strong></p>
<p>"数量表示符(quantifier)"的作用是定义模式应该匹配多少个字符。
</p>
<ul>
    <li>Greedy(贪婪的)： 除非另有表示，否则数量表示符都是greedy的。Greedy的表达式会一直匹配下去，直到匹配不下去为止。<u>(如果你发现表达式匹配的结果与预期的不符)</u>，很有可能是因为，你以为表达式会只匹配前面几个字符，而实际上它是greedy的，因此会一直匹配下去。
    </li>
    <li>Reluctant(勉强的)： 用问号表示，它会匹配最少的字符。也称为lazy, minimal matching, non-greedy, 或ungreedy。
    </li>
    <li>Possessive(占有的)： 目前只有Java支持(其它语言都不支持)。它更加先进，所以你可能还不太会用。用正则表达式匹配字符串的时候会产生很多中间状态，<u>(一般的匹配引擎会保存这种中间状态，)</u>这样匹配失败的时候就能原路返回了。占有型的表达式不保存这种中间状态，因此也就不会回头重来了。它能防止正则表达式的失控，同时也能提高运行的效率。 </li>
</ul>
<p>&nbsp;
</p>
<p><strong>Greedy&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Reluctant&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Possessive&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 匹配 </strong>
</p>
<p>&nbsp;
</p>
<p>X?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; X??&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; X?+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 匹配一个或零个X
</p>
<p>X*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; X*?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; X*+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 匹配零或多个X
</p>
<p>X+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; X+?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; X++&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;匹配一个或多个X
</p>
<p>X{n}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; X{n}?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; X{n}+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 匹配正好n个X
</p>
<p>X{n,}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; X{n,}?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;X{n,}+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;匹配至少n个X
</p>
<p>X{n,m}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; X{n,m}?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; X{n,m}+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 匹配至少n个，至多m个X
</p>
<p>&nbsp;
</p>
<p>&nbsp;
</p>
<h2>参考资料</h2>
<p>要想进一步学习正则表达式，建议看<em>Mastering Regular Expression, 2nd Edition</em>，作者Jeffrey E. F. Friedl (O&#8217;Reilly, 2002)。
</p>
<p>"Regular Expressions and the Java Programming Language," Dana Nourie and Mike McCloskey (Sun Microsystems, August 2002) presents a brief overview of java.util.regex, including five illustrative regex-based applications: <br />
<a href="http://developer.java.sun.com/developer/technicalArticles/releases/1.4regex/">http://developer.java.sun.com/developer/technicalArticles/releases/1.4regex/</a>
</p>
<p><a title="http://www.blogjava.net/beike/archive/2006/04/28/43832.html" href="http://www.blogjava.net/beike/archive/2006/04/28/43832.html">http://www.blogjava.net/beike/archive/2006/04/28/43832.html</a>&nbsp;
</p>
<p><a href="http://wcjok.bokee.com/4293762.html">http://wcjok.bokee.com/4293762.html</a> </p>
<img src ="http://www.blogjava.net/cherishchen/aggbug/129757.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cherishchen/" target="_blank">凭栏观海</a> 2007-07-12 09:44 <a href="http://www.blogjava.net/cherishchen/archive/2007/07/12/129757.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用HttpClient来模拟浏览器GET POST(收藏)</title><link>http://www.blogjava.net/cherishchen/archive/2007/07/10/129369.html</link><dc:creator>凭栏观海</dc:creator><author>凭栏观海</author><pubDate>Tue, 10 Jul 2007 08:05:00 GMT</pubDate><guid>http://www.blogjava.net/cherishchen/archive/2007/07/10/129369.html</guid><wfw:comment>http://www.blogjava.net/cherishchen/comments/129369.html</wfw:comment><comments>http://www.blogjava.net/cherishchen/archive/2007/07/10/129369.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/cherishchen/comments/commentRss/129369.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cherishchen/services/trackbacks/129369.html</trackback:ping><description><![CDATA[<h3><strong>用HttpClient来模拟浏览器GET&nbsp;POST</strong></h3> <p><a title="http://www.xd-tech.com.cn/blog/article.asp?id=34" href="http://www.xd-tech.com.cn/blog/article.asp?id=34">http://www.xd-tech.com.cn/blog/article.asp?id=34</a></p> <h4>作者:jaddy0302 日期:2006-12-21</h4> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一般的情况下我们都是使用IE或者Navigator浏览器来访问一个WEB服务器，用来浏览页面查看信息或者提交一些数据等等。所访问的这些页面有的仅仅是一些普通的页面，有的需要用户登录后方可使用，或者需要认证以及是一些通过加密方式传输，例如HTTPS。目前我们使用的浏览器处理这些情况都不会构成问题。不过你可能在某些时候需要通过程序来访问这样的一些页面，比如从别人的网页中“偷”一些数据；利用某些站点提供的页面来完成某种功能，例如说我们想知道某个手机号码的归属地而我们自己又没有这样的数据，因此只好借助其他公司已有的网站来完成这个功能，这个时候我们需要向网页提交手机号码并从返回的页面中解析出我们想要的数据来。如果对方仅仅是一个很简单的页面，那我们的程序会很简单，本文也就没有必要大张旗鼓的在这里浪费口舌。但是考虑到一些服务授权的问题，很多公司提供的页面往往并不是可以通过一个简单的URL就可以访问的，而必须经过注册然后登录后方可使用提供服务的页面，这个时候就涉及到 COOKIE问题的处理。我们知道目前流行的***页技术例如ASP、JSP无不是通过COOKIE来处理会话信息的。为了使我们的程序能使用别人所提供的服务页面，就要求程序首先登录后再访问服务页面，这过程就需要自行处理cookie，想想当你用java.net.HttpURLConnection 来完成这些功能时是多么恐怖的事情啊！况且这仅仅是我们所说的顽固的WEB服务器中的一个很常见的“顽固”！再有如通过HTTP来上传文件呢？不需要头疼，这些问题有了“它”就很容易解决了！  <p>我们不可能列举所有可能的顽固，我们会针对几种最常见的问题进行处理。当然了，正如前面说到的，如果我们自己使用 java.net.HttpURLConnection来搞定这些问题是很恐怖的事情，因此在开始之前我们先要介绍一下一个开放源码的项目，这个项目就是 Apache开源组织中的httpclient，它隶属于Jakarta的commons项目，目前的版本是2.0RC2。commons下本来已经有一个net的子项目，但是又把httpclient单独提出来，可见http服务器的访问绝非易事。 <p>Commons-httpclient项目就是专门设计来简化HTTP客户端与服务器进行各种通讯编程。通过它可以让原来很头疼的事情现在轻松的解决，例如你不再管是HTTP或者HTTPS的通讯方式，告诉它你想使用HTTPS方式，剩下的事情交给 httpclient替你完成。本文会针对我们在编写HTTP客户端程序时经常碰到的几个问题进行分别介绍如何使用httpclient来解决它们，为了让读者更快的熟悉这个项目我们最开始先给出一个简单的例子来读取一个网页的内容，然后循序渐进解决掉前进中的所形侍狻?/font&gt;  <p>1． 读取网页(HTTP/HTTPS)内容 <p>下面是我们给出的一个简单的例子用来访问某个页面 <p>/* <p>&nbsp;* Created on 2003-12-14 by Liudong <p>&nbsp;*/ <p>package http.demo; <p>import java.io.IOException; <p>import org.apache.commons.httpclient.*; <p>import org.apache.commons.httpclient.methods.*; <p>/** <p>&nbsp;* 最简单的HTTP客户端,用来演示通过GET或者POST方式访问某个页面 <p>&nbsp;* @author Liudong <p>&nbsp;*/ <p>public class SimpleClient { <p>&nbsp;&nbsp;&nbsp; public static void main(String[] args) throws IOException <p>&nbsp;&nbsp;&nbsp; { <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpClient client = new HttpClient();&nbsp;&nbsp;&nbsp;  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //设置代理服务器地址和端口&nbsp;&nbsp;&nbsp;&nbsp;  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //client.getHostConfiguration().setProxy("proxy_host_addr",proxy_port); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //使用GET方法，如果服务器需要通过HTTPS连接，那只需要将下面URL中的http换成https <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpMethod method = new GetMethod("<a href="http://java.sun.com/"><a href="http://java.sun.com">http://java.sun.com</a></a>");  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //使用POST方法 <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //HttpMethod method = new PostMethod("<a href="http://java.sun.com/"><a href="http://java.sun.com">http://java.sun.com</a></a>");  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; client.executeMethod(method); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //打印服务器返回的状态 <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(method.getStatusLine()); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //打印返回的信息 <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(method.getResponseBodyAsString()); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //释放连接 <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; method.releaseConnection(); <p>&nbsp;&nbsp;&nbsp; }<br>} <p>在这个例子中首先创建一个HTTP客户端(HttpClient)的实例，然后选择提交的方法是GET或者 POST，最后在HttpClient实例上执行提交的方法，最后从所选择的提交方法中读取服务器反馈回来的结果。这就是使用HttpClient的基本流程。其实用一行代码也就可以搞定整个请求的过程，非常的简单！ <p>2． 以GET或者POST方式向网页提交参数 <p>其实前面一个最简单的示例中我们已经介绍了如何使用GET或者POST方式来请求一个页面，本小节与之不同的是多了提交时设定页面所需的参数，我们知道如果是GET的请求方式，那么所有参数都直接放到页面的URL后面用问号与页面地址隔开，每个参数用&amp;隔开，例如：<a href="http://java.sun.com/?name=liudong&amp;mobile=123456">http://java.sun.com?name=liudong&amp;mobile=123456</a>，但是当使用POST方法时就会稍微有一点点麻烦。本小节的例子演示向如何查询手机号码所在的城市，代码如下： <p>/* <p>&nbsp;* Created on 2003-12-7 by Liudong <p>&nbsp;*/ <p>package http.demo; <p>import java.io.IOException; <p>import org.apache.commons.httpclient.*; <p>import org.apache.commons.httpclient.methods.*; <p>/** <p>&nbsp;* 提交参数演示 <p>&nbsp;* 该程序连接到一个用于查询手机号码所属地的页面 <p>&nbsp;* 以便查询号码段1330227所在的省份以及城市 <p>&nbsp;* @author Liudong <p>&nbsp;*/ <p>public class SimpleHttpClient { <p>&nbsp;&nbsp;&nbsp; public static void main(String[] args) throws IOException <p>&nbsp;&nbsp;&nbsp; { <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpClient client = new HttpClient(); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; client.getHostConfiguration().setHost("<a href="http://www.imobile.com.cn/">www.imobile.com.cn</a>", 80, "http"); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpMethod method = getPostMethod();//使用POST方式提交数据 <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; client.executeMethod(method); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //打印服务器返回的状态 <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(method.getStatusLine()); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //打印结果页面 <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String response =&nbsp; new String(method.getResponseBodyAsString().getBytes("8859_1")); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //打印返回的信息 <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(response); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; method.releaseConnection(); <p>&nbsp;&nbsp;&nbsp; } <p>&nbsp;&nbsp;&nbsp; /** <p>&nbsp;&nbsp;&nbsp;&nbsp; * 使用GET方式提交数据 <p>&nbsp;&nbsp;&nbsp;&nbsp; * @return <p>&nbsp;&nbsp;&nbsp;&nbsp; */ <p>&nbsp;&nbsp;&nbsp; private static HttpMethod getGetMethod(){ <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return new GetMethod("/simcard.php?simcard=1330227"); <p>&nbsp;&nbsp;&nbsp; } <p>&nbsp;&nbsp;&nbsp; /** <p>&nbsp;&nbsp;&nbsp;&nbsp; * 使用POST方式提交数据 <p>&nbsp;&nbsp;&nbsp;&nbsp; * @return <p>&nbsp;&nbsp;&nbsp;&nbsp; */ <p>&nbsp;&nbsp;&nbsp; private static HttpMethod getPostMethod(){ <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PostMethod post = new PostMethod("/simcard.php"); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NameValuePair simcard = new NameValuePair("simcard","1330227"); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; post.setRequestBody(new NameValuePair[] { simcard}); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return post; <p>&nbsp;&nbsp;&nbsp; } <p>} <p>在上面的例子中页面<a href="http://www.imobile.com.cn/simcard.php">http://www.imobile.com.cn/simcard.php</a>需要一个参数是simcard，这个参数值为手机号码段，即手机号码的前七位，服务器会返回提交的手机号码对应的省份、城市以及其他详细信息。GET的提交方法只需要在URL后加入参数信息，而POST则需要通过NameValuePair类来设置参数名称和它所对应的值 <p>3． 处理页面重定向 <p>在JSP/Servlet编程中response.sendRedirect方法就是使用HTTP协议中的重定向机制。它与JSP中的&lt;jsp:forward …&gt;的区别在于后者是在服务器中实现页面的跳转，也就是说应用容器加载了所要跳转的页面的内容并返回给客户端；而前者是返回一个状态码，这些状态码的可能值见下表，然后客户端读取需要跳转到的页面的URL并重新加载新的页面。就是这样一个过程，所以我们编程的时候就要通过 HttpMethod.getStatusCode()方法判断返回值是否为下表中的某个值来判断是否需要跳转。如果已经确认需要进行页面跳转了，那么可以通过读取HTTP头中的location属性来获取新的地址。 <p>状态码<br>&nbsp;对应HttpServletResponse的常量<br>&nbsp;详细描述<br>301　&nbsp;SC_MOVED_PERMANENTLY<br>&nbsp;页面已经永久移到另外一个新地址<br>302　&nbsp;SC_MOVED_TEMPORARILY<br>&nbsp;页面暂时移动到另外一个新的地址<br>303　&nbsp;SC_SEE_OTHER<br>&nbsp;客户端请求的地址必须通过另外的URL来访问<br>307　&nbsp;SC_TEMPORARY_REDIRECT　&nbsp;同SC_MOVED_TEMPORARILY <p>下面的代码片段演示如何处理页面的重定向 <p>client.executeMethod(post); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(post.getStatusLine().toString());  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; post.releaseConnection(); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //检查是否重定向 <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int statuscode = post.getStatusCode(); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((statuscode == HttpStatus.SC_MOVED_TEMPORARILY) || <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (statuscode == HttpStatus.SC_MOVED_PERMANENTLY) || <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (statuscode == HttpStatus.SC_SEE_OTHER) || <p>(statuscode == HttpStatus.SC_TEMPORARY_REDIRECT)) { <p>//读取新的URL地址 <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Header header = post.getResponseHeader("location"); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (header != null) { <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String newuri = header.getValue(); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ((newuri == null) || (newuri.equals(""))) <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; newuri = "/";  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GetMethod redirect = new GetMethod(newuri); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; client.executeMethod(redirect); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Redirect:"+ redirect.getStatusLine().toString());  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; redirect.releaseConnection(); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Invalid redirect"); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <p>我们可以自行编写两个JSP页面，其中一个页面用response.sendRedirect方法重定向到另外一个页面用来测试上面的例子。 <p>4． 模拟输入用户名和口令进行登录 <p>本小节应该说是HTTP客户端编程中最常碰见的问题，很多网站的内容都只是对注册用户可见的，这种情况下就必须要求使用正确的用户名和口令登录成功后，方可浏览到想要的页面。因为HTTP协议是无状态的，也就是连接的有效期只限于当前请求，请求内容结束后连接就关闭了。在这种情况下为了保存用户的登录信息必须使用到Cookie机制。以JSP/Servlet为例，当浏览器请求一个JSP或者是Servlet的页面时，应用服务器会返回一个参数，名为jsessionid（因不同应用服务器而异），值是一个较长的唯一字符串的Cookie，这个字符串值也就是当前访问该站点的会话标识。浏览器在每访问该站点的其他页面时候都要带上jsessionid这样的Cookie信息，应用服务器根据读取这个会话标识来获取对应的会话信息。 <p>对于需要用户登录的网站，一般在用户登录成功后会将用户资料保存在服务器的会话中，这样当访问到其他的页面时候，应用服务器根据浏览器送上的Cookie中读取当前请求对应的会话标识以获得对应的会话信息，然后就可以判断用户资料是否存在于会话信息中，如果存在则允许访问页面，否则跳转到登录页面中要求用户输入帐号和口令进行登录。这就是一般使用JSP开发网站在处理用户登录的比较通用的方法。 <p>这样一来，对于HTTP的客户端来讲，如果要访问一个受保护的页面时就必须模拟浏览器所做的工作，首先就是请求登录页面，然后读取Cookie值；再次请求登录页面并加入登录页所需的每个参数；最后就是请求最终所需的页面。当然在除第一次请求外其他的请求都需要附带上 Cookie信息以便服务器能判断当前请求是否已经通过验证。说了这么多，可是如果你使用httpclient的话，你甚至连一行代码都无需增加，你只需要先传递登录信息执行登录过程，然后直接访问想要的页面，跟访问一个普通的页面没有任何区别，因为类HttpClient已经帮你做了所有该做的事情了，太棒了！下面的例子实现了这样一个访问的过程。 <p>/* <p>&nbsp;* Created on 2003-12-7 by Liudong <p>&nbsp;*/ <p>package http.demo; <p>import org.apache.commons.httpclient.*; <p>import org.apache.commons.httpclient.cookie.*; <p>import org.apache.commons.httpclient.methods.*; <p>/** <p>&nbsp;* 用来演示登录表单的示例 <p>&nbsp;* @author Liudong <p>&nbsp;*/ <p>public class FormLoginDemo { <p>&nbsp;&nbsp;&nbsp; static final String LOGON_SITE = "localhost"; <p>&nbsp;&nbsp;&nbsp; static final int&nbsp;&nbsp;&nbsp; LOGON_PORT = 8080; <p>&nbsp;&nbsp;&nbsp; public static void main(String[] args) throws Exception{ <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpClient client = new HttpClient(); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; client.getHostConfiguration().setHost(LOGON_SITE, LOGON_PORT); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //模拟登录页面login.jsp-&gt;main.jsp <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PostMethod post = new PostMethod("/main.jsp"); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NameValuePair name = new NameValuePair("name", "ld");&nbsp;&nbsp;&nbsp;&nbsp;  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NameValuePair pass = new NameValuePair("password", "ld");&nbsp;&nbsp;&nbsp;&nbsp;  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; post.setRequestBody(new NameValuePair[]{name,pass}); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int status = client.executeMethod(post); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(post.getResponseBodyAsString()); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; post.releaseConnection();&nbsp;  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //查看cookie信息 <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CookieSpec cookiespec = CookiePolicy.getDefaultSpec(); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Cookie[] cookies = cookiespec.match(LOGON_SITE, LOGON_PORT, "/", false, client.getState().getCookies()); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (cookies.length == 0) { <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("None");&nbsp;&nbsp;&nbsp;  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else { <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; cookies.length; i++) { <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(cookies[i].toString());&nbsp;&nbsp;&nbsp;  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //访问所需的页面main2.jsp <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GetMethod get = new GetMethod("/main2.jsp"); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; client.executeMethod(get); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(get.getResponseBodyAsString()); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get.releaseConnection(); <p>&nbsp;&nbsp;&nbsp; } <p>} <p>5． 提交XML格式参数 <p>提交XML格式的参数很简单，仅仅是一个提交时候的ContentType问题，下面的例子演示从文件文件中读取XML信息并提交给服务器的过程，该过程可以用来测试Web服务。 <p>import java.io.File; <p>import java.io.FileInputStream; <p>import org.apache.commons.httpclient.HttpClient; <p>import org.apache.commons.httpclient.methods.EntityEnclosingMethod; <p>import org.apache.commons.httpclient.methods.PostMethod; <p>/** <p>&nbsp;* 用来演示提交XML格式数据的例子 <p>&nbsp;*/ <p>public class PostXMLClient { <p>&nbsp;&nbsp;&nbsp; public static void main(String[] args) throws Exception { <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File input = new File(“test.xml”); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PostMethod post = new PostMethod(“http://localhost:8080/httpclient/xml.jsp”); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 设置请求的内容直接从文件中读取 <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; post.setRequestBody(new FileInputStream(input)); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (input.length() &lt; Integer.MAX_VALUE)  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; post.setRequestContentLength(input.length()); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <blockquote> <p>post.setRequestContentLength(EntityEnclosingMethod.CONTENT_LENGTH_CHUNKED);</p></blockquote> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 指定请求内容的类型 <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; post.setRequestHeader("Content-type", "text/xml; charset=GBK"); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpClient httpclient = new HttpClient();  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int result = httpclient.executeMethod(post);  <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Response status code: " + result); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Response body: "); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(post.getResponseBodyAsString()); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; post.releaseConnection(); <p>&nbsp;&nbsp;&nbsp; } <p>} <p>6． 通过HTTP上传文件 <p>httpclient使用了单独的一个HttpMethod子类来处理文件的上传，这个类就是MultipartPostMethod，该类已经封装了文件上传的细节，我们要做的仅仅是告诉它我们要上传文件的全路径即可，下面的代码片段演示如何使用这个类。 <p>MultipartPostMethod filePost = new MultipartPostMethod(targetURL); <p>filePost.addParameter("fileName", targetFilePath); <p>HttpClient client = new HttpClient(); <p>//由于要上传的文件可能比较大,因此在此设置最大的连接超时时间 <p>client.getHttpConnectionManager().getParams().setConnectionTimeout(5000); <p>int status = client.executeMethod(filePost); <p>上面代码中，targetFilePath即为要上传的文件所在的路径。 <p>7． 访问启用认证的页面 <p>我们经常会碰到这样的页面，当访问它的时候会弹出一个浏览器的对话框要求输入用户名和密码后方可，这种用户认证的方式不同于我们在前面介绍的基于表单的用户身份验证。这是HTTP的认证策略，httpclient支持三种认证方式包括：基本、摘要以及NTLM认证。其中基本认证最简单、通用但也最不安全；摘要认证是在HTTP 1.1中加入的认证方式，而NTLM则是微软公司定义的而不是通用的规范，最新版本的NTLM是比摘要认证还要安全的一种方式。 <p>下面例子是从httpclient的CVS服务器中下载的，它简单演示如何访问一个认证保护的页面： <p>import org.apache.commons.httpclient.HttpClient; <p>import org.apache.commons.httpclient.UsernamePasswordCredentials; <p>import org.apache.commons.httpclient.methods.GetMethod; <p>public class BasicAuthenticationExample { <p>&nbsp;&nbsp;&nbsp; public BasicAuthenticationExample() { <p>&nbsp;&nbsp;&nbsp; } <p>&nbsp;&nbsp;&nbsp; public static void main(String[] args) throws Exception { <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HttpClient client = new HttpClient(); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; client.getState().setCredentials( <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "<a href="http://www.verisign.com/"><a href="http://www.verisign.com">www.verisign.com</a></a>", <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "realm", <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new UsernamePasswordCredentials("username", "password") <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GetMethod get = new GetMethod("<a href="https://www.verisign.com/products/index.html">https://www.verisign.com/products/index.html</a>"); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get.setDoAuthentication( true ); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int status = client.executeMethod( get ); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(status+""+ get.getResponseBodyAsString()); <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get.releaseConnection(); <p>&nbsp;&nbsp;&nbsp; } <p>} <p>8． 多线程模式下使用httpclient <p>多线程同时访问httpclient，例如同时从一个站点上下载多个文件。对于同一个HttpConnection 同一个时间只能有一个线程访问，为了保证多线程工作环境下不产生冲突，httpclient使用了一个多线程连接管理器的类： MultiThreadedHttpConnectionManager，要使用这个类很简单，只需要在构造HttpClient实例的时候传入即可，代码如下：<pre>MultiThreadedHttpConnectionManager connectionManager = <span style="color: #0000ff">new</span> MultiThreadedHttpConnectionManager();
HttpClient client = <span style="color: #0000ff">new</span> HttpClient(connectionManager);
</pre>
<p>&nbsp;
<p>&nbsp;
<p>以后尽管访问client实例即可。
<p>参考资料：
<p>httpclient首页：&nbsp;&nbsp;&nbsp; <a href="http://jakarta.apache.org/commons/httpclient/"><a href="http://jakarta.apache.org/commons/httpclient/">http://jakarta.apache.org/commons/httpclient/</a></a><br>关于NTLM是如何工作：&nbsp; <a href="http://davenport.sourceforge.net/ntlm.html"><a href="http://davenport.sourceforge.net/ntlm.html">http://davenport.sourceforge.net/ntlm.html</a></a></p><img src ="http://www.blogjava.net/cherishchen/aggbug/129369.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cherishchen/" target="_blank">凭栏观海</a> 2007-07-10 16:05 <a href="http://www.blogjava.net/cherishchen/archive/2007/07/10/129369.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java IO库 学习记录</title><link>http://www.blogjava.net/cherishchen/archive/2007/07/10/129313.html</link><dc:creator>凭栏观海</dc:creator><author>凭栏观海</author><pubDate>Tue, 10 Jul 2007 04:30:00 GMT</pubDate><guid>http://www.blogjava.net/cherishchen/archive/2007/07/10/129313.html</guid><wfw:comment>http://www.blogjava.net/cherishchen/comments/129313.html</wfw:comment><comments>http://www.blogjava.net/cherishchen/archive/2007/07/10/129313.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cherishchen/comments/commentRss/129313.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cherishchen/services/trackbacks/129313.html</trackback:ping><description><![CDATA[<p>所有类的根接口：InputStream/OutputStream  <h1><b>一、底层的还是装饰的</b></h1> <p>1、底层的直接与文件系统或者硬件打交道的类(充当数据源的类)：  <p>包括InputStream和OutPutStream两大类，分别用于输入和输出，数据源可以是bytes array，String对象，file文件，stream序列等：  <ul> <li>FileInputStream/FileOutputStream  <li>ByteArrayInputStream/ByteArrayOutputStream  <li>StringBufferInputStream/StringBufferOutputStream</li></ul> <p>等，具体参看下面的java io类图  <p>2、充当装饰功能的io类,通过装饰底层的类来实现更高级的功能，继承自FilterOutputStream/FilterOutputStream，包括：  <ul> <li>BufferedOutputStream/BufferedInputStream  <li>Datainputstream/Dataoutputstream</li></ul> <p>等，具体参看下面的java io类图  <p>使用FilterOutputStream/FilterOutputStream时，首先创建一个数据源IO，然后根据需要的功能创建装饰类io，其构造函数的参数为已创建的数据源io。  <p><a href="http://www.blogjava.net/images/blogjava_net/cherishchen/WindowsLiveWriter/javaIO_997B/clip_image002_2.jpg" atomicselection="true"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="175" alt="clip_image002" src="http://www.blogjava.net/images/blogjava_net/cherishchen/WindowsLiveWriter/javaIO_997B/clip_image002_thumb.jpg" width="240" border="0"></a>  <h1><b>二、面向字符还是面向字节</b></h1> <p>同时，java的IO体系又可以分成：inputStream/outputStream和reader/writer两类：  <p>（1） Reader/Writer是面向Unicode字符的（Characters）  <p>（2） InputStream/OutputStream是直接面向字节的（bytes）。  <p>Reader/Writer继承体系之所以存在，最重要的原因是为了国际化，旧式I/O stream 的继承体系仅仅支持8-bit byte stream，而且无法处理16-bit unicode 字符。由于unicode被用于字符国际化，所以加入Reader/Writer以便在所有的io动作上提供对unicode的支持。  <p>几乎所有的java io stream classes都有相应的Reader和Writer来提供对unicode的支持，但是在某些场合，使用byte-oriented InputStream和OutPutStream才是正取的方法，最合理的方式是尽可能先尝试使用Read和Writer，其次才使用byte-oriented库。  <h1><b>三、从InputStream/OutPutStream到Reader/Writer的转换</b></h1> <p>InputStreamReader和OutputStreamWriter，可以把一个以字节为导向的stream转换成一个以字符为导向的stream。  <p><font size="4"><b>Java 1.0 class（byte oriented）&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </b><b>Java 1.1 class(unicode character oriented)</b></font>  <p><strong><font size="4">装饰前的行为</font></strong>  <p><b>InputStream&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </b><b>Reader&nbsp; </b>转换器：InputStreamReader  <p>OutputStreamReader&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <b>Writer&nbsp; </b><b>转换器：</b>OutputStreamWriter<b></b>  <p><b>FileInputSream&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </b><b>FileOutputStream</b>  <p><b>FileReader&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </b><b>FileWriter</b>  <p><b>StringBufferInputStream&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </b><b>StringReader/</b><b>StringWriter&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</b>  <p><b>ByteArrayInputStream&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</b><b>ByteArrayOutputStream&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</b>  <p><b>CharArrayReader&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </b><b>CharArrayWriter</b>  <p><b>装饰后的行为</b>  <p><b>BufferedInputStream&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </b><b>BufferedOutputStream</b>  <p><b>BufferedReader&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</b><b>BufferedWriter</b>  <p><b>PrintStream&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</b><b>PrintWriter</b>  <p><b></b> <p><b></b> <p><b></b> <p><b></b> <h1><b>四、示例</b></h1> <p><b>DataInputStream</b><b>和DataOutputStream</b>  <p><b>Java</b><b>中除了二进制文件和使用文本文件外还有基于Data的数据操作，这里的Data指的是Java的基本数据类型和String。基本数据类型包括byte、int、char、long、float、double、boolean和short。</b>  <p><b></b> <p><b></b> <p><b>例子：</b>  <p>protected void connect (Socket socket)  <p>throws IOException, SocketException  <p>{  <p>this.socket = socket;  <p>applyTimeout();  <p>serverIn = new DataInputStream (  <p>new BufferedInputStream (socket.getInputStream ())  <p>);  <p>serverOut = new DataOutputStream(  <p>new BufferedOutputStream(socket.getOutputStream(), 2048)  <p>);  <p>usable = true;  <p>cnt[CONNECT]++;  <p>setChanged();  <p>notifyObservers();  <p>}  <p>在DataInputStream和DataOutputStream两个类中的方法都很简单，基本结构为readXXXX()和writeXXXX()其中XXXX代表基本数据类型或者String。</p><img src ="http://www.blogjava.net/cherishchen/aggbug/129313.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cherishchen/" target="_blank">凭栏观海</a> 2007-07-10 12:30 <a href="http://www.blogjava.net/cherishchen/archive/2007/07/10/129313.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>牛刀小试-用jdom来解析ant的build文件</title><link>http://www.blogjava.net/cherishchen/archive/2007/07/05/128235.html</link><dc:creator>凭栏观海</dc:creator><author>凭栏观海</author><pubDate>Thu, 05 Jul 2007 01:11:00 GMT</pubDate><guid>http://www.blogjava.net/cherishchen/archive/2007/07/05/128235.html</guid><description><![CDATA[<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">/**<br>* 学习jdom操作xml的习作：解析ant的build文件，目的是得到target的执行顺序<br>*<br>*/<br>import</span><span style="color: #000000;">&nbsp;java.io.File;<br></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.io.IOException;<br></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.util.ArrayList;<br></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.util.HashMap;<br></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.util.List;<br></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.util.Map;<br></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.util.Stack;<br></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.jdom.Document;<br></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.jdom.Element;<br></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.jdom.JDOMException;<br></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;org.jdom.input.SAXBuilder;<br><br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;AntFileParser&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;Map</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">String,&nbsp;Element</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;targetMap;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@param</span><span style="color: #008000;">&nbsp;args<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;main(String[]&nbsp;args)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;xmlfile&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">xmlfile/aaa.xml</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Document&nbsp;doc;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;finalTarget&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">run</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;doc&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;build(xmlfile);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(JDOMException&nbsp;e)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throw</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;RuntimeException(</span><span style="color: #000000;">"</span><span style="color: #000000;">parse&nbsp;error</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;e,&nbsp;e);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(IOException&nbsp;e)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throw</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;RuntimeException(</span><span style="color: #000000;">"</span><span style="color: #000000;">parse&nbsp;error</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;e,&nbsp;e);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;generateTargetNameMap(doc);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;首先将最终任务入栈</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Stack</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">String</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;stack&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Stack</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">String</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stack.push(finalTarget);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;计算其他任务的执行顺序</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getExecuteOrder(findElementByAttributeName(finalTarget),&nbsp;stack);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(</span><span style="color: #000000;">"</span><span style="color: #000000;">执行顺序：&nbsp;&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">!</span><span style="color: #000000;">stack.isEmpty())&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(stack.pop()&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;Document&nbsp;build(String&nbsp;file)&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;JDOMException,&nbsp;IOException&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SAXBuilder&nbsp;b&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;SAXBuilder();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Document&nbsp;doc&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;b.build(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;File(file));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;doc;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;获取所有target元素<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@param</span><span style="color: #008000;">&nbsp;doc<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@return</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;List&nbsp;getTarget(Document&nbsp;doc)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;doc.getRootElement().getChildren(</span><span style="color: #000000;">"</span><span style="color: #000000;">target</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;获取指定元素的所有依赖<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@param</span><span style="color: #008000;">&nbsp;element<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@return</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;String[]&nbsp;getDepents(Element&nbsp;element)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;depends&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;element.getAttribute(</span><span style="color: #000000;">"</span><span style="color: #000000;">depends</span><span style="color: #000000;">"</span><span style="color: #000000;">).getValue();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;depends.split(</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;使用递归的方法查找执行顺序<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@param</span><span style="color: #008000;">&nbsp;element<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@param</span><span style="color: #008000;">&nbsp;stack<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;getExecuteOrder(Element&nbsp;element,&nbsp;Stack</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">String</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;stack)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;cur;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(element.getAttribute(</span><span style="color: #000000;">"</span><span style="color: #000000;">depends</span><span style="color: #000000;">"</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;已经找到了第一个任务，退出</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String[]&nbsp;depends&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;getDepents(element);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cur&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;depends[</span><span style="color: #000000;">0</span><span style="color: #000000;">];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(depends.length&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;存在多个依赖任务，可能有两种情况：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;（1）多个任务之间有依赖关系，则返回依赖最大的任务；<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;（2）多个任务之间没有依赖关系，则返回全部依赖，用逗号分隔</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cur&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;getmaxDependence(depends);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String[]&nbsp;curs&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;cur.split(</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;如果存在并行任务且并行任务之间没有互相依赖，则一并放入堆栈，无所谓顺序</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(String&nbsp;string&nbsp;:&nbsp;curs)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;element&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;findElementByAttributeName(string);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;检查是否已经入栈</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #000000;">!</span><span style="color: #000000;">stack.contains(element.getAttributeValue(</span><span style="color: #000000;">"</span><span style="color: #000000;">name</span><span style="color: #000000;">"</span><span style="color: #000000;">)))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stack.push(element.getAttributeValue(</span><span style="color: #000000;">"</span><span style="color: #000000;">name</span><span style="color: #000000;">"</span><span style="color: #000000;">));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;递归</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;getExecuteOrder(element,&nbsp;stack);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;从缓存的Map中，依据target元素的name属性查找target元素<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@param</span><span style="color: #008000;">&nbsp;name<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@return</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;Element&nbsp;findElementByAttributeName(String&nbsp;name)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;targetMap.get(name);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;将target元素和其name属性缓存到map中<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@param</span><span style="color: #008000;">&nbsp;doc<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;generateTargetNameMap(Document&nbsp;doc)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;targetList&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;getTarget(doc);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;targetMap&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;HashMap</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">String,&nbsp;Element</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(Object&nbsp;object&nbsp;:&nbsp;targetList)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Element&nbsp;ele&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(Element)&nbsp;object;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;name&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;ele.getAttributeValue(</span><span style="color: #000000;">"</span><span style="color: #000000;">name</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;targetMap.put(name,&nbsp;ele);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;String&nbsp;getmaxDependence(String[]&nbsp;depends)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;size&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;depends.length;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;target&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">""</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;保存每一个任务对其他任务的存在依赖关系的次数</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">[]&nbsp;counts&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">[size];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//<br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;size;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Element&nbsp;cur&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;findElementByAttributeName(depends[i]);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;将数组转换成ArrayList</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;list&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;arrayToList(getDepents(cur));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;j&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">;&nbsp;j&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;size;&nbsp;j</span><span style="color: #000000;">++</span><span style="color: #000000;">)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;检查当前任务对depends数组中的其他任务是否存在依赖</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(list.contains(depends[j]))&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;counts[i]</span><span style="color: #000000;">++</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;获取最大依赖</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;max&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;a&nbsp;:&nbsp;counts)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(max&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;a)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;max&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;a;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;如果最大依赖为0，则说明depends中的任务之间没有互相依赖，为并行任务，转换逗号分隔返回</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(max&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;size;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;target&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;target&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;depends[i]&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">,</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;除去最后一个逗号</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;target&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;target.substring(</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;target.length()&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;target;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;否则，任务之间存在依赖，取最大依赖</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;size;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(counts[i]&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;max)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;target&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;depends[i];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;target;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;List</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">String</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;arrayToList(String[]&nbsp;array)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ArrayList</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">String</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">&nbsp;list&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ArrayList</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">String</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(String&nbsp;string&nbsp;:&nbsp;array)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.add(string);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;list;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>}<br></span></div>
<br>用到的xml文件<br><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">&lt;?</span><span style="color: #ff00ff;">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="color: #0000ff;">?&gt;</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">project&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="srping_study"</span><span style="color: #ff0000;">&nbsp;default</span><span style="color: #0000ff;">="run"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="src"</span><span style="color: #ff0000;">&nbsp;value</span><span style="color: #0000ff;">="src"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="bin"</span><span style="color: #ff0000;">&nbsp;value</span><span style="color: #0000ff;">="bin"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="test"</span><span style="color: #ff0000;">&nbsp;value</span><span style="color: #0000ff;">="test"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="run.classpath"</span><span style="color: #ff0000;">&nbsp;value</span><span style="color: #0000ff;">="bin"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="lib"</span><span style="color: #ff0000;">&nbsp;value</span><span style="color: #0000ff;">="lib"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="xmlfile"</span><span style="color: #ff0000;">&nbsp;value</span><span style="color: #0000ff;">="xmlfile"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">path&nbsp;</span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="spring.lib"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">pathelement&nbsp;</span><span style="color: #ff0000;">path</span><span style="color: #0000ff;">="${lib}"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">fileset&nbsp;</span><span style="color: #ff0000;">dir</span><span style="color: #0000ff;">="${lib}"</span><span style="color: #ff0000;">&nbsp;includes</span><span style="color: #0000ff;">="*.jar"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">path</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">target&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="clear"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">delete&nbsp;</span><span style="color: #ff0000;">dir</span><span style="color: #0000ff;">="${bin}"</span><span style="color: #ff0000;">&nbsp;quiet</span><span style="color: #0000ff;">="true"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">target</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">target&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="compile"</span><span style="color: #ff0000;">&nbsp;depends</span><span style="color: #0000ff;">="clear"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">mkdir&nbsp;</span><span style="color: #ff0000;">dir</span><span style="color: #0000ff;">="bin"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">javac&nbsp;</span><span style="color: #ff0000;">destdir</span><span style="color: #0000ff;">="${run.classpath}"</span><span style="color: #ff0000;">&nbsp;srcdir</span><span style="color: #0000ff;">="${src}"</span><span style="color: #ff0000;">&nbsp;classpathref</span><span style="color: #0000ff;">="spring.lib"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">javac</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">copy&nbsp;</span><span style="color: #ff0000;">todir</span><span style="color: #0000ff;">="${run.classpath}"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">fileset&nbsp;</span><span style="color: #ff0000;">dir</span><span style="color: #0000ff;">="${xmlfile}"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">include&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="*.xml"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">include&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="*.properties"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">fileset</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">copy</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">target</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">target&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="deploy"</span><span style="color: #ff0000;">&nbsp;depends</span><span style="color: #0000ff;">="compile"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">java&nbsp;</span><span style="color: #ff0000;">classname</span><span style="color: #0000ff;">="org.chen.spring_study.HibernateUtil"</span><span style="color: #ff0000;">&nbsp;classpathref</span><span style="color: #0000ff;">="spring.lib"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">classpath&nbsp;</span><span style="color: #ff0000;">path</span><span style="color: #0000ff;">="${run.classpath}"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">java</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">target</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">target&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="deploy1"</span><span style="color: #ff0000;">&nbsp;depends</span><span style="color: #0000ff;">="deploy"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">java&nbsp;</span><span style="color: #ff0000;">classname</span><span style="color: #0000ff;">="org.chen.spring_study.HibernateUtil"</span><span style="color: #ff0000;">&nbsp;classpathref</span><span style="color: #0000ff;">="spring.lib"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">classpath&nbsp;</span><span style="color: #ff0000;">path</span><span style="color: #0000ff;">="${run.classpath}"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">java</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">target</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">target&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="test"</span><span style="color: #ff0000;">&nbsp;depends</span><span style="color: #0000ff;">="compile"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">java&nbsp;</span><span style="color: #ff0000;">classname</span><span style="color: #0000ff;">="org.chen.spring_study.transaction.programmic.ProgramicCodingTrans"</span><span style="color: #ff0000;">&nbsp;classpathref</span><span style="color: #0000ff;">="spring.lib"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">classpath&nbsp;</span><span style="color: #ff0000;">path</span><span style="color: #0000ff;">="${run.classpath}"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">java</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">target</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;<br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">target&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="run"</span><span style="color: #ff0000;">&nbsp;depends</span><span style="color: #0000ff;">="test,deploy,deploy1"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">java&nbsp;</span><span style="color: #ff0000;">classname</span><span style="color: #0000ff;">="org.chen.spring_study.transaction.declaretrans.DeclareClient"</span><span style="color: #ff0000;">&nbsp;classpathref</span><span style="color: #0000ff;">="spring.lib"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">classpath&nbsp;</span><span style="color: #ff0000;">path</span><span style="color: #0000ff;">="${run.classpath}"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">java</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">target</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">project</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br></span></div><img src ="http://www.blogjava.net/cherishchen/aggbug/128235.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cherishchen/" target="_blank">凭栏观海</a> 2007-07-05 09:11 <a href="http://www.blogjava.net/cherishchen/archive/2007/07/05/128235.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Jdom 常用API</title><link>http://www.blogjava.net/cherishchen/archive/2007/07/04/128138.html</link><dc:creator>凭栏观海</dc:creator><author>凭栏观海</author><pubDate>Wed, 04 Jul 2007 08:35:00 GMT</pubDate><guid>http://www.blogjava.net/cherishchen/archive/2007/07/04/128138.html</guid><wfw:comment>http://www.blogjava.net/cherishchen/comments/128138.html</wfw:comment><comments>http://www.blogjava.net/cherishchen/archive/2007/07/04/128138.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cherishchen/comments/commentRss/128138.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cherishchen/services/trackbacks/128138.html</trackback:ping><description><![CDATA[<p>使用Jdom，操作xml从此变得方便，^_^</p>
<h2>一、创建XML文件</h2>
<p>Document doc = new Document(new Element("rootElement")) </p>
<p>或者 </p>
<p>Document doc = new Document();<br />
//&nbsp;根元素</p>
<p>&nbsp;Element root = new Element("persons");<br />
&nbsp;doc.addContent(root);</p>
<p>// add person<br />
Element person = new Element("person").setText("test1");<br />
root.addContent(person);</p>
<p>//add person 2<br />
person = new Element("person").setText("test2");<br />
root.addContent(person);</p>
<p>&nbsp;</p>
<p>另外一种方式：</p>
<blockquote>
<p>Document doc = new Document(new Element("family")<br />
.addContent(new Element("mom"))<br />
.addContent(new Element("dad").addContent("kidOfDad")));</p>
</blockquote>
<h2>二、解析XML文件</h2>
<p>&nbsp;&nbsp; 一般而言，使用org.jdom.input.SAXBuilder更快，推荐使用，而org.jdom.input.DOMBuilder适用于已经存在DOM对象的场合。 </p>
<p>SAXBuilder b = new SAXBuilder();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Create the document<br />
Document doc = b.build(new File(xmlfilename));</p>
<ul>
    <li>获取根元素：Element webapp = doc.getRootElement();</li>
    <li>获取子节点（支持namespace）：</li>
</ul>
<blockquote>
<p>// Get a List of direct children as Elements<br />
List allChildren = element.getChildren(); </p>
<p>// Get all direct children with a given name<br />
List namedChildren = element.getChildren("name"); </p>
<p>// Get the first kid with a given name<br />
Element kid = element.<strong>getChild</strong>("name");</p>
</blockquote>
<ul>
    <li>增加/删除子节点，可以像操作List对象一样操作子节点集合，当然也可以以传统的方式来操作</li>
</ul>
<blockquote>
<p>List allChildren = element.getChildren();<br />
// Remove the fourth child<br />
allChildren.remove(3);<br />
// Remove all children named "jack"<br />
allChildren.removeAll(element.getChildren("jack"));</p>
<p>或者<br />
element.removeChildren("jack");<br />
// Add a new child<br />
allChildren.add(new Element("jane"));</p>
<p>或者<br />
element.addContent(new Element("jane"));<br />
// Add a new child in the second position<br />
allChildren.add(1, new Element("second"));</p>
</blockquote>
<ul>
    <li>读取/设置属性</li>
</ul>
<blockquote>
<p>// 读取属性： </p>
<p>String value =table.getAttributeValue("width");// table 是element<br />
// 也可以在读取属性的同时进行类型转换<br />
try {<br />
value =table.getAttribute("border").getIntValue();<br />
}<br />
catch (DataConversionException e) { }</p>
</blockquote> <blockquote>
<p>// 设置属性 </p>
<p>// Add an attribute <br />
table.addAttribute("vspace", "0");<br />
// Add an attribute more formally 比较正式的写法<br />
table.addAttribute(new Attribute("name", "value"))<br />
// Remove an attribute<br />
table.removeAttribute("border");<br />
// Remove all attributes 移除所有属性<br />
table.getAttributes().clear();</p>
</blockquote>
<ul>
    <li>获取元素的内容</li>
</ul>
<blockquote>
<p>比如&lt;description&gt;A cool demo&lt;/description&gt;，则可以直接获取内容</p>
<p>String content = element.getText();</p>
<p>// 移除多余的空白，字符串前后的空白，不会移除字符串内部的空白 </p>
<p>element.getTextNormalize();</p>
</blockquote>
<ul>
    <li>设置元素的内容</li>
</ul>
<p>// This blows away all current content<br />
element.setText("A new description"); </p>
<p>//Special characters are interpreted correctly: 特殊字符可以被正确地转义</p>
<p>element.setText("&lt;xml&gt; content");</p>
<p>// 创建cdata元素</p>
<p>element.addContent(new CDATA("&lt;xml&gt; content")); </p>
<h2>三、输出XML</h2>
<p>XMLOutputter 类用来实现XML文件的输出，在创建的时候需要一个Format对象来格式化XML文件，Format对象是一个工厂类，提供几个静态的工厂方法来提供一些常规的XML格式，比如getPrettyFormat()： </p>
<p>XMLOutputter outputter = new XMLOutputter(Format.getPrettyFormat());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; outputter.output(doc, new FileOutputStream(new File("xmlfile/persons.xml")));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (IOException e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // TODO Auto-generated catch block<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } </p>
<p>&nbsp; </p>
<h2>四、xml Namespace的支持</h2>
<ul>
    <li>获取名空间</li>
</ul>
<blockquote>
<p>Namespace xhtml = Namespace.getNamespace("xhtml", &#8220;<a href="http://www.w3.org/1999/xhtml">http://www.w3.org/1999/xhtml</a>&#8221;);</p>
</blockquote>
<ul>
    <li>Namespace 对象可以作为Element 和Attribute的大多数方法的可选参数：</li>
</ul>
<blockquote>
<p>List kids = element.getChildren("p", xhtml);<br />
Element kid = element.getChild("title", xhtml);<br />
Attribute height = element.getAttribute("height", xhtml);</p>
</blockquote>
<p>附录：Java下XML编程接口比较：DOM SAX JDOM JAXP（网络装载）</p>
<blockquote>
<p>一、DOM （文档对象模型）<br />
为 XML 文档的已解析版本定义了一组接口。解析器读入整个文档，然后构建一个驻留内存的树结构，然后代码就可以使用 DOM 接口来操作这个树结构。<br />
优点：整个文档树在内存中，便于操作；支持删除、修改、重新排列等多种功能；<br />
缺点：将整个文档调入内存（包括无用的节点），浪费时间和空间；<br />
使用场合：一旦解析了文档还需多次访问这些数据；<br />
硬件资源充足（内存、CPU）<br />
&nbsp;二、SAX<br />
为解决DOM的问题，出现了SAX。<br />
SAX ，事件驱动。当解析器发现元素开始、元素结束、文本、文档的开始或结束等时，发送事件，程序员编写响应这些事件的代码，保存数据。<br />
优点：不用事先调入整个文档，占用资源少；<br />
SAX解析器代码比DOM解析器代码小，适于Applet，下载<br />
缺点：不是持久的；事件过后，若没保存数据，那么数据就丢了；<br />
无状态性；从事件中只能得到文本，但不知该文本属于哪个元素；<br />
使用场合：Applet;<br />
只需XML文档的少量内容，很少回头访问；<br />
机器内存少；<br />
&nbsp;三、JDOM<br />
为减少DOM、SAX的编码量，出现了JDOM；<br />
优点：20-80原则，极大减少了代码量<br />
使用场合：要实现的功能简单，如解析、创建等，但在底层，JDOM还是使用SAX（最常用）、DOM、Xanan<br />
四、JAXP<br />
为多个XML解析器提供了统一编程接口<br />
更换解析器，不用更改代码<br />
使用场合：若不用Jdom，一般建议使用JAPX，将代码与各种解析器的实现细节隔离。</p>
</blockquote>   
<img src ="http://www.blogjava.net/cherishchen/aggbug/128138.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cherishchen/" target="_blank">凭栏观海</a> 2007-07-04 16:35 <a href="http://www.blogjava.net/cherishchen/archive/2007/07/04/128138.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>The JDOM Philosophy</title><link>http://www.blogjava.net/cherishchen/archive/2007/07/04/128048.html</link><dc:creator>凭栏观海</dc:creator><author>凭栏观海</author><pubDate>Wed, 04 Jul 2007 03:19:00 GMT</pubDate><guid>http://www.blogjava.net/cherishchen/archive/2007/07/04/128048.html</guid><wfw:comment>http://www.blogjava.net/cherishchen/comments/128048.html</wfw:comment><comments>http://www.blogjava.net/cherishchen/archive/2007/07/04/128048.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cherishchen/comments/commentRss/128048.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cherishchen/services/trackbacks/128048.html</trackback:ping><description><![CDATA[<h2>The JDOM Philosophy</h2>
<p>&#8226; JDOM should be straightforward for Java programmers<br>&#8211; Use the power of the language (Java 2)<br>&#8211; Take advantage of method overloading, the Collections APIs, reflection, weak references<br>&#8211; Provide conveniences like type conversions</p>
<p><br>&#8226; JDOM should hide the complexities of XML wherever possible<br>&#8211; <strong>An Element has content, not a child Text node with content<br></strong>&#8211; Exceptions should contain useful error messages<br>&#8211; Give line numbers and specifics, use no SAX or DOM specifics</p>
<p>&#8226; JDOM should integrate with DOM and SAX<br>&#8211; Support reading and writing DOM documents and SAX events<br>&#8211; Support runtime plug-in of any DOM or SAX parser<br>&#8211; Easy conversion from DOM/SAX to JDOM<br>&#8211; Easy conversion from JDOM to DOM/SAX</p>
<p><br>&#8226; JDOM should stay current with the latest XML standards<br>&#8211; DOM Level 2, SAX 2.0, XML Schema</p>
<p><br>&#8226; JDOM does not need to solve every problem<br>&#8211; It should solve 80% of the problems with 20% of the effort<br>&#8211; We think we got the ratios to 90% / 10%</p>
<h2>JDOM consists of five packages</h2>
<p>&nbsp;</p>
<p><a href="http://www.blogjava.net/images/blogjava_net/cherishchen/WindowsLiveWriter/TheJDOMPhilosophy_9BE1/image.png" atomicselection="true"><img style="border: 0px none ;" alt="image" src="http://www.blogjava.net/images/blogjava_net/cherishchen/WindowsLiveWriter/TheJDOMPhilosophy_9BE1/image_thumb.png" border="0" height="227" width="240"></a> </p>
<p>&nbsp;</p>
<h2>The org.jdom.input Package</h2>
<p><br>&#8226; Classes for reading XML from existing sources:<br>&#8211; DOMBuilder<br>&#8211; SAXBuilder<br>&#8226; Also, outside contributions in jdom-contrib:<br>&#8211; ResultSetBuilder<br>&#8211; SpitfireBuilder<br>&#8226; New support for JAXP-based input<br>&#8211; Allows consistency across applications<br>&#8211; Builders pick up JAXP information and user automatically<br>&#8211; Sets stage for JAXP version.next</p>
<p>&nbsp;</p>
<h2>The org.jdom.output Package</h2>
<p><br>Classes for writing XML to various forms of output:<br>&#8211; DOMOutputter<br>&#8211; SAXOutputter<br>&#8211; XMLOutputter<br>Also, outside contributions in jdom-contrib:<br>&#8211; JTreeOutputter</p>
<p>&nbsp;</p>
<h2>org.jdom.transform</h2>
<p>&#8226; TRaX is now supported in org.jdom.transform<br>&#8211; Supports XSLT transformations<br>&#8211; Defines Source and Result interfaces<br>&#8211; JDOMSource<br>&#8211; JDOMResult</p>
<p>&nbsp;</p>
<h2>General Program Flow</h2>
<p><br>&#8226; Normally XML Document -&gt; SAXBuilder -&gt;XMLOutputter</p>
<p><a href="http://www.blogjava.net/images/blogjava_net/cherishchen/WindowsLiveWriter/TheJDOMPhilosophy_9BE1/image_1.png" atomicselection="true"><img style="border: 0px none ;" alt="image" src="http://www.blogjava.net/images/blogjava_net/cherishchen/WindowsLiveWriter/TheJDOMPhilosophy_9BE1/image_thumb_1.png" border="0" height="256" width="387"></a></p>
<br>
<p><br></p>
<br>
<p>完整的pdf下载地址，<span style="font-weight: bold;">JDOM: How It Works,and How It Opened the Java Processby</span> Jason Hunter<br></p>
<p>http://www.blogjava.net/Files/cherishchen/JDOM%20How%20It%20Works.zip<br> </p><img src ="http://www.blogjava.net/cherishchen/aggbug/128048.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cherishchen/" target="_blank">凭栏观海</a> 2007-07-04 11:19 <a href="http://www.blogjava.net/cherishchen/archive/2007/07/04/128048.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一家之言--Java异常处理</title><link>http://www.blogjava.net/cherishchen/archive/2007/07/04/128014.html</link><dc:creator>凭栏观海</dc:creator><author>凭栏观海</author><pubDate>Wed, 04 Jul 2007 01:18:00 GMT</pubDate><guid>http://www.blogjava.net/cherishchen/archive/2007/07/04/128014.html</guid><wfw:comment>http://www.blogjava.net/cherishchen/comments/128014.html</wfw:comment><comments>http://www.blogjava.net/cherishchen/archive/2007/07/04/128014.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cherishchen/comments/commentRss/128014.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cherishchen/services/trackbacks/128014.html</trackback:ping><description><![CDATA[&nbsp;&nbsp; <span lang="EN-US">Java</span><span style="font-family: 宋体;">异常为我们提供了一致的识别和处理程序错误的机制，有效的异常处理能增强程序的健壮性和易于调试性。</span>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 宋体;">首先还是重温下</span><span lang="EN-US">java</span><span style="font-family: 宋体;">的异常体系结构，如图所示，所有异常的根是</span><span lang="EN-US">Throwable</span><span style="font-family: 宋体;">，异常又分为</span><span lang="EN-US">checked exception</span><span style="font-family: 宋体;">和</span><span lang="EN-US">unchecked exception</span><span style="font-family: 宋体;">，</span><span lang="EN-US">RuntimeException</span><span style="font-family: 宋体;">就是属于</span><span lang="EN-US">unchecked exception</span><span style="font-family: 宋体;">，</span><span lang="EN-US">JVM </span><span style="font-family: 宋体;">一旦捕捉到</span><span lang="EN-US">unchecked
exception </span><span style="font-family: 宋体;">就会终止当前运行的程序，并在</span><span lang="EN-US">console</span><span style="font-family: 宋体;">中打出错误信息。</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal" style="text-align: center;" align="center"><span style="font-family: arial;" lang="EN-US"><!--[if gte vml 1]><v:shapetype
id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t"
path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f">
<v:stroke joinstyle="miter"/>
<v:formulas>
<v:f eqn="if lineDrawn pixelLineWidth 0"/>
<v:f eqn="sum @0 1 0"/>
<v:f eqn="sum 0 0 @1"/>
<v:f eqn="prod @2 1 2"/>
<v:f eqn="prod @3 21600 pixelWidth"/>
<v:f eqn="prod @3 21600 pixelHeight"/>
<v:f eqn="sum @0 0 1"/>
<v:f eqn="prod @6 1 2"/>
<v:f eqn="prod @7 21600 pixelWidth"/>
<v:f eqn="sum @8 21600 0"/>
<v:f eqn="prod @7 21600 pixelHeight"/>
<v:f eqn="sum @10 21600 0"/>
</v:formulas>
<v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/>
<o:lock v:ext="edit" aspectratio="t"/>
</v:shapetype><v:shape id="_x0000_i1025" type="#_x0000_t75" alt="Java exception hierarchy"
style="'width:233.25pt;height:159pt'">
<v:imagedata src="file:///C:\DOCUME~1\chen\LOCALS~1\Temp\msohtml1\01\clip_image001.gif"
o:href="http://today.java.net/images/2003/12/exceptionHierarchy.gif"/>
</v:shape><![endif]--><!--[if !vml]--><img src="http://www.blogjava.net/images/blogjava_net/cherishchen/af1.jpg" alt="Java exception hierarchy" v:shapes="_x0000_i1025" height="212" width="311">ption hierarchy<!--[endif]--></span></p>
<h2><strong><span style="font-family: 宋体;">一、</span><span lang="EN-US">Unchecked
exceptions</span></strong><strong><span lang="EN-US">
VS <span>Checked exceptions</span><o:p></o:p></span></strong></h2>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span><span style="font-family: 宋体;">下表列出使用两种异常的场合：</span></p>
<table class="MsoNormalTable" border="1" cellpadding="0" cellspacing="0">
    <tbody>
        <tr>
            <td style="padding: 2.25pt;">
            <p class="MsoNormal" style="text-align: center;" align="center"><strong><span lang="EN-US">Client's reaction when exception happens</span></strong><strong><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><o:p></o:p></span></strong></p>
            </td>
            <td style="padding: 2.25pt;">
            <p class="MsoNormal" style="text-align: center;" align="center"><strong><span lang="EN-US">Exception type</span></strong><strong><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><o:p></o:p></span></strong></p>
            </td>
        </tr>
        <tr>
            <td style="padding: 2.25pt;">
            <p class="MsoNormal"><span lang="EN-US">Client code cannot do anything</span><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><o:p></o:p></span></p>
            </td>
            <td style="padding: 2.25pt;">
            <p class="MsoNormal"><span lang="EN-US">Make it an unchecked exception</span><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><o:p></o:p></span></p>
            </td>
        </tr>
        <tr>
            <td style="padding: 2.25pt;">
            <p class="MsoNormal"><span lang="EN-US">Client code will take some useful
            recovery action based on information in exception</span><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><o:p></o:p></span></p>
            </td>
            <td style="padding: 2.25pt;">
            <p class="MsoNormal"><span lang="EN-US">Make it a checked exception </span><span style="font-size: 12pt; font-family: 宋体; color: black;" lang="EN-US"><o:p></o:p></span></p>
            </td>
        </tr>
    </tbody>
</table>
<p class="MsoNormal" style="text-indent: 21pt;"><span lang="EN-US"><o:p>&nbsp;</o:p></span><span style="font-family: 宋体;">这个方面的例子</span><span lang="EN-US">hibernate</span><span style="font-family: 宋体;">就是一个，在</span><span lang="EN-US">hibernate2</span><span style="font-family: 宋体;">中，</span><span lang="EN-US">HibernateException</span><span style="font-family: 宋体;">还是</span><span lang="EN-US">checked exceptions</span><span style="font-family: 宋体;">，但是到了</span><span lang="EN-US">hibernate3</span><span style="font-family: 宋体;">中就成了</span><span lang="EN-US">unchecked exceptions</span><span style="font-family: 宋体;">，因为对于数据库操作来说，一旦出现异常，就是比较严重的错误，而且在</span><span lang="EN-US">client</span><span style="font-family: 宋体;">端基本上是无能为力的，使用</span><span lang="EN-US">unchecked
exceptions</span><span style="font-family: 宋体;">更加合适。</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 宋体;">另外，</span><span lang="EN-US">unchecked exceptions</span><span style="font-family: 宋体;">的优点在于不强迫客户端代码显式地处理他们，异常可以一直往上传递（除非需要转化异常，否则异常不需要在中间被捕捉，节省了很多的</span><span lang="EN-US">try{}catch()</span><span style="font-family: 宋体;">，代码更加简洁），直到你想捕捉处理他们，（有人会问，如何不强制客户端处理他们，比如像</span><span lang="EN-US">checked exceptions</span><span style="font-family: 宋体;">这样，不处理就是语法错误，如何保证异常能够得到处理呢？在这点上，</span><span lang="EN-US">java</span><span style="font-family: 宋体;">提供的完善的文档机制，通过</span><span lang="EN-US">API</span><span style="font-family: 宋体;">客户端程序员可以很方便地知道他调用的方法可能会抛出什么异常，一个负责人的程序员就应该对其进行</span><span lang="EN-US">catch</span><span style="font-family: 宋体;">和处理），</span><span lang="EN-US">Java API</span><span style="font-family: 宋体;">提供了很多的</span><span lang="EN-US">unchecked exceptions</span><span style="font-family: 宋体;">，比如</span><code><span style="font-size: 12pt;" lang="EN-US">NullPointerException</span></code><span lang="EN-US">, </span><code><span style="font-size: 12pt;" lang="EN-US">IllegalArgumentException</span></code><span lang="EN-US">, and </span><code><span style="font-size: 12pt;" lang="EN-US">IllegalStateException</span></code><code><span style="font-size: 12pt;">，使用<span lang="EN-US">java</span>提供的标准的</span></code><span lang="EN-US">unchecked exceptions</span><span style="font-family: 宋体;">是值得推荐的，这样的好处在于使代码更加简洁并可以减少代码对内存的占用。</span></p>
<h2><span style="font-family: 宋体;">二、</span><span lang="EN-US">Java</span><span style="font-family: 宋体;">异常的推迟处理</span></h2>
<p class="MsoNormal" style="text-indent: 21pt;"><span lang="EN-US">Java</span><span style="font-family: 宋体;">异常应该尽可能地推迟处理，除非要转化异常，重新抛出，否则最好不要处理，而是留给最后能够处理异常的地方。</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 宋体;">通过为方法添加</span><span style="font-family: courier;" lang="EN-US">throws</span><span style="font-family: 宋体;">声明，可以将处理异常的责任传递到更高的层次。在声明哪些需要抛出的时候，应该尽可能地详细。这样做的目的是可以在</span><span lang="EN-US">API</span><span style="font-family: 宋体;">中详细地表述出该方法可能会出现的异常，从而让调用该方法的</span><span lang="EN-US">clinet</span><span style="font-family: 宋体;">程序员做好处理异常的准备，比如对于代码通过</span><span lang="EN-US">throws</span><span style="font-family: 宋体;">语句详细地声明了可能会抛出的异常，这样调用该方法的程序员就会知道将会有什么样的异常会发生。</span></p>
<p class="MsoNormal" style="background: #efefef none repeat scroll 0% 50%; text-align: left; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial;" align="left"><span lang="EN-US"><o:p>
</o:p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;readPreferences(String&nbsp;filename)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;IllegalArgumentException,<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileNotFoundException,&nbsp;IOException<br>{<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(filename&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throw</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;IllegalArgumentException<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</span><span style="color: #000000;">"</span><span style="color: #000000;">filename&nbsp;is&nbsp;null</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">if<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;"><img src="http://www.blogjava.net/Images/dot.gif"></span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;InputStream&nbsp;in&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;FileInputStream(filename);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;"><img src="http://www.blogjava.net/Images/dot.gif"></span><span style="color: #008000;"><br></span><span style="color: #000000;">}</span></div>
<br></span><span style="font-family: courier;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-family: 宋体;">从语法上讲，</span><span style="font-family: courier;" lang="EN-US">IllegalArgumentException</span><span style="font-family: 宋体;">是</span><span style="font-family: courier;" lang="EN-US">unckecked exception </span><span style="font-family: 宋体;">是不需要声明的，但是为了从文档的角度考虑，最好还是加上，这样可以让调用这个方法的程序员知道，这个方法会可能抛出该异常，需要加以捕捉和处理。</span><span style="font-family: courier;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family: courier;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<h2><strong><span style="font-family: 宋体;">三、异常的处理</span><span lang="EN-US"><o:p></o:p></span></strong></h2>
<p class="MsoNormal"><span style="font-family: 宋体;">不管如何，最终程序肯定是要对异常进行处理的，否则会导致不确定情况的发生，但是选择异常处理的位置却是有技巧的，通常要么是程序在这些地方从异常中恢复、继续执行且不会导致进一步异常的发生，要么是在这些地方能为用户反馈特定的信息，比如，如何避免异常的发生或者如何从异常中恢复。因此，对于有用户界面层的程序，将异常的捕捉和处理推迟到</span><span lang="EN-US">UI</span><span style="font-family: 宋体;">层是有好处的，在</span><span lang="EN-US">UI</span><span style="font-family: 宋体;">层可以使用对话框或者其他方式提示用户出现异常。</span><span lang="EN-US"><o:p><br>&nbsp;</o:p></span></p>
<h2><span style="font-family: 宋体;">参考文献</span></h2>
<p class="MsoNormal"><strong><span lang="EN-US">Best
Practices for Exception Handling</span></strong><span lang="EN-US"> by Gunjan Doshi</span></p>
<p class="MsoNormal"><strong><span lang="EN-US">Three
Rules for Effective Exception Handling</span></strong><span lang="EN-US"> by Jim
Cushing</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p></o:p></span></p><img src ="http://www.blogjava.net/cherishchen/aggbug/128014.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cherishchen/" target="_blank">凭栏观海</a> 2007-07-04 09:18 <a href="http://www.blogjava.net/cherishchen/archive/2007/07/04/128014.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Dijkstra算法-寻找有向图中最短路径</title><link>http://www.blogjava.net/cherishchen/archive/2007/07/03/127882.html</link><dc:creator>凭栏观海</dc:creator><author>凭栏观海</author><pubDate>Tue, 03 Jul 2007 08:28:00 GMT</pubDate><guid>http://www.blogjava.net/cherishchen/archive/2007/07/03/127882.html</guid><wfw:comment>http://www.blogjava.net/cherishchen/comments/127882.html</wfw:comment><comments>http://www.blogjava.net/cherishchen/archive/2007/07/03/127882.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/cherishchen/comments/commentRss/127882.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cherishchen/services/trackbacks/127882.html</trackback:ping><description><![CDATA[<p><strong>Dijkstra算法</strong>是由荷兰计算机科学家艾兹格&#183;迪科斯彻发现的。算法解决的是有向图中最短路径问题。</p>
<p>举例来说，如果图中的顶点表示城市，而边上的权重表示著城市间开车行经的距离。 Dijkstra算法可以用来找到两个城市之间的最短路径。</p>
<p>Dijkstra算法的输入包含了一个有权重的有向图<em>G</em>，以及G中的一个来源顶点<em>S</em>。 我们以<em>V</em>表示<em>G</em>中所有顶点的集合。图中的每一个边，都是两个顶点所形成的有序元素对。(<em>u</em>,<em>v</em>)表示从顶点<em>u</em>到<em>v</em>有路径相连。 假设<em>E为</em>所有边的集合，而边的权重则由权重函数<em>w</em>: <em>E</em> &#8594; [0, &#8734;]定义。 因此，<em>w</em>(<em>u</em>,<em>v</em>)就是从顶点<em>u</em>到顶点<em>v</em>的非负花费值(cost)。 边的花费可以想像成两个顶点之间的距离。任两点间路径的花费值，就是该路径上所有边的花费值总和。 已知有<em>V</em>中有顶点<em>s</em>及<em>t</em>，Dijkstra算法可以找到<em>s</em>到<em>t</em>的最低花费路径(i.e. 最短路径)。 这个算法也可以在一个图中，找到从一个顶点<em>s</em>到任何其他顶点的最短路径。</p>
<br>
<h3>算法描述</h3>
<p>&nbsp; 这个算法是通过为每个顶点<em>v</em>保留目前为止所找到的从s到v的最短路径来工作的。初始时，源点s的路径长度值被赋为0（<em>d[s]</em>=0）， 同时把所有其他顶点的路径长度设为无穷大，即表示我们不知道任何通向这些顶点的路径（对于<em>V</em>中所有顶点<em>v</em>除<em>s</em>外<em>d[v]</em>= &#8734;）。当算法结束时，<em>d[v]</em>中储存的便是从<em>s</em>到<em>v</em>的最短路径，或者是无穷大（如果路径不存在的话）。 <br></p>
<p>&nbsp;&nbsp; Dijstra算法的基础操作是边的拓展：如果存在一条从<em>u</em>到<em>v</em>的边，那么从<em>s</em>到v的最短路径可以通过将边(<em>u</em>,<em>v</em>)添加到s到u的尾部来拓展。这条路径的长度是d[u]+w(u,v)。如果这个值比目前已知的<em>d[v]</em>的值要小，我们可以用新值来替代当前<em>d[v]</em>中的值。拓展边的操作一直执行到所有的d[v]都代表从s到v最短路径的花费。这个算法经过适当的组织因而当<em>d[u]</em>达到它最终的值的时候，每条边(<em>u</em>,<em>v</em>)都只被拓展一次。</p>
<p>算法维护两个顶点集S和Q。集合S保留了我们已知的所有d[v]的值已经是最短路径的值顶点，而集合Q则保留其他所有顶点。集合S初始状态为空，而
后每一步都有一个顶点从Q移动到S。这个被选择的顶点是Q中拥有最小的d[u]值的顶点。当一个顶点u从Q中转移到了S中，算法对每条外接边(u,v)进
行拓展。</p>
<br>
<h3>算法思想</h3>
设S为最短距离已确定的顶点集（看作红点集），V-S是最短距离尚未确定的顶点集（看作蓝点集）。<br>
<strong>①初始化</strong><br>
&nbsp;&nbsp;&nbsp; 　初始化时，只有源点s的最短距离是已知的(SD(s)=0)，故红点集S={s}，蓝点集为空。<br>
<strong>②重复以下工作，按路径长度递增次序产生各顶点最短路径</strong><br>
&nbsp;&nbsp;&nbsp; 　在当前蓝点集中选择一个最短距离最小的蓝点来扩充红点集，以保证按路径权重递增的次序来产生各顶点的最短路径。<br>
&nbsp;&nbsp;&nbsp; 　当蓝点集中仅剩下最短距离为&#8734;的蓝点，或者所有蓝点已扩充到红点集时，s到所有顶点的最短路径就求出来了。<br>
&nbsp;
<font color="#ff0000">注意：</font><br>
&nbsp;&nbsp;&nbsp; 　①若从源点到蓝点的路径不存在，则可假设该蓝点的最短路径是一条长度为无穷大的虚拟路径。<br>
&nbsp;&nbsp;&nbsp; 　②从源点s到终点v的最短路径简称为v的最短路径；s到v的最短路径长度简称为v的最短距离，并记为SD(v)。<br><font color="#0000ff">
（3）在蓝点集中选择一个最短距离最小的蓝点k来扩充红点集</font><br>
&nbsp;&nbsp;&nbsp; 　根据按长度递增序产生最短路径的思想，当前最短距离最小的蓝点k的最短路径是：<br>
&nbsp;&nbsp;&nbsp; 　源点，红点1，红点2，&#8230;，红点n，蓝点k<br>
&nbsp;距离为：源点到红点n最短距离+&lt;红点n,蓝点k&gt;边长<br>
&nbsp;&nbsp;&nbsp; 　为求解方便，设置一个向量D[0．．n-1]，对于每个蓝点v&#8712; V-S，用D[v]记录从源点s到达v且除v外中间不经过任何蓝点(若有中间点，则必为红点)的"最短"路径长度（简称估计距离）。<br>
&nbsp;&nbsp;&nbsp; 　若k是蓝点集中估计距离最小的顶点，则k的估计距离就是最短距离，即若D[k]=min{D[i]
i&#8712;V-S}，则D[k]=SD(k)。<br>
&nbsp;&nbsp;&nbsp; 　初始时，每个蓝点v的D[c]值应为权w&lt;s，v&gt;，且从s到v的路径上没有中间点，因为该路径仅含一条边&lt;s，v&gt;。<br>
&nbsp;
<font color="#ff0000">注意：</font><br>
&nbsp;&nbsp;&nbsp; 　在蓝点集中选择一个最短距离最小的蓝点k来扩充红点集是Dijkstra算法的关键
<br>
<font color="#0000ff">
<br>
（4）k扩充红点集s后，蓝点集估计距离的修改</font><br>
&nbsp;&nbsp;&nbsp; 　将k扩充到红点后，剩余蓝点集的估计距离可能由于增加了新红点k而减小，此时必须调整相应蓝点的估计距离。<br>
&nbsp;&nbsp;&nbsp;
对于任意的蓝点j，若k由蓝变红后使D[j]变小，则必定是由于存在一条从s到j且包含新红点k的更短路径：P=&lt;s，&#8230;，k，j&gt;。且D
[j]减小的新路径P只可能是由于路径&lt;s，&#8230;，k&gt;和边&lt;k，j&gt;组成。<br>
&nbsp;&nbsp;&nbsp; 　所以，当length(P)=D[k]+w&lt;k，j&gt;小于D[j]时，应该用P的长度来修改D[j]的值。<br>
<br>
<font color="#0000ff">
（5）Dijkstra算法</font><br>
<br>
&nbsp;Dijkstra(G，D，s){<br>
&nbsp;&nbsp;&nbsp; //用Dijkstra算法求有向网G的源点s到各顶点的最短路径长度<br>
&nbsp;&nbsp;&nbsp; //以下是初始化操作<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; S={s}；D[s]=0； //设置初始的红点集及最短距离<br>
&nbsp;&nbsp;&nbsp; &nbsp; for( all i&#8712; V-S )do //对蓝点集中每个顶点i<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; D[i]=G[s][i]； //设置i初始的估计距离为w&lt;s，i&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //以下是扩充红点集<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(i=0;i&lt;n-1;i++)do{//最多扩充n-1个蓝点到红点集<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; D[k]=min{D[i]：all i V-S}； //在当前蓝点集中选估计距离最小的顶点k<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(D[k]等于&#8734;)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
return； //蓝点集中所有蓝点的估计距离均为&#8734;时，<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
//表示这些顶点的最短路径不存在。<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; S=S&#8746;{k}； //将蓝点k涂红后扩充到红点集<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for( all j&#8712;V-S )do //调整剩余蓝点的估计距离<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
if(D[j]&gt;D[k]+G[k][j])<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
//新红点k使原D[j]值变小时，用新路径的长度修改D[j]，<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
//使j离s更近。<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
D[j]=D[k]+G[k][j]；<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
&nbsp;&nbsp; }<br><br>
<p>
</p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;"></span><span style="color: #000000;"></span></div>
<p>&nbsp;</p><img src ="http://www.blogjava.net/cherishchen/aggbug/127882.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cherishchen/" target="_blank">凭栏观海</a> 2007-07-03 16:28 <a href="http://www.blogjava.net/cherishchen/archive/2007/07/03/127882.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring学习日志-事务管理</title><link>http://www.blogjava.net/cherishchen/archive/2007/07/03/127860.html</link><dc:creator>凭栏观海</dc:creator><author>凭栏观海</author><pubDate>Tue, 03 Jul 2007 07:26:00 GMT</pubDate><guid>http://www.blogjava.net/cherishchen/archive/2007/07/03/127860.html</guid><wfw:comment>http://www.blogjava.net/cherishchen/comments/127860.html</wfw:comment><comments>http://www.blogjava.net/cherishchen/archive/2007/07/03/127860.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cherishchen/comments/commentRss/127860.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cherishchen/services/trackbacks/127860.html</trackback:ping><description><![CDATA[<h1 style="color: #020000;">在service层控制事务<br></h1>
<p style="color: #020000;" class="MsoNormal">Spring<span style="font-family: 宋体;">推荐事务的控制在</span>service<span style="font-family: 宋体;">层实现，而不是像单独使用</span>hibernate<span style="font-family: 宋体;">那样，在</span>dao<span style="font-family: 宋体;">层实现，这样的好处在于更好地支持</span>declear<span style="font-family: 宋体;">方式的事务（</span>service<span style="font-family: 宋体;">层通常提供接口，这样可以针对接口来定义事务策略，而不是针对具体的</span>service<span style="font-family: 宋体;">实现，因此可以很方便地替换service的实现，而不需要修改事务的配置），更加灵活。同时，可以更加方面自然地实现全局事务的控制。</span></p>
<p class="MsoNormal">举例如下：</p>
service接口<br>
<p class="MsoNormal"></p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">package</span><span style="color: #000000;">&nbsp;x.y.service;<br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">interface</span><span style="color: #000000;">&nbsp;FooService&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;Foo&nbsp;getFoo(String&nbsp;fooName);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;Foo&nbsp;getFoo(String&nbsp;fooName,&nbsp;String&nbsp;barName);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;insertFoo(Foo&nbsp;foo);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;updateFoo(Foo&nbsp;foo);<br>}<br></span></div>
<p>&nbsp;</p>
<p class="MsoNormal"><br></p>
一个service实现<br>
<p class="MsoNormal">
</p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">package</span><span style="color: #000000;">&nbsp;x.y.service;<br></span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;DefaultFooService&nbsp;</span><span style="color: #0000ff;">implements</span><span style="color: #000000;">&nbsp;FooService&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Foo&nbsp;getFoo(String&nbsp;fooName)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throw</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;UnsupportedOperationException();<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Foo&nbsp;getFoo(String&nbsp;fooName,&nbsp;String&nbsp;barName)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throw</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;UnsupportedOperationException();<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;insertFoo(Foo&nbsp;foo)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throw</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;UnsupportedOperationException();<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;updateFoo(Foo&nbsp;foo)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throw</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;UnsupportedOperationException();<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br></span></div>
<p>&nbsp;</p>
spring.xml，注意在声明事务的时候，是针对service接口的，而不是针对service实现的<br>
<p class="MsoNormal">
</p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">&lt;?</span><span style="color: #ff00ff;">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="color: #0000ff;">?&gt;</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">beans&nbsp;</span><span style="color: #ff0000;">xmlns</span><span style="color: #0000ff;">="http://www.springframework.org/schema/beans"</span><span style="color: #ff0000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;xmlns:xsi</span><span style="color: #0000ff;">="http://www.w3.org/2001/XMLSchema-instance"</span><span style="color: #ff0000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;xmlns:aop</span><span style="color: #0000ff;">="http://www.springframework.org/schema/aop"</span><span style="color: #ff0000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;xmlns:tx</span><span style="color: #0000ff;">="http://www.springframework.org/schema/tx"</span><span style="color: #ff0000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;xsi:schemaLocation</span><span style="color: #0000ff;">="<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/beans&nbsp;http://www.springframework.org/schema/beans/spring-beans-2.0.xsd<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/tx&nbsp;http://www.springframework.org/schema/tx/spring-tx-2.0.xsd<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/aop&nbsp;http://www.springframework.org/schema/aop/spring-aop-2.0.xsd"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br><br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">&nbsp;this&nbsp;is&nbsp;the&nbsp;service&nbsp;object&nbsp;that&nbsp;we&nbsp;want&nbsp;to&nbsp;make&nbsp;transactional&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">bean&nbsp;</span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="fooService"</span><span style="color: #ff0000;">&nbsp;class</span><span style="color: #0000ff;">="x.y.service.DefaultFooService"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">&nbsp;the&nbsp;transactional&nbsp;advice&nbsp;(i.e.&nbsp;what&nbsp;'happens';&nbsp;see&nbsp;the&nbsp;&lt;aop:advisor/&gt;&nbsp;bean&nbsp;below)&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">tx:advice&nbsp;</span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="txAdvice"</span><span style="color: #ff0000;">&nbsp;transaction-manager</span><span style="color: #0000ff;">="txManager"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">&nbsp;the&nbsp;transactional&nbsp;semantics<img src="http://www.blogjava.net/Images/dot.gif">&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">tx:attributes</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">&nbsp;all&nbsp;methods&nbsp;starting&nbsp;with&nbsp;'get'&nbsp;are&nbsp;read-only&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">tx:method&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="get*"</span><span style="color: #ff0000;">&nbsp;read-only</span><span style="color: #0000ff;">="true"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">&nbsp;other&nbsp;methods&nbsp;use&nbsp;the&nbsp;default&nbsp;transaction&nbsp;settings&nbsp;(see&nbsp;below)&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">tx:method&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="*"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">tx:attributes</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">tx:advice</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">&nbsp;ensure&nbsp;that&nbsp;the&nbsp;above&nbsp;transactional&nbsp;advice&nbsp;runs&nbsp;for&nbsp;any&nbsp;execution<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;of&nbsp;an&nbsp;operation&nbsp;defined&nbsp;by&nbsp;the&nbsp;FooService&nbsp;interface&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">aop:config</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">aop:pointcut&nbsp;</span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="fooServiceOperation"</span><span style="color: #ff0000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;expression</span><span style="color: #0000ff;">="execution(*&nbsp;x.y.service.FooService.*(..))"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">aop:advisor&nbsp;</span><span style="color: #ff0000;">advice-ref</span><span style="color: #0000ff;">="txAdvice"</span><span style="color: #ff0000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pointcut-ref</span><span style="color: #0000ff;">="fooServiceOperation"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">aop:config</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">&nbsp;don't&nbsp;forget&nbsp;the&nbsp;DataSource&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">bean&nbsp;</span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="dataSource"</span><span style="color: #ff0000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class</span><span style="color: #0000ff;">="org.apache.commons.dbcp.BasicDataSource"</span><span style="color: #ff0000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;destroy-method</span><span style="color: #0000ff;">="close"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="driverClassName"</span><span style="color: #ff0000;">&nbsp;value</span><span style="color: #0000ff;">="org.h2.Driver"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="url"</span><span style="color: #ff0000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value</span><span style="color: #0000ff;">="jdbc:h2:tcp://localhost/D:/try/data/sample;IFEXISTS=TRUE"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="username"</span><span style="color: #ff0000;">&nbsp;value</span><span style="color: #0000ff;">="sa"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="password"</span><span style="color: #ff0000;">&nbsp;value</span><span style="color: #0000ff;">="123456"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">bean</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">&nbsp;similarly,&nbsp;don't&nbsp;forget&nbsp;the&nbsp;PlatformTransactionManager&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">bean&nbsp;</span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="txManager"</span><span style="color: #ff0000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class</span><span style="color: #0000ff;">="org.springframework.jdbc.datasource.DataSourceTransactionManager"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="dataSource"</span><span style="color: #ff0000;">&nbsp;ref</span><span style="color: #0000ff;">="dataSource"</span><span style="color: #ff0000;">&nbsp;</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">bean</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">&lt;!--</span><span style="color: #008000;">&nbsp;other&nbsp;&lt;bean/&gt;&nbsp;definitions&nbsp;here&nbsp;</span><span style="color: #008000;">--&gt;</span><span style="color: #000000;"><br></span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">beans</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br></span></div>
<p>&nbsp;</p>
<h1 style="color: #020000;">使用service层方便了使用全局事务</h1>
<p class="MsoNormal"><span style="font-family: 宋体;">对于横跨多个</span><span lang="EN-US">Hibernate SessionFacotry</span><span style="font-family: 宋体;">的分布式事务，只需简单地将</span><span lang="EN-US"> JtaTransactionManager </span><span style="font-family: 宋体;">同多个</span><span lang="EN-US"> LocalSessionFactoryBean </span><span style="font-family: 宋体;">的定义结合起来作为事务策略。你的每一个</span><span lang="EN-US">DAO</span><span style="font-family: 宋体;">通过</span><span lang="EN-US">bean</span><span style="font-family: 宋体;">属性得到各自的</span><span lang="EN-US"> SessionFactory </span><span style="font-family: 宋体;">引用。在需要进行跨多个数据库的事务操作时，只需要定义一个</span><span lang="EN-US">service</span><span style="font-family: 宋体;">层，使用</span><span lang="EN-US"> JtaTransactionManager </span><span style="font-family: 宋体;">作为事务策略，横跨多个</span><span lang="EN-US">DAO</span><span style="font-family: 宋体;">和多个</span><span lang="EN-US">session
factories</span><span style="font-family: 宋体;">来划分事务，而不需要特殊的处理。</span><span lang="EN-US"><o:p></o:p></span></p>
示例的配置文件如下：<br><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">beans</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">bean&nbsp;</span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="mySessionFactory1"</span><span style="color: #ff0000;">&nbsp;class</span><span style="color: #0000ff;">="org.springframework.orm.hibernate3.LocalSessionFactoryBean"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="dataSource"</span><span style="color: #ff0000;">&nbsp;ref</span><span style="color: #0000ff;">="myDataSource1"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;..<br>&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">bean</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">bean&nbsp;</span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="mySessionFactory2"</span><span style="color: #ff0000;">&nbsp;class</span><span style="color: #0000ff;">="org.springframework.orm.hibernate3.LocalSessionFactoryBean"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="dataSource"</span><span style="color: #ff0000;">&nbsp;ref</span><span style="color: #0000ff;">="myDataSource2"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br>&nbsp;&#8230;<br>&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">bean</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">bean&nbsp;</span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="myTxManager"</span><span style="color: #ff0000;">&nbsp;class</span><span style="color: #0000ff;">="org.springframework.transaction.jta.JtaTransactionManager"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">bean&nbsp;</span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="myProductDao"</span><span style="color: #ff0000;">&nbsp;class</span><span style="color: #0000ff;">="product.ProductDaoImpl"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="sessionFactory"</span><span style="color: #ff0000;">&nbsp;ref</span><span style="color: #0000ff;">="mySessionFactory1"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">bean</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">bean&nbsp;</span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="myInventoryDao"</span><span style="color: #ff0000;">&nbsp;class</span><span style="color: #0000ff;">="product.InventoryDaoImpl"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="sessionFactory"</span><span style="color: #ff0000;">&nbsp;ref</span><span style="color: #0000ff;">="mySessionFactory2"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">bean</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br><br></span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">aop:config</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">aop:pointcut&nbsp;</span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="productServiceMethods"</span><span style="color: #ff0000;">&nbsp;expression</span><span style="color: #0000ff;">="execution(*&nbsp;product.ProductService.*(..))"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">aop:advisor&nbsp;</span><span style="color: #ff0000;">advice-ref</span><span style="color: #0000ff;">="txAdvice"</span><span style="color: #ff0000;">&nbsp;pointcut-ref</span><span style="color: #0000ff;">="productServiceMethods"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br>&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">aop:config</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br><br>&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">tx:advice&nbsp;</span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="txAdvice"</span><span style="color: #ff0000;">&nbsp;transaction-manager</span><span style="color: #0000ff;">="myTxManager"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">tx:attributes</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">tx:method&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="increasePrice*"</span><span style="color: #ff0000;">&nbsp;propagation</span><span style="color: #0000ff;">="REQUIRED"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">tx:method&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="someOtherBusinessMethod"</span><span style="color: #ff0000;">&nbsp;propagation</span><span style="color: #0000ff;">="REQUIRES_NEW"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">tx:method&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="*"</span><span style="color: #ff0000;">&nbsp;propagation</span><span style="color: #0000ff;">="SUPPORTS"</span><span style="color: #ff0000;">&nbsp;read-only</span><span style="color: #0000ff;">="true"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">tx:attributes</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">tx:advice</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">bean&nbsp;</span><span style="color: #ff0000;">class</span><span style="color: #0000ff;">="product.ProductServiceImpl"</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="productDao"</span><span style="color: #ff0000;">&nbsp;ref</span><span style="color: #0000ff;">="myProductDao"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">property&nbsp;</span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="inventoryDao"</span><span style="color: #ff0000;">&nbsp;ref</span><span style="color: #0000ff;">="myInventoryDao"</span><span style="color: #0000ff;">/&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">bean</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">beans</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br></span></div>
<br>
<p class="MsoNormal"><br></p>
<p class="MsoNormal"><br></p>
<p class="MsoNormal"><br><span style="font-family: 宋体; color: red;"></span><span style="color: red;" lang="EN-US"><o:p></o:p></span></p><img src ="http://www.blogjava.net/cherishchen/aggbug/127860.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cherishchen/" target="_blank">凭栏观海</a> 2007-07-03 15:26 <a href="http://www.blogjava.net/cherishchen/archive/2007/07/03/127860.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Jbpm学习log</title><link>http://www.blogjava.net/cherishchen/archive/2007/07/02/127468.html</link><dc:creator>凭栏观海</dc:creator><author>凭栏观海</author><pubDate>Mon, 02 Jul 2007 03:43:00 GMT</pubDate><guid>http://www.blogjava.net/cherishchen/archive/2007/07/02/127468.html</guid><wfw:comment>http://www.blogjava.net/cherishchen/comments/127468.html</wfw:comment><comments>http://www.blogjava.net/cherishchen/archive/2007/07/02/127468.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cherishchen/comments/commentRss/127468.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cherishchen/services/trackbacks/127468.html</trackback:ping><description><![CDATA[<h2>Introduction</h2>
<p>&nbsp;&nbsp;&nbsp; jPDL是一种直观的流程语言，用以展现商业逻辑的处理过程。jPDL包含的概念涉及任务、异步通讯状态、定时器、自动执行的动作等，为此，为了整合上述行为，jPDL提供了强大、可扩展的控制流机制。</p>
<h2>graph based execution languages</h2>
<p>implementation technique for graph based execution languages：</p>
<ul>
    <ul>
        <li>based on runtime interpretation of a graph.&nbsp;  </li>
        <li>based on message queues  </li>
        <li>code generation.</li>
    </ul>
</ul>
<p>The strategy on how graph execution can be implemented on top of an OO programming language. For those who are familiar with design patterns, it's a combination of the <strong>command pattern and the chain of responsibility pattern</strong>.</p>
<p><strong>1、Transitions</strong>&nbsp; 可以理解为进入和离开节点的箭头，应该存在多个<strong>Transitions</strong>&nbsp; 进入一个节点和一个节点有多个离开的<strong>Transitions</strong>&nbsp; 的情况</p>
<p>the structure of the graph is represented with the classes <tt>Node</tt> and <tt>Transition，而<tt>Transition是具有方向性的</tt></tt></p>
<p><tt><tt><a href="http://www.blogjava.net/images/blogjava_net/cherishchen/WindowsLiveWriter/Jbpmlog_13437/image.png" atomicselection="true"><img style="border-width: 0px;" alt="image" src="http://www.blogjava.net/images/blogjava_net/cherishchen/WindowsLiveWriter/Jbpmlog_13437/image_thumb.png" border="0" height="81" width="378"></a> </tt></tt></p>
<p>&nbsp;  </p>
<p>transitions are able to pass the execution from a source node to a destination node with the method <tt>take</tt>.  </p>
<p><a></a> </p>
<p><a href="http://www.blogjava.net/images/blogjava_net/cherishchen/WindowsLiveWriter/Jbpmlog_13437/transition.take.method_2.gif" atomicselection="true"><img alt="transition.take.method" src="http://www.blogjava.net/images/blogjava_net/cherishchen/WindowsLiveWriter/Jbpmlog_13437/transition.take.method_thumb.gif" height="91" width="229"></a></p>
<p><strong>2、execution ，类似petri中的标记，是变迁就绪的前提</strong></p>
<p>An execution (also known as a <strong>token</strong>) is represented with a class called <tt>Execution</tt>. An execution has a reference to the <strong>current</strong> node.  </p>
<p><a></a> </p>
<p><a href="http://www.blogjava.net/images/blogjava_net/cherishchen/WindowsLiveWriter/Jbpmlog_13437/execution.class_2.gif" atomicselection="true"><img alt="execution.class" src="http://www.blogjava.net/images/blogjava_net/cherishchen/WindowsLiveWriter/Jbpmlog_13437/execution.class_thumb.gif" height="58" width="240"></a>  </p>
<p><strong>3、Node</strong></p>
<p><strong>A node is a command and has an <tt>execute</tt> method. Subclasses of Node are supposed to override the execute method to implement some specific behaviour for that node type.</strong></p>
<p>When an execution arrives in a node, that node is executed. The Node's execute method is also responsible for propagating the execution. Propagating the execution means that a node can pass the execution that arrived in the node over one of its leaving transitions to the next node.  </p>
<p>When a node's execute method does not propagate the execution, it behaves as a wait state.  </p>
<p>Also when a new execution is created, it is initialized in some start node and then waits for an event.  </p>
<p>An event is given to an execution and it can trigger the execution to start moving. If the event given to an execution relates to a leaving transition of the current node, the execution takes that transition. The execution then will continue to propagate until it enters another node that behaves as a wait state.  </p>
<p><a></a> </p>
<p><a href="http://www.blogjava.net/images/blogjava_net/cherishchen/WindowsLiveWriter/Jbpmlog_13437/node.execute.method_2.gif" atomicselection="true"><img alt="node.execute.method" src="http://www.blogjava.net/images/blogjava_net/cherishchen/WindowsLiveWriter/Jbpmlog_13437/node.execute.method_thumb.gif" height="81" width="240"></a>  </p>
<p>&nbsp;  </p>
<p>So now we can already see that the two main features are supported : wait states and a graphical representation. During wait states, an Execution just points to a node in the graph  </p>
<p><strong>4、Actions</strong></p>
<p>An <tt>Action</tt> is a command with an execute method. Actions can be associated with events.</p>
<h2><strong>Synchronous execution</strong></h2>
<p>The default propagation of execution is synchronous.</p><img src ="http://www.blogjava.net/cherishchen/aggbug/127468.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cherishchen/" target="_blank">凭栏观海</a> 2007-07-02 11:43 <a href="http://www.blogjava.net/cherishchen/archive/2007/07/02/127468.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JGAP - Genetic Algorithms and Genetic Programming</title><link>http://www.blogjava.net/cherishchen/archive/2007/06/27/126575.html</link><dc:creator>凭栏观海</dc:creator><author>凭栏观海</author><pubDate>Wed, 27 Jun 2007 05:34:00 GMT</pubDate><guid>http://www.blogjava.net/cherishchen/archive/2007/06/27/126575.html</guid><wfw:comment>http://www.blogjava.net/cherishchen/comments/126575.html</wfw:comment><comments>http://www.blogjava.net/cherishchen/archive/2007/06/27/126575.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cherishchen/comments/commentRss/126575.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cherishchen/services/trackbacks/126575.html</trackback:ping><description><![CDATA[<p><a title="http://jgap.sourceforge.net/" href="http://jgap.sourceforge.net/">http://jgap.sourceforge.net/</a></p>
<p>&nbsp;</p>
<h2>WHAT IS JGAP?</h2>
<p>JGAP (pronounced "jay-gap") is a Genetic Algorithms and Genetic Programming component provided as a Java framework. It provides basic genetic mechanisms that can be easily used to apply evolutionary principles to problem solutions. See the examples for a demonstration or watch out the <a href="http://sourceforge.net/project/screenshots.php?group_id=11618&amp;ssid=40991">graphical tree</a> that can be created with JGAP for found solutions of genetically evolved programs. <br>JGAP was designed to be very easy to use "out of the box", while also designed to be highly modular so that more adventurous users can easily plug-in custom genetic operators and other sub-components.  </p>
<p>Documentation,&nbsp; quality and stability of code are the top concerns when developing JGAP. You find really <strong>many unit tests </strong>packaged with JGAP, extensive Javadocs, and quite a lot of examples. Compare JGAP with other projects! Feedback is always welcome. </p><img src ="http://www.blogjava.net/cherishchen/aggbug/126575.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cherishchen/" target="_blank">凭栏观海</a> 2007-06-27 13:34 <a href="http://www.blogjava.net/cherishchen/archive/2007/06/27/126575.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>小巧好用的H2数据库</title><link>http://www.blogjava.net/cherishchen/archive/2007/06/27/126524.html</link><dc:creator>凭栏观海</dc:creator><author>凭栏观海</author><pubDate>Wed, 27 Jun 2007 03:20:00 GMT</pubDate><guid>http://www.blogjava.net/cherishchen/archive/2007/06/27/126524.html</guid><wfw:comment>http://www.blogjava.net/cherishchen/comments/126524.html</wfw:comment><comments>http://www.blogjava.net/cherishchen/archive/2007/06/27/126524.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/cherishchen/comments/commentRss/126524.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cherishchen/services/trackbacks/126524.html</trackback:ping><description><![CDATA[<p><a title="http://www.h2database.com/html/frame.html" href="http://www.h2database.com/html/frame.html">http://www.h2database.com/html/frame.html</a></p>
<p>&nbsp;</p>
<p>最近一个桌面的程序需要使用嵌入式数据库，选择了很多不同的嵌入式数据,最终选择了H2，性能是一个很重要的原因，下图是h2提供的Performance的比较图</p>
<p><a title="http://www.h2database.com/html/images/performance.png" href="http://www.h2database.com/html/images/performance.png">http://www.h2database.com/html/images/performance.png</a></p>
<p>&nbsp;</p>
<p>h2是Thomas Mueller提供的一个开源的、纯java实现的关系数据库，在google上面有讨论组<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#104;&#50;&#45;&#100;&#97;&#116;&#97;&#98;&#97;&#115;&#101;&#64;&#103;&#111;&#111;&#103;&#108;&#101;&#103;&#114;&#111;&#117;&#112;&#115;&#46;&#99;&#111;&#109;">h2-database@googlegroups.com</a>，Thomas Mueller也非常热情，回答问题非常及时。</p>
<p>&nbsp;</p>
<p>下面说下我最终选择h2的原因：</p>
<p>（1）性能、小巧</p>
<p>（2）同时支持网络版和嵌入式版本，另外还提供了内存版</p>
<p>（3）有比较好的兼容性，支持相当标准的sql标准（实际上也不存在一个数据库能够100%符合标准）</p>
<p>（4）提供了非常友好的基于web的数据库管理界面</p>
<p>（5）支持hibernate</p>
<br>
<p><br></p>
补充：<br>支持的事务隔离级别：<br><br>
<h2>Transaction <span id="firstFound" style="color: #000000; background-color: #ffff00;">Isolation</span></h2>
<p>
This database supports the following transaction <span id="firstFound" style="color: #000000; background-color: #ffff00;">isolation</span> <span style="color: #000000; background-color: #00ffff;">level</span>s:
</p>
<ul>
    <li><strong>Serializable</strong><br>
    This is the default <span style="color: #000000; background-color: #00ffff;">level</span>.<br>
    To enable, execute the SQL statement    'SET LOCK_MODE 0'<br>
    or append ;LOCK_MODE=1 to the database URL: jdbc:h2:~/test;LOCK_MODE=1
    </li>
    <li><strong>Read Committed</strong><br>
    Read locks are released immediately.
    Higher concurrency is possible when using this <span style="color: #000000; background-color: #00ffff;">level</span>.<br>
    This is the <span id="firstFound" style="color: #000000; background-color: #ffff00;">isolation</span> <span style="color: #000000; background-color: #00ffff;">level</span> used for many database systems.<br>
    To enable, execute the SQL statement    'SET LOCK_MODE 0'<br>
    or append ;LOCK_MODE=3 to the database URL: jdbc:h2:~/test;LOCK_MODE=3
    </li>
    <li><strong>Read Uncommitted</strong><br>
    This <span style="color: #000000; background-color: #00ffff;">level</span> means that transaction <span id="firstFound" style="color: #000000; background-color: #ffff00;">isolation</span> is disabled.<br>
    To enable, execute the SQL statement    'SET LOCK_MODE 0'<br>
    or append ;LOCK_MODE=0 to the database URL: jdbc:h2:~/test;LOCK_MODE=0
    </li>
</ul>
<p>
When using the <span id="firstFound" style="color: #000000; background-color: #ffff00;">isolation</span> <span style="color: #000000; background-color: #00ffff;">level</span> 'serializable', dirty reads, non-repeatable reads, and phantom reads are prohibited.
</p>
<ul>
    <li><strong>Dirty Reads</strong><br>
    Means a connection can read uncommitted changes made by another connection.<br>
    Possible with: read uncommitted
    </li>
    <li><strong>Non-Repeatable Reads</strong><br>
    A connection reads a row, another connection changes a row and commits,
    and the first connection re-reads the same row and gets the new result.<br>
    Possible with: read uncommitted, read committed
    </li>
    <li><strong>Phantom Reads</strong><br>
    A connection reads a set of rows using a condition, another connection
    inserts a row that falls in this condition and commits, then the first connection
    re-reads using the same condition and gets the new row.<br>
    Possible with: read uncommitted, read committed
    </li>
</ul>
<h3>Table <span style="color: #000000; background-color: #00ffff;">Level</span> Locking</h3>
The database allows multiple concurrent connections to the same database.
To make sure all connections only see consistent data, table <span style="color: #000000; background-color: #00ffff;">level</span> locking is used.
This mechanism does not allow high concurrency, but is very fast.
Shared locks and exclusive locks are supported.
Before reading from a table, the database tries to add a shared lock to the table
(this is only possible if there is no exclusive lock on the object by another connection).
If the shared lock is added successfully, the table can be read. It is allowed that
other connections also have a shared lock on the same object. If a connection wants
to write to a table (update or delete a row), an exclusive lock is required. To get the
exclusive lock, other connection must not have any locks on the object. After the
connection commits, all locks are released.
This database keeps all locks in memory.<br> <img src ="http://www.blogjava.net/cherishchen/aggbug/126524.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cherishchen/" target="_blank">凭栏观海</a> 2007-06-27 11:20 <a href="http://www.blogjava.net/cherishchen/archive/2007/06/27/126524.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java异常处理的一点总结（原创）</title><link>http://www.blogjava.net/cherishchen/archive/2007/06/25/126132.html</link><dc:creator>凭栏观海</dc:creator><author>凭栏观海</author><pubDate>Mon, 25 Jun 2007 08:11:00 GMT</pubDate><guid>http://www.blogjava.net/cherishchen/archive/2007/06/25/126132.html</guid><wfw:comment>http://www.blogjava.net/cherishchen/comments/126132.html</wfw:comment><comments>http://www.blogjava.net/cherishchen/archive/2007/06/25/126132.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cherishchen/comments/commentRss/126132.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cherishchen/services/trackbacks/126132.html</trackback:ping><description><![CDATA[<p class="MsoNormal"><span style="font-size: 12pt; font-family: 宋体;">java提供了很好的异常处理机制，但是如何用好异常并不容易，需要根据开发对象的不同采用的异常机制，本文主要在eclipse rcp开发的时候总结的一个异常的处理机制，个人认为适合于图形界面开发，总结起来，归纳如下：<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal" style="margin-left: 3.6pt; text-indent: 0cm;"><!--[if !supportLists]--><span style="font-size: 10pt; font-family: 宋体;" lang="EN-US"><span>（1）合理使用checked exception和unchecked exception，说明使用这两种异常的原则的文章很多，不多罗嗦了<span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;"><br></span></span></span></p>
<p class="MsoNormal" style="margin-left: 3.6pt; text-indent: 0cm;"><span style="font-size: 10pt; font-family: 宋体;" lang="EN-US"><span><span style="font-family: &quot;Times New Roman&quot;; font-style: normal; font-variant: normal; font-weight: normal; font-size: 7pt; line-height: normal; font-size-adjust: none; font-stretch: normal;">&nbsp; </span></span></span><!--[endif]--><span style="font-size: 10pt; font-family: 宋体;">（2）异常的转换，如果需要，可以将底层的异常包装为包含更多含义的自定义异常重新抛出（包括</span><span style="font-size: 10pt; font-family: 宋体;" lang="EN-US"><span>checked和</span></span><span style="font-size: 10pt; font-family: 宋体;" lang="EN-US"><span>unchecked</span></span><span style="font-size: 10pt; font-family: 宋体;">的自定义异常体系），自定义异常不仅仅需要包含原始的异常信息，还要包含一些特定的含义和处理方法；</span></p>
<p class="MsoNormal" style="margin-left: 3.6pt; text-indent: 0cm;">(3) <span style="font-size: 10pt;"><span style="font-size: 12pt; font-family: Arial;">异常的抛出，尽量不要在中间层处理异常，要么在异常发生的地方处理，要么抛出，推迟到由最终调用层来处理，比如由<span style="font-size: 10pt;">与用户直接打交道的<span lang="EN-US">UI层</span>，捕捉异常，并以错误信息框、对话框等信息载体反馈良好的信息给用户</span></span></span><span style="font-size: 12pt; font-family: Arial;"><span style="font-size: 10pt;"></span></span><span style="font-size: 10pt; font-family: 宋体;"><span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal"><span style="font-size: 10pt; font-family: 宋体;" lang="EN-US"><o:p>&nbsp;这也只是我个人的一些观点，希望大家能给出更好的方式</o:p></span>
</p>
<p class="MsoNormal"><span style="font-size: 10pt; font-family: 宋体;">范例：<span lang="EN-US"><o:p></o:p></span></span></p>
<p class="MsoNormal"><span style="font-size: 10pt; font-family: 宋体;">（<span lang="EN-US">1</span>）定义自定义的异常：包括了两个构造函数，一个用于提供默认的异常信息，一个供程序员添加更加详细的异常信息，这个异常，可以用来封装所有的底层异常，但是一般在逻辑上更加清楚，可以增加不同的自定义异常，比如数据库处理异常、文件处理异常、网络处理异常等<span lang="EN-US"><o:p></o:p></span></span></p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;DataException&nbsp;</span><span style="color: #0000ff;">extends</span><span style="color: #000000;"> RuntimeException&nbsp;{<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;DataException(String&nbsp;str,&nbsp;Throwable&nbsp;cause)&nbsp;{<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">super</span><span style="color: #000000;">(str,&nbsp;cause);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;DataException(Throwable&nbsp;e)&nbsp;{<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">super</span><span style="color: #000000;">(</span><span style="color: #000000;">"</span><span style="color: #000000;">数据操作出错错误</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;e);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;<br><br>}</span></div>
<br>
<p class="MsoNormal"><span style="font-size: 10pt; font-family: &quot;courier new&quot;; color: black;" lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-size: 10pt; font-family: &quot;courier new&quot;; color: black;" lang="EN-US"><o:p>&nbsp;</o:p></span></p>
<p class="MsoNormal"><span style="font-size: 10pt; font-family: 宋体; color: black;">（</span><span style="font-size: 10pt; font-family: &quot;courier new&quot;; color: black;" lang="EN-US">2</span><span style="font-size: 10pt; font-family: 宋体; color: black;">）使用自定义的异常封装底层异常：</span><span style="font-size: 10pt; font-family: &quot;courier new&quot;; color: black;" lang="EN-US"><o:p></o:p></span><br><strong><span style="font-size: 10pt; font-family: &quot;courier new&quot;; color: #7f0055;" lang="EN-US">&nbsp; </span></strong></p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">boolean</span><span style="color: #000000;">&nbsp;exportToExcel(String&nbsp;desLocation,String&nbsp;templateName,&nbsp;List&nbsp;list,&nbsp;String&nbsp;beanName)&nbsp;hrows&nbsp;DataException&nbsp;{<br><br></span><span style="color: #0000ff;">boolean</span><span style="color: #000000;">&nbsp;ok&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">false</span><span style="color: #000000;">;<br><br>Map&nbsp;beans&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;HashMap();<br><br>beans.put(beanName,&nbsp;list);<br><br>XLSTransformer&nbsp;transformer&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;XLSTransformer();<br><br></span><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;transformer.transformXLS(templateName,&nbsp;beans,&nbsp;desLocation);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ok&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(ParsePropertyException&nbsp;e)&nbsp;{<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throw</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;DataException(</span><span style="color: #000000;">"</span><span style="color: #000000;">导出excel出错，解析excel文件出错</span><span style="color: #000000;">"</span><span style="color: #000000;">,e);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(IOException&nbsp;e)&nbsp;{<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throw</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;DataException(</span><span style="color: #000000;">"</span><span style="color: #000000;">导出excel出错，文件操作出错</span><span style="color: #000000;">"</span><span style="color: #000000;">,e);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br></span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;ok;<br><br>}</span></div>
<span style="font-size: 10pt; font-family: &quot;courier new&quot;; color: black;" lang="EN-US"></span><span style="font-size: 10pt; font-family: &quot;courier new&quot;;" lang="EN-US"><o:p></o:p></span>
<p>&nbsp;</p>
<p class="MsoNormal"><span style="font-size: 10pt; font-family: 宋体;">（<span lang="EN-US">3</span>）在用户界面部分的处理，通过</span><span style="font-size: 10pt; font-family: &quot;courier new&quot;; color: black;" lang="EN-US">MessageDialog</span><span style="font-size: 10pt; font-family: 宋体; color: black;">反馈给用户正确的信息：</span><span style="font-size: 10pt; font-family: 宋体;" lang="EN-US"><o:p></o:p></span></p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;{<br><br>String&nbsp;templateName&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;BundlePathUtil.getRealPath(Activator.PLUGIN_ID,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">excelTplts\\</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;templateName&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;templateName&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">aaa.xls</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;从tableviewer中获取数据</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;list&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(List)&nbsp;personTableViewer.getInput();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;ExcelUtil.exportToExcel(desLocation,&nbsp;templateName,&nbsp;list,</span><span style="color: #000000;">"</span><span style="color: #000000;">aaa</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br><br>}&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(DataException&nbsp;e)&nbsp;{<br><br></span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;这里我用了e.getMessage(),但是再更实际的环境中，应该给最终用户看到的是一个友好的、高层的出错信息，详细的</span><span style="color: #008000;"></span><span style="color: #008000;">出错信息// 应该在日志文件中体现</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageDialog.openError(window.getShell(),&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">导出失败</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">失败原因：</span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;e.getMessage());<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;退出</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br></span><span style="color: #0000ff;">return</span><span style="color: #000000;">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;}<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;增加导出完成的提示，比如信息框</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br>MessageDialog.openInformation(window.getShell(),&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">导出成功</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">查询结果已导入到</span><span style="color: #000000;">"</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;desLocation);</span></div>
<span style="font-size: 10pt; font-family: &quot;courier new&quot;; color: black;" lang="EN-US"><o:p></o:p></span>
<p class="MsoNormal" style="margin: 6pt 0cm;"><span style="font-size: 10pt; font-family: &quot;courier new&quot;; color: black;" lang="EN-US"><o:p><span style="font-weight: bold;">总结</span><br></o:p></span></p>
&nbsp; <span style="font-size: 10pt; font-family: 宋体; color: black;">根据java异常使用最佳实践，使用unchecked exception的效率最高，尽管</span><span style="font-size: 10pt; font-family: 宋体; color: black;">unchecked exception</span><span style="font-size: 10pt; font-family: 宋体; color: black;">不会强迫用户捕捉和处理异常，调用层的程序员也可以凭着个人责任心来进行异常的捕获和处理，但是如果你不捕捉处理异常，随之而来的是程序的健壮性就得不到保证。</span><span style="font-size: 10pt; font-family: 宋体; color: black;"><br><br><span style="font-weight: bold;">参考资料<br>Best Practices for Exception Handling<br>http://www.onjava.com/pub/a/onjava/2003/11/19/exceptions.html<br><br><br></span></span><br><span style="font-size: 10pt; font-family: 宋体; color: black;"></span>     <img src ="http://www.blogjava.net/cherishchen/aggbug/126132.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cherishchen/" target="_blank">凭栏观海</a> 2007-06-25 16:11 <a href="http://www.blogjava.net/cherishchen/archive/2007/06/25/126132.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用h2的case函数实现交叉表</title><link>http://www.blogjava.net/cherishchen/archive/2007/06/25/126126.html</link><dc:creator>凭栏观海</dc:creator><author>凭栏观海</author><pubDate>Mon, 25 Jun 2007 07:52:00 GMT</pubDate><guid>http://www.blogjava.net/cherishchen/archive/2007/06/25/126126.html</guid><wfw:comment>http://www.blogjava.net/cherishchen/comments/126126.html</wfw:comment><comments>http://www.blogjava.net/cherishchen/archive/2007/06/25/126126.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/cherishchen/comments/commentRss/126126.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cherishchen/services/trackbacks/126126.html</trackback:ping><description><![CDATA[数据表<span style="font-size: 10pt; font-family: 宋体;" lang="EN-US">t的ddl：<br>create table t(class char(1),callcount int,calldate date)<br></span><img src="http://www.blogjava.net/images/blogjava_net/cherishchen/a1.jpg" border="0"><br><span style="font-size: 10pt; font-family: 宋体;" lang="EN-US"><br>sql语句:</span>
<p class="MsoNormal" style="margin: 6pt 0cm;"><span style="font-size: 10pt; font-family: 宋体;" lang="EN-US">select calldate,<o:p></o:p></span></p>
<p class="MsoNormal" style="margin: 6pt 0cm;"><span style="font-size: 10pt; font-family: 宋体;" lang="EN-US">sum(case class when '1' then callcount else 0 end)
as A</span><span style="font-size: 10pt; font-family: 宋体;">类<span lang="EN-US">,<o:p></o:p></span></span></p>
<p class="MsoNormal" style="margin: 6pt 0cm;"><span style="font-size: 10pt; font-family: 宋体;" lang="EN-US">sum(case class when '2' then callcount else 0 end)
as B</span><span style="font-size: 10pt; font-family: 宋体;">类<span lang="EN-US">,<o:p></o:p></span></span></p>
<p class="MsoNormal" style="margin: 6pt 0cm;"><span style="font-size: 10pt; font-family: 宋体;" lang="EN-US">sum(case class when '3' then callcount else 0 end)
as C</span><span style="font-size: 10pt; font-family: 宋体;">类 <span lang="EN-US"><o:p></o:p></span></span></p>
<span style="font-size: 10pt; font-family: 宋体;" lang="EN-US">from t group by calldate<br><br>最后结果：<br><img src="http://www.blogjava.net/images/blogjava_net/cherishchen/a2.jpg" border="0"><br><br></span><span style="font-size: 10pt; font-family: 宋体;" lang="EN-US"><!--[if gte vml 1]><v:shapetype id="_x0000_t75"
coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe"
filled="f" stroked="f">
<v:stroke joinstyle="miter"/>
<v:formulas>
<v:f eqn="if lineDrawn pixelLineWidth 0"/>
<v:f eqn="sum @0 1 0"/>
<v:f eqn="sum 0 0 @1"/>
<v:f eqn="prod @2 1 2"/>
<v:f eqn="prod @3 21600 pixelWidth"/>
<v:f eqn="prod @3 21600 pixelHeight"/>
<v:f eqn="sum @0 0 1"/>
<v:f eqn="prod @6 1 2"/>
<v:f eqn="prod @7 21600 pixelWidth"/>
<v:f eqn="sum @8 21600 0"/>
<v:f eqn="prod @7 21600 pixelHeight"/>
<v:f eqn="sum @10 21600 0"/>
</v:formulas>
<v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/>
<o:lock v:ext="edit" aspectratio="t"/>
</v:shapetype><v:shape id="_x0000_i1025" type="#_x0000_t75" style="'width:120.75pt;
height:96pt'">
<v:imagedata src="file:///C:\DOCUME~1\chen\LOCALS~1\Temp\msohtml1\01\clip_image001.png"
o:title=""/>
</v:shape><![endif]--><!--[if !vml]--><!--[endif]--></span><br> <img src ="http://www.blogjava.net/cherishchen/aggbug/126126.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cherishchen/" target="_blank">凭栏观海</a> 2007-06-25 15:52 <a href="http://www.blogjava.net/cherishchen/archive/2007/06/25/126126.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>前段时间研究的jpos的文档</title><link>http://www.blogjava.net/cherishchen/archive/2007/06/25/126116.html</link><dc:creator>凭栏观海</dc:creator><author>凭栏观海</author><pubDate>Mon, 25 Jun 2007 07:18:00 GMT</pubDate><guid>http://www.blogjava.net/cherishchen/archive/2007/06/25/126116.html</guid><wfw:comment>http://www.blogjava.net/cherishchen/comments/126116.html</wfw:comment><comments>http://www.blogjava.net/cherishchen/archive/2007/06/25/126116.html#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://www.blogjava.net/cherishchen/comments/commentRss/126116.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/cherishchen/services/trackbacks/126116.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Jpos体系结构 一、&nbsp;&nbsp; ISOComponet &nbsp; &nbsp;  &nbsp; 这里ISOField和ISOBitMap都是实现了ISOComponent的叶子节点，ISOMsg则是包含了ISOField的Composite （组合类）：ISOMsg类维护了Hashtable fields，维护了该报文的所有的位元。 &nbsp; 参考：composite模式 ...&nbsp;&nbsp;<a href='http://www.blogjava.net/cherishchen/archive/2007/06/25/126116.html'>阅读全文</a><img src ="http://www.blogjava.net/cherishchen/aggbug/126116.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/cherishchen/" target="_blank">凭栏观海</a> 2007-06-25 15:18 <a href="http://www.blogjava.net/cherishchen/archive/2007/06/25/126116.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>