﻿<?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-无为-随笔分类-java</title><link>http://www.blogjava.net/mlh123caoer/category/11360.html</link><description>无为则可为，无为则至深！
</description><language>zh-cn</language><lastBuildDate>Tue, 04 Oct 2011 17:29:42 GMT</lastBuildDate><pubDate>Tue, 04 Oct 2011 17:29:42 GMT</pubDate><ttl>60</ttl><item><title>Java heap dump触发和分析</title><link>http://www.blogjava.net/mlh123caoer/archive/2011/10/04/360020.html</link><dc:creator>草儿</dc:creator><author>草儿</author><pubDate>Tue, 04 Oct 2011 14:31:00 GMT</pubDate><guid>http://www.blogjava.net/mlh123caoer/archive/2011/10/04/360020.html</guid><wfw:comment>http://www.blogjava.net/mlh123caoer/comments/360020.html</wfw:comment><comments>http://www.blogjava.net/mlh123caoer/archive/2011/10/04/360020.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mlh123caoer/comments/commentRss/360020.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mlh123caoer/services/trackbacks/360020.html</trackback:ping><description><![CDATA[<span class="Apple-style-span" style="color: #4e4e4e; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; line-height: normal; background-color: #ffffff; "><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; line-height: 21px; "><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; font-size: 14px; ">为了分析java应用的内存泄漏，使用thread dump往往解决不了问题。使用jstat【eg：<a href="http://www.google.com.hk/url?sa=t&amp;source=web&amp;cd=2&amp;ved=0CCgQFjAB&amp;url=http%3A%2F%2Fdownload.oracle.com%2Fjavase%2F1.5.0%2Fdocs%2Ftooldocs%2Fshare%2Fjstat.html&amp;ei=yPiSTbqoCYLOvQPlgom9CA&amp;usg=AFQjCNFn5NygCF6PuGM4GqcYCtc6X8XCVw&amp;sig2=h-u3sevbVJ94VvDwodD9qg" target="_blank" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; color: #0071bb; outline-style: none; outline-width: initial; outline-color: initial; text-decoration: none; ">jstat&nbsp;</a>-gcutil pid 1000 5】工具查看运行的java应用的heap size,perm size ,survivor ratio等，当时你无法知道是什么对象把堆填满了。</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 9px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: arial, helvetica, sans-serif; line-height: 21px; background-color: #e6e6fa; height: 25px; width: 602px; font-size: 14px; color: #000000; "><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; font-size: 14px; "><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; ">&nbsp;&nbsp;&nbsp;&nbsp; 什么是 Java heap dump<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; " /></strong></span></p><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 6px; padding-left: 6px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; border-left-width: 2px; border-left-style: solid; border-left-color: #cccccc; "><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; line-height: 21px; "><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; font-size: 14px; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 首先需要搞懂什么是java heap，java heap是分配给实例类和数组对象运行数据区，所有java线程在运行期间共享heap中的数据。Java heap dump相当于java应用在运行的时候在某个时间点上打了个快照（snapshot）。</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; line-height: 21px; "><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; font-size: 14px; ">&nbsp;&nbsp;&nbsp;&nbsp; 如果你不懂啥是snapshot，点击<a href="http://en.wikipedia.org/wiki/Snapshot_%28computer_storage%29" target="_blank" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; color: #0071bb; outline-style: none; outline-width: initial; outline-color: initial; text-decoration: none; ">这里</a></span></p></div><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 9px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: arial, helvetica, sans-serif; line-height: 21px; background-color: #e6e6fa; height: 25px; width: 602px; font-size: 14px; color: #000000; "><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; font-size: 14px; "><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; ">&nbsp;&nbsp;&nbsp;&nbsp; 触发 Java heap dump</strong></span></p><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 6px; padding-left: 6px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; border-left-width: 2px; border-left-style: solid; border-left-color: #cccccc; "><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; line-height: 21px; "><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; font-size: 14px; ">有以下方法出发heap dump</span></p><ol style="margin-top: 0.4em; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; line-height: 21px; "><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 2.5em; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; list-style-position: outside; "><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; font-size: 14px; ">使用$JAVA_HOME/bin/<a href="http://www.google.com.hk/url?sa=t&amp;source=web&amp;cd=2&amp;ved=0CCAQFjAB&amp;url=http%3A%2F%2Fdownload.oracle.com%2Fjavase%2F1.5.0%2Fdocs%2Ftooldocs%2Fshare%2Fjmap.html&amp;ei=5_iSTYP2HJCOvQPU_pm9CA&amp;usg=AFQjCNFr8XgO8PX4-4QvoRxFvAh4LEXA5g&amp;sig2=lJb4GdMId12S6_Ew6YXvag" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; color: #0071bb; outline-style: none; outline-width: initial; outline-color: initial; text-decoration: none; ">jmap</a>&nbsp;-dump来触发，eg：jmap -dump:format=b,file=/home/longhao/heamdump.out &lt;pid&gt;</span></li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 2.5em; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; list-style-position: outside; "><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; font-size: 14px; ">使用$JAVA_HOME/bin/<a href="http://www.google.com.hk/url?sa=t&amp;source=web&amp;cd=1&amp;ved=0CBkQhgIwAA&amp;url=http%3A%2F%2Fjava.sun.com%2Fdeveloper%2FtechnicalArticles%2FJ2SE%2Fjconsole.html&amp;ei=-PiSTeLLDY7UvQODi5G9CA&amp;usg=AFQjCNEFUBKnvOZ50G07zeJLsOXFZ-UVSw&amp;sig2=HDZn6b06a27ZD87DYJJsPw" target="_blank" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; color: #0071bb; outline-style: none; outline-width: initial; outline-color: initial; text-decoration: none; ">jcosole</a>中的MBean，到MBean&gt;com.sun.management&gt;HotSpotDiagnostic&gt;操作&gt;dumpHeap中，点击 dumpHeap按钮。生成的dump文件在java应用的根目录下面。</span></li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 2.5em; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; list-style-position: outside; "><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; font-size: 14px; ">在应用启动时配置相关的参数 -XX:+HeapDumpOnOutOfMemoryError，当应用抛出OutOfMemoryError时生成dump文件。</span></li><li style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 2.5em; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; list-style-position: outside; "><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; font-size: 14px; ">使用<a href="http://www.google.com.hk/url?sa=t&amp;source=web&amp;cd=1&amp;ved=0CBkQFjAA&amp;url=http%3A%2F%2Fjava.sun.com%2Fdeveloper%2FtechnicalArticles%2FProgramming%2FHPROF.html&amp;ei=FPmSTaH5LYncvwObyv28CA&amp;usg=AFQjCNHrnFaZkSrAE4cKpk3A6L4AcrDWAw&amp;sig2=nhRGV8HnAQsGhulSSdgdBg" target="_blank" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; color: #0071bb; outline-style: none; outline-width: initial; outline-color: initial; text-decoration: none; ">hprof</a>。启动虚拟机加入-Xrunhprof:head=site，会生成java.hprof.txt文件。该配置会导致jvm运行非常的慢，不适合生产环境。</span></li></ol><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; line-height: 21px; "><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; font-size: 14px; "><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; " /></span></p></div><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 9px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: arial, helvetica, sans-serif; line-height: 21px; background-color: #e6e6fa; height: 25px; width: 602px; font-size: 14px; color: #000000; "><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; font-size: 14px; "><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; ">&nbsp;&nbsp;&nbsp;&nbsp; 分析 Java heap dump</strong></span></p><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 6px; padding-left: 6px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; border-left-width: 2px; border-left-style: solid; border-left-color: #cccccc; "><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 9px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: arial, helvetica, sans-serif; line-height: 21px; background-color: #e6e6fa; height: 25px; width: 588px; font-size: 14px; color: #000000; "><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; font-size: 14px; "><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; ">&nbsp;&nbsp;&nbsp;&nbsp; 1：使用IBM HeapAnalyzer<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; " /></strong></span></p><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 6px; padding-left: 6px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; border-left-width: 2px; border-left-style: solid; border-left-color: #cccccc; "><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; line-height: 21px; "><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; font-size: 14px; ">&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://www.alphaworks.ibm.com/tech/heapanalyzer" target="_blank" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; color: #0071bb; outline-style: none; outline-width: initial; outline-color: initial; text-decoration: none; ">IBM HeapAnalyzer</a>是一款免费的JVM内存堆的图形分析工具，它可以有效的列举堆的内存使用状况，帮助分析Java内存泄漏的原因。</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; line-height: 21px; "><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; font-size: 14px; ">&nbsp;&nbsp;&nbsp; 下载解压后有一个ha413.jar，执行: java -Xmx512m -jar ha413.jar /home/longhao/heapdump.out</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; line-height: 21px; "><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; font-size: 14px; ">&nbsp;&nbsp;&nbsp;&nbsp; 执行结果如图所示：</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; line-height: 21px; text-align: center; "><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; font-size: 14px; "><img alt="" src="http://farm6.static.flickr.com/5176/5573840400_7d8e21a701.jpg" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; " /><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; " /></span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; line-height: 21px; "><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; font-size: 14px; ">&nbsp;&nbsp;&nbsp;</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; line-height: 21px; "></p></div><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 9px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: arial, helvetica, sans-serif; line-height: 21px; background-color: #e6e6fa; height: 25px; width: 588px; font-size: 14px; color: #000000; "><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; font-size: 14px; "><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; ">&nbsp;&nbsp;&nbsp;&nbsp; 2：jhat</strong></span></p><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 6px; padding-left: 6px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; border-left-width: 2px; border-left-style: solid; border-left-color: #cccccc; "><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; line-height: 21px; "><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; font-size: 14px; ">&nbsp;&nbsp;&nbsp;<a href="http://download.oracle.com/javase/6/docs/technotes/tools/share/jhat.html" target="_blank" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; color: #0071bb; outline-style: none; outline-width: initial; outline-color: initial; text-decoration: none; ">&nbsp;jhat（Java Head Analyse Tool ）</a>是用来分析java堆的命令，可以将堆中的对象以html的形式显示出来，包括对象的数量，大小等等，并支持对象查询语言OQL，分析相关的应用后，可以通过http://localhost:7000来访问分析结果。</span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; line-height: 21px; "><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; font-size: 14px; ">&nbsp;&nbsp;&nbsp; 示例: $JAVA_HOME/bin/jhat -J-Xmx512m /home/longhao/dump.out<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; " /></span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; line-height: 21px; text-align: center; "><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; font-size: 14px; "><img alt="" height="500" src="http://farm6.static.flickr.com/5013/5573880930_5f758206f8.jpg" width="474" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; " /><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; " /></span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; line-height: 21px; "></p></div><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 9px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: arial, helvetica, sans-serif; line-height: 21px; background-color: #e6e6fa; height: 25px; width: 588px; font-size: 14px; color: #000000; "><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; font-size: 14px; "><strong style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; ">&nbsp;&nbsp;&nbsp;&nbsp; 3：Eclipse MemoryAnalyzer<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; " /></strong></span></p><div style="margin-top: 0px; margin-right: 0px; margin-bottom: 10px; margin-left: 6px; padding-left: 6px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; border-left-width: 2px; border-left-style: solid; border-left-color: #cccccc; "><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; line-height: 21px; "><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; font-size: 14px; ">&nbsp;&nbsp;&nbsp;<a href="http://www.eclipse.org/mat/" target="_blank" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; color: #0071bb; outline-style: none; outline-width: initial; outline-color: initial; text-decoration: none; ">&nbsp;Eclipse Memory Analyzer</a>是一个快速并且功能强大的Java heap分析器，能够帮助你查找内存泄漏和减少内存消耗。在File&gt;Acquire Heap Dump&gt;configure&gt;HPROF jmap dump provider设置一下分析应用的JDK，点击相关应用列表来生成heap dump并分析。<br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; " /></span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; line-height: 21px; text-align: center; "><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; font-size: 14px; ">&nbsp;&nbsp;&nbsp;&nbsp;<img alt="" src="http://farm6.static.flickr.com/5303/5573880998_98d2cd5d98.jpg" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; " /><br style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; " /></span></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; line-height: 21px; "></p></div><p style="margin-top: 0px; margin-right: 0px; margin-bottom: 0.8em; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; line-height: 21px; "><span style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font-family: 'Segoe UI', Calibri, 'Myriad Pro', Myriad, 'Trebuchet MS', Helvetica, Arial, sans-serif; font-size: 14px; ">&nbsp;&nbsp;&nbsp; 在socket，nio中的有些API中，申请的内存是直接向OS要的，在堆中分析内存是查看不到的，可以通过-XX:MaxDirectMemorySize=&lt;size&gt;来设置应用向OS直接申请的最大内存数。</span></p></div></span><img src ="http://www.blogjava.net/mlh123caoer/aggbug/360020.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mlh123caoer/" target="_blank">草儿</a> 2011-10-04 22:31 <a href="http://www.blogjava.net/mlh123caoer/archive/2011/10/04/360020.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java中Class.getResource用法</title><link>http://www.blogjava.net/mlh123caoer/archive/2009/09/29/296937.html</link><dc:creator>草儿</dc:creator><author>草儿</author><pubDate>Tue, 29 Sep 2009 11:43:00 GMT</pubDate><guid>http://www.blogjava.net/mlh123caoer/archive/2009/09/29/296937.html</guid><wfw:comment>http://www.blogjava.net/mlh123caoer/comments/296937.html</wfw:comment><comments>http://www.blogjava.net/mlh123caoer/archive/2009/09/29/296937.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mlh123caoer/comments/commentRss/296937.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mlh123caoer/services/trackbacks/296937.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 用JAVA获取文件，听似简单，但对于很多像我这样的新人来说，还是掌握颇浅，用起来感觉颇深，大常最经常用的，就是用JAVA的File类，如要取得 c:/test.txt文件，就会这样用File file = new File("c:/test.txt");这样用有什么问题，相信大家都知道，就是路径硬编码，对于JAVA精神来说，应用应该一次成型，到处可用，并且从现实应用来讲，最终生成的应用也会部署到W...&nbsp;&nbsp;<a href='http://www.blogjava.net/mlh123caoer/archive/2009/09/29/296937.html'>阅读全文</a><img src ="http://www.blogjava.net/mlh123caoer/aggbug/296937.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mlh123caoer/" target="_blank">草儿</a> 2009-09-29 19:43 <a href="http://www.blogjava.net/mlh123caoer/archive/2009/09/29/296937.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OOME错误抛出原因</title><link>http://www.blogjava.net/mlh123caoer/archive/2008/09/20/230104.html</link><dc:creator>草儿</dc:creator><author>草儿</author><pubDate>Sat, 20 Sep 2008 03:20:00 GMT</pubDate><guid>http://www.blogjava.net/mlh123caoer/archive/2008/09/20/230104.html</guid><wfw:comment>http://www.blogjava.net/mlh123caoer/comments/230104.html</wfw:comment><comments>http://www.blogjava.net/mlh123caoer/archive/2008/09/20/230104.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mlh123caoer/comments/commentRss/230104.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mlh123caoer/services/trackbacks/230104.html</trackback:ping><description><![CDATA[<span  style="border-collapse: collapse; color: #333333; font-family: verdana; font-size: 13px; line-height: 17px; ">
<div>OOME错误抛出原因（排列以发生的可能性为据）：</div>
<div>&#160;&#160;1. Java Heap中无法申请到足够的内存用于创建新的object，JVM会抛出OOME错误</div>
<div>&#160;&#160; &#160; &#160;根据异常发生的日志分析，有可能是因为POP3受信时，发生死锁，导致旧对象无法释</div>
<div>&#160;&#160; &#160; &#160;放，Java heap 内存超过最大分配内存，OOME抛出。</div>
<div>&#160;&#160; 2. Native memory JVM正常运行和 JNI调用第三方库时分配内存。Native内存会在JVM进程所</div>
<div>&#160;&#160; &#160; &#160;需要的内存向系统申请，如果JNI调用不能申请到内存就会抛出OOME错误。</div>
<div>&#160;&#160; 3. Process memory size 不够。这种可能性比较小。</div>
</span><img src ="http://www.blogjava.net/mlh123caoer/aggbug/230104.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mlh123caoer/" target="_blank">草儿</a> 2008-09-20 11:20 <a href="http://www.blogjava.net/mlh123caoer/archive/2008/09/20/230104.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java学习笔记 - 基础篇</title><link>http://www.blogjava.net/mlh123caoer/archive/2007/12/16/168109.html</link><dc:creator>草儿</dc:creator><author>草儿</author><pubDate>Sun, 16 Dec 2007 13:04:00 GMT</pubDate><guid>http://www.blogjava.net/mlh123caoer/archive/2007/12/16/168109.html</guid><wfw:comment>http://www.blogjava.net/mlh123caoer/comments/168109.html</wfw:comment><comments>http://www.blogjava.net/mlh123caoer/archive/2007/12/16/168109.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mlh123caoer/comments/commentRss/168109.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mlh123caoer/services/trackbacks/168109.html</trackback:ping><description><![CDATA[<div><strong>一、面向对象的编程概念</strong><strong></strong></div>
<div><strong></strong></div>
<div>观察现实对象两个性质：状态、行为。</div>
<div></div>
<div>面向对象的好处：模块化、隐藏信息。</div>
<div></div>
<div>继承：子类从父类（超类）继承状态和行为；子类可以改变父类的状态和行为。</div>
<div></div>
<div>接口：是无关对象用来进行彼此交互的设备；一个对象可以实现多个接口。</div>
<div></div>
<div></div>
<div><strong>二、语言基础</strong><strong></strong></div>
<div></div>
<div><strong>变量</strong><strong></strong></div>
<div>对象将它的状态存储在变量中；变量是一个由标识符命名的数据项。</div>
<div>声明变量的形式：&lt;类型&gt; &lt;名称&gt;</div>
<div></div>
<div><strong>JAVA</strong><strong>语言两大数据类型</strong><strong></strong></div>
<div>原始类型数据(基本数据类型)、引用类型。</div>
<div>原始类型数据是不能再分解的数据类型(8种：byte、short、int、long、float、double、char、boolean)，数据在作为函数参数是以&#8220;传值&#8221;方式工作的；</div>
<div></div>
<div><strong>整数</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte：1字节长的整数；8位有符号的二进制补码整数</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; short：短整数；16位有符号的二进制补码整数</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int：整数；32位有符号的二进制补码整数</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; long：长整数；64位有符号的二进制补码整数</div>
<div></div>
<div><strong>实数</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; flat：单精度浮点数；32位IEEE 754浮点数</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; double：双精度浮点数；64位IEEE 754浮点数</div>
<div></div>
<div><strong>其他类型</strong> char：单一Unicode字符；16位Unicode字符</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; boolean：布尔值(true或false)；8位/1位(8位空间，1位数据)</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</div>
<div>引用类型包括类(class)、接口(interface)、数组(array)。引用类型有时也称复合类型，它是可以分解为基本类型的数据类型，其数据在作为函数参数时是以&#8220;传址&#8221;的方式工作的。与原始类型相对，引用类型变量的值是对由此变量代表的一个值或一组值的引用(也就是地址)。</div>
<div></div>
<div><strong>如：</strong><strong></strong></div>
<div>原始类型 int a = 3; //&#8220;a&#8221;表示变量名称，&#8220;3&#8221;表示变量值；如果写成&#8220;final int a = 3;&#8221;，&#8220;final&#8221;表示不可改变值，所以这里的3(变量值)不可变</div>
<div>引用类型 Staing b = "Hello Java"; //&#8220;b&#8221;表示引用名称，&#8220;Hello Java&#8221;表示字浮串数组</div>
<div></div>
<div><strong>流程控制语句</strong><strong></strong></div>
<div>循环&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while、do - while、for</div>
<div>判断&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if - else、switch - case</div>
<div>异常处理 try &#8211; catch &#8211; finally、throw</div>
<div>分支&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break、continue、label :、return</div>
<div></div>
<div>循环：</div>
<div>while和do &#8211; while语句：While语句用于在条件保持为true时反复执行一个代码块；</div>
<div>do &#8211; while语句的代码块中的语句至少被执行一次。</div>
<div></div>
<div>for语句：</div>
<div>for语句提供一种迭代某个范围内的值的紧湊方式。</div>
<div></div>
<div>判断：</div>
<div>if &#8211; else 语句：if语句使程序能够根据某些条件有选择地执行其他语句；</div>
<div>switch语句用于根据一个整数表达式有条件的执行语句；</div>
<div>注意：必须要有明确的break语句，否则，流程控制将一个接一个的经过后面的case语句</div>
<div>比较if语句和switch语句(if语句可以用于根据某范围的值或条件进行判断;switch语句只用于根据单个整数值进行判断)。</div>
<div></div>
<div>异常处理语句：</div>
<div>当程序发生错误时，程序会抛出一个异常，程序的正常流程被中断；</div>
<div>分支语句：break、continue语句可以和标签语句一起使用，也可以没有标签；</div>
<div>标签是放在一个语句前的标识符，标识符后跟一个冒号；</div>
<div>continue 语句：continue语句用于跳过for、while、do &#8211; while循环的当前迭代；</div>
<div>return 语句：返回一个值；不返回值。</div>
<div></div>
<div></div>
<div><strong>三、对象基础和简单数据结构</strong><strong></strong></div>
<div><strong></strong></div>
<div>创建对象：声明一个变量来引用变量；对对象进行实例化(构造器)；</div>
<div>用new操作符和构造器从类创建对象。</div>
<div></div>
<div>两种方式使用一个对象：引用一个对象的变量；调用对象的方法。</div>
<div></div>
<div><strong>字符和字符串</strong><strong></strong></div>
<div>JAVA平台包含三个用于处理字符数据的类：</div>
<div>Character：包含单个字符值；定义了一些可用于操作和检查单字符数据的方法(Character类的对象实例包含单个字符值，可用Character对象替代基本类型char)。</div>
<div>String：这个类用于处理由多个字符组成的不可改变的数据。</div>
<div>StringBuffer：存储和操作由多个字符组成的可改变的数据。</div>
<div></div>
<div><strong>字符串和字符串缓冲区</strong><strong></strong></div>
<div>String：不能改变自身的值。</div>
<div>StringBuffer：用于将被修改的字符串。</div>
<div></div>
<div><strong>得到字符串或字符串缓冲区的长度</strong><strong></strong></div>
<div>length方法：返回字符串或字符串缓冲区中包含的字符数。</div>
<div>capacity方法：StringBuffer特有；返回分配给字符串缓冲区的空间量，而不是被使用的空间量。</div>
<div>String类没有capacity方法，因为字符串不能改变。</div>
<div></div>
<div><strong>通过索引从字符串或字符串缓冲区得到字符</strong><strong></strong></div>
<div>charAt(int)方法：得到字符串或字符串缓冲区某索引位置上的字符。</div>
<div>注意：第一个字符串的索引为0；最后一个字符的索引为length &#8211; 1；</div>
<div>subString(int), subString(int,int)：从字符串或字符串缓冲区中得到多个字符。</div>
<div></div>
<div><strong>在字符串中搜索字符或子字符串</strong><strong></strong></div>
<div>String类提供了两个访问器方法：indexOf 方法从字符串的开头向前搜索；lastIndexOf 方法从字符串的末尾向后搜索；</div>
<div>StringBuffer类不支持indexOf和lastIndexOf方法。</div>
<div></div>
<div><strong>操作字符串</strong><strong></strong></div>
<div>String类有几个方法看起来可以修改字符串。当然，字符串是不能被修改的，所以，这些方法实际上是创建并返回包含结果的另一个字符串。</div>
<div></div>
<div><strong>修改字符串缓冲</strong><strong></strong></div>
<div>字符串缓冲是可以修改的，StingBuffer提供了几个用于修改字符串缓冲区的数据的方法；</div>
<div>如果修改字符串缓冲区的操作造成字符串缓冲区的大小超出它的当前容量，那么字符串缓冲区会自动分配更多的内存。</div>
<div></div>
<div><strong>字符串和编译器</strong><strong></strong></div>
<div>编译器在很多地方自动的使用String和StringBuffer类来处理字符串直接值和字符串连接；</div>
<div>编译器为它遇到的每个字符串直接值自动创建一个新的String对象；</div>
<div>可以使用+操作符连接字符串。</div>
<div></div>
<div></div>
<div><strong>四、类和继承</strong><strong></strong></div>
<div><strong></strong></div>
<div><strong>实现继承：</strong>extends关键字</div>
<div></div>
<div><strong>为类提供构造器</strong><strong></strong></div>
<div>构造器用于初始化类的新对象：构造器不是方法，没有返回类型；构造器的声明中可以使用以下访问说明符：</div>
<div>&#8211;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private</div>
<div>&#8211;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protected</div>
<div>&#8211;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public</div>
<div>&#8211;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 无说明符</div>
<div></div>
<div><strong>将信息传递给方法或构造器</strong><strong></strong></div>
<div>参数类型；</div>
<div>参数名称；</div>
<div>按值传递：参数是原始类型，方法不能改变其值；参数是引用类型，方法不能改变其引用，但可以改变引用对象的值。</div>
<div></div>
<div><strong>从方法返回值</strong><strong></strong></div>
<div>在方法声明中声明方法的返回类型；eturn语句返回值的数据类型必须匹配方法声明的返回类型；方法可以返回原始类型，也可以返回引用类型。<strong></strong></div>
<div></div>
<div><strong>使用</strong><strong>this</strong><strong>关键字</strong><strong></strong></div>
<div>在实例方法或构造器中，this引用当前对象，也就是被调用的方法或构造器所属的对象；在构造器中，还可以使用this关键字调用相同类中的另一个构造器。</div>
<div></div>
<div><strong>控制对类成员的访问</strong><strong></strong></div>
<div>访问说明符决定其他类是否可以使用某个成员或调用某个方法。Java编程语言支持四种用于成员变量和方法的访问级别：private、protected、public和(如果没有指定)package。<strong></strong></div>
<div><strong>访问级别</strong><strong></strong></div>
<div>Private：类</div>
<div>无说明符：类、包</div>
<div>Protected：类、包、子类</div>
<div>Public：类、包、子类、所有类</div>
<div></div>
<div><strong>实例和类成员的初始化</strong><strong></strong></div>
<div>可以在声明的同时进行初始化，但是有一些限制：</div>
<div>&#8211;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 必须以一个赋值语句表达初始化方式</div>
<div>&#8211;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 初始化表达式不能调用任何被声明为抛出非运行时异常的方法</div>
<div>&#8211;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果初始化表达式调用一个抛出运行时异常的方法，那么它不能进行错误恢复</div>
<div>使用静态初始化块初始化类成员；</div>
<div>实例成员的初始化。</div>
<div><strong></strong></div>
<div><strong>覆盖和隐藏方法</strong><strong></strong></div>
<div>覆盖（override）（实例方法）：</div>
<div>&#8211;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 子类中的 个实例方法与超类中的实例方法具有相同的标记和返回类型</div>
<div>&#8211;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 方法的标记：名称，参数数量、参数类型</div>
<div>&#8211;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 覆盖方法可以具有不同的throws子句</div>
<div>&#8211;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 覆盖方法的访问说明符允许访问限制只能比被覆盖方法的多</div>
<div>&#8211;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 子类不能覆盖超类中声明为final的方法</div>
<div>&#8211;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 子类必须覆盖超类中声明为abstract的方法，否则子类本身必须是抽象的</div>
<div>覆盖和重载（overload）；</div>
<div>覆盖和隐藏（类方法）。</div>
<div></div>
<div><strong>隐藏成员变量</strong><strong></strong></div>
<div>在类中，如果一个成员变量与超类中的成员变量同名（即使它们的类型不同），那么它隐藏超类成员变量；</div>
<div>在子类中，不能通过简单名称引用超类中的成员变量，而是必须通过super访问它；</div>
<div>代码可读性差，不建议隐藏成员变量。</div>
<div></div>
<div><strong>使用</strong><strong>super</strong></div>
<div>使用super调用被覆盖的方法；使用super调用被隐藏的成员变量；使用super在构造器中调用超类的构造器。</div>
<div></div>
<div><strong>使用</strong><strong>Object</strong><strong>的后代</strong><strong></strong></div>
<div>每个类都是Object类的直接后代或间接后代；</div>
<div>Object类定义了所有类都必须有的基本状态和行为：</div>
<div>&#8211;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; clone</div>
<div>&#8211;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; equals和hashCode</div>
<div>&#8211;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; finalize</div>
<div>&#8211;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; toString</div>
<div>&#8211;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; getClass</div>
<div>&#8211;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; notify、notifyAll和wait</div>
<div></div>
<div><strong>编写</strong><strong>final</strong><strong>类和方法</strong><strong></strong></div>
<div>将类声明为final，即类不能被子类化：</div>
<div>&#8211;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 通过防止系统被改版来提高系统的安全性</div>
<div>&#8211;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 出于设计上的原因，某些类不需要子类</div>
<div>final方法：</div>
<div>&#8211;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在方法声明中使用final关键字表示这个方法不能被子类覆盖</div>
<div></div>
<div><strong>编写抽象类和方法</strong><strong></strong></div>
<div>抽象类：</div>
<div>&#8211;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 表示一个抽象的概念，不应该被实例化</div>
<div>&#8211;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; abstract关键字</div>
<div>抽象方法：</div>
<div>&#8211;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 没有实现的方法，允许子类提供这些方法的实现细节</div>
<div>&#8211;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果抽象类只包含抽象方法，那么它应该被定义成接口</div>
<div></div>
<div><strong>创建类的小结</strong><strong>&nbsp;&nbsp;&nbsp;&nbsp;</strong></div>
<div>类的定义有两个部分：</div>
<div>&#8211;&nbsp;&nbsp;&nbsp;&nbsp; 类声明</div>
<div>&#8211;&nbsp;&nbsp;&nbsp;&nbsp; 类体：成员变量、方法、构造器</div>
<div>访问说明符——控制对成员变量和方法的访问方式；</div>
<div>类变量、类方法，static方法关键字</div>
<div>实例成员、实例方法</div>
<div></div>
<div></div>
<div><strong>五、接口和包</strong><strong></strong></div>
<div><strong></strong></div>
<div><strong>实现接口：</strong>implements关键字</div>
<div></div>
<div>类可以实现多个接口,implements关键字后面跟以逗号分隔的接口列表；</div>
<div>如果有extends关键字,implements子句应该在extends子句的后面；</div>
<div>类要么必需实现接口及其超接口中的所有方法,要么类必须被声明为抽象的；</div>
<div>类中的方法标记(名称和参数列表)必须匹配接口中的方法标记。</div>
<div></div>
<div><strong>将接口作为类型使用</strong><strong></strong></div>
<div>在定义了一个新接口是,就是在定义一个新的引用数据类型；</div>
<div>定义可一用接口,实例化是必须用类。</div>
<div></div>
<div><strong>接口不能改变</strong><strong></strong></div>
<div>从语法的角度看,接口可以被改变；</div>
<div>从设计的角度看,一个已经在系统中被广泛使用的接口,不能轻易被改变；</div>
<div>如果改变了接口,实现原接口的类都将无法工作；</div>
<div>应该尽可能的考虑接口所提供的方法；</div>
<div>如果要改变接口,用继承的方式定义新的接口。</div>
<div></div>
<div><strong>接口小结</strong><strong></strong></div>
<div>接口定义了一种功能描述,定义了对象之间进行通讯的协议；</div>
<div>接口定义由接口声明和接口体组成；</div>
<div>接口包含一组方法的声明,但没有方法的实现；</div>
<div>实现接口的类必须实现接口中声明的所有方法；</div>
<div>接口名称可以作为数据类型使用。</div>
<div></div>
<div><strong>创建和使用包</strong><strong></strong></div>
<div>创建包：</div>
<div>&#8211;&nbsp;&nbsp;&nbsp;&nbsp; 将package语句作为类或接口源代码文件中的第一条语句</div>
<div>&#8211;&nbsp;&nbsp;&nbsp;&nbsp; 类或接口的源代码和类文件的路径名与包的名称相对应</div>
<div>使用另一个包中的接口或类：</div>
<div>&#8211;&nbsp;&nbsp;&nbsp;&nbsp; 类或接口的限定名</div>
<div>&#8211;&nbsp;&nbsp;&nbsp;&nbsp; 导入类或接口</div>
<div>&#8211;&nbsp;&nbsp;&nbsp;&nbsp; 导入类或接口所在的整个包</div>
<div></div>
<div><strong>六、使用异常处理错误</strong><strong></strong></div>
<div><strong></strong></div>
<div><strong>什么是异常</strong>：异常(exception)是在程序执行期间中断指令的正常流程的事件。</div>
<div></div>
<div><strong>try</strong><strong>块</strong><strong></strong></div>
<div>try {</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; statements</div>
<div>}</div>
<div>statements是包含一个或多个可能抛出异常的语句。</div>
<div></div>
<div><strong>catch</strong><strong>块</strong><strong></strong></div>
<div>每个catch块是一个异常处理器，它处理由其参数指定的异常类型</div>
<div>try{</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ......</div>
<div>} catch(ExceptionType name) {</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8230;&#8230;</div>
<div>} catch (ExceptionType name) {</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#8230;&#8230;</div>
<div>}</div>
<div></div>
<div><strong>finally</strong><strong>块</strong><strong></strong></div>
<div>finally块是可选的，它提供一种机制，其目的是无论try块中是否发生异常都确保进行清理工作；</div>
<div>无论是否发生异常，都会执行finally块中的代码。</div>
<div></div>
<div><strong>throw</strong><strong>语句</strong><strong></strong></div>
<div>throw语句需要一个参数：一个可抛出的（Throwable）对象；可抛出对象是Throwable类的子类。</div>
<div></div>
<div><strong>Throwable</strong><strong>类及其子类</strong><strong></strong></div>
<div>Throwable类有两个直接子类：</div>
<div>&#8211;&nbsp;&nbsp;&nbsp;&nbsp; Error</div>
<div>&#8211;&nbsp;&nbsp;&nbsp;&nbsp; Exception</div>
<div>Error：</div>
<div>&#8211;&nbsp;&nbsp;&nbsp;&nbsp; JAVA虚拟机的动态链接故障或其它&#8220;硬&#8221;故障，一般的程序不应该捕获Error，也不能抛出Error</div>
<div>Exception：</div>
<div>大多数程序抛出并捕获从Exception类派生的对象。Exception表示发生了一个问题，但并不是严重的系统问题。你写的多数程序将抛出并捕获Exception(而不是Error)。</div>
<div>&#8211;&nbsp;&nbsp;&nbsp;&nbsp; Exception表示发生了一个问题，但并不是严重的系统问题</div>
<div>&#8211;&nbsp;&nbsp;&nbsp;&nbsp; Exception的不同子类表示可能发生的各种异常</div>
<div></div>
<div><strong>异常的优点：</strong>将错误代码与&#8220;常规&#8221;代码分离；将错误沿调用堆栈向上传递；对错误类型进行分组和区分。</div>
<div></div>
<div><strong>异常的小结</strong><strong></strong></div>
<div>程序可以使用异常表明发生了错误；</div>
<div>程序可以使用throw语句抛出异常；</div>
<div>异常是一个对象（Throwable的子类）；</div>
<div>程序可以使用try、catch语句finally来捕获异常：</div>
<div>&#8211;&nbsp;&nbsp;&nbsp;&nbsp; try语句标识出可能发生的异常</div>
<div>&#8211;&nbsp;&nbsp;&nbsp;&nbsp; catch语句标识出异常处理器</div>
<div>&#8211;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; finally代码块不论抛出异常与否都会被执行，适用于清理工作</div>
<div></div>
<div></div>
<div><strong>七、线程：同时执行多个任务</strong><strong></strong></div>
<div><strong></strong></div>
<div><strong>只要用到线程就必须继承或接口：</strong><strong>Thread</strong><strong>。</strong><strong></strong></div>
<div><strong>只要用到线程就必须要用</strong><strong>run</strong><strong>方法。</strong><strong></strong></div>
<div><strong></strong></div>
<div><strong>什么是线程：</strong><strong></strong></div>
<div>&#8211;&nbsp;&nbsp;&nbsp;&nbsp; 线程是程序内的一个单一的顺序控制流程</div>
<div>&#8211;&nbsp;&nbsp;&nbsp;&nbsp; 线程本身不是程序，不能单独运行，它在一个程序内运行</div>
<div>&#8211;&nbsp;&nbsp;&nbsp;&nbsp; 多个线程可以同时运行，在一个程序内执行不同的任务</div>
<div></div>
<div><strong>定制线程的</strong><strong>run</strong><strong>方法</strong><strong></strong></div>
<div>run方法执行线程的工作；</div>
<div>run方法实现了线程的运行行为；</div>
<div>run方法可以做任何可以用语句实现的事。</div>
<div></div>
<div><strong>为线程提供</strong><strong>run</strong><strong>方法：</strong><strong></strong></div>
<div>&#8211;&nbsp;&nbsp;&nbsp;&nbsp; 继承Thread类，并覆盖run方法</div>
<div>&#8211;&nbsp;&nbsp;&nbsp;&nbsp; 实现Runnable接口</div>
<div></div>
<div><strong>对</strong><strong>Thread</strong><strong>类进行子类化和覆盖</strong><strong>run</strong></div>
<div>public class SimpleThread extends Thread {</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public SimpleThread(String str) {</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super(str);</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void run() {</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; 10; i++) {</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(i + " " + getName());</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sleep((long)(Math.random() * 1000));</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (InterruptedException e) {}</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("DONE! " + getName());</div>
<div>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</div>
<div>}</div>
<div></div>
<div><strong>实现</strong><strong>Runnable</strong><strong>接口：</strong>如果一个类已经继承了另一个类，那么要想实现线程就必须实现Runnable接口。</div>
<div></div>
<div>在线程中结果是随机产生的，如果想锁定对象就要使用Synchronized关键字意思为锁定方法所有在的对象。在对象被解锁前，其他线程不能调用相同对象上的被同步的方法。意思为执行一个对象后激活另一个对象，自身暂时睡眠，等待另一个对象执行完毕，在执行下一步，反复如此。</div>
<div><font face="Verdana"></font></div>
<div><font face="Verdana"><strong>八、IO：读和写</strong></font></div>
<div>
<p><font face="Verdana"><strong>如何使用管道流：</strong>管道用于将一个线程的输出连接到另一个线程的输入</font></p>
<p><font face="Verdana"><strong>如何封装流：</strong>流经常被以下的这种形式封装起来，以便组合许多流的各种功能</font></p>
<p><font face="Verdana"><strong>对象的串行化：</strong>Java.io包中的两个流——ObjectInputStream和ObjectOutputStream是字节流，他们的工作与其他输入和输出流类似。但他们的特殊之处在于它们可以读写对象。</font></p>
<p><font face="Verdana"><strong>对对象进行串行化：</strong>如果将一个不能串行化的对象传递给writeObject方法，那么它抛出一个NotSerializable Exception。对象只能在它的类实现了Serializable接口的情况下被串行化。</font></p>
<p><font face="Verdana"><strong>为类提供对象串行化：</strong>只有在对象的类实现了Serializable接口情况下，对象才是可串行化的。所有，如果想要对你的类的实例进串行化，这个类必须实现Serializable接口。Serializable接口是一个空接口，也就是说，他不包含任何方法声明；它的作用只是表明这个类的对象可以被串行化。</font></p>
<p><font face="Verdana"><strong>I/O复制小程序(Copy.java)，如下：</strong></font></p>
<p><font face="Verdana">import java.io.File;<br />
import java.io.FileReader;<br />
import java.io.FileWriter;<br />
import java.io.IOException;<br />
//以上是此程序用到的IO类的包，也可以用&#8220;import java.io.*&#8221;</font></p>
<p><font face="Verdana">public class Copy {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static void main(String[] args) throws IOException {<br />
File inputFile = new File("D:\\temp\\HelloWorld.java"); //目标文件路径，JAVA中路径地址只能用&#8220;\\&#8221;或&#8220;/&#8221;不能使用&#8220;\&#8221;<br />
File outputFile = new File("D:\\temp\\OutAgain.java"); //复制后新文件保存路径</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileReader in = new FileReader(inputFile);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FileWriter out = new FileWriter(outputFile);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int c;</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while ((c = in.read()) != -1) //一直循环到0表示已经复制完毕，所以这里使用不等于负1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.write(c);</font></p>
<p><font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; in.close(); //关闭读文件对象<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out.close(); //关闭写文件对象<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
</font></p>
</div><img src ="http://www.blogjava.net/mlh123caoer/aggbug/168109.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mlh123caoer/" target="_blank">草儿</a> 2007-12-16 21:04 <a href="http://www.blogjava.net/mlh123caoer/archive/2007/12/16/168109.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java 5|6 并发包介绍</title><link>http://www.blogjava.net/mlh123caoer/archive/2007/10/24/155474.html</link><dc:creator>草儿</dc:creator><author>草儿</author><pubDate>Wed, 24 Oct 2007 02:14:00 GMT</pubDate><guid>http://www.blogjava.net/mlh123caoer/archive/2007/10/24/155474.html</guid><wfw:comment>http://www.blogjava.net/mlh123caoer/comments/155474.html</wfw:comment><comments>http://www.blogjava.net/mlh123caoer/archive/2007/10/24/155474.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mlh123caoer/comments/commentRss/155474.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mlh123caoer/services/trackbacks/155474.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: java.util.concurrent 包含许多线程安全、测试良好、高性能的并发构建块。不客气地说，创建 java.util.concurrent 的目的就是要实现 Collection 框架对数据结构所执行的并发操作。通过提供一组可靠的、高性能并发构建块，开发人员可以提高并发类的线程安全、可伸缩性、性能、可读性和可靠性。如果一些类名看起来相似，可能是因为 java.util.concurr...&nbsp;&nbsp;<a href='http://www.blogjava.net/mlh123caoer/archive/2007/10/24/155474.html'>阅读全文</a><img src ="http://www.blogjava.net/mlh123caoer/aggbug/155474.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mlh123caoer/" target="_blank">草儿</a> 2007-10-24 10:14 <a href="http://www.blogjava.net/mlh123caoer/archive/2007/10/24/155474.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>1、堆排序的实现</title><link>http://www.blogjava.net/mlh123caoer/archive/2007/09/28/149091.html</link><dc:creator>草儿</dc:creator><author>草儿</author><pubDate>Fri, 28 Sep 2007 06:24:00 GMT</pubDate><guid>http://www.blogjava.net/mlh123caoer/archive/2007/09/28/149091.html</guid><wfw:comment>http://www.blogjava.net/mlh123caoer/comments/149091.html</wfw:comment><comments>http://www.blogjava.net/mlh123caoer/archive/2007/09/28/149091.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mlh123caoer/comments/commentRss/149091.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mlh123caoer/services/trackbacks/149091.html</trackback:ping><description><![CDATA[<div class="codeShade"><code><font color="#ffffff"></font><img alt="Heap sort" src="http://www.java2s.com/Code/JavaImages/Heap.PNG" border="0" /><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font></code></div>
<font color="#7f0055"><strong>import&nbsp;</strong></font><font color="#000000">java.io.IOException;</font><br />
<font color="#ffffff"></font><br />
<font color="#7f0055"><strong>class&nbsp;</strong></font><font color="#000000">MyNode&nbsp;</font><font color="#000000">{</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><strong>private&nbsp;</strong></font><font color="#7f0055"><strong>int&nbsp;</strong></font><font color="#000000">iData;&nbsp;</font><br />
<font color="#ffffff"></font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><strong>public&nbsp;</strong></font><font color="#000000">MyNode</font><font color="#000000">(</font><font color="#7f0055"><strong>int&nbsp;</strong></font><font color="#000000">key</font><font color="#000000">)&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">iData&nbsp;=&nbsp;key;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff"></font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><strong>public&nbsp;</strong></font><font color="#7f0055"><strong>int&nbsp;</strong></font><font color="#000000">getKey</font><font color="#000000">()&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><strong>return&nbsp;</strong></font><font color="#000000">iData;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff"></font><br />
<font color="#000000">}</font><br />
<font color="#ffffff"></font><br />
<font color="#7f0055"><strong>public&nbsp;class&nbsp;</strong></font><font color="#000000">Heap&nbsp;</font><font color="#000000">{</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><strong>private&nbsp;</strong></font><font color="#000000">MyNode</font><font color="#000000">[]&nbsp;</font><font color="#000000">heapArray;</font><br />
<font color="#ffffff"></font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><strong>private&nbsp;</strong></font><font color="#7f0055"><strong>int&nbsp;</strong></font><font color="#000000">maxSize;</font><br />
<font color="#ffffff"></font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><strong>private&nbsp;</strong></font><font color="#7f0055"><strong>int&nbsp;</strong></font><font color="#000000">currentSize;&nbsp;</font><font color="#3f7f5f">//&nbsp;number&nbsp;of&nbsp;items&nbsp;in&nbsp;array</font><br />
<font color="#ffffff"></font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><strong>public&nbsp;</strong></font><font color="#000000">Heap</font><font color="#000000">(</font><font color="#7f0055"><strong>int&nbsp;</strong></font><font color="#000000">mx</font><font color="#000000">)&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">maxSize&nbsp;=&nbsp;mx;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">currentSize&nbsp;=&nbsp;</font><font color="#990000">0</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">heapArray&nbsp;=&nbsp;</font><font color="#7f0055"><strong>new&nbsp;</strong></font><font color="#000000">MyNode</font><font color="#000000">[</font><font color="#000000">maxSize</font><font color="#000000">]</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff"></font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><strong>public&nbsp;</strong></font><font color="#000000">MyNode&nbsp;remove</font><font color="#000000">()&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#000000">{&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">MyNode&nbsp;root&nbsp;=&nbsp;heapArray</font><font color="#000000">[</font><font color="#990000">0</font><font color="#000000">]</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">heapArray</font><font color="#000000">[</font><font color="#990000">0</font><font color="#000000">]&nbsp;</font><font color="#000000">=&nbsp;heapArray</font><font color="#000000">[</font><font color="#000000">--currentSize</font><font color="#000000">]</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">trickleDown</font><font color="#000000">(</font><font color="#990000">0</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><strong>return&nbsp;</strong></font><font color="#000000">root;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff"></font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><strong>public&nbsp;</strong></font><font color="#7f0055"><strong>void&nbsp;</strong></font><font color="#000000">trickleDown</font><font color="#000000">(</font><font color="#7f0055"><strong>int&nbsp;</strong></font><font color="#000000">index</font><font color="#000000">)&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><strong>int&nbsp;</strong></font><font color="#000000">largerChild;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">MyNode&nbsp;top&nbsp;=&nbsp;heapArray</font><font color="#000000">[</font><font color="#000000">index</font><font color="#000000">]</font><font color="#000000">;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><strong>while&nbsp;</strong></font><font color="#000000">(</font><font color="#000000">index&nbsp;&lt;&nbsp;currentSize&nbsp;/&nbsp;</font><font color="#990000">2</font><font color="#000000">)</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><strong>int&nbsp;</strong></font><font color="#000000">leftChild&nbsp;=&nbsp;</font><font color="#990000">2&nbsp;</font><font color="#000000">*&nbsp;index&nbsp;+&nbsp;</font><font color="#990000">1</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><strong>int&nbsp;</strong></font><font color="#000000">rightChild&nbsp;=&nbsp;leftChild&nbsp;+&nbsp;</font><font color="#990000">1</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#3f7f5f">//&nbsp;找到最大的子节点</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><strong>if&nbsp;</strong></font><font color="#000000">(</font><font color="#000000">rightChild&nbsp;&lt;&nbsp;currentSize</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">&amp;&amp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">heapArray</font><font color="#000000">[</font><font color="#000000">leftChild</font><font color="#000000">]</font><font color="#000000">.getKey</font><font color="#000000">()&nbsp;</font><font color="#000000">&lt;&nbsp;heapArray</font><font color="#000000">[</font><font color="#000000">rightChild</font><font color="#000000">]</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">.getKey</font><font color="#000000">())</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">largerChild&nbsp;=&nbsp;rightChild;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><strong>else</strong></font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">largerChild&nbsp;=&nbsp;leftChild;</font><br />
<font color="#ffffff"></font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><strong>if&nbsp;</strong></font><font color="#000000">(</font><font color="#000000">top.getKey</font><font color="#000000">()&nbsp;</font><font color="#000000">&gt;=&nbsp;heapArray</font><font color="#000000">[</font><font color="#000000">largerChild</font><font color="#000000">]</font><font color="#000000">.getKey</font><font color="#000000">())</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><strong>break</strong></font><font color="#000000">;</font><br />
<font color="#ffffff"></font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">heapArray</font><font color="#000000">[</font><font color="#000000">index</font><font color="#000000">]&nbsp;</font><font color="#000000">=&nbsp;heapArray</font><font color="#000000">[</font><font color="#000000">largerChild</font><font color="#000000">]</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">index&nbsp;=&nbsp;largerChild;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">heapArray</font><font color="#000000">[</font><font color="#000000">index</font><font color="#000000">]&nbsp;</font><font color="#000000">=&nbsp;top;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff"></font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><strong>public&nbsp;</strong></font><font color="#7f0055"><strong>void&nbsp;</strong></font><font color="#000000">displayHeap</font><font color="#000000">()&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><strong>int&nbsp;</strong></font><font color="#000000">nBlanks&nbsp;=&nbsp;</font><font color="#990000">32</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><strong>int&nbsp;</strong></font><font color="#000000">itemsPerRow&nbsp;=&nbsp;</font><font color="#990000">1</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><strong>int&nbsp;</strong></font><font color="#000000">column&nbsp;=&nbsp;</font><font color="#990000">0</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><strong>int&nbsp;</strong></font><font color="#000000">currentIndex&nbsp;=&nbsp;</font><font color="#990000">0</font><font color="#000000">;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><strong>while&nbsp;</strong></font><font color="#000000">(</font><font color="#000000">currentSize&nbsp;&gt;&nbsp;</font><font color="#990000">0</font><font color="#000000">)</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><strong>if&nbsp;</strong></font><font color="#000000">(</font><font color="#000000">column&nbsp;==&nbsp;</font><font color="#990000">0</font><font color="#000000">)&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><strong>for&nbsp;</strong></font><font color="#000000">(</font><font color="#7f0055"><strong>int&nbsp;</strong></font><font color="#000000">k&nbsp;=&nbsp;</font><font color="#990000">0</font><font color="#000000">;&nbsp;k&nbsp;&lt;&nbsp;nBlanks;&nbsp;k++</font><font color="#000000">)</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">System.out.print</font><font color="#000000">(</font><font color="#990000">'&nbsp;'</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">System.out.print</font><font color="#000000">(</font><font color="#000000">heapArray</font><font color="#000000">[</font><font color="#000000">currentIndex</font><font color="#000000">]</font><font color="#000000">.getKey</font><font color="#000000">())</font><font color="#000000">;</font><br />
<font color="#ffffff"></font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><strong>if&nbsp;</strong></font><font color="#000000">(</font><font color="#000000">++currentIndex&nbsp;==&nbsp;currentSize</font><font color="#000000">)&nbsp;</font><font color="#3f7f5f">//&nbsp; 判断是否输出结束</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><strong>break</strong></font><font color="#000000">;</font><br />
<font color="#ffffff"></font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><strong>if&nbsp;</strong></font><font color="#000000">(</font><font color="#000000">++column&nbsp;==&nbsp;itemsPerRow</font><font color="#000000">)&nbsp;</font><font color="#3f7f5f">//&nbsp;是否到达行尾?</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">nBlanks&nbsp;/=&nbsp;</font><font color="#990000">2</font><font color="#000000">;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">itemsPerRow&nbsp;*=&nbsp;</font><font color="#990000">2</font><font color="#000000">;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">column&nbsp;=&nbsp;</font><font color="#990000">0</font><font color="#000000">;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">System.out.println</font><font color="#000000">()</font><font color="#000000">;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}&nbsp;</font><font color="#7f0055"><strong>else</strong></font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><strong>for&nbsp;</strong></font><font color="#000000">(</font><font color="#7f0055"><strong>int&nbsp;</strong></font><font color="#000000">k&nbsp;=&nbsp;</font><font color="#990000">0</font><font color="#000000">;&nbsp;k&nbsp;&lt;&nbsp;nBlanks&nbsp;*&nbsp;</font><font color="#990000">2&nbsp;</font><font color="#000000">-&nbsp;</font><font color="#990000">2</font><font color="#000000">;&nbsp;k++</font><font color="#000000">)</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">System.out.print</font><font color="#000000">(</font><font color="#990000">'&nbsp;'</font><font color="#000000">)</font><font color="#000000">;&nbsp;</font><font color="#3f7f5f">//&nbsp;输入空白</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff"></font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><strong>public&nbsp;</strong></font><font color="#7f0055"><strong>void&nbsp;</strong></font><font color="#000000">displayArray</font><font color="#000000">()&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><strong>for&nbsp;</strong></font><font color="#000000">(</font><font color="#7f0055"><strong>int&nbsp;</strong></font><font color="#000000">j&nbsp;=&nbsp;</font><font color="#990000">0</font><font color="#000000">;&nbsp;j&nbsp;&lt;&nbsp;maxSize;&nbsp;j++</font><font color="#000000">)</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">System.out.print</font><font color="#000000">(</font><font color="#000000">heapArray</font><font color="#000000">[</font><font color="#000000">j</font><font color="#000000">]</font><font color="#000000">.getKey</font><font color="#000000">()&nbsp;</font><font color="#000000">+&nbsp;</font><font color="#2a00ff">"&nbsp;"</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">System.out.println</font><font color="#000000">(</font><font color="#2a00ff">""</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff"></font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><strong>public&nbsp;</strong></font><font color="#7f0055"><strong>void&nbsp;</strong></font><font color="#000000">insertAt</font><font color="#000000">(</font><font color="#7f0055"><strong>int&nbsp;</strong></font><font color="#000000">index,&nbsp;MyNode&nbsp;newNode</font><font color="#000000">)&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">heapArray</font><font color="#000000">[</font><font color="#000000">index</font><font color="#000000">]&nbsp;</font><font color="#000000">=&nbsp;newNode;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff"></font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><strong>public&nbsp;</strong></font><font color="#7f0055"><strong>void&nbsp;</strong></font><font color="#000000">incrementSize</font><font color="#000000">()&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">currentSize++;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff"></font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><strong>public&nbsp;static&nbsp;</strong></font><font color="#7f0055"><strong>void&nbsp;</strong></font><font color="#000000">main</font><font color="#000000">(</font><font color="#000000">String</font><font color="#000000">[]&nbsp;</font><font color="#000000">args</font><font color="#000000">)&nbsp;</font><font color="#7f0055"><strong>throws&nbsp;</strong></font><font color="#000000">IOException&nbsp;</font><font color="#000000">{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><strong>int&nbsp;</strong></font><font color="#000000">size,&nbsp;i;</font><br />
<font color="#ffffff"></font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">size&nbsp;=&nbsp;</font><font color="#990000">100</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">Heap&nbsp;theHeap&nbsp;=&nbsp;</font><font color="#7f0055"><strong>new&nbsp;</strong></font><font color="#000000">Heap</font><font color="#000000">(</font><font color="#000000">size</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff"></font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><strong>for&nbsp;</strong></font><font color="#000000">(</font><font color="#000000">i&nbsp;=&nbsp;</font><font color="#990000">0</font><font color="#000000">;&nbsp;i&nbsp;&lt;&nbsp;size;&nbsp;i++</font><font color="#000000">)&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><strong>int&nbsp;</strong></font><font color="#000000">random&nbsp;=&nbsp;</font><font color="#000000">(</font><font color="#7f0055"><strong>int</strong></font><font color="#000000">)&nbsp;(</font><font color="#000000">java.lang.Math.random</font><font color="#000000">()&nbsp;</font><font color="#000000">*&nbsp;</font><font color="#990000">100</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">MyNode&nbsp;newNode&nbsp;=&nbsp;</font><font color="#7f0055"><strong>new&nbsp;</strong></font><font color="#000000">MyNode</font><font color="#000000">(</font><font color="#000000">random</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">theHeap.insertAt</font><font color="#000000">(</font><font color="#000000">i,&nbsp;newNode</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">theHeap.incrementSize</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff"></font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">System.out.print</font><font color="#000000">(</font><font color="#2a00ff">"Random:&nbsp;"</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">theHeap.displayArray</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><strong>for&nbsp;</strong></font><font color="#000000">(</font><font color="#000000">i&nbsp;=&nbsp;size&nbsp;/&nbsp;</font><font color="#990000">2&nbsp;</font><font color="#000000">-&nbsp;</font><font color="#990000">1</font><font color="#000000">;&nbsp;i&nbsp;&gt;=&nbsp;</font><font color="#990000">0</font><font color="#000000">;&nbsp;i--</font><font color="#000000">)</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">theHeap.trickleDown</font><font color="#000000">(</font><font color="#000000">i</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff"></font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">System.out.print</font><font color="#000000">(</font><font color="#2a00ff">"Heap:&nbsp;&nbsp;&nbsp;"</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">theHeap.displayArray</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">theHeap.displayHeap</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><strong>for&nbsp;</strong></font><font color="#000000">(</font><font color="#000000">i&nbsp;=&nbsp;size&nbsp;-&nbsp;</font><font color="#990000">1</font><font color="#000000">;&nbsp;i&nbsp;&gt;=&nbsp;</font><font color="#990000">0</font><font color="#000000">;&nbsp;i--</font><font color="#000000">)&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">MyNode&nbsp;biggestNode&nbsp;=&nbsp;theHeap.remove</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">theHeap.insertAt</font><font color="#000000">(</font><font color="#000000">i,&nbsp;biggestNode</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">System.out.print</font><font color="#000000">(</font><font color="#2a00ff">"Sorted:&nbsp;"</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">theHeap.displayArray</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#000000">}</font><br />
<font color="#ffffff"></font><br /><img src ="http://www.blogjava.net/mlh123caoer/aggbug/149091.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mlh123caoer/" target="_blank">草儿</a> 2007-09-28 14:24 <a href="http://www.blogjava.net/mlh123caoer/archive/2007/09/28/149091.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DB连接池管理编程举例</title><link>http://www.blogjava.net/mlh123caoer/archive/2007/09/28/149082.html</link><dc:creator>草儿</dc:creator><author>草儿</author><pubDate>Fri, 28 Sep 2007 06:10:00 GMT</pubDate><guid>http://www.blogjava.net/mlh123caoer/archive/2007/09/28/149082.html</guid><wfw:comment>http://www.blogjava.net/mlh123caoer/comments/149082.html</wfw:comment><comments>http://www.blogjava.net/mlh123caoer/archive/2007/09/28/149082.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/mlh123caoer/comments/commentRss/149082.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mlh123caoer/services/trackbacks/149082.html</trackback:ping><description><![CDATA[<div class="codeShade"><code><font color="#ffffff"></font><br />
<font color="#7f0055"><strong>import&nbsp;</strong></font><font color="#000000">java.sql.Connection;</font><br />
<font color="#7f0055"><strong>import&nbsp;</strong></font><font color="#000000">java.sql.ResultSet;</font><br />
<font color="#7f0055"><strong>import&nbsp;</strong></font><font color="#000000">java.sql.SQLException;</font><br />
<font color="#7f0055"><strong>import&nbsp;</strong></font><font color="#000000">java.sql.Statement;</font><br />
<font color="#7f0055"><strong>import&nbsp;</strong></font><font color="#000000">java.util.Properties;</font><br />
<font color="#ffffff"></font><br />
<font color="#7f0055"><strong>import&nbsp;</strong></font><font color="#000000">javax.naming.Context;</font><br />
<font color="#7f0055"><strong>import&nbsp;</strong></font><font color="#000000">javax.naming.InitialContext;</font><br />
<font color="#7f0055"><strong>import&nbsp;</strong></font><font color="#000000">javax.naming.NamingException;</font><br />
<font color="#7f0055"><strong>import&nbsp;</strong></font><font color="#000000">javax.sql.ConnectionPoolDataSource;</font><br />
<font color="#7f0055"><strong>import&nbsp;</strong></font><font color="#000000">javax.sql.PooledConnection;</font><br />
<font color="#ffffff"></font><br />
<font color="#7f0055"><strong>public&nbsp;class&nbsp;</strong></font><font color="#000000">MainClass&nbsp;</font><font color="#000000">{</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><strong>public&nbsp;static&nbsp;</strong></font><font color="#7f0055"><strong>void&nbsp;</strong></font><font color="#000000">main</font><font color="#000000">(</font><font color="#000000">String</font><font color="#000000">[]&nbsp;</font><font color="#000000">args</font><font color="#000000">)&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">Connection&nbsp;connection&nbsp;=&nbsp;</font><font color="#7f0055"><strong>null</strong></font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">Statement&nbsp;statement&nbsp;=&nbsp;</font><font color="#7f0055"><strong>null</strong></font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">ResultSet&nbsp;resultSet&nbsp;=&nbsp;</font><font color="#7f0055"><strong>null</strong></font><font color="#000000">;</font><br />
<font color="#ffffff"></font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><strong>try&nbsp;</strong></font><font color="#000000">{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">connection&nbsp;=&nbsp;getConnection</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#3f7f5f">//&nbsp;操作连接</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">statement&nbsp;=&nbsp;connection.createStatement</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">String&nbsp;selectEmployeesSQL&nbsp;=&nbsp;</font><font color="#2a00ff">"SELECT&nbsp;*&nbsp;FROM&nbsp;employees"</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">resultSet&nbsp;=&nbsp;statement.executeQuery</font><font color="#000000">(</font><font color="#000000">selectEmployeesSQL</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff"></font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><strong>while&nbsp;</strong></font><font color="#000000">(</font><font color="#000000">resultSet.next</font><font color="#000000">())&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">printEmployee</font><font color="#000000">(</font><font color="#000000">resultSet</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}&nbsp;</font><font color="#7f0055"><strong>catch&nbsp;</strong></font><font color="#000000">(</font><font color="#000000">Exception&nbsp;e</font><font color="#000000">)&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">e.printStackTrace</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}&nbsp;</font><font color="#7f0055"><strong>finally&nbsp;</strong></font><font color="#000000">{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><strong>if&nbsp;</strong></font><font color="#000000">(</font><font color="#000000">resultSet&nbsp;!=&nbsp;</font><font color="#7f0055"><strong>null</strong></font><font color="#000000">)&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><strong>try&nbsp;</strong></font><font color="#000000">{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">resultSet.close</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}&nbsp;</font><font color="#7f0055"><strong>catch&nbsp;</strong></font><font color="#000000">(</font><font color="#000000">SQLException&nbsp;e</font><font color="#000000">)&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}&nbsp;</font><font color="#3f7f5f">//&nbsp;nothing&nbsp;we&nbsp;can&nbsp;do</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><strong>if&nbsp;</strong></font><font color="#000000">(</font><font color="#000000">statement&nbsp;!=&nbsp;</font><font color="#7f0055"><strong>null</strong></font><font color="#000000">)&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><strong>try&nbsp;</strong></font><font color="#000000">{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">statement.close</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}&nbsp;</font><font color="#7f0055"><strong>catch&nbsp;</strong></font><font color="#000000">(</font><font color="#000000">SQLException&nbsp;e</font><font color="#000000">)&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}&nbsp;</font><font color="#3f7f5f">//&nbsp;nothing&nbsp;we&nbsp;can&nbsp;do</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><strong>if&nbsp;</strong></font><font color="#000000">(</font><font color="#000000">connection&nbsp;!=&nbsp;</font><font color="#7f0055"><strong>null</strong></font><font color="#000000">)&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><strong>try&nbsp;</strong></font><font color="#000000">{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">connection.close</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}&nbsp;</font><font color="#7f0055"><strong>catch&nbsp;</strong></font><font color="#000000">(</font><font color="#000000">SQLException&nbsp;e</font><font color="#000000">)&nbsp;{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}&nbsp;</font><font color="#3f7f5f">//&nbsp;nothing&nbsp;we&nbsp;can&nbsp;do</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff"></font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><strong>private&nbsp;static&nbsp;</strong></font><font color="#000000">Connection&nbsp;getConnection</font><font color="#000000">()&nbsp;</font><font color="#7f0055"><strong>throws&nbsp;</strong></font><font color="#000000">NamingException,&nbsp;SQLException&nbsp;</font><font color="#000000">{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">InitialContext&nbsp;initCtx&nbsp;=&nbsp;createContext</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">String&nbsp;jndiName&nbsp;=&nbsp;</font><font color="#2a00ff">"HrDS"</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">ConnectionPoolDataSource&nbsp;dataSource&nbsp;=&nbsp;</font><font color="#000000">(</font><font color="#000000">ConnectionPoolDataSource</font><font color="#000000">)&nbsp;</font><font color="#000000">initCtx.lookup</font><font color="#000000">(</font><font color="#000000">jndiName</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">PooledConnection&nbsp;pooledConnection&nbsp;=&nbsp;dataSource.getPooledConnection</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><strong>return&nbsp;</strong></font><font color="#000000">pooledConnection.getConnection</font><font color="#000000">()</font><font color="#000000">;&nbsp;</font><font color="#3f7f5f">//&nbsp;从池中得到连接</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff"></font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><strong>private&nbsp;static&nbsp;</strong></font><font color="#000000">InitialContext&nbsp;createContext</font><font color="#000000">()&nbsp;</font><font color="#7f0055"><strong>throws&nbsp;</strong></font><font color="#000000">NamingException&nbsp;</font><font color="#000000">{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">Properties&nbsp;env&nbsp;=&nbsp;</font><font color="#7f0055"><strong>new&nbsp;</strong></font><font color="#000000">Properties</font><font color="#000000">()</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">env.put</font><font color="#000000">(</font><font color="#000000">Context.INITIAL_CONTEXT_FACTORY,&nbsp;</font><font color="#2a00ff">"com.sun.jndi.rmi.registry.RegistryContextFactory"</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">env.put</font><font color="#000000">(</font><font color="#000000">Context.PROVIDER_URL,&nbsp;</font><font color="#2a00ff">"rmi://localhost:1099"</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">InitialContext&nbsp;context&nbsp;=&nbsp;</font><font color="#7f0055"><strong>new&nbsp;</strong></font><font color="#000000">InitialContext</font><font color="#000000">(</font><font color="#000000">env</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#7f0055"><strong>return&nbsp;</strong></font><font color="#000000">context;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff"></font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#7f0055"><strong>private&nbsp;static&nbsp;</strong></font><font color="#7f0055"><strong>void&nbsp;</strong></font><font color="#000000">printEmployee</font><font color="#000000">(</font><font color="#000000">ResultSet&nbsp;resultSet</font><font color="#000000">)&nbsp;</font><font color="#7f0055"><strong>throws&nbsp;</strong></font><font color="#000000">SQLException&nbsp;</font><font color="#000000">{</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">System.out.print</font><font color="#000000">(</font><font color="#000000">resultSet.getInt</font><font color="#000000">(</font><font color="#2a00ff">"employee_id"</font><font color="#000000">)</font><font color="#000000">+</font><font color="#2a00ff">",&nbsp;"</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">System.out.print</font><font color="#000000">(</font><font color="#000000">resultSet.getString</font><font color="#000000">(</font><font color="#2a00ff">"last_name"</font><font color="#000000">)</font><font color="#000000">+</font><font color="#2a00ff">",&nbsp;"</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">System.out.print</font><font color="#000000">(</font><font color="#000000">resultSet.getString</font><font color="#000000">(</font><font color="#2a00ff">"first_name"</font><font color="#000000">)</font><font color="#000000">+</font><font color="#2a00ff">",&nbsp;"</font><font color="#000000">)</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;</font><font color="#000000">System.out.println</font><font color="#000000">(</font><font color="#000000">resultSet.getString</font><font color="#000000">(</font><font color="#2a00ff">"email"</font><font color="#000000">))</font><font color="#000000">;</font><br />
<font color="#ffffff">&nbsp;&nbsp;</font><font color="#000000">}</font><br />
<font color="#ffffff"></font><br />
<font color="#000000">}</font><br />
<font color="#ffffff"></font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><br />
<font color="#ffffff">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font></code></div><img src ="http://www.blogjava.net/mlh123caoer/aggbug/149082.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mlh123caoer/" target="_blank">草儿</a> 2007-09-28 14:10 <a href="http://www.blogjava.net/mlh123caoer/archive/2007/09/28/149082.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java中如何重设数组的大小？</title><link>http://www.blogjava.net/mlh123caoer/archive/2007/09/19/146367.html</link><dc:creator>草儿</dc:creator><author>草儿</author><pubDate>Wed, 19 Sep 2007 02:34:00 GMT</pubDate><guid>http://www.blogjava.net/mlh123caoer/archive/2007/09/19/146367.html</guid><wfw:comment>http://www.blogjava.net/mlh123caoer/comments/146367.html</wfw:comment><comments>http://www.blogjava.net/mlh123caoer/archive/2007/09/19/146367.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/mlh123caoer/comments/commentRss/146367.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mlh123caoer/services/trackbacks/146367.html</trackback:ping><description><![CDATA[在Java中，数组不能动态重设大小。一个可替代方法是使用<a href="http://java.sun.com/j2se/1.4.2/docs/api/java/util/ArrayList.html" goog_ds_charindex="31">java.util.ArrayList</a> (或者<a href="http://java.sun.com/j2se/1.4/docs/api/java/util/Vector.html" goog_ds_charindex="56">java.util.Vector</a>)代替使用原始数组（array）。另一种解决方案是用一个不同大小的数组重设数组，将旧数组内容拷贝到新的数组。下面做了个演示程序实现第二种方案，编写了个通用函数r<em goog_ds_charindex="154">sizeArray</em> (参数)来实现此功能： <br />
<br />
<pre goog_ds_charindex="181">/**<br goog_ds_charindex="185" />
* 使用一个新大小重设数组，并拷贝旧数组的内容到新数组<br goog_ds_charindex="249" />
* @param oldArray  旧数组被重设<br goog_ds_charindex="339" />
* @param newSize   新数组大小<br goog_ds_charindex="378" />
* @return          返回带同样内容的新数组<br goog_ds_charindex="433" />
*/<br goog_ds_charindex="436" />
private static Object resizeArray (Object oldArray, int newSize){<br goog_ds_charindex="503" />
int oldSize = java.lang.reflect.Array.getLength(oldArray);<br goog_ds_charindex="565" />
Class elementType = oldArray.getClass().getComponentType();<br goog_ds_charindex="628" />
Object newArray = java.lang.reflect.Array.newInstance(<br goog_ds_charindex="686" />
elementType,newSize);<br goog_ds_charindex="717" />
int preserveLength = Math.min(oldSize,newSize);<br goog_ds_charindex="768" />
if (preserveLength &gt; 0)<br goog_ds_charindex="795" />
System.arraycopy (oldArray,0,newArray,0,preserveLength);<br goog_ds_charindex="858" />
return newArray; <br />
}</pre>
<pre goog_ds_charindex="884">// resizeArray()测试用例<br />
public static void main (String[] args) {<br goog_ds_charindex="961" />
int[] a = {1,2,3};<br goog_ds_charindex="983" />
a = (int[])resizeArray(a,5);<br goog_ds_charindex="1015" />
a[3] = 4;<br goog_ds_charindex="1028" />
a[4] = 5;<br goog_ds_charindex="1041" />
for (int i=0; i&lt;a.length; i++)<br goog_ds_charindex="1075" />
System.out.println (a[i]); }</pre>
<br goog_ds_charindex="1111" />
<p goog_ds_charindex="1113"><strong goog_ds_charindex="1114">那二维数组如何重设大小呢？ 很简单，就是处理数组的数组呀！</strong></p>
<p goog_ds_charindex="1155">要想重设二维数组，<em>resizeArray方法</em>必须处理外部数组和所有嵌套数组，如下例： </p>
<pre goog_ds_charindex="1346">  int a[][] = new int[2][3];<br goog_ds_charindex="1375" />
//...<br goog_ds_charindex="1383" />
a = (int[][])resizeArray(a,20);<br goog_ds_charindex="1417" />
// 新数组是[20][3]<br goog_ds_charindex="1445" />
for (int i=0; i&lt;a.length; i++) {<br goog_ds_charindex="1480" />
if (a[i] == null)<br goog_ds_charindex="1503" />
a[i] = new int[30];<br goog_ds_charindex="1531" />
else a[i] = (int[])resizeArray(a[i],30); <br />
}<br goog_ds_charindex="1580" />
// 新数组是[20][30]</pre><img src ="http://www.blogjava.net/mlh123caoer/aggbug/146367.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mlh123caoer/" target="_blank">草儿</a> 2007-09-19 10:34 <a href="http://www.blogjava.net/mlh123caoer/archive/2007/09/19/146367.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>常去的几个外国技术门户</title><link>http://www.blogjava.net/mlh123caoer/archive/2007/09/15/145394.html</link><dc:creator>草儿</dc:creator><author>草儿</author><pubDate>Sat, 15 Sep 2007 09:56:00 GMT</pubDate><guid>http://www.blogjava.net/mlh123caoer/archive/2007/09/15/145394.html</guid><wfw:comment>http://www.blogjava.net/mlh123caoer/comments/145394.html</wfw:comment><comments>http://www.blogjava.net/mlh123caoer/archive/2007/09/15/145394.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/mlh123caoer/comments/commentRss/145394.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mlh123caoer/services/trackbacks/145394.html</trackback:ping><description><![CDATA[http://www.infoq.com<br />
http://www.theserverside.com<br />
http://www.javablogs.com<br />
http://www.java.net<br />
http://www.javasoft.com<br />
http://blogs.sun.com <br />
&nbsp;&nbsp; 之（重要）<br />
&nbsp;&nbsp; http://blogs.sun.com/roumen/<br />
&nbsp;&nbsp; http://blogs.sun.com/geertjan/<br />
&nbsp;&nbsp; http://blogs.sun.com/theaquarium/<br />
http://www.ibm.com/developerworks<br />
http://www.onjava.com/<br />
http://www.developer.com/java/<br />
http://www.javaworld.com/<br />
http://www.java.com/<br />
http://www.netbeans.org/kb/index.html<br />
http://www.eclipse.org<br />
http://www.oracle.com/technology/tech/java/index.html<br />
http://www.javaranch.com<br />
http://www.javablackbelt.com<br />
http://www.jugcologne.org<br />
http://www.dzone.com<br /><img src ="http://www.blogjava.net/mlh123caoer/aggbug/145394.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mlh123caoer/" target="_blank">草儿</a> 2007-09-15 17:56 <a href="http://www.blogjava.net/mlh123caoer/archive/2007/09/15/145394.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java Annotation手册</title><link>http://www.blogjava.net/mlh123caoer/archive/2007/09/06/143260.html</link><dc:creator>草儿</dc:creator><author>草儿</author><pubDate>Thu, 06 Sep 2007 11:11:00 GMT</pubDate><guid>http://www.blogjava.net/mlh123caoer/archive/2007/09/06/143260.html</guid><wfw:comment>http://www.blogjava.net/mlh123caoer/comments/143260.html</wfw:comment><comments>http://www.blogjava.net/mlh123caoer/archive/2007/09/06/143260.html#Feedback</comments><slash:comments>13</slash:comments><wfw:commentRss>http://www.blogjava.net/mlh123caoer/comments/commentRss/143260.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mlh123caoer/services/trackbacks/143260.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: <br>Annotation 提供了一条与程序元素关联任何信息或者任何元数据（metadata）的途径。从某些方面看，annotation就像修饰符一样被使用，并应用于包、类型、构造方法、方法、成员变量、参数、本地变量的声明中。这些信息被存储在annotation的“name=value”结构对中。 annotation类型是一种接口，能够通过java反射API的方式提供对其信息的访问。<br>&nbsp;&nbsp;<a href='http://www.blogjava.net/mlh123caoer/archive/2007/09/06/143260.html'>阅读全文</a><img src ="http://www.blogjava.net/mlh123caoer/aggbug/143260.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mlh123caoer/" target="_blank">草儿</a> 2007-09-06 19:11 <a href="http://www.blogjava.net/mlh123caoer/archive/2007/09/06/143260.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>什么是JMX?</title><link>http://www.blogjava.net/mlh123caoer/archive/2007/09/03/142456.html</link><dc:creator>草儿</dc:creator><author>草儿</author><pubDate>Mon, 03 Sep 2007 14:26:00 GMT</pubDate><guid>http://www.blogjava.net/mlh123caoer/archive/2007/09/03/142456.html</guid><wfw:comment>http://www.blogjava.net/mlh123caoer/comments/142456.html</wfw:comment><comments>http://www.blogjava.net/mlh123caoer/archive/2007/09/03/142456.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/mlh123caoer/comments/commentRss/142456.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mlh123caoer/services/trackbacks/142456.html</trackback:ping><description><![CDATA[<p>JMX(Java Management Extensions)是一个为应用程序植入管理功能的框架。JMX是一套标准的代理和服务，实际上，用户可以在任何Java应用程序中使用这些代理和服务实现管理。 </p>
<p>JMX的前身是<a class="editpage" title="Create 'JMAPI'" href="http://wiki.matrix.org.cn/Edit.jsp?page=JMAPI">JMAPI</a>。 </p>
<p>JMX致力于解决分布式系统管理的问题，因此，能够适合于各种不同的环境是非常重要的。为了能够利用功能强大的Java计算环境解决这一的问题，Sun公司扩充了<a class="wikipage" href="http://wiki.matrix.org.cn/Wiki.jsp?page=Java">Java</a>基础类库，开发了专用的管理类库。 </p>
<p>JMX是一种应用编程接口，可扩充对象和方法的集合体，可以用于跨越一系列不同的异构操作系统平台、系统体系结构和网络传输协议，灵活的开发无缝集成的系统、网络和服务管理应用它提供了用户界面指导、Java类和开发集成系统、网络及网络管理应用的规范。 </p>
<p>管理对象是JMX应用程序的核心。JMX结构包括：支持Java的Web浏览器用户接口，管理运行模块ARM(Admin Runtime Module)和应用。这三个部件之间通过<a class="wikipage" href="http://wiki.matrix.org.cn/Wiki.jsp?page=RMI">RMI</a>（Remote Method Invocation）进行通信。这里需要说明的是，RMI是使得一个Java虚拟机（JVM）上运行的程序可以调用远程服务器上另一个<a class="wikipage" href="http://wiki.matrix.org.cn/Wiki.jsp?page=JVM">JVM</a>总的对象。 </p>
<p>用户接口用来发布管理操作，这些操作可以间接的通过浏览器或通过单独的应用程序来激发。管理运行模块用来给应用提供实例化的管理对象。它包括<a class="editpage" title="Create 'Agent'" href="http://wiki.matrix.org.cn/Edit.jsp?page=Agent">Agent</a>对象接口，通知接口和被管数据接口。应用指的是那些被管设备单元。 </p>
<p>JMX是一个完整的网络管理应用程序开发环境，它同时提供了：厂商需要收集的完整的特性清单，可生成资源清单表格，图形化的用户接口；访问<a class="editpage" title="Create 'SNMP'" href="http://wiki.matrix.org.cn/Edit.jsp?page=SNMP">SNMP</a>的网络API；主机间远程过程调用；数据库访问方法。 </p>
<p>JMX这一轻型的管理基础结构，价值在于对被管理资源的服务实现了抽象，提供了低层的基本类集合，开发人员在保证大多数的公共管理类的完整性和一致性的前提下，进行扩展以满足特定网络管理应用的需要。 </p>
<p>JMX注重于构造管理工具的软件框架，并尽量采用已成熟的技术。 </p>
<p>JMX体系被分成三个层次 </p>
<ul>
    <li>表现层
    <li>代理层
    <li>分布式服务层 </li>
</ul>
<h2 id="section-JMX-_E8_A1_A8_E7_8E_B0_E5_B1_82">表现层 </h2>
<p>表现层定义的是JMX可管理资源所在的层。 </p>
<p>这些已管理的资源可以编写或封装为<a class="editpage" title="Create 'MBean'" href="http://wiki.matrix.org.cn/Edit.jsp?page=MBean">MBean</a>。 </p>
<p>MBean分为四种类型： 标准、动态、开放、模型 </p>
<h2 id="section-JMX-_E4_BB_A3_E7_90_86_E5_B1_82">代理层 </h2>
<p>定义的是MBean向应用程序施加管理的层。包括MBean服务器和代理服务的定义。还至少包括一个协议适配器或连接器。 </p>
<p>代理的组成： 。一个MBean服务器 。要管理的MBean 。作为MBean实现的代理服务 。至少一个协议适配器 </p>
<h3 id="section-JMX-MBean">MBean </h3>
<p>在JMX中，最小的可管理单元是MBean。 </p>
<p>MBean不是一个真正的接口和类，而是必须准循的设计模式以确保资源是一个兼容的MBean。 </p>
<p>MBean的激活方法: </p>
<p>invoke()方法是管理应用程序用于激活MBean的方法的手段。 invoke()方法有三个参数，分别是方法的名称、表示属性的对象数组和描述方法签名的一个字符串数组。它与使用<a class="editpage" title="Create 'JavaReflection'" href="http://wiki.matrix.org.cn/Edit.jsp?page=JavaReflection">Java Reflection</a> Api 激活方法的方式类似。 </p>
<p>Notification(通知)模型： </p>
<p>MBean的通知模型类似与Java事件的监听器模型。 MBean或管理应用程序可以作为MBean事件的监听器注册。 通知支持由两个基本的概念组成，即广播器和监听器。 </p>
<h3 id="section-JMX-MBean_E6_9C_8D_E5_8A_A1_E5_99_A8">MBean服务器 </h3>
<p>MBean服务器用于注册可管理的MBean。 </p>
<p>所有对MBean的请求或查询都是通过MBean服务器实施的。 </p>
<h3 id="section-JMX-_E4_BB_A3_E7_90_86_E6_9C_8D_E5_8A_A1">代理服务 </h3>
<p>代理服务是一些特殊的函数，代理把这些服务提供给MBean，这些代理服务独立于任何MBean。 </p>
<p>一个代理可以提供四种主要的服务： </p>
<ul>
    <li>动态装载：允许代理通过下载这个Bean的类动态实例化MBean，这与装载applet的方式类似。 </li>
</ul>
<p>JMX使用m-let这个标记指定期望动态装载的MBean的位置。 </p>
<ul>
    <li>监控：允许代理通知有关的监听器监控一个MBean的属性值的变化 </li>
</ul>
<p>JMX允许使用三种基本类型的监控程序 (1)CounterMonitor：该程序可以观察类型方面的变化，比如Byte类似或Integer类型 (2)GaugeMonitor：该程序可以观察类型方面的变化，比如Byte类似或Integer类型，还可以在到达上下阀值时进行报告。 (3)StringMonitor：该程序可以观察java.lang.String类型的变化。 </p>
<ul>
    <li>计时器：允许预设的时间间隔发送通知，可以作为一个调度程序
    <li>关系：允许创建和维护MBean之间的关系 </li>
</ul>
<h2 id="section-JMX-_E5_88_86_E5_B8_83_E5_BC_8F_E6_9C_8D_E5_8A_A1_E5_B1_82">分布式服务层 </h2>
<p>包含协议适配器和连接器两种类型的组件，通过它们连接到外部的应用，如<a class="wikipage" href="http://wiki.matrix.org.cn/Wiki.jsp?page=RMI">RMI</a>管理应用、基于浏览器的管理控制等 </p>
<h2 id="section-JMX-_E5_8D_8F_E8_AE_AE_E9_80_82_E9_85_8D_E5_99_A8_E5_92_8C_E8_BF_9E_E6_8E_A5_E5_99_A8">协议适配器和连接器 </h2>
<h2>协议适配器是代理与管理客户通信的手段，每个通信的协议都可能不同。 </h2>
<p>它们都是管理客户与MBean交互的方式。 </p>
<h2 id="section-JMX-JMX_E7_9A_84_E5_A5_BD_E5_A4_84">JMX的好处 </h2>
<ul>
    <li>可减少对JAVA应用实施管理的投资
    <li>提供了一个可伸缩的管理框架
    <li>集成现有的管理方案：如：WBEM，SNMP，TMN
    <li>使用现有的标准JAVA技术
    <li>能使用未来的一些管理概念：如Jini连接技术、通用即插即用、服务定位协议(Service Location Protocol)
    <li>只定义了一些可以访问的接口 </li>
</ul>
<p>相关资源：</p>
<ul>
    <li><a class="wikipage" href="http://wiki.matrix.org.cn/Wiki.jsp?page=JMX%E7%9B%B8%E5%85%B3">JMX相关框架</a>
    <li><a class="wikipage" href="http://wiki.matrix.org.cn/Wiki.jsp?page=MC4J">MC4J</a>
    <li><a class="editpage" title="Create 'XMOJO'" href="http://wiki.matrix.org.cn/Edit.jsp?page=XMOJO">XMOJO</a>
    <li><a class="editpage" title="Create 'MX4J'" href="http://wiki.matrix.org.cn/Edit.jsp?page=MX4J">MX4J</a>
    <li><a class="editpage" title="Create 'JFoxMX'" href="http://wiki.matrix.org.cn/Edit.jsp?page=JFoxMX">JFoxMX</a>
    <li><a class="editpage" title="Create 'JMX4Ant'" href="http://wiki.matrix.org.cn/Edit.jsp?page=JMX4Ant">JMX4Ant</a>
    <li><a class="editpage" title="Create 'Panoptes'" href="http://wiki.matrix.org.cn/Edit.jsp?page=Panoptes">Panoptes</a>
    <li><a class="editpage" title="Create 'EJToolsJMXBrowser'" href="http://wiki.matrix.org.cn/Edit.jsp?page=EJToolsJMXBrowser">EJTools JMX Browser</a>
    <li><a class="wikipage" href="http://wiki.matrix.org.cn/Wiki.jsp?page=JManage">jManage</a> </li>
</ul><img src ="http://www.blogjava.net/mlh123caoer/aggbug/142456.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mlh123caoer/" target="_blank">草儿</a> 2007-09-03 22:26 <a href="http://www.blogjava.net/mlh123caoer/archive/2007/09/03/142456.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转 侯捷谈Java反射机制</title><link>http://www.blogjava.net/mlh123caoer/archive/2007/08/29/140824.html</link><dc:creator>草儿</dc:creator><author>草儿</author><pubDate>Wed, 29 Aug 2007 03:24:00 GMT</pubDate><guid>http://www.blogjava.net/mlh123caoer/archive/2007/08/29/140824.html</guid><wfw:comment>http://www.blogjava.net/mlh123caoer/comments/140824.html</wfw:comment><comments>http://www.blogjava.net/mlh123caoer/archive/2007/08/29/140824.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/mlh123caoer/comments/commentRss/140824.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mlh123caoer/services/trackbacks/140824.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 摘要Reflection 是Java被视为动态（或准动态）语言的一个关键性质。这个机制允许程序在运行时透过Reflection APIs取得任何一个已知名称的class的内部信息，包括其modifiers（诸如public, static 等等）、superclass（例Object）、实现之interfaces（例如Cloneable），也包括fields和methods的所有信息，并可于运...&nbsp;&nbsp;<a href='http://www.blogjava.net/mlh123caoer/archive/2007/08/29/140824.html'>阅读全文</a><img src ="http://www.blogjava.net/mlh123caoer/aggbug/140824.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mlh123caoer/" target="_blank">草儿</a> 2007-08-29 11:24 <a href="http://www.blogjava.net/mlh123caoer/archive/2007/08/29/140824.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>国外开源网站聚合</title><link>http://www.blogjava.net/mlh123caoer/archive/2007/08/25/139337.html</link><dc:creator>草儿</dc:creator><author>草儿</author><pubDate>Sat, 25 Aug 2007 15:16:00 GMT</pubDate><guid>http://www.blogjava.net/mlh123caoer/archive/2007/08/25/139337.html</guid><wfw:comment>http://www.blogjava.net/mlh123caoer/comments/139337.html</wfw:comment><comments>http://www.blogjava.net/mlh123caoer/archive/2007/08/25/139337.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.blogjava.net/mlh123caoer/comments/commentRss/139337.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mlh123caoer/services/trackbacks/139337.html</trackback:ping><description><![CDATA[<p>sourceforge <a href="http://www.sourceforge.net/">http://www.sourceforge.net</a><br>java.net <a href="http://www.java.net/">http://www.java.net</a></p>
<p><a href="http://www.eclipse.org/">www.eclipse.org</a></p>
<p><a href="http://www.opensource.org/">www.opensource.org</a><br></p>
<p><span lang=EN-US style="FONT-FAMILY: SimSun; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: SimSun"><a href="http://strutstestcase.sourceforge.net/">http://strutstestcase.sourceforge.net</a> <font color=#002c99>(StrutsTestCase</font></span><span style="FONT-FAMILY: SimSun; mso-bidi-font-size: 10.5pt; mso-font-kerning: 0pt; mso-bidi-font-family: SimSun">是基于<span lang=EN-US>Junit</span>的一个方便测试<span lang=EN-US>struts</span>框架的测试框架)<br><br></span>Lomboz <a href="http://www.objectlearn.com/index.jsp">http://www.objectlearn.com/index.jsp</a> (J2EE plugin for Eclipse)<br>htmlArea <a href="http://sourceforge.net/projects/itools-htmlarea/">http://sourceforge.net/projects/itools-htmlarea/</a> (所见即所得的在线HTML编辑器)<br>XmlBuddy <a href="http://www.xmlbuddy.com/">http://www.xmlbuddy.com/</a> (XML Editor plugin for Eclipse)<br>JFreeChart <a href="http://www.jfree.org/">http://www.jfree.org/</a> (用于生成图表的项目)<br>EclipseME <a href="http://eclipseme.sourceforge.net/">http://eclipseme.sourceforge.net/</a> (J2ME Developmnt Plugin for Eclipse)<br>mvnForum <a href="http://sourceforge.net/projects/mvnforum/">http://sourceforge.net/projects/mvnforum/</a> (论坛)<br>jChatBox <a href="http://www.javazoom.net/index.shtml">http://www.javazoom.net/index.shtml</a> (用servlet实现的WEB聊天引擎)<br>POI <a href="http://jakarta.apache.org/poi/index.html">http://jakarta.apache.org/poi/index.html</a> (用于处理Excel,WORD等文档的项目)<br>FileUpload <a href="http://jakarta.apache.org/commons/fileupload/">http://jakarta.apache.org/commons/fileupload/</a> (用于处理HTTP文件上传得项目)<br>PDFBox <a href="http://sourceforge.net/projects/pdfbox/">http://sourceforge.net/projects/pdfbox/</a> (处理PDF文档的项目)<br>Lucene <a href="http://jakarta.apache.org/lucene/index.html">http://jakarta.apache.org/lucene/index.html</a> (搜索引擎)<br>Digester <a href="http://jakarta.apache.org/commons/digester/">http://jakarta.apache.org/commons/digester/</a> (处理XML信息的项目)<br>DBCP <a href="http://jakarta.apache.org/commons/dbcp/">http://jakarta.apache.org/commons/dbcp/</a> (数据库连接池)<br>AXIS <a href="http://ws.apache.org/axis/">http://ws.apache.org/axis/</a> (WebService 的实现框架)<br>Jetspeed <a href="http://portals.apache.org/jetspeed-1/">http://portals.apache.org/jetspeed-1/</a> (Portal)<br>HSQLDB <a href="http://sourceforge.net/projects/hsqldb/">http://sourceforge.net/projects/hsqldb/</a> (Im memory Database Engine)<br>CEWOLF <a href="http://sourceforge.net/projects/cewolf/">http://sourceforge.net/projects/cewolf/</a> (一套标签库实现Web报表,使用的是jFreeChart引擎)<br>Struts Menu <a href="http://sourceforge.net/projects/struts-menu/">http://sourceforge.net/projects/struts-menu/</a> (基于Struts的Web菜单项目)<br>htmlparser <a href="http://sourceforge.net/projects/htmlparser/">http://sourceforge.net/projects/htmlparser/</a> (用于解析HTML信息的项目)<br>Mondrian <a href="http://sourceforge.net/projects/mondrian/(Open">http://sourceforge.net/projects/mondrian/(Open</a> Source OLAP Database)<br>ProGuard <a href="http://sourceforge.net/projects/proguard/(Java">http://sourceforge.net/projects/proguard/(Java</a>的混淆器)<br>InfoGlue <a href="http://sourceforge.net/projects/infoglue/">http://sourceforge.net/projects/infoglue/</a> (J2EE 内容管理系统)<br>JPivot <a href="http://sourceforge.net/projects/jpivot/">http://sourceforge.net/projects/jpivot/</a> (基于WEB的OLAP 展现)<br><a href="http://java-source.net/">http://java-source.net/</a></p>
<p>(5)几个常用JAVA开源项目的地址荟萃:<br>Lomboz <a href="http://www.objectlearn.com/index.jsp">http://www.objectlearn.com/index.jsp</a> (J2EE plugin for Eclipse)<br>htmlArea <a href="http://sourceforge.net/projects/itools-htmlarea/">http://sourceforge.net/projects/itools-htmlarea/</a> (所见即所得的在线HTML编辑器)<br>XmlBuddy <a href="http://www.xmlbuddy.com/">http://www.xmlbuddy.com/</a> (XML Editor plugin for Eclipse)<br>JFreeChart <a href="http://www.jfree.org/">http://www.jfree.org/</a> (用于生成图表的项目)<br>EclipseME <a href="http://eclipseme.sourceforge.net/">http://eclipseme.sourceforge.net/</a> (J2ME Developmnt Plugin for Eclipse)<br>mvnForum <a href="http://sourceforge.net/projects/mvnforum/">http://sourceforge.net/projects/mvnforum/</a> (论坛)<br>jChatBox <a href="http://www.javazoom.net/index.shtml">http://www.javazoom.net/index.shtml</a> (用servlet实现的WEB聊天引擎)<br>POI <a href="http://jakarta.apache.org/poi/index.html">http://jakarta.apache.org/poi/index.html</a> (用于处理Excel,WORD等文档的项目)<br>FileUpload <a href="http://jakarta.apache.org/commons/fileupload/">http://jakarta.apache.org/commons/fileupload/</a> (用于处理HTTP文件上传得项目)<br>PDFBox <a href="http://sourceforge.net/projects/pdfbox/">http://sourceforge.net/projects/pdfbox/</a> (处理PDF文档的项目)<br>Lucene <a href="http://jakarta.apache.org/lucene/index.html">http://jakarta.apache.org/lucene/index.html</a> (搜索引擎)<br>Digester <a href="http://jakarta.apache.org/commons/digester/">http://jakarta.apache.org/commons/digester/</a> (处理XML信息的项目)<br>DBCP <a href="http://jakarta.apache.org/commons/dbcp/">http://jakarta.apache.org/commons/dbcp/</a> (数据库连接池)<br>AXIS <a href="http://ws.apache.org/axis/">http://ws.apache.org/axis/</a> (WebService 的实现框架)<br>Jetspeed <a href="http://portals.apache.org/jetspeed-1/">http://portals.apache.org/jetspeed-1/</a> (Portal)<br>HSQLDB <a href="http://sourceforge.net/projects/hsqldb/">http://sourceforge.net/projects/hsqldb/</a> (Im memory Database Engine)<br>CEWOLF <a href="http://sourceforge.net/projects/cewolf/">http://sourceforge.net/projects/cewolf/</a>(一套标签库实现Web报表,使用的是jFreeChart擎)<br>Struts Menu <a href="http://sourceforge.net/projects/struts-menu/">http://sourceforge.net/projects/struts-menu/</a> (基于Struts的Web菜单项目)<br>htmlparser <a href="http://sourceforge.net/projects/htmlparser/">http://sourceforge.net/projects/htmlparser/</a> (用于解析HTML信息的项目)<br>Mondrian <a href="http://sourceforge.net/projects/mondrian/">http://sourceforge.net/projects/mondrian/</a> (Open Source OLAPdatabase)<br>ProGuard <a href="http://sourceforge.net/projects/proguard/">http://sourceforge.net/projects/proguard/</a> (Java的混淆器)<br>InfoGlue <a href="http://sourceforge.net/projects/infoglue/">http://sourceforge.net/projects/infoglue/</a> (J2EE 内容管理系统)<br>JPivot <a href="http://sourceforge.net/projects/jpivot/">http://sourceforge.net/projects/jpivot/</a> (基于WEB的OLAP 展现)<br>HttpClient <a href="http://jakarta.apache.org/commons/httpclient/">http://jakarta.apache.org/commons/httpclient/</a> 处理http客户端的接口</p><img src ="http://www.blogjava.net/mlh123caoer/aggbug/139337.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mlh123caoer/" target="_blank">草儿</a> 2007-08-25 23:16 <a href="http://www.blogjava.net/mlh123caoer/archive/2007/08/25/139337.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JavaFX编程语言基础</title><link>http://www.blogjava.net/mlh123caoer/archive/2007/08/17/137425.html</link><dc:creator>草儿</dc:creator><author>草儿</author><pubDate>Thu, 16 Aug 2007 16:39:00 GMT</pubDate><guid>http://www.blogjava.net/mlh123caoer/archive/2007/08/17/137425.html</guid><wfw:comment>http://www.blogjava.net/mlh123caoer/comments/137425.html</wfw:comment><comments>http://www.blogjava.net/mlh123caoer/archive/2007/08/17/137425.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/mlh123caoer/comments/commentRss/137425.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mlh123caoer/services/trackbacks/137425.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: JavaFX Script&#8482; （下文中成为JavaFX）语言是一种声明式的静态类型编程语言。它具有第一级函数（first-classfunctions）、声明式的语法、列表推导（list-comprehensions）及基于依赖关系的增量式求值（incrementaldependency-based evaluation）等特征。JavaFX 脚本式语言特别适用于Java2D ...&nbsp;&nbsp;<a href='http://www.blogjava.net/mlh123caoer/archive/2007/08/17/137425.html'>阅读全文</a><img src ="http://www.blogjava.net/mlh123caoer/aggbug/137425.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mlh123caoer/" target="_blank">草儿</a> 2007-08-17 00:39 <a href="http://www.blogjava.net/mlh123caoer/archive/2007/08/17/137425.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>深入学习JavaFX脚本语言-參考</title><link>http://www.blogjava.net/mlh123caoer/archive/2007/08/17/137424.html</link><dc:creator>草儿</dc:creator><author>草儿</author><pubDate>Thu, 16 Aug 2007 16:36:00 GMT</pubDate><guid>http://www.blogjava.net/mlh123caoer/archive/2007/08/17/137424.html</guid><wfw:comment>http://www.blogjava.net/mlh123caoer/comments/137424.html</wfw:comment><comments>http://www.blogjava.net/mlh123caoer/archive/2007/08/17/137424.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/mlh123caoer/comments/commentRss/137424.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mlh123caoer/services/trackbacks/137424.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Translated by Liu Dan (cleverpig) and Tian Le (Tin) 本文档将讨论在JavaFX语言中可用的各种GUI组件，并提供示例代码，讨论JavaFX组件与Swing GUI组件相比的差异。前提条件如果你从前没有阅读过JavaFX脚本语言起步教程，那么我们强烈推荐你在继续阅读本文档之前首先阅读JavaFX脚本语言起步教程。你应该具有熟...&nbsp;&nbsp;<a href='http://www.blogjava.net/mlh123caoer/archive/2007/08/17/137424.html'>阅读全文</a><img src ="http://www.blogjava.net/mlh123caoer/aggbug/137424.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mlh123caoer/" target="_blank">草儿</a> 2007-08-17 00:36 <a href="http://www.blogjava.net/mlh123caoer/archive/2007/08/17/137424.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>访问内存中JDBC驱动信息的小程序</title><link>http://www.blogjava.net/mlh123caoer/archive/2007/08/13/136329.html</link><dc:creator>草儿</dc:creator><author>草儿</author><pubDate>Mon, 13 Aug 2007 03:43:00 GMT</pubDate><guid>http://www.blogjava.net/mlh123caoer/archive/2007/08/13/136329.html</guid><wfw:comment>http://www.blogjava.net/mlh123caoer/comments/136329.html</wfw:comment><comments>http://www.blogjava.net/mlh123caoer/archive/2007/08/13/136329.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mlh123caoer/comments/commentRss/136329.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mlh123caoer/services/trackbacks/136329.html</trackback:ping><description><![CDATA[<div class="" style="PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px">在你同内存中多个JDBC驱动打交道的过程中，你可以访问更多的有关JDBC驱动的信息。下面是是访问这些内容的参考代码：<br><code>import java.sql.*;<br>import java.util.*;<br><br>public class drvinf{<br><br>public static void main(String[] args)<br>&nbsp; {<br>&nbsp;&nbsp;<br>&nbsp; //绑定属性文件<br>&nbsp; ResourceBundle bundle = ResourceBundle.getBundle("START");<br>&nbsp; Connection conn=null;<br>&nbsp; String drv=null;<br>&nbsp; String url=null;<br><br>&nbsp; //加载JDBC&nbsp;驱动<br>&nbsp;try{<br>&nbsp;&nbsp;&nbsp;&nbsp; drv = bundle.getString("Driver");<br>&nbsp;&nbsp;&nbsp;&nbsp; Class.forName(drv);<br>&nbsp;&nbsp;&nbsp;&nbsp; }catch (ClassNotFoundException e)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {System.out.println(e.getMessage());}<br><br>&nbsp; //JDBC URL=jdbc:odbc:bank<br>&nbsp; try{<br>&nbsp;&nbsp;&nbsp;&nbsp; url = bundle.getString("jdbcURL");<br>&nbsp;&nbsp;&nbsp;&nbsp; conn = DriverManager.getConnection(url);<br><br>&nbsp;&nbsp;&nbsp;&nbsp; List drvs = Collections.list(DriverManager.getDrivers());<br>&nbsp;&nbsp;&nbsp;&nbsp; for (int i=0; i&lt;drvs.size(); i++)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("----------------打印有关驱动的信息------------");<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Driver driver = (Driver)drvs.get(i); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String name = driver.getClass().getName(); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(name);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int maxV = driver.getMajorVersion();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(maxV); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int minV = driver.getMinorVersion();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(minV); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; boolean comp = driver.jdbcCompliant();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(comp); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; }catch (SQLException e)<br>&nbsp;&nbsp;&nbsp; {System.out.println(e.getMessage());}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(conn!=null)conn.close();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }catch(SQLException e)&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {System.out.println(e.getMessage());} <br>&nbsp;&nbsp;&nbsp; }<br>}<br></code><span class=pf>START.properties</span>&nbsp;中的内容：
<pre><code>
Driver=sun.jdbc.odbc.JdbcOdbcDriver
jdbcURL=jdbc:odbc:bank
login=admin
password=hashflush
</code></pre>
</div><img src ="http://www.blogjava.net/mlh123caoer/aggbug/136329.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mlh123caoer/" target="_blank">草儿</a> 2007-08-13 11:43 <a href="http://www.blogjava.net/mlh123caoer/archive/2007/08/13/136329.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何在Java中使用Robot类</title><link>http://www.blogjava.net/mlh123caoer/archive/2007/08/09/135499.html</link><dc:creator>草儿</dc:creator><author>草儿</author><pubDate>Thu, 09 Aug 2007 06:59:00 GMT</pubDate><guid>http://www.blogjava.net/mlh123caoer/archive/2007/08/09/135499.html</guid><wfw:comment>http://www.blogjava.net/mlh123caoer/comments/135499.html</wfw:comment><comments>http://www.blogjava.net/mlh123caoer/archive/2007/08/09/135499.html#Feedback</comments><slash:comments>12</slash:comments><wfw:commentRss>http://www.blogjava.net/mlh123caoer/comments/commentRss/135499.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mlh123caoer/services/trackbacks/135499.html</trackback:ping><description><![CDATA[<p>Java.awt.Robot 类用于控制鼠标和键盘。一旦你得到这种控制，你能够通过你的Java代码做与<br>鼠标和键盘任何类型的操作.这个类通常用于自动化测试。先面的代码样例将向您展示Robot<br>类如何处理键盘事件。如果你运行此代码，并打开notepad，您将在notepad中看到HI CAOER。赶快试一试吧。<br>import java.awt.AWTException;<br>import java.awt.Robot;<br>import java.awt.event.KeyEvent;<br><br>public class RobotExp {<br><br>public static void main(String[] args) {<br><br>try {<br><br>Robot robot = new Robot();<br>//定义5秒的延迟以便你打开notepad 哈哈<br>// Robot 开始写<br>robot.delay(5000);<br>robot.keyPress(KeyEvent.VK_H);<br>robot.keyPress(KeyEvent.VK_I);<br>robot.keyPress(KeyEvent.VK_SPACE);<br>robot.keyPress(KeyEvent.VK_C);<br>robot.keyPress(KeyEvent.VK_A);<br>robot.keyPress(KeyEvent.VK_O);<br>robot.keyPress(KeyEvent.VK_E);<br>robot.keyPress(KeyEvent.VK_R);<br><br>} catch (AWTException e) {<br>e.printStackTrace();<br>}<br>}<br>}</p><img src ="http://www.blogjava.net/mlh123caoer/aggbug/135499.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mlh123caoer/" target="_blank">草儿</a> 2007-08-09 14:59 <a href="http://www.blogjava.net/mlh123caoer/archive/2007/08/09/135499.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JavaFX入门教程二</title><link>http://www.blogjava.net/mlh123caoer/archive/2007/08/09/135471.html</link><dc:creator>草儿</dc:creator><author>草儿</author><pubDate>Thu, 09 Aug 2007 05:36:00 GMT</pubDate><guid>http://www.blogjava.net/mlh123caoer/archive/2007/08/09/135471.html</guid><wfw:comment>http://www.blogjava.net/mlh123caoer/comments/135471.html</wfw:comment><comments>http://www.blogjava.net/mlh123caoer/archive/2007/08/09/135471.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/mlh123caoer/comments/commentRss/135471.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mlh123caoer/services/trackbacks/135471.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 原作者： Anghel Leonard时间：08/01/2007翻译：Caoer2007年8月8日JavaFX 代码同Java代码极容易集成. 这有一个使用JavaFX装载一个图片到窗体例子，它允许使用者选择一个矩形区域保存这个矩形区域。这个捕捉保存操作由Java代码完成。源码列表 15import java.io.*;import javafx.ui.*;import jav...&nbsp;&nbsp;<a href='http://www.blogjava.net/mlh123caoer/archive/2007/08/09/135471.html'>阅读全文</a><img src ="http://www.blogjava.net/mlh123caoer/aggbug/135471.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mlh123caoer/" target="_blank">草儿</a> 2007-08-09 13:36 <a href="http://www.blogjava.net/mlh123caoer/archive/2007/08/09/135471.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JavaFX入门教程一</title><link>http://www.blogjava.net/mlh123caoer/archive/2007/08/07/134905.html</link><dc:creator>草儿</dc:creator><author>草儿</author><pubDate>Tue, 07 Aug 2007 03:49:00 GMT</pubDate><guid>http://www.blogjava.net/mlh123caoer/archive/2007/08/07/134905.html</guid><wfw:comment>http://www.blogjava.net/mlh123caoer/comments/134905.html</wfw:comment><comments>http://www.blogjava.net/mlh123caoer/archive/2007/08/07/134905.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/mlh123caoer/comments/commentRss/134905.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mlh123caoer/services/trackbacks/134905.html</trackback:ping><description><![CDATA[<p>&nbsp; </p>
<p><span>原作者：</span><span> <span><a href="http://www.onjava.com/pub/au/3140"><span>Anghel Leonard</span></a><br></span></span><span>时间：</span><st1:chsdate w:st="on" IsROCDate="False" IsLunarDate="False" Day="1" Month="8" Year="2007"><span>08/01/2007</span></st1:chsdate><br><span>翻译：</span><span>Caoer<br><st1:chsdate w:st="on" IsROCDate="False" IsLunarDate="False" Day="5" Month="8" Year="2007">2007<span><span>年</span></span>8<span><span>月</span></span>5<span><span>日</span></span></st1:chsdate></span></p>
<p><strong><span>什么是</span></strong><strong><span>JavaFX</span></strong><strong><span>？</span></strong><strong><span>SUN</span></strong><strong><span>（太阳公司）在</span></strong><strong><span>2007</span></strong><strong><span>年春天发布了一个叫</span></strong><strong><span>JavaFX</span></strong><strong><span>新框架。这是一个泛泛的名字，因为</span></strong><strong><span>JavaFX</span></strong><strong><span>主要包含</span></strong><strong><span>Script and Mobile</span></strong><strong><span>两个组件，在将来</span></strong><strong><span>SUN</span></strong><strong><span>将开发更多的组件。</span></strong><strong></strong></p>
<p><strong><span>JavaFX </span></strong><strong><span>的核心是</span></strong><strong><span> JavaFX </span></strong><strong><span>脚本，是一个声明式脚本语言。尽管同</span></strong><strong><span>Java</span></strong><strong><span>代码非常不同，但是同</span></strong><strong><span>Java</span></strong><strong><span>类具有很高的交互度。</span></strong><strong><span> JavaFX </span></strong><strong><span>中的很多类主要为了更容易实现</span></strong><strong><span>Swing</span></strong><strong><span>和</span></strong><strong><span>Java2D</span></strong><strong><span>而设计的。使用</span></strong><strong><span> JavaFX </span></strong><strong><span>脚本，您能很容易的为文本和图形开发</span></strong><strong><span>GUI</span></strong><strong><span>接口、动画和非常</span></strong><strong><span>COOL</span></strong><strong><span>的效果。并且，您能将</span></strong><strong><span>Java</span></strong><strong><span>和</span></strong><strong><span>HTML</span></strong><strong><span>代码包装到</span></strong><strong><span> JavaFX </span></strong><strong><span>脚本中。</span></strong><strong></strong></p>
<p><strong><span>第二个组件</span></strong><strong><span>- JavaFX Mobile</span></strong><strong><span>，是为移动设备开发</span></strong><strong><span>Java</span></strong><strong><span>应用的平台。它最终会成为开发</span></strong><strong><span> JavaFX </span></strong><strong><span>脚本的平台但是现在同这篇文章实用的技术还很不兼容。</span></strong><strong></strong></p>
<p><strong><span>JavaFX </span></strong><strong><span>应用的一些例子</span></strong><strong></strong></p>
<p align=left><strong><span>在开始学习一门新的语言前，让我们先看一下</span></strong><strong><span>JavaFX</span></strong><strong><span>代码的一些例子。</span></strong><strong><span><a href="https://openjfx.dev.java.net/"><span>JavaFX </span><span><span>官方站点</span></span></a></span></strong><strong><span>具有大量的</span></strong><strong><span>JavaFX </span></strong><strong><span>实例。请点击</span></strong><span><a href="http://download.java.net/general/openjfx/demos/tutorial.jnlp"><strong><span>JavaFX Script 2D Graphics Tutorial</span></strong></a></span><strong><span>下载该实例</span></strong><strong><span>. </span></strong><strong><span>下载完成以后，双击</span></strong><strong><em><span>tutorial.jnlp</span></em></strong><strong><span> </span></strong><strong><span>文件即可运行。几秒过后，你应该能够看到如图一的</span></strong><strong><span>JavaFX</span></strong><strong><span>实例运行场景（若没有出现该图片，你必须为</span></strong><strong><span>.jnlp</span></strong><strong><span>扩展名重新配置</span></strong><strong><span>Java Web</span></strong><span> <strong>Start</strong></span><strong><span>）。</span></strong><span>&nbsp;<br><span><span lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: 'Times New Roman'; mso-fareast-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><v:shapetype id=_x0000_t75 stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></v:path><o:lock aspectratio="t" v:ext="edit"></o:lock></v:shapetype><img height=450 alt="Running the tutorial.jnlp" src="http://www.onjava.com/onjava/2007/07/27/graphics/tutorial.gif" width=450></span><br></span></span><em><span>图一、运行</span></em><em><span> tutorial.jnlp tutorial</span></em></p>
<p><strong><span>花些时间看一看这些例子和源代码。仅仅使用有限的几行</span></strong><strong><span>JavaFX</span></strong><strong><span>代码就能得到很多有趣的效果。如果你对于</span></strong><strong><span>JavaFX</span></strong><strong><span>的应用还是感到摸不着头脑，看一看下面的两个</span></strong><strong><span>demo</span></strong><strong><span>。它们是</span></strong><strong><span>StudioMoto </span></strong><strong><span>和</span></strong><strong><span> Tesla Motors </span></strong><strong><span>站点的部分重新实现。您可以从</span></strong><strong><span>OpenJFX </span></strong><strong><span>项目站点下载</span></strong><strong><span>OpenJFX </span></strong><strong><span>脚本</span></strong><strong><u><span>Studiomoto Demo</span></u></strong><strong><span> </span></strong><strong><span>和</span></strong><strong><span> <span><a href="http://download.java.net/general/openjfx/demos/tesla.jnlp"><span>Tesla Demo</span></a></span></span></strong><strong><span>。它们需要</span></strong><strong><span>Java Web Start </span></strong><strong><span>才能运行，但是也取决于你的机器配置它们可能自动运行，或者你必须找到和运行已经下载的</span></strong><strong><span>.jnlp</span></strong><strong><span>文件。</span></strong></p>
<p><strong><span>下载安装</span></strong><strong><span>JavaFX</span></strong></p>
<p><span><br></span><strong><span>如果你对于学习开发</span></strong><strong><span>JavaFX</span></strong><strong><span>应用程序，您应该了解至少使用</span></strong><strong><span>JavaFX</span></strong><strong><span>三个方法。同时了解</span></strong><strong><span>JavaFX</span></strong><strong><span>应用程序不是基于浏览器的也很重要。最简单最快捷的方法是基于叫</span></strong><strong><span>JavaFXPad</span></strong><strong><span>轻量级的工具。使用该工具的主要优势是你总能立即看到你在编辑器里所作更改的效果。你能从</span></strong><strong><span>JavaFX</span></strong><strong><span>项目网站下载到该工具（</span></strong><span> <span><a href="http://download.java.net/general/openjfx/demos/javafxpad.jnlp"><strong><span>JavaFXPad</span></strong></a> </span></span><strong><span>）。并且运行它需要</span></strong><strong><span>Java Web Start </span></strong><strong><span>（如图二）。</span></strong></p>
<p><span lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: 'Times New Roman'; mso-fareast-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><v:shapetype id=_x0000_t75 stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600">&nbsp;<v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></v:path><o:lock aspectratio="t" v:ext="edit"></o:lock></v:shapetype><img height=450 alt="Running the javafxpad editor" src="http://www.onjava.com/onjava/2007/07/27/graphics/javafxpad.gif" width=450></span><span><br></span><em><span>图二、运行</span></em><em><span>JavaFXPad</span></em><em><span>编辑器</span></em></p>
<p><strong><span>使用</span></strong><strong><span>JavaFX</span></strong><strong><span>的另一种方式是使用</span></strong><strong><span>JavaFX</span></strong><strong><span>脚本</span></strong><strong><span>NetBeans 5.5</span></strong><strong><span>插件或者</span></strong><strong><span>Eclipse 3.2</span></strong><strong><span>插件（需要下载和安装</span></strong><strong><span>NetBeans 5.5 </span></strong><strong><span>或者</span></strong><strong><span> Eclipse <st1:chsdate w:st="on" IsROCDate="False" IsLunarDate="False" Day="30" Month="12" Year="1899">3.2.2</st1:chsdate></span></strong><strong><span>以上集成开发工具</span></strong><strong><span> </span></strong><strong><span>）。若您已经使用</span></strong><strong><span> NetBeans 5.5</span></strong><strong><span>开始你的</span></strong><strong><span>JavaFX</span></strong><strong><span>之旅</span></strong><strong><span>,OpenJFX</span></strong><strong><span>项目网站的对于</span></strong><span><a href="https://openjfx.dev.java.net/javafx-nb55-plugin-install.html"><strong><span>NetBean</span></strong><strong><span><span>开发</span></span></strong><strong><span>JavaFX</span></strong><strong><span><span>的说明</span></span></strong></a></span><strong><span>将会给予你帮助。</span></strong><strong><span> </span></strong><strong><span>相似的如果您使用基于</span></strong><strong><span>Eclipse</span></strong><strong><span>的</span></strong><strong><span>JavaFX</span></strong><strong><span>插件，您可以去</span></strong><strong><span>JavaFX</span></strong><strong><span>的</span></strong><span><a href="https://openjfx.dev.java.net/javafx-eclipse-plugin-install.html"><strong><span>Eclipse</span></strong><strong><span><span>插件</span></span></strong></a></span><strong><span>。注意这篇文章中的所有例子已经在</span></strong><strong><span>NetBeans5.5</span></strong><strong><span>的</span></strong><strong><span>JavaFX</span></strong><strong><span>插件中测试过，但是应该能够使用其他方法运行。</span></strong></p>
<p><strong><span>使用</span></strong><strong><span>NetBeans 5.5</span></strong><strong><span>下的</span></strong><strong><span>JavaFX</span></strong><strong><span>插件开发</span></strong><strong><span>Hello World </span></strong><strong><span>程序</span></strong></p>
<p><strong><span>每当开始学习一门新的语言时，我们必定要写</span></strong><strong><span>Hello World </span></strong><strong><span>小程序：</span></strong></p>
<p><strong><span>源码列表</span></strong><strong><span>1</span></strong></p>
<p><span>import javafx.ui.*;</span></p>
<p><span>import java.lang.System;</span></p>
<p><span>Frame {</span></p>
<p><span>centerOnScreen: true</span></p>
<p><span>visible: true</span></p>
<p><span>height: 50</span></p>
<p><span>width: 350</span></p>
<p><span>title: "HelloWorld application..."</span></p>
<p><span>background: yellow</span></p>
<p><span>onClose: operation() {System.exit(0);}</span></p>
<p><span>content: Label {</span></p>
<p><span>text: "Hello World"</span></p>
<p><span>}</span></p>
<p><span>}</span></p>
<p><strong><span>在</span></strong><strong><span>NetBeans5.5</span></strong><strong><span>开发和运行这个小程序步骤如下</span></strong><strong><span>:</span></strong></p>
<p><span><span>1.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><strong><span>启动</span></strong><strong><span>NetBeans 5.5.</span></strong></p>
<p><span><span>2.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><strong><span>从主菜单选择</span></strong><strong><span>File -&gt; New Project.</span></strong></p>
<p><span><span>3.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><strong><span>在新项目窗口</span></strong><strong><span>,</span></strong><strong><span>选择目录常规目录和</span></strong><strong><span> Java </span></strong><strong><span>应用项目</span></strong><strong><span>(</span></strong><strong><span>点击下一步</span></strong><strong><span>).</span></strong></p>
<p><span><span>4.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><strong><span>在新的</span></strong><strong><span>Java</span></strong><strong><span>应用程序窗口</span></strong><strong><span>,</span></strong><strong><span>在项目名文本框敲入</span></strong><strong><span> "FXExample".</span></strong></p>
<p><span><span>5.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><strong><span>在相同窗口，用浏览按钮选择项目的目录</span></strong><strong><span>.</span></strong></p>
<p><span><span>6.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><strong><span>取消</span></strong><strong><span> "Set as main project" </span></strong><strong><span>和</span></strong><strong><span> "Create main class" </span></strong><strong><span>复选框</span></strong><strong><span> (</span></strong><strong><span>点击完成</span></strong><strong><span>).</span></strong></p>
<p><span><span>7.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><strong><span>右击</span></strong><strong><span>FXExample -&gt; Source Packages </span></strong><strong><span>和选择</span></strong><strong><span> New -&gt; File/Folder.</span></strong></p>
<p><span><span>8.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><strong><span>在新的文件窗口，选择另一个目录和</span></strong><strong><span>JavaFX</span></strong><strong><span>文件类型（点击下一步）</span></strong><strong><span>.</span></strong></p>
<p><span><span>9.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><strong><span>在新的</span></strong><strong><span>JavaFX</span></strong><strong><span>文件窗口，敲入</span></strong><strong><span>"HelloWorld" </span></strong><strong><span>作为文件名和</span></strong><strong><span>"src"</span></strong><strong><span>作为目录</span></strong><strong><span>(</span></strong><strong><span>点击完成</span></strong><strong><span>).</span></strong></p>
<p><span><span>10.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><strong><span>拷贝源码列表</span></strong><strong><span>1</span></strong><strong><span>到</span></strong><strong><span> <em><span>HelloWorld.fx</span></em><span>.</span></span></strong></p>
<p><span><span>11.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><strong><span>右击</span></strong><strong><em><span>FXExample</span></em></strong><strong><span> </span></strong><strong><span>项目选择项目属性</span></strong><strong><span>.</span></strong></p>
<p><span><span>12.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><strong><span>在项目</span></strong><strong><span>FXExample</span></strong><strong><span>属性对话框</span></strong><strong><span> ,</span></strong><strong><span>选择从目录面板运行节点</span></strong><strong><span>.</span></strong></p>
<p><span><span>13.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><strong><span>在参数文本框敲入</span></strong><strong><span> "Hello World" (</span></strong><strong><span>点击完成</span></strong><strong><span>).</span></strong></p>
<p><span><span>14.<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><strong><span>右击</span></strong><strong><em><span>FXExample</span></em></strong><strong><span> </span></strong><strong><span>项目选择运行项目选项</span></strong><strong><span>.</span></strong></p>
<p><strong><span>如果一切良好</span></strong><strong><span>,</span></strong><strong><span>你应该看到一个窗体如图三：</span></strong></p>
<span lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: #333333; FONT-FAMILY: 'Times New Roman'; mso-fareast-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><v:shapetype id=_x0000_t75 stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></v:path><o:lock aspectratio="t" v:ext="edit"></o:lock></v:shapetype><img height=53 alt="Running the Hello World application" src="http://www.onjava.com/onjava/2007/07/27/graphics/helloworld.gif" width=352></span>
<p><span><br></span><em><span>图三、</span></em><em><span> </span></em><em><span>在</span></em><em><span>NetBeans 5.5</span></em><em><span>中运行</span></em><em><span> Hello World </span></em><em><span>应用程序</span></em></p>
<p><strong><span>现在你拥有了开发和运行任何</span></strong><strong><span>JavaFX</span></strong><strong><span>应用程序的</span></strong><strong><span>IDE</span></strong><strong><span>软件支持</span></strong><strong><span>.</span></strong></p>
<p><strong><span>JavaFX </span></strong><strong><span>语法</span></strong><strong></strong></p>
<p><strong><span>在正式开始学习</span></strong><strong><span>JavaFX</span></strong><strong><span>，让我们浏览一遍该语言的语法要点。如果你非常熟悉</span></strong><strong><span>Java</span></strong><strong><span>语言，这些语法的大多数会让你感到非常熟悉，但是有一些会相当不一样。</span></strong></p>
<p><strong><span>JavaFX </span></strong><strong><span>原始类型</span></strong><strong></strong></p>
<p><strong><span>JavaFX </span></strong><strong><span>支持原始类型：</span></strong><strong><span>String (</span></strong><strong><span>对应于</span></strong><strong><span> <span>java.lang.String), Boolean (</span></span></strong><strong><span>对应于</span></strong><strong><span> <span>java.lang.Boolean), Number (</span></span></strong><strong><span>对应于</span></strong><strong><span> <span>java.lang.Number) </span></span></strong><strong><span>和</span></strong><strong><span> <span>Integer (</span></span></strong><strong><span>对应于</span></strong><strong><span> <span>byte,short,int,long,BigInteger).</span></span></strong></p>
<p><strong><span>JavaFX </span></strong><strong><span>变量</span></strong><strong></strong></p>
<p><strong><span>一个</span></strong><strong><span>JavaFX</span></strong><strong><span>变量使用</span></strong><strong><span>var</span></strong><strong><span>关键字声明。看下面的例子：</span></strong></p>
<p><span>var x:Number = 0.9;</span></p>
<p><span>var name:String = "John";</span></p>
<p><span>var y:Integer = 0;</span></p>
<p><span>var flag:Boolean = true;</span></p>
<p><span>var numbers:Number = [1,2,3,4,5]</span><span>；</span></p>
<p><strong><span>JavaFX </span></strong><strong><span>操作符</span></strong><strong></strong></p>
<p><span><br></span><strong><span>众所周知的</span></strong><strong><span>Java</span></strong><strong><span>操作符</span></strong><strong><span>&amp;&amp;, || </span></strong><strong><span>和</span></strong><strong><span> </span></strong><strong><span>!</span></strong><strong><span> </span></strong><strong><span>在</span></strong><strong><span>JavaFX</span></strong><strong><span>中采用下面的形式：</span></strong></p>
<p><span><span>&#183;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>Java: </span><span>&amp;&amp;<br></span><span>JavaFX: </span><span>and</span></p>
<p><span><span>&#183;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>Java: </span><span>||<br></span><span>JavaFX: </span><span>or</span></p>
<p><span><span>&#183;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>Java: </span><span>!<br></span><span>JavaFX: </span><span>not</span></p>
<p><strong><span>JavaFX </span></strong><strong><span>方法</span></strong><strong></strong></p>
<p><span><br><strong>JavaFX </strong></span><strong><span>支持这些方法</span></strong><strong><span>. </span></strong><strong><span>具有参数、变量声明和返回值的方法举例：</span></strong></p>
<p><span>function taxes(x) { var t:Number = (19.0/100.0)*x; return t; }</span></p>
<p><strong><span>JavaFX if </span></strong><strong><span>语句</span></strong><strong></strong></p>
<p><span><br></span><span>在</span><strong><span>JavaFX</span></strong><strong><span>中，你你能通过使用</span></strong><strong><span>if</span></strong><strong><span>语句使用条件判断。</span></strong></p>
<p><span>if (</span><em><span>条件</span></em><span>) { //</span><span>动作</span><span> } else if (</span><span>条件</span><span>) { //</span><span>动作</span><span> } else { //</span><span>动作</span><span> }</span></p>
<p><strong><span>JavaFX while </span></strong><strong><span>语句</span></strong><strong></strong></p>
<p><span><br></span><strong><span>这个</span></strong><strong><span> </span></strong><strong><span>while</span></strong><strong><span> </span></strong><strong><span>语句同在</span></strong><strong><span>Java</span></strong><strong><span>中的</span></strong><strong><span>while</span></strong><strong><span>语句相似。</span></strong><strong><span> </span></strong><strong><span>while (</span></strong><strong><em><span>条件</span></em></strong><strong><span>) { //</span></strong><strong><span>动作</span></strong><strong><span>}</span></strong></p>
<p><strong><span>JavaFX for </span></strong><strong><span>语句</span></strong><strong></strong></p>
<p><span><br></span><strong><span>for</span></strong><strong><span> </span></strong><strong><span>语句用于循环和间隔（间隔使用方括号</span></strong><strong><span>[]</span></strong><strong><span>和</span></strong><strong><span> </span></strong><strong><span>..</span></strong><strong><span> </span></strong><strong><span>符号表示</span></strong><strong><span>).</span></strong></p>
<p><span>//i </span><span>将取值：</span><span> 0, 1, 2, 3, 4, 5</span><span>象在</span><span> (i in [0..5]) { //</span><em><span>伴随</span></em><em><span> i</span></em><em><span>的动作</span></em><span> }</span><span>代码块中</span></p>
<p><strong><span>JavaFX </span></strong><strong><span>过程</span></strong><strong></strong></p>
<p><span><br><strong>JavaFX </strong></span><strong><span>过程以</span></strong><strong><span>operation</span></strong><strong><span> </span></strong><strong><span>关键字为标志。一个简单的例子：</span></strong></p>
<p><span>operation startClock() {do{ while(true) {</span></p>
<p><span>if(seconds&gt;=360) {seconds = 0; seconds = [0,6..360] dur 60000 linear;}</span></p>
<p><span>if(minutes&gt;=360) {minutes = 0; minutes = [0,6..360] dur 3600000 linear;}</span></p>
<p><span>if(hours&gt;=360) {hours = 0; hours = [0,6..360] dur 43200000 linear;} } }}</span></p>
<p><strong><span>JavaFX </span></strong><strong><span>类</span></strong><strong></strong></p>
<p><span><br><strong>JavaFX </strong></span><strong><span>类使用</span></strong><strong><span>class</span></strong><strong><span>关键字</span></strong><strong><span>. </span></strong><strong><span>一个</span></strong><strong><span> JavaFX </span></strong><strong><span>类能够使用</span></strong><strong><span>extends</span></strong><strong><span> </span></strong><strong><span>关键字继承多个类使用逗号分割</span></strong><strong><span><br></span></strong><strong><span>这些类的名字。在花括号中间你可以放属性、方法和过程，例如下面的例子：</span></strong></p>
<p><span>class Order {</span></p>
<p><span>attribute order_nr: String;</span></p>
<p><span>attribute ordertype: Order inverse Order.products;</span></p>
<p><span>attribute products: Order* inverse Order.ordertype;</span></p>
<p><span>function getOrderNr(): String;</span></p>
<p><span>operation addOrder(order: Order);</span></p>
<p><span>}</span></p>
<p>&nbsp;</p>
<p><strong><span>注意属性使用</span></strong><strong><span>attribute</span></strong><strong><span>关键字声明，方法体和过程不在类体中，它们单元定义在类声明以后，在下文你很快就能看到。</span></strong><strong><span> <span>inverse</span></span></strong><strong><span> </span></strong><strong><span>子句是一个可选项</span></strong><strong><span> </span></strong><strong><span>，它表示一种同在类中另一个属性的双向关系。在这个案例中</span></strong><strong><span>JavaFX</span></strong><strong><span>将自动完成更新（插入、替代和删除）你能在</span></strong><strong><span>Java.net</span></strong><strong><span>上找到更完整的</span></strong><span><a href="https://openjfx.dev.java.net/JavaFX_Programming_Language.html"><strong><span><span>文档</span></span></strong></a></span><strong><span>。</span></strong></p>
<p><strong><span>熟悉</span></strong><strong><span>JavaFX</span></strong></p>
<p>&nbsp;</p>
<p><strong><span>在本小节，您将会看到一系列的小例子，这些例子覆盖</span></strong><strong><span>JavaFX</span></strong><strong><span>的各种特性和功能。主要目的是让你熟悉</span></strong><strong><span>JavaFX</span></strong><strong><span>代码和</span></strong><strong><span>JavaFX</span></strong><strong><span>应用程序的逻辑。第二个目标是当你需要开发仅仅需要几行代码就会有非常酷的</span></strong><strong><span>GUI</span></strong><strong><span>，动画和好的效果时候使你确信</span></strong><strong><span>JavaFX</span></strong><strong><span>值得好好研究一下。所有列出的例子将介绍关于</span></strong><strong><span>JavaFX</span></strong><strong><span>的技巧。每一个例子只使用很少的描述处理，所以不要想找到大量的注释。所有这些可访问的例子你都是你自己就能运行的，所以让我们开始吧。当我们需要使用</span></strong><strong><span>System.out.println</span></strong><strong><span> </span></strong><strong><span>打印属性值时候，你可以把它的名字放进含有引用的字符串，象源码列表</span></strong><strong><span>2</span></strong><strong><span>中所示的那样。</span></strong></p>
<p><span>源码列表</span><span>2</span></p>
<p><span>//</span><span>带有应用文本的表达式</span></p>
<p><span>import java.lang.System;<br>var mynumber:Number = 10;<br>System.out.println("</span><span>数字是</span><span>: {mynumber}");</span></p>
<p>&nbsp;</p>
<p><strong><span>结果</span></strong><strong><span>: </span></strong><strong><span>数字是</span></strong><strong><span>: 10<br><em>JavaFX</em> </span></strong><strong><span>支持变量的计数这样一个有用的功能。这个功能利用下面的三个操作符实现：</span></strong></p>
<p><span><span>&#183;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><strong><span>?</span></strong><strong><span>: </span></strong><strong><span>可选的</span></strong><strong><span>(</span></strong><strong><span>可能为</span></strong><strong><span> </span></strong><strong><span>null</span></strong><strong><span>)</span></strong></p>
<p><span><span>&#183;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><strong><span>+</span></strong><strong><span>: 1</span></strong><strong><span>或多个</span></strong></p>
<p><span><span>&#183;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><strong><span>*</span></strong><strong><span>: 0</span></strong><strong><span>或多个</span></strong></p>
<p><strong><span>源码列表</span></strong><strong><span>3</span></strong></p>
<p><span>//</span><span>变量计数</span></p>
<p><span>import java.lang.System;<br>var mynumbers:Number* = [1,2,7];<br>System.out.println("</span><span>数字是</span><span>: {mynumbers}");</span></p>
<p>&nbsp;</p>
<p><span>结果</span><span>: </span><span>数字是</span><span>: 1 2 7<br></span><strong><span>在</span></strong><strong><span>JavaFX</span></strong><strong><span>中</span></strong><strong><span>, </span></strong><strong><span>在声明部分不指定变量的类型是可能的。</span></strong><strong><span> </span></strong><strong><span>这不会产生错误，因为</span></strong><strong><span>JavaFX </span></strong><strong><span>将在该变量的使用中自动发现它的类型。</span></strong></p>
<p><strong><span>源码列表</span></strong><strong><span> 4</span></strong></p>
<p><span>//</span><span>变量类型是可选的</span></p>
<p><span>import java.lang.System; <br>var days = ["Monday,","Friday,","Sunday"]; <br>System.out.println("</span><span>你必须工作</span><span>: {days}");</span></p>
<p><span><br></span><span>结果</span><span>: </span><span>你必须工作</span><span>: Monday, Friday, Sunday<br></span><strong><span>你可以使用</span></strong><strong><span>sizeof</span></strong><strong><span> </span></strong><strong><span>操作符得到一个数组的大小：</span></strong></p>
<p><strong><span>源码列表</span></strong><strong><span> 5</span></strong></p>
<p><span>//</span><span>得到一个数组的大小</span></p>
<p><span>import java.lang.System;<br>var lotto = [21,30,11,40,5,6];<br>System.out.println("</span><span>数组大小</span><span>:{sizeof lotto}");</span></p>
<p>&nbsp;</p>
<p><span>结果</span><span>: </span><span>数组大小</span><span>: 6</span></p>
<p><strong><span>您能使用</span></strong><strong><span> </span></strong><strong><span>[]</span></strong><strong><span> </span></strong><strong><span>操作符得到满足指定条件的子数组。条件放在</span></strong><strong><span> </span></strong><strong><span>[]</span></strong><strong><span> </span></strong><strong><span>中作为布尔判断</span></strong><strong><span> </span></strong><strong><span>。这个与</span></strong><strong><span>XPath </span></strong><strong><span>谓词相似</span></strong><strong><span>.</span></strong></p>
<p><strong><span>源码列表</span></strong><strong><span> 6</span></strong></p>
<p><span>//</span><span>使用</span><span>[] </span><span>操作符</span><span> -</span><span>与</span><span> XPath</span><span>相似</span></p>
<p><span>import java.lang.System;<br>var mynumbers = [1,2,7,3,30,15,14,6,4];<br>var numbers = mynumbers[n|n &lt; 10]; <br>System.out.println("</span><span>小于</span><span>10</span><span>的数字为</span><span>: {numbers}");</span></p>
<p>&nbsp;</p>
<p><span>结果</span><span>: </span><span>小于</span><span>10</span><span>的数字为</span><span>: 1 2 7 3 6 4<br></span><strong><span>你可以使用</span></strong><strong><span>indexof</span></strong><strong><span> </span></strong><strong><span>操作符得到指定序数位置的数组中一个元素<em>：</em></span></strong></p>
<p><strong><span>源码列表</span></strong><strong><span> 7</span></strong></p>
<p><span>//</span><span>返回指定序数位置的数组中的元素</span></p>
<p><span>import java.lang.System;</span></p>
<p><span>var mynumbers = [1,2,7,3,30,15,14,6,4]; <br>var number_four = mynumbers[indexof . == 4]; <br>System.out.println("</span><span>数字</span><span>4:{number_four}");</span></p>
<p>&nbsp;</p>
<p><span>结果</span><span>: </span><span>数字</span><span>4: 30<br><br></span><strong><span>当您想要向一个数组中插入一个元素时，你可以使用下列</span></strong><strong><span> </span></strong><strong><span>insert</span></strong><strong><span> </span></strong><strong><span>语句中的一个</span></strong><strong><em><span>:</span></em></strong></p>
<p><span><span>&#183;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>as first</span><span>: </span><span>在第一个位置插入</span></p>
<p><span><span>&#183;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>as last</span><span>:</span><span>在最后一个位置</span><span>(</span><span>默认</span><span>)</span><span>插入</span></p>
<p><span><span>&#183;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>before</span><span>: </span><span>在前一个位置插入</span></p>
<p><span><span>&#183;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span>after</span><span>:</span><span>在下一个位置插入</span></p>
<p><strong><span>你可以使用</span></strong><strong><span> </span></strong><strong><span>delete</span></strong><strong><span> </span></strong><strong><span>语句从一个数组中删除一个元素</span></strong><strong><span>.</span></strong></p>
<p><strong><span>源码列表</span></strong><strong><span>8</span></strong></p>
<p><span>//</span><span>插入和删除语句</span><span><br>import java.lang.System;<br>var mynumbers = [1,2,7]; <br>System.out.println("Before inserting anything: {mynumbers}");<br>insert 10 into mynumbers;<br>System.out.println("After inserting at the end the \"10\" value:{mynumbers}");<br>insert [8,6,90] as first into mynumbers; <br>System.out.println("After inserting at the first positions the \"8,6,90\" values:{mynumbers}");<br>insert 122 as last into mynumbers;<br>System.out.println("After inserting at the end the \"122\" value:{mynumbers}");<br>insert 78 before mynumbers[3];<br>insert 11 after mynumbers[3];<br>System.out.println("After inserting the \"78\" and \"11\" values before/after the 3rd element:{mynumbers}");<br>delete mynumbers[. == 122];<br>System.out.println("After deleting:{mynumbers}");</span></p>
<p><span>结果</span><span>:<br>Before inserting anything: 1 2 7<br>After inserting the 10 value at the end: 1 2 7 10<br>After inserting the 8, 6, and 90 values at the first positions: 8 6 90 1 2 7 10<br>After inserting the 122 value at the end: 8 6 90 1 2 7 10 122<br>After inserting the 78 and 11 values before/after the 3rd element: 8 6 90 78 11 1 2 7 10 122<br>After deleting: 8 6 90 78 11 1 2 7 10</span></p>
<p><em><span>JavaFX</span></em><em><span>中的一个非常好的功能是</span></em><em><span>list</span></em><em><span>。这个功能使用</span></em><span> </span><span>select</span><span> </span><span>和</span><span> </span><span>foreach</span><span> </span><span>操作符实现。这有两个例子（一个使用</span><span> </span><span>select</span><span> </span><span>和使用</span><span> </span><span>foreach</span><em><span>) </span></em><em><span>得到指定间隔的奇数。</span></em></p>
<p><strong><span>源码列表</span></strong><strong><span>9</span></strong></p>
<p><span>//JavaFX</span><span>中的</span><span> select </span><span>和</span><span> foreach </span><span>操作符</span></p>
<p><span>import java.lang.System; <br>function odd(p:Number) <br>{ return select i from i in [1.0 ..p]<br>&nbsp;where (i%2 == 0.0); <br>}</span></p>
<p><span>var result = odd(10.0); <br>System.out.println("Odd numbers:{result}");</span></p>
<p><span>结果</span><span>: Odd numbers: 2.0 4.0 6.0 8.0 10.0</span></p>
<p><strong><span>源码列表</span></strong><strong><span>10 (</span></strong><strong><span>同</span></strong><strong><span> </span></strong><strong><span>源码列表</span></strong><strong><span> 9</span></strong><strong><span>相同</span></strong><strong><span>, </span></strong><strong><span>但是有</span></strong><strong><span> foreach)</span></strong></p>
<p><span>//JavaFX</span><span>中的</span><span>select </span><span>和</span><span> foreach </span><span>操作符</span></p>
<p><span>import java.lang.System; <br>function odd(p:Number) { <br><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>return foreach (i in [1.0 ..p] <br><span>&nbsp;&nbsp;&nbsp;&nbsp; </span>where (i%2 == 0.0)) i; <br><span>&nbsp;&nbsp;&nbsp;&nbsp; </span>} <br>var result = odd(10.0);<br>System.out.println("Odd numbers:{result}");</span></p>
<p><strong><span>这个例子显示了</span></strong><strong><span> </span></strong><strong><span>foreach</span></strong><strong><span> </span></strong><strong><span>对于创建好的效果非常有用。</span></strong></p>
<p><strong><span>源码列表</span></strong><strong><span>11</span></strong></p>
<p><span>//JavaFX</span><span>中的</span><span> select </span><span>和</span><span> foreach </span><span>操作符</span></p>
<p><span>import java.lang.*;<br>import javafx.ui.*; <br>import javafx.ui.canvas.*;<br>Frame { <br>centerOnScreen: true <br>visible: true <br>height: 500 <br>width: 500 <br>title: "Foreach demo..." <br>onClose: operation() {<br>System.exit(0);<br>} <br>content: ScrollPane { <br>background: white <br>view: Canvas {<br>&nbsp;content: bind <br>foreach (i in [1..8], j in [1..8]) <br>Rect { x: i*30 y: j*30 width:30 height:30 fill: Color {red: (100+i) green: (100+j) blue: (100+(i*j))<br>} <br>stroke:white <br>strokeWidth:1 } }</span></p>
<p><span>}</span></p>
<p><span>}</span></p>
<p><span lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: #003366; FONT-FAMILY: 'Times New Roman'; mso-fareast-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><v:shapetype id=_x0000_t75 stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600">&nbsp;<v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></v:path><o:lock aspectratio="t" v:ext="edit"></o:lock></v:shapetype><img height=248 alt="Running listing 11" src="http://www.onjava.com/onjava/2007/07/27/graphics/grill.gif" width=249></span><span><br></span><em><span>图四</span></em><em><span>. </span></em><em><span>运行源码列表</span></em><em><span> 11</span></em></p>
<p><em><span>使用双箭头括号引用为</span></em><em><span>JavaFX</span></em><em><span>关键字的变量名或者属性名，如下所示。</span></em></p>
<p><strong><span>源码列表</span></strong><strong><span> 12</span></strong></p>
<p><span>//</span><span>标志符引用</span></p>
<p><span>import java.lang.System;</span></p>
<p><span>for (&lt;&lt;for&gt;&gt; in [0..3]) {</span></p>
<p><span>System.out.println("for = {&lt;&lt;for&gt;&gt;}");</span></p>
<p><span>}</span></p>
<p><span>结果</span><span>: for = 0 for = 1 for = 2 for = 3</span></p>
<p><em><span>当你需要开发</span></em><em><span>Swing</span></em><em><span>接口时，</span></em><em><span>JavaFX </span></em><em><span>是一个伟大的工具，因为</span></em><em><span> JavaFX </span></em><em><span>考虑了非常多用来降低代码量和同</span></em><span>javax.swing.*</span><span>包</span><em><span>并存友好。在上一节（使用</span></em><em><span>NetBeans5.5</span></em><em><span>中的</span></em><em><span>JavaFX</span></em><em><span>插件测试</span></em><em><span>Hello World</span></em><em><span>应用程序），你看到了创建一个窗体是如何容易。这有两个更好的例子：创建按钮和文本框。</span></em></p>
<p><span>源码列表</span><span> 13</span></p>
<p><span>import javafx.ui.*;</span></p>
<p><span>import java.lang.System;</span></p>
<p><span>Frame{</span></p>
<p><span>content: Button { text: "Exit" action: operation() { System.exit(0); } }</span></p>
<p><span>visible: true</span></p>
<p><span>}</span></p>
<p><span lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: #003366; FONT-FAMILY: 'Times New Roman'; mso-fareast-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><v:shapetype id=_x0000_t75 stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600">&nbsp;<v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></v:path><o:lock aspectratio="t" v:ext="edit"></o:lock></v:shapetype><img height=59 alt=" Running listing 13" src="http://www.onjava.com/onjava/2007/07/27/graphics/button.gif" width=125></span><span><br></span><em><span>图五</span></em><em><span>. </span></em><em><span>运行源码</span></em><em><span> 13</span></em></p>
<p><strong><span>源码列表</span></strong><strong><span>14</span></strong></p>
<p><span>import javafx.ui.*;</span></p>
<p><span>Frame {</span></p>
<p><span>content: GroupPanel { var myRow = Row { alignment: BASELINE }</span></p>
<p><span>var label_col = Column { alignment: TRAILING }</span></p>
<p><span>var field_col = Column { alignment: LEADING }</span></p>
<p><span>rows: [myRow] columns: [label_col, field_col]</span></p>
<p><span>content: [SimpleLabel { row: myRow column: label_col text: "Type your text here:" }, TextField { row: myRow column: field_col columns: 50 }] }</span></p>
<p><span>visible: true</span></p>
<p><span>};</span></p>
<p><span lang=EN-US style="FONT-SIZE: 10.5pt; COLOR: #003366; FONT-FAMILY: 'Times New Roman'; mso-fareast-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><v:shapetype id=_x0000_t75 stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600">&nbsp;<v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></v:path><o:lock aspectratio="t" v:ext="edit"></o:lock></v:shapetype><img height=76 alt="Running listing 14" src="http://www.onjava.com/onjava/2007/07/27/graphics/textfield.gif" width=539></span><span><br></span><em><span>图六</span></em><em><span>. </span></em><em><span>运行源码</span></em><em><span> 14</span></em></p>
<p><span>Java.net </span><span>也有使用</span><span>JavaFx</span><span>创建</span><span> <span><a href="https://openjfx.dev.java.net/Getting_Started_With_JavaFX.html"><span>Swing</span><span><span>接口</span></span></a></span></span><span>的教程。</span></p>
<p>&nbsp;</p>
<p><br>&nbsp;</p><img src ="http://www.blogjava.net/mlh123caoer/aggbug/134905.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mlh123caoer/" target="_blank">草儿</a> 2007-08-07 11:49 <a href="http://www.blogjava.net/mlh123caoer/archive/2007/08/07/134905.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基于Struts1.2.9框架的登录页面的处理过程</title><link>http://www.blogjava.net/mlh123caoer/archive/2007/08/03/134201.html</link><dc:creator>草儿</dc:creator><author>草儿</author><pubDate>Fri, 03 Aug 2007 03:36:00 GMT</pubDate><guid>http://www.blogjava.net/mlh123caoer/archive/2007/08/03/134201.html</guid><wfw:comment>http://www.blogjava.net/mlh123caoer/comments/134201.html</wfw:comment><comments>http://www.blogjava.net/mlh123caoer/archive/2007/08/03/134201.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mlh123caoer/comments/commentRss/134201.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mlh123caoer/services/trackbacks/134201.html</trackback:ping><description><![CDATA[<p>Struts Web框架是现在构建Web应用必须的开发框架之一。以下是我们学习Struts框架时通常都会看到的登录页面程序的处理流程分析，希望和广大博友交流：</p>
<br>
<p>基于Struts框架登录程序应用的UML顺序图<br><img title=Struts交互图 height=480 alt=Struts交互图 src="http://www.blogjava.net/images/blogjava_net/mlh123caoer/24610/r_struts%e4%ba%a4%e4%ba%92%e5%9b%be.jpg" width=640></p>
<p>处理步骤：</p>
<p>1、客户从浏览器客户端向Web服务器发出请求，服务器将请求转发到Web容器，比如：Tomcat；根据请求路径URL找到ActionServlet，Web容器调用Servlet的servic()方法，根据请求参数的不同调用doGet()或者doPost()方法。</p>
<p>2、而ActionServlet的doGet()或者doPost()方法调用process()方法处理请求和响应，生成RequestProcess对象处理配置文件struts-config.xml中的配置信息，依次调用processMapping()-查找处理此次请求的Action信息并返回ActionMapping对象；processActionForm()--创建此次请求的ActionForm对象；processActionCreate()--创建处理此次请求的Action实例（LoginAction对象）；processActionPerform()--执行Action实例的execute()方法。</p>
<p>3、通过调用execute()方法获取LoginForm存储的用户和密码等数据信息，其中将ActionForm Bean、ActionMapping、request、response对象传递给LoginAction对象（Action实例）；执行完必要的逻辑处理比如查询数据库后，返回一个ActionForward对象，由该对象调用RequestProcess对象中的processForwardConfig()方法解析配置文件中跳转参数，转发到相应的View页面success.jsp或者failure.jsp。</p>
<br><br><img src ="http://www.blogjava.net/mlh123caoer/aggbug/134201.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mlh123caoer/" target="_blank">草儿</a> 2007-08-03 11:36 <a href="http://www.blogjava.net/mlh123caoer/archive/2007/08/03/134201.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP在TOMCAT中的处理生命周期</title><link>http://www.blogjava.net/mlh123caoer/archive/2007/07/14/130271.html</link><dc:creator>草儿</dc:creator><author>草儿</author><pubDate>Sat, 14 Jul 2007 06:43:00 GMT</pubDate><guid>http://www.blogjava.net/mlh123caoer/archive/2007/07/14/130271.html</guid><wfw:comment>http://www.blogjava.net/mlh123caoer/comments/130271.html</wfw:comment><comments>http://www.blogjava.net/mlh123caoer/archive/2007/07/14/130271.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/mlh123caoer/comments/commentRss/130271.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mlh123caoer/services/trackbacks/130271.html</trackback:ping><description><![CDATA[<div>1、将WEB应用部署到TOMCAT容器，容器启动读取应用的部署文件web.xml,但不对.jsp文件做任何处理请求。</div>
<div>2、客户点击连接请求某个.jsp文件，容器开始将.jsp文件转换为一个servrlet类的.java源代码。查看指令，得到转换的可能需要的信息。创建一个HttpServlet子类，对于Tomcat5所生成的servlet会扩展org.apache.jasper.runtime.HttpJspBase类。若有一个page指令有import属性，生成的类文件的最上面会写入import语句。例如在Tomcat5中加入包语句：package org.apache.jsp；若有声明容器将这些声明写道类文件，通常放在服务方法的下面。Tomca5声明了自己的一个静态方法和一个实例方法。然后建立服务方法，方法名为_jspService()。所生成的servlet会覆盖servlet超类的service()方法。_jspService()直接由service()调用，要接收HttpServletRequest和HttpServletResponse参数。在建立这个方法的时候，容器会声明并初始化所有的隐式对象。将普通的HTML（模板文件）、scrptlet和表达式放到服务方法里，进行格式化，并写至PrintWrite响应输出。</div>
<div>3、容器尝试将这个servlet.java源文件编译为.class文件。</div>
<div>4、容器家在新生成的servlet类。</div>
<div>5、容器实例化servlet，并导致servlet的jspInit()方法运行。对象现在已成为一个完整的servlet准备就绪，接受客户的请求。</div>
<div>6、容器创建一个新线程来处理客户请求，servlet的service()方法运行。以后的处理同普通的servlet处理过程。最终servlet向客户返回一个响应。</div>
<div>需要注意的是：在JSP生命周期中，JSP的转换和编译过程只发生一次。一旦第一次编译完成，以后的调用同普通的servlet一样。大多数容器开发商提供预转化和编译的办法，是这些工作提前完成。</div><img src ="http://www.blogjava.net/mlh123caoer/aggbug/130271.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mlh123caoer/" target="_blank">草儿</a> 2007-07-14 14:43 <a href="http://www.blogjava.net/mlh123caoer/archive/2007/07/14/130271.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个Servlet生命周期（Tomcat处理请求中）</title><link>http://www.blogjava.net/mlh123caoer/archive/2007/07/07/128789.html</link><dc:creator>草儿</dc:creator><author>草儿</author><pubDate>Sat, 07 Jul 2007 08:04:00 GMT</pubDate><guid>http://www.blogjava.net/mlh123caoer/archive/2007/07/07/128789.html</guid><wfw:comment>http://www.blogjava.net/mlh123caoer/comments/128789.html</wfw:comment><comments>http://www.blogjava.net/mlh123caoer/archive/2007/07/07/128789.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mlh123caoer/comments/commentRss/128789.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mlh123caoer/services/trackbacks/128789.html</trackback:ping><description><![CDATA[从Tomcat处理用户请求，我们可以清晰的看到容器Servlet的生命周期管理过程：<br>1、客户发出请求—&gt;Web 服务器转发到Web容器Tomcat；<br>2、Tomcat主线程对转发来用户的请求做出响应创建两个对象：HttpServletRequest和HttpServletResponse；<br>3、从请求中的URL中找到正确Servlet，Tomcat为其创建或者分配一个线程，同时把2创建的两个对象传递给该线程；<br>4、Tomcat调用Servlet的servic()方法，根据请求参数的不同调用doGet()或者doPost()方法；<br>5、假设是HTTP GET请求，doGet()方法生成静态页面，并组合到响应对象里；<br>6、Servlet线程结束，Tomcat将响应对象转换为HTTP响应发回给客户，同时删除请求和响应对象。<br>从该过程中，我们可以理解Servlet的生命周期：Servlet类加载（对应3步）；Servlet实例化（对应3步）；调用init方法（对应3步）；调用service()方法（对应4、5步）；；调用destroy()方法（对应6步）。<img src ="http://www.blogjava.net/mlh123caoer/aggbug/128789.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mlh123caoer/" target="_blank">草儿</a> 2007-07-07 16:04 <a href="http://www.blogjava.net/mlh123caoer/archive/2007/07/07/128789.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Adobe Flex2</title><link>http://www.blogjava.net/mlh123caoer/archive/2007/07/06/128519.html</link><dc:creator>草儿</dc:creator><author>草儿</author><pubDate>Fri, 06 Jul 2007 02:59:00 GMT</pubDate><guid>http://www.blogjava.net/mlh123caoer/archive/2007/07/06/128519.html</guid><wfw:comment>http://www.blogjava.net/mlh123caoer/comments/128519.html</wfw:comment><comments>http://www.blogjava.net/mlh123caoer/archive/2007/07/06/128519.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/mlh123caoer/comments/commentRss/128519.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mlh123caoer/services/trackbacks/128519.html</trackback:ping><description><![CDATA[<p><br>Flex2应用程序在无所不在的轻量级虚拟机Flash播放器9跨平台运行。该平台包括以下技术：<br>1、一种基于XML的MXML语言，它支持面对设计者的GUI组件声明式编程；<br>2、标准的OOP语言，基于最新的ECMASript规范的AS3；<br>3、使用FDS（Flex Data Services）方式进行服务端集成，是客户端程序能够对J2EE世界透明访问；<br>4、图表组件；<br>5、基于Eclipse功能强大的IDE，拥有自动化部署，调试，代码跟踪能力。<br>Flex2平台易于扩展也对服务端技术例如JAVA，ColdFusion，PHP，Ruby，ASP等等实现集成。即将发布的Adobe Apollo版允许基于Flash Player，Flex，PDF和HTML桌面程序的构建。<br>SWF文件格式是开放的，有第三方开源产品象Laszlo系统的OpenLaszlo为构建RIA程序提供工具，程序使用Flash Player发布。<br>与上一个版本相反，Flex2提供一种不会招致授权协议纠纷而构建RIA的方式。以下都免费得到：<br>1、MXML：基于XML声明式用来构建GUI的编程语言；<br>2、ActionScript3.0：与JAVA相似的OOP语言；<br>3、Flash Player9：运行在WEB浏览器占有很少内存的虚拟机，运行你编译的二进制代码（.SWF）;<br>4、命令行编译器和调试器；<br>5、Flex 框架：包含设计良好的GUI组件库：按钮，tab目录，数据网格，树控制，动画效果等等很多。<br>6、Flex数据服务预览版：部署在J2EE服务器WEB程序与运行在Flash Player上的ActionScript客户端程序通信模板。FDS预览版只能运行在单CPU上并且不支持在（24*7）高可访问性配置模式下使用。</p>
<p>构建一个基本的Flex2程序步骤有：<br>1、通过增加XML组件例如下面按钮来构建这个程序：<br>&lt;mx:Button label="Place Order" click="processOrder(event)"/&gt;<br>若使用收费的开发工具Flex Builder IDE，你就可以使用拖拉技术了。当然，你也可以手写MXML文本。<br>2、写按照业务逻辑ActionScript代码，例如：<br>private function processOrder (event:Event):void{<br>//业务逻辑代码<br>}<br>3、编译代码。Flex编译器自动的把MXML转换为ActionScript代码并以SWF格式字节码输出在Flash Player 9或者更高版本运行，如果你用Flex Builder IDE，你将得到更爽的自动化编译过程。<br>4、在你选择的WEB服务器中部署SWF文件和封装好的HTML页面。如果你用收钱的那个工具，这些过程完全透明。<br>有一个在线Flex编译器网站，你可以试着写一些Flex代码而不用在你自己的电脑上安装任何东西。同时该网站提供了一些示例代码供您修改和运行。还等什么，GO：<a href="http://try.flex.org/">http://try.flex.org/</a></p><img src ="http://www.blogjava.net/mlh123caoer/aggbug/128519.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mlh123caoer/" target="_blank">草儿</a> 2007-07-06 10:59 <a href="http://www.blogjava.net/mlh123caoer/archive/2007/07/06/128519.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JDOM简介</title><link>http://www.blogjava.net/mlh123caoer/archive/2007/06/25/126177.html</link><dc:creator>草儿</dc:creator><author>草儿</author><pubDate>Mon, 25 Jun 2007 10:33:00 GMT</pubDate><guid>http://www.blogjava.net/mlh123caoer/archive/2007/06/25/126177.html</guid><wfw:comment>http://www.blogjava.net/mlh123caoer/comments/126177.html</wfw:comment><comments>http://www.blogjava.net/mlh123caoer/archive/2007/06/25/126177.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mlh123caoer/comments/commentRss/126177.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mlh123caoer/services/trackbacks/126177.html</trackback:ping><description><![CDATA[<a href="http://www.itisedu.com/phrase/200604181210165.html" target=_new><u><font face=Verdana color=#800080>JDOM</font></u></a><font face=Verdana>是一种使用 </font><a href="http://www.itisedu.com/phrase/200604231236585.html" target=_new><u><font face=Verdana color=#0000ff>XML</font></u></a><font face=Verdana> 的独特 Java 工具包，用于快速开发 XML 应用</font><a href="http://www.itisedu.com/phrase/200604232224305.html" target=_new><u><font face=Verdana color=#0000ff>程序</font></u></a><font face=Verdana>。它的</font><a href="http://www.itisedu.com/phrase/200604161428395.html" target=_new><u><font face=Verdana color=#0000ff>设计包</font></u></a><font face=Verdana>含 Java 语言的语法乃至语义。 </font>
<p><font face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JDOM是两位著名的 Java 开发人员兼作者，Brett Mclaughlin 和 Jason Hunter 的创作成果， 2000 年初在</font><a href="http://www.itisedu.com/phrase/200603090857555.html" target=_new><font face=Verdana color=#0000ff><u>类</u></font></a><font face=Verdana>似于 Apache 协议的许可下，JDOM 作为一个开放源代码项目正式开始研发，JDOM 作为一个开放源代码项目正式开始了。它已成长为包含来自广泛的 Java 开发人员的投稿、集中反馈及错误修复的系统，并致力于建立一个完整的基于 Java 平台的解决方案，通过 Java 代码来访问、操作并输出 XML 数据。 </font></p>
<p><font face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 虽然许多Java 开发人员每天都在使用 XML，Sun 却在将 XML 整合进 Java 平台方面落后了。因为在 XML 成为从商家对商家集成到 Web 站点内容流水化等方面的关键技术之前，Java 2 平台就已经非常流行了。Sun 已经使用 JSR 过程使之成为现存 XML <a href="http://www.itisedu.com/phrase/200604241228185.html" target=_new><u><font color=#0000ff>API</font></u></a> 的鼻祖，这一点已被广泛接受。目前最显著的是加入了 JAXP （用于 XML 语法分析的 Java API），其中包含了三个<a href="http://www.itisedu.com/phrase/200602281756135.html" target=_new><u><font color=#0000ff>软件包</font></u></a>： </font></p>
<p><font face=Verdana>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#183;org.w3c.dom ，W3C 推荐的用于 XML 标准规划文档<a href="http://www.itisedu.com/phrase/200603090845215.html" target=_new><u><font color=#0000ff>对象</font></u></a>模型的 Java 工具 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#183;org.xml.sax ，用于对 XML 进行语法分析的事件驱动的简单 API <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#183;javax.xml.parsers ，工厂化工具，允许应用程序开发人员获得并配置特殊的语法分析器工具 JDOM 能够替换 org.w3c.dom <a href="http://www.itisedu.com/phrase/200604232134205.html" target=_new><u><font color=#0000ff>软件</font></u></a>包来有计划地操作 XML 文档</font></p>
<font face=Verdana>
<p><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JDOM是一个<a href="http://www.itisedu.com/phrase/200603091812115.html" target=_new><u><font color=#0000ff>开源</font></u></a>项目，它基于树型结构，利用纯JAVA的技术对XML文档实现解析、生成、序列化以及多种操作。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JDOM 直接为JAVA编程服务。它利用更为强有力的JAVA语言的诸多特性（方法重载、集合概念以及映射），把SAX和DOM的功能有效地结合起来。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Jdom是用Java语言读、写、操作XML的新API函数。Jason Hunter 和 Brett McLaughlin公开发布了它的1.0版本。在直觉、简单和高效的前提下，这些API函数被最大限度的优化。在接下来的篇幅里将介绍怎么用Jdom去读写一个已经存在的XML文档。</p>
<p><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在使用设计上尽可能地隐藏原来使用XML过程中的复杂性。利用JDOM处理XML文档将是一件轻松、简单的事。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JDOM 在2000年的春天被Brett McLaughlin和Jason Hunter开发出来，以弥补DOM及SAX在实际应用当中的不足之处。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这些不足之处主要在于SAX没有文档修改、随机访问以及输出的功能，而对于DOM来说，JAVA程序员在使用时来用起来总觉得不太方便。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DOM的缺点主要是来自于由于Dom是一个接口定义语言（IDL）,它的任务是在不同语言实现中的一个最低的通用标准，并不是为JAVA特别设计的。JDOM的最新版本为JDOM Beta 9。最近JDOM被收录到JSR-102内，这标志着JDOM成为了JAVA平台组成的一部分。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在 JDOM 中，XML 元素就是 Element 的实例，XML 属性就是 Attribute 的实例，XML 文档本身就是 Document 的实例。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 因为 JDOM 对象就是像 Document、Element 和 Attribute 这些类的直接实例，因此创建一个新 JDOM 对象就如在 Java 语言中使用 new 操作符一样容易。JDOM 的使用是直截了当的。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JDOM 使用标准的 Java 编码<a href="http://www.itisedu.com/phrase/200603061709535.html" target=_new><u><font color=#0000ff>模式</font></u></a>。只要有可能，它使用 Java new 操作符而不故弄玄虚使用复杂的工厂化模式，使对象操作即便对于初学用户也很方便。</p>
<p><br><strong>一、JDOM包概览</strong></p>
<p>JDOM是由以下几个包组成的</p>
<p>org.jdom包含了所有的xml文档要素的java类<br>org.jdom.adapters包含了与dom适配的java类<br>org.jdom.filter包含了xml文档的过滤器类<br>org.jdom.input包含了读取xml文档的类<br>org.jdom.output包含了写入xml文档的类<br>org.jdom.transform包含了将jdomxml文档接口转换为其他xml文档接口<br>org.jdom.xpath包含了对xml文档xpath操作的类</p>
<p><strong>二、JDOM类说明</strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、org.JDOM这个包里的类是你J解析xml<a href="http://www.itisedu.com/phrase/200602282323195.html" target=_new><u><font color=#0000ff>文件</font></u></a>后所要用到的所有数据<a href="http://www.itisedu.com/phrase/200603051002565.html" target=_new><u><font color=#0000ff>类型</font></u></a>。</p>
<p>Attribute<br>CDATA<br>Coment<br>DocType<br>Document<br>Element<br>EntityRef<br>Namespace<br>ProscessingInstruction<br>Text</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、org.JDOM.transform在涉及xslt格式转换时应使用下面的2个类</p>
<p>JDOMSource<br>JDOMResult<br>org.JDOM.input</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、输入类，一般用于文档的创建工作</p>
<p>SAXBuilder<br>DOMBuilder<br>ResultSetBuilder</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4、org.JDOM.output输出类，用于文档转换输出</p>
<p>XMLOutputter<br>SAXOutputter<br>DomOutputter<br>JTreeOutputter</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 使用前注意事项：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.JDOM对于JAXP以及TRax的支持</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JDOM支持JAXP1.1：你可以在程序中使用任何的parser工具类,默认情况下是JAXP的parser。<br>制定特别的parser可用如下形式<br>SAXBuilderparser<br>=newSAXBuilder("org.apache.crimson.parser.XMLReaderImpl");<br>Documentdoc=parser.build("http://www.cafeconleche.org/");<br>//workwiththedocument...<br>JDOM也支持TRaX：XSLT可通过JDOMSource以及JDOMResult类来转换（参见以后章节）</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.注意在JDOM里文档（Document）类由org.JDOM.Document来表示。这要与org.w3c.dom中的Document区别开，这2种格式如何转换在后面会说明。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 以下如无特指均指JDOM里的Document。</p>
<p><strong>三、JDOM主要使用方法</strong></p>
<p>1.Ducument类</p>
<p>(1)Document的操作方法：</p>
<p>Elementroot=newElement("GREETING");<br>Documentdoc=newDocument(root);<br>root.setText("HelloJDOM!");<br>或者简单的使用Documentdoc=newDocument(newElement("GREETING").setText("HelloJDOM!t"));<br>这点和DOM不同。Dom则需要更为复杂的代码，如下：<br>DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();<br>DocumentBuilderbuilder=factory.newDocumentBuilder();<br>Documentdoc=builder.newDocument();<br>Elementroot=doc.createElement("root");<br>Texttext=doc.createText("Thisistheroot");<br>root.appendChild(text);<br>doc.appendChild(root);<br>注意事项：JDOM不允许同一个节点同时被2个或多个文档相关联，要在第2个文档中使用原来老文档中的节点的话。首先需要使用detach()把这个节点分开来。</p>
<p>(2)从文件、流、系统ID、URL得到Document对象：</p>
<p>DOMBuilderbuilder=newDOMBuilder();<br>Documentdoc=builder.build(newFile("jdom_test.xml"));<br>SAXBuilderbuilder=newSAXBuilder();<br>Documentdoc=builder.build(url);<br>在新版本中DOMBuilder已经Deprecated掉DOMBuilder.builder(url)，用SAX效率会比较快。<br>这里举一个小例子，为了简单起见，使用String对象直接作为xml数据源：<br>PublicjdomTest(){<br>StringtextXml=null;<br>textXml="";<br>textXml=textXml+<br>"aaabbbcccddd";<br>textXml=textXml+"";<br>SAXBuilderbuilder=newSAXBuilder();<br>Documentdoc=null;<br>Readerin=newStringReader(textXml);<br>try{<br>doc=builder.build(in);<br>Elementroot=doc.getRootElement();<br>Listls=root.getChildren();//注意此处取出的是root节点下面的一层的Element集合<br>for(Iteratoriter=ls.iterator();iter.hasNext();){<br>Elementel=(Element)iter.next();<br>if(el.getName().equals("to")){<br>System.out.println(el.getText());<br>}<br>}<br>}<br>catch(IOExceptionex){<br>ex.printStackTrace();<br>}<br>catch(JDOMExceptionex){<br>ex.printStackTrace();<br>}<br>}<br>(3)DOM的document和JDOM的Document之间的相互转换使用方法，简单！<br>DOMBuilderbuilder=newDOMBuilder();<br>org.jdom.DocumentjdomDocument=builder.build(domDocument);<br>DOMOutputterconverter=newDOMOutputter();//workwiththeJDOMdocument&#8230;<br>org.w3c.dom.DocumentdomDocument=converter.output(jdomDocument);<br>//workwiththeDOMdocument&#8230;</p>
<p>2.XML文档输出</p>
<p>XMLOutPutter类：<br>JDOM的输出非常灵活,支持很多种io格式以及风格的输出<br>Documentdoc=newDocument(...);<br>XMLOutputteroutp=newXMLOutputter();<br>outp.output(doc,fileOutputStream);//Rawoutput<br>outp.setTextTrim(true);//Compressedoutput<br>outp.output(doc,socket.getOutputStream());<br>outp.setIndent("");//Prettyoutput<br>outp.setNewlines(true);<br>outp.output(doc,System.out);<br>详细请参阅最新的JDOMAPI手册</p>
<p>3.Element类：</p>
<p>(1)浏览Element树<br>Elementroot=doc.getRootElement();//获得根元素element<br>ListallChildren=root.getChildren();//获得所有子元素的一个list<br>ListnamedChildren=root.getChildren("name");//获得指定名称子元素的list<br>Elementchild=root.getChild("name");//获得指定名称的第一个子元素<br>JDOM给了我们很多很灵活的使用方法来管理子元素（这里的List是java.util.List）<br>ListallChildren=root.getChildren();<br>allChildren.remove(3);//删除第四个子元素<br>allChildren.removeAll(root.getChildren("jack"));//删除叫&#8220;jack&#8221;的子元素<br>root.removeChildren("jack");//便捷写法<br>allChildren.add(newElement("jane"));//加入<br>root.addContent(newElement("jane"));//便捷写法<br>allChildren.add(0,newElement("first"));</p>
<p>(2)移动Elements:<br>在JDOM里很简单<br>Elementmovable=newElement("movable");<br>parent1.addContent(movable);//place<br>parent1.removeContent(movable);//remove<br>parent2.addContent(movable);//add<br>在Dom里<br>Elementmovable=doc1.createElement("movable");<br>parent1.appendChild(movable);//place<br>parent1.removeChild(movable);//remove<br>parent2.appendChild(movable);//出错!<br>补充：纠错性<br>JDOM的Element构造函数（以及它的其他函数）会检查element是否合法。<br>而它的add/remove方法会检查树结构，检查内容如下：<br>1.在任何树中是否有回环节点<br>2.是否只有一个根节点<br>3.是否有一致的命名空间（Namespaces）</p>
<p>(3)Element的text内容读取</p>
<p>Acooldemo</p>
<p>//Thetextisdirectlyavailable<br>//Returns"\nAcooldemo\n"<br>Stringdesc=element.getText();<br>//There'saconvenientshortcut<br>//Returns"Acooldemo"<br>Stringdesc=element.getTextTrim();<br>(4)Elment内容修改<br>element.setText("Anewdescription");<br>3.可正确解释特殊字符<br>element.setText("</p>
<p><strong>四、JDOM的应用</strong></p>
<p>（一）、XML文档创建</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 我们由零开始利用JDOM生成一个XML文档。最后的结果(样本文档)看起来象这样：</p>
<p><br>kingwong</p>
<p>87654321</p>
<p>1.以 MyInfo 为根元素创建文档</p>
<p>Element rootElement = new Element("MyInfo");//所有的XML元素都是 Element 的实例。根元素也不例外：）<br>Document myDocument = new Document(rootElement);//以根元素作为参数创建Document对象。一个Document只有一个根，即root元素。</p>
<p>2.给根元素添加属性</p>
<p>Attribute rootAttri = new Attribute("comment","introduce myself");//创建名为 commnet,值为 introduce myself 的属性。<br>rootElement.setAttribute(rootAttri);//将刚创建的属性添加到根元素。<br>这两行代码你也可以合成一行来写，象这样：<br>rootElement.setAttribute(new Attribute("comment","introduce myself"));<br>或者<br>rootElement.setAttribute("comment","introduce myself");</p>
<p>3.添加元素和子元素</p>
<p>JDOM里子元素是作为 content（内容）添加到父元素里面去的,所谓content就是类似上面样本文档中之间的东东，即kingwong。罗嗦了点是吧：）<br>Element nameElement = new Element("name");//创建 name 元素<br>nameElement.addContent("kingwong");//将kingwong作为content添加到name元素<br>rootElement.addContent(nameElement);//将name元素作为content添加到根元素</p>
<p>这三行你也可以合为一句，象这样：<br>rootElement.addContent((Content)(new Element("name").addContent("kingwong")));//因为addContent(Content child)方法返回的是一个Parent接口，而Element类同时继承了Content类和实现了Parent接口，所以我们把它造型成Content。</p>
<p>我们用同样的方法添加带属性的子元素<br>rootElement.addContent(new Element("sex").setAttribute("value","male"));//注意这里不需要转型，因为addAttribute(String name,String value)返回值就是一个 Element。</p>
<p>同样的，我们添加元素到根元素下，用法上一样，只是稍微复杂了一些：<br>rootElement.addContent((Content)(new Element("contact").addContent((Content)(new Element("telephone").addContent("87654321")))));<br>如果你对这种简写形式还不太习惯，你完全可以分步来做，就象本节刚开始的时候一样。事实上如果层次比较多，写成分步的形式更清晰些，也不容易出错。</p>
<p>4.删除子元素</p>
<p>这个操作比较简单：<br>rootElement.removeChild("sex");//该方法返回一个布尔值</p>
<p>到目前为止，我们学习了一下JDOM文档生成操作。上面建立了一个样本文档，可是我们怎么知道对不对呢？因此需要输出来看一下。我们将JDOM生成的文档输出到控制台，使用 JDOM 的 XMLOutputter 类。</p>
<p>5. 将 JDOM 转化为 XML 文本</p>
<p>XMLOutputter xmlOut = new XMLOutputter(" ",true);<br>try {<br>xmlOut.output(myDocument,System.out);<br>} catch (IOException e) {<br>e.printStackTrace();<br>}<br>XMLOutputter 有几个格式选项。这里我们已指定希望子元素从父元素缩进两个空格，并且希望元素间有空行。<br>new XMLOutputter(java.lang.String indent, boolean newlines)这个方法在最新版本中已经不建议使用。JDOM有一个专门的用来定义格式化输出的类：org.jdom.output.Format，如果你没有特殊的要求，有时候使用里面的几个静态方法（应该可以说是预定义格式）如 getPrettyFormat()就可以了。我们把上面的输出格式稍微改一下，就象这样：<br>XMLOutputter xmlOut = new XMLOutputter(Format.getPrettyFormat()); </p>
<p>6.将JDOM文档转化为其他形式</p>
<p>XMLOutputter 还可输出到 Writer 或 OutputStream。为了输出JDOM文档到一个文本文件，我们可以这样做：<br>FileWriter writer = new FileWriter("/some/directory/myFile.xml");<br>outputter.output(myDocument, writer);<br>writer.close();</p>
<p>XMLOutputter 还可输出到字符串,以便程序后面进行再处理:<br>Strng outString = xmlOut.outputString(myDocument);</p>
<p>当然，在输出的时候你不一定要输出所有的整个文档，你可以选择元素进行输出：<br>xmlOut.output(rootElement.getChild("name"),System.out);<br>一句话，JDOM非常灵活方便！如果你想进一步研究JDOM，请到官方网站去看一看：http://www.jdom.org</p>
<p>本节示例源码：<br>package com.cyberobject.study;</p>
<p>import java.io.IOException;</p>
<p>import org.jdom.Attribute;<br>import org.jdom.Content;<br>import org.jdom.Document;<br>import org.jdom.Element;<br>import org.jdom.output.Format;<br>import org.jdom.output.XMLOutputter;</p>
<p>/**<br>* @author kingwong<br>*<br>* TODO To change the template for this generated <a href="http://www.itisedu.com/phrase/200604231258125.html" target=_new><u><font color=#0000ff>type</font></u></a> comment go to<br>* Window - Preferences - Java - Code Style - Code Templates<br>*/<br>public <a href="http://www.itisedu.com/phrase/200604231359565.html" target=_new><u><font color=#0000ff>class</font></u></a> TestJDOM {</p>
<p>public static void main(String[] args)<br>{<br>Element rootElement = new Element("MyInfo");<br>Document myDocument = new Document(rootElement);</p>
<p>// Attribute rootAttri = new Attribute("comment","introduce myself");<br>// rootElement.setAttribute(rootAttri);</p>
<p>rootElement.setAttribute("comment","introduce myself");<br>//rootElement.setAttribute(new Attribute("comment","introduce myself"));<br>// Element sexElement = new Element("sex");<br>// rootElement.addContent(sexElement);</p>
<p>// Element nameElement = new Element("name");<br>// nameElement.addContent("kingwong");<br>// rootElement.addContent(nameElement);</p>
<p>rootElement.addContent((Content)(new Element("name").addContent("kingwong")));<br>rootElement.addContent(new Element("sex").setAttribute("value","male"));<br>rootElement.addContent((Content)(new Element("contract").addContent((Content)(new Element("telephone").addContent("87654321")))));</p>
<p>rootElement.removeChild("sex");</p>
<p>XMLOutputter xmlOut = new XMLOutputter(Format.getPrettyFormat());<br>try {<br>xmlOut.output(myDocument,System.out);<br>//xmlOut.output(rootElement.getChild("name"),System.out);<br>//String outString = xmlOut.outputString(myDocument);<br>} catch (IOException e) {<br>e.printStackTrace();<br>}<br>}<br>}</p>
<p><br>（二）、XML文档解析</p>
<p>JDOM 不光可以很方便的建立XML文档，它的另一个用处是它能够读取并操作现有的 XML 数据。<br>JDOM的解析器在org.jdom.input.*这个包里，其中的DOMBuilder的功能是将DOM模型的Document解析成JDOM模型的Document；SAXBuilder的功能是从文件或流中解析出符合JDOM模型的XML树。由于我们经常要从一个文件里读取数据，因此我们应该采用后者作为解析工具。<br>解析一个xml文档，基本可以看成以下几个步骤：</p>
<p>1.实例化一个合适的解析器对象</p>
<p>本例中我们使用SAXBuilder:<br>SAXBuilder sb = new SAXBuilder();</p>
<p>2.以包含XML数据的文件为参数，构建一个文档对象myDocument</p>
<p>Document myDocument = sb.build(/some/directory/myFile.xml);</p>
<p>3.获到根元素</p>
<p>Element rootElement = myDocument.getRootElement();</p>
<p>一旦你获取了根元素，你就可以很方便地对它下面的子元素进行操作了，下面对Element对象的一些常用方法作一下简单说明：<br>getChild("childname") 返回指定名字的子节点,如果同一级有多个同名子节点，则只返回第一个；如果没有返回null值。<br>getChildren("childname") 返回指定名字的子节点List集合。这样你就可以遍历所有的同一级同名子节点。 <br>getAttributeValue("name") 返回指定属性名字的值。如果没有该属性则返回null,有该属性但是值为空，则返回空字符串。<br>getChildText("childname") 返回指定子节点的内容文本值。<br>getText() 返回该元素的内容文本值。</p>
<p>还有其他没有罗列出来的方法，如果需要的话，可以随时查阅JDOM的在线文档：http://www.jdom.org/docs/apidocs/index.html。当然你可以在你需要的地方添加、删除元素操作，还记得上面的创建XML的方法吗？呵呵~~~</p>
<p>学习新东东还是从实例学起最为快捷，下面简单举个例子，就以上面的XML样本代码来学习JDOM的XML解析。本例中读取了样本XML文件里一些属性和content，最后我们还在contact元素里插入了一个新元素wanghua@cyberobject.com" /&gt;。尽管我们实现了对于XML的基本操作，细心的朋友可能会<br>有疑问：如果XML文档的层次稍微复杂一些，如果嵌套多达几十上百层的话（开个玩笑），如果靠这样从根元素一级一级地通过getChild("childname")来访问子元素的话，将会非常痛苦！是的，的确是这样，但是我们有另一个有力的工具XPath，为什么不用呢？这是后话！先卖个关子（手敲累啦，下回吧，呵呵）。</p>
<p>/*<br>* Created on 2004-8-21<br>*<br>* TODO To change the template for this generated file go to<br>* Window - Preferences - Java - Code Style - Code Templates<br>*/<br>package com.cyberobject.study;</p>
<p>import org.jdom.Document;<br>import org.jdom.Element;<br>import org.jdom.input.SAXBuilder;<br>import org.jdom.output.Format;<br>import org.jdom.output.XMLOutputter;</p>
<p>/**<br>* @author kingwong<br>*<br>* TODO To change the template for this generated type comment go to<br>* Window - Preferences - Java - Code Style - Code Templates<br>*/<br>public class TestJDOM2 {<br>public static void main(String[] args){<br>SAXBuilder sb = new SAXBuilder();<br>try<br>{ <br>Document doc = sb.build("myFile.xml");<br>Element root = doc.getRootElement();</p>
<p>String str1 = root.getAttributeValue("comment");<br>System.out.println("Root Element's comment attribute is : " + str1);<br>String str2 = root.getChild("sex").getAttributeValue("value");<br>System.out.println("sex Element's value attribute is : " + str2);<br>String str3 = root.getChildText("name");<br>System.out.println("name Element's content is :" + str3);<br>String str4 = root.getChild("contact").getChildText("telephone");<br>System.out.println("contact Element's telephone subelement content is : " + str4 + "\n");<br>Element inputElement = root.getChild("contact"); <br>inputElement.addContent(new Element("email").setAttribute("value","wanghua@cyberobject.com"));</p>
<p>XMLOutputter xmlOut = new XMLOutputter(Format.getPrettyFormat());<br>String outStr = xmlOut.outputString(root);<br>System.out.println(outStr);<br>}<br>catch(Exception e)<br>{<br>e.printStackTrace();<br>}<br>}<br>}</p>
<p>&nbsp;</p>
<p></font></p><img src ="http://www.blogjava.net/mlh123caoer/aggbug/126177.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mlh123caoer/" target="_blank">草儿</a> 2007-06-25 18:33 <a href="http://www.blogjava.net/mlh123caoer/archive/2007/06/25/126177.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Groovy（ 一个属于JAVA平台的动态开发语言）与JAVA 的异同</title><link>http://www.blogjava.net/mlh123caoer/archive/2007/06/06/122454.html</link><dc:creator>草儿</dc:creator><author>草儿</author><pubDate>Wed, 06 Jun 2007 13:31:00 GMT</pubDate><guid>http://www.blogjava.net/mlh123caoer/archive/2007/06/06/122454.html</guid><wfw:comment>http://www.blogjava.net/mlh123caoer/comments/122454.html</wfw:comment><comments>http://www.blogjava.net/mlh123caoer/archive/2007/06/06/122454.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mlh123caoer/comments/commentRss/122454.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mlh123caoer/services/trackbacks/122454.html</trackback:ping><description><![CDATA[<div class=content style="PADDING-TOP: 3mm">
<p>Groovy tries to be as natural as possible for Java developers. We've tried to follow the principle of least surprise when designing Groovy, particularly for developers learning Groovy who've come from a Java background.</p>
<p>Here we list all the major differences between Java and Groovy.</p>
<div class=section_2>
<h2><a name=DifferencesfromJava-Defaultimports></a>Default imports</h2>
<p>All these packages and classes are imported by default, i.e. you do not have to use an explicit <tt>import</tt> statement to use them:</p>
<ul>
    <li>java.io.*
    <li>java.lang.*
    <li>java.math.BigDecimal
    <li>java.math.BigInteger
    <li>java.net.*
    <li>java.util.*
    <li>groovy.lang.*
    <li>groovy.util.* </li>
</ul>
</div>
<div class=section_2>
<h2><a name=DifferencesfromJava-Commongotchas></a>Common gotchas</h2>
<p>Here we list the common things you might trip over if you're a Java developer starting to use Groovy.</p>
<ul>
    <li>== means equals on all types. In Java there's a wierd part of the syntax where == means equality for primitive types and == means identity for objects. Since we're using autoboxing this would be very confusing for Java developers (since x == 5 would be mostly false if x was 5 <img class=emoticon height=20 alt="" src="http://docs.codehaus.org/images/icons/emoticons/smile.gif" width=20 align=absMiddle border=0></img>. So for simplicity == means equals() in Groovy. If you really need the identity, you can use the method "is" like foo.is(bar). This does not work on null, but you can still use == here: foo==null.
    <li>in is a keyword. So don't use it as a variable name.
    <li>When declaring array you can't write
    <div class=code>
    <div class=codeContent>
    <pre class=code-java><span class=code-object><font color=#910091>int</font></span>[] a = {1,2,3};</pre>
    </div>
    </div>
    <p>you need to write</p>
    <div class=code>
    <div class=codeContent>
    <pre class=code-java><span class=code-object><font color=#910091>int</font></span>[] a = [1,2,3]</pre>
    </div>
    </div>
    <li>If you were used to write a for loop which looked like
    <div class=code>
    <div class=codeContent>
    <pre class=code-java><span class=code-keyword><font color=#000091>for</font></span> (<span class=code-object><font color=#910091>int</font></span> i =0; i &lt; len; i++)</pre>
    </div>
    </div>
    <p>in groovy you need to write</p>
    <div class=code>
    <div class=codeContent>
    <pre class=code-java><span class=code-keyword><font color=#000091>for</font></span> (i in 0..len-1)</pre>
    </div>
    </div>
    <p>or</p>
    <div class=code>
    <div class=codeContent>
    <pre class=code-java><span class=code-keyword><font color=#000091>for</font></span> (i in 0..&lt;len)</pre>
    </div>
    </div>
    </li>
</ul>
</div>
<div class=section_2>
<h2><a name=DifferencesfromJava-Thingstobeawareof></a>Things to be aware of</h2>
<ul>
    <li>semicolon is optional. Use them if you like (though you must use them to put several statements on one line).
    <li>the return keyword is optional.
    <li>you can use the <em>this</em> keyword inside static methods (which refers to this class).
    <li>methods and classes are public by default.
    <li>protected in Groovy is the equivalent of both package-protected and protected in Java. i.e. you can have friends in the same package - or derived classes can also see protected members.
    <li>inner classes are not supported at the moment. In most cases you can use <a title=Closures href="http://groovy.codehaus.org/Closures"><font color=#2266cc>closures</font></a> instead.
    <li>the throws clause in method heads is not checked by the Groovy compiler, because there is no difference between checked and unchecked exceptions. </li>
</ul>
</div>
<div class=section_2>
<h2><a name=DifferencesfromJava-UncommonGotchas></a>Uncommon Gotchas</h2>
<p>Java programmers are used to semicolons terminating statements and not having <a title=Closures href="http://groovy.codehaus.org/Closures"><font color=#2266cc>closures</font></a>. Also there are instance initializers in class definitions. So you might see something like:</p>
<div class=code>
<div class=codeContent>
<pre class=code-java>class Trial {
<span class=code-keyword><font color=#000091>private</font></span> <span class=code-keyword><font color=#000091>final</font></span> Thing thing = <span class=code-keyword><font color=#000091>new</font></span> Thing ( ) ;
{ thing.doSomething ( ) ; }
}</pre>
</div>
</div>
<p>Many Groovy programmers eschew the use of semicolons as distracting and redundant (though others use them all the time - it's a matter of coding style). A situation that leads to difficulties is writing the above in Groovy as:</p>
<div class=code>
<div class=codeContent>
<pre class=code-java>class Trial {
<span class=code-keyword><font color=#000091>private</font></span> <span class=code-keyword><font color=#000091>final</font></span> thing = <span class=code-keyword><font color=#000091>new</font></span> Thing ( )
{ thing.doSomething ( ) }
}</pre>
</div>
</div>
<p>This will probably be a compile error!</p>
<p>The issue here is that in this situation the newline is not a statement terminator so the following block is treated as a <a title=Closures href="http://groovy.codehaus.org/Closures"><font color=#2266cc>closures</font></a>that is a parameter to the Thing constructor. Bizarre to many, but true. If you want to use instance initializers in this sort of way, it is effectively mandatory to have a semicolon:</p>
<div class=code>
<div class=codeContent>
<pre class=code-java>class Trial {
<span class=code-keyword><font color=#000091>private</font></span> <span class=code-keyword><font color=#000091>final</font></span> thing = <span class=code-keyword><font color=#000091>new</font></span> Thing ( ) ; {
thing.doSomething ( )
}</pre>
</div>
</div>
<p>This way the block following the initialized definition is clearly an instance initializer.</p>
</div>
<div class=section_2>
<h2><a name=DifferencesfromJava-NewfeaturesaddedtoGroovynotavailableinJava></a>New features added to Groovy not available in Java</h2>
<ul>
    <li><span class=nobr><a href="http://groovy.codehaus.org/closures"><font color=#2266cc>closures</font></a></span>
    <li>native <span class=nobr><a href="http://groovy.codehaus.org/collections"><font color=#2266cc>syntax</font></a></span> for lists and maps </li>
</ul>
<ul>
    <li><span class=nobr><a href="http://groovy.codehaus.org/GroovyMarkup"><font color=#2266cc>GroovyMarkup</font></a></span> and GPath support
    <li>native support for <span class=nobr><a href="http://groovy.codehaus.org/Regular+expressions"><font color=#2266cc>regular expressions</font></a></span>
    <li>polymorphic <span class=nobr><a href="http://groovy.codehaus.org/Looping"><font color=#2266cc>iteration</font></a></span> and powerful <span class=nobr><a href="http://groovy.codehaus.org/Logical+Branching"><font color=#2266cc>switch statement</font></a></span> </li>
</ul>
<ul>
    <li>dynamic and static typing is supported - so you can omit the type declarations on methods, fields and variables
    <li>you can embed expressions inside <span class=nobr><a href="http://groovy.codehaus.org/Strings"><font color=#2266cc>strings</font></a></span>
    <li>lots of new helper methods added to the <span class=nobr><a href="http://groovy.codehaus.org/groovy-jdk.html"><font color=#2266cc>JDK</font></a></span>
    <li>simpler syntax for writing <span class=nobr><a href="http://groovy.codehaus.org/Groovy+Beans"><font color=#2266cc>beans</font></a></span> for both properties and adding event listeners </li>
</ul>
<ul>
    <li><span class=nobr><a href="http://groovy.codehaus.org/Statements#Statements-Safenavigation"><font color=#2266cc>safe navigation</font></a></span>using the ?. operator, e.g. "variable?.field" and "variable?.method()" - no more nested ifs to check for null clogging up your code </li>
</ul>
</div>
</div><img src ="http://www.blogjava.net/mlh123caoer/aggbug/122454.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mlh123caoer/" target="_blank">草儿</a> 2007-06-06 21:31 <a href="http://www.blogjava.net/mlh123caoer/archive/2007/06/06/122454.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>生成一个java编制的可执行文件[1]</title><link>http://www.blogjava.net/mlh123caoer/archive/2007/05/01/114944.html</link><dc:creator>草儿</dc:creator><author>草儿</author><pubDate>Tue, 01 May 2007 09:04:00 GMT</pubDate><guid>http://www.blogjava.net/mlh123caoer/archive/2007/05/01/114944.html</guid><wfw:comment>http://www.blogjava.net/mlh123caoer/comments/114944.html</wfw:comment><comments>http://www.blogjava.net/mlh123caoer/archive/2007/05/01/114944.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mlh123caoer/comments/commentRss/114944.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mlh123caoer/services/trackbacks/114944.html</trackback:ping><description><![CDATA[<p>将java编织成.class后，如果只是用java 命令来执行总觉得不是太过瘾，找个办法生成像exe文件一样用鼠标双击便可执行的文件，应该是很有趣的啊。本文主要介绍了一种生成java可执行程序的方法。 </p>
<p>这里我用了一个名字叫做exe4j的免费小软件，感觉不错。下面我将我把java的.class文件生成可执行文件的流程讲一下。 </p>
<p>首先：将你要选择好你即将发布的.class文件就不用细说了，下面是创建jar文件，这里我用一个名字叫做test.class的文件来举例，另外注意还要编写一个确定main_class的文件manifest.mf，在这里mainfest.mf和test.class是在同一个目录下，然后使用如下命令 </p>
<p>jar cvfm test.jar manifest.mf test </p>
<p>这样，一个test.jar文件就生成了，这里我就不细说jar的具体功能了。但为了确保成功，我们可以再用下面的指令执行一下刚刚生成的test.jar： </p>
<p>java -jar test.jar </p>
<p>怎么样，是不是可以很顺利的进行？如果是，那我们就可以开始进行可执行文件的创建了。 </p>
<p>下面打开exe4j，它的开始一个界面是这样的： </p>
<p><a href="http://dev.csdn.net/Develop/ArticleImages/21/21845/CSDN_Dev_Image_2003-10-291439280.jpg">http://dev.csdn.net/Develop/ArticleImages/21/21845/CSDN_Dev_Image_2003-10-291439280.jpg</a> <br>单击NEXT键，选择&#8221;JAR in EXE&#8221;mod按钮，单击NEXT； </p>
<p><a href="http://dev.csdn.net/Develop/ArticleImages/21/21845/CSDN_Dev_Image_2003-10-291439282.jpg">http://dev.csdn.net/Develop/ArticleImages/21/21845/CSDN_Dev_Image_2003-10-291439282.jpg</a> <br>出现下面画面，填写短名和文件输出的路径然后点击NEXT继续 <br><a href="http://dev.csdn.net/Develop/ArticleImages/21/21845/CSDN_Dev_Image_2003-10-291439284.jpg">http://dev.csdn.net/Develop/ArticleImages/21/21845/CSDN_Dev_Image_2003-10-291439284.jpg</a> <br>你又会看到下面的画面，在这里你可以选择你要生成的可执行文件的类型，以及生成的可执行文件名称、可执行文件的图标等，我们在这里就选择GUI application，名字就根据自己的需要取一个，图标你可以自己在你的图标库里选一个你喜欢的，然后再NEXT再继续； </p>
<p>&nbsp;</p>
<p><a href="http://dev.csdn.net/Develop/ArticleImages/21/21845/CSDN_Dev_Image_2003-10-291439286.jpg">http://dev.csdn.net/Develop/ArticleImages/21/21845/CSDN_Dev_Image_2003-10-291439286.jpg</a> <br>下一个画面如下，在这里填写Main class的名字，单击下面的绿色+选择所需的.jar文件,如果没有特殊要求我们就可以再继续了； </p>
<p>&nbsp;</p>
<p><a href="http://dev.csdn.net/Develop/ArticleImages/21/21845/CSDN_Dev_Image_2003-10-291439288.jpg">http://dev.csdn.net/Develop/ArticleImages/21/21845/CSDN_Dev_Image_2003-10-291439288.jpg</a> <br>接下来是选择版本的画面，填写好自己的最大最小版本然后再继续 <br><a href="http://dev.csdn.net/Develop/ArticleImages/21/21845/CSDN_Dev_Image_2003-10-2914392810.jpg">http://dev.csdn.net/Develop/ArticleImages/21/21845/CSDN_Dev_Image_2003-10-2914392810.jpg</a> <br>下面这个画面可以帮助你设一下你的文件执行的片头，增加其美观效果，选择自己喜欢的图片，写自己想写的文字，并可以根据需要调整文字的位置，再继续 </p>
<p><br><a href="http://dev.csdn.net/Develop/ArticleImages/21/21845/CSDN_Dev_Image_2003-10-2914392812.jpg">http://dev.csdn.net/Develop/ArticleImages/21/21845/CSDN_Dev_Image_2003-10-2914392812.jpg</a> <br>下面是一个选择语言版本的界面选好后再继续 <br><a href="http://dev.csdn.net/Develop/ArticleImages/21/21845/CSDN_Dev_Image_2003-10-2914392814.jpg">http://dev.csdn.net/Develop/ArticleImages/21/21845/CSDN_Dev_Image_2003-10-2914392814.jpg</a> <br>下面是一个短暂的等待 <br><a href="http://dev.csdn.net/Develop/ArticleImages/21/21845/CSDN_Dev_Image_2003-10-2914392816.jpg">http://dev.csdn.net/Develop/ArticleImages/21/21845/CSDN_Dev_Image_2003-10-2914392816.jpg</a> <br>然后就大功告成了，一个java写成的可执行文件就这样生成了 <br><a href="http://dev.csdn.net/Develop/ArticleImages/21/21845/CSDN_Dev_Image_2003-10-2914392818.jpg">http://dev.csdn.net/Develop/ArticleImages/21/21845/CSDN_Dev_Image_2003-10-2914392818.jpg</a> <br>击一下看看效果，迎面而来的是自己设置的开头效果，感觉怎么样 <br><a href="http://dev.csdn.net/Develop/ArticleImages/21/21845/CSDN_Dev_Image_2003-10-2914392820.png">http://dev.csdn.net/Develop/ArticleImages/21/21845/CSDN_Dev_Image_2003-10-2914392820.png</a> </p><img src ="http://www.blogjava.net/mlh123caoer/aggbug/114944.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mlh123caoer/" target="_blank">草儿</a> 2007-05-01 17:04 <a href="http://www.blogjava.net/mlh123caoer/archive/2007/05/01/114944.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java 面试题</title><link>http://www.blogjava.net/mlh123caoer/archive/2007/03/09/102792.html</link><dc:creator>草儿</dc:creator><author>草儿</author><pubDate>Fri, 09 Mar 2007 04:56:00 GMT</pubDate><guid>http://www.blogjava.net/mlh123caoer/archive/2007/03/09/102792.html</guid><wfw:comment>http://www.blogjava.net/mlh123caoer/comments/102792.html</wfw:comment><comments>http://www.blogjava.net/mlh123caoer/archive/2007/03/09/102792.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mlh123caoer/comments/commentRss/102792.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mlh123caoer/services/trackbacks/102792.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 一、Java基础知识1.Java有那些基本数据类型，String是不是基本数据类型，他们有何区别。2.字符串的操作：  写一个方法，实现字符串的反转，如：输入abc，输出cba  写一个方法，实现字符串的替换，如：输入bbbwlirbbb，输出bbbhhtccc。3.数据类型之间的转换  如何将数值型字符转换为数字（Integer，Double）  如何将数字转换为字符  如何取小数点前两位，并四...&nbsp;&nbsp;<a href='http://www.blogjava.net/mlh123caoer/archive/2007/03/09/102792.html'>阅读全文</a><img src ="http://www.blogjava.net/mlh123caoer/aggbug/102792.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mlh123caoer/" target="_blank">草儿</a> 2007-03-09 12:56 <a href="http://www.blogjava.net/mlh123caoer/archive/2007/03/09/102792.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse 快捷键 指南</title><link>http://www.blogjava.net/mlh123caoer/archive/2007/03/09/102790.html</link><dc:creator>草儿</dc:creator><author>草儿</author><pubDate>Fri, 09 Mar 2007 04:46:00 GMT</pubDate><guid>http://www.blogjava.net/mlh123caoer/archive/2007/03/09/102790.html</guid><wfw:comment>http://www.blogjava.net/mlh123caoer/comments/102790.html</wfw:comment><comments>http://www.blogjava.net/mlh123caoer/archive/2007/03/09/102790.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mlh123caoer/comments/commentRss/102790.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mlh123caoer/services/trackbacks/102790.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 编辑																																																																																																																																																												作用域																							...&nbsp;&nbsp;<a href='http://www.blogjava.net/mlh123caoer/archive/2007/03/09/102790.html'>阅读全文</a><img src ="http://www.blogjava.net/mlh123caoer/aggbug/102790.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mlh123caoer/" target="_blank">草儿</a> 2007-03-09 12:46 <a href="http://www.blogjava.net/mlh123caoer/archive/2007/03/09/102790.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Set up an SQL realm with DB2 Express-C, Eclipse WTP, and WebSphere Application Server Community Edition V1.1（2）</title><link>http://www.blogjava.net/mlh123caoer/archive/2007/01/12/93456.html</link><dc:creator>草儿</dc:creator><author>草儿</author><pubDate>Fri, 12 Jan 2007 07:33:00 GMT</pubDate><guid>http://www.blogjava.net/mlh123caoer/archive/2007/01/12/93456.html</guid><wfw:comment>http://www.blogjava.net/mlh123caoer/comments/93456.html</wfw:comment><comments>http://www.blogjava.net/mlh123caoer/archive/2007/01/12/93456.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mlh123caoer/comments/commentRss/93456.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mlh123caoer/services/trackbacks/93456.html</trackback:ping><description><![CDATA[<p>
				<span class="atitle">Conclusion</span>
		</p>
		<a name="conclusion">
				<p>This tutorial showed you how to create an SQL realm and deploy a Web application that uses the realm. In this example, you used DB2 Express-C as the database and the Eclipse Web Tools Platform for the development environment to create an application and deploy it to WebSphere Application Server Community Edition for hosting the application.</p>
				<p>
						<a name="N1064E">
								<b>Acknowledgements</b>
						</a>
				</p>
				<p>The author would like to thank Manu T. George (WebSphere Application Server Community Edition L3 Support) and Anitha Krishnasamy (WebSphere Application Server Community Edition Business Development) for reviewing this tutorial and providing their valuable comments.</p>
				<p>
						<span class="atitle">
								<a name="download">Download</a>
						</span>
				</p>
				<p>
				</p>
				<table class="data-table-1" cellspacing="0" cellpadding="0" width="70%" border="0">
						<tbody>
								<tr>
										<th>Description</th>
										<th>Name</th>
										<th align="right">Size</th>
										<th>Download method</th>
								</tr>
								<tr>
										<td class="tb-row">Sample code for this tutorial</td>
										<td nowrap="">sample-db2-realm.zip</td>
										<td nowrap="" align="right">28KB</td>
										<td nowrap="">
												<a class="fbox" href="http://www.ibm.com/developerworks/views/download.jsp?contentid=160154&amp;filename=sample-db2-realm.zip&amp;method=http&amp;locale=worldwide">
														<b>
																<font color="#002c99">HTTP</font>
														</b>
												</a>
										</td>
								</tr>
						</tbody>
				</table>
				<br />
				<p>
						<a name="resources">
								<span class="atitle">Resources</span>
						</a>
				</p>
				<p>
						<b>Learn</b>
						<br />
				</p>
				<ul>
						<li>
								<a href="http://www.ibm.com/developerworks/edu/j-dw-java-kickstart-i.html?S_TACT=105AGX01&amp;S_CMP=SIMPLE">
										<font color="#002c99">Kick-start your Java apps</font>
								</a>
								<br />
								<br />
						</li>
						<li>
								<a href="http://www.ibm.com/developerworks/websphere/zones/was/wasce.html">
										<font color="#002c99">WebSphere Application Server Community Edition resources</font>
								</a>
						</li>
				</ul>
				<p>
						<br />
						<b>Get products and technologies</b>
						<br />
				</p>
				<ul>
						<li>
								<a href="http://www.ibm.com/developerworks/downloads/ws/wasce/?S_TACT=105AGX10&amp;S_CMP=WSDD">
										<font color="#002c99">Download WebSphere Application Server Community Edition V1.1</font>
								</a>
								<br />
								<br />
						</li>
						<li>
								<a href="http://www.ibm.com/developerworks/downloads/im/udbexp/?S_TACT=105AGX10&amp;S_CMP=WSDD">
										<font color="#002c99">Download DB2 Express-C</font>
								</a>
								<br />
								<br />
						</li>
						<li>
								<a href="http://www.eclipse.org/downloads/">
										<font color="#002c99">Download Eclipse</font>
								</a>
								<br />
								<br />
								<p>
										<a name="author">
												<span class="atitle">About the author</span>
										</a>
								</p>
								<table cellspacing="0" cellpadding="0" width="70%" border="0">
										<tbody>
												<tr>
														<td colspan="3">
																<img height="5" alt="" src="https://www.ibm.com/i/c.gif" width="100%" />
														</td>
												</tr>
												<tr valign="top" align="left">
														<td>
																<p>
																		<img height="80" alt="" src="http://www.ibm.com/developerworks/i/p-kbalachandar.jpg" width="64" align="left" />
																</p>
														</td>
														<td>
																<img height="5" alt="" src="https://www.ibm.com/i/c.gif" width="4" />
														</td>
														<td width="100%">
																<p>
																		<b>Krishnakumar Balachandar</b> is a senior staff software engineer at IBM Software labs in Bangalore, India. He is part of the support team for Geronimo and WebSphere Community Edition. </p>
														</td>
												</tr>
										</tbody>
								</table>
						</li>
				</ul>
		</a><img src ="http://www.blogjava.net/mlh123caoer/aggbug/93456.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mlh123caoer/" target="_blank">草儿</a> 2007-01-12 15:33 <a href="http://www.blogjava.net/mlh123caoer/archive/2007/01/12/93456.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Set up an SQL realm with DB2 Express-C, Eclipse WTP, and WebSphere Application Server Community Edition V1.1（一）</title><link>http://www.blogjava.net/mlh123caoer/archive/2007/01/12/93407.html</link><dc:creator>草儿</dc:creator><author>草儿</author><pubDate>Fri, 12 Jan 2007 05:37:00 GMT</pubDate><guid>http://www.blogjava.net/mlh123caoer/archive/2007/01/12/93407.html</guid><wfw:comment>http://www.blogjava.net/mlh123caoer/comments/93407.html</wfw:comment><comments>http://www.blogjava.net/mlh123caoer/archive/2007/01/12/93407.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mlh123caoer/comments/commentRss/93407.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mlh123caoer/services/trackbacks/93407.html</trackback:ping><description><![CDATA[<p>
				<a href="https://www6.software.ibm.com/developerworks/education/websphere/0609_balachandar/authors.html">
						<font color="#5c81a7">Krishnakumar Balachandar</font>
				</a> (<a href="mailto:krishnakumarb@in.ibm.com?subject=Set up an SQL realm with DB2 Express-C, Eclipse WTP, and WebSphere Application Server Community Edition V1.1"><font color="#5c81a7">krishnakumarb@in.ibm.com</font></a>), Software Engineer, WebSphere Application Server Community Edition Support Team, IBM<br /></p>
		<p>20 Sep 2006</p>
		<blockquote>This tutorial shows you how to set up an SQL realm to implement database security for a Web application using the no-charge Java kick-start package.</blockquote>
		<!--START RESERVED FOR FUTURE USE INCLUDE FILES-->
		<script language="JavaScript" type="text/javascript">
				<!--
if (document.referrer&&document.referrer!="") { 
   // document.write(document.referrer);
   var q = document.referrer;
   var engine = q;
   var isG = engine.search(/google\.com/i);
   var searchTerms;
   //var searchTermsForDisplay;
   if (isG != -1) { 
	   var i = q.search(/q=/);
	   var q2 = q.substring(i+2);
	   var j = q2.search(/&/);
	   j = (j == -1)?q2.length:j;
	   searchTerms = q.substring(i+2,i+2+j);
	   if (searchTerms.length != 0) {
	       searchQuery(searchTerms);
	       document.write("<div id=\"contents\"></div>");
	   }
   } 
}
//-->
		</script>
		<!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
		<p>
				<span class="atitle">Before you start</span>
		</p>
		<p>When implementing security in a Web application, a JAAS module is required to specifically handle user authentication and authorization. WebSphere Application Server Community Edition provides a SQL realm that can connect to a database for obtaining user credentials. In this tutorial, you will see how to set up tables for creating an SQL realm in DB2 Express-C, how to set up a development environment using the Eclipse Web Tooling Platform to create a Web application, and how to deploy the Web application to WebSphere Application Server Community Edition from Eclipse.</p>
		<p>All Web applications should employ some level of security for user authentication and authorization to verify a user’s identity and enable access to application functions that are applicable to the user's role.</p>
		<p>Web applications can use LDAP, database, file system, Kerberos, or other such systems to provide authentication and authorization. To access security data from the selected method or system, an SQL realm is set up by creating tables in a database and configuring a Java Authentication and Authorization Service (JAAS) module to access these tables from an application server. </p>
		<p>Figure 1 shows different components in WebSphere Application Server Community Edition (hereafter referred to as Community Edition) used to provide an SQL realm. The Web application uses an SQL realm that connects to the database using a pool or driver. The user credentials are stored in tables in the database and are fetched when calls are made using the JAAS SQL realm.</p>
		<br />
		<a name="fig1">
				<b>Figure 1. Components of an SQL realm</b>
		</a>
		<br />
		<img height="236" alt="Figure 1. Components of an SQL realm" src="https://www6.software.ibm.com/developerworks/education/websphere/0609_balachandar/images/figure1.gif" width="474" />
		<br />
		<table cellspacing="0" cellpadding="0" width="40%" align="right" border="0">
				<tbody>
						<tr>
								<td width="10">
										<img height="1" alt="" src="https://www.ibm.com/i/c.gif" width="10" />
								</td>
								<td>
										<table cellspacing="0" cellpadding="5" width="100%" border="1">
												<tbody>
														<tr>
																<td bgcolor="#eeeeee">Java Authentication and Authorization Service (JAAS) is a set of APIs that enables Java applications to access authentication and access control services without being tied to the service it is using. Using JAAS, the Java application can plug into security mechanisms like LDAP, Kerberos, databases, and so on, providing a layer between our application and the security mechanism being used.</td>
														</tr>
												</tbody>
										</table>
								</td>
						</tr>
				</tbody>
		</table>
		<p>
				<a name="N100BF">
						<span class="smalltitle">
								<strong>
										<font face="Arial">Setting up a database realm</font>
								</strong>
						</span>
				</a>
		</p>
		<p>Setting up a database realm involves performing these general steps: 
</p>
		<ul>
				<li>Create tables for users and groups in DB2 Express-C. 
</li>
				<li>Deploy a database pool in Community Edition, if the realm is going to use a pool to connect to the database. 
</li>
				<li>Deploy the SQL realm plan in Community Edition. 
</li>
				<li>Configure and deploy the Web application that uses the SQL realm. </li>
		</ul>
		<p>
		</p>
		<p>The remainder of this tutorial explains these tasks in detail.<br /></p>
		<p>
				<span class="atitle">Setting up a database</span>
		</p>
		<a name="setdb">
				<p>In this section, you will see how to set up the database and database tables required for the SQL realm. You can create database and tables either by using the Control Center or by running an SQL script.</p>
				<p>
						<a name="N100EA">
								<span class="smalltitle">
										<strong>
												<font face="Arial">Using the Control Center</font>
										</strong>
								</span>
						</a>
				</p>
				<p>
						<a name="N100F1">
								<strong>Create the database</strong>
						</a>
				</p>
				<ol>
						<li>In DB2 Express-C, open the Control Center. 
</li>
						<li>Right-click <b>All Databases</b>, then select <b>Create Database</b> =&gt; <b>Standard</b>. 
</li>
						<li>For Database name, enter <code>WASCE</code>. 
</li>
						<li>Click <b>Finish</b>. </li>
				</ol>
				<p>You just created a new database called WASCE and should see it listed under All Databases (Figure 2).</p>
				<p>
						<br />
						<a name="fig2">
								<b>Figure 2. New database created</b>
						</a>
						<br />
						<img height="375" alt="Figure 2. New database created" src="https://www6.software.ibm.com/developerworks/education/websphere/0609_balachandar/images/figure2.jpg" width="500" />
						<br />
						<br />
				</p>
				<table cellspacing="0" cellpadding="0" width="100%" border="0">
						<tbody>
								<tr>
										<td>
												<img height="1" alt="" src="https://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" />
										</td>
								</tr>
						</tbody>
				</table>
				<table class="no-print" cellspacing="0" cellpadding="0" align="right">
						<tbody>
								<tr align="right">
										<td>
												<table cellspacing="0" cellpadding="0" border="0">
														<tbody>
																<tr>
																		<td valign="center">
																				<img height="16" alt="" src="https://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" />
																				<br />
																		</td>
																		<td valign="top" align="right">
																				<a class="fbox" href="https://www6.software.ibm.com/developerworks/education/websphere/0609_balachandar/section2.html#main">
																						<b>
																								<font color="#996699" size="2">Back to top</font>
																						</b>
																				</a>
																		</td>
																</tr>
														</tbody>
												</table>
										</td>
								</tr>
						</tbody>
				</table>
				<br />
				<br />
				<p>
						<a name="N10129">
								<span class="smalltitle">
										<strong>
												<font face="Arial">Create tables</font>
										</strong>
								</span>
						</a>
				</p>
				<p>Now, create the tables for users (USERS) and groups (GROUPS) in the new WASCE database: 
</p>
				<ol>
						<li>Under WASCE in the directory listing, right-click <b>Tables</b>, then select <b>Create</b>. 
</li>
						<li>For Table name, enter <code>USERS</code>, then click <b>Next</b>. 
</li>
						<li>Add a column: 
<ol type="a"><li>Select <b>Add</b> to add a column to the new table. 
</li><li>For Column name, enter <code>USERNAME</code>. 
</li><li>For Data type, select <b>VARCHAR</b>. 
</li><li>For Nullable or not, select <b>No</b>. 
</li><li>Click <b>Apply</b>. </li></ol></li>
						<li>Repeat step 3 to add an <code>EMAIL</code> column and a <code>PASSWORD</code> column to the USERS table, with the values shown in Figure 3. When finished, click <b>OK</b>. 
</li>
						<li>Repeat steps 1 through 4 to create a new <code>GROUPS</code> table with two columns: <code>GROUPNAME</code> and <code>USERNAME</code>. 
</li>
						<li>Click <b>Next =&gt; Next =&gt; Next</b> to get to the Define keys on new table panel. 
</li>
						<li>Select <b>Add Primary</b>. From the available columns, select which column is to be the primary key for each table: 
<ol type="a"><li>For the USERS table, select <b>USERNAME</b>, and for the GROUPS table, select <b>USERNAME/GROUPNAME </b>as the primary key. 
</li><li>For the GROUPS table, select <b>Add foreign =&gt; USERNAME</b>. Click the <b>&gt;</b> button to move it to foreign key. Select <b>USERNAME</b> as the primary key in the Parent table (Schema/Name - ADMINISTRATOR/USERS). </li></ol></li>
						<li>Click <b>Finish</b> and the table is created. </li>
				</ol>
				<p>
				</p>
				<p>Use the steps above and the schema definitions shown in Figures 3 and 4 to create the USERS and GROUPS tables. For the USERS table, USERNAME is the primary key. For the GROUPS table, GROUPNAME and USERNAME are primary keys, and USERNAME is a foreign key (referring to USERNAME in the USERS table). </p>
				<p>
						<br />
						<a name="fig3">
								<b>Figure 3. USERS schema</b>
						</a>
						<br />
						<img height="375" alt="Figure 3. USERS schema" src="https://www6.software.ibm.com/developerworks/education/websphere/0609_balachandar/images/figure3.jpg" width="500" />
						<br />
						<br />
						<a name="fig4">
								<b>Figure 4. GROUPS schema</b>
						</a>
						<br />
						<img height="375" alt="Figure 4. GROUPS schema" src="https://www6.software.ibm.com/developerworks/education/websphere/0609_balachandar/images/figure4.jpg" width="500" />
						<br />
				</p>
				<p>In the steps shown above, the USERS and GROUPS tables are created under the ADMINISTRATOR schema. Had you logged in as db2admin, the tables would be created under the DB2ADMIN schema.</p>
				<p>
						<a name="N101DB">
								<b>Populate tables with values</b>
						</a>
				</p>
				<ol>
						<li>Select <b>WASCE =&gt; Tables =&gt; USERS</b>. 
</li>
						<li>Right-click on the <b>USERS</b> table, then select <b>Open =&gt; Add row</b>. 
</li>
						<li>Enter test values for each field in the database record, then select <b>Commit</b>. 
</li>
						<li>Repeat steps 2 and 3 for each test record you wish to create, then <b>Close</b>. 
</li>
						<li>Repeat steps 1 through 4 for the GROUPS table (Figure 5). </li>
				</ol>
				<p>
						<br />
						<a name="fig5">
								<b>Figure 5. Create test data records</b>
						</a>
						<br />
						<img height="462" alt="Figure 5. Create test data records" src="https://www6.software.ibm.com/developerworks/education/websphere/0609_balachandar/images/figure5.jpg" width="500" />
						<br />
				</p>
				<p>
						<a name="N10212">
								<b>Using scripts</b>
						</a>
				</p>
				<p>As an alternative to using the DB2 Control Center, you can create the database, tables, and test data using an SQL script. The download file included with this tutorial contains a sanmple script file, db2_realm.sql. Execute this script from DB2 command line to create the database and tables: 
</p>
				<ol>
						<li>Open a Windows command window or run the DB2 batch file <code>/<i>&lt;db2 install directory&gt;</i>bin/db2cw.bat</code>. 
</li>
						<li>Execute the sample script file with this command: <code>db2 -tvfdb2-realm.sql</code>. </li>
				</ol>
				<p>
				</p>
				<p>If there are no errors, success messages will be generated for the SQL (Figure 6).</p>
				<p>
						<br />
						<a name="fig6">
								<b>Figure 6. Create database, tables, and test data using script</b>
						</a>
						<br />
						<img height="462" alt="Figure 6. Create database, tables, and test data using script" src="https://www6.software.ibm.com/developerworks/education/websphere/0609_balachandar/images/figure6.jpg" width="500" />
						<br />
				</p>
				<p>
						<span class="atitle">Creating the Web application</span>
				</p>
				<a name="webapp">
						<p>In this section, you will use the Eclipse Web Tools Platform (WTP) to create a simple Web application. Before you begin with the application, though, you will need to define a new server in Eclipse (to which the new application will be deployed) and create a Java Runtime Environment (JRE). After that, you can use Eclipse WTP to create the application components (like the WAR and EAR files). The download file included with this tutorial contains a source EAR file of a sample application that you can import into Eclipse WTP.</p>
						<p>
								<a name="N10251">
										<b>Define a new server</b>
								</a>
						</p>
						<p>To deploy an application, you need to define a server in Eclipse: 
</p>
						<ol>
								<li>In Eclipse, right-click the <b>Server</b> tab, and select <b>New Server</b> to open the New Server wizard (Figure 7). <br /><br /><a name="fig7"><b>Figure 7. Define new server</b></a><br /><img height="529" alt="Figure 7. Define new server" src="https://www6.software.ibm.com/developerworks/education/websphere/0609_balachandar/images/figure7.jpg" width="496" /><br /><br /></li>
								<li>Select <b>WebSphere Application Server Community v1.1 Server</b>, then press <b>Next.</b></li>
								<li>Enter values for all fields, as shown in Figure 8, then <b>Finish</b>. <br /><br /><a name="fig8"><b>Figure 8. New server parameters</b></a><br /><img height="329" alt="Figure 8. New server parameters" src="https://www6.software.ibm.com/developerworks/education/websphere/0609_balachandar/images/figure8.jpg" width="498" /><br /><br /></li>
						</ol>
						<p>
						</p>
						<p>
								<a name="N10294">
										<b>Create a JRE</b>
								</a>
						</p>
						<p>To build application for supported Java Runtime Environment (JRE), in this case the IBM JRE, you need to configure the JRE in Eclipse WTP: 
</p>
						<ol>
								<li>In Eclipse, select <b>Window =&gt; Preferences</b>. 
</li>
								<li>Select <b>Java =&gt; Installed JREs</b>. 
</li>
								<li>Click <b>Add. . . </b></li>
								<li>On the Add JRE dialog, enter values for all fields, as shown in Figure 9. <br /><br /><a name="fig9"><b>Figure 9. Add JRE </b></a><br /><img height="375" alt="Figure 9. Add JRE" src="https://www6.software.ibm.com/developerworks/education/websphere/0609_balachandar/images/figure9.jpg" width="500" /><br /><br /></li>
								<li>Be sure this JRE is selected as the default JRE. 
</li>
								<li>Next, you need to make sure that the IBM JRE will run the new server that you created earlier. Right-click on the new server, then select <b>Open</b> (Figure 10). <br /><br /><a name="fig10"><b>Figure 10. Open new server</b></a><br /><img height="375" alt="Figure 10. Open new server" src="https://www6.software.ibm.com/developerworks/education/websphere/0609_balachandar/images/figure10.jpg" width="500" /><br /><br /></li>
								<li>Next to Runtime, select <b>Edit</b>. 
</li>
								<li>For JRE, select <b>IBM</b> (Figure 11), then <b>Finish.</b><br /><br /><a name="fig11"><b>Figure 11. Select IBM JRE </b></a><br /><img height="375" alt="Figure 11. Select IBM JRE " src="https://www6.software.ibm.com/developerworks/education/websphere/0609_balachandar/images/figure11.jpg" width="500" /><br /><br /></li>
						</ol>
						<p>
						</p>
						<p>
								<a name="N102FB">
										<b>Develop an application</b>
								</a>
						</p>
						<p>The Web application will contain pages for the application (in a WAR file) and will be added to an enterprise application (in an EAR file). For the purposes of this tutorial, you can either use an application you develop from scratch, or you can use the sample application included in the download file.</p>
						<p>
								<a name="N10305">
										<b>Create a new application in Eclipse WTP</b>
								</a>
						</p>
						<ol>
								<li>Run Eclipse WTP either by double-clicking eclipse.exe from the location where you extracted the WTP platform, or by executing eclipse.exe from a command line. 
</li>
								<li>Select <b>File =&gt; New =&gt; Project =&gt; Web =&gt;Dynamic Web Project</b>. 
</li>
								<li>On the Dynamic Web Project dialog, enter or select the following values: 
<ul><li>Project name: <code>SQLRealmWeb</code></li><li>Target runtime: <b>WebSphere Community Edition v1.1</b></li><li>EAR membership: <code>SQLRealmApp</code></li></ul></li>
								<li>If you need to create a WebSphere Application Server Community Edition V1.1 runtime option (Figure 12): 
<ol type="a"><li>Click the <b>New</b> button next to Target Runtime. 
</li><li>Select <b>WebSphere Application Server Community Edition v1.1</b>, then <b>Next</b>. 
</li><li>Select <b>IBM</b> for JRE, and browse to the appropriate Application Server Install Directory, then click <b>Finish</b>. <br /><br /><a name="fig12"><b>Figure 12. Create Community Edition runtime</b></a><br /><img height="375" alt="Figure 12. Create Community Edition runtime" src="https://www6.software.ibm.com/developerworks/education/websphere/0609_balachandar/images/figure12.jpg" width="500" /><br /><br /></li></ol></li>
								<li>Click <b>Next</b> on the next two panels. 
</li>
								<li>For Context Root, enter <code>/SQLRealmWeb</code>, then <b>Next</b>. 
</li>
								<li>Configure the Geronimo deployment plan by entering these values: 
<ul><li>Group ID: <code>wasce</code></li><li>Artifact ID: <code>sqlrealm</code></li><li>Version: <code>1.0</code></li><li>Artifact Type: WAR </li></ul></li>
								<li>Click <b>Finish</b> (Figure13). <br /><br /><a name="fig13"><b>Figure 13. Server setup complete</b></a><br /><img height="375" alt="Figure 13. Server setup complete" src="https://www6.software.ibm.com/developerworks/education/websphere/0609_balachandar/images/figure13.jpg" width="500" /><br /><br /></li>
						</ol>
						<p>
								<a name="N103A3">
										<b>Import sample application into Eclipse WTP</b>
								</a>
						</p>
						<p>If you choose to import the sample project, the <a href="https://www6.software.ibm.com/developerworks/education/websphere/0609_balachandar/downloads.html"><font color="#5c81a7">download file</font></a> included with this tutorial contains an EAR file you can import into the Eclipse WTP workspace: 
</p>
						<ol>
								<li>In Eclipse, select <b>File =&gt; Import =&gt; J2EE</b>. 
</li>
								<li>For Source File, enter <code>SQLRealmAppSrc</code>.ear, then click <b>Next</b>. 
</li>
								<li>Enter or select the following values: 
<ul><li>EAR Project: <code>SQLRealmApp</code></li><li>Web Project: <code>SQLRealmWeb</code></li><li>Target Runtime: <b>WebSphere Community Edition v1.1</b></li></ul></li>
								<li>If you need to create a WebSphere Application Server Community Edition V1.1 runtime option (Figure 12): 
<ol type="a"><li>Click the <b>New</b> button next to Target Runtime. 
</li><li>Select <b>WebSphere Application Server Community Edition v1.1</b>, then <b>Next</b>. 
</li><li>Select <b>IBM</b> for JRE, and browse to the appropriate Application Server Install Directory, then click <b>Finish</b>. </li></ol></li>
								<li>Click <b>Finish</b>. </li>
						</ol>
						<p>
								<span class="atitle">Deploying the application</span>
						</p>
						<a name="deploy">
								<p>With the application created, you can deploy it to the Community Edition runtime environment. However, for the application to run, you need a database pool and realm plan:</p>
								<p>
										<a name="N10412">
												<b>Deploy the database pool</b>
										</a>
								</p>
								<p>To connect to DB2, you need a database pool, which you can create by deploying a database pool plan with the wizard that is available from the Community Edition administrative console: 
</p>
								<ol>
										<li>Logon to the Community Edition administrative console by starting the server. To start the server, right-click on the new server you created above, and select <b>Start</b>. Once the server is started, the status changes to green and shows "Started". You can now launch the console by right-clicking on the started server and selecting <b>Launch Community Edition Console</b>. Enter your username and password as <code>system</code> and <code>manager</code>. 
</li>
										<li>Under Services, select <b>Database Pools</b> =&gt; <b>Using Geronimo PoolsWizard</b>. 
</li>
										<li>For Database Pools, enter <code>Db2Realm</code>, then <b>Next</b>. 
</li>
										<li>On the Select Driver, JAR, Parameters panel, enter or select the values shown for all fields in Figure 14. When finished, click <b>Next</b>. <br /><br /><a name="fig14"><b>Figure 14. Enter database pool parameters</b></a><br /><img height="349" alt="Figure 14. Enter database pool parameters" src="https://www6.software.ibm.com/developerworks/education/websphere/0609_balachandar/images/figure14.jpg" width="500" /><br /><br /></li>
										<li>Test the connection for errors by selecting <b>Test connection</b>. If there are no errors, you will see the message: <code>Test Result: Connected to DB2/NT SQL09000 in the console.</code></li>
										<li>Once you deploy the pool, it is started and running (Figure 15). <br /><br /><a name="fig15"><b>Figure 15. Database pool deployed</b></a><br /><img height="375" alt="Figure 15.  Database pool deployed" src="https://www6.software.ibm.com/developerworks/education/websphere/0609_balachandar/images/figure15.jpg" width="500" /><br /><br /></li>
								</ol>
								<p>
								</p>
								<p>
										<a name="N10474">
												<b>Deploy the realm plan</b>
										</a>
								</p>
								<p>Community Edition connects to SQL databases using JAAS, by default, to provide an SQL realm to applications deployed in the server. You can make this connection by using a JDBC driver that connects directly to the database, or by using a database pool that gets a connection from a pool to connect to the database.</p>
								<p>The realm plan (see <a href="https://www6.software.ibm.com/developerworks/education/websphere/0609_balachandar/section4.html#listing1"><font color="#996699">Listings 1</font></a> and <a href="https://www6.software.ibm.com/developerworks/education/websphere/0609_balachandar/section4.html#listing2"><font color="#996699">2</font></a>) is used to deploy an SQL realm that connects to the database. The realm plan contains Geronimo GBeans required to create an SQL realm. The GBean "sql-login" has attributes that you use to specify the realm type, <code>loginModuleClass = org.apache.geronimo.security.realm.providers.SQLLoginModule</code>, and options where you specify the JDBC properties required to connect to the database. You can use this plan to connect to any JDBC database. For this exercise, you can specify either the JDBC driver or the DataSource name to connect to the database.</p>
								<p>
										<a name="N1048D">
												<b>Using the JDBC driver</b>
										</a>
								</p>
								<p>Listing 1 shows an SQL realm plan that uses the JDBC driver to connect to database. The plan is contained in the download file as sqlplan.xml. In the statements that are bold in Listing 1, replace ADMINISTRATORS with the schema name in which the tables have been created.</p>
								<p>
										<br />
										<a name="listing1">
												<b>Listing 1. SQL realm plan using JDBC driver</b>
										</a>
										<br />
								</p>
								<table cellspacing="0" cellpadding="0" width="100%" border="0">
										<tbody>
												<tr>
														<td class="code-outline">
																<pre class="displaycode">                    
&lt;module xmlns="http://geronimo.apache.org/xml/ns/deployment-1.1"&gt;
  &lt;environment&gt;
    &lt;moduleId&gt;
      &lt;groupId&gt;db2&lt;/groupId&gt;
      &lt;artifactId&gt;realm&lt;/artifactId&gt;
      &lt;version&gt;1.0&lt;/version&gt;
      &lt;type&gt;car&lt;/type&gt;
    &lt;/moduleId&gt;
    &lt;dependencies&gt;
      &lt;dependency&gt;
        &lt;groupId&gt;geronimo&lt;/groupId&gt;
        &lt;artifactId&gt;j2ee-security&lt;/artifactId&gt;
        &lt;version&gt;1.1&lt;/version&gt;
        &lt;type&gt;car&lt;/type&gt;
      &lt;/dependency&gt;
      &lt;dependency&gt;
        &lt;groupId&gt;console.dbpool&lt;/groupId&gt;
        &lt;artifactId&gt;DB2Realm&lt;/artifactId&gt;
        &lt;version&gt;1.0&lt;/version&gt;
        &lt;type&gt;rar&lt;/type&gt;
      &lt;/dependency&gt;
    &lt;/dependencies&gt;
    &lt;hidden-classes/&gt;
    &lt;non-overridable-classes/&gt;
  &lt;/environment&gt;
  &lt;gbean name="sql-login" class="org.apache.geronimo.security.jaas.LoginModuleGBean"&gt;
    &lt;attribute name="loginModuleClass"&gt;org.apache.geronimo.
        security.realm.providers.SQLLoginModule&lt;/attribute&gt;
    &lt;attribute name="serverSide"&gt;true&lt;/attribute&gt;
    &lt;attribute name="options"&gt;jdbcUser=db2admin
      jdbcPassword=db2admin
      jdbcURL=jdbc:db2:WASCE
      jdbcDriver=com.ibm.db2.jcc.DB2Driver
      userSelect=select username, password from ADMINISTRATOR.USERS
      groupSelect=select groupname, username from ADMINISTRATOR.GROUPS&lt;/attribute&gt;
    &lt;attribute name="loginDomainName"&gt;sql-realm&lt;/attribute&gt;
  &lt;/gbean&gt;
  &lt;gbean name="sql-realm" class="org.apache.geronimo.security.realm.GenericSecurityRealm"&gt;
    &lt;attribute name="realmName"&gt;sql-realm&lt;/attribute&gt;
    &lt;reference name="LoginModuleConfiguration"&gt;
      &lt;name&gt;sql-login&lt;/name&gt;
    &lt;/reference&gt;
    &lt;reference name="ServerInfo"&gt;
      &lt;name&gt;ServerInfo&lt;/name&gt;
    &lt;/reference&gt;

    &lt;!--Add--&gt;
    &lt;reference name="LoginService"&gt;
      &lt;name&gt;JaasLoginService&lt;/name&gt;
    &lt;/reference&gt;
  &lt;/gbean&gt;
  &lt;gbean name="sql-login" class="org.apache.geronimo.security.jaas.JaasLoginModuleUse"&gt;
    &lt;attribute name="controlFlag"&gt;REQUIRED&lt;/attribute&gt;
    &lt;reference name="LoginModule"&gt;
      &lt;name&gt;sql-login&lt;/name&gt;
    &lt;/reference&gt;
  &lt;/gbean&gt;
  &lt;gbean name="sqltest"
class="org.apache.geronimo.security.jaas.ServerRealmConfigurationEntry"&gt;
    &lt;attribute name="applicationConfigName"&gt;sqltest&lt;/attribute&gt;
    &lt;attribute name="realmName"&gt;sql-realm&lt;/attribute&gt;
    &lt;reference name="LoginService"&gt;
      &lt;name&gt;JaasLoginService&lt;/name&gt;
    &lt;/reference&gt;
  &lt;/gbean&gt;
&lt;/module&gt;</pre>
														</td>
												</tr>
										</tbody>
								</table>
								<br />
								<p>
										<a name="N104A4">
												<b>Using database pool</b>
										</a>
								</p>
								<p>Listing 2 shows an SQL realm plan that uses a database pool (DB2Realm) that was deployed using the console wizard. The plan is contained in the <a href="https://www6.software.ibm.com/developerworks/education/websphere/0609_balachandar/downloads.html"><font color="#5c81a7">download file</font></a> as sqlpoolplan.xml.</p>
								<p>
										<br />
										<a name="listing2">
												<b>Listing 2. SQL realm plan using database pool</b>
										</a>
										<br />
								</p>
								<table cellspacing="0" cellpadding="0" width="100%" border="0">
										<tbody>
												<tr>
														<td class="code-outline">
																<pre class="displaycode">                    
&lt;module xmlns="http://geronimo.apache.org/xml/ns/deployment-1.1"&gt;
  &lt;environment&gt;
    &lt;moduleId&gt;
      &lt;groupId&gt;db2&lt;/groupId&gt;
      &lt;artifactId&gt;pool-realm&lt;/artifactId&gt;
      &lt;version&gt;1.0&lt;/version&gt;
      &lt;type&gt;car&lt;/type&gt;
    &lt;/moduleId&gt;
    &lt;dependencies&gt;
      &lt;dependency&gt;
        &lt;groupId&gt;geronimo&lt;/groupId&gt;
        &lt;artifactId&gt;j2ee-security&lt;/artifactId&gt;
        &lt;version&gt;1.1&lt;/version&gt;
        &lt;type&gt;car&lt;/type&gt;
      &lt;/dependency&gt;
      &lt;dependency&gt;
        &lt;groupId&gt;console.dbpool&lt;/groupId&gt;
        &lt;artifactId&gt;DB2Realm&lt;/artifactId&gt;
        &lt;version&gt;1.0&lt;/version&gt;
        &lt;type&gt;rar&lt;/type&gt;
      &lt;/dependency&gt;
    &lt;/dependencies&gt;
    &lt;hidden-classes/&gt;
    &lt;non-overridable-classes/&gt;
  &lt;/environment&gt;
  &lt;gbean name="sqlpool-login"
class="org.apache.geronimo.security.jaas.LoginModuleGBean"&gt;
    &lt;attribute name="loginModuleClass"&gt;org.apache.geronimo.security.realm.
        providers.SQLLoginModule&lt;/attribute&gt;
    &lt;attribute name="serverSide"&gt;true&lt;/attribute&gt;
    &lt;attribute name="options"&gt;
      userSelect=select username, password from ADMINISTRATOR.USERS
      groupSelect=select groupname, username from ADMINISTRATOR.GROUPS
      dataSourceName=DB2Realm&lt;/attribute&gt;
    &lt;attribute name="loginDomainName"&gt;sqlpool-realm&lt;/attribute&gt;
  &lt;/gbean&gt;
  &lt;gbean name="sqlpool-realm"
class="org.apache.geronimo.security.realm.GenericSecurityRealm"&gt;
    &lt;attribute name="realmName"&gt;sqlpool-realm&lt;/attribute&gt;
    &lt;reference name="LoginModuleConfiguration"&gt;
      &lt;name&gt;sqlpool-login&lt;/name&gt;
    &lt;/reference&gt;
    &lt;reference name="ServerInfo"&gt;
      &lt;name&gt;ServerInfo&lt;/name&gt;
    &lt;/reference&gt;
    &lt;!--Add--&gt;
    &lt;reference name="LoginService"&gt;
      &lt;name&gt;JaasLoginService&lt;/name&gt;
    &lt;/reference&gt;
  &lt;/gbean&gt;
  &lt;gbean name="sqlpool-login"
class="org.apache.geronimo.security.jaas.JaasLoginModuleUse"&gt;
    &lt;attribute name="controlFlag"&gt;REQUIRED&lt;/attribute&gt;
    &lt;reference name="LoginModule"&gt;
      &lt;name&gt;sqlpool-login&lt;/name&gt;
    &lt;/reference&gt;
  &lt;/gbean&gt;
  &lt;gbean name="sqlpooltest"
class="org.apache.geronimo.security.jaas.ServerRealmConfigurationEntry"&gt;
    &lt;attribute name="applicationConfigName"&gt;sqlpooltest&lt;/attribute&gt;</pre>
														</td>
												</tr>
										</tbody>
								</table>
								<br />
								<p>
										<a name="N104BF">
												<b>Deploy the realm</b>
										</a>
								</p>
								<p>You can deploy the realms to the server using the administrative console: 
</p>
								<ol>
										<li>Start the Community Edition server from Eclipse WTP. In Eclipse, select the server you created earlier by right-clicking on the <b>Server</b> tab, then select <b>Start</b> (Figure 16). <br /><br /><a name="fig16"><b>Figure 16. Start server</b></a><br /><img height="375" alt="Figure 16. Start server" src="https://www6.software.ibm.com/developerworks/education/websphere/0609_balachandar/images/figure16.jpg" width="500" /><br /><br /></li>
										<li>Login to the Community Edition administrative console. 
</li>
										<li>Deploy the SQL realm plan that uses JDBC Driver (sqlplan.xml shown in <a href="https://www6.software.ibm.com/developerworks/education/websphere/0609_balachandar/section4.html#listing1"><font color="#996699">Listing 1</font></a>) by selecting <b>Deploy New</b> on the console (Figure 17). <br /><br /><a name="fig17"><b>Figure 17. Deploy database realm</b></a><br /><img height="375" alt="Figure 17. Deploy database realm" src="https://www6.software.ibm.com/developerworks/education/websphere/0609_balachandar/images/figure17.jpg" width="500" /><br /><br /></li>
										<li>Deploy the SQL database realm plan that uses the database pool (sqlpoolplan.xml shown in Listing 2). 
</li>
										<li>Check to see that these two plans are deployed successfully by selecting <b>Systems Modules</b> under Applications in the console (Figure 18). <br /><br /><a name="fig18"><b>Figure 18. Check successful real deployment</b></a><br /><img height="375" alt="Figure 18. Check successful real deployment" src="https://www6.software.ibm.com/developerworks/education/websphere/0609_balachandar/images/figure18.jpg" width="500" /><br /><br /></li>
								</ol>
								<p>
								</p>
								<p>
										<a name="N10518">
												<b>Deploy the application</b>
										</a>
								</p>
								<p>With the application and server configuration defined in Eclipse, and the database realm deployed, you can now deploy the application to the server. 
</p>
								<ol>
										<li>In Community Edition, select <b>Server</b> tab, right-click on the server you created earlier, and then select <b>Add and Remove Projects</b>. 
</li>
										<li>Select the <b>SQLRealmApp</b> from the Available projects list and click Add &gt; to move it over to the Configured projects list (Figure 19). 
</li>
										<li>Click <b>Finish</b>. <br /><br /><a name="fig19"><b>Figure 19. Add to configured projects</b></a><br /><img height="374" alt="Figure 19. Add to configured projects" src="https://www6.software.ibm.com/developerworks/education/websphere/0609_balachandar/images/figure19.jpg" width="477" /><br /><br /></li>
										<li>Start the server. From the <b>Server</b> tab, right-click again on your server and select <b>Start</b>. The application will run on the server you selected. 
</li>
										<li>To launch the console for the server, right-click on the Community Edition server, then select <b>Launch Community Edition Console</b>. Enter the login ID and password: <code>system</code> and <code>manager</code>, respectively (Figure 20). <br /><br /><a name="fig20"><b>Figure 20. Launch administrative consoles</b></a><br /><img height="375" alt="Figure 20. Launch administrative console" src="https://www6.software.ibm.com/developerworks/education/websphere/0609_balachandar/images/figure20.jpg" width="500" /> <br /><p><span class="atitle">Running the application</span></p><a name="runapp"><p>In the prior sections, you created and deployed the Web application to the server from Eclipse WTP. Next, you can use the application, following the instructions in this section to test authentication, authorization, and access to the database pool. The application referred to in this section is the sample application provided in the <a href="https://www6.software.ibm.com/developerworks/education/websphere/0609_balachandar/downloads.html"><font color="#5c81a7">download file</font></a>.</p><p><a name="N10582"><b>Access the application</b></a></p><p>To access the Web application: 
</p><ol><li>From the Eclipse Navigator, right-click the Web application <b>SQLRealmWeb</b>, then select <b>Run As =&gt; Run on Server</b>. 
</li><li>Select <b>WebSphere Application Server Community Edition 1.1</b>, which is the server you defined earlier. 
</li><li>The project should already be added. Select <b>Next</b> and <b>Finish</b>. 
</li><li>The application should now be available at http://localhost:8080/SQLRealmWeb/ (Figure 21). <br /><br /><a name="fig21"><b>Figure 21. Test the application</b></a><br /><img height="375" alt="Figure 21. Test the application" src="https://www6.software.ibm.com/developerworks/education/websphere/0609_balachandar/images/figure21.jpg" width="500" /><br /><br /></li></ol><p></p><p><a name="N105B9"><b>Test the authentication</b></a></p><p>Included with this sample application are several valid user ID and password combinations (for testing authentication) with different roles (for testing authorization). Test the authentication by logging in. Using a correct user ID and password will log you in. An incorrect user ID and password will display the error page shown in Figure 22.</p><p>Valid user ID/password values are as follows:</p><p><code>system/manager<br />admin/admin123<br />user1/user1123<br />user2/user2123<br />guest1/guest1123<br />guest2/guest2123</code></p><br /><a name="fig22"><b>Figure 22. Application error page</b></a><br /><img height="375" alt="Figure 22. Application error page" src="https://www6.software.ibm.com/developerworks/education/websphere/0609_balachandar/images/figure22.jpg" width="500" /><br /><p><a name="N105E6"><b>Test authorization</b></a></p><p>Once authenticated and inside the application, the user is allowed access to areas of Web application based on the user's business role, as defined in the deployment descriptor. The sample application is defined with three roles: admin, user, and guest. A user with an admin role has access to all accounts in the sample application, but a user with a guest role will only be able to access pages defined for the guest. Test this by entering the application with different user IDs and passwords with admin, user, and guest roles. Figure 23 shows a user logged in as admin, but who is able to view the guest pages.</p><br /><a name="fig23"><b>Figure 23. Admin user viewing Guest page</b></a><br /><img height="375" alt="Figure 23. Admin user viewing Guest page" src="https://www6.software.ibm.com/developerworks/education/websphere/0609_balachandar/images/figure23.jpg" width="500" /><br /><p>In the case of unauthorized access (for example, if a guest user attempts to access a page authorized for admin users only), an HTTP 403 status error occurs (Figure 24) and prevents access to the page.</p><br /><a name="fig24"><b>Figure 24. Authorization error</b></a><br /><img height="375" alt="Figure 24. Authorization error" src="https://www6.software.ibm.com/developerworks/education/websphere/0609_balachandar/images/figure24.jpg" width="500" /><br /><p><a name="N10611"><b>Using the database pool</b></a></p><p>The default Web application is configured to use SQL realm that uses the JDBC driver. You can change this so that it uses the database pool by changing the realm name in the geronimo-web.xml file as <code>&lt;security-realm-name&gt;sqlpool-realm&lt;/security-realm-name&gt;</code>, and republishing the server. Verify if this works by stopping the db2/realm/1.0/car configuration in the server.</p><p><a name="N1061F"><b>Contents of the download file</b></a></p><p>The download file included with this tutorial, <a href="https://www6.software.ibm.com/developerworks/education/websphere/0609_balachandar/downloads.html"><font color="#5c81a7">sample-db2-realm.zip</font></a>, contains the following files: 
</p><ul><li>db2-realm.sql - SQL script file to create database and tables 
</li><li>db2-plan.xml - Plan to deploy a DB2 database pool. 
</li><li>sqlplan.xml - SQL realm plan that uses JDBC driver. 
</li><li>sqlpoolplan.xml - SQL realm plan that uses a database pool. 
</li><li>SQLRealmAppSrc.ear - Source for sample Web application. </li></ul></a></li>
								</ol>
						</a>
				</a>
		</a><img src ="http://www.blogjava.net/mlh123caoer/aggbug/93407.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mlh123caoer/" target="_blank">草儿</a> 2007-01-12 13:37 <a href="http://www.blogjava.net/mlh123caoer/archive/2007/01/12/93407.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>