﻿<?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-風向逆轉 - 就要爪哇-文章分类-JavaSE&amp;JavaEE</title><link>http://www.blogjava.net/iKingQu/category/8101.html</link><description>Java菜鸟升级中...</description><language>zh-cn</language><lastBuildDate>Tue, 27 Feb 2007 11:26:03 GMT</lastBuildDate><pubDate>Tue, 27 Feb 2007 11:26:03 GMT</pubDate><ttl>60</ttl><item><title>[收藏]Random类的使用方法</title><link>http://www.blogjava.net/iKingQu/articles/80355.html</link><dc:creator>風向逆轉 - 就要爪哇</dc:creator><author>風向逆轉 - 就要爪哇</author><pubDate>Fri, 10 Nov 2006 03:37:00 GMT</pubDate><guid>http://www.blogjava.net/iKingQu/articles/80355.html</guid><wfw:comment>http://www.blogjava.net/iKingQu/comments/80355.html</wfw:comment><comments>http://www.blogjava.net/iKingQu/articles/80355.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iKingQu/comments/commentRss/80355.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iKingQu/services/trackbacks/80355.html</trackback:ping><description><![CDATA[
		<span style="COLOR: indigo">属于包：java.util.Random</span>
		<br />
		<br />
		<b>Random：随机类型</b>
		<br />
		<br />
		<span style="COLOR: blue">１、属性。</span>
		<br />
		<br />无。<br /><br /><span style="COLOR: blue">２、构造函数。</span><br /><br /><span style="COLOR: green">Random()</span> ：创建一个新的随机数发生器。<br /><br /><span style="COLOR: green">Random(long seed) </span>：用一个种子（长整型）创建一个随机数发生器。<br /><br /><span style="COLOR: blue">３、方法。</span><br /><span style="COLOR: red">说明：<br />1. 所有方法均为public；<br />2. 书写格式：［修饰符］　&lt;返回类型&gt; &lt;方法名（［参数列表］）&gt;</span><span style="COLOR: olive"><br />如：<br />static int parseInt(String s) 表示：此方法（parseInt）为类方法（static），返回类型为（int），方法所需参数为String类型。</span><br /><br /><br /><ul>1. <span style="COLOR: green">protected int next(int bits) </span>：产生下一个伪随机数。<br /><br />2. <span style="COLOR: green">boolean nextBoolean() </span>：返回下一个从随机发生器的系列中得到的均匀分布的布尔值。<br /><br />3. <span style="COLOR: green">void nextBytes(byte[] bytes) </span>：产生随机字节数组放到指定的数组中。<br /><br />4. <span style="COLOR: green">double nextDouble() </span>：返回下一个从随机发生器的系列中得到的均匀分布的0.0到1.0的双精度类型值。<br /><br />5. <span style="COLOR: green">float nextFloat() </span>：返回下一个从随机发生器的系列中得到的均匀分布的0.0到1.0的浮点类型值。<br /><br />6. <span style="COLOR: green">double nextGaussian()</span> ：返回下一个从随机发生器的系列中得到的符合均匀分布的0.0的平均数到1.0方差的高斯分布双精度类型值。<br /><br />7. <span style="COLOR: green">int nextInt() </span>：返回下一个从随机发生器的系列中得到的均匀分布的整型值。<br /><br />8. <span style="COLOR: green">int nextInt(int n) </span>：返回下一个从随机发生器的系列中得到的均匀分布的0到指定整型数（n）之间的整型值。<br /><br />9. <span style="COLOR: green">long nextLong() </span>：返回下一个从随机发生器的系列中得到的均匀分布的长整型值。<br /><br />10. <span style="COLOR: green">void setSeed(long seed) </span>：设置随机数发生器的种子为一个长整型数。</ul><br /><br /><span style="COLOR: red">关于种子的描述：</span><br />这个类的对象使用一个48位的种子，<br />如果这个类的两个实例是用同一个种子创建的，<br />并且，各自对它们以同样的顺序调用方法，<br />则它们会产生相同的数字序列。<br /><br />下面就对上面的介绍做一个实验，<br />尤其注意相同种子时的结果，<br /><span style="COLOR: brown">如果用默认的构造函数构造对象，<br />他们是属于同一个种子的。</span><br /><br /><pre>import java.util.Random;<br /><br />public class TestRandom{<br />	public static void main(String[] args){<br />		Random r1 = new Random(50);<br />		System.out.println("第一个种子为50的Random对象");<br />		System.out.println("r1.nextBoolean():\t" + r1.nextBoolean());<br />		System.out.println("r1.nextInt():\t\t" + r1.nextInt());<br />		System.out.println("r1.nextDouble():\t" + r1.nextDouble());<br />		System.out.println("r1.nextGaussian():\t" + r1.nextGaussian());<br />		System.out.println("---------------------------");<br /><br />		Random r2 = new Random(50);<br />		System.out.println("第二个种子为50的Random对象");<br />		System.out.println("r2.nextBoolean():\t" + r2.nextBoolean());<br />		System.out.println("r2.nextInt():\t\t" + r2.nextInt());<br />		System.out.println("r2.nextDouble():\t" + r2.nextDouble());<br />		System.out.println("r2.nextGaussian():\t" + r2.nextGaussian());<br />		System.out.println("---------------------------");<br /><br />		Random r3 = new Random(100);<br />		System.out.println("种子为100的Random对象");<br />		System.out.println("r3.nextBoolean():\t" + r3.nextBoolean());<br />		System.out.println("r3.nextInt():\t\t" + r3.nextInt());<br />		System.out.println("r3.nextDouble():\t" + r3.nextDouble());<br />		System.out.println("r3.nextGaussian():\t" + r3.nextGaussian());<br /><br />		System.out.println("结果一目了然！");<br />	}<br />}</pre><br />结果：<br /><pre><br />第一个种子为50的Random对象<br />r1.nextBoolean():       true<br />r1.nextInt():           -1727040520<br />r1.nextDouble():        0.6141579720626675<br />r1.nextGaussian():      2.377650302287946<br />---------------------------<br />第二个种子为50的Random对象<br />r2.nextBoolean():       true<br />r2.nextInt():           -1727040520<br />r2.nextDouble():        0.6141579720626675<br />r2.nextGaussian():      2.377650302287946<br />---------------------------<br />种子为100的Random对象<br />r3.nextBoolean():       true<br />r3.nextInt():           -1139614796<br />r3.nextDouble():        0.19497605734770518<br />r3.nextGaussian():      0.6762208162903859<br />结果一目了然！</pre><img src ="http://www.blogjava.net/iKingQu/aggbug/80355.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iKingQu/" target="_blank">風向逆轉 - 就要爪哇</a> 2006-11-10 11:37 <a href="http://www.blogjava.net/iKingQu/articles/80355.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[收藏]StringBuffer类的使用方法</title><link>http://www.blogjava.net/iKingQu/articles/80354.html</link><dc:creator>風向逆轉 - 就要爪哇</dc:creator><author>風向逆轉 - 就要爪哇</author><pubDate>Fri, 10 Nov 2006 03:36:00 GMT</pubDate><guid>http://www.blogjava.net/iKingQu/articles/80354.html</guid><wfw:comment>http://www.blogjava.net/iKingQu/comments/80354.html</wfw:comment><comments>http://www.blogjava.net/iKingQu/articles/80354.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iKingQu/comments/commentRss/80354.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iKingQu/services/trackbacks/80354.html</trackback:ping><description><![CDATA[
		<strong>StringBuffer：StringBuffer类型<br /><br /></strong>
		<span style="COLOR: darkblue">描述：在实际应用中，经常回遇到对字符串进行动态修改。这时候，String类的功能受到限制，而StringBuffer类可以完成字符串的动态添加、插入和替换等操作。</span>
		<br />
		<br />
		<span style="COLOR: blue">１、构造函数。</span>
		<br />
		<ul>
				<span style="COLOR: green">StringBuffer() </span>：构造一个没有任何字符的StringBuffer类。<br /><span style="COLOR: green">StringBuffer(int length) </span>： ：构造一个没有任何字符的StringBuffer类，并且，其长度为length。<br /><span style="COLOR: green">StringBuffer(String str) </span>：以str为初始值构造一个StringBuffer类。</ul>
		<br />
		<br />
		<span style="COLOR: blue">２、方法。</span>
		<br />
		<span style="COLOR: red">说明：<br />1. 所有方法均为public；<br />2. 书写格式：［修饰符］　&lt;返回类型&gt; &lt;方法名（［参数列表］）&gt;</span>
		<span style="COLOR: olive">
				<br />如：<br />static int parseInt(String s) 表示：此方法（parseInt）为类方法（static），返回类型为（int），方法所需参数为String类型。</span>
		<br />
		<br />
		<ul>
				<span style="COLOR: green">1. StringBuffer append(boolean b) <br />2. StringBuffer append(char c) <br />3. StringBuffer append(char[] str) <br />4. StringBuffer append(char[] str, int offset, int len) <br />5. StringBuffer append(double d) <br />6. StringBuffer append(float f) <br />7. StringBuffer append(int i) <br />8. StringBuffer append(long l) <br />9. StringBuffer append(Object obj) <br />10. StringBuffer append(String str) <br />11. StringBuffer append(StringBuffer sb) </span>
				<br />
				<br />以上的方法都是向字符串缓冲区“追加”元素，但是，这个“元素”参数可以是布尔量、字符、字符数组、双精度数、浮点数、整型数、长整型数对象类型的字符串、字符串和StringBuffer类等。如果添加的字符超出了字符串缓冲区的长度，Java将自动进行扩充。</ul>
		<br />
		<pre>		String question = new String("1+1=");<br />		int answer = 3;<br />		boolean result = (1+1==3);<br /><br />		StringBuffer sb = new StringBuffer();<br />		sb.append(question);<br />		sb.append(answer);<br />		sb.append('\t');<br />		sb.append(result);<br /><br />		System.out.println(sb);<br />结果为：<br />1+1=3   false</pre>
		<br />
		<ul>12. <span style="COLOR: green">int capacity() </span>：返回当前StringBuffer对象（字符串缓冲区）的总空间，而非字符号串的长度。<br />13. <span style="COLOR: green">char charAt(int index) </span>：在当前StringBuffer对象中取索引号为index的字符。第一个字符的索引为“0”<br />14. <span style="COLOR: green">StringBuffer delete(int start, int end) </span>：删除当前StringBuffer对象中以索引号start开始，到end结束的子串。<br />15. <span style="COLOR: green">StringBuffer deleteCharAt(int index) </span>：删除当前StringBuffer对象中索引号为index的字符。<br />16. <span style="COLOR: green">void ensureCapacity(int minimumCapacity)</span> ：重新设置字符号串缓冲区的总空间。如果minimumCapacity大于当前的总空间，则新的空间被设置：一种结果是minimumCapacity；另一种结果是{“老空间”乘2加2}。</ul>
		<br />
		<pre>		StringBuffer sb1 = new StringBuffer(5);<br />		StringBuffer sb2 = new StringBuffer(5);<br /><br />		sb1.ensureCapacity(6);<br />		sb2.ensureCapacity(100);<br /><br />		System.out.println( "sb1.Capacity: " + sb1.capacity() );<br />		System.out.println( "sb2.Capacity: " + sb2.capacity() );<br />结果为：<br />sb1.Capacity: 12<br />sb2.Capacity: 100</pre>
		<br />
		<ul>17. <span style="COLOR: green">void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)</span> ：从当前StringBuffer对象的索引号srcBegin开始，到srcEnd结束的子串，赋值到字符数组dst中，并且从dst的索引号dstBegin开始。</ul>
		<br />
		<pre>		StringBuffer sb = new StringBuffer("I love her!");<br />		char[] i = {'I',' ','l','o','v','e',' ','y','o','u'};<br /><br />		sb.getChars(7,10,i,7);<br /><br />		System.out.println( "sb: " + sb );<br />结果为：sb: I love her!</pre>
		<br />
		<ul>18. <span style="COLOR: green">int indexOf(String str)</span> ：返回当前StringBuffer对象中，第一个满足str子串的位置。<br />19. <span style="COLOR: green">int indexOf(String str, int fromIndex)</span> ：从当前StringBuffer对象的fromIndex开始查找，返回第一个满足str子串的位置。<br /><span style="COLOR: green">20. StringBuffer insert(int offset, boolean b) <br />21. StringBuffer insert(int offset, char c) <br />22. StringBuffer insert(int offset, char[] str) <br />23. StringBuffer insert(int index, char[] str, int offset, int len) <br />24. StringBuffer insert(int offset, double d) <br />25. StringBuffer insert(int offset, float f) <br />26. StringBuffer insert(int offset, int i) <br />27. StringBuffer insert(int offset, long l) <br />28. StringBuffer insert(int offset, Object obj) <br />29. StringBuffer insert(int offset, String str) </span><br /><br />以上的方法都是在当前StringBuffer对象中插入一个元素，在索引号offset处插入相应的值。<br />30. <span style="COLOR: green">int lastIndexOf(String str) </span>：返回当前StringBuffer对象中，最后一个满足str子串的位置。<br />31. <span style="COLOR: green">int lastIndexOf(String str, int fromIndex)</span> ：从当前StringBuffer对象的fromIndex开始查找，返回最后一个满足str子串的位置。<br />32. <span style="COLOR: green">int length() </span>：返回当前StringBuffer对象（字符缓冲区）中，字符串的长度。<span style="COLOR: red">注意：此方法与capacity() 不同。</span><br />33. <span style="COLOR: green">StringBuffer replace(int start, int end, String str)</span> ：替换当前StringBuffer对象的字符串。从start开始，到end结束的位置替换成str。<br />34. <span style="COLOR: green">StringBuffer reverse() </span>：将字符串翻转。</ul>
		<br />
		<pre>		StringBuffer sb = new StringBuffer("0123456789");<br />		System.out.println( "sb.reverse(): " + sb.reverse() );<br />结果为：sb.reverse(): 9876543210</pre>
		<br />
		<ul>35. <span style="COLOR: green">void setCharAt(int index, char ch)</span> ：设置索引号index的字符为ch。<br />36. <span style="COLOR: green">void setLength(int newLength) </span>：重新设置字符串缓冲区中字符串的长度，如果newLength小于当前的字符串长度，将截去多余的字符。</ul>
		<br />
		<pre>		StringBuffer sb = new StringBuffer("0123456789");<br />		sb.setLength(5);<br />		System.out.println( "sb: " + sb );<br />结果为：sb: 01234</pre>
		<br />
		<ul>37.<span style="COLOR: green"> String substring(int start) </span>：取当前StringBuffer对象中，从start开始到结尾的子串。<br />38. <span style="COLOR: green">String substring(int start, int end) </span>：取当前StringBuffer对象中，从start开始到end的子串。<br />39. <span style="COLOR: green">String toString() </span>：将当前StringBuffer对象转换成String对象。</ul>
<img src ="http://www.blogjava.net/iKingQu/aggbug/80354.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iKingQu/" target="_blank">風向逆轉 - 就要爪哇</a> 2006-11-10 11:36 <a href="http://www.blogjava.net/iKingQu/articles/80354.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[收藏]StringTokenizer类的使用方法</title><link>http://www.blogjava.net/iKingQu/articles/80352.html</link><dc:creator>風向逆轉 - 就要爪哇</dc:creator><author>風向逆轉 - 就要爪哇</author><pubDate>Fri, 10 Nov 2006 03:35:00 GMT</pubDate><guid>http://www.blogjava.net/iKingQu/articles/80352.html</guid><wfw:comment>http://www.blogjava.net/iKingQu/comments/80352.html</wfw:comment><comments>http://www.blogjava.net/iKingQu/articles/80352.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/iKingQu/comments/commentRss/80352.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iKingQu/services/trackbacks/80352.html</trackback:ping><description><![CDATA[
		<strong>StringTokenizer：字符串分隔解析类型<br /></strong>
		<span style="COLOR: indigo">属于：java.util包。</span>
		<br />
		<br />
		<span style="COLOR: blue">１、构造函数。</span>
		<br />
		<ul>
				<br />1. <span style="COLOR: green">StringTokenizer(String str)</span> ：构造一个用来解析str的StringTokenizer对象。java默认的分隔符是“空格”、“制表符(‘\t’)”、“换行符(‘\n’)”、“回车符(‘\r’)”。<br />2. <span style="COLOR: green">StringTokenizer(String str, String delim) </span>：构造一个用来解析str的StringTokenizer对象，并提供一个指定的分隔符。<br />3. <span style="COLOR: green">StringTokenizer(String str, String delim, boolean returnDelims) </span>：构造一个用来解析str的StringTokenizer对象，并提供一个指定的分隔符，同时，指定是否返回分隔符。</ul>
		<br />
		<br />
		<span style="COLOR: blue">２、方法。</span>
		<br />
		<span style="COLOR: red">说明：<br />1. 所有方法均为public；<br />2. 书写格式：［修饰符］　&lt;返回类型&gt; &lt;方法名（［参数列表］）&gt;</span>
		<span style="COLOR: olive">
				<br />如：<br />static int parseInt(String s) 表示：此方法（parseInt）为类方法（static），返回类型为（int），方法所需参数为String类型。</span>
		<br />
		<br />
		<ul>1. <span style="COLOR: green">int countTokens() </span>：返回nextToken方法被调用的次数。如果采用构造函数1和2，返回的就是分隔符数量(例2)。<br />2. <span style="COLOR: green">boolean hasMoreTokens() </span>：返回是否还有分隔符。<br />3. <span style="COLOR: green">boolean hasMoreElements() </span>：结果同2。<br />4. <span style="COLOR: green">String nextToken()</span> ：返回从当前位置到下一个分隔符的字符串。<br />5. <span style="COLOR: green">Object nextElement() </span>：结果同4。<br />6. <span style="COLOR: green">String nextToken(String delim)</span> ：与4类似，以指定的分隔符返回结果。</ul>
		<br />
		<br />
		<span style="COLOR: olive">例子：</span>
		<br />
		<pre>		String s = new String("The Java platform is the ideal platform for network computing");<br />		StringTokenizer st = new StringTokenizer(s);<br />		System.out.println( "Token Total: " + st.countTokens() );<br />		while( st.hasMoreElements() ){<br />			System.out.println( st.nextToken() );<br />　　　　　　　　　　　}<br />结果为：<br />Token Total: 10<br />The<br />Java<br />platform<br />is<br />the<br />ideal<br />platform<br />for<br />network<br />computing<br /></pre>
		<br />
		<span style="COLOR: olive">例2:</span>
		<br />
		<pre>		String s = new String("The=Java=platform=is=the=ideal=platform=for=network=computing");<br />		StringTokenizer st = new StringTokenizer(s,"=",true);<br />		System.out.println( "Token Total: " + st.countTokens() );<br />		while( st.hasMoreElements() ){<br />			System.out.println( st.nextToken() );<br />		}<br />结果为：<br />Token Total: 19<br />The<br />=<br />Java<br />=<br />platform<br />=<br />is<br />=<br />the<br />=<br />ideal<br />=<br />platform<br />=<br />for<br />=<br />network<br />=<br />computing<br /></pre>
<img src ="http://www.blogjava.net/iKingQu/aggbug/80352.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iKingQu/" target="_blank">風向逆轉 - 就要爪哇</a> 2006-11-10 11:35 <a href="http://www.blogjava.net/iKingQu/articles/80352.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[收藏]String类的使用方法</title><link>http://www.blogjava.net/iKingQu/articles/80347.html</link><dc:creator>風向逆轉 - 就要爪哇</dc:creator><author>風向逆轉 - 就要爪哇</author><pubDate>Fri, 10 Nov 2006 03:29:00 GMT</pubDate><guid>http://www.blogjava.net/iKingQu/articles/80347.html</guid><wfw:comment>http://www.blogjava.net/iKingQu/comments/80347.html</wfw:comment><comments>http://www.blogjava.net/iKingQu/articles/80347.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iKingQu/comments/commentRss/80347.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iKingQu/services/trackbacks/80347.html</trackback:ping><description><![CDATA[
		<strong>String：字符串类型<br /></strong>
		<span style="COLOR: brown">此帖参考了maxlyy朋友的帖子，在这里特别感谢。</span>
		<br />
		<span style="COLOR: blue">１、构造函数。</span>
		<br />
		<ul>
				<br />
				<span style="COLOR: green">String()</span> ：构造一个空字符串对象。<br /><span style="COLOR: green">String(byte[] bytes)</span> ：通过byte数组构造字符串对象。<br /><span style="COLOR: green">String(byte[] bytes, int offset, int length)</span> ：通过byte数组，从offset开始，总共length长的字节构造字符串对象。<br /><span style="COLOR: green">String(char[] value)</span> ：通过char数组构造字符串对象。<br /><span style="COLOR: green">String(char[] value, int offset, int count) </span>：通过char数组，从offset开始，总共length长的字节构造字符串对象。<br /><span style="COLOR: green">String(String original)</span> ：构造一个original的副本。既，拷贝一个original。<br /><span style="COLOR: green">String(StringBuffer buffer) </span>：通过StringBuffer数组构造字符串对象；<br /></ul>
		<br />
		<pre>	byte[] b = {'a','b','c','d','e','f','g','h','i','j'};<br />	char[] c = {'0','1','2','3','4','5','6','7','8','9'};<br /><br />	String sb = new String(b);<br />	String sb_sub = new String(b,3,2);<br />	String sc = new String(c);<br />	String sc_sub = new String(c,3,2);<br />	String sb_copy = new String(sb);<br /><br />	System.out.println("sb: " + sb );<br />	System.out.println("sb_sub: " + sb_sub );<br />	System.out.println("sc: " + sc );<br />	System.out.println("sc_sub: " + sc_sub );<br />	System.out.println("sb_copy: " + sb_copy );<br />结果为：<br />sb: abcdefghij<br />sb_sub: de<br />sc: 0123456789<br />sc_sub: 34<br />sb_copy: abcdefghij</pre>
		<br />
		<span style="COLOR: blue">２、方法。</span>
		<br />
		<span style="COLOR: red">说明：<br />1. 所有方法均为public；<br />2. 书写格式：［修饰符］　&lt;返回类型&gt; &lt;方法名（［参数列表］）&gt;</span>
		<span style="COLOR: olive">
				<br />如：<br />static int parseInt(String s) 表示：此方法（parseInt）为类方法（static），返回类型为（int），方法所需参数为String类型。</span>
		<br />
		<br />
		<ul>
				<br />1. <span style="COLOR: green">char charAt(int index)</span> ：取字符串中的某一个字符，其中的参数index指的是字符串中序数。字符串的序数从0开始到length()-1 。</ul>
		<br />
		<pre>	String s = new String("abcdefghijklmnopqrstuvwxyz");<br />	System.out.println("s.charAt(5): " + s.charAt(5) );<br />结果为：s.charAt(5): f</pre>
		<br />
		<ul>2. <span style="COLOR: green">int compareTo(String anotherString)</span> ：当前String对象与anotherString比较。相等关系返回０；不相等时，从两个字符串第0个字符开始比较，返回第一个不相等的字符差，另一种情况，较长字符串的前面部分恰巧是较短的字符串，返回它们的长度差。<br />3. <span style="COLOR: green">int compareTo(Object o)</span> ：如果o是String对象，和2的功能一样；否则抛出ClassCastException异常。</ul>
		<br />
		<pre>	String s1 = new String("abcdefghijklmn");<br />	String s2 = new String("abcdefghij");<br />	String s3 = new String("abcdefghijalmn");<br /><br />	System.out.println("s1.compareTo(s2): " + s1.compareTo(s2) );//返回长度差<br />	System.out.println("s1.compareTo(s3): " + s1.compareTo(s3) );//返回'k'-'a'的差<br />结果为：<br />s1.compareTo(s2): 4<br />s1.compareTo(s3): 10</pre>
		<br />
		<ul>
				<br />4. <span style="COLOR: green">String concat(String str) </span>：将该String对象与str连接在一起。<br />5. <span style="COLOR: green">boolean contentEquals(StringBuffer sb)</span> ：将该String对象与StringBuffer对象sb进行比较。<br />6. <span style="COLOR: green">static String copyValueOf(char[] data) </span>：<br />7. <span style="COLOR: green">static String copyValueOf(char[] data, int offset, int count)</span> ：这两个方法将char数组转换成String，与其中一个构造函数类似。<br />8. <span style="COLOR: green">boolean endsWith(String suffix) </span>：该String对象是否以suffix结尾。</ul>
		<br />
		<pre>	String s1 = new String("abcdefghij");<br />	String s2 = new String("ghij");<br />	System.out.println("s1.endsWith(s2): " + s1.endsWith(s2) );<br />结果为：s1.endsWith(s2): true</pre>
		<br />
		<ul>
				<br />9. <span style="COLOR: green">boolean equals(Object anObject)</span> ：当anObject不为空并且与当前String对象一样，返回true；否则，返回false。<br />10. <span style="COLOR: green">byte[] getBytes()</span> ：将该String对象转换成byte数组。<br />11. <span style="COLOR: green">void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) </span>：该方法将字符串拷贝到字符数组中。其中，srcBegin为拷贝的起始位置、srcEnd为拷贝的结束位置、字符串数值dst为目标字符数组、dstBegin为目标字符数组的拷贝起始位置。</ul>
		<br />
		<pre>	char[] s1 = {'I',' ','l','o','v','e',' ','h','e','r','!'};//s1=I love her!<br />	String s2 = new String("you!");<br />	s2.getChars(0,3,s1,7);	//s1=I love you!<br />	System.out.println( s1 );<br />结果为：I love you!</pre>
		<br />
		<ul>12. <span style="COLOR: green">int hashCode() </span>：返回当前字符的哈希表码。<br />13. <span style="COLOR: green">int indexOf(int ch) </span>：只找第一个匹配字符位置。<br />14. <span style="COLOR: green">int indexOf(int ch, int fromIndex)</span> ：从fromIndex开始找第一个匹配字符位置。<br />15. <span style="COLOR: green">int indexOf(String str)</span> ：只找第一个匹配字符串位置。<br />16. <span style="COLOR: green">int indexOf(String str, int fromIndex) </span>：从fromIndex开始找第一个匹配字符串位置。</ul>
		<br />
		<pre>	String s = new String("write once, run anywhere!");<br />	String ss = new String("run");<br />	System.out.println("s.indexOf('r'): " + s.indexOf('r') );<br />	System.out.println("s.indexOf('r',2): " + s.indexOf('r',2) );<br />	System.out.println("s.indexOf(ss): " + s.indexOf(ss) );<br />结果为：<br />s.indexOf('r'): 1<br />s.indexOf('r',2): 12<br />s.indexOf(ss): 12</pre>
		<br />
		<ul>17. <span style="COLOR: green">int lastIndexOf(int ch) </span><br />18. <span style="COLOR: green">int lastIndexOf(int ch, int fromIndex) </span><br />19. <span style="COLOR: green">int lastIndexOf(String str) </span><br />20. <span style="COLOR: green">int lastIndexOf(String str, int fromIndex) </span>以上四个方法与13、14、15、16类似，不同的是：找最后一个匹配的内容。<br />21. <span style="COLOR: green">int length() </span>：返回当前字符串长度。<br />22. <span style="COLOR: green">String replace(char oldChar, char newChar)</span> ：将字符号串中第一个oldChar替换成newChar。<br />23. <span style="COLOR: green">boolean startsWith(String prefix)</span> ：该String对象是否以prefix开始。<br />24. <span style="COLOR: green">boolean startsWith(String prefix, int toffset)</span> ：该String对象从toffset位置算起，是否以prefix开始。</ul>
		<br />
		<pre>	String s = new String("write once, run anywhere!");<br />	String ss = new String("write");<br />	String sss = new String("once");<br />	System.out.println("s.startsWith(ss): " + s.startsWith(ss) );<br />	System.out.println("s.startsWith(sss,6): " + s.startsWith(sss,6) );<br />结果为：<br />s.startsWith(ss): true<br />s.startsWith(sss,6): true</pre>
		<br />
		<ul>25. <span style="COLOR: green">String substring(int beginIndex)</span> ：取从beginIndex位置开始到结束的子字符串。<br />26.<span style="COLOR: green">String substring(int beginIndex, int endIndex) </span>：取从beginIndex位置开始到endIndex位置的子字符串。<br />27. <span style="COLOR: green">char[] toCharArray() </span>：将该String对象转换成char数组。<br />28. <span style="COLOR: green">String toLowerCase() </span>：将字符串转换成小写。<br />29. <span style="COLOR: green">String toUpperCase()</span> ：将字符串转换成大写。</ul>
		<br />
		<pre>	String s = new String("java.lang.Class String");<br />	System.out.println("s.toUpperCase(): " + s.toUpperCase() );<br />	System.out.println("s.toLowerCase(): " + s.toLowerCase() );<br />结果为：<br />s.toUpperCase(): JAVA.LANG.CLASS STRING<br />s.toLowerCase(): java.lang.class string</pre>
		<br />
		<ul>30. <span style="COLOR: green">static String valueOf(boolean b) </span><br />31. <span style="COLOR: green">static String valueOf(char c) </span><br />32. <span style="COLOR: green">static String valueOf(char[] data) </span><br />33. <span style="COLOR: green">static String valueOf(char[] data, int offset, int count) </span><br />34. <span style="COLOR: green">static String valueOf(double d) </span><br />35. <span style="COLOR: green">static String valueOf(float f) </span><br />36. <span style="COLOR: green">static String valueOf(int i) </span><br />37. <span style="COLOR: green">static String valueOf(long l) </span><br />38. <span style="COLOR: green">static String valueOf(Object obj) </span><br />以上方法用于将各种不同类型转换成Java字符型。这些都是类方法。</ul>
<img src ="http://www.blogjava.net/iKingQu/aggbug/80347.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iKingQu/" target="_blank">風向逆轉 - 就要爪哇</a> 2006-11-10 11:29 <a href="http://www.blogjava.net/iKingQu/articles/80347.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[收藏]Character类的使用方法</title><link>http://www.blogjava.net/iKingQu/articles/80346.html</link><dc:creator>風向逆轉 - 就要爪哇</dc:creator><author>風向逆轉 - 就要爪哇</author><pubDate>Fri, 10 Nov 2006 03:28:00 GMT</pubDate><guid>http://www.blogjava.net/iKingQu/articles/80346.html</guid><wfw:comment>http://www.blogjava.net/iKingQu/comments/80346.html</wfw:comment><comments>http://www.blogjava.net/iKingQu/articles/80346.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iKingQu/comments/commentRss/80346.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iKingQu/services/trackbacks/80346.html</trackback:ping><description><![CDATA[
		<strong>Character：字符类型<br /><br /></strong>
		<span style="COLOR: blue">１、属性。</span>
		<br />
		<ul>
				<br />
				<span style="COLOR: green">static int MIN_RADIX </span>：返回最小基数。<br /><span style="COLOR: green">static int MAX_RADIX</span> ：返回最大基数。<br /><span style="COLOR: green">static char MAX_VALUE</span> ：字符类型的最大值。<br /><span style="COLOR: green">static char MIN_VALUE</span> ：字符类型的最小值。<br /><span style="COLOR: green">static Class TYPE </span>：返回当前类型。</ul>
		<br />
		<span style="COLOR: blue">２、构造函数。</span>
		<br />
		<ul>
				<br />
				<span style="COLOR: green">Character(char value)</span>：以char参数构造一个Character对象。</ul>
		<br />
		<span style="COLOR: blue">３、方法。</span>
		<br />
		<span style="COLOR: red">说明：<br />1. 所有方法均为public；<br />2. 书写格式：［修饰符］　&lt;返回类型&gt; &lt;方法名（［参数列表］）&gt;</span>
		<span style="COLOR: olive">
				<br />如：<br />static int parseInt(String s) 表示：此方法（parseInt）为类方法（static），返回类型为（int），方法所需参数为String类型。</span>
		<br />
		<ul>
				<br />1. <span style="COLOR: green">char charValue() </span>：返回字符对象的值。<br />2. <span style="COLOR: green">int compareTo(Character anotherCharacter)</span> ：当前Character对象与anotherCharacter比较。相等关系返回０；小于关系返回负数；大于关系返回正数。<br />3. <span style="COLOR: green">int compareTo(Object o) </span>：当前对象与另一个对象进行比较。如果o是Character对象，则与2功能一样；否则，抛出ClassCastException异常。<br />4. <span style="COLOR: green">static int digit(char ch, int radix) </span>：根据基数返回当前字符的值的十进制。如果不满足Character.MIN_RADIX &lt;= radix &lt;= Character.MAX_RADIX，或者，ch不是radix基数中的有效值，返回"-1"；如果ch是“大写”的A到Z之间，则返回ch - 'A' + 10 的值；如果是“小写”a到z之间，返回ch - 'a' + 10 的值。</ul>
		<br />
		<pre>System.out.println("Character.MIN_RADIX: " + Character.MIN_RADIX );<br />System.out.println("Character.MAX_RADIX: " + Character.MAX_RADIX );<br />System.out.println("Character.digit('2',2): " + Character.digit('2',2) );<br />System.out.println("Character.digit('7',10): " + Character.digit('7',10) );<br />System.out.println("Character.digit('F',16): " + Character.digit('F',16) );<br />结果为：<br />Character.MIN_RADIX: 2<br />Character.MAX_RADIX: 36<br />Character.digit('2',2): -1<br />Character.digit('7',10): 7<br />Character.digit('F',16): 15</pre>
		<br />
		<ul>5. <span style="COLOR: green">boolean equals(Object obj) </span>：与obj对象比较。当且仅当obj不为“null”并且和当前Character对象一致时返回“true”。<br />6. <span style="COLOR: green">static char forDigit(int digit, int radix)</span> ：根据特定基数判断当前数值表示的字符。4的逆运算，非法数值时返回“'\u0000'”。</ul>
		<br />
		<pre>System.out.println("Character.MIN_RADIX: " + Character.MIN_RADIX );<br />System.out.println("Character.MAX_RADIX: " + Character.MAX_RADIX );<br />System.out.println("Character.forDigit(2,2): " + Character.forDigit(2,2) );<br />System.out.println("Character.forDigit(7,10): " + Character.forDigit(7,10) );<br />System.out.println("Character.forDigit(15,16): " + Character.forDigit(15,16) );<br />结果为：<br />Character.MIN_RADIX: 2<br />Character.MAX_RADIX: 36<br />Character.forDigit(2,2): <br />Character.forDigit(7,10): 7<br />Character.forDigit(15,16): f<br /></pre>
		<br />
		<ul>
				<br />7. <span style="COLOR: green">static int getNumericValue(char ch) </span>：返回字符ch的数值。<br />8. <span style="COLOR: green">static int getType(char ch)</span> ：返回字符所属类型。具体有哪些种类请查看Java文档资料。<br />9. <span style="COLOR: green">int hashCode()</span> ：返回当前字符的哈希表码。<br />10. <span style="COLOR: green">static boolean isDefined(char ch)</span> ：判断字符ch在Unicode字符集是否用明确定义。<br />11. <span style="COLOR: green">static boolean isDigit(char ch) </span>：判断字符ch是否为数字。<br />12. <span style="COLOR: green">static boolean isIdentifierIgnorable(char ch) </span>：判断字符ch是否为Unicode字符集中可忽略的字符。<br />13. <span style="COLOR: green">static boolean isISOControl(char ch) </span>：判断字符ch是否为ISO标准中的控制字符。<br />14.<span style="COLOR: green">static boolean isJavaIdentifierPart(char ch) </span>：判断字符ch是否为Java中的部分标识符。<br />15. <span style="COLOR: green">static boolean isJavaIdentifierStart(char ch)</span> ：判断字符ch是否为Java中的第一个标识符。<br />16. <span style="COLOR: green">static boolean isLetter(char ch)</span> ：判断字符ch是否为字母。<br />17. <span style="COLOR: green">static boolean isLetterOrDigit(char ch) </span>：判断字符ch是否为字母或数字。<br />18. <span style="COLOR: green">static boolean isLowerCase(char ch) </span>：判断字符ch是否为小写字母。<br />19. <span style="COLOR: green">static boolean isMirrored(char c)</span> ：根据Unicode表判断字符c是否存在与之方向相反的字符。例如：“［”存在与之方向相反的“］”，结果为：true。<br />20. <span style="COLOR: green">static boolean isSpaceChar(char ch)</span> ：判断字符ch是否为Unicode中的空格。<br />21. <span style="COLOR: green">static boolean isUpperCase(char ch)</span> ：判断字符ch是否为大写字母。<br />22. <span style="COLOR: green">static boolean isWhitespace(char ch)</span> ：判断字符ch是否为Java定义中的空字符。<br /><pre>其中包括： <br />	char c1 = '\u0009';//水平列表符<br />	char c2 = '\u000A';//换行<br />	char c3 = '\u000B';//垂直列表符<br />	char c4 = '\u000C';//换页<br />	char c5 = '\u000D';//回车<br />	char c6 = '\u001C';//文件分隔符<br />	char c7 = '\u001D';//组分隔符<br />	char c8 = '\u001E';//记录分隔符<br />	char c9 = '\u001F';//单元分隔符</pre><br />23. <span style="COLOR: green">static char toLowerCase(char ch) </span>：转换ch是否为小写。<br />24. <span style="COLOR: green">String toString()</span> ：将当前Character对象转换成字符串。<br />25. <span style="COLOR: green">static String toString(char c) </span>：此为类方法，将c转换成字符串。<br />26. <span style="COLOR: green">static char toUpperCase(char ch)</span> ：转换ch是否为大写。</ul>
		<br />
		<pre>System.out.println("Character.toUpperCase('q'): " + Character.toUpperCase('q') );<br />System.out.println("Character.toLowerCaseCase('B'): " + Character.toLowerCase('B') );<br />结果为：<br />Character.toUpperCase('q'): Q<br />Character.toLowerCaseCase('B'): b</pre>
<img src ="http://www.blogjava.net/iKingQu/aggbug/80346.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iKingQu/" target="_blank">風向逆轉 - 就要爪哇</a> 2006-11-10 11:28 <a href="http://www.blogjava.net/iKingQu/articles/80346.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[收藏]Double类的使用方法</title><link>http://www.blogjava.net/iKingQu/articles/80345.html</link><dc:creator>風向逆轉 - 就要爪哇</dc:creator><author>風向逆轉 - 就要爪哇</author><pubDate>Fri, 10 Nov 2006 03:27:00 GMT</pubDate><guid>http://www.blogjava.net/iKingQu/articles/80345.html</guid><wfw:comment>http://www.blogjava.net/iKingQu/comments/80345.html</wfw:comment><comments>http://www.blogjava.net/iKingQu/articles/80345.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iKingQu/comments/commentRss/80345.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iKingQu/services/trackbacks/80345.html</trackback:ping><description><![CDATA[
		<strong>Double：双精度类型<br /><br /></strong>
		<span style="COLOR: blue">１、属性。</span>
		<br />
		<br />
		<ul>
				<br />1. <span style="COLOR: green">static Double MAX_VALUE</span> ： 返回最大双精度数，在不同硬件平台中由Double.longBitsToDouble(0x7fefffffffffffffL)计算得出。<br />2. <span style="COLOR: green">static Double MIN_VALUE</span> ： 返回最小双精度数，在不同硬件平台中由Double.longBitsToDouble(0x1L)计算得出。 <br />3. <span style="COLOR: green">static Double NaN </span>： 表示非数值类型的双精度数，在不同硬件平台中由Double.longBitsToDouble(0x7ff8000000000000L)计算得出。 <br />4. <span style="COLOR: green">static Double NEGATIVE_INFINITY</span>：返回负无穷双精度数，在不同硬件平台中由Double.longBitsToDouble(0xfff0000000000000L)计算得出。<br />5. <span style="COLOR: green">static Double POSITIVE_INFINITY </span>：返回正无穷双精度数，在不同硬件平台中由Double.longBitsToDouble(0x7ff0000000000000L)计算得出。<br />6. <span style="COLOR: green">static Class TYPE</span> ：返回当前类型。</ul>
		<br />
		<span style="COLOR: blue">２、构造函数。</span>
		<br />
		<br />
		<ul>
				<span style="COLOR: green">Double(double value)</span> ：以double类型为参数创建Double对象。<br /><span style="COLOR: green">Double(String s)</span> ：以String类型为参数创建String对象。</ul>
		<br />
		<span style="COLOR: blue">３、方法。</span>
		<br />
		<span style="COLOR: red">说明：<br />1. 所有方法均为public；<br />2. 书写格式：［修饰符］　&lt;返回类型&gt; &lt;方法名（［参数列表］）&gt;</span>
		<span style="COLOR: olive">
				<br />如：<br />static int parseInt(String s) 表示：此方法（parseInt）为类方法（static），返回类型为（int），方法所需参数为String类型。</span>
		<br />
		<br />
		<ul>
				<br />1. <span style="COLOR: green">byte byteValue()</span> ：返回以字节表示的双精度数。<br />2. <span style="COLOR: green">static int compare(double d1, double d2) </span>：此为类方法，比较d1和d2。相当于new Double(d1).compareTo(new Double(d2))。如果d1与d2相等，返回０；小于关系，返回负数；大于关系，返回正数。<br />3. <span style="COLOR: green">int compareTo(Double anotherDouble)</span> ：此为对象方法，当前对象与anotherDouble比较。与2的比较规则相同。<br />4. <span style="COLOR: green">int compareTo(Object o)</span> ：当前对象与o进行比较，如果o属于Double类，那么，相当于3；如果是其他类，则抛出ClassCastException异常。<br />5. <span style="COLOR: green">static long doubleToLongBits(double value) </span>：把value按照IEEE 754转化成long并输出它的十进制数值。<br />6. <span style="COLOR: green">double doubleValue() </span>：返回该双精度数对象的双精度数值。<br />7. <span style="COLOR: green">boolean equals(Object obj) </span>：比较当前Double对象与obj的内容是否相同。大多数情况是比较两个Double对象的值是否相等，相当于d1.doubleValue() == d2.doubleValue()的值。<br />8. <span style="COLOR: green">float floatValue()</span> ：返回该浮点数对象的浮点数值。<br />9. <span style="COLOR: green">int hashCode() </span>：返回该Double对象的哈希表码。<br />10. <span style="COLOR: green">int intValue()</span> ：返回该Double对象的整数值（整数部分）。<br />11. <span style="COLOR: green">boolean isInfinite()</span> ：判断该Double对象是否是无穷。<br />12. <span style="COLOR: green">static boolean isInfinite(double v) </span>：与11类似，不同的是：此为类方法，判断的是v。<br />13. <span style="COLOR: green">boolean isNaN()</span> ：判断该Double对象是否为非数值。<br />14. <span style="COLOR: green">static boolean isNaN(double v) </span>：功能与13一样，只不过判断v。<br />15. <span style="COLOR: green">long longValue()</span> ：返回该Double对象的长整数值。<br />16. <span style="COLOR: green">static float parseFloat(String s) </span>：将字符串转换成双精度数。<br />17. <span style="COLOR: green">short shortValue()</span> ：返回该Double对象的短整数值。<br />18. <span style="COLOR: green">String toString()</span> ：将该Double对象转换成字符串。<br />19. <span style="COLOR: green">static String toString(Double f)</span> ：功能与18一样，只是转换f。<br />20. <span style="COLOR: green">static Double valueOf(String s)</span> ：将字符串转换成双精度数。</ul>
		<br />
		<span style="COLOR: olive">例子：</span>与Float类的相似。<br /><img src ="http://www.blogjava.net/iKingQu/aggbug/80345.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iKingQu/" target="_blank">風向逆轉 - 就要爪哇</a> 2006-11-10 11:27 <a href="http://www.blogjava.net/iKingQu/articles/80345.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[收藏]Float类的使用方法</title><link>http://www.blogjava.net/iKingQu/articles/80344.html</link><dc:creator>風向逆轉 - 就要爪哇</dc:creator><author>風向逆轉 - 就要爪哇</author><pubDate>Fri, 10 Nov 2006 03:26:00 GMT</pubDate><guid>http://www.blogjava.net/iKingQu/articles/80344.html</guid><wfw:comment>http://www.blogjava.net/iKingQu/comments/80344.html</wfw:comment><comments>http://www.blogjava.net/iKingQu/articles/80344.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iKingQu/comments/commentRss/80344.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iKingQu/services/trackbacks/80344.html</trackback:ping><description><![CDATA[
		<strong>Float：实数类型<br /><br /></strong>
		<span style="COLOR: blue">１、属性。</span>
		<br />
		<ul>
				<br />1. <span style="COLOR: green">static float MAX_VALUE </span>： 返回最大浮点数，在不同硬件平台中由Float.intBitsToFloat(0x7f7fffff)计算得出。<br />2. <span style="COLOR: green">static float MIN_VALUE</span> ： 返回最小浮点数，在不同硬件平台中由Float.intBitsToFloat(0x1)计算得出。 <br />3. <span style="COLOR: green">static float NaN </span>： 表示非数值类型的浮点数，在不同硬件平台中由Float.intBitsToFloat(0x7fc00000)计算得出。 <br />4. <span style="COLOR: green">static float NEGATIVE_INFINITY</span>：返回负无穷浮点数，在不同硬件平台中由Float.intBitsToFloat(0xff800000)计算得出。<br />5. <span style="COLOR: green">static float POSITIVE_INFINITY </span>：返回正无穷浮点数，在不同硬件平台中由Float.intBitsToFloat(0x7f800000)计算得出。<br />6. <span style="COLOR: green">static Class TYPE</span> ：返回当前类型。</ul>
		<br />
		<br />
		<span style="COLOR: blue">２、构造函数。</span>
		<br />
		<ul>
				<br />
				<span style="COLOR: green">Float(double value) </span>：以double类型为参数构造Float对象。<br /><span style="COLOR: green">Float(float value) </span>：以Float类型为参数构造Float对象。<br /><span style="COLOR: green">Float(String s)</span> ：以String类型为参数构造Float对象。</ul>
		<br />
		<br />
		<span style="COLOR: blue">３、方法。</span>
		<br />
		<span style="COLOR: red">说明：<br />1. 所有方法均为public；<br />2. 书写格式：［修饰符］　&lt;返回类型&gt; &lt;方法名（［参数列表］）&gt;</span>
		<span style="COLOR: olive">
				<br />如：<br />static int parseInt(String s) 表示：此方法（parseInt）为类方法（static），返回类型为（int），方法所需参数为String类型。</span>
		<br />
		<br />
		<ul>
				<br />1. <span style="COLOR: green">byte byteValue() </span>：返回以字节表示的浮点数。<br />2. <span style="COLOR: green">static int compare(float f1, float f2)</span> ：此为类方法，比较f1和f2。相当于new Float(f1).compareTo(new Float(f2))。如果f1与f2相等，返回０；小于关系，返回负数；大于关系，返回正数。<br />3. <span style="COLOR: green">int compareTo(Float anotherFloat) </span>：此为对象方法，当前对象与anotherFloat比较。与2的比较规则相同。<br />4. <span style="COLOR: green">int compareTo(Object o)</span> ：当前对象与o进行比较，如果o属于Float类，那么，相当于3；如果是其他类，则抛出ClassCastException异常。<br />5. <span style="COLOR: green">double doubleValue()</span> ：返回浮点数的双精度值。<br />6. <span style="COLOR: green">boolean equals(Object obj)</span> ：比较当前Float对象与obj的内容是否相同。大多数情况是比较两个Float对象的值是否相等，相当于f1.floatValue() == f2.floatValue()的值。与2、3、4不同的是：6返回boolean型。<br />7. <span style="COLOR: green">static int floatToIntBits(float value)</span>：按照IEEE 754转化成float并输出它的十进制数值。<br />8. <span style="COLOR: green">float floatValue()</span> ：返回该浮点数对象的浮点数值。<br />9. <span style="COLOR: green">int hashCode()</span> ：返回该Float对象的哈希表码。<br />10. <span style="COLOR: green">int intValue() </span>：返回该Float对象的整数值（整数部分）。<br />11. <span style="COLOR: green">boolean isInfinite()</span> ：判断该Float对象是否是无穷。<br />12. st<span style="COLOR: green">atic boolean isInfinite(float v)</span> ：与11类似，不同的是：此为类方法，判断的是v。<br />13. <span style="COLOR: green">boolean isNaN()</span> ：判断该Float对象是否为非数值。<br />14. <span style="COLOR: green">static boolean isNaN(float v) </span>：功能与13一样，只不过判断v。<br />15. <span style="COLOR: green">long longValue() </span>：返回该Float对象的长整数值。<br />16. <span style="COLOR: green">static float parseFloat(String s) </span>：将字符串转换成浮点数。<br />17. <span style="COLOR: green">short shortValue() </span>：返回该Float对象的短整数值。<br />18. <span style="COLOR: green">String toString()</span> ：将该Float对象转换成字符串。<br />19. <span style="COLOR: green">static String toString(float f) </span>：功能与18一样，只是转换f。<br />20. <span style="COLOR: green">static Float valueOf(String s)</span> ：将字符串转换成浮点数。</ul>
		<br />
		<br />
		<span style="COLOR: olive">例子：</span>
		<br />
		<pre>Float f = new Float(1237.45);<br />Float fs = new Float("123.45");<br />Float fd = new Float(1234146865679824657987947924623724749.16416925);<br /><br />System.out.println("f.compare(fs): " + f.compareTo(fs) );<br />System.out.println("f.compareTo(fd): " + f.compareTo(fd) );<br />System.out.println("Float.compare(1.23f,3.25f): " + Float.compare(1.23f,3.25f) );<br />结果为：<br />f.compare(fs): 1<br />f.compareTo(fd): -1<br />Float.compare(1.23f,3.25f): -1</pre>
		<br />
		<br />
		<pre>Float f = new Float(1237.45);<br />System.out.println("f.equals(fs): " + f.equals(fs) );<br />结果为：f.equals(fs): false</pre>
<img src ="http://www.blogjava.net/iKingQu/aggbug/80344.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iKingQu/" target="_blank">風向逆轉 - 就要爪哇</a> 2006-11-10 11:26 <a href="http://www.blogjava.net/iKingQu/articles/80344.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[收藏]Integer类的使用方法 </title><link>http://www.blogjava.net/iKingQu/articles/80342.html</link><dc:creator>風向逆轉 - 就要爪哇</dc:creator><author>風向逆轉 - 就要爪哇</author><pubDate>Fri, 10 Nov 2006 03:25:00 GMT</pubDate><guid>http://www.blogjava.net/iKingQu/articles/80342.html</guid><wfw:comment>http://www.blogjava.net/iKingQu/comments/80342.html</wfw:comment><comments>http://www.blogjava.net/iKingQu/articles/80342.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iKingQu/comments/commentRss/80342.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iKingQu/services/trackbacks/80342.html</trackback:ping><description><![CDATA[
		<strong>Interger：整数类型<br /><br /></strong>
		<span style="COLOR: blue">１、属性。</span>
		<br />
		<ul>
				<br />
				<span style="COLOR: green">static int MAX_VALUE</span>：返回最大的整型数；<br /><span style="COLOR: green">static int MIN_VALUE</span>：返回最小的整型数；<br /><span style="COLOR: green">static Class TYPE </span>：返回当前类型。</ul>
		<br />
		<span style="COLOR: olive">例子：</span>
		<br />
		<pre>System.out.println("Integer.MAX_VALUE: " + Integer.MAX_VALUE );<br />结果为：Integer.MAX_VALUE: 2147483647<br /></pre>
		<br />
		<br />
		<span style="COLOR: blue">２、构造函数。</span>
		<br />
		<ul>
				<br />
				<span style="COLOR: green">Integer(int value)</span> ：通过一个int的类型构造对象；<br /><span style="COLOR: green">Integer(String s)</span> ：通过一个String的类型构造对象；</ul>
		<br />
		<span style="COLOR: olive">例子：</span>
		<br />
		<pre>Integer i = new Integer("1234");<br />生成了一个值为1234的Integer对象。<br /></pre>
		<br />
		<br />
		<span style="COLOR: blue">３、方法。</span>
		<br />
		<span style="COLOR: red">说明：<br />1. 所有方法均为public；<br />2. 书写格式：［修饰符］　&lt;返回类型&gt; &lt;方法名（［参数列表］）&gt;</span>
		<span style="COLOR: olive">
				<br />如：<br />static int parseInt(String s) 表示：此方法（parseInt）为类方法（static），返回类型为（int），方法所需参数为String类型。</span>
		<br />
		<br />
		<ul>
				<br />1. <span style="COLOR: green">byteValue()：</span>取得用byte类型表示的整数；<br />2. <span style="COLOR: green">int compareTo(Integer anotherInteger) </span>：比较两个整数。相等时返回０；小于时返回负数；大于时返回正数。</ul>
		<br />
		<span style="COLOR: olive">例子：</span>
		<br />
		<pre>
				<br />Integer i = new Integer(1234);<br />System.out.println("i.compareTo: " + i.compareTo(new Integer(123)) );<br />结果为：i.compareTo: 1<br /></pre>
		<br />
		<ul>
				<br />3. <span style="COLOR: green">int compareTo(Object o) </span>：将该整数与其他类进行比较。如果o也为Integer类，进行方法2 的操作；否则，抛出ClassCastException异常。<br />4. <span style="COLOR: green">static Integer decode(String nm)</span> ：将字符串转换为整数。<br />5. <span style="COLOR: green">double doubleValue()</span> ：取得该整数的双精度表示。<br />6. <span style="COLOR: green">boolean equals(Object obj) </span>：比较两个对象。<br />7. <span style="COLOR: green">float floatValue() </span>：取得该整数的浮点数表示。<br />8. <span style="COLOR: green">static Integer getInteger(String nm) </span>：根据指定名确定系统特征值。<br />9. <span style="COLOR: green">static Integer getInteger(String nm, int val)</span> ：上面的重载。<br />10. <span style="COLOR: green">static Integer getInteger(String nm, Integer val) </span>：上面的重载。<br />11. <span style="COLOR: green">int hashCode() </span>：返回该整数类型的哈希表码。<br />12. <span style="COLOR: green">int intValue()</span> ： 返回该整型数所表示的整数。<br />13. <span style="COLOR: green">long longValue() </span>：返回该整型数所表示的长整数。<br />14. <span style="COLOR: green">static int parseInt(String s)</span> ：将字符串转换成整数。s必须是时进制数组成，否则抛出NumberFormatException异常。<br />15. <span style="COLOR: green">static int parseInt(String s, int radix)</span> ：以radix为基数radix返回s的十进制数。<span style="COLOR: red">所谓的基数，就是“几进制”。</span></ul>
		<br />
		<span style="COLOR: olive">例子：</span>
		<br />
		<pre>
				<br />String s1 = new String("1010");<br />System.out.println("Integer.parseInt(String s, int radix): " + Integer.parseInt(s1,2) );<br />结果为：Integer.parseInt(String s, int radix): 10<br /></pre>
		<br />
		<ul>
				<br />16. <span style="COLOR: green">short shortValue() </span>：返回该整型数所表示的短整数。<br />17. <span style="COLOR: green">static String toBinaryString(int i) </span>：将整数转为二进制数的字符串。<br />18. <span style="COLOR: green">static String toHexString(int i)</span> ：将整数转为十六进制数的字符串。<br />19. <span style="COLOR: green">static String toOctalString(int i) </span>：将整数转为八进制数的字符串。<br />20. <span style="COLOR: green">String toString()</span> ：将该整数类型转换为字符串。<br />21. <span style="COLOR: green">static String toString(int i) </span>：将该整数类型转换为字符串。不同的是，此为类方法。<br />22. <span style="COLOR: green">static String toString(int i, int radix) </span>：将整数i以基数radix的形式转换成字符串。</ul>
		<br />
		<span style="COLOR: olive">例子：</span>
		<br />
		<pre>int i1 = 54321;<br />System.out.println("Integer.toString(int i, int radix): " + Integer.toString(i1,16) );<br />结果为：Integer.toString(int i, int radix): d431</pre>
		<br />
		<ul>
				<br />
				<span style="COLOR: green">23. static Integer valueOf(String s)</span> ：将字符串转换成整数类型。<br /><span style="COLOR: green">24. static Integer valueOf(String s, int radix) </span>：将字符串以基数radix的要求转换成整数类型。</ul>
<img src ="http://www.blogjava.net/iKingQu/aggbug/80342.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iKingQu/" target="_blank">風向逆轉 - 就要爪哇</a> 2006-11-10 11:25 <a href="http://www.blogjava.net/iKingQu/articles/80342.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[收藏]JAVA 正则表达式实现</title><link>http://www.blogjava.net/iKingQu/articles/75783.html</link><dc:creator>風向逆轉 - 就要爪哇</dc:creator><author>風向逆轉 - 就要爪哇</author><pubDate>Tue, 17 Oct 2006 18:22:00 GMT</pubDate><guid>http://www.blogjava.net/iKingQu/articles/75783.html</guid><wfw:comment>http://www.blogjava.net/iKingQu/comments/75783.html</wfw:comment><comments>http://www.blogjava.net/iKingQu/articles/75783.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iKingQu/comments/commentRss/75783.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iKingQu/services/trackbacks/75783.html</trackback:ping><description><![CDATA[§1黑暗岁月<br />       有一个String，如何查询其中是否有y和f字符？最黑暗的办法就是：<br />程序1：我知道if、for语句和charAt()啊。<br />class Test{<br />  public static void main(String args[]) {<br />         String str="For my money, the important thing "+<br />         "about the meeting was bridge-building";<br />         char x='y';<br />         char y='f';<br />         boolean result=false;<br />         for(int i=0;i&lt;str.length();i++){<br />                char z=str.charAt(i);  //System.out.println(z);<br />                if(x==z||y==z) {<br />                       result=true;<br />                       break;<br />                }<br />                else result=false;<br />         }   <br />         System.out.println(result);<br />       }<br />}<br />       好像很直观，但这种方式难以应付复杂的工作。如查询一段文字中，是否有is？是否有thing或ting等。这是一个讨厌的工作。<br />§2 Java的java.util.regex包<br />       按照面向对象的思路，把希望查询的字符串如is、thing或ting封装成一个对象，以这个对象作为模板去匹配一段文字，就更加自然了。作为模板的那个东西就是下面要讨论的正则表达式。先不考虑那么复杂，看一个例子：<br />程序2：不懂。先看看可以吧？<br />import java.util.regex.*;<br />class Regex1{<br />  public static void main(String args[]) {<br />         String str="For my money, the important thing "+<br />         "about the meeting was bridge-building";<br />         String regEx="a|f";   //表示a或f <br />         Pattern p=Pattern.compile(regEx);<br />         Matcher m=p.matcher(str);<br />         boolean result=m.find();<br />         System.out.println(result);<br />       }<br />}<br />       如果str匹配regEx，那么result为true，否则为flase。如果想在查找时忽略大小写，则可以写成：<br />Pattern p=Pattern.compile(regEx,Pattern.CASE_INSENSITIVE);<br />       虽然暂时不知道Pattern（模板、模式）和Matcher（匹配器）的细节，程序的感觉就比较爽，如果先查询is、后来又要查询thing或ting，我们只需要修改一下模板Pattern，而不是考虑if语句和for语句，或者通过charAt()。<br />1、写一个特殊的字符串??正则表达式如a|f。<br />2、将正则表达式编译成一个模板：p<br />3、用模板p去匹配字符串str。<br />       思路清楚了，现在看Java是如何处理的（Java程序员直到JDK1.4才能使用这些类。<br />§3 Pattern类与查找<br />       ①public final class java.util.regex.Pattern是正则表达式编译后的表达法。下面的语句将创建一个Pattern对象并赋值给句柄p：Pattern p=Pattern.compile(regEx);<br />       有趣的是，Pattern类是final类，而且它的构造器是private。也许有人告诉你一些设计模式的东西，或者你自己查有关资料。这里的结论是：Pattern类不能被继承，我们不能通过new创建Pattern类的对象。<br />       因此在Pattern类中，提供了2个重载的静态方法，其返回值是Pattern对象（的引用）。如：<br />    public static Pattern compile(String regex) {<br />        return new Pattern(regex, 0);<br />    }<br />       当然，我们可以声明Pattern类的句柄，如Pattern p=null；<br />       ②p.matcher(str)表示以用模板p去生成一个字符串str的匹配器，它的返回值是一个Matcher类的引用，为什么要这个东西呢？按照自然的想法，返回一个boolean值不行吗？<br />       我们可以简单的使用如下方法：<br />       boolean result=Pattern.compile(regEx).matcher(str).find();<br />       呵呵，其实是三个语句合并的无句柄方式。无句柄常常不是好方式。后面再学习Matcher类吧。先看看regEx??这个怪咚咚。<br />§4 正则表达式之限定符<br />       正则表达式（Regular Expression）是一种生成字符串的字符串。晕吧。比如说，String regEx="me+";这里字符串me+能够生成的字符串是：me、mee、meee、meeeeeeeeee等等，一个正则表达式可能生成无穷的字符串，所以我们不可能（有必要吗？）输出正则表达式产生的所有东西。<br />反过来考虑，对于字符串：me、mee、meee、meeeeeeeeee等等，我们能否有一种语言去描述它们呢？显然，正则表达式语言是这种语言，它是一些字符串的模式??简洁而深刻的描述。<br />我们使用正则表达式，用于字符串查找、匹配、指定字符串替换、字符串分割等等目的。<br /> <br />       生成字符串的字符串??正则表达式，真有些复杂，因为我们希望由普通字符（例如字符 a 到 z）以及特殊字符（称为元字符）描述任意的字符串，而且要准确。<br />       先搞几个正则表达式例子：<br />       程序3：我们总用这个程序测试正则表达式。<br />       import java.util.regex.*;<br />class Regex1{<br />  public static void main(String args[]) {<br />         String str="For my money, the important thing "；<br />         String regEx="ab*"; <br />         boolean result=Pattern.compile(regEx).matcher(str).find();<br />         System.out.println(result);<br />       }<br />}//ture<br />①"ab*"??能匹配a、ab、abb、abbb……。所以，*表示前面字符可以有零次或多次。如果仅仅考虑查找，直接用"a"也一样。但想想替换的情况。 问题regEx="abb*"结果如何？<br />②"ab+"??能匹配ab、abb、abbb……。等价于"abb*"。问题regEx="or+"结果如何？<br />③"or?"??能匹配o和or。? 表示前面字符可以有零次或一次。<br />       这些限定符*、+、?方便地表示了其前面字符(子串)出现的次数（我们用{}来描述）：<br />x*    零次或多次 ≡{0,}<br />x+    一次或多次 ≡{1,}<br />x?    零次或一次 ≡{0,1}<br />x{n}    n次（n&gt;0）<br />x{n,m}    最少n次至最多m次（0&lt;n&lt;m）<br />x{n,}    最少n次,<br />       <br />现在我们知道了连续字符串的查找、匹配。下面的是一些练习题：<br />①查找粗体字符串（不要求精确或要求精确匹配），写出其正则表达式：<br />str    regEX(不要求精确)    regEX(要求精确)    试一试<br />abcffd    b或bcff或bcf*或bc*或bc+    bcff或bcf{2}    bc{3}<br />gooooogle    o{1,}、o+    o{5}     <br />banana    (an)+    (an){2}a、a(na) {2}     <br />                <br />                <br />                <br />②正则表达式匹配字符串，输出是什么？<br />§5替换（删除）、Matcher类<br />现在我们可能厌烦了true/false，我们看看替换。如把book，google替换成bak（这个文件后缀名，在EditPlus中还行）、look或goooogle。<br />       程序4：字符串的替换。<br />       import java.util.regex.*;<br />class Regex1{<br />       public static void main(String args[]) {<br />              String regEx="a+";//表示一个或多个a<br />              String str="abbbaaa an banana hhaana";<br />              Pattern p=Pattern.compile(regEx);<br />              Matcher m=p.matcher(str);<br />              String s=m.replaceAll("⊙⊙"); // ("") 删除<br />              System.out.println(s);<br />       }<br />}        <br />       这个程序与前面的程序的区别，在于使用了m.replaceAll(String)方法。看来Matcher类还有点用处。<br />①    public final class Matcher是一个匹配器。可以把他看成一个人，一手拿着模子（Pattern类的对象），一手拿着一个字符序列（CharSequence），通过解释该模子而对字符序列进行匹配操作（match operations）。常常我们这样编程：“喂，模子p，你和字符串str一起创建一个匹配器对象”。即Matcher m=p.matcher(str);<br />②    m可以进行一些操作，如public String replaceAll(String replacement)，它以replacement替换所有匹配的字符串。<br />§6正则表达式之特殊字符<br />我们熟悉这样一个字符串"\n" 如：System.out.print(s+"\nbbb");这是Java中常用的转移字符之一。其实转移字符就是一种正则表达式，它使用了特殊字符 \ 。<br /> <br />下面是正则表达式中常用的特殊字符：<br />匹配次数符号    *    +    ？    {n}、{n,}、{n,m}<br />“或”符号    |     程序2已经使用过了<br />句点符号    .     句点符号匹配所有字符（一个），包括空格、Tab字符甚至换行符。<br />方括号    [ ]   仅仅匹配方括号其中的字符)<br />圆括号    ()    分组，圆括号中的字符视为一个整体。<br />连字符    -     表示一个范围。 <br />“否”符号    ^    表示不希望被匹配的字符（排除）<br />我们一下子学不了太多的东西，这不是正则表达式的全部内容和用法。但已经够我们忙活的了。我们用程序4 验证。(⊙⊙表示替换的字符)<br />①    regEx为下列字符串时，能够表示什么？<br />regEx    匹配    测试用str<br />(a|b){2}    aa、ab、bb、ba    aabbfooaabfooabfoob<br />a[abc]b    aab、abb、acb    3dfacb5ooyfo6abbfooaab<br />.     all string    3dfac<br />a.     aa、ax……等等    3dfacgg<br />d[^j]a    daa、d9a等等，除dja    3dfacggdjad5a<br />[d-g][ac]c    dac、ecc、gac等    3dfacggggccad5c<br />[d-g].{2}c    d⊙⊙c……    3dfacggggccad5c<br />g{1,10}    g、ggg……    3dfacggggccad5c<br />[a|c][^a]         3dfacggggccad5c<br /> <br />②    下列字符串如何用regEx表示？<br />测试用str    匹配    regEx<br />aabbfoaoabfooafobob     a⊙⊙b    a..b<br />aabbfoaaobfooafbob    a⊙b、除aab    a[^a]b、<br />gooooooogle    oooo……变成oo    o{2,20}<br />一本书中的“tan”、“ten”、“tin”和“ton”    t.n、t[aeio]n<br />abcaccbcbaacabccaa    删除ac、ca    (ca)|(ac)<br />abccbcbaabca    再删除ab、ba    结果ccbcca（如何与上面的合并）<br />           <br />           <br />           <br />注：<br />1、String str="一本书中的tan、ten、tin和ton"; <br />输出：     一本书中的⊙⊙、⊙⊙、⊙⊙和⊙⊙<br />2、String str=" abcaccbcbaacabccaa "; 输出：ccbcca<br />       程序5：if、for语句和charAt()，886。<br />import java.util.regex.*;<br />class Regex1{<br />    public static void main(String args[]) {<br />           String str="abcaccbcbaacabccaa";<br />           String regEx="(ac)|(ca)";<br />           Pattern p=Pattern.compile(regEx);<br />           Matcher m=p.matcher(str);<br />           String s=m.replaceAll("");//⊙⊙<br />           regEx="(ab)|(ba)";<br />           p=Pattern.compile(regEx);<br />           s=p.matcher(s).replaceAll("");<br /> <br />           System.out.print(s+"\n");<br />    }<br />}<br /> <br />§7 开始<br />好像我们知道了一些正则表达式与 Java的知识，事实上，我们才刚刚开始。这里列出我们知道的东西，也说一点我们不知道的东西。<br />①              Java在JDK1.4引入了（java.util.regex包）以支持正则表达式，包中有两个类，分别是Pattern和Matcher。它们都有很多的方法，我们还不知道。String类中的split、matches方法等等也使用到了正则表达式。StringTokenizer是否没有用处了？<br />②             正则表达式是一门语言。有许多正则表达式语法、选项和特殊字符，在Pattern.java源文件中大家可以查看。可能比想象中的要复杂。系统学习正则表达式的历史、语法、全部特殊字符（相当于Java中的关键字的地位），组合逻辑是下一步的事情。<br />③             正则表达式是文本处理的重要技术，在Perl、PHP、Python、JavaScript、Java、C＃中被广泛支持。被列为“保证你现在和未来不失业的十种关键技术”，呵呵，信不信由你<br /><img src ="http://www.blogjava.net/iKingQu/aggbug/75783.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iKingQu/" target="_blank">風向逆轉 - 就要爪哇</a> 2006-10-18 02:22 <a href="http://www.blogjava.net/iKingQu/articles/75783.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[收藏]在JAVA中使用正则表达式</title><link>http://www.blogjava.net/iKingQu/articles/75782.html</link><dc:creator>風向逆轉 - 就要爪哇</dc:creator><author>風向逆轉 - 就要爪哇</author><pubDate>Tue, 17 Oct 2006 18:20:00 GMT</pubDate><guid>http://www.blogjava.net/iKingQu/articles/75782.html</guid><wfw:comment>http://www.blogjava.net/iKingQu/comments/75782.html</wfw:comment><comments>http://www.blogjava.net/iKingQu/articles/75782.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iKingQu/comments/commentRss/75782.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iKingQu/services/trackbacks/75782.html</trackback:ping><description><![CDATA[jdk1.4中加入了java.util.regex包提供对正则表达式的支持。而且Java.lang.String类中的replaceAll和split函数也是调用的正则表达式来实现的。<br /><br /><script id="ad_text_pcjob" src="/script/ad_text_pcjob.js" defer=""></script>
　正则表达式对字符串的操作主要包括：字符串匹配，指定字符串替换，指定字符串查找和字符串分割。下面就用一个例子来说明这些操作是如何实现的：<br /><br />　　&lt; %@ page import="java.util.regex.*"%&gt;<br /><br />　　&lt; %<br /><br />　　Pattern p=null; //正则表达式<br /><br />　　Matcher m=null; //操作的字符串<br /><br />　　boolean b;<br /><br />　　String s=null;<br /><br />　　StringBuffer sb=null;<br /><br />　　int i=0;<br /><br />　　//字符串匹配，这是不符合的<br /><br />　　p = Pattern.compile("a*b");<br /><br />　　m = p.matcher("baaaaab");<br /><br />　　b = m.matches();<br /><br />　　out.println(b+"&lt; br&gt;");<br /><br />　　//字符串匹配，这是符合的 <br /><br clear="all" />　　p = Pattern.compile("a*b");<br /><br />　　m = p.matcher("aaaaab");<br /><br />　　b = m.matches();<br /><br />　　out.println(b+"&lt; br&gt;");<br /><br />　　//字符串替换<br /><br />　　p = Pattern.compile("ab");<br /><br />　　m = p.matcher("aaaaab");<br /><br />　　s = m.replaceAll("d"); <br /><br />　　out.println(s+"&lt; br&gt;");<br /><br />　　p = Pattern.compile("a*b");<br /><br />　　m = p.matcher("aaaaab");<br /><br />　　s = m.replaceAll("d"); <br /><br />　　out.println(s+"&lt; br&gt;");<br /><br />　　p = Pattern.compile("a*b"); <br /><br clear="all" />　　m = p.matcher("caaaaab");<br /><br />　　s = m.replaceAll("d"); <br /><br />　　out.println(s+"&lt; br&gt;");<br /><br />　　//字符串查找<br /><br />　　p = Pattern.compile("cat");<br /><br />　　m = p.matcher("one cat two cats in the yard");<br /><br />　　sb = new StringBuffer();<br /><br />　　while (m.find()) {<br /><br />m.appendReplacement(sb, "dog");<br /><br />i++;<br /><br />　　}<br /><br />　　m.appendTail(sb);<br /><br />　　out.println(sb.toString()+"&lt; br&gt;");<br /><br />　　out.println(i+"&lt; br&gt;");<br /><br />　　i=0; <br clear="all" /><br />　　p = Pattern.compile("cat");<br /><br />　　m = p.matcher("one cat two ca tsi nthe yard");<br /><br />　　sb = new StringBuffer();<br /><br />　　while (m.find()) {<br /><br />m.appendReplacement(sb, "dog");<br /><br />i++;<br /><br />　　}<br /><br />　　m.appendTail(sb);<br /><br />　　 out.println(sb.toString()+"&lt; br&gt;");<br /><br />　　out.println(i+"&lt; br&gt;");<br /><br /><br /><br /><br /><br />　　p = Pattern.compile("cat");<br /><br />　　m = p.matcher("one cat two cats in the yard");<br /><br />　　p=m.pattern(); <br clear="all" /><br />　　m = p.matcher("bacatab");<br /><br />　　b = m.matches();<br /><br />　　out.println(b+"&lt; br&gt;"); <br /><br />　　s = m.replaceAll("dog"); <br /><br />　　out.println(s+"&lt; br&gt;"); <br /><br /><br /><br />　　 i=0;<br /><br />　　p = Pattern.compile("(fds){2,}");<br /><br />　　 m = p.matcher("dsa da fdsfds aaafdsafds aaf");<br /><br />　　 sb = new StringBuffer();<br /><br />　　while (m.find()) {<br /><br />m.appendReplacement(sb, "dog");<br /><br />i++;<br /><br />　　}<br /><br />　　m.appendTail(sb);<br /><br />　　out.println(sb.toString()+"&lt; br&gt;"); <br clear="all" /><br />　　out.println(i+"&lt; br&gt;");<br /><br /><br /><br />　　 p = Pattern.compile("cat");<br /><br />　　 m = p.matcher("one cat two cats in the yard");<br /><br />　　 sb = new StringBuffer();<br /><br />　　while (m.find()) {<br /><br />m.appendReplacement(sb, "<font color="#00ed00">cat</font>");<br /><br />　　 }<br /><br />　　m.appendTail(sb);<br /><br />　　out.println(sb.toString()+"&lt; br&gt;");<br /><br />　　String aa=sb.toString();<br /><br />　　out.println(aa+"&lt; br&gt;");<br /><br />　　//字符串分割<br /><br />　　 p = Pattern.compile("a+");<br /><br />　　 String[] a=p.split("caaaaaat");<br /><br />　　 for(i=0;i<br />　　 {<br /><br />　　 out.println(a[i]+"&lt; br&gt;");<br /><br />　　 }<br /><br />　　 p = Pattern.compile("a+");<br /><br />　　 a=p.split("c aa aaaa t",0);<br /><br />　　 for(i=0;i<a.length;i++)><br /><br />　　 {<br /><br />　　 out.println(a[i]+"&lt; br&gt;");<br /><br />　　 }<br /><br />　　 p = Pattern.compile(" +");<br /><br />　　 a=p.split("c aa aaaa t",0);<br /><br />　　 for(i=0;i<a.length;i++)><br /><br />　　 {<br /><br />　　 out.println(a[i]+"&lt; br&gt;");<br /><br />　　}<br /><br />　　p = Pattern.compile("\\+");<br /><br />　　 a=p.split("dsafasdfdsafsda+dsagfasdfa+sdafds");<br /><br />　　out.println(a.length+"&lt; br&gt;");<br /><br />　　for(i=0;i<a.length;i++)><br /><br />　　{<br /><br />　　out.println(a[i]+"&lt; br&gt;");<br /><br />　　}<br /><br />　　%&gt;（www.csdn.net） <br clear="all" /><a.length;i++)><br clear="all" /></a.length;i++)></a.length;i++)></a.length;i++)></a.length;i++)><img src ="http://www.blogjava.net/iKingQu/aggbug/75782.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iKingQu/" target="_blank">風向逆轉 - 就要爪哇</a> 2006-10-18 02:20 <a href="http://www.blogjava.net/iKingQu/articles/75782.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[收藏]Java正则表达式详解</title><link>http://www.blogjava.net/iKingQu/articles/75781.html</link><dc:creator>風向逆轉 - 就要爪哇</dc:creator><author>風向逆轉 - 就要爪哇</author><pubDate>Tue, 17 Oct 2006 18:14:00 GMT</pubDate><guid>http://www.blogjava.net/iKingQu/articles/75781.html</guid><wfw:comment>http://www.blogjava.net/iKingQu/comments/75781.html</wfw:comment><comments>http://www.blogjava.net/iKingQu/articles/75781.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iKingQu/comments/commentRss/75781.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iKingQu/services/trackbacks/75781.html</trackback:ping><description><![CDATA[
		<p>
		</p>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">如果你曾经用过Perl或任何其他内建正则表达式支持的语言，你一定知道用正则表达式处理文本和匹配模式是多么简单。如果你不熟悉这个术语，那么“正则表达式”（Regular Expression）就是一个字符构成的串，它定义了一个用来搜索匹配字符串的模式。 </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">许多语言，包括Perl、PHP、Python、JavaScript和JScript，都支持用正则表达式处理文本，一些文本编辑器用正则表达式实现高级“搜索-替换”功能。那么Java又怎样呢？本文写作时，一个包含了用正则表达式进行文本处理的Java规范需求（Specification Request）已经得到认可，你可以期待在JDK的下一版本中看到它。 </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">然而，如果现在就需要使用正则表达式，又该怎么办呢？你可以从Apache.org下载源代码开放的Jakarta-ORO库。本文接下来的内容先简要地介绍正则表达式的入门知识，然后以Jakarta-ORO API为例介绍如何使用正则表达式。 </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<b>
												<font size="4">一、正则表达式基础知识</font>
										</b>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">我们先从简单的开始。假设你要搜索一个包含字符“cat”的字符串，搜索用的正则表达式就是“cat”。如果搜索对大小写不敏感，单词“catalog”、“Catherine”、“sophisticated”都可以匹配。也就是说： </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_a.jpg" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<b>1.1 句点符号</b>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">假设你在玩英文拼字游戏，想要找出三个字母的单词，而且这些单词必须以“t”字母开头，以“n”字母结束。另外，假设有一本英文字典，你可以用正则表达式搜索它的全部内容。要构造出这个正则表达式，你可以使用一个通配符——句点符号“.”。这样，完整的表达式就是“t.n”，它匹配“tan”、“ten”、“tin”和“ton”，还匹配“t#n”、“tpn”甚至“t n”，还有其他许多无意义的组合。这是因为句点符号匹配所有字符，包括空格、Tab字符甚至换行符： </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_b.jpg" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<b>1.2 方括号符号</b>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">为了解决句点符号匹配范围过于广泛这一问题，你可以在方括号（“[]”）里面指定看来有意义的字符。此时，只有方括号里面指定的字符才参与匹配。也就是说，正则表达式“t[aeio]n”只匹配“tan”、“Ten”、“tin”和“ton”。但“Toon”不匹配，因为在方括号之内你只能匹配单个字符： </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_c.jpg" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<b>1.3 “或”符号</b>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">如果除了上面匹配的所有单词之外，你还想要匹配“toon”，那么，你可以使用“|”操作符。“|”操作符的基本意义就是“或”运算。要匹配“toon”，使用“t(a|e|i|o|oo)n”正则表达式。这里不能使用方扩号，因为方括号只允许匹配单个字符；这里必须使用圆括号“()”。圆括号还可以用来分组，具体请参见后面介绍。 </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_d.jpg" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<b>1.4 表示匹配次数的符号</b>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">表一显示了表示匹配次数的符号，这些符号用来确定紧靠该符号左边的符号出现的次数： </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<p align="center">
												<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4n.jpg" border="0" />
										</p>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">假设我们要在文本文件中搜索美国的社会安全号码。这个号码的格式是999-99-9999。用来匹配它的正则表达式如图一所示。在正则表达式中，连字符（“-”）有着特殊的意义，它表示一个范围，比如从0到9。因此，匹配社会安全号码中的连字符号时，它的前面要加上一个转义字符“\”。 </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<p align="center">
												<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4a.gif" border="0" />
										</p>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<p align="center">图一：匹配所有123-12-1234形式的社会安全号码</p>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">假设进行搜索的时候，你希望连字符号可以出现，也可以不出现——即，999-99-9999和999999999都属于正确的格式。这时，你可以在连字符号后面加上“？”数量限定符号，如图二所示： </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<p align="center">
												<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4b.gif" border="0" />
										</p>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<p align="center">图二：匹配所有123-12-1234和123121234形式的社会安全号码</p>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">下面我们再来看另外一个例子。美国汽车牌照的一种格式是四个数字加上二个字母。它的正则表达式前面是数字部分“[0-9]{4}”，再加上字母部分“[A-Z]{2}”。图三显示了完整的正则表达式。 </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<p align="center">
												<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4c.gif" border="0" />
										</p>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<p align="center">图三：匹配典型的美国汽车牌照号码，如8836KV</p>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">1.5 “否”符号 </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">“^”符号称为“否”符号。如果用在方括号内，“^”表示不想要匹配的字符。例如，图四的正则表达式匹配所有单词，但以“X”字母开头的单词除外。 </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<p align="center">
												<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4d.gif" border="0" />
										</p>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<p align="center">图四：匹配所有单词，但“X”开头的除外</p>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">1.6 圆括号和空白符号 </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">假设要从格式为“June 26, 1951”的生日日期中提取出月份部分，用来匹配该日期的正则表达式可以如图五所示： </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<p align="center">
												<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4e.gif" border="0" />
										</p>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<p align="center">图五：匹配所有Moth DD,YYYY格式的日期</p>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">新出现的“\s”符号是空白符号，匹配所有的空白字符，包括Tab字符。如果字符串正确匹配，接下来如何提取出月份部分呢？只需在月份周围加上一个圆括号创建一个组，然后用ORO API（本文后面详细讨论）提取出它的值。修改后的正则表达式如图六所示： </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<p align="center">
												<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4f.gif" border="0" />
										</p>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<p align="center">图六：匹配所有Month DD,YYYY格式的日期，定义月份值为第一个组</p>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<b>1.7 其它符号</b>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">为简便起见，你可以使用一些为常见正则表达式创建的快捷符号。如表二所示： </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">表二：常用符号 </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<p align="center">
												<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4o.jpg" border="0" />
										</p>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">例如，在前面社会安全号码的例子中，所有出现“[0-9]”的地方我们都可以使用“\d”。修改后的正则表达式如图七所示： </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<p align="center">
												<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4g.gif" border="0" />
										</p>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<p align="center">图七：匹配所有123-12-1234格式的社会安全号码</p>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<b>
												<font size="4">二、Jakarta-ORO库</font>
										</b>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">有许多源代码开放的正则表达式库可供Java程序员使用，而且它们中的许多支持Perl 5兼容的正则表达式语法。我在这里选用的是Jakarta-ORO正则表达式库，它是最全面的正则表达式API之一，而且它与Perl 5正则表达式完全兼容。另外，它也是优化得最好的API之一。 </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">Jakarta-ORO库以前叫做OROMatcher，Daniel Savarese大方地把它赠送给了Jakarta Project。你可以按照本文最后参考资源的说明下载它。 </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">我首先将简要介绍使用Jakarta-ORO库时你必须创建和访问的对象，然后介绍如何使用Jakarta-ORO API。 </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<b>▲ PatternCompiler对象</b>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">首先，创建一个Perl5Compiler类的实例，并把它赋值给PatternCompiler接口对象。Perl5Compiler是PatternCompiler接口的一个实现，允许你把正则表达式编译成用来匹配的Pattern对象。 </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_e.jpg" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<b>▲ Pattern对象</b>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">要把正则表达式编译成Pattern对象，调用compiler对象的compile()方法，并在调用参数中指定正则表达式。例如，你可以按照下面这种方式编译正则表达式“t[aeio]n”： </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_f.jpg" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">默认情况下，编译器创建一个大小写敏感的模式（pattern）。因此，上面代码编译得到的模式只匹配“tin”、“tan”、 “ten”和“ton”，但不匹配“Tin”和“taN”。要创建一个大小写不敏感的模式，你应该在调用编译器的时候指定一个额外的参数： </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_g.jpg" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">创建好Pattern对象之后，你就可以通过PatternMatcher类用该Pattern对象进行模式匹配。 </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<b>▲ PatternMatcher对象</b>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">PatternMatcher对象根据Pattern对象和字符串进行匹配检查。你要实例化一个Perl5Matcher类并把结果赋值给PatternMatcher接口。Perl5Matcher类是PatternMatcher接口的一个实现，它根据Perl 5正则表达式语法进行模式匹配： </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_h.jpg" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">使用PatternMatcher对象，你可以用多个方法进行匹配操作，这些方法的第一个参数都是需要根据正则表达式进行匹配的字符串： </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">· boolean matches(String input, Pattern pattern)：当输入字符串和正则表达式要精确匹配时使用。换句话说，正则表达式必须完整地描述输入字符串。 </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">· boolean matchesPrefix(String input, Pattern pattern)：当正则表达式匹配输入字符串起始部分时使用。 </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">· boolean contains(String input, Pattern pattern)：当正则表达式要匹配输入字符串的一部分时使用（即，它必须是一个子串）。 </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">另外，在上面三个方法调用中，你还可以用PatternMatcherInput对象作为参数替代String对象；这时，你可以从字符串中最后一次匹配的位置开始继续进行匹配。当字符串可能有多个子串匹配给定的正则表达式时，用PatternMatcherInput对象作为参数就很有用了。用PatternMatcherInput对象作为参数替代String时，上述三个方法的语法如下： </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">· boolean matches(PatternMatcherInput input, Pattern pattern) </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">· boolean matchesPrefix(PatternMatcherInput input, Pattern pattern) </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">· boolean contains(PatternMatcherInput input, Pattern pattern) </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<b>
												<font size="4">三、应用实例</font>
										</b>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">下面我们来看看Jakarta-ORO库的一些应用实例。 </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<b>3.1 日志文件处理</b>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">任务：分析一个Web服务器日志文件，确定每一个用户花在网站上的时间。在典型的BEA WebLogic日志文件中，日志记录的格式如下： </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_i.jpg" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">分析这个日志记录，可以发现，要从这个日志文件提取的内容有两项：IP地址和页面访问时间。你可以用分组符号（圆括号）从日志记录提取出IP地址和时间标记。 </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">首先我们来看看IP地址。IP地址有4个字节构成，每一个字节的值在0到255之间，各个字节通过一个句点分隔。因此，IP地址中的每一个字节有至少一个、最多三个数字。图八显示了为IP地址编写的正则表达式： </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<p align="center">
												<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4h.gif" border="0" />
										</p>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<p align="center">图八：匹配IP地址</p>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">IP地址中的句点字符必须进行转义处理（前面加上“\”），因为IP地址中的句点具有它本来的含义，而不是采用正则表达式语法中的特殊含义。句点在正则表达式中的特殊含义本文前面已经介绍。 </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">日志记录的时间部分由一对方括号包围。你可以按照如下思路提取出方括号里面的所有内容：首先搜索起始方括号字符（“[”），提取出所有不超过结束方括号字符（“]”）的内容，向前寻找直至找到结束方括号字符。图九显示了这部分的正则表达式。 </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<p align="center">
												<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4i.gif" border="0" />
										</p>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<p align="center">图九：匹配至少一个字符，直至找到“]”</p>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">现在，把上述两个正则表达式加上分组符号（圆括号）后合并成单个表达式，这样就可以从日志记录提取出IP地址和时间。注意，为了匹配“- -”（但不提取它），正则表达式中间加入了“\s-\s-\s”。完整的正则表达式如图十所示。 </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<p align="center">
												<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4j.gif" border="0" />
										</p>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<p align="center">图十：匹配IP地址和时间标记</p>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">现在正则表达式已经编写完毕，接下来可以编写使用正则表达式库的Java代码了。 </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">为使用Jakarta-ORO库，首先创建正则表达式字符串和待分析的日志记录字符串： </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_j.jpg" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">这里使用的正则表达式与图十的正则表达式差不多完全相同，但有一点例外：在Java中，你必须对每一个向前的斜杠（“\”）进行转义处理。图十不是Java的表示形式，所以我们要在每个“\”前面加上一个“\”以免出现编译错误。遗憾的是，转义处理过程很容易出现错误，所以应该小心谨慎。你可以首先输入未经转义处理的正则表达式，然后从左到右依次把每一个“\”替换成“\\”。如果要复检，你可以试着把它输出到屏幕上。 </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">初始化字符串之后，实例化PatternCompiler对象，用PatternCompiler编译正则表达式创建一个Pattern对象： </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_k.jpg" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">现在，创建PatternMatcher对象，调用PatternMatcher接口的contain()方法检查匹配情况： </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_l.jpg" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">接下来，利用PatternMatcher接口返回的MatchResult对象，输出匹配的组。由于logEntry字符串包含匹配的内容，你可以看到类如下面的输出： </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_m.jpg" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<b>3.2 HTML处理实例一</b>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">下面一个任务是分析HTML页面内FONT标记的所有属性。HTML页面内典型的FONT标记如下所示： </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<font face="Arial, Serif" color="red" size="+2">
										</font>
										<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_n.jpg" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">程序将按照如下形式，输出每一个FONT标记的属性： </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_o.jpg" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">在这种情况下，我建议你使用两个正则表达式。第一个如图十一所示，它从字体标记提取出“"face="Arial, Serif" size="+2" color="red"”。 </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<p align="center">
												<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4k.gif" border="0" />
										</p>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<p align="center">图十一：匹配FONT标记的所有属性</p>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">第二个正则表达式如图十二所示，它把各个属性分割成名字-值对。 </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<p align="center">
												<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4l.gif" border="0" />
										</p>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<p align="center">图十二：匹配单个属性，并把它分割成名字-值对</p>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">分割结果为： </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_p.jpg" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">现在我们来看看完成这个任务的Java代码。首先创建两个正则表达式字符串，用Perl5Compiler把它们编译成Pattern对象。编译正则表达式的时候，指定Perl5Compiler.CASE_INSENSITIVE_MASK选项，使得匹配操作不区分大小写。 </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">接下来，创建一个执行匹配操作的Perl5Matcher对象。 </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_q.jpg" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">假设有一个String类型的变量html，它代表了HTML文件中的一行内容。如果html字符串包含FONT标记，匹配器将返回true。此时，你可以用匹配器对象返回的MatchResult对象获得第一个组，它包含了FONT的所有属性： </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_r.jpg" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">接下来创建一个PatternMatcherInput对象。这个对象允许你从最后一次匹配的位置开始继续进行匹配操作，因此，它很适合于提取FONT标记内属性的名字-值对。创建PatternMatcherInput对象，以参数形式传入待匹配的字符串。然后，用匹配器实例提取出每一个FONT的属性。这通过指定PatternMatcherInput对象（而不是字符串对象）为参数，反复地调用PatternMatcher对象的contains()方法完成。PatternMatcherInput对象之中的每一次迭代将把它内部的指针向前移动，下一次检测将从前一次匹配位置的后面开始。 </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">本例的输出结果如下： </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_s.jpg" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<b>3.3 HTML处理实例二</b>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">下面我们来看看另一个处理HTML的例子。这一次，我们假定Web服务器从widgets.acme.com移到了newserver.acme.com。现在你要修改一些页面中的链接： </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_t.jpg" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">执行这个搜索的正则表达式如图十三所示： </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<p align="center">
												<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4m.gif" border="0" />
										</p>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<p align="center">图十三：匹配修改前的链接</p>
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">如果能够匹配这个正则表达式，你可以用下面的内容替换图十三的链接： </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<a href="http://newserver.acme.com/interface.html#$1">
										</a>
										<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_u.jpg" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">注意#字符的后面加上了$1。Perl正则表达式语法用$1、$2等表示已经匹配且提取出来的组。图十三的表达式把所有作为一个组匹配和提取出来的内容附加到链接的后面。 </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">现在，返回Java。就象前面我们所做的那样，你必须创建测试字符串，创建把正则表达式编译到Pattern对象所必需的对象，以及创建一个PatternMatcher对象：<br /><img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_v.jpg" border="0" /></td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">接下来，用com.oroinc.text.regex包Util类的substitute()静态方法进行替换，输出结果字符串： </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_w.jpg" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">Util.substitute()方法的语法如下： </td>
						</tr>
				</tbody>
		</table>
		<table height="17" width="620" align="center">
				<tbody>
						<tr>
								<td class="a14" height="13">
										<img src="http://www.ccw.com.cn/htm/app/aprog/01_7_31_4_x.jpg" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">这个调用的前两个参数是以前创建的PatternMatcher和Pattern对象。第三个参数是一个Substiution对象，它决定了替换操作如何进行。本例使用的是Perl5Substitution对象，它能够进行Perl5风格的替换。第四个参数是想要进行替换操作的字符串，最后一个参数允许指定是否替换模式的所有匹配子串（Util.SUBSTITUTE_ALL），或只替换指定的次数。 </td>
						</tr>
				</tbody>
		</table>
		<table width="620" align="center">
				<tbody>
						<tr>
								<td class="a14">
										<b>【结束语】</b>在这篇文章中，我为你介绍了正则表达式的强大功能。只要正确运用，正则表达式能够在字符串提取和文本修改中起到很大的作用。另外，我还介绍了如何在Java程序中通过Jakarta-ORO库利用正则表达式。至于最终采用老式的字符串处理方式（使用StringTokenizer，charAt，和substring），还是采用正则表达式，这就有待你自己决定了。</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/iKingQu/aggbug/75781.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iKingQu/" target="_blank">風向逆轉 - 就要爪哇</a> 2006-10-18 02:14 <a href="http://www.blogjava.net/iKingQu/articles/75781.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[收藏]J2EE 全面简介</title><link>http://www.blogjava.net/iKingQu/articles/47168.html</link><dc:creator>風向逆轉 - 就要爪哇</dc:creator><author>風向逆轉 - 就要爪哇</author><pubDate>Sat, 20 May 2006 06:16:00 GMT</pubDate><guid>http://www.blogjava.net/iKingQu/articles/47168.html</guid><wfw:comment>http://www.blogjava.net/iKingQu/comments/47168.html</wfw:comment><comments>http://www.blogjava.net/iKingQu/articles/47168.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iKingQu/comments/commentRss/47168.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iKingQu/services/trackbacks/47168.html</trackback:ping><description><![CDATA[
		<blockquote>本文从五个方面对J2EE进行了比较全面的介绍。从J2EE的概念说起，到它的优势，到J2EE典型的四层模型，和它的框架结构，最后是J2EE十三种核心技术的一个简介。本文分门别类的对J2EE中的服务，组件，层次，容器，API都做了比较详细的介绍，相信看完此文，读者会对J2EE有一个更清晰的认识。</blockquote>
		<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
		<!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters -->
		<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
		<p>
				<a name="1">
						<span class="atitle">
								<font face="Arial" size="4">J2EE的概念</font>
						</span>
				</a>
		</p>
		<p>目前，Java 2平台有3个版本，它们是适用于小型设备和智能卡的Java 2平台Micro版（Java 2 Platform Micro Edition，J2ME）、适用于桌面系统的Java 2平台标准版（Java 2 Platform Standard Edition，J2SE）、适用于创建服务器应用程序和服务的Java 2平台企业版（Java 2 Platform Enterprise Edition，J2EE）。</p>
		<p>J2EE是一种利用Java 2平台来简化企业解决方案的开发、部署和管理相关的复杂问题的体系结构。J2EE技术的基础就是核心Java平台或Java 2平台的标准版，J2EE不仅巩固了标准版中的许多优点，例如"编写一次、随处运行"的特性、方便存取数据库的JDBC API、CORBA技术以及能够在Internet应用中保护数据的安全模式等等，同时还提供了对 EJB（Enterprise JavaBeans）、Java Servlets API、JSP（Java Server Pages）以及XML技术的全面支持。其最终目的就是成为一个能够使企业开发者大幅缩短投放市场时间的体系结构。</p>
		<p>J2EE体系结构提供中间层集成框架用来满足无需太多费用而又需要高可用性、高可靠性以及可扩展性的应用的需求。通过提供统一的开发平台，J2EE降低了开发多层应用的费用和复杂性，同时提供对现有应用程序集成强有力支持，完全支持Enterprise JavaBeans，有良好的向导支持打包和部署应用，添加目录支持，增强了安全机制，提高了性能。</p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/java/j2ee/index.html#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>
				<a name="2">
						<span class="atitle">
								<font face="Arial" size="4">J2EE的优势</font>
						</span>
				</a>
		</p>
		<p>J2EE为搭建具有可伸缩性、灵活性、易维护性的商务系统提供了良好的机制:</p>
		<ol>
				<li>保留现存的IT资产: 由于企业必须适应新的商业需求，利用已有的企业信息系统方面的投资，而不是重新制定全盘方案就变得很重要。这样，一个以渐进的（而不是激进的，全盘否定的）方式建立在已有系统之上的服务器端平台机制是公司所需求的。J2EE架构可以充分利用用户原有的投资，如一些公司使用的BEA Tuxedo、IBM CICS, IBM Encina,、Inprise VisiBroker 以及Netscape Application Server。这之所以成为可能是因为J2EE拥有广泛的业界支持和一些重要的'企业计算'领域供应商的参与。每一个供应商都对现有的客户提供了不用废弃已有投资，进入可移植的J2EE领域的升级途径。由于基于J2EE平台的产品几乎能够在任何操作系统和硬件配置上运行，现有的操作系统和硬件也能被保留使用。 
</li>
				<li>高效的开发: J2EE允许公司把一些通用的、很繁琐的服务端任务交给中间件供应商去完成。这样开发人员可以集中精力在如何创建商业逻辑上，相应地缩短了开发时间。高级中间件供应商提供以下这些复杂的中间件服务: 
<ul><li>状态管理服务 -- 让开发人员写更少的代码，不用关心如何管理状态，这样能够更快地完成程序开发。 
</li><li>持续性服务 -- 让开发人员不用对数据访问逻辑进行编码就能编写应用程序，能生成更轻巧，与数据库无关的应用程序，这种应用程序更易于开发与维护。 
</li><li>分布式共享数据对象CACHE服务 -- 让开发人员编制高性能的系统，极大提高整体部署的伸缩性。 </li></ul></li>
				<li>支持异构环境: J2EE能够开发部署在异构环境中的可移植程序。基于J2EE的应用程序不依赖任何特定操作系统、中间件、硬件。因此设计合理的基于J2EE的程序只需开发一次就可部署到各种平台。这在典型的异构企业计算环境中是十分关键的。J2EE标准也允许客户订购与J2EE兼容的第三方的现成的组件，把他们部署到异构环境中，节省了由自己制订整个方案所需的费用。 
</li>
				<li>可伸缩性: 企业必须要选择一种服务器端平台，这种平台应能提供极佳的可伸缩性去满足那些在他们系统上进行商业运作的大批新客户。基于J2EE平台的应用程序可被部署到各种操作系统上。例如可被部署到高端UNIX与大型机系统，这种系统单机可支持64至256个处理器。（这是NT服务器所望尘莫及的）J2EE领域的供应商提供了更为广泛的负载平衡策略。能消除系统中的瓶颈，允许多台服务器集成部署。这种部署可达数千个处理器，实现可高度伸缩的系统，满足未来商业应用的需要。 
</li>
				<li>稳定的可用性: 一个服务器端平台必须能全天候运转以满足公司客户、合作伙伴的需要。因为INTERNET是全球化的、无处不在的，即使在夜间按计划停机也可能造成严重损失。若是意外停机，那会有灾难性后果。J2EE部署到可靠的操作环境中，他们支持长期的可用性。一些J2EE部署在WINDOWS环境中，客户也可选择健壮性能更好的操作系统如Sun Solaris、IBM OS/390。最健壮的操作系统可达到99.999%的可用性或每年只需5分钟停机时间。这是实时性很强商业系统理想的选择。 </li>
		</ol>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/java/j2ee/index.html#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>
				<a name="3">
						<span class="atitle">
								<font face="Arial" size="4">J2EE 的四层模型</font>
						</span>
				</a>
		</p>
		<p>J2EE使用多层的分布式应用模型，应用逻辑按功能划分为组件，各个应用组件根据他们所在的层分布在不同的机器上。事实上，sun设计J2EE的初衷正是为了解决两层模式(client/server)的弊端，在传统模式中，客户端担当了过多的角色而显得臃肿，在这种模式中，第一次部署的时候比较容易，但难于升级或改进，可伸展性也不理想，而且经常基于某种专有的协议�D�D通常是某种数据库协议。它使得重用业务逻辑和界面逻辑非常困难。现在J2EE 的多层企业级应用模型将两层化模型中的不同层面切分成许多层。一个多层化应用能够为不同的每种服务提供一个独立的层，以下是 J2EE 典型的四层结构:</p>
		<ul>
				<li>运行在客户端机器上的客户层组件 
</li>
				<li>运行在J2EE服务器上的Web层组件 
</li>
				<li>运行在J2EE服务器上的业务逻辑层组件 
</li>
				<li>运行在EIS服务器上的企业信息系统(Enterprise information system)层软件 </li>
		</ul>
		<br />
		<img height="293" alt="" src="http://www-128.ibm.com/developerworks/cn/java/j2ee/fig1.gif" width="489" />
		<br />
		<p>
				<b>J2EE应用程序组件</b>
				<br />J2EE应用程序是由组件构成的.J2EE组件是具有独立功能的软件单元，它们通过相关的类和文件组装成J2EE应用程序，并与其他组件交互。J2EE说明书中定义了以下的J2EE组件: </p>
		<ul>
				<li>应用客户端程序和applets是客户层组件. 
</li>
				<li>Java Servlet和JavaServer Pages(JSP)是web层组件. 
</li>
				<li>Enterprise JavaBeans(EJB)是业务层组件. </li>
		</ul>
		<br />
		<p>
				<b>客户层组件</b>
				<br />J2EE应用程序可以是基于web方式的,也可以是基于传统方式的. </p>
		<p>
				<b>web 层组件</b>
				<br />J2EE web层组件可以是JSP 页面或Servlets.按照J2EE规范，静态的HTML页面和Applets不算是web层组件。 </p>
		<p>正如下图所示的客户层那样，web层可能包含某些 JavaBean 对象来处理用户输入，并把输入发送给运行在业务层上的enterprise bean 来进行处理。</p>
		<br />
		<img height="216" alt="" src="http://www-128.ibm.com/developerworks/cn/java/j2ee/fig2.gif" width="504" />
		<br />
		<p>
				<b>业务层组件</b>
				<br />业务层代码的逻辑用来满足银行，零售，金融等特殊商务领域的需要,由运行在业务层上的enterprise bean 进行处理. 下图表明了一个enterprise bean 是如何从客户端程序接收数据，进行处理(如果必要的话), 并发送到EIS 层储存的，这个过程也可以逆向进行。 </p>
		<p>有三种企业级的bean: 会话(session) beans, 实体(entity) beans, 和消息驱动(message-driven) beans. 会话bean 表示与客户端程序的临时交互. 当客户端程序执行完后, 会话bean 和相关数据就会消失. 相反, 实体bean 表示数据库的表中一行永久的记录. 当客户端程序中止或服务器关闭时, 就会有潜在的服务保证实体bean 的数据得以保存.消息驱动 bean 结合了会话bean 和 JMS的消息监听器的特性, 允许一个业务层组件异步接收JMS 消息.</p>
		<br />
		<img height="197" alt="" src="http://www-128.ibm.com/developerworks/cn/java/j2ee/fig3.gif" width="504" />
		<br />
		<p>
				<b>企业信息系统层</b>
				<br />企业信息系统层处理企业信息系统软件包括企业基础建设系统例如企业资源计划 (ERP), 大型机事务处理, 数据库系统,和其它的遗留信息系统. 例如，J2EE 应用组件可能为了数据库连接需要访问企业信息系统 </p>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>
				<a name="4">
						<span class="atitle">
								<font face="Arial" size="4">J2EE 的结构</font>
						</span>
				</a>
		</p>
		<p>这种基于组件，具有平台无关性的J2EE 结构使得J2EE 程序的编写十分简单，因为业务逻辑被封装成可复用的组件，并且J2EE 服务器以容器的形式为所有的组件类型提供后台服务. 因为你不用自己开发这种服务, 所以你可以集中精力解决手头的业务问题.</p>
		<p>
				<b>容器和服务</b>
				<br />容器设置定制了J2EE服务器所提供得内在支持，包括安全，事务管理，JNDI(Java Naming and Directory Interface)寻址,远程连接等服务，以下列出最重要的几种服务： </p>
		<ul>
				<li>J2EE安全(Security)模型可以让你配置 web 组件或enterprise bean ,这样只有被授权的用户才能访问系统资源. 每一客户属于一个特别的角色，而每个角色只允许激活特定的方法。你应在enterprise bean的布置描述中声明角色和可被激活的方法。由于这种声明性的方法，你不必编写加强安全性的规则。 
</li>
				<li>J2EE 事务管理（Transaction Management）模型让你指定组成一个事务中所有方法间的关系，这样一个事务中的所有方法被当成一个单一的单元. 当客户端激活一个enterprise bean中的方法，容器介入一管理事务。因有容器管理事务，在enterprise bean中不必对事务的边界进行编码。要求控制分布式事务的代码会非常复杂。你只需在布置描述文件中声明enterprise bean的事务属性，而不用编写并调试复杂的代码。容器将读此文件并为你处理此enterprise bean的事务。 
</li>
				<li>JNDI 寻址(JNDI Lookup)服务向企业内的多重名字和目录服务提供了一个统一的接口,这样应用程序组件可以访问名字和目录服务. 
</li>
				<li>J2EE远程连接（Remote Client Connectivity）模型管理客户端和enterprise bean间的低层交互. 当一个enterprise bean创建后, 一个客户端可以调用它的方法就象它和客户端位于同一虚拟机上一样. 
</li>
				<li>生存周期管理（Life Cycle Management）模型管理enterprise bean的创建和移除,一个enterprise bean在其生存周期中将会历经几种状态。容器创建enterprise bean，并在可用实例池与活动状态中移动他，而最终将其从容器中移除。即使可以调用enterprise bean的create及remove方法，容器也将会在后台执行这些任务。 
</li>
				<li>数据库连接池（Database Connection Pooling）模型是一个有价值的资源。获取数据库连接是一项耗时的工作，而且连接数非常有限。容器通过管理连接池来缓和这些问题。enterprise bean可从池中迅速获取连接。在bean释放连接之可为其他bean使用。 </li>
		</ul>
		<br />
		<p>
				<b>容器类型</b>
				<br />J2EE应用组件可以安装部署到以下几种容器中去: </p>
		<ul>
				<li>EJB 容器管理所有J2EE 应用程序中企业级bean 的执行. enterprise bean 和它们的容器运行在J2EE 服务器上. 
</li>
				<li>Web 容器管理所有J2EE 应用程序中JSP页面和Servlet组件的执行. Web 组件和它们的容器运行在J2EE 服务器上. 
</li>
				<li>应用程序客户端容器管理所有J2EE应用程序中应用程序客户端组件的执行. 应用程序客户端和它们的容器运行在J2EE 服务器上. 
</li>
				<li>Applet 容器是运行在客户端机器上的web浏览器和 Java 插件的结合. </li>
		</ul>
		<br />
		<img height="280" alt="" src="http://www-128.ibm.com/developerworks/cn/java/j2ee/fig4.gif" width="504" />
		<br />
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/java/j2ee/index.html#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>
				<a name="5">
						<span class="atitle">
								<font face="Arial" size="4">J2EE的核心API与组件</font>
						</span>
				</a>
		</p>
		<p>J2EE平台由一整套服务（Services）、应用程序接口（APIs）和协议构成，它对开发基于Web的多层应用提供了功能支持，下面对J2EE中的13种技术规范进行简单的描述(限于篇幅，这里只能进行简单的描述):</p>
		<ol>
				<li>JDBC(Java Database Connectivity): JDBC API为访问不同的数据库提供了一种统一的途径，象ODBC一样，JDBC对开发者屏蔽了一些细节问题，另外，JDCB对数据库的访问也具有平台无关性。 
</li>
				<li>JNDI(Java Name and Directory Interface): JNDI API被用于执行名字和目录服务。它提供了一致的模型来存取和操作企业级的资源如DNS和LDAP，本地文件系统，或应用服务器中的对象。 
</li>
				<li>EJB(Enterprise JavaBean): J2EE技术之所以赢得某体广泛重视的原因之一就是EJB。它们提供了一个框架来开发和实施分布式商务逻辑，由此很显著地简化了具有可伸缩性和高度复杂的企业级应用的开发。EJB规范定义了EJB组件在何时如何与它们的容器进行交互作用。容器负责提供公用的服务，例如目录服务、事务管理、安全性、资源缓冲池以及容错性。但这里值得注意的是，EJB并不是实现J2EE的唯一途径。正是由于J2EE的开放性，使得有的厂商能够以一种和EJB平行的方式来达到同样的目的。 
</li>
				<li>RMI(Remote Method Invoke): 正如其名字所表示的那样，RMI协议调用远程对象上方法。它使用了序列化方式在客户端和服务器端传递数据。RMI是一种被EJB使用的更底层的协议。 
</li>
				<li>Java IDL/CORBA: 在Java IDL的支持下，开发人员可以将Java和CORBA集成在一起。他们可以创建Java对象并使之可在CORBA ORB中展开, 或者他们还可以创建Java类并作为和其它ORB一起展开的CORBA对象的客户。后一种方法提供了另外一种途径，通过它Java可以被用于将你的新的应用和旧的系统相集成。 
</li>
				<li>JSP(Java Server Pages): JSP页面由HTML代码和嵌入其中的Java代码所组成。服务器在页面被客户端所请求以后对这些Java代码进行处理，然后将生成的HTML页面返回给客户端的浏览器。 
</li>
				<li>Java Servlet: Servlet是一种小型的Java程序，它扩展了Web服务器的功能。作为一种服务器端的应用，当被请求时开始执行，这和CGI Perl脚本很相似。Servlet提供的功能大多与JSP类似，不过实现的方式不同。JSP通常是大多数HTML代码中嵌入少量的Java代码，而servlets全部由Java写成并且生成HTML。 
</li>
				<li>XML(Extensible Markup Language): XML是一种可以用来定义其它标记语言的语言。它被用来在不同的商务过程中共享数据。XML的发展和Java是相互独立的，但是，它和Java具有的相同目标正是平台独立性。通过将Java和XML的组合，您可以得到一个完美的具有平台独立性的解决方案。 
</li>
				<li>JMS(Java Message Service): MS是用于和面向消息的中间件相互通信的应用程序接口(API)。它既支持点对点的域，有支持发布/订阅(publish/subscribe)类型的域，并且提供对下列类型的支持：经认可的消息传递,事务型消息的传递，一致性消息和具有持久性的订阅者支持。JMS还提供了另一种方式来对您的应用与旧的后台系统相集成。 
</li>
				<li>JTA(Java Transaction Architecture): JTA定义了一种标准的API，应用系统由此可以访问各种事务监控。 
</li>
				<li>JTS(Java Transaction Service): JTS是CORBA OTS事务监控的基本的实现。JTS规定了事务管理器的实现方式。该事务管理器是在高层支持Java Transaction API (JTA)规范，并且在较底层实现OMG OTS specification的Java映像。JTS事务管理器为应用服务器、资源管理器、独立的应用以及通信资源管理器提供了事务服务。 
</li>
				<li>JavaMail: JavaMail是用于存取邮件服务器的API，它提供了一套邮件服务器的抽象类。不仅支持SMTP服务器，也支持IMAP服务器。 
</li>
				<li>JTA(JavaBeans Activation Framework): JavaMail利用JAF来处理MIME编码的邮件附件。MIME的字节流可以被转换成Java对象，或者转换自Java对象。大多数应用都可以不需要直接使用JAF。 </li>
		</ol>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																		<br />
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/java/j2ee/index.html#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>
				<a name="resources">
						<span class="atitle">
								<font face="Arial" size="4">参考资料 </font>
						</span>
				</a>
		</p>
		<ul>
				<li>《Develop n-tier application using J2EE》- Steven Gould<br /></li>
				<li>《The Business Benefits of EJB and J2EE Technologies over COM+ and Windows DNA》<br /></li>
				<li>《The J2EE Tutorial》chapter overview - Monica Pawlan<br /></li>
				<li>本文所用图片由《The J2EE Tutorial》中的英文图片修改而成.<br /></li>
		</ul>
		<br />
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td>
										<img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										<br />
										<img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" />
								</td>
						</tr>
				</tbody>
		</table>
		<table class="no-print" cellspacing="0" cellpadding="0" align="right">
				<tbody>
						<tr align="right">
								<td>
										<img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										<br />
										<table cellspacing="0" cellpadding="0" border="0">
												<tbody>
														<tr>
																<td valign="center">
																</td>
																<td valign="top" align="right">
																		<a class="fbox" href="http://www-128.ibm.com/developerworks/cn/java/j2ee/index.html#main">
																				<b>
																						<font color="#996699">
																						</font>
																				</b>
																		</a>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<br />
		<p>
				<a name="author">
						<span class="atitle">
								<font face="Arial" size="4">关于作者</font>
						</span>
				</a>
		</p>
		<table cellspacing="0" cellpadding="0" width="100%" border="0">
				<tbody>
						<tr>
								<td colspan="3">
										<font face="Arial" size="4">
												<img height="5" alt="" src="http://www.ibm.com/i/c.gif" width="100%" />
										</font>
								</td>
						</tr>
						<tr valign="top" align="left">
								<td>
										<p>
												<font face="Arial" size="4">
												</font>
										</p>
								</td>
								<td>
										<font face="Arial" size="4">
												<img height="5" alt="" src="http://www.ibm.com/i/c.gif" width="4" />
										</font>
								</td>
								<td width="100%">
										<p>刘湛,武汉大学信息与计算科学系学士，熟悉 Java 语言和 J2EE 思想，国内多个 Java 论坛版主，现致力于 J2EE 平台上的 eCRM 套件开发。你可以通过 <a href="mailto:jeru@163.net"><font color="#5c81a7">jeru@163.net</font></a>与他联系！ <br /><br />      原文地址：<a href="http://www-128.ibm.com/developerworks/cn/java/j2ee/index.html">http://www-128.ibm.com/developerworks/cn/java/j2ee/index.html</a></p>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/iKingQu/aggbug/47168.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iKingQu/" target="_blank">風向逆轉 - 就要爪哇</a> 2006-05-20 14:16 <a href="http://www.blogjava.net/iKingQu/articles/47168.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[收藏]关于composition(复合)</title><link>http://www.blogjava.net/iKingQu/articles/39687.html</link><dc:creator>風向逆轉 - 就要爪哇</dc:creator><author>風向逆轉 - 就要爪哇</author><pubDate>Thu, 06 Apr 2006 14:30:00 GMT</pubDate><guid>http://www.blogjava.net/iKingQu/articles/39687.html</guid><wfw:comment>http://www.blogjava.net/iKingQu/comments/39687.html</wfw:comment><comments>http://www.blogjava.net/iKingQu/articles/39687.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iKingQu/comments/commentRss/39687.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iKingQu/services/trackbacks/39687.html</trackback:ping><description><![CDATA[composition（复合）是在一个类型的对象包含另一个类型的对象时，类型之间的关系。<br />例如：<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img id="Codehighlighter1_14_20_Open_Image" onclick="this.style.display='none'; Codehighlighter1_14_20_Open_Text.style.display='none'; Codehighlighter1_14_20_Closed_Image.style.display='inline'; Codehighlighter1_14_20_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_14_20_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_14_20_Closed_Text.style.display='none'; Codehighlighter1_14_20_Open_Image.style.display='inline'; Codehighlighter1_14_20_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> Address </span><span id="Codehighlighter1_14_20_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_14_20_Open_Text"><span style="COLOR: #000000">{ <img src="http://www.blogjava.net/images/dot.gif" /> }</span></span><span style="COLOR: #000000">; </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> where someone lives</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_65_71_Open_Image" onclick="this.style.display='none'; Codehighlighter1_65_71_Open_Text.style.display='none'; Codehighlighter1_65_71_Closed_Image.style.display='inline'; Codehighlighter1_65_71_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_65_71_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_65_71_Closed_Text.style.display='none'; Codehighlighter1_65_71_Open_Image.style.display='inline'; Codehighlighter1_65_71_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> PhoneNumber </span><span id="Codehighlighter1_65_71_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_65_71_Open_Text"><span style="COLOR: #000000">{ <img src="http://www.blogjava.net/images/dot.gif" /> }</span></span><span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img id="Codehighlighter1_88_252_Open_Image" onclick="this.style.display='none'; Codehighlighter1_88_252_Open_Text.style.display='none'; Codehighlighter1_88_252_Closed_Image.style.display='inline'; Codehighlighter1_88_252_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_88_252_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_88_252_Closed_Text.style.display='none'; Codehighlighter1_88_252_Open_Image.style.display='inline'; Codehighlighter1_88_252_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> Person </span><span id="Codehighlighter1_88_252_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_88_252_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />　</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />　<img src="http://www.blogjava.net/images/dot.gif" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />　</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">:<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />　　std::string name; </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> composed object</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">　　Address address; </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> ditto</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">　　PhoneNumber voiceNumber; </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> ditto</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">　　PhoneNumber faxNumber; </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> ditto</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /></span><span style="COLOR: #000000">}</span></span><span style="COLOR: #000000">;</span></div>composition（复合）有两个含意。composition（复合）既意味着 "has-a"（有一个），又意味着 "is-implemented-in-terms-of"（是根据……实现的）。这是因为你要在你的软件中处理两个不同的领域。你程序中的一些 objects对应你所模拟的世界里的东西，例如，people,vehicles,video frames等等。这样的 objects是 application domain（应用领域）的部分。另外的 objects纯粹是 implementation artifacts（实现的产物），例如，buffers（<a class="bluekey" href="http://www.yesky.com/key/2284/582284.html" target="_blank">缓冲区</a>），mutexes（互斥体），search trees（搜索树）等等。这些各类 objects定义应你的软件的 implementation domain（实现领域）。当 composition（复合）发生在 application domain（应用领域）的 objects之间，它表达一个 has-a（有一个）的关系，当它发生在 implementation domain（实现领域），它表达一个 is-implemented-in-terms-of（是根据……实现的）的关系<br /><img src ="http://www.blogjava.net/iKingQu/aggbug/39687.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iKingQu/" target="_blank">風向逆轉 - 就要爪哇</a> 2006-04-06 22:30 <a href="http://www.blogjava.net/iKingQu/articles/39687.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[收藏]谈select列表框</title><link>http://www.blogjava.net/iKingQu/articles/39684.html</link><dc:creator>風向逆轉 - 就要爪哇</dc:creator><author>風向逆轉 - 就要爪哇</author><pubDate>Thu, 06 Apr 2006 14:13:00 GMT</pubDate><guid>http://www.blogjava.net/iKingQu/articles/39684.html</guid><wfw:comment>http://www.blogjava.net/iKingQu/comments/39684.html</wfw:comment><comments>http://www.blogjava.net/iKingQu/articles/39684.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iKingQu/comments/commentRss/39684.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iKingQu/services/trackbacks/39684.html</trackback:ping><description><![CDATA[
		<div class="postText">
				<p>在JSP中用到select列表框就如家常便饭般的常见!<br />以下是我在JSP页面中对此的一些心得(通常会用到Struts+Hebernate+Spring):<br />我想大概有以下几种方法可以在JSP中得到我们想要的select列表框<br />1:通过使用HTML中使用普通的select定义<br /></p>
				<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						<span style="COLOR: #000000">&lt;</span>
						<span style="COLOR: #000000">select name</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">select</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">&gt;</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
						<span style="COLOR: #000000">&lt;</span>
						<span style="COLOR: #000000">option value</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">1</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">&gt;</span>
						<span style="COLOR: #000000">aa</span>
						<span style="COLOR: #000000">&lt;/</span>
						<span style="COLOR: #000000">option</span>
						<span style="COLOR: #000000">&gt;</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
						<span style="COLOR: #000000">&lt;</span>
						<span style="COLOR: #000000">option value</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">2</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">&gt;</span>
						<span style="COLOR: #000000">bb</span>
						<span style="COLOR: #000000">&lt;/</span>
						<span style="COLOR: #000000">option</span>
						<span style="COLOR: #000000">&gt;</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
						<span style="COLOR: #000000">&lt;</span>
						<span style="COLOR: #000000">option value</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">3</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">&gt;</span>
						<span style="COLOR: #000000">cc</span>
						<span style="COLOR: #000000">&lt;/</span>
						<span style="COLOR: #000000">option</span>
						<span style="COLOR: #000000">&gt;</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						</span>
						<span style="COLOR: #000000">&lt;/</span>
						<span style="COLOR: #000000">select</span>
						<span style="COLOR: #000000">&gt;</span>
				</div>
				<p>当然这样可以实现,但是一旦用到相关的DB操作时,代码中的业务,持久化,显示处理各部分的代码就会全部混到一起.<br /><br />2:通过Struts的logic标签<br /></p>
				<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						<span style="COLOR: #000000">&lt;</span>
						<span style="COLOR: #000000">logic:iterate id</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">types</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000"> name</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">cglist</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000"> type</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">com.jbbis.netedu.common.dto.BaseCategoryDTO</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">&gt;</span>
						<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />                       </span>
						<span style="COLOR: #000000">&lt;</span>
						<span style="COLOR: #000000">option value</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">'</span>
						<span style="COLOR: #000000">&lt;bean:write name="types" property="id"/&gt;</span>
						<span style="COLOR: #000000">'</span>
						<span style="COLOR: #000000">&gt;</span>
						<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />                      </span>
						<span style="COLOR: #000000">&lt;</span>
						<span style="COLOR: #000000">bean:write name</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">types</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000"> property</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">name</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">/&gt;</span>
						<span style="COLOR: #000000"> <br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />                      </span>
						<span style="COLOR: #000000">&lt;/</span>
						<span style="COLOR: #000000">option</span>
						<span style="COLOR: #000000">&gt;</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />       </span>
						<span style="COLOR: #000000">&lt;/</span>
						<span style="COLOR: #000000">logic:iterate</span>
						<span style="COLOR: #000000">&gt;</span>
						<span style="COLOR: #000000"> </span>
				</div>
				<p>其中types代表了存放集合数据的一个句柄,在option中用到它.type是指你集合中的对象.在下面的option中的一些属性值实际上就是指此对象中的字段.比如说property="id", property="name".logic:iterate中的name属性一般是从session,request中得到的,所以对于cglist,很可能在你的action中,有如下的代码:<br /></p>
				<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						<span style="COLOR: #000000">request.setAttribute(</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">cglist</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">,categorys);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />or<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />session.setAttribute(</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">cglist</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">,categorys);</span>
				</div>
				<p>然后就是将其在bean:write标签中输出来.这种方法相比前一种对于DB操作显然要方便,但是假如要在select中加入一些JS的话就比较麻烦了,比如要保存它上次的选择,用JS来实现显得有些麻烦!<br /><br />3:通过Struts的html:select标签,将此标签内置于html:form内(个人认为,最大的好处莫过于它可以自动保存上次的记录了!).<br /></p>
				<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
						<span style="COLOR: #000000">&lt;</span>
						<span style="COLOR: #000000">html:select property</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">typeId</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000"> onchange</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">gotothenews(this.value)</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">&gt;</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />                    </span>
						<span style="COLOR: #000000">&lt;</span>
						<span style="COLOR: #000000">html:optionsCollection property</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">typeIds</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000"> label</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">name</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000"> value</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">id</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">/&gt;</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />    </span>
						<span style="COLOR: #000000">&lt;/</span>
						<span style="COLOR: #000000">html:select</span>
						<span style="COLOR: #000000">&gt;</span>
				</div>
				<br />typeId为你Struts的ActionForm中对应的一个属性,typeIds为ActionForm中的一个对象数组.name,id均为此数组中对象的属性.lable在optionsCollection表示在select中要显示的内容,value则表示其对应的值.<br />要注意的是此对象数组记得要全部初始化,比如说你定义的此对象数组若长度为7而你只实例化了6个,则会出现类似<br /><font color="#ff0000">org.apache.jasper.JasperException: No bean specified<br /></font>的异常!<br />此方法不但对DB操作方便,而且在对保存记录方面也做得不错呢.在Struts中JSP页面中使用JS时,还老是出现一些意想不到的错误(不知道为什么).<br /><br />下次遇到了好的对策再贴上来...... </div>
<img src ="http://www.blogjava.net/iKingQu/aggbug/39684.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iKingQu/" target="_blank">風向逆轉 - 就要爪哇</a> 2006-04-06 22:13 <a href="http://www.blogjava.net/iKingQu/articles/39684.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[收藏]瞎掰开源派系</title><link>http://www.blogjava.net/iKingQu/articles/39561.html</link><dc:creator>風向逆轉 - 就要爪哇</dc:creator><author>風向逆轉 - 就要爪哇</author><pubDate>Thu, 06 Apr 2006 04:54:00 GMT</pubDate><guid>http://www.blogjava.net/iKingQu/articles/39561.html</guid><wfw:comment>http://www.blogjava.net/iKingQu/comments/39561.html</wfw:comment><comments>http://www.blogjava.net/iKingQu/articles/39561.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iKingQu/comments/commentRss/39561.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iKingQu/services/trackbacks/39561.html</trackback:ping><description><![CDATA[原文转自：javaeye<br /><br /><h3><a name="Java%E5%BC%80%E6%BA%90%E8%BD%AF%E4%BB%B6%E5%85%AD%E5%A4%A7%E5%B8%AE%E6%B4%BE-%E4%B8%90%E5%B8%AEApacheSoftwareFoundation"></a>丐帮 - Apache Software Foundation</h3><p>在我开始学习Java的时候，Apache的Jakarta子项目还很弱小，Apache的头牌是Apache HTTPD Server(至今也还是头牌)，如今已经成了江湖第一大帮。Apache势力庞大，背后有众多大厂商的支持，例如IBM资助了apache的好几个 project，Sun则和tomcat合作密切，而BEA砸下重资在Beehive上面。有了官府的支持，Apache理所当然了成了第一大帮。不过 Apache的问题就是组织成员太复杂了，旗下各个project来自三山五岳，良莠不齐，甚至各个门下子弟还经常发生冲突，漫无纪律。例如ant是构建工具头牌，Maven又要抢山头；OJB是持久层头牌，但是Torque还不肯让位，他两位还没有把座次安排好，iBATIS也要加入丐帮......</p><p>对于这样一个没有组织纪律，自己内部互相冲突的丐帮来说，我已经不存什么好感了，除了丐帮还时不时有几个优秀的弟子，例如log4j，ant，common，他注定永远不能成为武林盟主。</p><h3><a name="Java%E5%BC%80%E6%BA%90%E8%BD%AF%E4%BB%B6%E5%85%AD%E5%A4%A7%E5%B8%AE%E6%B4%BE-%E5%B0%91%E6%9E%97EclipseFoundation"></a>少林 - Eclipse Foundation</h3><p>Eclipse来头不小，直接来自IBM，并且已经得到业界众多厂商的支持，由于有官府的大力支持，Eclipse成为武林盟主的可能性很大。 Eclipse下属的各个子项目也都身怀绝技，SWT，EMF，GEF，RCP，SDO，每个都是独当一面的好手。最关键的是Eclipse是WSAD的基础，IBM很多开发人员直接为Eclipse开发，这意味着帮派和官府的直接勾结，待到IBM把Rose XDE的功能放入Eclipse，号令天下也是指日可待。</p><h3><a name="Java%E5%BC%80%E6%BA%90%E8%BD%AF%E4%BB%B6%E5%85%AD%E5%A4%A7%E5%B8%AE%E6%B4%BE-%E6%AD%A6%E5%BD%93JBossInc"></a>武当 - JBoss Inc</h3><p>JBoss来自草莽，没有丐帮的人多势众，没有少林的官府支持，然而经过自身的努力，已经跻身江湖顶级帮派行列，并且具备了很大的发言权。 JBoss的特点是武功自成一派，旗下每个子项目都具备非常强悍的实力，但是各个子项目又可以组成一个有机的整体，组成一个阵势，发挥意想不到的威力。其中JBoss的独门武功－Hibernate则是威力最大的杀手锏，凭借这一功夫，JBoss虽然不算很大，但是已经成为了Java企业界的巨头之一，能够以自己的声音影响整个武林。</p><h3><a name="Java%E5%BC%80%E6%BA%90%E8%BD%AF%E4%BB%B6%E5%85%AD%E5%A4%A7%E5%B8%AE%E6%B4%BE-%E5%B3%A8%E5%B5%8BOpensymphony"></a>峨嵋 - Opensymphony</h3><p>opensymphony不能跟上述三大帮派相比，但是她独具特色，门下弟子不多，但是各个都有绝活，因此在武林当中也站稳了脚跟。例如Webwork成为了下一代MVC框架Struts Ti的核心，OSCache是颇受欢迎的Cache产品，Quartz则是很有名的Java Job软件，Sitemesh也是一款灵巧易用的软件。所有这些虽然都不算重量级武功，但是都独当一面，在整个武林都独树一帜，令人侧目。</p><h3><a name="Java%E5%BC%80%E6%BA%90%E8%BD%AF%E4%BB%B6%E5%85%AD%E5%A4%A7%E5%B8%AE%E6%B4%BE-%E9%80%8D%E9%81%A5%E6%B4%BEcodehaus"></a>逍遥派 - codehaus</h3><p>codehaus下面的Groovy, DamageControl, XStream, Nano, Pico, AspectWerkz武功都是犹如凌波微步般, 既实用又优雅，并且该组织背后有有ThoughWorks这样一个技术至上的咨询公司撑腰，所以它的武功都是讲究敏捷，优雅，易用，于繁重的开发工作中体味出一丝丝悠闲的乐趣，真正符合了逍遥的意境。</p><h3><a name="Java%E5%BC%80%E6%BA%90%E8%BD%AF%E4%BB%B6%E5%85%AD%E5%A4%A7%E5%B8%AE%E6%B4%BE-%E6%98%86%E4%BB%91objectweb"></a>昆仑 - objectweb</h3><p>objectweb僻处法国，远离IT全球中心，就好像昆仑远处西域一样。因而objectweb也和中原武学有很大的不同，剑走偏锋。例如objectweb的项目偏重于cluster和分布式方面的支持，例如c-jdbc，rmi-jdbc，Perseus，XAPool等等。正是因为他的剑走偏锋，才使得他不那么知名于中原武林，也正是因为剑走偏锋，才使得他独树一帜，保持了自己独有的特色。<br /></p><img src ="http://www.blogjava.net/iKingQu/aggbug/39561.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iKingQu/" target="_blank">風向逆轉 - 就要爪哇</a> 2006-04-06 12:54 <a href="http://www.blogjava.net/iKingQu/articles/39561.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[收藏]dom4j(Version 1.6.1)快速入门</title><link>http://www.blogjava.net/iKingQu/articles/39350.html</link><dc:creator>風向逆轉 - 就要爪哇</dc:creator><author>風向逆轉 - 就要爪哇</author><pubDate>Wed, 05 Apr 2006 04:35:00 GMT</pubDate><guid>http://www.blogjava.net/iKingQu/articles/39350.html</guid><wfw:comment>http://www.blogjava.net/iKingQu/comments/39350.html</wfw:comment><comments>http://www.blogjava.net/iKingQu/articles/39350.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iKingQu/comments/commentRss/39350.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iKingQu/services/trackbacks/39350.html</trackback:ping><description><![CDATA[
		<div class="postTitle">Parsing XML</div>
		<br />    或许你想要做的第一件事情就是解析一个某种类型的XML文档，用dom4j很容易做到。请看下面的示范代码：<br /><br />import java.net.URL;<br /><br />import org.dom4j.Document;<br />import org.dom4j.DocumentException;<br />import org.dom4j.io.SAXReader;<br /><br />public class Foo {<br /><br />    public Document parse(URL url) throws DocumentException {<br />        SAXReader reader = new SAXReader();<br />        Document document = reader.read(url);<br />        return document;<br />    }<br />}<br /><br /><h4>使用迭代器（Iterators）</h4><br />    我们可以通过多种方法来操作XML文档，这些方法返回java里标准的迭代器（Iterators）。例如：<br /><br />public void bar(Document document) throws DocumentException {<br />        Element root = document.getRootElement();<br />        //迭代根元素下面的所有子元素<br />        for ( Iterator i = root.elementIterator(); i.hasNext(); ) {<br />            Element element = (Element) i.next();<br />            //处理代码<br />        }<br /><br />        //迭代根元素下面名称为"foo"的子元素<br />        for ( Iterator i = root.elementIterator( "foo" ); i.hasNext(); ) {<br />            Element foo = (Element) i.next();<br />            //处理代码<br />        }<br /><br />        // 迭代根元素的属性attributes）元素<br />        for ( Iterator i = root.attributeIterator(); i.hasNext(); ) {<br />            Attribute attribute = (Attribute) i.next();<br />            // do something<br />        }<br />     }<br /><br /><h4>强大的XPath导航</h4><br />    在dom4j中XPath可以表示出在XML树状结构中的Document或者任意的节点（Node）（例如：Attribute，Element 或者ProcessingInstruction等）。它可以使在文档中复杂的操作仅通过一行代码就可以完成。例如：<br /><br />public void bar(Document document) {<br />        List list = document.selectNodes( "//foo/bar" );<br /><br />        Node node = document.selectSingleNode( "//foo/bar/author" );<br /><br />        String name = node.valueOf( "@name" );<br />    }<br /><br />    如果你想得到一个XHTML文档中的所有超文本链接（hypertext links）你可以使用下面的代码：<br /><br />    public void findLinks(Document document) throws DocumentException {<br /><br />        List list = document.selectNodes( "//a/@href" );<br /><br />        for (Iterator iter = list.iterator(); iter.hasNext(); ) {<br />            Attribute attribute = (Attribute) iter.next();<br />            String url = attribute.getValue();<br />        }<br />    }<br /><br />    如果你需要关于XPath语言的任何帮助，我们强烈推荐这个站点<a class="l2" href="http://www.zvon.org/xxl/XPathTutorial/General/examples.html" target="_blank">Zvon tutorial</a>他会通过一个一个的例子引导你学习。<br /><br /><h4>快速遍历（Fast Looping）</h4><br /><br />如果你不得不遍历一个非常大的XML文档，然后才去执行，我们建议你使用快速遍历方法（fast looping method），它可以避免为每一个循环的节点创建一个迭代器对象,如下所示：<br /><br />public void treeWalk(Document document) {<br />        treeWalk( document.getRootElement() );<br />    }<br /><br />    public void treeWalk(Element element) {<br />        for ( int i = 0, size = element.nodeCount(); i &lt; size; i++ ) {<br />            Node node = element.node(i);<br />            if ( node instanceof Element ) {<br />                treeWalk( (Element) node );<br />            }<br />            else {<br />                // do something....<br />            }<br />        }<br />    }<br /><br /><h4>生成一个新的XML文档对象</h4><br />    在dom4j中你可能常常希望用程序生成一个XML文档对象，下面的程序为你进行了示范：<br /><br />import org.dom4j.Document;<br />import org.dom4j.DocumentHelper;<br />import org.dom4j.Element;<br /><br />public class Foo {<br /><br />    public Document createDocument() {<br />        Document document = DocumentHelper.createDocument();<br />        Element root = document.addElement( "root" );<br /><br />        Element author1 = root.addElement( "author" )<br />            .addAttribute( "name", "James" )<br />            .addAttribute( "location", "UK" )<br />            .addText( "James Strachan" );<br />        <br />        Element author2 = root.addElement( "author" )<br />            .addAttribute( "name", "Bob" )<br />            .addAttribute( "location", "US" )<br />            .addText( "Bob McWhirter" );<br /><br />        return document;<br />    }<br />}<br /><br /><h4>将一个文档对象写入文件中</h4><br />    将一个文档对象写入Writer对象的一个简单快速的途径是通过write()方法。<br /><br />        FileWriter out = new FileWriter( "foo.xml" );<br />        document.write( out );<br /><br />如果你想改变输出文件的排版格式，比如你想要一个漂亮的格式或者是一个紧凑的格式，或者你想用Writer 对象或者OutputStream 对象来操作，那么你可以使用XMLWriter 类。<br /><br />import org.dom4j.Document;<br />import org.dom4j.io.OutputFormat;<br />import org.dom4j.io.XMLWriter;<br /><br />public class Foo {<br /><br />    public void write(Document document) throws IOException {<br /><br />        // 写入文件<br />        XMLWriter writer = new XMLWriter(<br />            new FileWriter( "output.xml" )<br />        );<br />        writer.write( document );<br />        writer.close();<br /><br /><br />        // 以一种优雅的格式写入System.out对象<br />        OutputFormat format = OutputFormat.createPrettyPrint();<br />        writer = new XMLWriter( System.out, format );<br />        writer.write( document );<br /><br />        // 以一种紧凑的格式写入System.out对象<br />        format = OutputFormat.createCompactFormat();<br />        writer = new XMLWriter( System.out, format );<br />        writer.write( document );<br />    }<br />}<br /><br /><h4>转化为字符串，或者从字符串转化</h4><br />    如果你有一个文档（Document）对象或者任何一个节点（Node）对象的引用（reference），象属性（Attribute）或者元素（Element），你可以通过asXML()方法把它转化为一个默认的XML字符串：<br /><br />        Document document = ...;<br />        String text = document.asXML();<br /><br />如果你有一些XML内容的字符串表示，你可以通过DocumentHelper.parseText()方法将它重新转化为文档（Document）对象：<br /><br />        String text = "&lt;person&gt; &lt;name&gt;James&lt;/name&gt; &lt;/person&gt;";<br />        Document document = DocumentHelper.parseText(text);<br /><br /><h4>通过XSLT样式化文档（Document）</h4><br /><br />    使用Sun公司提供的<a class="l2" href="http://java.sun.com/xml/" target="_blank">JAXP</a> API将XSLT 应用到文档（Document）上是很简单的。它允许你使用任何的XSLT引擎（例如：Xalan或SAXON等）来开发。下面是一个使用JAXP创建一个转化器（transformer），然后将它应用到文档（Document）上的例子：<br /><br />import javax.xml.transform.Transformer;<br />import javax.xml.transform.TransformerFactory;<br /><br />import org.dom4j.Document;<br />import org.dom4j.io.DocumentResult;<br />import org.dom4j.io.DocumentSource;<br /><br />public class Foo {<br /><br />    public Document styleDocument(<br />        Document document, <br />        String stylesheet<br />    ) throws Exception {<br /><br />        // 使用 JAXP 加载转化器<br />        TransformerFactory factory = TransformerFactory.newInstance();<br />        Transformer transformer = factory.newTransformer( <br />            new StreamSource( stylesheet ) <br />        );<br /><br />        // 现在来样式化一个文档（Document）<br />        DocumentSource source = new DocumentSource( document );<br />        DocumentResult result = new DocumentResult();<br />        transformer.transform( source, result );<br /><br />        // 返回经过样式化的文档（Document）<br />        Document transformedDoc = result.getDocument();<br />        return transformedDoc;<br />    }<br />}<br /><br /><a class="l2" href="http://dom4j.org/guide.html" target="_blank">原文地址</a><br /><a class="l2" href="http://prdownloads.sourceforge.net/dom4j/dom4j-1.6.1.zip?download" target="_blank">dom4j下载地址</a><br /><img src ="http://www.blogjava.net/iKingQu/aggbug/39350.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iKingQu/" target="_blank">風向逆轉 - 就要爪哇</a> 2006-04-05 12:35 <a href="http://www.blogjava.net/iKingQu/articles/39350.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[收藏]Struts+Hibernate+Spring 开发入门</title><link>http://www.blogjava.net/iKingQu/articles/39085.html</link><dc:creator>風向逆轉 - 就要爪哇</dc:creator><author>風向逆轉 - 就要爪哇</author><pubDate>Tue, 04 Apr 2006 01:32:00 GMT</pubDate><guid>http://www.blogjava.net/iKingQu/articles/39085.html</guid><wfw:comment>http://www.blogjava.net/iKingQu/comments/39085.html</wfw:comment><comments>http://www.blogjava.net/iKingQu/articles/39085.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iKingQu/comments/commentRss/39085.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iKingQu/services/trackbacks/39085.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1.先建张表用的是mysql数据库..文章表. CREATE   TABLE  `t_article` (  `a_id`  int ( 11 )  NOT   NULL  auto_increment,  `a_sort`  int ( 11 )  NOT   NULL   default   ' 0 ' ,  `a_title`  varchar ( 50 )  default   NUL...&nbsp;&nbsp;<a href='http://www.blogjava.net/iKingQu/articles/39085.html'>阅读全文</a><img src ="http://www.blogjava.net/iKingQu/aggbug/39085.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iKingQu/" target="_blank">風向逆轉 - 就要爪哇</a> 2006-04-04 09:32 <a href="http://www.blogjava.net/iKingQu/articles/39085.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[收藏]MD5 算法的Java Bean</title><link>http://www.blogjava.net/iKingQu/articles/38742.html</link><dc:creator>風向逆轉 - 就要爪哇</dc:creator><author>風向逆轉 - 就要爪哇</author><pubDate>Sun, 02 Apr 2006 07:54:00 GMT</pubDate><guid>http://www.blogjava.net/iKingQu/articles/38742.html</guid><wfw:comment>http://www.blogjava.net/iKingQu/comments/38742.html</wfw:comment><comments>http://www.blogjava.net/iKingQu/articles/38742.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iKingQu/comments/commentRss/38742.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iKingQu/services/trackbacks/38742.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: /** */						/**				********************************************** MD5 算法的Java Bean 				@author				:Topcat Tuppin Last Modified:10,Mar,2001 ************************************************	...&nbsp;&nbsp;<a href='http://www.blogjava.net/iKingQu/articles/38742.html'>阅读全文</a><img src ="http://www.blogjava.net/iKingQu/aggbug/38742.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iKingQu/" target="_blank">風向逆轉 - 就要爪哇</a> 2006-04-02 15:54 <a href="http://www.blogjava.net/iKingQu/articles/38742.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[收藏]两个Filter类：登录过滤和编码过滤</title><link>http://www.blogjava.net/iKingQu/articles/38741.html</link><dc:creator>風向逆轉 - 就要爪哇</dc:creator><author>風向逆轉 - 就要爪哇</author><pubDate>Sun, 02 Apr 2006 07:48:00 GMT</pubDate><guid>http://www.blogjava.net/iKingQu/articles/38741.html</guid><wfw:comment>http://www.blogjava.net/iKingQu/comments/38741.html</wfw:comment><comments>http://www.blogjava.net/iKingQu/articles/38741.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iKingQu/comments/commentRss/38741.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iKingQu/services/trackbacks/38741.html</trackback:ping><description><![CDATA[
		<span style="FONT-WEIGHT: bold">LoginFilter.java:<br /></span>
		<br />
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #0000ff">import</span>
				<span style="COLOR: #000000"> javax.servlet.FilterChain;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">import</span>
				<span style="COLOR: #000000"> javax.servlet.ServletRequest;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">import</span>
				<span style="COLOR: #000000"> javax.servlet.ServletResponse;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">import</span>
				<span style="COLOR: #000000"> java.io.IOException;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">import</span>
				<span style="COLOR: #000000"> javax.servlet.Filter;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">import</span>
				<span style="COLOR: #000000"> javax.servlet.http.HttpServletRequest;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">import</span>
				<span style="COLOR: #000000"> javax.servlet.http.HttpServletResponse;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">import</span>
				<span style="COLOR: #000000"> javax.servlet.ServletException;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">import</span>
				<span style="COLOR: #000000"> javax.servlet.FilterConfig;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img id="Codehighlighter1_335_641_Open_Image" style="DISPLAY: inline" onclick="this.style.display='none'; Codehighlighter1_335_641_Open_Text.style.display='none'; Codehighlighter1_335_641_Closed_Image.style.display='inline'; Codehighlighter1_335_641_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_335_641_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_335_641_Closed_Text.style.display='none'; Codehighlighter1_335_641_Open_Image.style.display='inline'; Codehighlighter1_335_641_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span>
				<span id="Codehighlighter1_335_641_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/**/</span>
				<span id="Codehighlighter1_335_641_Open_Text" style="DISPLAY: inline">
						<span style="COLOR: #008000">/*</span>
						<span style="COLOR: #008000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * @author Ace<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * web.xml配置如下： <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * &lt;filter&gt; <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * &lt;filter-name&gt;login&lt;/filter-name&gt;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * &lt;filter-class&gt;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * org.waityou.news.util.filters.LoginFilter<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * &lt;/filter-class&gt;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * &lt;/filter&gt; <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * &lt;filter-mapping&gt; <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * &lt;filter-name&gt;login&lt;/filter-name&gt;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * &lt;url-pattern&gt;/manager/*&lt;/url-pattern&gt; <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * &lt;/filter-mapping&gt;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /> </span>
						<span style="COLOR: #008000">*/</span>
				</span>
				<span style="COLOR: #000000">
						<br />
						<img id="Codehighlighter1_686_1586_Open_Image" onclick="this.style.display='none'; Codehighlighter1_686_1586_Open_Text.style.display='none'; Codehighlighter1_686_1586_Closed_Image.style.display='inline'; Codehighlighter1_686_1586_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
						<img id="Codehighlighter1_686_1586_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_686_1586_Closed_Text.style.display='none'; Codehighlighter1_686_1586_Open_Image.style.display='inline'; Codehighlighter1_686_1586_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000"> LoginFilter </span>
				<span style="COLOR: #0000ff">implements</span>
				<span style="COLOR: #000000"> Filter </span>
				<span id="Codehighlighter1_686_1586_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_686_1586_Open_Text">
						<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">protected</span>
						<span style="COLOR: #000000"> FilterConfig filterConfig;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">public</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">void</span>
						<span style="COLOR: #000000"> doFilter(</span>
						<span style="COLOR: #0000ff">final</span>
						<span style="COLOR: #000000"> ServletRequest req, </span>
						<span style="COLOR: #0000ff">final</span>
						<span style="COLOR: #000000"> ServletResponse res,<br /><img id="Codehighlighter1_877_1312_Open_Image" onclick="this.style.display='none'; Codehighlighter1_877_1312_Open_Text.style.display='none'; Codehighlighter1_877_1312_Closed_Image.style.display='inline'; Codehighlighter1_877_1312_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_877_1312_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_877_1312_Closed_Text.style.display='none'; Codehighlighter1_877_1312_Open_Image.style.display='inline'; Codehighlighter1_877_1312_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />            FilterChain chain) </span>
						<span style="COLOR: #0000ff">throws</span>
						<span style="COLOR: #000000"> IOException, ServletException </span>
						<span id="Codehighlighter1_877_1312_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_877_1312_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        HttpServletRequest hreq </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> (HttpServletRequest) req;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        HttpServletResponse hres </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> (HttpServletResponse) res;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        String isLog </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> (String) hreq.getSession().getAttribute(</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">isLog</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">if</span>
								<span style="COLOR: #000000"> ((isLog </span>
								<span style="COLOR: #000000">!=</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">null</span>
								<span style="COLOR: #000000">) </span>
								<span style="COLOR: #000000">&amp;&amp;</span>
								<span style="COLOR: #000000"> ((isLog.equals(</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">true</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">)) </span>
								<span style="COLOR: #000000">||</span>
								<span style="COLOR: #000000"> (isLog </span>
								<span style="COLOR: #000000">==</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">true</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">)))</span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000">检查是否登录</span>
								<span style="COLOR: #008000">
										<br />
										<img id="Codehighlighter1_1168_1236_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1168_1236_Open_Text.style.display='none'; Codehighlighter1_1168_1236_Closed_Image.style.display='inline'; Codehighlighter1_1168_1236_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
										<img id="Codehighlighter1_1168_1236_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1168_1236_Closed_Text.style.display='none'; Codehighlighter1_1168_1236_Open_Image.style.display='inline'; Codehighlighter1_1168_1236_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />
								</span>
								<span style="COLOR: #000000">        </span>
								<span id="Codehighlighter1_1168_1236_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
										<img src="http://www.blogjava.net/images/dot.gif" />
								</span>
								<span id="Codehighlighter1_1168_1236_Open_Text">
										<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            chain.doFilter(req, res);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            </span>
										<span style="COLOR: #0000ff">return</span>
										<span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span>
								</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">else</span>
								<span style="COLOR: #000000">
										<br />
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            hres.sendRedirect(</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">/error.html</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">);</span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000">如果没有登录，把视图派发到登录页面</span>
								<span style="COLOR: #008000">
										<br />
										<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />
								</span>
								<span style="COLOR: #000000">    }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
								<br />
								<img id="Codehighlighter1_1341_1381_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1341_1381_Open_Text.style.display='none'; Codehighlighter1_1341_1381_Closed_Image.style.display='inline'; Codehighlighter1_1341_1381_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
								<img id="Codehighlighter1_1341_1381_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1341_1381_Closed_Text.style.display='none'; Codehighlighter1_1341_1381_Open_Image.style.display='inline'; Codehighlighter1_1341_1381_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">public</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">void</span>
						<span style="COLOR: #000000"> destroy() </span>
						<span id="Codehighlighter1_1341_1381_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_1341_1381_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">this</span>
								<span style="COLOR: #000000">.filterConfig </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">null</span>
								<span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
								<br />
								<img id="Codehighlighter1_1426_1468_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1426_1468_Open_Text.style.display='none'; Codehighlighter1_1426_1468_Closed_Image.style.display='inline'; Codehighlighter1_1426_1468_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
								<img id="Codehighlighter1_1426_1468_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1426_1468_Closed_Text.style.display='none'; Codehighlighter1_1426_1468_Open_Image.style.display='inline'; Codehighlighter1_1426_1468_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">public</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">void</span>
						<span style="COLOR: #000000"> init(FilterConfig config) </span>
						<span id="Codehighlighter1_1426_1468_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_1426_1468_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">this</span>
								<span style="COLOR: #000000">.filterConfig </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> config;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
								<br />
								<img id="Codehighlighter1_1536_1584_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1536_1584_Open_Text.style.display='none'; Codehighlighter1_1536_1584_Closed_Image.style.display='inline'; Codehighlighter1_1536_1584_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
								<img id="Codehighlighter1_1536_1584_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1536_1584_Closed_Text.style.display='none'; Codehighlighter1_1536_1584_Open_Image.style.display='inline'; Codehighlighter1_1536_1584_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">public</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">void</span>
						<span style="COLOR: #000000"> setFilterConfig(</span>
						<span style="COLOR: #0000ff">final</span>
						<span style="COLOR: #000000"> FilterConfig filterConfig) </span>
						<span id="Codehighlighter1_1536_1584_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_1536_1584_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
								<span style="COLOR: #0000ff">this</span>
								<span style="COLOR: #000000">.filterConfig </span>
								<span style="COLOR: #000000">=</span>
								<span style="COLOR: #000000"> filterConfig;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
				<span style="COLOR: #000000">
						<br />
						<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				</span>
		</div>
		<br />
		<br />
		<br />
		<br />
		<span style="FONT-WEIGHT: bold">SetCharacterEncodingFilter.java:<br /></span>
		<br />
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #0000ff">import</span>
				<span style="COLOR: #000000"> java.io.IOException;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">import</span>
				<span style="COLOR: #000000"> javax.servlet.Filter;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">import</span>
				<span style="COLOR: #000000"> javax.servlet.FilterChain;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">import</span>
				<span style="COLOR: #000000"> javax.servlet.FilterConfig;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">import</span>
				<span style="COLOR: #000000"> javax.servlet.ServletException;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">import</span>
				<span style="COLOR: #000000"> javax.servlet.ServletRequest;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span>
				<span style="COLOR: #0000ff">import</span>
				<span style="COLOR: #000000"> javax.servlet.ServletResponse;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img id="Codehighlighter1_241_605_Open_Image" onclick="this.style.display='none'; Codehighlighter1_241_605_Open_Text.style.display='none'; Codehighlighter1_241_605_Closed_Image.style.display='inline'; Codehighlighter1_241_605_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_241_605_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_241_605_Closed_Text.style.display='none'; Codehighlighter1_241_605_Open_Image.style.display='inline'; Codehighlighter1_241_605_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span>
				<span id="Codehighlighter1_241_605_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">/** */</span>
				<span id="Codehighlighter1_241_605_Open_Text">
						<span style="COLOR: #008000">/**</span>
						<span style="COLOR: #008000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * </span>
						<span style="COLOR: #808080">@author</span>
						<span style="COLOR: #008000"> Ace 编码过滤，一律设置成UTF-8<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * web.xml中配置如下： <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * &lt;filter&gt;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * &lt;filter-name&gt;Set Character Encoding&lt;/filter-name&gt;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * &lt;filter-class&gt;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * org.waityou.news.util.filters.SetCharacterEncodingFilter<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * &lt;/filter-class&gt; <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * &lt;/filter&gt; <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * &lt;filter-mapping&gt;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * &lt;filter-name&gt;Set Character Encoding&lt;/filter-name&gt; <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * &lt;url-pattern&gt;/*&lt;/url-pattern&gt;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * &lt;/filter-mapping&gt;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /> </span>
						<span style="COLOR: #008000">*/</span>
				</span>
				<span style="COLOR: #000000">
						<br />
						<img id="Codehighlighter1_665_1046_Open_Image" onclick="this.style.display='none'; Codehighlighter1_665_1046_Open_Text.style.display='none'; Codehighlighter1_665_1046_Closed_Image.style.display='inline'; Codehighlighter1_665_1046_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" />
						<img id="Codehighlighter1_665_1046_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_665_1046_Closed_Text.style.display='none'; Codehighlighter1_665_1046_Open_Image.style.display='inline'; Codehighlighter1_665_1046_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />
				</span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000"> SetCharacterEncodingFilter </span>
				<span style="COLOR: #0000ff">implements</span>
				<span style="COLOR: #000000"> Filter </span>
				<span id="Codehighlighter1_665_1046_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_665_1046_Open_Text">
						<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    <br /><img id="Codehighlighter1_698_699_Open_Image" onclick="this.style.display='none'; Codehighlighter1_698_699_Open_Text.style.display='none'; Codehighlighter1_698_699_Closed_Image.style.display='inline'; Codehighlighter1_698_699_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_698_699_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_698_699_Closed_Text.style.display='none'; Codehighlighter1_698_699_Open_Image.style.display='inline'; Codehighlighter1_698_699_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">public</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">void</span>
						<span style="COLOR: #000000"> destroy() </span>
						<span id="Codehighlighter1_698_699_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_698_699_Open_Text">
								<span style="COLOR: #000000">{}</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">public</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">void</span>
						<span style="COLOR: #000000"> doFilter(ServletRequest request, ServletResponse response,<br /><img id="Codehighlighter1_844_963_Open_Image" onclick="this.style.display='none'; Codehighlighter1_844_963_Open_Text.style.display='none'; Codehighlighter1_844_963_Closed_Image.style.display='inline'; Codehighlighter1_844_963_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_844_963_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_844_963_Closed_Text.style.display='none'; Codehighlighter1_844_963_Open_Image.style.display='inline'; Codehighlighter1_844_963_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />            FilterChain chain) </span>
						<span style="COLOR: #0000ff">throws</span>
						<span style="COLOR: #000000"> IOException, ServletException </span>
						<span id="Codehighlighter1_844_963_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_844_963_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        request.setCharacterEncoding(</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">UTF-8</span>
								<span style="COLOR: #000000">"</span>
								<span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span>
								<span style="COLOR: #008000">//</span>
								<span style="COLOR: #008000"> 传递控制到下一个过滤器</span>
								<span style="COLOR: #008000">
										<br />
										<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
								</span>
								<span style="COLOR: #000000">        chain.doFilter(request, response);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    <br /><img id="Codehighlighter1_1042_1043_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1042_1043_Open_Text.style.display='none'; Codehighlighter1_1042_1043_Closed_Image.style.display='inline'; Codehighlighter1_1042_1043_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1042_1043_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1042_1043_Closed_Text.style.display='none'; Codehighlighter1_1042_1043_Open_Image.style.display='inline'; Codehighlighter1_1042_1043_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span>
						<span style="COLOR: #0000ff">public</span>
						<span style="COLOR: #000000"> </span>
						<span style="COLOR: #0000ff">void</span>
						<span style="COLOR: #000000"> init(FilterConfig filterConfig) </span>
						<span style="COLOR: #0000ff">throws</span>
						<span style="COLOR: #000000"> ServletException </span>
						<span id="Codehighlighter1_1042_1043_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_1042_1043_Open_Text">
								<span style="COLOR: #000000">{}</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span>
				</span>
				<span style="COLOR: #000000">
						<br />
				</span>
		</div>
		<br />原文地址：<a href="/ranxiang/articles/23152.html">http://www.blogjava.net/ranxiang/articles/23152.html</a><img src ="http://www.blogjava.net/iKingQu/aggbug/38741.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iKingQu/" target="_blank">風向逆轉 - 就要爪哇</a> 2006-04-02 15:48 <a href="http://www.blogjava.net/iKingQu/articles/38741.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[收藏]利用正则表达式来对数字进行判断的一个类</title><link>http://www.blogjava.net/iKingQu/articles/38740.html</link><dc:creator>風向逆轉 - 就要爪哇</dc:creator><author>風向逆轉 - 就要爪哇</author><pubDate>Sun, 02 Apr 2006 07:44:00 GMT</pubDate><guid>http://www.blogjava.net/iKingQu/articles/38740.html</guid><wfw:comment>http://www.blogjava.net/iKingQu/comments/38740.html</wfw:comment><comments>http://www.blogjava.net/iKingQu/articles/38740.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iKingQu/comments/commentRss/38740.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iKingQu/services/trackbacks/38740.html</trackback:ping><description><![CDATA[原创作者：<font color="#008000">Ace<br /><br /><img id="Codehighlighter1_0_64_Open_Image" onclick="this.style.display='none'; Codehighlighter1_0_64_Open_Text.style.display='none'; Codehighlighter1_0_64_Closed_Image.style.display='inline'; Codehighlighter1_0_64_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_0_64_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_0_64_Closed_Text.style.display='none'; Codehighlighter1_0_64_Open_Image.style.display='inline'; Codehighlighter1_0_64_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /><span id="Codehighlighter1_0_64_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><font color="#000000">/**/</font></span><span id="Codehighlighter1_0_64_Open_Text"><span style="COLOR: #008000">/*</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * Created on 2005-5-13<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * 利用正则表达式对数字进行判断<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * 代码来源自PIGO，有改动<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /> </span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">package</span><span style="COLOR: #000000"> org.waityou.utils;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000"> java.util.regex.</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img id="Codehighlighter1_121_165_Open_Image" onclick="this.style.display='none'; Codehighlighter1_121_165_Open_Text.style.display='none'; Codehighlighter1_121_165_Closed_Image.style.display='inline'; Codehighlighter1_121_165_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_121_165_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_121_165_Closed_Text.style.display='none'; Codehighlighter1_121_165_Open_Image.style.display='inline'; Codehighlighter1_121_165_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span id="Codehighlighter1_121_165_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><font color="#000000">/** */</font></span><span id="Codehighlighter1_121_165_Open_Text"><span style="COLOR: #008000">/**</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> * </span><span style="COLOR: #808080">@author</span><span style="COLOR: #008000"> Ace<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> *     thanks, pigo<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /> *<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" /> </span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_197_2359_Open_Image" onclick="this.style.display='none'; Codehighlighter1_197_2359_Open_Text.style.display='none'; Codehighlighter1_197_2359_Closed_Image.style.display='inline'; Codehighlighter1_197_2359_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_197_2359_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_197_2359_Closed_Text.style.display='none'; Codehighlighter1_197_2359_Open_Image.style.display='inline'; Codehighlighter1_197_2359_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000"> ValidationNumber </span><span id="Codehighlighter1_197_2359_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_197_2359_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> Pattern intnumPattern;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> Pattern numberPattern;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> Pattern doublenumPattern;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img id="Codehighlighter1_386_690_Open_Image" onclick="this.style.display='none'; Codehighlighter1_386_690_Open_Text.style.display='none'; Codehighlighter1_386_690_Closed_Image.style.display='inline'; Codehighlighter1_386_690_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_386_690_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_386_690_Closed_Text.style.display='none'; Codehighlighter1_386_690_Open_Image.style.display='inline'; Codehighlighter1_386_690_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">boolean</span><span style="COLOR: #000000"> isintNumber(String aString) </span><span id="Codehighlighter1_386_690_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_386_690_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">      检查一个字符串是否是整数 允许一个正负符号位</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_481_517_Open_Image" onclick="this.style.display='none'; Codehighlighter1_481_517_Open_Text.style.display='none'; Codehighlighter1_481_517_Closed_Image.style.display='inline'; Codehighlighter1_481_517_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_481_517_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_481_517_Closed_Text.style.display='none'; Codehighlighter1_481_517_Open_Image.style.display='inline'; Codehighlighter1_481_517_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (aString </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">||</span><span style="COLOR: #000000"> aString.length() </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">) </span><span id="Codehighlighter1_481_517_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_481_517_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img id="Codehighlighter1_555_629_Open_Image" onclick="this.style.display='none'; Codehighlighter1_555_629_Open_Text.style.display='none'; Codehighlighter1_555_629_Closed_Image.style.display='inline'; Codehighlighter1_555_629_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_555_629_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_555_629_Closed_Text.style.display='none'; Codehighlighter1_555_629_Open_Image.style.display='inline'; Codehighlighter1_555_629_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (intnumPattern </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">) </span><span id="Codehighlighter1_555_629_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_555_629_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            intnumPattern </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> Pattern.compile(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">^[+-]?[\\d]+$</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> intnumPattern.matcher(aString).find();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img id="Codehighlighter1_744_1087_Open_Image" onclick="this.style.display='none'; Codehighlighter1_744_1087_Open_Text.style.display='none'; Codehighlighter1_744_1087_Closed_Image.style.display='inline'; Codehighlighter1_744_1087_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_744_1087_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_744_1087_Closed_Text.style.display='none'; Codehighlighter1_744_1087_Open_Image.style.display='inline'; Codehighlighter1_744_1087_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">boolean</span><span style="COLOR: #000000"> isNumber(String aString) </span><span id="Codehighlighter1_744_1087_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_744_1087_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">      检查一个字符串是否全部是数字</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_831_867_Open_Image" onclick="this.style.display='none'; Codehighlighter1_831_867_Open_Text.style.display='none'; Codehighlighter1_831_867_Closed_Image.style.display='inline'; Codehighlighter1_831_867_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_831_867_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_831_867_Closed_Text.style.display='none'; Codehighlighter1_831_867_Open_Image.style.display='inline'; Codehighlighter1_831_867_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (aString </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">||</span><span style="COLOR: #000000"> aString.length() </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">) </span><span id="Codehighlighter1_831_867_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_831_867_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img id="Codehighlighter1_905_1026_Open_Image" onclick="this.style.display='none'; Codehighlighter1_905_1026_Open_Text.style.display='none'; Codehighlighter1_905_1026_Closed_Image.style.display='inline'; Codehighlighter1_905_1026_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_905_1026_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_905_1026_Closed_Text.style.display='none'; Codehighlighter1_905_1026_Open_Image.style.display='inline'; Codehighlighter1_905_1026_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (numberPattern </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">) </span><span id="Codehighlighter1_905_1026_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_905_1026_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            numberPattern </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> Pattern.compile(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">^[\\d]+$</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);     </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">  "^[+-]?([\\d]+)|([\\d]+\\.[\\d]+)$"</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" /></span><span style="COLOR: #000000">        }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> numberPattern.matcher(aString).find();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img id="Codehighlighter1_1147_1514_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1147_1514_Open_Text.style.display='none'; Codehighlighter1_1147_1514_Closed_Image.style.display='inline'; Codehighlighter1_1147_1514_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1147_1514_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1147_1514_Closed_Text.style.display='none'; Codehighlighter1_1147_1514_Open_Image.style.display='inline'; Codehighlighter1_1147_1514_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">boolean</span><span style="COLOR: #000000"> isdoubleNumber(String aString) </span><span id="Codehighlighter1_1147_1514_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_1147_1514_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">检查一个字符串是否是浮点小数,浮点小数至少一个数字开头,允许一个正负符号位<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">中间只出现一个小数点,小数点之后至少一个数字</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000"><br /><img id="Codehighlighter1_1284_1320_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1284_1320_Open_Text.style.display='none'; Codehighlighter1_1284_1320_Closed_Image.style.display='inline'; Codehighlighter1_1284_1320_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1284_1320_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1284_1320_Closed_Text.style.display='none'; Codehighlighter1_1284_1320_Open_Image.style.display='inline'; Codehighlighter1_1284_1320_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (aString </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">||</span><span style="COLOR: #000000"> aString.length() </span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">) </span><span id="Codehighlighter1_1284_1320_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_1284_1320_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img id="Codehighlighter1_1361_1451_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1361_1451_Open_Text.style.display='none'; Codehighlighter1_1361_1451_Closed_Image.style.display='inline'; Codehighlighter1_1361_1451_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1361_1451_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1361_1451_Closed_Text.style.display='none'; Codehighlighter1_1361_1451_Open_Image.style.display='inline'; Codehighlighter1_1361_1451_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000"> (doublenumPattern </span><span style="COLOR: #000000">==</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">) </span><span id="Codehighlighter1_1361_1451_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_1361_1451_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />            doublenumPattern </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> Pattern.compile(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">^[+-]?[\\d]+\\.[\\d]+$</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />        }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000"> doublenumPattern.matcher(aString).find();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img id="Codehighlighter1_1560_2357_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1560_2357_Open_Text.style.display='none'; Codehighlighter1_1560_2357_Closed_Image.style.display='inline'; Codehighlighter1_1560_2357_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1560_2357_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1560_2357_Closed_Text.style.display='none'; Codehighlighter1_1560_2357_Open_Image.style.display='inline'; Codehighlighter1_1560_2357_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000"> main(String[] args) </span><span id="Codehighlighter1_1560_2357_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_1560_2357_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        <br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000"> 测试</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="COLOR: #000000">        String intnum1 </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">-23423</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        String intnum2 </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">234</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        String numstring </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">234sdf</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        String num1 </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">234234</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        String doublenum1 </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">0.123456</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        String doublenum2 </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">-0.23</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        String doublenum3 </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">.123123</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        System.out.println(</span><span style="COLOR: #000000">""</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> isintNumber(intnum1));<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        System.out.println(</span><span style="COLOR: #000000">""</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> isintNumber(intnum2));<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        System.out.println(</span><span style="COLOR: #000000">""</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> isintNumber(numstring));<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        System.out.println(</span><span style="COLOR: #000000">""</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> isNumber(num1));<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        System.out.println(</span><span style="COLOR: #000000">""</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> isNumber(numstring));<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        System.out.println(</span><span style="COLOR: #000000">""</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> isdoubleNumber(doublenum1));<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        System.out.println(</span><span style="COLOR: #000000">""</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> isdoubleNumber(doublenum2));<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        System.out.println(</span><span style="COLOR: #000000">""</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> isdoubleNumber(doublenum3));<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />        System.out.println(</span><span style="COLOR: #000000">""</span><span style="COLOR: #000000"> </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000"> isdoubleNumber(numstring));<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />    }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></font><img src ="http://www.blogjava.net/iKingQu/aggbug/38740.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iKingQu/" target="_blank">風向逆轉 - 就要爪哇</a> 2006-04-02 15:44 <a href="http://www.blogjava.net/iKingQu/articles/38740.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[收藏]JAVA中金额的中文大写方式</title><link>http://www.blogjava.net/iKingQu/articles/38739.html</link><dc:creator>風向逆轉 - 就要爪哇</dc:creator><author>風向逆轉 - 就要爪哇</author><pubDate>Sun, 02 Apr 2006 07:34:00 GMT</pubDate><guid>http://www.blogjava.net/iKingQu/articles/38739.html</guid><wfw:comment>http://www.blogjava.net/iKingQu/comments/38739.html</wfw:comment><comments>http://www.blogjava.net/iKingQu/articles/38739.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iKingQu/comments/commentRss/38739.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iKingQu/services/trackbacks/38739.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 题意:		读入一个浮点数值,将其转化为中文金额的大写方式.		试验要求:		当金额为整数时,只表示整数部分,省略小数部分,并添加"整"字.		当金额中含有连续的0时,只需要一个"零"即可.		10的表示方式.例如110--壹佰一拾元整,10---一拾元整						  1								import				 java.io.				*				;	...&nbsp;&nbsp;<a href='http://www.blogjava.net/iKingQu/articles/38739.html'>阅读全文</a><img src ="http://www.blogjava.net/iKingQu/aggbug/38739.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iKingQu/" target="_blank">風向逆轉 - 就要爪哇</a> 2006-04-02 15:34 <a href="http://www.blogjava.net/iKingQu/articles/38739.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[收藏]Java Web 框架的“甜点”</title><link>http://www.blogjava.net/iKingQu/articles/38359.html</link><dc:creator>風向逆轉 - 就要爪哇</dc:creator><author>風向逆轉 - 就要爪哇</author><pubDate>Thu, 30 Mar 2006 13:01:00 GMT</pubDate><guid>http://www.blogjava.net/iKingQu/articles/38359.html</guid><wfw:comment>http://www.blogjava.net/iKingQu/comments/38359.html</wfw:comment><comments>http://www.blogjava.net/iKingQu/articles/38359.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iKingQu/comments/commentRss/38359.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iKingQu/services/trackbacks/38359.html</trackback:ping><description><![CDATA[
		<p align="center">
				<strong>
						<font color="#000000" size="5">Java Web Framework Sweet Spots<br />Java Web 框架的“甜点”<br /></font>
				</strong>
				<br />
		</p>
		<p>这是一篇很有趣的文档，所以摘要一下，其实类似阅读笔记，好像是3/25发布的：</p>
		<p>不知怎么翻译Sweet Spots，难道翻译为甜处、甜头、蜜点、蜜穴？</p>
		<p>这时基于对以下人的采访：<br />JSF  Jacob Hookom<br />RIFE  Geert Bevin<br />Seam  Gavin King<br />Spring MVC Rob Harrop<br />Spring Web Flow Rob Harrop and Keith Donald<br />Stripes  Tim Fennell<br />Struts Action 1 Don Brown<br />Tapestry Howard Lewis Ship<br />Trails  Chris Nelson<br />WebWork  Patrick Lightbody<br />Wicket  Eelco Hillenius</p>
		<p>原文在此：<a href="http://www.virtuas.com/articles/webframework-sweetspots.html">http://www.virtuas.com/articles/webframework-sweetspots.html</a><br /><br /></p>
		<p>
				<font size="6">
						<strong>
								<font size="4">JSF(Jacob Hookom)</font>
								<br />
						</strong>
				</font>1、你认为你的framework的“甜点”在哪里？他最适合哪种类型的项目？<br />当你希望浏览器程序像桌面程序一样工作的时候，你可以遵循标准并获得大量第三方支持。它致力于降低复杂度。它允许你不与view和特定的action、参数传递、状态传递、渲染打交道就可以进行高质量的开发，不管是否使用工具。<br />2、它不适合于什么样的场景？在这些场景你推荐什么fremework？它是哪个？<br />它不适合大规模的、只读（其实指读为主）的网站。在这种情况推荐Struts，因为知识库丰富（应该指文档和用户群）。<br />3、在下面提到的framework中，你试验过他们么？如果试验过，你比较喜欢哪个？你不喜欢哪个？<br />Seam：<br />优点：非常简单直接<br />缺点：对于大项目过于简单；没有模块化开发的好例子<br />Struts：<br />优点：巨大的文档和用户群；跟着它没错<br />缺点：状态/行为的分离过于教条化<br />WebWork：<br />优点：比Struts易于使用<br />缺点：复杂的UI难于维护，UI代码过于复杂（JSF作者对action Framework都攻击这一点）<br />Tapestry：<br />优点：概念新颖；可以应付复杂的UI<br />缺点：对于一个组件化（JSF主要竞争对手），它依然依附于page/action的概念<br />4、你的framework的未来会怎样？对于用户开发会有什么方便使用的变化？你会原生支持Ajax么？你们计划支持它了么？<br />他认为JSF这个标准下这些应该有第三方提供。JSF(2.0)会提供“Partial Faces Request”，它是Ajax实现。JSF也会增强annotation组建编程。<br />5、有对你们的framework的传言需要澄清么？如果有，是哪个？<br />很多JSF书都拿Struts作为对比。他认为这不能体现JSF的特点。他认为Struts和WebWork能做到的JSF也能做到。<br />6、你对Ruby on Rails的看法如何？<br />它与WebWork一样好用，它的CoC（Convention over Configration）和脚手架非常好用。他认为CoC可以被应用在任何framework，他认为这是RoR最大的优点。他还认为RoR会走上其它framework的路（复杂性等），因为人们需要自己的扩展。</p>
		<p>
				<font size="5">
						<strong>
								<font size="4">RIFE(Geert Bevin)</font>
						</strong>
						<br />
				</font>1、你认为你的framework的“甜点”在哪里？他最适合哪种类型的项目？ <br />你可以付出10%的工作量，得到其它framework的90%的……，它是一个full-stack framework（如RoR）。它吸收了成熟的分层框架的架构，并将共同的优点汇集在一起。提供了web continuation，POJO驱动的CRUD生成，可扩展的基于组建的架构，无session的状态控制，关注REST作为API，双向无逻辑模版引擎，集成了内容控制框架（CMS？）。每个层次的组建提供了可复用性（AOP，site，sub-site，page，widget，portlet等）。适合于团队快速开发公共Web项目，适合喜欢开发可复用组件的人。<br />2、它不适合于什么样的场景？在这些场景你推荐什么fremework？它是哪个？<br />团队中的每个人都有其它framework的知识，难于培训他们。开发状态相关的服务器端Web组件，而不是用RIA或Ajax去实现。第三方支持很重要的情况下（可怜RIFE用户群还不大）。他推荐这种情况下使用JSF。或者在XML为主要发布形式的情况下，推荐Cocoon。<br />3、在下面提到的framework中，你试验过他们么？如果试验过，你比较喜欢哪个？你不喜欢哪个？<br />他试验过WebWork，JSF，Wicket。他喜欢WebWork的简单，但是不喜欢它的模版方式（tag的template，应该），它也不提供组件封装。他认为JSF的工具支持非常吸引人。Wicket的纯Java实现很不错，可惜XML配置很不爽。<br />4、你的framework的未来会怎样？对于用户开发会有什么方便使用的变化？你会原生支持Ajax么？你们计划支持它了么？<br />关于Ajax，RIFE刚刚集成了DWR，而且选定以后也使用这个。集成Dojo，Scriptaculous，Prototype都很容易集成进来。<br />5、有对你们的framework的传言需要澄清么？如果有，是哪个？<br />这些错误理念：1、RIFE的XML配置繁琐 2、RIFE是continuations server 3、RIFE重新造轮子没有提供新鲜东西 4、RIFE的模版语法很蹩脚过于简单和业余 5、RIFE是基于request的framework 6、RIFE的功能太多，学习曲线陡峭<br />6、你对Ruby on Rails的看法如何？<br />RoR对Java社区的冲击非常棒，元编成也得到了信任。RoR没什么特殊之处，也没有从Ruby语言获益很多。<br />我讨厌：它的模版。Partials（RoR中的组件）。URL的分散处理。Active Record提供了从数据库schema而来的DSL，但是却不是从domain model而来。没有l10n和i18n支持。手动状态转换。不能在JVM运行（……）。实际上脚手架生成了实际代码。Ruby缺少工具和IDE。</p>
		<p>
				<font size="6">
						<strong>
								<font size="4">Seam(Gavin King)</font>
								<br />
						</strong>
				</font>1、你认为你的framework的“甜点”在哪里？他最适合哪种类型的项目？ <br />拥有丰富用户交互体验的应用。方便实现多窗口的操作，回退的支持，单窗口多工作区，无状态浏览。对商务流程（BPM）的集成是独一无二的。Seam方便使用数据驱动的ORM。遵循JSF和EJB3，多任务支持（多窗口/多工作区），BPM的领先解决方案。<br />2、它不适合于什么样的场景？在这些场景你推荐什么fremework？它是哪个？<br />不适合只是将数据从数据库显示到网页的应用，这时应该使用PHP或RoR。不适合需要设计特别的HTML组件的情况，此时应该选用Tapestry或Wicket。还在使用JDK1.4的人们。还有那些喜欢Struts的人（嘿嘿，够狠）。<br />3、在下面提到的framework中，你试验过他们么？如果试验过，你比较喜欢哪个？你不喜欢哪个？<br />JSF：喜欢他的事件/交互模型。喜欢他的EL和模型绑定。不喜欢那么多XML（为什么没有annotation）。创建自己的controls太难了。<br />Tapestry：非常好。form验证是它的杀手锏！模版方式很有创意。不过非基于POJO的组件模型则让我对它失去兴趣。<br />RIFE：这个东西很怪，但是有创业也有趣。我想进一步学习。如果学习先要自费武功:D<br />Struts：这个东西的模型view绑定太复杂了。东西已经过时了。<br />WebWork：比Struts好一点，不过也过时了。XWork曾经是个很好的实现，不过现在也过时了。<br />4、你的framework的未来会怎样？对于用户开发会有什么方便使用的变化？你会原生支持Ajax么？你们计划支持它了么？<br />Portal支持。远程框架Seam Remoting Framework（Ajax）。模版消息的工具支持。以后还要集成ESB，计划引擎和异步支持。<br />5、有对你们的framework的传言需要澄清么？如果有，是哪个？<br />这些都不是真的：JSF不能处理GET requests。JSF post后无法redirect。JSF不能与REST共存。<br />6、你对Ruby on Rails的看法如何？<br />它是PHP的很好替代品。如果它有一个正经一点的持久化层它就可以和Java竞争了。</p>
		<p>
				<font size="4">
						<strong>Spring MVC(Rob Harrop)和Spring Web Flow(Rob Harrop and Keith Donald) </strong>
						<br />
				</font>1、你认为你的framework的“甜点”在哪里？他最适合哪种类型的项目？ <br />Spring MVC：<br />稳定可扩展，支持了i18n、文件上传、异常处理，这些稳定的支持给开发者坚实的工作基础。是最佳实践，告诉你怎么做是最好的。与Spring集成，领先的IoC远生支持。支持，Spring社区活跃和庞大。Struts开发者可以平滑过渡。适合多种项目，可选的多种result类型。<br />Spring Web Flow：<br />内置任务处理引擎，支持线性处理过程中的持续状态。抽象，减少开发的关注点。适合多种项目类型，插件支持Spring MVC、Struts、JSF等。<br />2、它不适合于什么样的场景？在这些场景你推荐什么fremework？它是哪个？<br />Spring MVC：不适合需要组件化开发的场景。它是一个request驱动的MVC。那些场景推荐JSF或Tapestry。<br />Spring Web Flow：处理线性页面流，不适合一般的“自由浏览”。当然Spring Web Flow可以与request驱动或者组件驱动共存。<br />3、在下面提到的framework中，你试验过他们么？如果试验过，你比较喜欢哪个？你不喜欢哪个？<br />Spring框架支持Struts和JSF集成。<br />4、你的framework的未来会怎样？对于用户开发会有什么方便使用的变化？你会原生支持Ajax么？你们计划支持它了么？<br />Spring MVC：简化JSP标签。更多的MVC配置schema。CoC风格的默认控制器、URL影射、view，学习Rails和Stripes的优点。增强数据绑定和验证（支持范型绑定）。Portlet支持。Spring也要接受Ajax，使用DWR库。<br />Spring Web Flow：一大堆，关心的可以自己看……<br />5、有对你们的framework的传言需要澄清么？如果有，是哪个？<br />Spring MVC难于配置。在Spring 2.0，将会改善，可以使用自己定义的基于schema的配置。<br />6、你对Ruby on Rails的看法如何？<br />Spring MVC：RoR非常有趣。不过现在就拿出来用还有点幼稚。这里举了个例子，关于变量的复数形式的处理，RoR会使用这样的CoC风格来处理变量list，而Spring MVC也实验了种种风格，但是受到的结果却很差。人们认为英语的复数很古怪，没有一定的规则，所以会带来混乱，如（person -&gt; people）。所以Spring MVC设计了变量+List的命名，personList更加明确，虽然这样不酷，但更好用。就是说Spring MVC要取其精华去其糟粕。</p>
		<p>
				<font size="6">
						<strong>
								<font size="4">Stripes(Tim Fennell)</font>
						</strong>
				</font>
				<br />1、你认为你的framework的“甜点”在哪里？他最适合哪种类型的项目？ <br />与Spring MVC、WebWork等相同。它提供高质量action驱动的框架的同时，尽量简化配置，增进开发效率。Stripes适合复杂的数据交互的场合。这种情况下绑定验证的强项就完全体现出来了，能够很好的处理form和map转换等。<br />2、它不适合于什么样的场景？在这些场景你推荐什么fremework？它是哪个？<br />所有的action驱动的framework都适合用户在非Ajax驱动的情况下在一个页面进行松关联（loosely related）和无状态交互的情况。适合每次都刷新的页面。管理多窗口间持续状态的应用会比较麻烦，此时应该选择JSF。不过我认为90%以上的Web程序都是前者，JSF只适合剩下的那9%，AJAX对于管理无状态UI更加适合。客户端不需要AJAX，则可以看看Wicket，它更加简单。<br />3、在下面提到的framework中，你试验过他们么？如果试验过，你比较喜欢哪个？你不喜欢哪个？<br />用过Struts、WebWork、Spring MVC。其中Struts做过商业项目，不过这个东西带来的麻烦远比带来的效率提升要多。它认为这些MVC都有三个缺点：暴露了过多的复杂性给可发者。没有提供足够的开发便利性，没有提供足够多的错误和提示信息，也没有date格式化等小的便利（其实有）。稳当太差。<br />4、你的framework的未来会怎样？对于用户开发会有什么方便使用的变化？你会原生支持Ajax么？你们计划支持它了么？<br />1.3要加入Inteceptor，实现AOP功能。验证系统要加强。支持Ajax。我还在寻找一个好的Ajax/javascript库。<br />5、有对你们的framework的传言需要澄清么？如果有，是哪个？<br />这些观点：1、Stripes使用了annotation代替XML，只是换汤不换药：由于元数据更接近代码，所以修改默认的配置非常方便，不像XML那样复杂，这是实质的变化。2、Annotation意味着你只能有一套配置：我认为90%的action都有自己的一套配置！Stripes会根据继承关系寻找Annotations，子类的annotation会覆盖父类的，因为像validation都是可以继承的，如果特别需要还可以覆盖。这样很合理。在1.3中允许validations基于UI事件进行。它向后兼容，不需要可以不用。<br />6、你对Ruby on Rails的看法如何？<br />我认为Java社区有很多可以从RoR学习的地方。Stripes学习了RoR的前端部分，开发者可以减少配置量。但是RoR的RHTML让我想到了以前的JSP中混乱的scriptlet。而后面的ActiveRecord是一个很好的理念，实现的也很好。ActiveRecord比Hibernate等复杂的ORM工具要容易理解，因为这样的特点RoR才引起了这么大的波澜。</p>
		<p>
				<font size="4">
						<strong>Struts Action 1(Don Brown)</strong>
						<br />
				</font>1、你认为你的framework的“甜点”在哪里？他最适合哪种类型的项目？ <br />文档和用户基础，书籍和背后的支持。容易雇到人（也容易找工作）。虽然其他项目的理念比这个要先进，但是这些不算什么。实际上，Web层是很容易也很直接的。<br />2、它不适合于什么样的场景？在这些场景你推荐什么fremework？它是哪个？<br />如果你需要portlets或者复杂的页面（显示很多东西），那么Struts要么无法工作要么太枯燥。这种情况你需要一个基于组件的framework，如JSF、Tapestry/Wicket。<br />3、在下面提到的framework中，你试验过他们么？如果试验过，你比较喜欢哪个？你不喜欢哪个？<br />这些我基本都试验过，他们每个都工作的很不错。<br />4、你的framework的未来会怎样？对于用户开发会有什么方便使用的变化？你会原生支持Ajax么？你们计划支持它了么？<br />Struts Action 2基于WebWork2，很快会开始。现在已经支持Ajax了，我们在寻找更加容易的开发方式，JSF支持（Struts Shale），continuation支持，还有支持更多的脚本语言（BSF扩展脚本撰写Action）。<br />5、有对你们的framework的传言需要澄清么？如果有，是哪个？<br />Struts太过时了，而且也不酷，难于使用。但是你可以自己修改或者扩展它。我认为团队对于你的限制远大于framework对你的限制。<br />6、你对Ruby on Rails的看法如何？<br />不需要D&amp;D工具，旨在帮助开发人员提高开发效率的好例子。我们在Action 2中将学习它的先进理念。</p>
		<p>
				<font size="4">
						<strong>Tapestry(Howard Lewis Ship) </strong>
						<br />
				</font>1、你认为你的framework的“甜点”在哪里？他最适合哪种类型的项目？ <br />我想Tapestry对于中等规模或者大规模的应用会带来很多好处（甚至你可以在单页面的应用程序中获得好处）。这里有允许你创建新的组件的良好工具。Tapestry不关心数据从哪里来，很多“项目类型”都基于切面（aspect）（如CRUD vs. RSS feed vs. etc.）。我认为Tapestry非常容易与IoC集成（HiveMind或与Spring），方便进行测试。<br />2、它不适合于什么样的场景？在这些场景你推荐什么fremework？它是哪个？<br />我在其它Java framework中没有找到到强于Tapestry的优点。但是对于RoR，我自己没有使用过使用，很难说RoR中的项目应该是什么样子。我没有仔细对比过RIFE，它看起来受了RoR影响，尤其是类似ActiveRecord的数据访问层。但是如果你的应用需要特定的URL格式，那么在Tapestry中奋战胜算不大。<br />3、在下面提到的framework中，你试验过他们么？如果试验过，你比较喜欢哪个？你不喜欢哪个？<br />在这两年来我没怎么尝试过Tapestry以外的东西。我没怎么学习RoR，因为时间太有限了。<br />4、你的framework的未来会怎样？对于用户开发会有什么方便使用的变化？你会原生支持Ajax么？你们计划支持它了么？<br />Tapestry 4.0有很好的Ajax支持，通过Tacos库。而Tapestry 4.1还要进一步强化这方面的支持。<br />Tapestry 5.0提供了明显的改进：没有abstract类（Tapestry的怪癖:）。没有强迫的继承关系。对属性进行annotation而不是方法。没有XML，只有模版和annotaions。只能类装载，自动寻找类的变化。最小化API，超越annotaion。面向方面（Aspect-oriented）模块构造，使用mix-ins。<br />5、有对你们的framework的传言需要澄清么？如果有，是哪个？<br />Tapestry 3.0还不容易测试，4.0改善了一些。Tapestry只是个人秀；实际上我们有很多活跃的贡献者。Tapestry的学习曲线非场陡峭。它只有漂亮的模版实现；实际上Tapestry的特点在于状态管理（允许对象存储状态，而不是多线程的单例来管理requests之间的游离和持久状态）<br />6、你对Ruby on Rails的看法如何？<br />很有影响力。但是模版的实现非常丑陋。我听到了很多意见，关于RoR的优缺点。基于我的基本理解，这些观念对Tapestry 4产生了影响（它对Tapestry 5影响更深）。<br />RoR意味着限制了你的选择：如果你选择RoR那么就要尊旬它的实践（CoC..），看起来你的钱会花的恨值。这些类似Microsoft的哲学。而Java更崇尚给你更宽松的选择，不限定你使用的工具，但是暧昧的说这需要你对你的工具理解更深。不仅对Tapestry，还对于JEE、Spring这写entire stack的框架，需要从RoR学习，不仅提供工具，还需要提供整套的解决方案。</p>
		<p>
				<font size="4">
						<strong>Trails(Chris Nelson) </strong>
						<br />
				</font>1、你认为你的framework的“甜点”在哪里？他最适合哪种类型的项目？ <br />Trails的应用程序只需要Web界面和持久化的domain model就可以了。Trails给你的domain model快速的提供一个界面，除了POJO自己不需要附加的代码。Trails允许你修改界面的外观和行为，包括验证、i18n、安全。这些都不需要java代码生成，不喜欢代码生成的人应该感觉很舒适。<br />2、它不适合于什么样的场景？在这些场景你推荐什么fremework？它是哪个？<br />Trails讲究够用就好。它允许你快速交付，问问你的客户：“这样够好么？”。这会改变你的工作流程，当然这不是可以覆盖所有需求的解决方案。当UI需求很高，Trails没有优势。我认为Trails适合于混合的应用，对于管理员他们只需要够用就好，那么就可以使用Trails。其它的部分我们可以订制开发，我们在使用Tapestry、Hibernate、Spring来实现这些部分，Trails正是基于它们。对于非交互的应用，Trails也不适合，如报表应用，可以考虑Eclipse BIRT。<br />3、在下面提到的framework中，你试验过他们么？如果试验过，你比较喜欢哪个？你不喜欢哪个？<br />我用Struts很多。它曾经是伟大的framework。主要的缺陷是它不能自动帮定数据到domain model。我也研究过JSF，它比Struts强，但是自定义组建非常难。Tapestry非常便于自定义组建，尤其对于建立高阶组件（有其它组件组成的）非常方便，Trails正在使用它。<br />4、你的framework的未来会怎样？对于用户开发会有什么方便使用的变化？你会原生支持Ajax么？你们计划支持它了么？<br />对于Trails来说我们站在巨人的肩膀上。Tapestry在ajax功能作了很多努力，所以Trails也不难与其共舞。但是我们需要创建更多的例子来演示这些。我们也致力于让Trails容易介入到已经进行的项目中。以后Trails还要加入基于实例的安全（instance-based security）（目前正在使用基于角色的role-based），还有method invocation。<br />5、有对你们的framework的传言需要澄清么？如果有，是哪个？<br />Trails是对RoR的移植。Trails的名字来自Rails。它是基于Rails的理念，但不是对它的移植。<br />6、你对Ruby on Rails的看法如何？<br />我认为我们有很多需要从RoR学习的地方，那将帮助我们享受开发Web程序的惬意。</p>
		<p>
				<font size="4">
						<strong>WebWork(Patrick Lightbody) </strong>
						<br />
				</font>1、你认为你的framework的“甜点”在哪里？他最适合哪种类型的项目？ <br />一般来说，WebWork一般适合小的团队，它们愿意保持一双脏手，学习开元工具如何使用。WebWork不面向“轮椅程序员”，那些人只喜欢拖拽式的开发。WebWork给花时间学习它的人回报。例如，直到输入和输出的人（阅读了参考文档，那样很好）能够容易的创建ActionMapper和Configuration实现来提供“惯例”代替配置（CoC）的方便。我最近的例子中，URL是这样“/project/123/suite/456/test/create”影射到“com.autoriginate.actions.project.suite.test.CreateAction”，然后自动的传递参数：projectId=123、suiteId=456。而Result是“[action].jsp”或者“[action]-[result].jsp”，也可以通过annotation来配置。<br />也就是说，WebWork是你的应用程序framework中的最佳基础工具。在这种情况以外也很好，但是目前不算最佳的“甜点”。<br />除去这些一般的，WebWork对于正在创建需要插件和扩展的产品的人是必备的。例如JIRA、Confluence、Jive Forums。因为WebWork支持广泛的模版语言（Velociy和FreeMarker），完整的tag支持，模块写好后非常容易插入。一个jar包就可以包括所有的action和view（得益于ftl的classpath支持）。最终的效果很好：在Confluence中你可以通过管理界面上传一个jar，这个plug-in就会自动部署。这是因为Atlassian（Confluence、Jira的小组）非常了解这个framework，并且作了很多的贡献。<br />2、它不适合于什么样的场景？在这些场景你推荐什么fremework？它是哪个？<br />与其它action framework相同，WebWork在控制状态和wizards上比较弱。如果你写了很多长的wizards，JSF可能是比较好的解决方案。我还想说，文档还需要改善（参考文档还不错，但是教程、cookbooks和FAQ还比较差），如果没有一个WebWork高手作为项目领队，新手可能会敬而远之。<br />对于非常简单的程序，我推荐使用简单的JSP或者Spring MVC，如果用户接受Spring的话。但是总的来说，我认为在action framework中WebWork是最好的。<br />3、在下面提到的framework中，你试验过他们么？如果试验过，你比较喜欢哪个？你不喜欢哪个？<br />我试验过RIFE、Spring MVC、Struts、Spring Web Flow，还有一点点Tapestry。我发现RIFE的概念很优秀，但是它的实现不怎么样。不难想象Geert还是使用“m_”作为字段的前缀。它看起来不像Java。模版难住了我，所以就没有继续看。<br />Spring MVC还可以，但是它是一个非常简单的framework实现。WebWork的数据绑定（WebWork世界中称为类型转换）要强多了，而且是自动的（而Spring需要自己写property editors）。在Spring中的view替换支持泰有限了，而WebWork中的UI tags在Spring中压根没有提供。Spring中你可以使用JSP 2.0轻松的写自己的tag，但是不支持其它的语言。<br />Spring Web Flow：XML让我抓狂。太过火了，不管Keith的主张，它“不支持任何的Web framework”。这个web framwork回避掉了WebWork、Spring MVC、Struts或者其它framework中的99%。我倒不是说这是个坏主意，但是我应该诚实的说它是一个完整的框架。<br />Tapestry很优雅，但是HTML属性（jwcid）惹人厌。我接受这种理念，且实践中这会带来一些好处（Shale也有相似的地方）。但是实际上，我发现“HTML/CSS开发者”和“app开发者”一般是同一个人，Tapestry就架设如此。实际上，由于Ajax的推动，我想越来越多的“程序逻辑”会被嵌入到UI；这样的话，Tapestry的模型就不那么适宜了。<br />4、你的framework的未来会怎样？对于用户开发会有什么方便使用的变化？你会原生支持Ajax么？你们计划支持它了么？<br />在Struts Action 2.0我们希望：更好的文档。支持标准（如果可以，我们希望用JSTL代替OGNL，但是首先要保证不会有功能损失）。增强AJAX支持，提供更多的widgets：如自动完成。解除配置地狱；提供更多的选择，如我们开始所说的CoC。<br />5、有对你们的framework的传言需要澄清么？如果有，是哪个？<br />他需要很多的配置：我已经演示过，通过CoC风格，它可以做的比Rails更好（Rails的管理部允许内嵌controllers）。<br />6、你对Ruby on Rails的看法如何？<br />非常重要的一点是，我要说RoR不能与大多数的framework对比，除了RIFE和Seam。对比RoR和WebWork就相当于对比Hibernate和JDBC。一个是full stack，另一个只是stack中的一部分。<br />另一个重要的问题：DHH是个怪胎，但是聪明的怪胎。它的高效率无可争辩，它被称为Rails。<br />好的，我们不说这个，随便说说别的：<br />我使用Rails创建了一个小的app。我把它扔掉并很快用Java重写了。我认为Rails可以让你的app中的80%快速完成；而剩下的20%比前面80%需要花的时间还多。当然程序开发就是这样。脚手架非常酷，尤其是ActiveRecord在运行时改变类。但是后来你需要写UI、自定义的验证规则，自定义安全影射等等。一个基于CRUD的app能够在30分钟内运行并不意味着你能以这个速度完成它。<br />Rails的web framework部分相比于WebWork很可怕。实际上根本无法比较。它的实现更接近于Spring MVC的简单功能。<br />完整的stack非常棒。他们在这方面做得很好，这里Java还有差距需要追赶。WebWork是web stack，但是持久化解决方案并不确定。所以最大的问题在于即使WebWork和SiteMesh提供了如配置动态读取和动态类reloading，Spring、iBatis和Hibernate并不提供。它们至少需要提供配置重读取后才可以发展出类似Rails那样的功能。类似的，Hibernate和iBatis对WebWork等的请求提供的支持不够。对于一个类，我可以不需要再xwork.xml中进行配置，但是持久化引擎并不允许我们这样做。当这些功能能够同时具备，没准一个complete stack的框架就会推出。<br />要求快5倍10倍是愚蠢的。可靠的工程师都知道开发产品的时候最大的警力都花费在构思代码上，而不是书写代码。定义需求，获取反馈，市场定位，定义数据库结构，映射用户接口。不管使用什么语言，你需要思考很长时间。没有语言或者框架能够提升思考的速度。<br />最后，Rails提供了：用脚本语言良好实现的stack。Python、Perl尤其是PHP中的其它框架还没有成熟。我认为“PHP猴子”们还有很多事情要做，他们通常不是很有才干的工程师。（可能我翻译错误了，希望纠正）。在脚本语言中提供良好的框架，人们能够实现设计精良的app并的到回报（因为脚本语言的特点）。不只是“管理代替配置CoC”甚至是集成stack，Java需要的是立刻反射出变化的能力。很多Java开源领袖认为“修改web.xml”的重新载入是一种方法。这种智力游戏应该结束了。我们不仅仅需要配置文件和类的重新载入，我们需要社区给Sun足够的压力，使其能够在下一代的JVM中提供热插拔（HotSwap）的能力。或者，更加复杂的程序模型，如OSGi，需要进一布被社区所接受。当然我并不希望走那条路线。</p>
		<p>
				<font size="5">
						<strong>
								<font size="4">Wicket(Eelco Hillenius)</font>
						</strong>
						<br />
				</font>1、你认为你的framework的“甜点”在哪里？他最适合哪种类型的项目？<br />我认为有5点：Wicket是以代码为中心的：可以在view层进行OO编程。组件是完全自管理的：容易创建和重用。概念的分离是清晰的也是强迫的。干净的模版。开发伸缩性大-就像OO一样。<br />2、它不适合于什么样的场景？在这些场景你推荐什么fremework？它是哪个？<br />Wicket不适合UI很简单且只读的场合。这时页面脚本更加适合，比如JSP，或者JSF。如果你需要无限的可伸缩性，你可能需要状态无关的实现。从1.2版开始，Wicket也有无状态页面的概念，这样可伸缩性与其它framework差不多了。<br />3、在下面提到的framework中，你试验过他们么？如果试验过，你比较喜欢哪个？你不喜欢哪个？<br />JSF：<br />优点：基于组件。工业背景。工具支持。一些扩展让他更容易使用。它允许你从传统JSP升级到JSF。<br />缺点：它缺少其它API的优雅。以JSP为中心。配置很多而且代码很难看。有很多种实现。它让我回忆起EJB1/2，以厂商为中心等等。<br />RIFE：没用过，说了一大堆。<br />Seam：不是一个真正的Web framework。类似JSF扩展。如果使用EJB/JSF/JBoss组合，这个选择很好。但是不遵循JSR 227/235。<br />Tapestry：很好，4.0版本好了很多。我把它推荐给我所工作的公司。Wicket更加以编程为中心。而Tapestry更加pragmatic。<br />Trails：从来没用过。<br />Spring Web Flow：framework本身很好，但是我不喜欢它的stacking。如果用工作流，我希望选择一个如jBMP的方案。我也不喜欢以流为中心的解决方案，认为这样很过程化。<br />WebWork、Spring MVC、Struts：Model 2的framework糟透了。我用过几年，也对Maverick贡献过代码，但是我彻底失去兴趣了。Model 2 framework太过程化了，这些程序员不知道怎么用OO编程。我宁可雇佣一个Swing编程的人也不会去选择一个使用Model 2 framework编程的人，因为Swing编程的人写的程序一般更漂亮。……如果让我从这些Model 2 framework中挑一个出来，我选择Stripes，它抛弃了model 2中的一些不好的方面。<br />4、你的framework的未来会怎样？对于用户开发会有什么方便使用的变化？你会原生支持Ajax么？你们计划支持它了么？<br />我们将会支持Java5。我们会增强Spring支持，复杂的权限认证支持，和基于角色的参考实现，还会提供原生AJAX支持，URL加载（nice URLs），无状态页等。<br />我们的市场占有率不高，但是用户群在提高。我正在写“Wicket In Action”（Manning出版）正在筹划中，今年夏天会出版。<br />5、有对你们的framework的传言需要澄清么？如果有，是哪个？<br />关于伸缩性的问题是第一位的。程序的可伸缩型一般是由数据库性能差或者缓存策略查询优化并发等问题。服务器端可伸缩性并不一定不可扩展，可以通过集群来继绝。……<br />6、你对Ruby on Rails的看法如何？<br />我喜欢我看到的Ruby，如果我有时间我还会仔细把玩它。如果不是Wicket的问题，我希望更多的实践RoR。……<br /><br />原文地址：<a href="/iamtin/archive/2006/03/30/webframeworksweetspots.html">http://www.blogjava.net/iamtin/archive/2006/03/30/webframeworksweetspots.html</a></p>
<img src ="http://www.blogjava.net/iKingQu/aggbug/38359.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iKingQu/" target="_blank">風向逆轉 - 就要爪哇</a> 2006-03-30 21:01 <a href="http://www.blogjava.net/iKingQu/articles/38359.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[收藏]Java中文问题的一般解决办法</title><link>http://www.blogjava.net/iKingQu/articles/38170.html</link><dc:creator>風向逆轉 - 就要爪哇</dc:creator><author>風向逆轉 - 就要爪哇</author><pubDate>Wed, 29 Mar 2006 21:14:00 GMT</pubDate><guid>http://www.blogjava.net/iKingQu/articles/38170.html</guid><wfw:comment>http://www.blogjava.net/iKingQu/comments/38170.html</wfw:comment><comments>http://www.blogjava.net/iKingQu/articles/38170.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iKingQu/comments/commentRss/38170.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iKingQu/services/trackbacks/38170.html</trackback:ping><description><![CDATA[
		<p>
				<a name="1">
						<span class="atitle">
								<strong>
										<font size="4">汉字编码的常识</font>
								</strong>
						</span>
				</a>
		</p>
		<p>我们知道，英文字符一般是以一个字节来表示的，最常用的编码方法是 ASCII 。但一个字节最多只能区分256个字符，而汉字成千上万，所以现在都以双字节来表示汉字，为了能够与英文字符分开，每个字节的最高位一定为1，这样双字节最多可以表示64K格字符。我们经常碰到的编码方式有 GB2312、BIG5、UNICODE 等。关于具体编码方式的详细资料，有兴趣的读者可以查阅相关资料。我肤浅谈一下和我们关系密切的 GB2312 和 UNICODE。GB2312 码，中华人民共和国国家标准汉字信息交换用编码，是一个由中华人民共和国国家标准总局发布的关于简化汉字的编码，通行于中国大陆地区及新加坡，简称国标码。两个字节中，第一个字节（高字节）的值为区号值加32（20H），第二个字节（低字节）的值为位号值加32（20H），用这两个值来表示一个汉字的编码。UNICODE 码是微软提出的解决多国字符问题的多字节等长编码，它对英文字符采取前面加“0”字节的策略实现等长兼容。如 “A” 的 ASCII 码为0x41，UNICODE 就为0x00，0x41。利用特殊的工具各种编码之间可以互相转换。</p>
		<p>
				<br />事实上，Java的中文问题都是由于Java应用所采用的缺省编码格式与目标或者应用所要读入字符的编码格式不同而造成的（具体参见文献1）。对于如何解决Java的中文问题，通常有四种方法：</p>
		<p>1） 选择JDK的中文本地化版本。尽管Java2 JDK的中文本地化版本（http://java.sun.com/products/jdk/1.2/chinesejdk.html）并不是一个官方的版本，Sun公司也没有承诺会对该本地化版本进行升级，但其仍不失为一个Java中文问题的解决方案。</p>
		<p>2） 选择合适的编译参数。对于Java的国际版本来讲，我们也可以在编译Java应用的时候通过指定确定的编码机制来实现其编译结果对中文的支持。例如，对于需要支持繁体中文和简体中文应用可以通过javac -encoding big5 sourcefile.java 和javac -encoding gb2312 sourcefile.java来编译源程序。</p>
		<p>3） 通过编程的方式实现字符编码的转换代码。通过编程的方式来解决Java的中文问题，已经成为了一种较为普遍的做法。下面就是一种最常见的字符编码转换函数，其将字符的编码格式转换为中文Windows系统的GBK编码形式。<br /></p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000"> </span>
				<span style="COLOR: #0000ff">static</span>
				<span style="COLOR: #000000"> String toChinese(String strvalue)<br /><img id="Codehighlighter1_51_315_Open_Image" onclick="this.style.display='none'; Codehighlighter1_51_315_Open_Text.style.display='none'; Codehighlighter1_51_315_Closed_Image.style.display='inline'; Codehighlighter1_51_315_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_51_315_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_51_315_Closed_Text.style.display='none'; Codehighlighter1_51_315_Open_Image.style.display='inline'; Codehighlighter1_51_315_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />   </span>
				<span id="Codehighlighter1_51_315_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
						<img src="http://www.blogjava.net/images/dot.gif" />
				</span>
				<span id="Codehighlighter1_51_315_Open_Text">
						<span style="COLOR: #000000">{<br /><img id="Codehighlighter1_61_255_Open_Image" onclick="this.style.display='none'; Codehighlighter1_61_255_Open_Text.style.display='none'; Codehighlighter1_61_255_Closed_Image.style.display='inline'; Codehighlighter1_61_255_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_61_255_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_61_255_Closed_Text.style.display='none'; Codehighlighter1_61_255_Open_Image.style.display='inline'; Codehighlighter1_61_255_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />     </span>
						<span style="COLOR: #0000ff">try</span>
						<span id="Codehighlighter1_61_255_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_61_255_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />       </span>
								<span style="COLOR: #0000ff">if</span>
								<span style="COLOR: #000000">(strvalue</span>
								<span style="COLOR: #000000">==</span>
								<span style="COLOR: #0000ff">null</span>
								<span style="COLOR: #000000">)<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />         </span>
								<span style="COLOR: #0000ff">return</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">null</span>
								<span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />       </span>
								<span style="COLOR: #0000ff">else</span>
								<span style="COLOR: #000000">
										<br />
										<img id="Codehighlighter1_132_244_Open_Image" onclick="this.style.display='none'; Codehighlighter1_132_244_Open_Text.style.display='none'; Codehighlighter1_132_244_Closed_Image.style.display='inline'; Codehighlighter1_132_244_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
										<img id="Codehighlighter1_132_244_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_132_244_Closed_Text.style.display='none'; Codehighlighter1_132_244_Open_Image.style.display='inline'; Codehighlighter1_132_244_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />         </span>
								<span id="Codehighlighter1_132_244_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
										<img src="http://www.blogjava.net/images/dot.gif" />
								</span>
								<span id="Codehighlighter1_132_244_Open_Text">
										<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />           strvalue </span>
										<span style="COLOR: #000000">=</span>
										<span style="COLOR: #000000"> </span>
										<span style="COLOR: #0000ff">new</span>
										<span style="COLOR: #000000"> String(strvalue.getBytes(</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">ISO8859_1</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">), </span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">GBK</span>
										<span style="COLOR: #000000">"</span>
										<span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />           </span>
										<span style="COLOR: #0000ff">return</span>
										<span style="COLOR: #000000"> strvalue;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />         }</span>
								</span>
								<span style="COLOR: #000000">
										<br />
										<img id="Codehighlighter1_274_310_Open_Image" onclick="this.style.display='none'; Codehighlighter1_274_310_Open_Text.style.display='none'; Codehighlighter1_274_310_Closed_Image.style.display='inline'; Codehighlighter1_274_310_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" />
										<img id="Codehighlighter1_274_310_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_274_310_Closed_Text.style.display='none'; Codehighlighter1_274_310_Open_Image.style.display='inline'; Codehighlighter1_274_310_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />         }</span>
						</span>
						<span style="COLOR: #0000ff">catch</span>
						<span style="COLOR: #000000">(Exception e)</span>
						<span id="Codehighlighter1_274_310_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">
								<img src="http://www.blogjava.net/images/dot.gif" />
						</span>
						<span id="Codehighlighter1_274_310_Open_Text">
								<span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />               </span>
								<span style="COLOR: #0000ff">return</span>
								<span style="COLOR: #000000"> </span>
								<span style="COLOR: #0000ff">null</span>
								<span style="COLOR: #000000">;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />      }</span>
						</span>
						<span style="COLOR: #000000">
								<br />
								<img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />   }</span>
				</span>
		</div>
		<p>4） 定义字符输出集。对于JSP应用，我们可以通过&lt;%@ page contentType="text/html; charset=GBK" %&gt;或&lt;%@ page contentType="text/html; charset=GB2312" %&gt;来定义JSP页面的字符输出集。当然，我们也可以通过HTML的标记&lt;META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gb2312"&gt;来定义字符的输出集。<br /></p>
		<p>
				<a name="4">
						<span class="atitle">
								<font face="Arial" size="4">分析的原则</font>
						</span>
				</a>
		</p>
		<p>
				<font face="Arial" size="4">
				</font>
		</p>
		<p>总的说来，所有解决Java中文处理的方法都不是很复杂。相反的是，由于Java技术特别是J2EE技术涉及的内容繁多，各种Web服务器、应用服务器以及JDBC数据库驱动等参差不齐，所以如何正确而及时的发现应用的中文处理问题则变得相对复杂的多。那么我们如何来发现这些问题呢？</p>
		<p>通常，Java处理中文时所产生的问题都是由于用户的Java应用所采用的缺省编码格式与目标或者应用所要读入字符的编码格式不同而造成的，而引起这些不同的一个主要原因就是用户的Java应用与其它应用进行了编码格式不匹配的数据交换（包括直接或间接的数据输入、输出）。所以，为了及时发现问题，我们可以由这一点入手，根据以下的原则对应用进行分析：</p>
		<ol>
				<li>
						<b>注意字符变量情况</b>。由于变量的字符编码形式较为隐蔽，多次变量间数值的改变和运算可能会引起字符集的改变；在变量与页面所提交数据的各种操作中，较容易发生不同编码格式字符进行运算的情况。 
</li>
				<li>
						<b>注意任何形式的字符读入与输出</b>。之所以要提到任何形式，是因为Java应用大多数都是作为网络应用开发的，所以与其它语言的应用相比，Java应用需要面对网络世界各种各样的字符数据交换形式。例如各种表单的数据提交，URL形式的数据读入，经过加密运算的字符数据交换，网页控件选择结果的输入，控件内容的的显示（如List控件）等等。 
</li>
				<li>
						<b>小心使用第三方的组件和应用</b>。由于第三方组件和应用的实现是非透明的，所以一般情况下，我们很难判断这些组件或驱动的缺省编码格式是什么，也无法对其进行控制。因此，在使用它们所提供的接口函数进行数据交换的时候要特别注意，如果确实出现中文无法正确处理情况，应首先检查我们自己的代码并调整相关代码以适应这些接口，因为这些组件或者应用基本上不会提供调整编码机制的接口。必要时，我们可能需要采用其它可替换的组件或者应用。 
</li>
				<li>
						<b>注意被请求对象所含有的数据输入与输出</b>。这是非常隐蔽的一类情况，当我们的应用以对象的方式（例如序列化的对象）进行交互时，如果这个对象内部含有字符数据的处理过程，或者含有某些数据的输入、输出，甚至是抛出一段用中文注解的异常，都可能出现中文无法正确显示等问题。由于这些行为往往被封装在对象中，所以我们在编写程序时，很容易忽略这种可能情况。并且这种情况带有一定的不可预见性，例如我们可能不清楚这个对象会在什么时候抛出什么样的异常，所以这时我们就需要做一定的测试工作。 
</li>
				<li>
						<b>注意数据库的数据访问过程</b>。Java通过JDBC与数据库建立连接。对于JDBC驱动程序来说，由于目前大部分的JDBC驱动程序并不是针对中文系统而设计的(中文数据大都采用ISO-8859-1编码方式)，所以一般情况下在数据读写过程中往往都需要字符编码的转化。但是我们仍建议用户在使用这些JDBC驱动时，仔细阅读它的说明。如果确实无法弄清JDBC字符数据的编码到底是什么，我们的建议是做一些必要的测试。例如下面是一组在简体中文Win2000平台下，采用Weblogic 6.0所提供的JDBC驱动从MS SQL Server2000中正确读入中文字符的代码（例子中进行了字符运算）： <br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">    <img src="http://www.blogjava.net/images/dot.gif" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />Class.forName(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">weblogic.jdbc.mssqlserver4.Driver</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">).newInstance();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />      conn </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> myDriver.connect(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">jdbc:weblogic:mssqlserver4</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">, props);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />      conn.setCatalog(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">labmanager</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />     Statement st </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> conn.createStatement();<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        </span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">execute a query</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">    String  testStr;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />String testTempStr </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> String() ;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />        testStr </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> </span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> String(testTempStr.getBytes(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">ISO-8859-1</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">));</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">编码转化</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">    DatabaseMetaData DBMetaData </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">conn.getMetaData();<br /><img id="Codehighlighter1_475_483_Open_Image" onclick="this.style.display='none'; Codehighlighter1_475_483_Open_Text.style.display='none'; Codehighlighter1_475_483_Closed_Image.style.display='inline'; Codehighlighter1_475_483_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_475_483_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_475_483_Closed_Text.style.display='none'; Codehighlighter1_475_483_Open_Image.style.display='inline'; Codehighlighter1_475_483_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />    ResultSet rs </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> DBMetaData.getTables(</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">, </span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">,</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">,</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000"> String[]</span><span id="Codehighlighter1_475_483_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_475_483_Open_Text"><span style="COLOR: #000000">{</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">TABLE</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">}</span></span><span style="COLOR: #000000"> );<br /><img id="Codehighlighter1_506_652_Open_Image" onclick="this.style.display='none'; Codehighlighter1_506_652_Open_Text.style.display='none'; Codehighlighter1_506_652_Closed_Image.style.display='inline'; Codehighlighter1_506_652_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_506_652_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_506_652_Closed_Text.style.display='none'; Codehighlighter1_506_652_Open_Image.style.display='inline'; Codehighlighter1_506_652_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" />    </span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000"> (rs.next())</span><span id="Codehighlighter1_506_652_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_506_652_Open_Text"><span style="COLOR: #000000">{<br /><img id="Codehighlighter1_565_648_Open_Image" onclick="this.style.display='none'; Codehighlighter1_565_648_Open_Text.style.display='none'; Codehighlighter1_565_648_Closed_Image.style.display='inline'; Codehighlighter1_565_648_Closed_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_565_648_Closed_Image" style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_565_648_Closed_Text.style.display='none'; Codehighlighter1_565_648_Open_Image.style.display='inline'; Codehighlighter1_565_648_Open_Text.style.display='inline';" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />        </span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000"> j</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">; j</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">rs.getMetaData().getColumnCount(); j</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)</span><span id="Codehighlighter1_565_648_Closed_Text" style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.blogjava.net/images/dot.gif" /></span><span id="Codehighlighter1_565_648_Open_Text"><span style="COLOR: #000000">{<br /><img src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />testStr </span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"> testStr </span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">String(rs.getObject(j).toString().getBytes(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">ISO-8859-1</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">));<br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />            }</span></span><span style="COLOR: #000000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />        }</span></span></div></li>
				<li>然而，需要注意的是，不同的JDBC驱动对相同的数据库的支持并不同，而同一类JDBC驱动对不同的  数据库的支持也不相同，也就是说我们的字符转化代码在JDBC驱动改变甚至是版本变化情况下都有可能无法正确工作。例如对于上面的例子，在同样的环境下改用i-net 的Una 2000 Driver Version 2.03 for MS SQL Server时，是无法正确处理中文的。原因很简单，这个JDBC驱动本身支持的就是GBK的编码机制，所以根本就不需要做任何的编码转化。  
</li>
				<li> <b>必要的测试</b>。由于Java中文问题的产生随着Web服务器，浏览器，运行环境和开发工具的不同都可能发生变化，所以为了更好的避免问题的发生，我们必须作一些针对性的测试。另外，在我们确实无法通过分析来确定Java的中文处理问题是否可能发生的情况下或者无法知道问题的发生是由于哪个环节（是Web服务器，浏览器还是JDBC数据驱动等等）引起的时候，测试工作则变得非常重要。并且我们可能需要较为全面的测试，例如对Web服务器，浏览器和JDBC数据驱动等都要做测试，这样有利于我们找出那些隐藏在多个环节协调过程中所产生的问题。 </li>
		</ol>
		<p>
				<br />Java 的基本类也可能存在问题。由于国际化的工作并不是在国内完成的，所以在这些基本类发布之前，没有经过严格的测试，所以对中文字符的支持并不像 Java Soft 所声称的那样完美。前不久，我的一位技术上的朋友发信给我说，他终于找到了 <b>Java Servlet 中文问题的根源</b>。两周以来，他一直为 Java Servlet 的中文问题所困扰，因为每面对一个含有中文字符的字符串都必须进行强制转换才能够得到正确的结果（这好象是大家公认的唯一的解决办法）。后来，他确实不想如此继续安分下去了，因为这样的事情确实不应该是高级程序员所要做的工作，他就找出 Servlet 解码的源代码进行分析，因为他怀疑问题就出在解码这部分。经过四个小时的奋斗，他终于找到了问题的根源所在。原来他的怀疑是正确的， Servlet 的解码部分完全没有考虑双字节，直接把 %XX 当作一个字符。（原来 Java Soft 也会犯这幺低级的错误！） </p>
		<p>如果你对这个问题有兴趣或者遇到了同样的烦恼的话，你可以按照他的步骤 <b>对Servlet.jar 进行修改</b>： </p>
		<p>找到源代码 HttpUtils 中的 static private String parseName ，在返回前将 sb（StringBuffer） 复制成 byte bs[] ，然后 return new String(bs,”GB2312”)。作上述修改后就需要自己解码了：</p>
		<p>HashTable form=HttpUtils .parseQueryString(request.getQueryString())或者</p>
		<p>form=HttpUtils.parsePostData(……)</p>
		<p>千万别忘了编译后放到 Servlet.jar 里面。<br /><br /><br />java中文问题详解<br /><b><span><a href="http://www.cn-java.com/target/news.php?news_id=210" target="_blank">http://www.cn-java.com/target/news.php?news_id=210</a></span></b><br />关于Java中文问题的几条分析原则<b><span><a href="http://www-900.ibm.com/developerWorks/cn/java/l-javachinese/index.shtml" target="_blank">http://www-900.ibm.com/developerWorks/cn/java/l-javachinese/index.shtml</a></span></b><br />全方位解决xml中文问题<b><span><a href="http://www.csdn.net/develop/read_article.asp?id=18901" target="_blank">http://www.csdn.net/develop/read_article.asp?id=18901</a></span></b><br />servlet 中的汉字编码问题<b><span><a href="http://www-900.ibm.com/developerWorks/cn/java/jsp_dbcsz/index.shtml" target="_blank">http://www-900.ibm.com/developerWorks/cn/java/jsp_dbcsz/index.shtml</a></span></b><br />Java程序的国际化和本地化介绍<b><span><a href="http://www-900.ibm.com/developerWorks/cn/java/joy-i18n/index.shtml" target="_blank">http://www-900.ibm.com/developerWorks/cn/java/joy-i18n/index.shtml</a></span></b><br />Java 编程技术中汉字问题的分析及解决<b><span><a href="http://www-900.ibm.com/developerWorks/cn/java/java_chinese/index.shtml" target="_blank">http://www-900.ibm.com/developerWorks/cn/java/java_chinese/index.shtml</a></span></b><br />Unicode专题<b><span><a href="http://www-900.ibm.com/developerWorks/cn/theme/unicode.shtml" target="_blank">http://www-900.ibm.com/developerWorks/cn/theme/unicode.shtml</a></span></b><br />这里也有篇专家写的文章:<br /><b><span><a href="http://www.javaworld.com/javaworld/jw-04-2004/jw-0419-multibytes.html" target="_blank">http://www.javaworld.com/javaworld/jw-04-2004/jw-0419-multibytes.html </a></span></b><!-- the post be hidden --></p>
<img src ="http://www.blogjava.net/iKingQu/aggbug/38170.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iKingQu/" target="_blank">風向逆轉 - 就要爪哇</a> 2006-03-30 05:14 <a href="http://www.blogjava.net/iKingQu/articles/38170.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[收藏]MVC的一幅简单素描</title><link>http://www.blogjava.net/iKingQu/articles/37856.html</link><dc:creator>風向逆轉 - 就要爪哇</dc:creator><author>風向逆轉 - 就要爪哇</author><pubDate>Tue, 28 Mar 2006 10:57:00 GMT</pubDate><guid>http://www.blogjava.net/iKingQu/articles/37856.html</guid><wfw:comment>http://www.blogjava.net/iKingQu/comments/37856.html</wfw:comment><comments>http://www.blogjava.net/iKingQu/articles/37856.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iKingQu/comments/commentRss/37856.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iKingQu/services/trackbacks/37856.html</trackback:ping><description><![CDATA[
		<font size="2">
				<span lang="ZH-CN" style="FONT-FAMILY: SimSun">作者：</span>
				<span lang="EN-US" style="FONT-FAMILY: Verdana">
						<a class="" title="" href="/flyingis/" target="_blank">
								<font color="#000080">Flyingis</font>
						</a>
				</span>
		</font>   <br />原文地址：<a href="/flyingis/archive/2006/03/27/37657.html">http://www.blogjava.net/flyingis/archive/2006/03/27/37657.html</a><p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: SimSun"> </p><p style="FONT-SIZE: 10pt; MARGIN: 0in"><span lang="ZH-CN" style="FONT-FAMILY: SimSun">素描工具：</span><span lang="EN-US" style="FONT-FAMILY: Verdana">Struts + Hibernate 3</span></p><p style="FONT-SIZE: 10pt; MARGIN: 0in"><span lang="ZH-CN" style="FONT-FAMILY: SimSun">素描对象：一个足够简单的基于</span><span lang="EN-US" style="FONT-FAMILY: Verdana">MVC</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">的</span><span lang="EN-US" style="FONT-FAMILY: Verdana">Web</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">应用</span></p><p style="FONT-SIZE: 10pt; MARGIN: 0in"><span lang="ZH-CN" style="FONT-FAMILY: SimSun">目的：使用</span><span lang="EN-US" style="FONT-FAMILY: Verdana">Struts</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">分离业务逻辑与表现，使用</span><span lang="EN-US" style="FONT-FAMILY: Verdana">Hibernate</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">分离数据操作与业务逻辑，整理一种基本的</span><span lang="EN-US" style="FONT-FAMILY: Verdana">MVC</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">开发思路。</span></p><p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: SimSun"> </p><p style="FONT-SIZE: 10pt; MARGIN: 0in"><span lang="EN-US" style="FONT-FAMILY: Verdana">1.</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">素描框架<br /></span> </p><p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: SimSun">    该素描主要体现在系统层次的功能划分，系统结构的组织与设计上，素描足够简单，数据库中只涉及一张表：</p><p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: SimSun">    学生信息（学生编号、姓名、性别、年龄、专业信息）--Student( id, name, gender, age, specialty_id )</p><ul><li><div style="MARGIN-TOP: 0px; FONT-SIZE: 10pt; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle"><span style="FONT-FAMILY: SimSun">系统设计</span></div></li></ul><p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: SimSun">    公共类的设计与实现</p><p style="FONT-SIZE: 10pt; MARGIN: 0in"><span lang="ZH-CN" style="FONT-FAMILY: SimSun">    各模块的详细设计，主要描述一个基本的</span><span lang="EN-US" style="FONT-FAMILY: Verdana">CRUD</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">操作，以及对象数据传递</span></p><ul><li><div style="MARGIN-TOP: 0px; FONT-SIZE: 10pt; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle"><span style="FONT-FAMILY: SimSun">系统的部署、测试与发布</span></div></li></ul><p style="FONT-SIZE: 10pt; MARGIN: 0in"><span lang="EN-US" style="FONT-FAMILY: Verdana">2.</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">公共类设计<br /></span> </p><p style="FONT-SIZE: 10pt; MARGIN: 0in"><span lang="ZH-CN" style="FONT-FAMILY: SimSun">    基本的</span><span lang="EN-US" style="FONT-FAMILY: Verdana">CRUD</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">操作封装在基本的帮助类</span><span lang="EN-US" style="FONT-FAMILY: Verdana">HibernateHelper</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">中，实现</span><span lang="EN-US" style="FONT-FAMILY: Verdana">Object load(Class theClass, java.io.Serializable id)</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">、</span><span lang="EN-US" style="FONT-FAMILY: Verdana">Query createQuery(String queryString)</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">、</span><span lang="EN-US" style="FONT-FAMILY: Verdana">void setQueryParameter(Query query, String name, Object val)</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">、</span><span lang="EN-US" style="FONT-FAMILY: Verdana">List list(Query query)</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">、</span><span lang="EN-US" style="FONT-FAMILY: Verdana">void save(Object o)</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">、</span><span lang="EN-US" style="FONT-FAMILY: Verdana">void update(Object o)</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">、</span><span lang="EN-US" style="FONT-FAMILY: Verdana">void delete(Object o)</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">、</span><span lang="EN-US" style="FONT-FAMILY: Verdana">void saveOrUpdate(Object o)</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">等这些基本方法。<br /></span> </p><p style="FONT-SIZE: 10pt; MARGIN: 0in"><span lang="ZH-CN" style="FONT-FAMILY: SimSun">    常量单独封装在</span><span lang="EN-US" style="FONT-FAMILY: Verdana">Constants</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">类中。</span></p><p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: SimSun"> </p><p style="FONT-SIZE: 10pt; MARGIN: 0in"><span lang="EN-US" style="FONT-FAMILY: Verdana">3.</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">各种对象设计</span></p><ul><li><div style="MARGIN-TOP: 0px; FONT-SIZE: 10pt; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle"><span lang="EN-US" style="FONT-FAMILY: Verdana">ActionForm:StudentForm--</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">用于视图层与控制层之间传递数据。</span></div></li><li><div style="MARGIN-TOP: 0px; FONT-SIZE: 10pt; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle"><span lang="ZH-CN" style="FONT-FAMILY: SimSun">接口</span><span lang="EN-US" style="FONT-FAMILY: Verdana">StudentIf--</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">实现了学生数据对象</span><span lang="EN-US" style="FONT-FAMILY: Verdana">Bean</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">所需要的所有接口方法。</span></div></li><li><div style="MARGIN-TOP: 0px; FONT-SIZE: 10pt; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle"><span lang="ZH-CN" style="FONT-FAMILY: SimSun">学生数据对象</span><span lang="EN-US" style="FONT-FAMILY: Verdana">StudentData--</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">实现了记录学生对象数据的功能，并可以用作数据交互的传输对象，它实现了接口</span><span lang="EN-US" style="FONT-FAMILY: Verdana">Serializable</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">和</span><span lang="EN-US" style="FONT-FAMILY: Verdana">StudentIf</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">。</span></div></li><li><div style="MARGIN-TOP: 0px; FONT-SIZE: 10pt; MARGIN-BOTTOM: 0px; VERTICAL-ALIGN: middle"><span lang="ZH-CN" style="FONT-FAMILY: SimSun">学生实体</span><span lang="EN-US" style="FONT-FAMILY: Verdana">Bean StudentBean--</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">实现了学生实体的所有属性，它实现了接口</span><span lang="EN-US" style="FONT-FAMILY: Verdana">Serializable</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">和</span><span lang="EN-US" style="FONT-FAMILY: Verdana">StudentIf</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">。</span></div></li></ul><p style="FONT-SIZE: 10pt; MARGIN: 0in"><span lang="EN-US" style="FONT-FAMILY: Verdana">4.</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">对象管理实现类<br /></span> <br /></p><p style="FONT-SIZE: 10pt; MARGIN: 0in"><span lang="ZH-CN" style="FONT-FAMILY: SimSun">    业务逻辑处理为项目的核心，直接关系到项目是否符合用户需求。因此，我们可以单独设计一个对象管理实现类</span><font face="Verdana">ManagerFacade</font>，定义处理业务对象的<span lang="EN-US" style="FONT-FAMILY: Verdana">CRUD</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">操作，以增加学生信息为例</span><span lang="EN-US" style="FONT-FAMILY: Verdana">public StudentIf addStudent(StudentIf student)</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">。学生数据对象</span><span lang="EN-US" style="FONT-FAMILY: Verdana">StudentData</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">在</span><span lang="EN-US" style="FONT-FAMILY: Verdana">Action</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">中通过</span><span lang="EN-US" style="FONT-FAMILY: Verdana">StudentForm</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">接收到表现层传入的数据，然后作为<font face="Verdana">ManagerFacade对象的</font></span><span lang="EN-US" style="FONT-FAMILY: Verdana">addStudent</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">方法的参数传入方法内，在方法体内声明学生实体</span><span lang="EN-US" style="FONT-FAMILY: Verdana">StudentBean</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">的一个对象，将学生数据对象即传入参数中的属性值赋给实体对象，然后调用公共类<span lang="EN-US" style="FONT-FAMILY: Verdana">HibernateHelper的</span></span><span lang="EN-US" style="FONT-FAMILY: Verdana">save</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">方法完成数据库操作。其他基本操作与此类似，这样设计似乎对象较多，但各层之间分工明确，有利于降藕。<br /></span></p><p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: SimSun">    另外，在数据传递过程中，还会涉及到数据类型的转换，可以专门设计帮助类来完成。</p><p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: SimSun"> </p><p style="FONT-SIZE: 10pt; MARGIN: 0in"><span lang="EN-US" style="FONT-FAMILY: Verdana">5.</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">页面</span><span lang="EN-US" style="FONT-FAMILY: Verdana">UI</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">设计<br /></span> </p><p style="FONT-SIZE: 10pt; MARGIN: 0in"><span lang="ZH-CN" style="FONT-FAMILY: SimSun">    除了设计美观的页面外，最重要的是页面结构要符合项目需要，并提供一定的使用体验，有时候简单实用就是最好。如果可以对用户浏览器统一规范要求，或是基本不会屏蔽</span><span lang="EN-US" style="FONT-FAMILY: Verdana">Javascript</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">，数据格式的控制可以放在客户端用</span><span lang="EN-US" style="FONT-FAMILY: Verdana">Javascript</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">实现。</span></p><p style="FONT-SIZE: 10pt; MARGIN: 0in; FONT-FAMILY: SimSun"> </p><p style="FONT-SIZE: 10pt; MARGIN: 0in"><span lang="EN-US" style="FONT-FAMILY: Verdana">6.</span><span lang="ZH-CN" style="FONT-FAMILY: SimSun">系统的部署、测试与发布。</span></p><img src ="http://www.blogjava.net/iKingQu/aggbug/37856.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iKingQu/" target="_blank">風向逆轉 - 就要爪哇</a> 2006-03-28 18:57 <a href="http://www.blogjava.net/iKingQu/articles/37856.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[收藏]用Java实现几种常见的排序算法</title><link>http://www.blogjava.net/iKingQu/articles/37330.html</link><dc:creator>風向逆轉 - 就要爪哇</dc:creator><author>風向逆轉 - 就要爪哇</author><pubDate>Sat, 25 Mar 2006 05:08:00 GMT</pubDate><guid>http://www.blogjava.net/iKingQu/articles/37330.html</guid><wfw:comment>http://www.blogjava.net/iKingQu/comments/37330.html</wfw:comment><comments>http://www.blogjava.net/iKingQu/articles/37330.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iKingQu/comments/commentRss/37330.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iKingQu/services/trackbacks/37330.html</trackback:ping><description><![CDATA[
		<p>出处：CSDN    作者：treeroot<br /><br />用Java语言实现的各种排序，包括插入排序、冒泡排序、选择排序、Shell排序、快速排序、归并排序、堆排序、SortUtil等。<br /><br /></p>
		<p clear="both">插入排序：</p>
		<p class="code">package org.rut.util.algorithm.support;<br /><br />import org.rut.util.algorithm.SortUtil;<br />/**<br /> * @author treeroot<br /> * @since 2006-2-2<br /> * @version 1.0<br /> */<br />public class InsertSort implements SortUtil.Sort{<br /><br />    /* (non-Javadoc)<br />     * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])<br />     */<br />    public void sort(int[] data) {<br />        int temp;<br />        for(int i=1;i&lt;data.length;i++){<br />            for(int j=i;(j&gt;0)&amp;&amp;(data[j]&lt;data[j-1]);j--){<br />                SortUtil.swap(data,j,j-1);<br />            }<br />        }        <br />    }<br /><br />}</p>
		<p>冒泡排序：</p>
		<p class="code">package org.rut.util.algorithm.support;<br /><br />import org.rut.util.algorithm.SortUtil;<br /><br />/**<br /> * @author treeroot<br /> * @since 2006-2-2<br /> * @version 1.0<br /> */<br />public class BubbleSort implements SortUtil.Sort{<br /><br />    /* (non-Javadoc)<br />     * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])<br />     */<br />    public void sort(int[] data) {<br />        int temp;<br />        for(int i=0;i&lt;data.length;i++){<br />            for(int j=data.length-1;j&gt;i;j--){<br />                if(data[j]&lt;data[j-1]){<br />                    SortUtil.swap(data,j,j-1);<br />                }<br />            }<br />        }<br />    }<br /><br />}<br /><br /></p>
		<table cellspacing="0" cellpadding="0" width="98%" align="center" border="0">
				<tbody>
						<tr>
								<td class="article" width="100%" height="62">
										<p>
										</p>
										<p>选择排序：</p>
										<p class="code">package org.rut.util.algorithm.support;<br /><br />import org.rut.util.algorithm.SortUtil;<br /><br />/**<br /> * @author treeroot<br /> * @since 2006-2-2<br /> * @version 1.0<br /> */<br />public class SelectionSort implements SortUtil.Sort {<br /><br />    /*<br />     * (non-Javadoc)<br />     * <br />     * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])<br />     */<br />    public void sort(int[] data) {<br />        int temp;<br />        for (int i = 0; i &lt; data.length; i++) {<br />            int lowIndex = i;<br />            for (int j = data.length - 1; j &gt; i; j--) {<br />                if (data[j] &lt; data[lowIndex]) {<br />                    lowIndex = j;<br />                }<br />            }<br />            SortUtil.swap(data,i,lowIndex);<br />        }<br />    }<br /><br />}</p>
										<p>Shell排序：</p>
										<p class="code">package org.rut.util.algorithm.support;<br /><br />import org.rut.util.algorithm.SortUtil;<br /><br />/**<br /> * @author treeroot<br /> * @since 2006-2-2<br /> * @version 1.0<br /> */<br />public class ShellSort implements SortUtil.Sort{<br /><br />    /* (non-Javadoc)<br />     * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])<br />     */<br />    public void sort(int[] data) {<br />        for(int i=data.length/2;i&gt;2;i/=2){<br />            for(int j=0;j&lt;i;j++){<br />                insertSort(data,j,i);<br />            }<br />        }<br />        insertSort(data,0,1);<br />    }<br /><br />    /**<br />     * @param data<br />     * @param j<br />     * @param i<br />     */<br />    private void insertSort(int[] data, int start, int inc) {<br />        int temp;<br />        for(int i=start+inc;i&lt;data.length;i+=inc){<br />            for(int j=i;(j&gt;=inc)&amp;&amp;(data[j]&lt;data[j-inc]);j-=inc){<br />                SortUtil.swap(data,j,j-inc);<br />            }<br />        }<br />    }<br /><br />}<br /><br /></p>
										<table cellspacing="0" cellpadding="0" width="98%" align="center" border="0">
												<tbody>
														<tr>
																<td class="article" width="100%" height="62">
																		<p>
																		</p>
																		<p>快速排序：</p>
																		<p class="code">package org.rut.util.algorithm.support;<br /><br />import org.rut.util.algorithm.SortUtil;<br /><br />/**<br /> * @author treeroot<br /> * @since 2006-2-2<br /> * @version 1.0<br /> */<br />public class QuickSort implements SortUtil.Sort{<br /><br />    /* (non-Javadoc)<br />     * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])<br />     */<br />    public void sort(int[] data) {<br />        quickSort(data,0,data.length-1);        <br />    }<br />    private void quickSort(int[] data,int i,int j){<br />        int pivotIndex=(i+j)/2;<br />        //swap<br />        SortUtil.swap(data,pivotIndex,j);<br />        <br />        int k=partition(data,i-1,j,data[j]);<br />        SortUtil.swap(data,k,j);<br />        if((k-i)&gt;1) quickSort(data,i,k-1);<br />        if((j-k)&gt;1) quickSort(data,k+1,j);<br />        <br />    }<br />    /**<br />     * @param data<br />     * @param i<br />     * @param j<br />     * @return<br />     */<br />    private int partition(int[] data, int l, int r,int pivot) {<br />        do{<br />           while(data[++l]&lt;pivot);<br />           while((r!=0)&amp;&amp;data[--r]&gt;pivot);<br />           SortUtil.swap(data,l,r);<br />        }<br />        while(l&lt;r);<br />        SortUtil.swap(data,l,r);        <br />        return l;<br />    }<br /><br />}</p>
																		<p>改进后的快速排序：</p>
																		<p class="code">package org.rut.util.algorithm.support;<br /><br />import org.rut.util.algorithm.SortUtil;<br /><br />/**<br /> * @author treeroot<br /> * @since 2006-2-2<br /> * @version 1.0<br /> */<br />public class ImprovedQuickSort implements SortUtil.Sort {<br /><br />    private static int MAX_STACK_SIZE=4096;<br />    private static int THRESHOLD=10;<br />    /* (non-Javadoc)<br />     * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])<br />     */<br />    public void sort(int[] data) {<br />        int[] stack=new int[MAX_STACK_SIZE];<br />        <br />        int top=-1;<br />        int pivot;<br />        int pivotIndex,l,r;<br />        <br />        stack[++top]=0;<br />        stack[++top]=data.length-1;<br />        <br />        while(top&gt;0){<br />            int j=stack[top--];<br />            int i=stack[top--];<br />            <br />            pivotIndex=(i+j)/2;<br />            pivot=data[pivotIndex];<br />            <br />            SortUtil.swap(data,pivotIndex,j);<br />            <br />            //partition<br />            l=i-1;<br />            r=j;<br />            do{<br />                while(data[++l]&lt;pivot);<br />                while((r!=0)&amp;&amp;(data[--r]&gt;pivot));<br />                SortUtil.swap(data,l,r);<br />            }<br />            while(l&lt;r);<br />            SortUtil.swap(data,l,r);<br />            SortUtil.swap(data,l,j);<br />            <br />            if((l-i)&gt;THRESHOLD){<br />                stack[++top]=i;<br />                stack[++top]=l-1;<br />            }<br />            if((j-l)&gt;THRESHOLD){<br />                stack[++top]=l+1;<br />                stack[++top]=j;<br />            }<br />            <br />        }<br />        //new InsertSort().sort(data);<br />        insertSort(data);<br />    }<br />    /**<br />     * @param data<br />     */<br />    private void insertSort(int[] data) {<br />        int temp;<br />        for(int i=1;i&lt;data.length;i++){<br />            for(int j=i;(j&gt;0)&amp;&amp;(data[j]&lt;data[j-1]);j--){<br />                SortUtil.swap(data,j,j-1);<br />            }<br />        }       <br />    }<br /><br />}<br /><br /></p>
																		<table cellspacing="0" cellpadding="0" width="98%" align="center" border="0">
																				<tbody>
																						<tr>
																								<td class="article" width="100%" height="62">
																										<p>
																										</p>
																										<p>归并排序：</p>
																										<p class="code">package org.rut.util.algorithm.support;<br /><br />import org.rut.util.algorithm.SortUtil;<br /><br />/**<br /> * @author treeroot<br /> * @since 2006-2-2<br /> * @version 1.0<br /> */<br />public class MergeSort implements SortUtil.Sort{<br /><br />    /* (non-Javadoc)<br />     * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])<br />     */<br />    public void sort(int[] data) {<br />        int[] temp=new int[data.length];<br />        mergeSort(data,temp,0,data.length-1);<br />    }<br />    <br />    private void mergeSort(int[] data,int[] temp,int l,int r){<br />        int mid=(l+r)/2;<br />        if(l==r) return ;<br />        mergeSort(data,temp,l,mid);<br />        mergeSort(data,temp,mid+1,r);<br />        for(int i=l;i&lt;=r;i++){<br />            temp[i]=data[i];<br />        }<br />        int i1=l;<br />        int i2=mid+1;<br />        for(int cur=l;cur&lt;=r;cur++){<br />            if(i1==mid+1)<br />                data[cur]=temp[i2++];<br />            else if(i2&gt;r)<br />                data[cur]=temp[i1++];<br />            else if(temp[i1]&lt;temp[i2])<br />                data[cur]=temp[i1++];<br />            else<br />                data[cur]=temp[i2++];            <br />        }<br />    }<br /><br />}</p>
																										<p>改进后的归并排序:</p>
																										<p class="code">package org.rut.util.algorithm.support;<br /><br />import org.rut.util.algorithm.SortUtil;<br /><br />/**<br /> * @author treeroot<br /> * @since 2006-2-2<br /> * @version 1.0<br /> */<br />public class ImprovedMergeSort implements SortUtil.Sort {<br /><br />    private static final int THRESHOLD = 10;<br /><br />    /*<br />     * (non-Javadoc)<br />     * <br />     * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])<br />     */<br />    public void sort(int[] data) {<br />        int[] temp=new int[data.length];<br />        mergeSort(data,temp,0,data.length-1);<br />    }<br /><br />    private void mergeSort(int[] data, int[] temp, int l, int r) {<br />        int i, j, k;<br />        int mid = (l + r) / 2;<br />        if (l == r)<br />            return;<br />        if ((mid - l) &gt;= THRESHOLD)<br />            mergeSort(data, temp, l, mid);<br />        else<br />            insertSort(data, l, mid - l + 1);<br />        if ((r - mid) &gt; THRESHOLD)<br />            mergeSort(data, temp, mid + 1, r);<br />        else<br />            insertSort(data, mid + 1, r - mid);<br /><br />        for (i = l; i &lt;= mid; i++) {<br />            temp[i] = data[i];<br />        }<br />        for (j = 1; j &lt;= r - mid; j++) {<br />            temp[r - j + 1] = data[j + mid];<br />        }<br />        int a = temp[l];<br />        int b = temp[r];<br />        for (i = l, j = r, k = l; k &lt;= r; k++) {<br />            if (a &lt; b) {<br />                data[k] = temp[i++];<br />                a = temp[i];<br />            } else {<br />                data[k] = temp[j--];<br />                b = temp[j];<br />            }<br />        }<br />    }<br /><br />    /**<br />     * @param data<br />     * @param l<br />     * @param i<br />     */<br />    private void insertSort(int[] data, int start, int len) {<br />        for(int i=start+1;i&lt;start+len;i++){<br />            for(int j=i;(j&gt;start) &amp;&amp; data[j]&lt;data[j-1];j--){<br />                SortUtil.swap(data,j,j-1);<br />            }<br />        }<br />    }</p>
																										<p>}<br /><br /></p>
																										<p>堆排序：</p>
																										<p class="code">package org.rut.util.algorithm.support;<br /><br />import org.rut.util.algorithm.SortUtil;<br /><br />/**<br /> * @author treeroot<br /> * @since 2006-2-2<br /> * @version 1.0<br /> */<br />public class HeapSort implements SortUtil.Sort{<br /><br />    /* (non-Javadoc)<br />     * @see org.rut.util.algorithm.SortUtil.Sort#sort(int[])<br />     */<br />    public void sort(int[] data) {<br />        MaxHeap h=new MaxHeap();<br />        h.init(data);<br />        for(int i=0;i&lt;data.length;i++)<br />            h.remove();<br />        System.arraycopy(h.queue,1,data,0,data.length);<br />    }<br /><br />     private static class MaxHeap{         <br />        <br />        void init(int[] data){<br />            this.queue=new int[data.length+1];<br />            for(int i=0;i&lt;data.length;i++){<br />                queue[++size]=data[i];<br />                fixUp(size);<br />            }<br />        }<br />         <br />        private int size=0;<br /><br />        private int[] queue;<br />                <br />        public int get() {<br />            return queue[1];<br />        }<br /><br />        public void remove() {<br />            SortUtil.swap(queue,1,size--);<br />            fixDown(1);<br />        }<br />        //fixdown<br />        private void fixDown(int k) {<br />            int j;<br />            while ((j = k &lt;&lt; 1) &lt;= size) {<br />                if (j &lt; size &amp;&amp; queue[j]&lt;queue[j+1])<br />                    j++; <br />                if (queue[k]&gt;queue[j]) //不用交换<br />                    break;<br />                SortUtil.swap(queue,j,k);<br />                k = j;<br />            }<br />        }<br />        private void fixUp(int k) {<br />            while (k &gt; 1) {<br />                int j = k &gt;&gt; 1;<br />                if (queue[j]&gt;queue[k])<br />                    break;<br />                SortUtil.swap(queue,j,k);<br />                k = j;<br />            }<br />        }<br /><br />    }<br /><br />}<br /><br /></p>
																										<p>SortUtil：</p>
																										<p class="code">package org.rut.util.algorithm;<br /><br />import org.rut.util.algorithm.support.BubbleSort;<br />import org.rut.util.algorithm.support.HeapSort;<br />import org.rut.util.algorithm.support.ImprovedMergeSort;<br />import org.rut.util.algorithm.support.ImprovedQuickSort;<br />import org.rut.util.algorithm.support.InsertSort;<br />import org.rut.util.algorithm.support.MergeSort;<br />import org.rut.util.algorithm.support.QuickSort;<br />import org.rut.util.algorithm.support.SelectionSort;<br />import org.rut.util.algorithm.support.ShellSort;<br /><br />/**<br /> * @author treeroot<br /> * @since 2006-2-2<br /> * @version 1.0<br /> */<br />public class SortUtil {<br />    public final static int INSERT = 1;<br />    public final static int BUBBLE = 2;<br />    public final static int SELECTION = 3;<br />    public final static int SHELL = 4;<br />    public final static int QUICK = 5;<br />    public final static int IMPROVED_QUICK = 6;<br />    public final static int MERGE = 7;<br />    public final static int IMPROVED_MERGE = 8;<br />    public final static int HEAP = 9;<br /><br />    public static void sort(int[] data) {<br />        sort(data, IMPROVED_QUICK);<br />    }<br />    private static String[] name={<br />            "insert", "bubble", "selection", "shell", "quick", "improved_quick", "merge", "improved_merge", "heap"<br />    };<br />    <br />    private static Sort[] impl=new Sort[]{<br />            new InsertSort(),<br />            new BubbleSort(),<br />            new SelectionSort(),<br />            new ShellSort(),<br />            new QuickSort(),<br />            new ImprovedQuickSort(),<br />            new MergeSort(),<br />            new ImprovedMergeSort(),<br />            new HeapSort()<br />    };<br /><br />    public static String toString(int algorithm){<br />        return name[algorithm-1];<br />    }<br />    <br />    public static void sort(int[] data, int algorithm) {<br />        impl[algorithm-1].sort(data);<br />    }<br /><br />    public static interface Sort {<br />        public void sort(int[] data);<br />    }<br /><br />    public static void swap(int[] data, int i, int j) {<br />        int temp = data[i];<br />        data[i] = data[j];<br />        data[j] = temp;<br />    }<br />}</p>
																								</td>
																						</tr>
																				</tbody>
																		</table>
																</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/iKingQu/aggbug/37330.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iKingQu/" target="_blank">風向逆轉 - 就要爪哇</a> 2006-03-25 13:08 <a href="http://www.blogjava.net/iKingQu/articles/37330.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[收藏]JDBC系列教程（六）---可调用语句</title><link>http://www.blogjava.net/iKingQu/articles/36764.html</link><dc:creator>風向逆轉 - 就要爪哇</dc:creator><author>風向逆轉 - 就要爪哇</author><pubDate>Tue, 21 Mar 2006 19:44:00 GMT</pubDate><guid>http://www.blogjava.net/iKingQu/articles/36764.html</guid><wfw:comment>http://www.blogjava.net/iKingQu/comments/36764.html</wfw:comment><comments>http://www.blogjava.net/iKingQu/articles/36764.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iKingQu/comments/commentRss/36764.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iKingQu/services/trackbacks/36764.html</trackback:ping><description><![CDATA[
		<p>
				<span class="Title">JDBC系列教程（六）---可调用语句 </span>
		</p>
		<p>CallableStatement </p>
		<p>本概述是从《JDBCTM Database Access from JavaTM: A Tutorial and Annotated Reference 》这本书中摘引来的。JavaSoft 目前正在准备这本书。这本书是一本教程，同时也是 JDBC 的重要参考手册，它将作为 Java 系列的组成部份在 1997 年春季由 Addison-Wesley 出版公司出版。  </p>
		<p>
				<br />7.1 概述 <br />CallableStatement 对象为所有的 DBMS 提供了一种以标准形式调用已储存过程的方法。已储存过程储存在数据库中。对已储存过程的调用是 CallableStatement 对象所含的内容。这种调用是用一种换码语法来写的，有两种形式：一种形式带结果参数，另一种形式不带结果参数（有关换码语法的信息，参见第 4 节“语句”）。结果参数是一种输出 (OUT) 参数，是已储存过程的返回值。两种形式都可带有数量可变的输入（IN 参数）、输出（OUT 参数）或输入和输出（INOUT 参数）的参数。问号将用作参数的占位符。 </p>
		<p>在 JDBC 中调用已储存过程的语法如下所示。注意，方括号表示其间的内容是可选项；方括号本身并不是语法的组成部份。 </p>
		<p>{call 过程名[(?, ?, ...)]} </p>
		<p>返回结果参数的过程的语法为：  </p>
		<p>{? = call 过程名[(?, ?, ...)]} </p>
		<p>不带参数的已储存过程的语法类似：  </p>
		<p>{call 过程名} </p>
		<p>通常，创建 CallableStatement 对象的人应当知道所用的 DBMS 是支持已储存过程的，并且知道这些过程都是些什么。然而，如果需要检查，多种 DatabaseMetaData 方法都可以提供这样的信息。例如，如果 DBMS 支持已储存过程的调用，则 supportsStoredProcedures 方法将返回 true，而 getProcedures 方法将返回对已储存过程的描述。 </p>
		<p>CallableStatement 继承 Statement 的方法（它们用于处理一般的 SQL 语句），还继承了 PreparedStatement 的方法（它们用于处理 IN 参数）。CallableStatement 中定义的所有方法都用于处理 OUT 参数或 INOUT 参数的输出部分：注册 OUT 参数的 JDBC 类型（一般 SQL 类型）、从这些参数中检索结果，或者检查所返回的值是否为 JDBC NULL。 </p>
		<p>
				<br />7.1.1 创建 CallableStatement 对象 <br />CallableStatement 对象是用 Connection 方法 prepareCall 创建的。下例创建 CallableStatement 的实例，其中含有对已储存过程 getTestData 调用。该过程有两个变量，但不含结果参数：  </p>
		<p>CallableStatement cstmt = con.prepareCall( <br />"{call getTestData(?, ?)}"); </p>
		<p>其中 ? 占位符为 IN、 OUT 还是 INOUT 参数，取决于已储存过程 getTestData。 </p>
		<p>
				<br />7.1.2 IN 和 OUT 参数 <br />将 IN 参数传给 CallableStatement 对象是通过 setXXX 方法完成的。该方法继承自 PreparedStatement。所传入参数的类型决定了所用的 setXXX 方法（例如，用 setFloat 来传入 float 值等）。 </p>
		<p>如果已储存过程返回 OUT 参数，则在执行 CallableStatement 对象以前必须先注册每个 OUT 参数的 JDBC 类型（这是必需的，因为某些 DBMS 要求 JDBC 类型）。注册 JDBC 类型是用 registerOutParameter 方法来完成的。语句执行完后，CallableStatement 的 getXXX 方法将取回参数值。正确的 getXXX 方法是为各参数所注册的 JDBC 类型所对应的 Java 类型（从 JDBC 类型到 Java 类型的标准映射见 8.6.1 节中的表）。换言之， registerOutParameter 使用的是 JDBC 类型（因此它与数据库返回的 JDBC 类型匹配），而 getXXX 将之转换为 Java 类型。 </p>
		<p>作为示例，下述代码先注册 OUT 参数，执行由 cstmt 所调用的已储存过程，然后检索在 OUT 参数中返回的值。方法 getByte 从第一个 OUT 参数中取出一个 Java 字节，而 getBigDecimal 从第二个 OUT 参数中取出一个 BigDecimal 对象（小数点后面带三位数）：  </p>
		<p>CallableStatement cstmt = con.prepareCall( <br />"{call getTestData(?, ?)}"); <br />cstmt.registerOutParameter(1, java.sql.Types.TINYINT); <br />cstmt.registerOutParameter(2, java.sql.Types.DECIMAL, 3); <br />cstmt.executeQuery(); <br />byte x = cstmt.getByte(1); <br />java.math.BigDecimal n = cstmt.getBigDecimal(2, 3); </p>
		<p>CallableStatement 与 ResultSet 不同，它不提供用增量方式检索大 OUT 值的特殊机制。 </p>
		<p>
				<br />7.1.3 INOUT 参数 <br />既支持输入又接受输出的参数（INOUT 参数）除了调用 registerOutParameter 方法外，还要求调用适当的 setXXX 方法（该方法是从 PreparedStatement 继承来的）。setXXX 方法将参数值设置为输入参数，而 registerOutParameter 方法将它的 JDBC 类型注册为输出参数。setXXX 方法提供一个 Java 值，而驱动程序先把这个值转换为 JDBC 值，然后将它送到数据库中。 </p>
		<p>这种 IN 值的 JDBC 类型和提供给 registerOutParameter 方法的 JDBC 类型应该相同。然后，要检索输出值，就要用对应的 getXXX 方法。例如，Java 类型为 byte 的参数应该使用方法 setByte 来赋输入值。应该给 registerOutParameter 提供类型为 TINYINT 的 JDBC 类型，同时应使用 getByte 来检索输出值 （第 8 节“JDBC 和 Java 类型之间的映射”将给出详细信息和类型映射表）。 </p>
		<p>下例假设有一个已储存过程 reviseTotal，其唯一参数是 INOUT 参数。方法 setByte 把此参数设为 25，驱动程序将把它作为 JDBC TINYINT 类型送到数据库中。接着，registerOutParameter 将该参数注册为 JDBC TINYINT。执行完该已储存过程后，将返回一个新的 JDBC TINYINT 值。方法 getByte 将把这个新值作为 Java byte 类型检索。 </p>
		<p>CallableStatement cstmt = con.prepareCall( <br />"{call reviseTotal(?)}"); <br />cstmt.setByte(1, 25); <br />cstmt.registerOutParameter(1, java.sql.Types.TINYINT); <br />cstmt.executeUpdate(); <br />byte x = cstmt.getByte(1); </p>
		<p>7.1.4 先检索结果，再检索 OUT 参数 <br />由于某些 DBMS 的限制，为了实现最大的可移植性，建议先检索由执行 CallableStatement 对象所产生的结果，然后再用 CallableStatement.getXXX 方法来检索 OUT 参数。 </p>
		<p>如果 CallableStatement 对象返回多个 ResultSet 对象（通过调用 execute 方法），在检索 OUT 参数前应先检索所有的结果。这种情况下，为确保对所有的结果都进行了访问，必须对 Statement 方法 getResultSet、getUpdateCount 和 getMoreResults 进行调用，直到不再有结果为止。 </p>
		<p>检索完所有的结果后，就可用 CallableStatement.getXXX 方法来检索 OUT 参数中的值。 </p>
		<p>
				<br />7.1.5 检索作为 OUT 参数的 NULL 值 <br />返回到 OUT 参数中的值可能会是 JDBC NULL。当出现这种情形时，将对 JDBC NULL 值进行转换以使 getXXX 方法所返回的值为 null、0 或 false，这取决于 getXXX 方法类型。对于 ResultSet 对象，要知道 0 或 false 是否源于 JDBC NULL 的唯一方法，是用方法 wasNull 进行检测。如果 getXXX 方法读取的最后一个值是 JDBC NULL，则该方法返回 true，否则返回 flase。第 5 节“ResultSet”将给出详细信息。   </p>
		<br />
		<br />
		<p id="TBPingURL">Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=630452</p>
<img src ="http://www.blogjava.net/iKingQu/aggbug/36764.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iKingQu/" target="_blank">風向逆轉 - 就要爪哇</a> 2006-03-22 03:44 <a href="http://www.blogjava.net/iKingQu/articles/36764.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[收藏]JDBC系列教程（五）---准备语句</title><link>http://www.blogjava.net/iKingQu/articles/36762.html</link><dc:creator>風向逆轉 - 就要爪哇</dc:creator><author>風向逆轉 - 就要爪哇</author><pubDate>Tue, 21 Mar 2006 19:32:00 GMT</pubDate><guid>http://www.blogjava.net/iKingQu/articles/36762.html</guid><wfw:comment>http://www.blogjava.net/iKingQu/comments/36762.html</wfw:comment><comments>http://www.blogjava.net/iKingQu/articles/36762.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iKingQu/comments/commentRss/36762.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iKingQu/services/trackbacks/36762.html</trackback:ping><description><![CDATA[
		<div class="postText">
				<p>
						<span class="Title">JDBC系列教程（五）---准备语句</span>
				</p>
				<p>PreparedStatement </p>
				<p>本概述是从《JDBCTM Database Access from JavaTM: A Tutorial and Annotated Reference 》这本书中摘引来的。JavaSoft 目前正在准备这本书。这是一本教程，同时也是 JDBC 的重要参考手册，它将作为 Java 系列的组成部份在 1997 年春季由 Addison-Wesley 出版公司出版。  </p>
				<p>
						<br />6.1 概述 <br />该 PreparedStatement 接口继承 Statement，并与之在两方面有所不同：  </p>
				<p>
						<br />PreparedStatement 实例包含已编译的 SQL 语句。这就是使语句“准备好”。  <br />包含于 PreparedStatement 对象中的 SQL 语句可具有一个或多个 IN 参数。IN 参数的值在 SQL 语句创建时未被指定。相反的，该语句为每个 IN 参数保留一个问号（“？”）作为占位符。每个问号的值必须在该语句执行之前，通过适当的 setXXX 方法来提供。  </p>
				<p>由于 PreparedStatement 对象已预编译过，所以其执行速度要快于 Statement 对象。因此，多次执行的 SQL 语句经常创建为 PreparedStatement 对象，以提高效率。 </p>
				<p>作为 Statement 的子类，PreparedStatement 继承了 Statement 的所有功能。另外它还添加了一整套方法，用于设置发送给数据库以取代 IN 参数占位符的值。同时，三种方法 execute、 executeQuery 和 executeUpdate 已被更改以使之不再需要参数。这些方法的 Statement 形式（接受 SQL 语句参数的形式）不应该用于 PreparedStatement 对象。 </p>
				<p>
						<br />6.1.1 创建 PreparedStatement 对象 <br />以下的代码段（其中 con 是 Connection 对象）创建包含带两个 IN 参数占位符的 SQL 语句的 PreparedStatement 对象：  </p>
				<p>PreparedStatement pstmt = con.prepareStatement( <br />"UPDATE table4 SET m = ? WHERE x = ?"); </p>
				<p>pstmt 对象包含语句 "UPDATE table4 SET m = ? WHERE x = ?"，它已发送给 DBMS，并为执行作好了准备。 </p>
				<p>
						<br />6.1.2 传递 IN 参数 <br />在执行 PreparedStatement 对象之前，必须设置每个 ? 参数的值。这可通过调用 setXXX 方法来完成，其中 XXX 是与该参数相应的类型。例如，如果参数具有 Java 类型 long，则使用的方法就是 setLong。setXXX 方法的第一个参数是要设置的参数的序数位置，第二个参数是设置给该参数的值。例如，以下代码将第一个参数设为 123456789，第二个参数设为 100000000：  </p>
				<p>pstmt.setLong(1, 123456789); <br />pstmt.setLong(2, 100000000); </p>
				<p>一旦设置了给定语句的参数值，就可用它多次执行该语句，直到调用 clearParameters 方法清除它为止。 </p>
				<p>在连接的缺省模式下（启用自动提交），当语句完成时将自动提交或还原该语句。 </p>
				<p>如果基本数据库和驱动程序在语句提交之后仍保持这些语句的打开状态，则同一个 PreparedStatement 可执行多次。如果这一点不成立，那么试图通过使用 PreparedStatement 对象代替 Statement 对象来提高性能是没有意义的。 </p>
				<p>利用 pstmt（前面创建的 PreparedStatement 对象），以下代码例示了如何设置两个参数占位符的值并执行 pstmt 10 次。如上所述，为做到这一点，数据库不能关闭 pstmt。在该示例中，第一个参数被设置为 "Hi"并保持为常数。在 for 循环中，每次都将第二个参数设置为不同的值：从 0 开始，到 9 结束。 </p>
				<p>pstmt.setString(1, "Hi"); <br />for (int i = 0; i &lt; 10; i++) { <br />pstmt.setInt(2, i); <br />int rowCount = pstmt.executeUpdate(); <br />} </p>
				<p>6.1.3 IN 参数中数据类型的一致性 <br />setXXX 方法中的 XXX 是 Java 类型。它是一种隐含的 JDBC 类型（一般 SQL 类型），因为驱动程序将把 Java 类型映射为相应的 JDBC 类型（遵循该 JDBC Guide中§8.6.2 “映射 Java 和 JDBC 类型”表中所指定的映射），并将该 JDBC 类型发送给数据库。例如，以下代码段将 PreparedStatement 对象 pstmt 的第二个参数设置为 44，Java 类型为 short：  </p>
				<p>pstmt.setShort(2, 44); </p>
				<p>驱动程序将 44 作为 JDBC SMALLINT 发送给数据库，它是 Java short 类型的标准映射。 </p>
				<p>程序员的责任是确保将每个 IN 参数的 Java 类型映射为与数据库所需的 JDBC 数据类型兼容的 JDBC 类型。不妨考虑数据库需要 JDBC SMALLINT 的情况。如果使用方法 setByte ，则驱动程序将 JDBC TINYINT 发送给数据库。这是可行的，因为许多数据库可从一种相关的类型转换为另一种类型，并且通常 TINYINT 可用于 SMALLINT 适用的任何地方。然而，对于要适用于尽可能多的数据库的应用程序，最好使用与数据库所需的确切的 JDBC 类型相应的 Java 类型。如果所需的 JDBC 类型是 SMALLINT，则使用 setShort 代替 setByte 将使应用程序的可移植性更好。 </p>
				<p>
						<br />6.1.4 使用 setObject <br />程序员可使用 setObject 方法显式地将输入参数转换为特定的 JDBC 类型。该方法可以接受第三个参数，用来指定目标 JDBC 类型。将 Java Object 发送给数据库之前，驱动程序将把它转换为指定的 JDBC 类型。 </p>
				<p>如果没有指定 JDBC 类型，驱动程序就会将 Java Object 映射到其缺省的 JDBC 类型（参见第 8.6.4 节中的表格），然后将它发送到数据库。这与常规的 setXXX 方法类似；在这两种情况下，驱动程序在将值发送到数据库之前，会将该值的 Java 类型映射为适当的 JDBC 类型。二者的差别在于 setXXX 方法使用从 Java 类型到 JDBC 类型的标准映射（参见第 8.6.2 节中的表格），而 setObject 方法使用从 Java Object 类型到 JDBC 类型的映射（参见第 8.6.4 节中的表格）。 </p>
				<p>方法 setObject 允许接受所有 Java 对象的能力使应用程序更为通用，并可在运行时接受参数的输入。这种情况下，应用程序在编译时并不清楚输入类型。通过使用 setObject，应用程序可接受所有 Java 对象类型作为输入，并将其转换为数据库所需的 JDBC 类型。第 8.6.5 节中的表格显示了 setObject 可执行的所有可能转换。 </p>
				<p>
						<br />6.1.5 将 JDBC NULL 作为 IN 参数发送 <br />setNull 方法允许程序员将 JDBC NULL 值作为 IN 参数发送给数据库。但要注意，仍然必须指定参数的 JDBC 类型。 </p>
				<p>当把 Java null 值传递给 setXXX 方法时（如果它接受 Java 对象作为参数），也将同样把 JDBC NULL 发送到数据库。但仅当指定 JDBC 类型时，方法 setObject 才能接受 null 值。 </p>
				<p>
						<br />6.1.6 发送大的 IN 参数 <br />setBytes 和 setString 方法能够发送无限量的数据。但是，有时程序员更喜欢用较小的块传递大型的数据。这可通过将 IN 参数设置为 Java 输入流来完成。当语句执行时，JDBC 驱动程序将重复调用该输入流，读取其内容并将它们当作实际参数数据传输。 </p>
				<p>JDBC 提供了三种将 IN 参数设置为输入流的方法：setBinaryStream 用于含有未说明字节的流， setAsciiStream 用于含有 ASCII 字符的流，而 setUnicodeStream 用于含有 Unicode 字符的流。因为必须指定流的总长度，所以这些方法所采用的参数比其它的 setXXX 方法要多一个。这很有必要，因为一些数据库在发送数据之前需要知道其总的传送大小。 </p>
				<p>以下代码例示了使用流作为 IN 参数来发送文件内容：  </p>
				<p>java.io.File file = new java.io.File("/tmp/data"); <br />int fileLength = file.length(); <br />java.io.InputStream fin = new java.io.FileInputStream(file); <br />java.sql.PreparedStatement pstmt = con.prepareStatement( <br />"UPDATE Table5 SET stuff = ? WHERE index = 4"); <br />pstmt.setBinaryStream (1, fin, fileLength); <br />pstmt.executeUpdate(); </p>
				<p>当语句执行时，将反复调用输入流 fin 以传递其数据。 </p>
				<br />
				<br />
				<p id="TBPingURL">Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=630450</p>
		</div>
<img src ="http://www.blogjava.net/iKingQu/aggbug/36762.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iKingQu/" target="_blank">風向逆轉 - 就要爪哇</a> 2006-03-22 03:32 <a href="http://www.blogjava.net/iKingQu/articles/36762.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[收藏]JDBC系列教程（四）---结果设置</title><link>http://www.blogjava.net/iKingQu/articles/36761.html</link><dc:creator>風向逆轉 - 就要爪哇</dc:creator><author>風向逆轉 - 就要爪哇</author><pubDate>Tue, 21 Mar 2006 19:31:00 GMT</pubDate><guid>http://www.blogjava.net/iKingQu/articles/36761.html</guid><wfw:comment>http://www.blogjava.net/iKingQu/comments/36761.html</wfw:comment><comments>http://www.blogjava.net/iKingQu/articles/36761.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iKingQu/comments/commentRss/36761.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iKingQu/services/trackbacks/36761.html</trackback:ping><description><![CDATA[
		<div class="postText">
				<p>
						<span class="Title">JDBC系列教程（四）---结果设置 </span>
				</p>
				<p>ResultSet <br />本概述是从《JDBCTM Database Access from JavaTM: A Tutorial and Annotated Reference 》这本书中摘引来的。JavaSoft 目前正在准备这本书。这是一本教程，同时也是 JDBC 的重要参考手册，它将作为 Java 系列的组成部份在 1997 年春季由 Addison-Wesley 出版公司出版。  </p>
				<p>5.1 概述 <br />ResultSet 包含符合 SQL 语句中条件的所有行，并且它通过一套 get 方法（这些 get 方法可以访问当前行中的不同列）提供了对这些行中数据的访问。ResultSet.next 方法用于移动到 ResultSet 中的下一行，使下一行成为当前行。 </p>
				<p>结果集一般是一个表，其中有查询所返回的列标题及相应的值。例如，如果查询为 SELECT a, b, c FROM Table1，则结果集将具有如下形式：  </p>
				<p>
						<br />a b c <br />-------- --------- -------- <br />12345 Cupertino CA <br />83472 Redmond WA <br />83492 Boston MA </p>
				<p>
						<br />下面的代码段是执行 SQL 语句的示例。该 SQL 语句将返回行集合，其中列 1 为 int，列 2 为 String，而列 3 则为字节数组：  </p>
				<p>
						<br />java.sql.Statement stmt = conn.createStatement(); <br />ResultSet r = stmt.executeQuery("SELECT a, b, c FROM Table1"); <br />while (r.next()) <br />{ <br />// 打印当前行的值。 <br />int i = r.getInt("a"); <br />String s = r.getString("b"); <br />float f = r.getFloat("c"); <br />System.out.println("ROW = " + i + " " + s + " " + f); <br />} </p>
				<p>5.1.1 行和光标 <br />ResultSet 维护指向其当前数据行的光标。每调用一次 next 方法，光标向下移动一行。最初它位于第一行之前，因此第一次调用 next 将把光标置于第一行上，使它成为当前行。随着每次调用 next 导致光标向下移动一行，按照从上至下的次序获取 ResultSet 行。 </p>
				<p>在 ResultSet 对象或其父辈 Statement 对象关闭之前，光标一直保持有效。 </p>
				<p>在 SQL 中，结果表的光标是有名字的。如果数据库允许定位更新或定位删除，则需要将光标的名字作为参数提供给更新或删除命令。可通过调用方法 getCursorName 获得光标名。 </p>
				<p>注意：不是所有的 DBMS 都支持定位更新和删除。可使用 DatabaseMetaData.supportsPositionedDelete 和 supportsPositionedUpdate 方法来检查特定连接是否支持这些操作。当支持这些操作时，DBMS/驱动程序必须确保适当锁定选定行，以使定位更新不会导致更新异常或其它并发问题。 </p>
				<p>
						<br />5.1.2 列 <br />方法 getXXX 提供了获取当前行中某列值的途径。在每一行内，可按任何次序获取列值。但为了保证可移植性，应该从左至右获取列值，并且一次性地读取列值。 </p>
				<p>列名或列号可用于标识要从中获取数据的列。例如，如果 ResultSet 对象 rs 的第二列名为“title”，并将值存储为字符串，则下列任一代码将获取存储在该列中的值：  </p>
				<p>String s = rs.getString("title"); <br />String s = rs.getString(2); </p>
				<p>注意列是从左至右编号的，并且从列 1 开始。同时，用作 getXXX 方法的输入的列名不区分大小写。 </p>
				<p>提供使用列名这个选项的目的是为了让在查询中指定列名的用户可使用相同的名字作为 getXXX 方法的参数。另一方面，如果 select 语句未指定列名（例如在“select * from table1”中或列是导出的时），则应该使用列号。这些情况下，用户将无法确切知道列名。 </p>
				<p>有些情况下，SQL 查询返回的结果集中可能有多个列具有相同的名字。如果列名用作 getXXX 方法的参数，则 getXXX 将返回第一个匹配列名的值。因而，如果多个列具有相同的名字，则需要使用列索引来确保检索了正确的列值。这时，使用列号效率要稍微高一些。 </p>
				<p>关于 ResultSet 中列的信息，可通过调用方法 ResultSet.getMetaData 得到。返回的 ResultSetMetaData 对象将给出其 ResultSet 对象各列的编号、类型和属性。 </p>
				<p>如果列名已知，但不知其索引，则可用方法 findColumn 得到其列号。 </p>
				<p>
						<br />5.1.3 数据类型和转换 <br />对于 getXXX 方法，JDBC 驱动程序试图将基本数据转换成指定 Java 类型，然后返回适合的 Java 值。例如，如果 getXXX 方法为 getString，而基本数据库中数据类型为 VARCHAR，则 JDBC 驱动程序将把 VARCHAR 转换成 Java String。getString 的返回值将为 Java String 对象。 </p>
				<p>下表显示了允许用 getXXX 获取的 JDBC 类型及推荐用它获取的 JDBC 类型（通用 SQL 类型）。小写的 x 表示允许 getXXX 方法获取该数据类型；大写的 X 表示对该数据类型推荐使用 getXXX 方法。例如，除了 getBytes 和 getBinaryStream 之外的任何 getXXX 方法都可用来获取 LONGVARCHAR 值，但是推荐根据返回的数据类型使用 getAsciiStream 或 getUnicodeStream 方法。方法 getObject 将任何数据类型返回为 Java Object。当基本数据类型是特定于数据库的抽象类型或当通用应用程序需要接受任何数据类型时，它是非常有用的。 </p>
				<p>可使用 ResultSet.getXXX 方法获取常见的 JDBC 数据类型。 </p>
				<p>“x”表示该 getXXX 方法可合法地用于获取给定 JDBC 类型。 </p>
				<p>“X”表示推荐使用该 getXXX 方法来获取给定 JDBC 类型。 </p>
				<p>　 T <br />I <br />N <br />Y <br />I <br />N <br />T S <br />M <br />A <br />L <br />L <br />I <br />N <br />T I <br />N <br />T <br />E <br />G <br />E <br />R B <br />I <br />G </p>
				<p>N <br />T R <br />E <br />A <br />L F <br />L <br />O <br />A <br />T D <br />O <br />U <br />B <br />L <br />E D <br />E <br />C <br />I <br />M <br />A <br />L N <br />U <br />M <br />E <br />R <br />I <br />C B <br />I <br />T C <br />H <br />A <br />R V <br />A <br />R <br />C <br />H <br />A <br />R <br />L <br />O <br />N <br />G <br />V <br />A <br />R <br />C <br />H <br />A <br />R B <br />I <br />N <br />A <br />R <br />Y V <br />A <br />R <br />B <br />I <br />N <br />A <br />R <br />Y L <br />O <br />N <br />G <br />V <br />A <br />R <br />B <br />I <br />N <br />A <br />R <br />Y D <br />A <br />T <br />E T <br />I <br />M <br />E T <br />I <br />M <br />E <br />S <br />T <br />A <br />M <br />P  <br />getByte X x x x x x x x x x x x x 　 　 　 　 　 　  <br />getShort x X x x x x x x x x x x x 　 　 　 　 　 　  <br />getInt x x X x x x x x x x x x x 　 　 　 　 　 　  <br />getLong x x x X x x x x x x x x x 　 　 　 　 　 　  <br />getFloat x x x x X x x x x x x x x 　 　 　 　 　 　  <br />getDouble x x x x x X X x x x x x x 　 　 　 　 　 　  <br />getBigDecimal x x x x x x x X X x x x x 　 　 　 　 　 　  <br />getBoolean x x x x x x x x x X x x x 　 　 　 　 　 　  <br />getString x x x x x x x x x x X X x x x x x x x  <br />getBytes 　 　 　 　 　 　 　 　 　 　 　 　 　 X X x 　 　 　  <br />getDate 　 　 　 　 　 　 　 　 　 　 x x x 　 　 　 X 　 x  <br />getTime 　 　 　 　 　 　 　 　 　 　 x x x 　 　 　 　 X x  <br />getTimestamp 　 　 　 　 　 　 　 　 　 　 x x x 　 　 　 x 　 X  <br />getAsciiStream 　 　 　 　 　 　 　 　 　 　 x x X x x x 　 　 　  <br />getUnicodeStream 　 　 　 　 　 　 　 　 　 　 x x X x x x 　 　 　  <br />getBinaryStream 　 　 　 　 　 　 　 　 　 　 　 　 　 x x X 　 　 　  <br />getObject x x x x x x x x x x x x x x x x x x x  </p>
				<p>
						<br />5.1.4 对非常大的行值使用流 <br />ResultSet 可以获取任意大的 LONGVARBINARY 或 LONGVARCHAR 数据。方法 getBytes 和 getString 将数据返回为大的块（最大为 Statement.getMaxFieldSize 的返回值）。但是，以较小的固定块获取非常大的数据可能会更方便，而这可通过让 ResultSet 类返回 java.io.Input 流来完成。从该流中可分块读取数据。注意：必须立即访问这些流，因为在下一次对 ResultSet 调用 getXXX 时它们将自动关闭（这是由于基本实现对大块数据访问有限制）。  </p>
				<p>JDBC API 具有三个获取流的方法，分别具有不同的返回值：  </p>
				<p>
						<br />getBinaryStream 返回只提供数据库原字节而不进行任何转换的流。 </p>
				<p>
						<br />getAsciiStream 返回提供单字节 ASCII 字符的流。 </p>
				<p>
						<br />getUnicodeStream 返回提供双字节 Unicode 字符的流。 </p>
				<p>
						<br />注意：它不同于 Java 流，后者返回无类型字节并可（例如）通用于 ASCII 和 Unicode 字符。 </p>
				<p>下列代码演示了 getAsciiStream 的用法：  </p>
				<p>java.sql.Statement stmt = con.createStatement(); <br />ResultSet r = stmt.executeQuery("SELECT x FROM Table2"); <br />// 现在以 4K 块大小获取列 1 结果： <br />byte buff = new byte[4096]; <br />while (r.next()) { <br />Java.io.InputStream fin = r.getAsciiStream(1); <br />for (;;) { <br />int size = fin.read(buff); <br />if (size == -1) { // 到达流末尾 <br />break; <br />} <br />// 将新填充的缓冲区发送到 ASCII 输出流： <br />output.write(buff, 0, size); <br />} <br />} </p>
				<p>5.1.5 NULL 结果值 <br />要确定给定结果值是否是 JDBC NULL，必须先读取该列，然后使用 ResultSet.wasNull 方法检查该次读取是否返回 JDBC NULL。 </p>
				<p>当使用 ResultSet.getXXX 方法读取 JDBC NULL 时，方法 wasNull 将返回下列值之一：  </p>
				<p>
						<br />Java null 值：对于返回 Java 对象的 getXXX 方法（例如 getString、getBigDecimal、getBytes、getDate、getTime、getTimestamp、getAsciiStream、getUnicodeStream、getBinaryStream、getObject 等）。 </p>
				<p>
						<br />零值：对于 getByte、getShort、getInt、getLong、getFloat 和 getDouble。 </p>
				<p>
						<br />false 值：对于 getBoolean。 </p>
				<p>
						<br />5.1.6 可选结果集或多结果集 <br />通常使用 executeQuery（它返回单个 ResultSet）或 executeUpdate（它可用于任何数据库修改语句，并返回更新行数）可执行 SQL 语句。但有些情况下，应用程序在执行语句之前不知道该语句是否返回结果集。此外，有些已存储过程可能返回几个不同的结果集和/或更新计数。 </p>
				<p>为了适应这些情况，JDBC 提供了一种机制，允许应用程序执行语句，然后处理由结果集和更新计数组成的任意集合。这种机制的原理是首先调用一个完全通用的 execute 方法，然后调用另外三个方法，getResultSet、getUpdateCount 和 getMoreResults。这些方法允许应用程序一次一个地研究语句结果，并确定给定结果是 ResultSet 还是更新计数。 </p>
				<p>用户不必关闭 ResultSet；当产生它的 Statement 关闭、重新执行或用于从多结果序列中获取下一个结果时，该 ResultSet 将被 Statement 自动关闭。  </p>
				<br />
				<br />
				<p id="TBPingURL">Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=630447</p>
		</div>
<img src ="http://www.blogjava.net/iKingQu/aggbug/36761.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iKingQu/" target="_blank">風向逆轉 - 就要爪哇</a> 2006-03-22 03:31 <a href="http://www.blogjava.net/iKingQu/articles/36761.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[收藏]JDBC系列教程（三）---语句</title><link>http://www.blogjava.net/iKingQu/articles/36760.html</link><dc:creator>風向逆轉 - 就要爪哇</dc:creator><author>風向逆轉 - 就要爪哇</author><pubDate>Tue, 21 Mar 2006 19:30:00 GMT</pubDate><guid>http://www.blogjava.net/iKingQu/articles/36760.html</guid><wfw:comment>http://www.blogjava.net/iKingQu/comments/36760.html</wfw:comment><comments>http://www.blogjava.net/iKingQu/articles/36760.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iKingQu/comments/commentRss/36760.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iKingQu/services/trackbacks/36760.html</trackback:ping><description><![CDATA[
		<div class="postText">
				<p>
						<span class="Title">JDBC系列教程（三）---语句 </span>
				</p>
				<p>Statement <br />本概述是从《JDBCTM Database Access from JavaTM: A Tutorial and Annotated Reference 》这本书中摘引来的。JavaSoft 目前正在准备这本书。这是一本教程，同时也是 JDBC 的重要参考手册，它将作为 Java 系列的组成部份在 1997 年春季由 Addison-Wesley 出版公司出版。  </p>
				<p>4.1 概述 <br />Statement 对象用于将 SQL 语句发送到数据库中。实际上有三种 Statement 对象，它们都作为在给定连接上执行 SQL 语句的包容器：Statement、PreparedStatement（它从 Statement 继承而来）和 CallableStatement（它从 PreparedStatement 继承而来）。它们都专用于发送特定类型的 SQL 语句： Statement 对象用于执行不带参数的简单 SQL 语句；PreparedStatement 对象用于执行带或不带 IN 参数的预编译 SQL 语句；CallableStatement 对象用于执行对数据库已存储过程的调用。 </p>
				<p>Statement 接口提供了执行语句和获取结果的基本方法。PreparedStatement 接口添加了处理 IN 参数的方法；而 CallableStatement 添加了处理 OUT 参数的方法。 </p>
				<p>
						<br />4.1.1 创建 Statement 对象 <br />建立了到特定数据库的连接之后，就可用该连接发送 SQL 语句。Statement 对象用 Connection 的方法 createStatement 创建，如下列代码段中所示：  </p>
				<p>Connection con = DriverManager.getConnection(url, "sunny", ""); <br />Statement stmt = con.createStatement(); </p>
				<p>为了执行 Statement 对象，被发送到数据库的 SQL 语句将被作为参数提供给 Statement 的方法：  </p>
				<p>ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table2"); </p>
				<p>4.1.2 使用 Statement 对象执行语句 <br />Statement 接口提供了三种执行 SQL 语句的方法：executeQuery、executeUpdate 和 execute。使用哪一个方法由 SQL 语句所产生的内容决定。 </p>
				<p>方法 executeQuery 用于产生单个结果集的语句，例如 SELECT 语句。 </p>
				<p>方法 executeUpdate 用于执行 INSERT、UPDATE 或 DELETE 语句以及 SQL DDL（数据定义语言）语句，例如 CREATE TABLE 和 DROP TABLE。INSERT、UPDATE 或 DELETE 语句的效果是修改表中零行或多行中的一列或多列。executeUpdate 的返回值是一个整数，指示受影响的行数（即更新计数）。对于 CREATE TABLE 或 DROP TABLE 等不操作行的语句，executeUpdate 的返回值总为零。 </p>
				<p>方法 execute 用于执行返回多个结果集、多个更新计数或二者组合的语句。因为多数程序员不会需要该高级功能，所以本概述后面将在单独一节中对其进行介绍。 </p>
				<p>执行语句的所有方法都将关闭所调用的 Statement 对象的当前打开结果集（如果存在）。这意味着在重新执行 Statement 对象之前，需要完成对当前 ResultSet 对象的处理。 </p>
				<p>应注意，继承了 Statement 接口中所有方法的 PreparedStatement 接口都有自己的 executeQuery、executeUpdate 和 execute 方法。Statement 对象本身不包含 SQL 语句，因而必须给 Statement.execute 方法提供 SQL 语句作为参数。PreparedStatement 对象并不将 SQL 语句作为参数提供给这些方法，因为它们已经包含预编译 SQL 语句。CallableStatement 对象继承这些方法的 PreparedStatement 形式。对于这些方法的 PreparedStatement 或 CallableStatement 版本，使用查询参数将抛出 SQLException。 </p>
				<p>
						<br />4.1.3 语句完成 <br />当连接处于自动提交模式时，其中所执行的语句在完成时将自动提交或还原。语句在已执行且所有结果返回时，即认为已完成。对于返回一个结果集的 executeQuery 方法，在检索完 ResultSet 对象的所有行时该语句完成。对于方法 executeUpdate，当它执行时语句即完成。但在少数调用方法 execute 的情况中，在检索所有结果集或它生成的更新计数之后语句才完成。 </p>
				<p>有些 DBMS 将已存储过程中的每条语句视为独立的语句；而另外一些则将整个过程视为一个复合语句。在启用自动提交时，这种差别就变得非常重要，因为它影响什么时候调用 commit 方法。在前一种情况中，每条语句单独提交；在后一种情况中，所有语句同时提交。 </p>
				<p>
						<br />4.1.4 关闭 Statement 对象 <br />Statement 对象将由 Java 垃圾收集程序自动关闭。而作为一种好的编程风格，应在不需要 Statement 对象时显式地关闭它们。这将立即释放 DBMS 资源，有助于避免潜在的内存问题。 </p>
				<p>
						<br />4.1.5 Statement 对象中的 SQL 转义语法  <br />Statement 可包含使用 SQL 转义语法的 SQL 语句。转义语法告诉驱动程序其中的代码应该以不同方式处理。驱动程序将扫描任何转义语法，并将它转换成特定数据库可理解的代码。这使得转义语法与 DBMS 无关，并允许程序员使用在没有转义语法时不可用的功能。 </p>
				<p>转义子句由花括号和关键字界定：  </p>
				<p>{keyword . . . parameters . . . } </p>
				<p>该关键字指示转义子句的类型，如下所示。 </p>
				<p>
						<br />escape 表示 LIKE 转义字符  </p>
				<p>
						<br />字符“%”和“_”类似于 SQL LIKE 子句中的通配符（“%”匹配零个或多个字符，而“_”则匹配一个字符）。为了正确解释它们，应在其前面加上反斜杠（“\”），它是字符串中的特殊转义字符。在查询末尾包括如下语法即可指定用作转义字符的字符：  </p>
				<p>{escape 'escape-character'} </p>
				<p>
						<br />例如，下列查询使用反斜杠字符作为转义字符，查找以下划线开头的标识符名：  </p>
				<p>stmt.executeQuery("SELECT name FROM Identifiers <br />WHERE Id LIKE `\_%' {escape `\'}; </p>
				<p>
						<br />fn 表示标量函数 </p>
				<p>
						<br />几乎所有 DBMS 都具有标量值的数值、字符串、时间、日期、系统和转换函数。要使用这些函数，可使用如下转义语法：关键字 fn 后跟所需的函数名及其参数。例如，下列代码调用函数 concat 将两个参数连接在一起：  </p>
				<p>{fn concat("Hot", "Java")}; </p>
				<p>
						<br />可用下列语法获得当前数据库用户名：  </p>
				<p>{fn user()}; </p>
				<p>
						<br />标量函数可能由语法稍有不同的 DBMS 支持，而它们可能不被所有驱动程序支持。各种 DatabaseMetaData 方法将列出所支持的函数。例如，方法 getNumericFunctions 返回用逗号分隔的数值函数列表，而方法 getStringFunctions 将返回字符串函数，等等。 </p>
				<p>驱动程序将转义函数调用映射为相应的语法，或直接实现该函数。 </p>
				<p>
						<br />d、t 和 ts 表示日期和时间文字 </p>
				<p>
						<br />DBMS 用于日期、时间和时间标记文字的语法各不相同。JDBC 使用转义子句支持这些文字的语法的 ISO 标准格式。驱动程序必须将转义子句转换成 DBMS 表示。 </p>
				<p>例如，可用下列语法在 JDBC SQL 语句中指定日期：  </p>
				<p>{d `yyyy-mm-dd'} </p>
				<p>
						<br />在该语法中，yyyy 为年代，mm 为月份，而 dd 则为日期。驱动程序将用等价的特定于 DBMS 的表示替换这个转义子句。例如，如果 '28- FEB-99' 符合基本数据库的格式，则驱动程序将用它替换 {d 1999-02-28}。 </p>
				<p>对于 TIME 和 TIMESTAMP 也有类似的转义子句：  </p>
				<p>{t `hh:mm:ss'} <br />{ts `yyyy-mm-dd hh:mm:ss.f . . .'} </p>
				<p>
						<br />TIMESTAMP 中的小数点后的秒（.f . . .）部分可忽略。 </p>
				<p>
						<br />call 或 ? = call 表示已存储过程 </p>
				<p>
						<br />如果数据库支持已存储过程，则可从 JDBC 中调用它们，语法为：  </p>
				<p>{call procedure_name[(?, ?, . . .)]} </p>
				<p>
						<br />或（其中过程返回结果参数）：  </p>
				<p>{? = call procedure_name[(?, ?, . . .)]} </p>
				<p>
						<br />方括号指示其中的内容是可选的。它们不是语法的必要部分。 </p>
				<p>输入参数可以为文字或参数。有关详细信息，参见 JDBC 指南中第 7 节，“CallableStatement”。 </p>
				<p>可通过调用方法 DatabaseMetaData.supportsStoredProcedures 检查数据库是否支持已存储过程。 </p>
				<p>
						<br />oj 表示外部连接 </p>
				<p>
						<br />外部连接的语法为  </p>
				<p>{oj outer-join} </p>
				<p>
						<br />其中 outer-join 形式为  </p>
				<p>table LEFT OUTER JOIN {table / outer-join} ON search-condition </p>
				<p>
						<br />外部连接属于高级功能。有关它们的解释可参见 SQL 语法。JDBC 提供了三种 DatabaseMetaData 方法用于确定驱动程序支持哪些外部连接类型：supportsOuterJoins、supportsFullOuterJoins 和 supportsLimitedOuterJoins。 </p>
				<p>
						<br />方法 Statement.setEscapeProcessing 可打开或关闭转义处理；缺省状态为打开。当性能极为重要时，程序员可能想关闭它以减少处理时间。但通常它将出于打开状态。应注意： setEscapeProcessing 不适用于 PreparedStatement 对象，因为在调用该语句前它就可能已被发送到数据库。有关预编译的信息，参见 PreparedStatement。 </p>
				<p>
						<br />4.1.6 使用方法 execute <br />execute 方法应该仅在语句能返回多个 ResultSet 对象、多个更新计数或 ResultSet 对象与更新计数的组合时使用。当执行某个已存储过程或动态执行未知 SQL 字符串（即应用程序程序员在编译时未知）时，有可能出现多个结果的情况，尽管这种情况很少见。例如，用户可能执行一个已存储过程（使用 CallableStatement 对象 - 参见第 135 页的 CallableStatement），并且该已存储过程可执行更新，然后执行选择，再进行更新，再进行选择，等等。通常使用已存储过程的人应知道它所返回的内容。 </p>
				<p>因为方法 execute 处理非常规情况，所以获取其结果需要一些特殊处理并不足为怪。例如，假定已知某个过程返回两个结果集，则在使用方法 execute 执行该过程后，必须调用方法 getResultSet 获得第一个结果集，然后调用适当的 getXXX 方法获取其中的值。要获得第二个结果集，需要先调用 getMoreResults 方法，然后再调用 getResultSet 方法。如果已知某个过程返回两个更新计数，则首先调用方法 getUpdateCount，然后调用 getMoreResults，并再次调用 getUpdateCount。 </p>
				<p>对于不知道返回内容，则情况更为复杂。如果结果是 ResultSet 对象，则方法 execute 返回 true；如果结果是 Java int，则返回 false。如果返回 int，则意味着结果是更新计数或执行的语句是 DDL 命令。在调用方法 execute 之后要做的第一件事情是调用 getResultSet 或 getUpdateCount。调用方法 getResultSet 可以获得两个或多个 ResultSet 对象中第一个对象；或调用方法 getUpdateCount 可以获得两个或多个更新计数中第一个更新计数的内容。 </p>
				<p>当 SQL 语句的结果不是结果集时，则方法 getResultSet 将返回 null。这可能意味着结果是一个更新计数或没有其它结果。在这种情况下，判断 null 真正含义的唯一方法是调用方法 getUpdateCount，它将返回一个整数。这个整数为调用语句所影响的行数；如果为 -1 则表示结果是结果集或没有结果。如果方法 getResultSet 已返回 null（表示结果不是 ResultSet 对象），则返回值 -1 表示没有其它结果。也就是说，当下列条件为真时表示没有结果（或没有其它结果）：  </p>
				<p>((stmt.getResultSet() == null) &amp;&amp; (stmt.getUpdateCount() == -1)) </p>
				<p>如果已经调用方法 getResultSet 并处理了它返回的 ResultSet 对象，则有必要调用方法 getMoreResults 以确定是否有其它结果集或更新计数。如果 getMoreResults 返回 true，则需要再次调用 getResultSet 来检索下一个结果集。如上所述，如果 getResultSet 返回 null，则需要调用 getUpdateCount 来检查 null 是表示结果为更新计数还是表示没有其它结果。 </p>
				<p>当 getMoreResults 返回 false 时，它表示该 SQL 语句返回一个更新计数或没有其它结果。因此需要调用方法 getUpdateCount 来检查它是哪一种情况。在这种情况下，当下列条件为真时表示没有其它结果：  </p>
				<p>((stmt.getMoreResults() == false) &amp;&amp; (stmt.getUpdateCount() == -1)) </p>
				<p>下面的代码演示了一种方法用来确认已访问调用方法 execute 所产生的全部结果集和更新计数：  </p>
				<p>
						<br />stmt.execute(queryStringWithUnknownResults); <br />while (true) { <br />int rowCount = stmt.getUpdateCount(); <br />if (rowCount &gt; 0) { // 它是更新计数 <br />System.out.println("Rows changed = " + count); <br />stmt.getMoreResults(); <br />continue; <br />} <br />if (rowCount == 0) { // DDL 命令或 0 个更新 <br />System.out.println(" No rows changed or statement was DDL <br />command"); <br />stmt.getMoreResults(); <br />continue; <br />} </p>
				<p>// 执行到这里，证明有一个结果集 <br />// 或没有其它结果 </p>
				<p>ResultSet rs = stmt.getResultSet; <br />if (rs != null) { <br />. . . // 使用元数据获得关于结果集列的信息 <br />while (rs.next()) { <br />. . . // 处理结果 <br />stmt.getMoreResults(); <br />continue; <br />} <br />break; // 没有其它结果 </p>
				<br />
				<br />
				<p id="TBPingURL">Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=630445</p>
		</div>
<img src ="http://www.blogjava.net/iKingQu/aggbug/36760.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iKingQu/" target="_blank">風向逆轉 - 就要爪哇</a> 2006-03-22 03:30 <a href="http://www.blogjava.net/iKingQu/articles/36760.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[收藏]JDBC系列教程（二）---驱动设置</title><link>http://www.blogjava.net/iKingQu/articles/36759.html</link><dc:creator>風向逆轉 - 就要爪哇</dc:creator><author>風向逆轉 - 就要爪哇</author><pubDate>Tue, 21 Mar 2006 19:28:00 GMT</pubDate><guid>http://www.blogjava.net/iKingQu/articles/36759.html</guid><wfw:comment>http://www.blogjava.net/iKingQu/comments/36759.html</wfw:comment><comments>http://www.blogjava.net/iKingQu/articles/36759.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/iKingQu/comments/commentRss/36759.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/iKingQu/services/trackbacks/36759.html</trackback:ping><description><![CDATA[
		<div class="postText">
				<p>
						<span class="Title">JDBC系列教程（二）---驱动设置 </span>
				</p>
				<p>DriverManager <br />本概述摘自《JDBCTM Database Access from JavaTM: A Tutorial and Annotated Reference》，目前正由 JavaSoft 继续编写。这本书既是 JDBC 的教程，也是一本权威性参考手册，将作为 Java 系列的一部分在 1997 年春季由 Addison-Wesley 出版公司出版。  </p>
				<p>3.1 概述 <br />DriverManager 类是 JDBC 的管理层，作用于用户和驱动程序之间。它跟踪可用的驱动程序，并在数据库和相应驱动程序之间建立连接。另外，DriverManager 类也处理诸如驱动程序登录时间限制及登录和跟踪消息的显示等事务。 </p>
				<p>对于简单的应用程序，一般程序员需要在此类中直接使用的唯一方法是 DriverManager.getConnection。正如名称所示，该方法将建立与数据库的连接。JDBC 允许用户调用 DriverManager 的方法 getDriver、getDrivers 和 registerDriver 及 Driver 的方法 connect。但多数情况下，让 DriverManager 类管理建立连接的细节为上策。 </p>
				<p>
						<br />3.1.1 跟踪可用驱动程序 <br />DriverManager 类包含一列 Driver 类，它们已通过调用方法 DriverManager.registerDriver 对自己进行了注册。所有 Driver 类都必须包含有一个静态部分。它创建该类的实例，然后在加载该实例时 DriverManager 类进行注册。这样，用户正常情况下将不会直接调用 DriverManager.registerDriver；而是在加载驱动程序时由驱动程序自动调用。加载 Driver 类，然后自动在 DriverManager 中注册的方式有两种：  </p>
				<p>
						<br />通过调用方法 Class.forName。这将显式地加载驱动程序类。由于这与外部设置无关，因此推荐使用这种加载驱动程序的方法。以下代码加载类 acme.db.Driver：  <br />Class.forName("acme.db.Driver"); </p>
				<p>如果将 acme.db.Driver 编写为加载时创建实例，并调用以该实例为参数的 DriverManager.registerDriver（本该如此），则它在 DriverManager 的驱动程序列表中，并可用于创建连接。 </p>
				<p>
						<br />通过将驱动程序添加到 java.lang.System 的属性 jdbc.drivers 中。这是一个由 DriverManager 类加载的驱动程序类名的列表，由冒号分隔：初始化 DriverManager 类时，它搜索系统属性 jdbc.drivers，如果用户已输入了一个或多个驱动程序，则 DriverManager 类将试图加载它们。以下代码说明程序员如何在 ~/.hotjava/properties 中输入三个驱动程序类（启动时，HotJava 将把它加载到系统属性列表中）：  <br />jdbc.drivers=foo.bah.Driver:wombat.sql.Driver:bad.test.ourDriver; </p>
				<p>对 DriverManager 方法的第一次调用将自动加载这些驱动程序类。 </p>
				<p>注意：加载驱动程序的第二种方法需要持久的预设环境。如果对这一点不能保证，则调用方法 Class.forName 显式地加载每个驱动程序就显得更为安全。这也是引入特定驱动程序的方法，因为一旦 DriverManager 类被初始化，它将不再检查 jdbc.drivers 属性列表。 </p>
				<p>在以上两种情况中，新加载的 Driver 类都要通过调用 DriverManager.registerDriver 类进行自我注册。如上所述，加载类时将自动执行这一过程。 </p>
				<p>由于安全方面的原因，JDBC 管理层将跟踪哪个类加载器提供哪个驱动程序。这样，当 DriverManager 类打开连接时，它仅使用本地文件系统或与发出连接请求的代码相同的类加载器提供的驱动程序。 </p>
				<p>
						<br />3.1.2 建立连接 <br />加载 Driver 类并在 DriverManager 类中注册后，它们即可用来与数据库建立连接。当调用 DriverManager.getConnection 方法发出连接请求时，DriverManager 将检查每个驱动程序，查看它是否可以建立连接。 </p>
				<p>有时可能有多个 JDBC 驱动程序可以与给定的 URL 连接。例如，与给定远程数据库连接时，可以使用 JDBC-ODBC 桥驱动程序、JDBC 到通用网络协议驱动程序或数据库厂商提供的驱动程序。在这种情况下，测试驱动程序的顺序至关重要，因为 DriverManager 将使用它所找到的第一个可以成功连接到给定 URL 的驱动程序。 </p>
				<p>首先 DriverManager 试图按注册的顺序使用每个驱动程序（jdbc.drivers 中列出的驱动程序总是先注册）。它将跳过代码不可信任的驱动程序，除非加载它们的源与试图打开连接的代码的源相同。 </p>
				<p>它通过轮流在每个驱动程序上调用方法 Driver.connect，并向它们传递用户开始传递给方法 DriverManager.getConnection 的 URL 来对驱动程序进行测试，然后连接第一个认出该 URL 的驱动程序。 </p>
				<p>这种方法初看起来效率不高，但由于不可能同时加载数十个驱动程序，因此每次连接实际只需几个过程调用和字符串比较。 </p>
				<p>以下代码是通常情况下用驱动程序（例如 JDBC-ODBC 桥驱动程序）建立连接所需所有步骤的示例：  </p>
				<p>Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); //加载驱动程序 <br />String url = "jdbc:odbc:fred"; <br />DriverManager.getConnection(url, "userID", "passwd"); </p>
				<br />
				<br />
				<p id="TBPingURL">Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=630442</p>
		</div>
<img src ="http://www.blogjava.net/iKingQu/aggbug/36759.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/iKingQu/" target="_blank">風向逆轉 - 就要爪哇</a> 2006-03-22 03:28 <a href="http://www.blogjava.net/iKingQu/articles/36759.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>