﻿<?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-&lt;b style="font-size:28px"&gt;Derek.&lt;font style='color:red'&gt;Guo&lt;/font&gt; BLOG&lt;/b&gt;-随笔分类-JAVA</title><link>http://www.blogjava.net/envoydada/category/32099.html</link><description /><language>zh-cn</language><lastBuildDate>Sun, 18 Apr 2010 02:30:03 GMT</lastBuildDate><pubDate>Sun, 18 Apr 2010 02:30:03 GMT</pubDate><ttl>60</ttl><item><title>J2SE6 分析工具</title><link>http://www.blogjava.net/envoydada/archive/2010/04/08/317713.html</link><dc:creator>Derek.Guo</dc:creator><author>Derek.Guo</author><pubDate>Thu, 08 Apr 2010 06:04:00 GMT</pubDate><guid>http://www.blogjava.net/envoydada/archive/2010/04/08/317713.html</guid><wfw:comment>http://www.blogjava.net/envoydada/comments/317713.html</wfw:comment><comments>http://www.blogjava.net/envoydada/archive/2010/04/08/317713.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/envoydada/comments/commentRss/317713.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/envoydada/services/trackbacks/317713.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp; 除了Dtrace与Java技术的集成之外，Java SE 6发行中还包含了许多其它的可观察性工具。下面总结了这些工具，其中还包含一些更为详细的链接说明。</p>
<p><strong>(一) JConsole</strong></p>
<p>JConsole使用JVM的可扩展性Java管理扩展(JMX)工具来提供关于运行于Java平台的应用程序的性能和资源消耗的信息。</p>
<p>在J2SE 5.0软件中，你需要启动使用-Dcom.sun.management.jmxremote选项监控的应用程序。注意：在Java SE 6软件中，不再有这一要求。当启动该应用程序时，不需要特定的命令行选项。 </p>
<p>在生产系统中的应用</p>
<p>JConsole启动一个在被观察的Java程序的JVM内部的JMX代理。运行另外一部分代码仅有一点极微弱的影响-但是影响很小。</p>
<p>另外，尽管JConsole在监视本地应用程序的开发和快速原型开发中很有用，但在实际的应用系统中不推荐使用。理由是，JConsole本身也消耗大 量的系统资源。我们推荐的方法是用远程监控来把JConsole应用程序与被监控的系统加以隔离。因此,对于应用系统来说,以远程模式使用 JConsole更好些。对于安全的远程监控来说,可以使用安全选项。</p>
<p><strong>(二) jps</strong></p>
<p>jps相当于Solaris进程工具ps。更多的信息，请参考《jps-Java Virtual Machine Process Status Tool》。</p>
<p>不象"pgrep java"或"ps -ef grep java"，jps并不使用应用程序名来查找JVM实例。因此，它查找所有的Java应用程序，包括即使没有使用java执行体的那种（例如，定制的启动 器）。另外，jps仅查找当前用户的Java进程，而不是当前系统中的所有进程。</p>
<p><strong>(三) jstat</strong></p>
<p>jstat 显示一个测量（instrumented）Java HotSpot虚拟机的性能统计信息（请参考《jstat-Java Virtual Machine Statistics Monitoring Tool》）。有关于性能计数器的更详细的信息请参考《Code sample-jvmstat 3.0》。</p>
<p><strong>(四) jstatd</strong></p>
<p>jstatd是一个Java远程方法调用 (RMI)服务器应用程序-它监控测量Java HotSpot虚拟机的创建和终止并且提供一个接口来允许远程监控工具依附到运行于本地主机的JVM（请参考《jstatd-Virtual Machine jstat Daemon》）。</p>
<p>在应用系统中的使用</p>
<p>jps及其它jvmstat实用程序都使用 极为轻量级的观察机制。由JVM分配一小部分共享内存，而性能计数器也是从这部分内存中分配的。JVM子系统基于其感兴趣的事件更新性能计数器。客户端工 具仅仅负责异步地从共享内存段中进行读取。因此，总的来说，使用jvmstat进行监控的效果是很小的。 Photoshop教程 数据结构 五笔输入法专题 <br />
<br />
<br />
<br />
Java SE 6平台中针对于Postmortem的可观察性工具</p>
<p>Java SE 6支持postmortem可观察性工具-它能够从挂起的Java进程或Java核心复制中获得信息。这些工具（除了jhat外）都使用Solaris libproc库来依附到和读取被观察的程序。在观察期间，目标程序被挂起。当Java进程被挂起或当从一个Java进程中发生一个核心复制时，可以使用 这些工具。在任何可能的情况下，请考虑使用gcore来捕获系统的核心复制的一个快照并且使用任何下列工具"离线"分析核心复制。</p>
<p><strong>(一) jinfo</strong></p>
<p>jinfo打印一个给定的Java进程或核心文件或一个远程调试服务器的Java配置信息。配置信息包括Java系统属性和JVM命令行标志(更多信息，请参考《jinfo-Configuration Info》)。</p>
<p><strong>(二) jmap</strong></p>
<p>jmap：如果这个工具不使用任何选项（除了pid或core选项）运行，那么它显示类似于Solaris的pmap工具所输出的信息。这个工具支持针对Java堆可观察性的若干其它选项。</p>
<p>在Java SE 6平台中,新加入了一个-dump选项。这样可以使jmap能够把Java堆信息复制到一个文件中，然后我们可以使用新的jhat命令（见下面一节）来分析它。</p>
<p>jmap -dump选项并不使用Solaris libproc来实现实时处理；而是，它运行当前正运行的JVM中的一小段代码，由此来实现堆复制。既然这种堆复制代码运行于JVM内部，那么其速度是比 较快的。堆复制的效果大致相当于实现一次"完全的GC"（对整个堆的垃圾收集），再加上把该堆的内容写入到文件中。实现堆复制的另外一种可能的思路是使用 gcore来进行核心复制并且运行"jmap -dump"（这与以"离线"方式运行的核心复制形成对照）。</p>
<p><strong>(三) jstack</strong></p>
<p>jstack等价于Solaris的pstack工具。jstack打印所有的Java线程的堆栈跟踪信息（可选地包括本机帧信息），请参考《jstack-堆栈跟踪》。关于锁和死锁的信息也可以被打印，请参考java.util.concurrent locks。</p>
<p><strong>(四) jsadebugd</strong></p>
<p>jsadebugd依附到一个Java进程或核心文件并且担当一个调试服务器的作用。远程客户，例如jstack、jmap和jinfo，都能够通过Java RMI依附到该服务器。</p>
<p><strong>(五) jhat</strong></p>
<p>jhat是一个Java堆复制浏览器。这个工具分析Java堆复制文件（例如，由上面的"jmap -dump"所产生的）。Jhat启动一个允许堆中的对象在web浏览器中进行分析的web服务器。这个工具并不是想用于应用系统中而是用于"离线"分 析。"jhat工具是平台独立的"，其意思是，它可以被用来观察在任何平台上所产生的堆复制。例如，我们有可能在Linux系统上使用jhat来观察一个 在Solaris OS上所产生的堆复制。</p>
<p>把本机的java内存映像导出到heap.dmp中,其中PID为java进程的ID号。<br />
jmap -dump:live,format=b,file=heap.dmp PID</p>
<p>导出后的映像文件可以用jhat来进行分析，-J是向java虚拟机传一个参数，如-mx768m是指定虚拟机可用最大的内存为768M。如果映像文件很大，你要指定一个很大的值，否则在分析过程中就会有OutOfMemeryError的错误。<br />
jhat -J-mx768m -port &lt;端口号:默认为7000&gt; heap.dmp </p>
 <img src ="http://www.blogjava.net/envoydada/aggbug/317713.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/envoydada/" target="_blank">Derek.Guo</a> 2010-04-08 14:04 <a href="http://www.blogjava.net/envoydada/archive/2010/04/08/317713.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Memcached 剖析(转)</title><link>http://www.blogjava.net/envoydada/archive/2008/09/28/231708.html</link><dc:creator>Derek.Guo</dc:creator><author>Derek.Guo</author><pubDate>Sun, 28 Sep 2008 09:12:00 GMT</pubDate><guid>http://www.blogjava.net/envoydada/archive/2008/09/28/231708.html</guid><wfw:comment>http://www.blogjava.net/envoydada/comments/231708.html</wfw:comment><comments>http://www.blogjava.net/envoydada/archive/2008/09/28/231708.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/envoydada/comments/commentRss/231708.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/envoydada/services/trackbacks/231708.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://www.danga.com/memcached/">memcached</a> 是以<a href="http://www.livejournal.com/">LiveJournal</a> 旗下<a href="http://www.danga.com/">Danga Interactive</a> 公司的<a href="http://www.bradfitz.com/">Brad Fitzpatric</a> 为首开发的一款软件。现在已成为 <a href="http://mixi.jp/">mixi</a>、 <a href="http://www.hatena.ne.jp/">hatena</a>、 <a href="http://www.facebook.com/">Facebook</a>、 <a href="http://www.vox.com/">Vox</a>、LiveJournal等众多服务中提高Web应用扩展性的重要因素。</p>
<p>许多Web应用都将数据保存到RDBMS中，应用服务器从中读取数据并在浏览器中显示。但随着数据量的增大、访问的集中，就会出现RDBMS的负担加重、数据库响应恶化、网站显示延迟等重大影响。</p>
<p>这时就该memcached大显身手了。memcached是高性能的分布式内存缓存服务器。一般的使用目的是，通过缓存数据库查询结果，减少数据库访问次数，以提高动态Web应用的速度、提高可扩展性......<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 完整文章下载&nbsp;&nbsp; <a href="/Files/envoydada/memcached.pdf">/Files/envoydada/memcached.pdf</a><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Server端下载&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://danga.com/memcached">http://danga.com/memcached</a><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; <a href="http://jehiah.cz/projects/memcached-win32/">http://jehiah.cz/projects/memcached-win32/</a><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Client端下载&nbsp;&nbsp; <a href="http://www.whalin.com/memcached/">http://www.whalin.com/memcached/</a></p>
(感谢原作者及翻译者的辛勤工作,向你们致敬!!^_^)
<img src ="http://www.blogjava.net/envoydada/aggbug/231708.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/envoydada/" target="_blank">Derek.Guo</a> 2008-09-28 17:12 <a href="http://www.blogjava.net/envoydada/archive/2008/09/28/231708.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate属性延迟加载</title><link>http://www.blogjava.net/envoydada/archive/2007/09/20/146797.html</link><dc:creator>Derek.Guo</dc:creator><author>Derek.Guo</author><pubDate>Thu, 20 Sep 2007 08:01:00 GMT</pubDate><guid>http://www.blogjava.net/envoydada/archive/2007/09/20/146797.html</guid><wfw:comment>http://www.blogjava.net/envoydada/comments/146797.html</wfw:comment><comments>http://www.blogjava.net/envoydada/archive/2007/09/20/146797.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/envoydada/comments/commentRss/146797.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/envoydada/services/trackbacks/146797.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Hibernate3开始增加了通过property节点的lazy属性，为特定的属性指定延迟加载策略，以避免实体整体加载可能带来的性能浪费，尤其是像长文本之类的大字段。那么实现属性延迟加载需要做两件事：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.修改映射配置文件，将需要延迟加载的字段增加lazy属性并设置成true;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.与实体和集合类型的延迟加载不同，Hibernate3属性延迟加载机制在配置外，还需要用类增强器对二进制Class文件进行强化处理（借助ANT）<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下面来演示下如何用ANT调用Hibernate类增强器对class文件进行强化处理.<br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.下载ANT，配置ANT环境；（如果有Eclipse，直接就可以用它的ant）；<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.新建ANT的build.xml脚本；<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 70.91%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; height: 340px; background-color: #eeeeee"><span style="color: #000000">&lt;?</span><span style="color: #000000">xml&nbsp;version</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">1.0</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;encoding</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">UTF-8</span><span style="color: #000000">"</span><span style="color: #000000">?&gt;</span><span style="color: #000000"><br />
</span><span style="color: #000000">&lt;</span><span style="color: #000000">project&nbsp;name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">hibernatelazy</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">default</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">instrument</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;basedir</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">.</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000"><span style="color: red">&lt;property&nbsp;name="lib.dir"&nbsp;value="./lib"/&gt;</span></span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: red">&nbsp;&lt;property&nbsp;name="classes.dir"&nbsp;value="./classes"/&gt;<br />
</span></span><span style="color: #000000">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">path&nbsp;id</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">lib.class.path</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">fileset&nbsp;dir</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">${lib.dir}</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">include&nbsp;name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">**/*.jar</span><span style="color: #000000">"</span><span style="color: #000000">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">fileset</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">path</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">target&nbsp;name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">instrument</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">taskdef&nbsp;name</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">instrument</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;classname</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">org.hibernate.tool.instrument.InstrumentTask</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">classpath&nbsp;path</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">${classes.dir}</span><span style="color: #000000">"</span><span style="color: #000000">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">classpath&nbsp;refid</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">lib.class.path</span><span style="color: #000000">"</span><span style="color: #000000">/&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">taskdef</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">instrument&nbsp;verbose</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">true</span><span style="color: #000000">"</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000"><span style="color: red">&lt;fileset&nbsp;dir="${classes.dir}/com/derek/known/hbm"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;include&nbsp;name="Knownquestions.class"/&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/fileset&gt;<br />
</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">instrument</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">&lt;/</span><span style="color: #000000">target</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #000000">&lt;/</span><span style="color: #000000">project</span><span style="color: #000000">&gt;</span></div>
<br />
其中注意<br />
&lt;property name="lib.dir" value="<span style="color: red">./lib</span>"/&gt;所需的JAR文件路径<br />
&lt;property name="classes.dir" value="<span style="color: red">./classes</span>"/&gt;编译输出路径<br />
<br />
就我的工程而言：<br />
&nbsp; <img height="453" alt="" src="http://www.blogjava.net/images/blogjava_net/envoydada/Image00026.jpg" width="259" border="0" /><br />
我把build.xml放在了WEB-INF目录下，输出路径就设置为该目录下的classes目录，待增强的字节码文件为classes目录下的com/derek/known/hbm/<span style="color: #000000">Knownquestions.class； 在命令行下切换到此目录，执行ant命令，即生成新的<span style="color: #000000">Knownquestions.class</span></span><span style="color: #000000"><br />
</span>
 <img src ="http://www.blogjava.net/envoydada/aggbug/146797.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/envoydada/" target="_blank">Derek.Guo</a> 2007-09-20 16:01 <a href="http://www.blogjava.net/envoydada/archive/2007/09/20/146797.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA缩放图片（转贴）</title><link>http://www.blogjava.net/envoydada/archive/2007/08/22/138549.html</link><dc:creator>Derek.Guo</dc:creator><author>Derek.Guo</author><pubDate>Wed, 22 Aug 2007 03:05:00 GMT</pubDate><guid>http://www.blogjava.net/envoydada/archive/2007/08/22/138549.html</guid><wfw:comment>http://www.blogjava.net/envoydada/comments/138549.html</wfw:comment><comments>http://www.blogjava.net/envoydada/archive/2007/08/22/138549.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/envoydada/comments/commentRss/138549.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/envoydada/services/trackbacks/138549.html</trackback:ping><description><![CDATA[<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008080">&nbsp;1</span>&nbsp;<span style="COLOR: #0000ff">package</span><span style="COLOR: #000000">&nbsp;test;<br></span><span style="COLOR: #008080">&nbsp;2</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;3</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;java.io.File;<br></span><span style="COLOR: #008080">&nbsp;4</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;java.awt.image.BufferedImage;<br></span><span style="COLOR: #008080">&nbsp;5</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;java.awt.Image;<br></span><span style="COLOR: #008080">&nbsp;6</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;java.awt.image.AffineTransformOp;<br></span><span style="COLOR: #008080">&nbsp;7</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;javax.imageio.ImageIO;<br></span><span style="COLOR: #008080">&nbsp;8</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;java.awt.geom.AffineTransform;<br></span><span style="COLOR: #008080">&nbsp;9</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">10</span>&nbsp;<span style="COLOR: #000000"></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;UploadImg{<br></span><span style="COLOR: #008080">11</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">12</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;fromdir;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;fromdir&nbsp;图片的原始目录</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">13</span>&nbsp;<span style="COLOR: #008000"></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">14</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;todir;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;todir&nbsp;处理后的图片存放目录</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">15</span>&nbsp;<span style="COLOR: #008000"></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">16</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;imgfile;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;imgfile&nbsp;原始图片</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">17</span>&nbsp;<span style="COLOR: #008000"></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">18</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;sysimgfile;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;sysimgfile&nbsp;处理后的图片文件名前缀</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">19</span>&nbsp;<span style="COLOR: #008000"></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">20</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;UploadImg(String&nbsp;fromdirNow,&nbsp;String&nbsp;todirNow,&nbsp;String&nbsp;imgfileNow,<br></span><span style="COLOR: #008080">21</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;sysimgfileNow){<br></span><span style="COLOR: #008080">22</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fromdir&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;fromdirNow;<br></span><span style="COLOR: #008080">23</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;todir&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;todirNow;<br></span><span style="COLOR: #008080">24</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;imgfile&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;imgfileNow;<br></span><span style="COLOR: #008080">25</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sysimgfile&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;sysimgfileNow;<br></span><span style="COLOR: #008080">26</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="COLOR: #008080">27</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">28</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">boolean</span><span style="COLOR: #000000">&nbsp;CreateThumbnail()&nbsp;</span><span style="COLOR: #0000ff">throws</span><span style="COLOR: #000000">&nbsp;Exception&nbsp;{<br></span><span style="COLOR: #008080">29</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;fileExtNmae是图片的格式&nbsp;gif&nbsp;JPG&nbsp;或png<br></span><span style="COLOR: #008080">30</span>&nbsp;<span style="COLOR: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;String&nbsp;fileExtNmae="";</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">31</span>&nbsp;<span style="COLOR: #008000"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&nbsp;Ratio&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0.0</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">32</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File&nbsp;F&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;File(fromdir,&nbsp;imgfile);<br></span><span style="COLOR: #008080">33</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">F.isFile())<br></span><span style="COLOR: #008080">34</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">throw</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Exception(F<br></span><span style="COLOR: #008080">35</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;is&nbsp;not&nbsp;image&nbsp;file&nbsp;error&nbsp;in&nbsp;CreateThumbnail!</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">36</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File&nbsp;ThF&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;File(todir,&nbsp;sysimgfile&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">.jpg</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">37</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">38</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BufferedImage&nbsp;Bi&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;ImageIO.read(F);<br></span><span style="COLOR: #008080">39</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;假设图片宽&nbsp;高&nbsp;最大为300&nbsp;3000</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">40</span>&nbsp;<span style="COLOR: #008000"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Image&nbsp;Itemp&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;Bi.getScaledInstance(</span><span style="COLOR: #000000">300</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">300</span><span style="COLOR: #000000">,&nbsp;Bi.SCALE_SMOOTH);<br></span><span style="COLOR: #008080">41</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">42</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;((Bi.getHeight()&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">300</span><span style="COLOR: #000000">)&nbsp;</span><span style="COLOR: #000000">||</span><span style="COLOR: #000000">&nbsp;(Bi.getWidth()&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">300</span><span style="COLOR: #000000">)){<br></span><span style="COLOR: #008080">43</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(Bi.getHeight()&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;Bi.getWidth())<br></span><span style="COLOR: #008080">44</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ratio&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">300.0</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">&nbsp;Bi.getHeight();<br></span><span style="COLOR: #008080">45</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">46</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Ratio&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">300.0</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">&nbsp;Bi.getWidth();<br></span><span style="COLOR: #008080">47</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="COLOR: #008080">48</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">49</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AffineTransformOp&nbsp;op&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;AffineTransformOp(AffineTransform<br></span><span style="COLOR: #008080">50</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.getScaleInstance(Ratio,&nbsp;Ratio),&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">51</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Itemp&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;op.filter(Bi,&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">52</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">53</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ImageIO.write((BufferedImage)&nbsp;Itemp,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">jpg</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;ThF);<br></span><span style="COLOR: #008080">54</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000">&nbsp;(Exception&nbsp;ex){<br></span><span style="COLOR: #008080">55</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">throw</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Exception(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;ImageIo.write&nbsp;error&nbsp;in&nbsp;CreatThum.:&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">56</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;ex.getMessage());<br></span><span style="COLOR: #008080">57</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="COLOR: #008080">58</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">59</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="COLOR: #008080">60</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">61</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;main(String[]&nbsp;args){<br></span><span style="COLOR: #008080">62</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UploadImg&nbsp;UI;<br></span><span style="COLOR: #008080">63</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">boolean</span><span style="COLOR: #000000">&nbsp;ss&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">64</span>&nbsp;<span style="COLOR: #000000"><br></span><span style="COLOR: #008080">65</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">66</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UI&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;UploadImg(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">d:\\</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">d:\\</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">src.jpg</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">ps_low1</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">67</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ss&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;UI.CreateThumbnail();<br></span><span style="COLOR: #008080">68</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(ss){<br></span><span style="COLOR: #008080">69</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Success</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">70</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">71</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Error</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008080">72</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="COLOR: #008080">73</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000">&nbsp;(Exception&nbsp;e){<br></span><span style="COLOR: #008080">74</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(e.toString());<br></span><span style="COLOR: #008080">75</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="COLOR: #008080">76</span>&nbsp;<span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}<br></span><span style="COLOR: #008080">77</span>&nbsp;<span style="COLOR: #000000">}</span></div>
 <img src ="http://www.blogjava.net/envoydada/aggbug/138549.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/envoydada/" target="_blank">Derek.Guo</a> 2007-08-22 11:05 <a href="http://www.blogjava.net/envoydada/archive/2007/08/22/138549.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>工具分析GC日志</title><link>http://www.blogjava.net/envoydada/archive/2007/07/30/133329.html</link><dc:creator>Derek.Guo</dc:creator><author>Derek.Guo</author><pubDate>Mon, 30 Jul 2007 06:21:00 GMT</pubDate><guid>http://www.blogjava.net/envoydada/archive/2007/07/30/133329.html</guid><wfw:comment>http://www.blogjava.net/envoydada/comments/133329.html</wfw:comment><comments>http://www.blogjava.net/envoydada/archive/2007/07/30/133329.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/envoydada/comments/commentRss/133329.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/envoydada/services/trackbacks/133329.html</trackback:ping><description><![CDATA[<p>工具:HPjtune或HPJmeter<br>获取地址 <a href="http://www.hp.com/go/java">http://www.hp.com/go/java</a><br>参考文档 <a href="http://www.javaperformancetuning.com/tools/hpjtune/index.shtml">http://www.javaperformancetuning.com/tools/hpjtune/index.shtml</a><br><br>1.JVM 加启动参数 -Xloggc:&lt;file&gt;；如在TOMCAT启动时加此参数；&lt;file&gt;为输出日志名,如 -Xloggc:derek.vgc</p>
<p>2.获得GC LOG文件，使用日志查看器如HP的HPJtune，HPJmeter（均可从HP网站下载到）打开日志文件;</p>
 <img src ="http://www.blogjava.net/envoydada/aggbug/133329.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/envoydada/" target="_blank">Derek.Guo</a> 2007-07-30 14:21 <a href="http://www.blogjava.net/envoydada/archive/2007/07/30/133329.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java虚拟机参数详解</title><link>http://www.blogjava.net/envoydada/archive/2007/07/23/131803.html</link><dc:creator>Derek.Guo</dc:creator><author>Derek.Guo</author><pubDate>Mon, 23 Jul 2007 01:35:00 GMT</pubDate><guid>http://www.blogjava.net/envoydada/archive/2007/07/23/131803.html</guid><wfw:comment>http://www.blogjava.net/envoydada/comments/131803.html</wfw:comment><comments>http://www.blogjava.net/envoydada/archive/2007/07/23/131803.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/envoydada/comments/commentRss/131803.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/envoydada/services/trackbacks/131803.html</trackback:ping><description><![CDATA[<p style="FONT-SIZE: 10pt">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Java在运行已编译完成的类时，是通过java虚拟机来装载和执行的，java虚拟机通过操作系统命令JAVA_HOME\bin\java &#8211;option 来启动，-option为虚拟机参数，JAVA_HOME为JDK安装路径，通过这些参数可对虚拟机的运行状态进行调整，掌握参数的含义可对虚拟机的运行模式有更深入理解。<br>虚拟机参数分为基本和扩展两类，在命令行中输入JAVA_HOME\bin\java 就可得到基本参数列表， <br>在命令行输入JAVA_HOME\bin\java &#8211;X 就可得到扩展参数列表。 </p>
<p style="FONT-SIZE: 10pt">基本参数说明：</p>
<p style="FONT-SIZE: 10pt"><strong>-client，-server</strong><br>这两个参数用于设置虚拟机使用何种运行模式，client模式启动比较快，但运行时性能和内存管理效率不如server模式，通常用于客户端应用程序。相反，server模式启动比client慢，但可获得更高的运行性能。<br>在windows上，缺省的虚拟机类型为client模式，如果要使用server模式，就需要在启动虚拟机时加-server参数，以获得更高性能，对服务器端应用，推荐采用server模式，尤其是多个CPU的系统。在Linux，Solaris上缺省采用server模式。</p>
<p style="FONT-SIZE: 10pt"><br><strong>-hotspot<br></strong>含义与client相同，jdk1.4以前使用的参数，jdk1.4开始不再使用，代之以client。</p>
<p style="FONT-SIZE: 10pt"><br><strong>-classpath,-cp<br></strong>虚拟机在运行一个类时，需要将其装入内存，虚拟机搜索类的方式和顺序如下：</p>
<p style="FONT-SIZE: 10pt">Bootstrap classes，Extension classes，User classes。</p>
<p style="FONT-SIZE: 10pt">Bootstrap 中的路径是虚拟机自带的jar或zip文件，虚拟机首先搜索这些包文件，用System.getProperty("sun.boot.class.path")可得到虚拟机搜索的包名。</p>
<p style="FONT-SIZE: 10pt">Extension是位于jre\lib\ext目录下的jar文件，虚拟机在搜索完Bootstrap后就搜索该目录下的jar文件。用System. getProperty("java.ext.dirs&#8221;)可得到虚拟机使用Extension搜索路径。</p>
<p style="FONT-SIZE: 10pt">User classes搜索顺序为当前目录、环境变量 CLASSPATH、-classpath。</p>
<p style="FONT-SIZE: 10pt">-classpath告知虚拟机搜索目录名、jar文档名、zip文档名，之间用分号;分隔。</p>
<p style="FONT-SIZE: 10pt">例如当你自己开发了公共类并包装成一个common.jar包，在使用common.jar中的类时，就需要用-classpath common.jar 告诉虚拟机从common.jar中查找该类，否则虚拟机就会抛出java.lang.NoClassDefFoundError异常，表明未找到类定义。</p>
<p style="FONT-SIZE: 10pt">在运行时可用System.getProperty(&#8220;java.class.path&#8221;)得到虚拟机查找类的路径。</p>
<p style="FONT-SIZE: 10pt"><br>使用-classpath后虚拟机将不再使用CLASSPATH中的类搜索路径，如果-classpath和CLASSPATH都没有设置，则虚拟机使用当前路径(.)作为类搜索路径。</p>
<p style="FONT-SIZE: 10pt">推荐使用-classpath来定义虚拟机要搜索的类路径，而不要使用环境变量CLASSPATH的搜索路径，以减少多个项目同时使用CLASSPATH时存在的潜在冲突。例如应用1要使用a1.0.jar中的类G，应用2要使用a2.0.jar中的类G,a2.0.jar是a1.0.jar的升级包，当a1.0.jar，a2.0.jar都在CLASSPATH中，虚拟机搜索到第一个包中的类G时就停止搜索，如果应用1应用2的虚拟机都从CLASSPATH中搜索，就会有一个应用得不到正确版本的类G。</p>
<p style="FONT-SIZE: 10pt"><br><strong>-D&lt;propertyName&gt;=value</strong></p>
<p style="FONT-SIZE: 10pt">在虚拟机的系统属性中设置属性名/值对，运行在此虚拟机之上的应用程序可用System.getProperty(&#8220;propertyName&#8221;)得到value的值。<br>如果value中有空格，则需要用双引号将该值括起来，如-Dname=&#8221;space string&#8221;。<br>该参数通常用于设置系统级全局变量值，如配置文件路径，应为该属性在程序中任何地方都可访问。</p>
<p style="FONT-SIZE: 10pt"><br><strong>-verbose[:class|gc|jni]</strong></p>
<p style="FONT-SIZE: 10pt">在输出设备上显示虚拟机运行信息。<br>verbose和verbose:class含义相同，输出虚拟机装入的类的信息，显示的信息格式如下：<br>[Loaded java.io.FilePermission$1 from shared objects file]<br>当虚拟机报告类找不到或类冲突时可用此参数来诊断来查看虚拟机从装入类的情况。</p>
<p style="FONT-SIZE: 10pt"><br>-verbose:gc在虚拟机发生内存回收时在输出设备显示信息，格式如下：<br>[Full GC 268K-&gt;168K(1984K), 0.0187390 secs]<br>该参数用来监视虚拟机内存回收的情况。</p>
<p style="FONT-SIZE: 10pt">-verbose:jni在虚拟机调用native方法时输出设备显示信息，格式如下：<br>[Dynamic-linking native method HelloNative.sum ... JNI]<br>该参数用来监视虚拟机调用本地方法的情况，在发生jni错误时可为诊断提供便利。</p>
<p style="FONT-SIZE: 10pt"><br><strong>-version</strong><br>显示可运行的虚拟机版本信息然后退出。一台机器上装有不同版本的JDK时</p>
<p style="FONT-SIZE: 10pt"><br><strong>-showversion</strong><br>显示版本信息以及帮助信息。</p>
<p style="FONT-SIZE: 10pt"><br><strong>-ea[:&lt;packagename&gt;...|:&lt;classname&gt;]<br>-enableassertions[:&lt;packagename&gt;...|:&lt;classname&gt;]</strong><br>从JDK1.4开始，java可支持断言机制，用于诊断运行时问题。通常在测试阶段使断言有效，在正式运行时不需要运行断言。断言后的表达式的值是一个逻辑值，为true时断言不运行，为false时断言运行，抛出java.lang.AssertionError错误。<br>上述参数就用来设置虚拟机是否启动断言机制，缺省时虚拟机关闭断言机制，用-ea可打开断言机制，不加&lt;packagename&gt;和classname时运行所有包和类中的断言，如果希望只运行某些包或类中的断言，可将包名或类名加到-ea之后。例如要启动包com.foo.util中的断言，可用命令 &#8211;ea:com.foo.util 。</p>
<p style="FONT-SIZE: 10pt"><br><strong>-da[:&lt;packagename&gt;...|:&lt;classname&gt;]</strong><br>-disableassertions[:&lt;packagename&gt;...|:&lt;classname&gt;]<br>用来设置虚拟机关闭断言处理，packagename和classname的使用方法和-ea相同。</p>
<p style="FONT-SIZE: 10pt"><br><strong>-esa | -enablesystemassertions</strong><br>设置虚拟机显示系统类的断言。</p>
<p style="FONT-SIZE: 10pt"><br>-dsa | -disablesystemassertions<br>设置虚拟机关闭系统类的断言。</p>
<p style="FONT-SIZE: 10pt"><br><strong>-agentlib:&lt;libname&gt;[=&lt;options&gt;]</strong><br>该参数是JDK5新引入的，用于虚拟机装载本地代理库。</p>
<p style="FONT-SIZE: 10pt">Libname为本地代理库文件名，虚拟机的搜索路径为环境变量PATH中的路径，options为传给本地库启动时的参数，多个参数之间用逗号分隔。在Windows平台上虚拟机搜索本地库名为libname.dll的文件，在Unix上虚拟机搜索本地库名为libname.so的文件，搜索路径环境变量在不同系统上有所不同，Linux、SunOS、IRIX上为LD_LIBRARY_PATH，AIX上为LIBPATH，HP-UX上为SHLIB_PATH。</p>
<p style="FONT-SIZE: 10pt">例如可使用-agentlib:hprof来获取虚拟机的运行情况，包括CPU、内存、线程等的运行数据，并可输出到指定文件中，可用-agentlib:hprof=help来得到使用帮助列表。在jre\bin目录下可发现hprof.dll文件。</p>
<p style="FONT-SIZE: 10pt"><br><strong>-agentpath:&lt;pathname&gt;[=&lt;options&gt;]</strong><br>设置虚拟机按全路径装载本地库，不再搜索PATH中的路径。其他功能和agentlib相同。</p>
<p style="FONT-SIZE: 10pt"><br><strong>-javaagent:&lt;jarpath&gt;[=&lt;options&gt;]</strong><br>虚拟机启动时装入java语言设备代理。Jarpath文件中的mainfest文件必须有Agent-Class属性。代理类要实现public static void premain(String agentArgs, Instrumentation inst)方法。当虚拟机初始化时，将按代理类的说明顺序调用premain方法。<br>参见：java.lang.instrument</p>
<p style="FONT-SIZE: 10pt">&nbsp;</p>
<p style="FONT-SIZE: 10pt">扩展参数说明<br><strong>-Xmixed</strong><br>设置-client模式虚拟机对使用频率高的方式进行Just-In-Time编译和执行，对其他方法使用解释方式执行。该方式是虚拟机缺省模式。</p>
<p style="FONT-SIZE: 10pt"><br><strong>-Xint<br></strong>设置-client模式下运行的虚拟机以解释方式执行类的字节码，不将字节码编译为本机码。</p>
<p style="FONT-SIZE: 10pt"><br><strong>-Xbootclasspath:path</strong></p>
<p style="FONT-SIZE: 10pt"><strong>-Xbootclasspath/a:path</strong></p>
<p style="FONT-SIZE: 10pt"><strong>-Xbootclasspath/p:path<br></strong>改变虚拟机装载缺省系统运行包rt.jar而从-Xbootclasspath中设定的搜索路径中装载系统运行类。除非你自己能写一个运行时，否则不会用到该参数。<br>/a:将在缺省搜索路径后加上path 中的搜索路径。<br>/p:在缺省搜索路径前先搜索path中的搜索路径。</p>
<p style="FONT-SIZE: 10pt"><br><strong>-Xnoclassgc<br></strong>关闭虚拟机对class的垃圾回收功能。</p>
<p style="FONT-SIZE: 10pt"><br><strong>-Xincgc</strong><br>启动增量垃圾收集器，缺省是关闭的。增量垃圾收集器能减少偶然发生的长时间的垃圾回收造成的暂停时间。但增量垃圾收集器和应用程序并发执行，因此会占用部分CPU在应用程序上的功能。</p>
<p style="FONT-SIZE: 10pt"><br><strong>-Xloggc:&lt;file&gt;<br></strong>将虚拟机每次垃圾回收的信息写到日志文件中，文件名由file指定，文件格式是平文件，内容和-verbose:gc输出内容相同。</p>
<p style="FONT-SIZE: 10pt"><br><strong>-Xbatch</strong><br>虚拟机的缺省运行方式是在后台编译类代码，然后在前台执行代码，使用-Xbatch参数将关闭虚拟机后台编译，在前台编译完成后再执行。</p>
<p style="FONT-SIZE: 10pt"><br><strong>-Xms&lt;size&gt;</strong><br>设置虚拟机可用内存堆的初始大小，缺省单位为字节，该大小为1024的整数倍并且要大于1MB，可用k(K)或m(M)为单位来设置较大的内存数。初始堆大小为2MB。<br>例如：-Xms6400K，-Xms256M</p>
<p style="FONT-SIZE: 10pt"><br><strong>-Xmx&lt;size&gt;<br></strong>设置虚拟机内存堆的最大可用大小，缺省单位为字节。该值必须为1024整数倍，并且要大于2MB。可用k(K)或m(M)为单位来设置较大的内存数。缺省堆最大值为64MB。<br>例如：-Xmx81920K，-Xmx80M<br>当应用程序申请了大内存运行时虚拟机抛出java.lang.OutOfMemoryError: Java heap space错误，就需要使用-Xmx设置较大的可用内存堆。</p>
<p style="FONT-SIZE: 10pt"><br><strong>-Xss&lt;size&gt;<br></strong>设置线程栈的大小，缺省单位为字节。与-Xmx类似，也可用K或M来设置较大的值。通常操作系统分配给线程栈的缺省大小为1MB。<br>另外也可在java中创建线程对象时设置栈的大小，构造函数原型为Thread(ThreadGroup group, Runnable target, String name, long stackSize)。</p>
<p style="FONT-SIZE: 10pt"><br><strong>-Xprof<br></strong>输出CPU运行时的诊断信息。</p>
<p style="FONT-SIZE: 10pt"><br><strong>-Xfuture<br></strong>对类文件进行严格格式检查，以保证类代码符合类代码规范。为保持向后兼容，虚拟机缺省不进行严格的格式检查。</p>
<p style="FONT-SIZE: 10pt"><br><strong>-Xrs<br></strong>减少虚拟机中操作系统的信号（singals）的使用。该参数通常用在虚拟机以后台服务方式运行时使用（如Servlet）。</p>
<p style="FONT-SIZE: 10pt"><br><strong>-Xcheck:jni</strong><br>调用JNI函数时进行附加的检查，特别地虚拟机将校验传递给JNI函数参数的合法性，在本地代码中遇到非法数据时，虚拟机将报一个致命错误而终止。使用该参数后将造成性能下降。<br></p>
 <img src ="http://www.blogjava.net/envoydada/aggbug/131803.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/envoydada/" target="_blank">Derek.Guo</a> 2007-07-23 09:35 <a href="http://www.blogjava.net/envoydada/archive/2007/07/23/131803.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GC调优</title><link>http://www.blogjava.net/envoydada/archive/2007/07/20/131433.html</link><dc:creator>Derek.Guo</dc:creator><author>Derek.Guo</author><pubDate>Fri, 20 Jul 2007 03:53:00 GMT</pubDate><guid>http://www.blogjava.net/envoydada/archive/2007/07/20/131433.html</guid><wfw:comment>http://www.blogjava.net/envoydada/comments/131433.html</wfw:comment><comments>http://www.blogjava.net/envoydada/archive/2007/07/20/131433.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/envoydada/comments/commentRss/131433.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/envoydada/services/trackbacks/131433.html</trackback:ping><description><![CDATA[<div style="FONT-SIZE: 10pt" align=center>
<div style="FONT-SIZE: 10pt">Hot Spot JVM5中的GC调优</div>
</div>
<br>
<p style="FONT-SIZE: 10pt" align=center>Written by Halatu Hubisi</p>
<br><span style="FONT-SIZE: 10pt">引言 <br>有JAVA开发经验的朋友们一定碰到过下面的这种情况,那就是自己所开发的应用运行了一段时间后其性能或者响应速度会有明显的降低.这是由多方面的原因造成的即有程序本身的优化问题,也有运行环境问题.此运行环境即包括硬件环境也包括软件环境.大多数人第一个能想到的解决方法是提升硬件的配置而忽略了程序本身的运行环境JVM也提供了比较多的调优选项.本文将重点描述利用JVM的一些选项对GC进行调优.</span>
<h2></h2>
<p style="FONT-SIZE: 10pt">约定:<br>1.读者应具备一定JAVA的知识. </p>
<p style="FONT-SIZE: 10pt">2.本文中的JVM选项均以SUN公司发布的HotSpot JVM 5为准（不过大多数的选项在JVM1.3,JVM1.4中也是可用的）. </p>
<p style="FONT-SIZE: 10pt">3.以JAVA_HOME下demo/jfc/SwingSet2/SwingSet2.jar为例进行说明. </p>
<p style="FONT-SIZE: 10pt">4.阅读本文需要一些关于GC的知识，可以到附录A中了解这些知识。 </p>
<p style="FONT-SIZE: 10pt">关键字:<br>JVM(java虚拟机),调优,GC(垃圾回收)</p>
<p style="FONT-SIZE: 10pt">JVM GC调优<br>为了能够将JVM GC的调优能够使用在具体的实践当中,下面将利用若干个例子来说明GC的调优.<br>例1：Heap size 设置<br>JVM堆的设置是指java程序运行过程中JVM可以调配使用的内存空间的设置.JVM在启动的时候会自动设置Heap size的值，其初始空间(即-Xms)是物理内存的1/64，最大空间(-Xmx)是物理内存的1/4。可以利用JVM提供的-Xmn -Xms -Xmx等选项可进行设置。Heap size 的大小是Young Generation 和Tenured Generaion 之和。<br>当在JAVA_HOME下demo/jfc/SwingSet2/目录下执行下面的命令。<br>java -jar -Xmn4m -Xms16m -Xmx16m SwingSet2.jar<br>系统输出为：</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">Exception&nbsp;in&nbsp;thread&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Image&nbsp;Fetcher&nbsp;0</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;java.lang.OutOfMemoryError:&nbsp;Java&nbsp;heap&nbsp;space<br>Exception&nbsp;in&nbsp;thread&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Image&nbsp;Fetcher&nbsp;3</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;java.lang.OutOfMemoryError:&nbsp;Java&nbsp;heap&nbsp;space<br>Exception&nbsp;in&nbsp;thread&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Image&nbsp;Fetcher&nbsp;1</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;java.lang.OutOfMemoryError:&nbsp;Java&nbsp;heap&nbsp;space<br>Exception&nbsp;in&nbsp;thread&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Image&nbsp;Fetcher&nbsp;2</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;java.lang.OutOfMemoryError:&nbsp;Java&nbsp;heap&nbsp;space</span></div>
<p style="FONT-SIZE: 10pt"><br>除了这些异常信息外，还会发现程序的响应速度变慢了。这说明Heap size 设置偏小，GC占用了更多的时间，而应用分配到的执行时间较少。<br>提示：在JVM中如果98％的时间是用于GC且可用的Heap size 不足2％的时候将抛出此异常信息。<br>将上面的命令换成以下命令执行则应用能够正常使用，且未抛出任何异常。<br>java -jar -Xmn4m -Xms16m -Xmx32m SwingSet2.jar<br>提示：Heap Size 最大不要超过可用物理内存的80％，一般的要将-Xms和-Xmx选项设置为相同，而-Xmn为1/4的-Xmx值。 </p>
<p style="FONT-SIZE: 10pt">例2：Young Generation（-Xmn）的设置<br>在本例中看一下Young Generation的设置不同将有什么现象发生。<br>假设将Young generation 的大小设置为4M ，即执行java -jar -verbose:gc -Xmn4m -Xms32m -Xmx32m -XX:+PrintGCDetails SwingSet2.jar，屏幕输出如下（节选）</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">[GC&nbsp;[DefNew:&nbsp;3968K</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">64K(4032K),&nbsp;</span><span style="COLOR: #000000">0.0923407</span><span style="COLOR: #000000">&nbsp;secs]&nbsp;3968K</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">2025K(32704K),&nbsp;</span><span style="COLOR: #000000">0.0931870</span><span style="COLOR: #000000">&nbsp;secs]<br>[GC&nbsp;[DefNew:&nbsp;4021K</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">64K(4032K),&nbsp;</span><span style="COLOR: #000000">0.0356847</span><span style="COLOR: #000000">&nbsp;secs]&nbsp;5983K</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">2347K(32704K),&nbsp;</span><span style="COLOR: #000000">0.0365441</span><span style="COLOR: #000000">&nbsp;secs]<br>[GC&nbsp;[DefNew:&nbsp;3995K</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">39K(4032K),&nbsp;</span><span style="COLOR: #000000">0.0090603</span><span style="COLOR: #000000">&nbsp;secs]&nbsp;6279K</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">2372K(32704K),&nbsp;</span><span style="COLOR: #000000">0.0093377</span><span style="COLOR: #000000">&nbsp;secs]<br>[GC&nbsp;[DefNew:&nbsp;3992K</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">23K(4032K),&nbsp;</span><span style="COLOR: #000000">0.0057540</span><span style="COLOR: #000000">&nbsp;secs]&nbsp;6325K</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">2356K(32704K),&nbsp;</span><span style="COLOR: #000000">0.0060290</span><span style="COLOR: #000000">&nbsp;secs]<br>[GC&nbsp;[DefNew:&nbsp;3984K</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">27K(4032K),&nbsp;</span><span style="COLOR: #000000">0.0013058</span><span style="COLOR: #000000">&nbsp;secs]&nbsp;6317K</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">2360K(32704K),&nbsp;</span><span style="COLOR: #000000">0.0015888</span><span style="COLOR: #000000">&nbsp;secs]<br>[GC&nbsp;[DefNew:&nbsp;3981K</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">59K(4032K),&nbsp;</span><span style="COLOR: #000000">0.0023307</span><span style="COLOR: #000000">&nbsp;secs]&nbsp;6315K</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">2422K(32704K),&nbsp;</span><span style="COLOR: #000000">0.0026091</span><span style="COLOR: #000000">&nbsp;secs]</span></div>
<p style="FONT-SIZE: 10pt"><br>将程序体制并将Young Generation的大小设置为8M，即执行java -jar -verbose:gc -Xmn8m -Xms32m -Xmx32m -XX:+PrintGCDetails SwingSet2.jar，屏幕输出如下（节选）</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">[GC&nbsp;[DefNew:&nbsp;7808K</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">192K(8000K),&nbsp;</span><span style="COLOR: #000000">0.1016784</span><span style="COLOR: #000000">&nbsp;secs]&nbsp;7808K</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">2357K(32576K),&nbsp;</span><span style="COLOR: #000000">0.1022834</span><span style="COLOR: #000000">&nbsp;secs]<br>[GC&nbsp;[DefNew:&nbsp;8000K</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">70K(8000K),&nbsp;</span><span style="COLOR: #000000">0.0149659</span><span style="COLOR: #000000">&nbsp;secs]&nbsp;10165K</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">2413K(32576K),&nbsp;</span><span style="COLOR: #000000">0.0152557</span><span style="COLOR: #000000">&nbsp;secs]<br>[GC&nbsp;[DefNew:&nbsp;7853K</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">59K(8000K),&nbsp;</span><span style="COLOR: #000000">0.0069122</span><span style="COLOR: #000000">&nbsp;secs]&nbsp;10196K</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">2403K(32576K),&nbsp;</span><span style="COLOR: #000000">0.0071843</span><span style="COLOR: #000000">&nbsp;secs]<br>[GC&nbsp;[DefNew:&nbsp;7867K</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">171K(8000K),&nbsp;</span><span style="COLOR: #000000">0.0075745</span><span style="COLOR: #000000">&nbsp;secs]&nbsp;10211K</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">2681K(32576K),&nbsp;</span><span style="COLOR: #000000">0.0078376</span><span style="COLOR: #000000">&nbsp;secs]<br>[GC&nbsp;[DefNew:&nbsp;7970K</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">192K(8000K),&nbsp;</span><span style="COLOR: #000000">0.0201353</span><span style="COLOR: #000000">&nbsp;secs]&nbsp;10480K</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">2923K(32576K),&nbsp;</span><span style="COLOR: #000000">0.0206867</span><span style="COLOR: #000000">&nbsp;secs]<br>[GC&nbsp;[DefNew:&nbsp;7979K</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">30K(8000K),&nbsp;</span><span style="COLOR: #000000">0.1787079</span><span style="COLOR: #000000">&nbsp;secs]&nbsp;10735K</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">4824K(32576K),&nbsp;</span><span style="COLOR: #000000">0.1790065</span><span style="COLOR: #000000">&nbsp;secs]</span></div>
<p style="FONT-SIZE: 10pt"><br>那么根据GC输出的信息（这里取第一行）做一下Minor收集的比较。可以看出两次的Minor收集分别在Young generation中找回3904K（3968K-&gt;64K）和7616K(7808K-&gt;192K)而对于整个jvm则找回1943K（3968K-&gt;2025）和5451K（7808K-&gt;2357K）。第一种情况下Minor收集了大约50％（1943/3904）的对象，而另外的50％的对象则被移到了tenured generation。在第二中情况下Minor收集了大约72％的对象，只有不到30％的对象被移到了Tenured Generation.这个例子说明此应用在的Young generation 设置为4m时显的偏小。<br>提示：一般的Young Generation的大小是整个Heap size的1/4。Young generation的minor收集率应一般在70％以上。当然在实际的应用中需要根据具体情况进行调整。</p>
<p style="FONT-SIZE: 10pt">例3：Young Generation对应用响应的影响<br>还是使用-Xmn4m 和-Xmn8m进行比较，先执行下面的命令<br></p>
<p style="FONT-SIZE: 10pt">java -jar -verbose:gc -Xmn4m -Xms32m -Xmx32m -XX:+PrintGCDetails -XX:+PrintGCApplicationConcurrentTime -XX:+PrintGCApplicationStoppedTime SwingSet2.jar<br>屏幕输出如下（节选）</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">Application&nbsp;time:&nbsp;</span><span style="COLOR: #000000">0.5114944</span><span style="COLOR: #000000">&nbsp;seconds<br>[GC&nbsp;[DefNew:&nbsp;3968K</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">64K(4032K),&nbsp;</span><span style="COLOR: #000000">0.0823952</span><span style="COLOR: #000000">&nbsp;secs]&nbsp;3968K</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">2023K(32704K),&nbsp;</span><span style="COLOR: #000000">0.0827626</span><span style="COLOR: #000000">&nbsp;secs]<br>Total&nbsp;time&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;which&nbsp;application&nbsp;threads&nbsp;were&nbsp;stopped:&nbsp;</span><span style="COLOR: #000000">0.0839428</span><span style="COLOR: #000000">&nbsp;seconds<br>Application&nbsp;time:&nbsp;</span><span style="COLOR: #000000">0.9871271</span><span style="COLOR: #000000">&nbsp;seconds<br>[GC&nbsp;[DefNew:&nbsp;4020K</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">64K(4032K),&nbsp;</span><span style="COLOR: #000000">0.0412448</span><span style="COLOR: #000000">&nbsp;secs]&nbsp;5979K</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">2374K(32704K),&nbsp;</span><span style="COLOR: #000000">0.0415248</span><span style="COLOR: #000000">&nbsp;secs]<br>Total&nbsp;time&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;which&nbsp;application&nbsp;threads&nbsp;were&nbsp;stopped:&nbsp;</span><span style="COLOR: #000000">0.0464380</span><span style="COLOR: #000000">&nbsp;seconds</span></div>
<p style="FONT-SIZE: 10pt"><br>Young Generation 的Minor收集占用的时间可以计算如下：应用线程被中断的总时常/（应用执行总时?L+应用线程被中断的总时常），那么在本例中垃圾收集占用的时?L约为系统的5％~14％。那么当垃圾收集占用的时间的比例越大的时候，系统的响应将越慢。<br>提示：对于互联网应用系统的响应稍微慢一些，用户是可以接受的，但是对于GUI类型的应用响应速度慢将会给用户带来非常不好的体验。</p>
<p style="FONT-SIZE: 10pt">例4：如何决定Tenured Generation 的大小<br>分别以-Xmn8m -Xmx32m和-Xmn8m -Xmx64m进行对比，先执行<br>java -verbose:gc -Xmn8m -Xmx32m-XX:+PririntGCDetails -XX:+PrintGCTimeStamps java类，命令行将提示（只提取了Major收集）</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">111.042</span><span style="COLOR: #000000">:&nbsp;[GC&nbsp;</span><span style="COLOR: #000000">111.042</span><span style="COLOR: #000000">:&nbsp;[DefNew:&nbsp;8128K</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">8128K(8128K),&nbsp;</span><span style="COLOR: #000000">0.0000505</span><span style="COLOR: #000000">&nbsp;secs]</span><span style="COLOR: #000000">111.042</span><span style="COLOR: #000000">:&nbsp;[Tenured:&nbsp;18154K</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">2311K(24576K),&nbsp;</span><span style="COLOR: #000000">0.1290354</span><span style="COLOR: #000000">&nbsp;secs]&nbsp;26282K</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">2311K(32704K),&nbsp;</span><span style="COLOR: #000000">0.1293306</span><span style="COLOR: #000000">&nbsp;secs]<br></span><span style="COLOR: #000000">122.463</span><span style="COLOR: #000000">:&nbsp;[GC&nbsp;</span><span style="COLOR: #000000">122.463</span><span style="COLOR: #000000">:&nbsp;[DefNew:&nbsp;8128K</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">8128K(8128K),&nbsp;</span><span style="COLOR: #000000">0.0000560</span><span style="COLOR: #000000">&nbsp;secs]</span><span style="COLOR: #000000">122.463</span><span style="COLOR: #000000">:&nbsp;[Tenured:&nbsp;18630K</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">2366K(24576K),&nbsp;</span><span style="COLOR: #000000">0.1322560</span><span style="COLOR: #000000">&nbsp;secs]&nbsp;26758K</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">2366K(32704K),&nbsp;</span><span style="COLOR: #000000">0.1325284</span><span style="COLOR: #000000">&nbsp;secs]<br></span><span style="COLOR: #000000">133.896</span><span style="COLOR: #000000">:&nbsp;[GC&nbsp;</span><span style="COLOR: #000000">133.897</span><span style="COLOR: #000000">:&nbsp;[DefNew:&nbsp;8128K</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">8128K(8128K),&nbsp;</span><span style="COLOR: #000000">0.0000443</span><span style="COLOR: #000000">&nbsp;secs]</span><span style="COLOR: #000000">133.897</span><span style="COLOR: #000000">:&nbsp;[Tenured:&nbsp;18240K</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">2573K(24576K),&nbsp;</span><span style="COLOR: #000000">0.1340199</span><span style="COLOR: #000000">&nbsp;secs]&nbsp;26368K</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">2573K(32704K),&nbsp;</span><span style="COLOR: #000000">0.1343218</span><span style="COLOR: #000000">&nbsp;secs]<br></span><span style="COLOR: #000000">144.112</span><span style="COLOR: #000000">:&nbsp;[GC&nbsp;</span><span style="COLOR: #000000">144.112</span><span style="COLOR: #000000">:&nbsp;[DefNew:&nbsp;8128K</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">8128K(8128K),&nbsp;</span><span style="COLOR: #000000">0.0000544</span><span style="COLOR: #000000">&nbsp;secs]</span><span style="COLOR: #000000">144.112</span><span style="COLOR: #000000">:&nbsp;[Tenured:&nbsp;16564K</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">2304K(24576K),&nbsp;</span><span style="COLOR: #000000">0.1246831</span><span style="COLOR: #000000">&nbsp;secs]&nbsp;24692K</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">2304K(32704K),&nbsp;</span><span style="COLOR: #000000">0.1249602</span><span style="COLOR: #000000">&nbsp;secs]</span></div>
<p style="FONT-SIZE: 10pt"><br>再执行java -verbose:gc -Xmn8m -Xmx64m-XX:+PririntGCDetails -XX:+PrintGCTimeStamps java类，命令行将提示（只提取了Major收集）</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">90.597</span><span style="COLOR: #000000">:&nbsp;[GC&nbsp;</span><span style="COLOR: #000000">90.597</span><span style="COLOR: #000000">:&nbsp;[DefNew:&nbsp;8128K</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">8128K(8128K),&nbsp;</span><span style="COLOR: #000000">0.0000542</span><span style="COLOR: #000000">&nbsp;secs]</span><span style="COLOR: #000000">90.597</span><span style="COLOR: #000000">:&nbsp;[Tenured:&nbsp;49841K</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">5141K(57344K),&nbsp;</span><span style="COLOR: #000000">0.2129882</span><span style="COLOR: #000000">&nbsp;secs]&nbsp;57969K</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">5141K(65472K),&nbsp;</span><span style="COLOR: #000000">0.2133274</span><span style="COLOR: #000000">&nbsp;secs]<br></span><span style="COLOR: #000000">120.899</span><span style="COLOR: #000000">:&nbsp;[GC&nbsp;</span><span style="COLOR: #000000">120.899</span><span style="COLOR: #000000">:&nbsp;[DefNew:&nbsp;8128K</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">8128K(8128K),&nbsp;</span><span style="COLOR: #000000">0.0000550</span><span style="COLOR: #000000">&nbsp;secs]</span><span style="COLOR: #000000">120.899</span><span style="COLOR: #000000">:&nbsp;[Tenured:&nbsp;50384K</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">2430K(57344K),&nbsp;</span><span style="COLOR: #000000">0.2216590</span><span style="COLOR: #000000">&nbsp;secs]&nbsp;58512K</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">2430K(65472K),&nbsp;</span><span style="COLOR: #000000">0.2219384</span><span style="COLOR: #000000">&nbsp;secs]<br></span><span style="COLOR: #000000">153.968</span><span style="COLOR: #000000">:&nbsp;[GC&nbsp;</span><span style="COLOR: #000000">153.968</span><span style="COLOR: #000000">:&nbsp;[DefNew:&nbsp;8128K</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">8128K(8128K),&nbsp;</span><span style="COLOR: #000000">0.0000511</span><span style="COLOR: #000000">&nbsp;secs]</span><span style="COLOR: #000000">153.968</span><span style="COLOR: #000000">:&nbsp;[Tenured:&nbsp;51164K</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">2309K(57344K),&nbsp;</span><span style="COLOR: #000000">0.2193906</span><span style="COLOR: #000000">&nbsp;secs]&nbsp;59292K</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">2309K(65472K),&nbsp;</span><span style="COLOR: #000000">0.2196372</span><span style="COLOR: #000000">&nbsp;secs]</span></div>
<p style="FONT-SIZE: 10pt"><br>可以看出在Heap size 为32m的时候系统等候时间约为0.13秒左右，而设置为64m的时候等候时间则增大到0.22秒左右了。但是在32m的时候系统的Major收集间隔为10秒左右，而Heap size 增加到64m的时候为30秒。那么应用在运行的时候是选择32m还是64m呢？如果应用是web类型（即要求有大的吞吐量）的应用则使用64m（即heapsize大一些）的比较好。对于要求实时响应要求较高的场合（例如GUI型的应用）则使用32m比较好一些。 <br>注意：<br>1。因为在JVM5运行时已经对Heap-size进行了优化，所以在能确定java应用运行时不会超过默认的Heap size的情况下建议不要对这些值进行修改。<br>2。Heap size的 -Xms -Xmn 设置不要超出物理内存的大小。否则会提示&#8220;Error occurred during initialization of VM Could not reserve enough space for object heap&#8221;。</p>
<p style="FONT-SIZE: 10pt">例5:如何缩短minor收集的时间<br>下面比较一下采用-XX:+UseParNewGC选项和不采用它的时候的minor收集将有什么不同。先执行<br>java -jar -server -verbose:gc -Xmn8m -Xms32m -Xmx32m SwingSet2.jar <br>系统将输出如下信息（片段〕</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">[GC&nbsp;7807K</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">2641K(32576K),&nbsp;</span><span style="COLOR: #000000">0.0676654</span><span style="COLOR: #000000">&nbsp;secs]<br>[GC&nbsp;10436K</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">3108K(32576K),&nbsp;</span><span style="COLOR: #000000">0.0245328</span><span style="COLOR: #000000">&nbsp;secs]<br>[GC&nbsp;10913K</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">3176K(32576K),&nbsp;</span><span style="COLOR: #000000">0.0072865</span><span style="COLOR: #000000">&nbsp;secs]<br>[GC&nbsp;10905K</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">4097K(32576K),&nbsp;</span><span style="COLOR: #000000">0.0223928</span><span style="COLOR: #000000">&nbsp;secs]</span></div>
<p style="FONT-SIZE: 10pt"><br>之后再执行 java -jar -server -verbose:gc -XX:+UseParNewGC -Xmn8m -Xms32m -Xmx32m SwingSet2.jar<br>系统将输出如下信息（片段〕</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">[ParNew&nbsp;7808K</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">2656K(32576K),&nbsp;</span><span style="COLOR: #000000">0.0447687</span><span style="COLOR: #000000">&nbsp;secs]<br>[ParNew&nbsp;10441K</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">3143K(32576K),&nbsp;</span><span style="COLOR: #000000">0.0179422</span><span style="COLOR: #000000">&nbsp;secs]<br>[ParNew&nbsp;10951K</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">3177K(32576K),&nbsp;</span><span style="COLOR: #000000">0.0031914</span><span style="COLOR: #000000">&nbsp;secs]<br>[ParNew&nbsp;10985K</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">3867K(32576K),&nbsp;</span><span style="COLOR: #000000">0.0154991</span><span style="COLOR: #000000">&nbsp;secs]<br></span></div>
<p style="FONT-SIZE: 10pt">很显然使用了-XX:+UseParNewGC选项的minor收集的时间要比不使用的时候优。 </p>
<p style="FONT-SIZE: 10pt">例6:如何缩短major收集的时间<br>下面比较一下采用-XX:+UseConcMarkSweepGC选项和不采用它的时候的major收集将有什么不同。先执行<br>java -jar -verbose:gc -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -Xmn64m -Xms256m -Xmx256m SwingSet2.jar<br>系统将输出如下信息（片段〕</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">[Full&nbsp;GC&nbsp;22972K</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">18690K(262080K),&nbsp;</span><span style="COLOR: #000000">0.2326676</span><span style="COLOR: #000000">&nbsp;secs]<br>[Full&nbsp;GC&nbsp;18690K</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">18690K(262080K),&nbsp;</span><span style="COLOR: #000000">0.1701866</span><span style="COLOR: #000000">&nbsp;secs</span></div>
<p style="FONT-SIZE: 10pt"><br>之后再执行 java -jar -verbose:gc -XX:+UseParNewGC -Xmn64m -Xms256m -Xmx256m SwingSet2.jar<br>系统将输出如下信息（片段〕<br>[Full GC 56048K-&gt;18869K(260224K), 0.3104852 secs]<br>提示：此选项在Heap Size 比较大而且Major收集时间较长的情况下使用更合适。</p>
<p style="FONT-SIZE: 10pt">例7:关于-server选项 在JVM中将运行中的类认定为server-class的时候使用此选项。SUN 的Hot Spot JVM5 如果判断到系统的配置满足如下条件则自动将运行的类认定为server-class，并且会自动设置jvm的选项（当没有手工设置这选项的时候〕而且HOTSPOT JVM5提供了自动调优的功能，他会根据JVM的运行情况进行调整。如果没有特别的需要是不需要太多的人工干预的。SUN形象的称这个机制为&#8220;人体工学&#8221;（Ergonomics〕。具体可以参考http://java.sun.com/docs/hotspot/gc5.0/ergo5.html<br>*.具有2个或更多个物理的处理器<br>*.具有2G或者更多的物理内存<br>提示：此选项要放在所有选项的前面。例如：java -server 其他选项 java类 </p>
<p style="FONT-SIZE: 10pt">附录A:预备知识<br>．JVM中对象的划分及管理 </p>
<p style="FONT-SIZE: 10pt">JVM根据运行于其中的对象的生存时间大致的分为3种。并且将这3种不同的对象分别存放在JVM从系统分配到的不同的内存空间。这种对象存放空间的管理方式叫做Generation管理方式。<br>1。Young Generation：用于存放&#8220;早逝&#8221;对象（即瞬时对象）。例如：在创建对象时或者调用方法时使用的临时对象或局部变量。<br>2。Tenured Generation：用于存放&#8220;驻留&#8221;对象（即较长时间被引用的对象）。往往体现为一个大型程序中的全局对象或长时间被使用的对象。<br>3。Perm Generation：用于存放&#8220;永久&#8221;对象。这些对象管理着运行于JVM中的类和方法。</p>
<p style="FONT-SIZE: 10pt">．JVM选项的分类 </p>
<p style="FONT-SIZE: 10pt">JVM有这么几种选项供使用.<br>1.供-X选项使用的项目,又称为非标准选项，不同厂商的此类型选项是有所不同的。例如：IBM的JVM用的一些选项在Sun的JVM中就不一定能生效。这种选项的使用方式如下:<br>java -Xmn16m -Xms64m -Xmx64m java类名<br>2.供-XX选项使用的项目，这种类型的选项可能要求有对系统信息访问的权限。所以要慎用。这种选项的使用方式如下:<br>java -XX:MaxHeapFreeRatio=70 -XX:+PrintGCDetails java类名<br>3.java选项(即在命令行执行java后提示的选项).<br>java -server -verbose:gc -d64 java类名 </p>
<p style="FONT-SIZE: 10pt">．垃圾收集分类 </p>
<p style="FONT-SIZE: 10pt">在JVM中有两种垃圾方式，一种叫做Minor（次收集），另一种叫做Major（主收集）。其中Minor在Young Generation的空间被对象全部占用后执行，主要是对Young Generation中的对象进行垃圾收集。而Major是针对于整个Heap size的垃圾收集。其中Minor方式的收集经常发生，并且Minor收集所占用的系统时间小。Major方式的垃圾收集则是一种&#8220;昂贵&#8221;的垃圾收集方式，因为在Major要对整个Heap size进行垃圾收集,这会使得应用停顿的时间变得较长。</p>
<p style="FONT-SIZE: 10pt">．GC信息的格式 </p>
<p style="FONT-SIZE: 10pt"></p>
<p style="FONT-SIZE: 10pt">[GC [&lt;collector&gt;: &lt;starting occupancy1&gt; -&gt; &lt;ending occupancy1&gt;, &lt;pause time1&gt; secs] &lt;starting occupancy3&gt; -&gt; &lt;ending occupancy3&gt;, &lt;pause time3&gt; secs]<br>&lt;collector&gt; GC为minor收集过程中使用的垃圾收集器起的内部名称.<br>&lt;starting occupancy1&gt; young generation 在进行垃圾收集前被对象使用的存储空间.<br>&lt;ending occupancy1&gt; young generation 在进行垃圾收集后被对象使用的存储空间<br>&lt;pause time1&gt; minor收集使应用暂停的时间长短(秒) <br>&lt;starting occupancy3&gt; 整个堆(Heap Size)在进行垃圾收集前被对象使用的存储空间<br>&lt;ending occupancy3&gt; 整个堆(Heap Size)在进行垃圾收集后被对象使用的存储空间<br>&lt;pause time3&gt; 整个垃圾收集使应用暂停的时间长短(秒),包括major收集使应用暂停的时间(如果发生了major收集).<br>．GC信息的选项<br>-XX:+PrintGCDetails 显示GC的详细信息<br>-XX:+PrintGCApplicationConcurrentTime 打印应用执行的时间<br>-XX:+PrintGCApplicationStoppedTime 打印应用被暂停的时间<br>提示:1.":"后的"+"号表示开启此选项,如果是"-"号那么表示关闭此选项。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.在不同的选项和不同的收集方式和类型下输出的格式会有所不同。 </p>
<p style="FONT-SIZE: 10pt">附录B：HotSpot JVM 选项<br>请参考<a href="http://java.sun.com/docs/hotspot/VMOptions.html">JavaTM HotSpot VM Options</a></p>
<p style="FONT-SIZE: 10pt">附录C：其他资源<br><a href="http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html">http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html</a><br><a href="http://java.sun.com/docs/hotspot/gc5.0/ergo5.html">http://java.sun.com/docs/hotspot/gc5.0/ergo5.html</a><br></p>
 <img src ="http://www.blogjava.net/envoydada/aggbug/131433.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/envoydada/" target="_blank">Derek.Guo</a> 2007-07-20 11:53 <a href="http://www.blogjava.net/envoydada/archive/2007/07/20/131433.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring配置总结</title><link>http://www.blogjava.net/envoydada/archive/2007/07/20/131410.html</link><dc:creator>Derek.Guo</dc:creator><author>Derek.Guo</author><pubDate>Fri, 20 Jul 2007 02:00:00 GMT</pubDate><guid>http://www.blogjava.net/envoydada/archive/2007/07/20/131410.html</guid><wfw:comment>http://www.blogjava.net/envoydada/comments/131410.html</wfw:comment><comments>http://www.blogjava.net/envoydada/archive/2007/07/20/131410.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/envoydada/comments/commentRss/131410.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/envoydada/services/trackbacks/131410.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: web.xml载入Log4j配置&lt;context-param&gt;&lt;!--Log4j配置 在同一容器中部署多个应用不能使用默认的webAppRootKey,必须指定唯一KEY,以免冲突--&gt;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param-name&gt;webAppRootKey&lt;/param-name&gt;&nbsp;&nb...&nbsp;&nbsp;<a href='http://www.blogjava.net/envoydada/archive/2007/07/20/131410.html'>阅读全文</a><img src ="http://www.blogjava.net/envoydada/aggbug/131410.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/envoydada/" target="_blank">Derek.Guo</a> 2007-07-20 10:00 <a href="http://www.blogjava.net/envoydada/archive/2007/07/20/131410.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JmakiDemo</title><link>http://www.blogjava.net/envoydada/archive/2007/07/04/128069.html</link><dc:creator>Derek.Guo</dc:creator><author>Derek.Guo</author><pubDate>Wed, 04 Jul 2007 04:46:00 GMT</pubDate><guid>http://www.blogjava.net/envoydada/archive/2007/07/04/128069.html</guid><wfw:comment>http://www.blogjava.net/envoydada/comments/128069.html</wfw:comment><comments>http://www.blogjava.net/envoydada/archive/2007/07/04/128069.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/envoydada/comments/commentRss/128069.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/envoydada/services/trackbacks/128069.html</trackback:ping><description><![CDATA[<span class="style7">&nbsp;&nbsp;&nbsp; jMaki是SUN支持的一个AJAX框架。这个项目的是让Java开发人员在其基于Java的应用程序中(不管是JSP标签库还是JSF组件)都能使用AJAX技术。jMaki使用了Java与JavaScript中最优秀的部分以此来提供一些Rich
AJAX style widgets。jMaki当前提供的bootstrap widget是来自<a  href="http://dojotoolkit.org/">Dojo</a>,<a  href="http://script.aculo.us/">Scriptaculus</a>,<a  href="http://developer.yahoo.com/yui/">Yahoo UI Widgets</a>,<a  href="http://labs.adobe.com/technologies/spry/">Spry</a>,<a  href="http://www.dhtmlgoodies.com/">DHTML Goodies</a>,和<a  href="http://www.google.com/">Google</a>等组件库。jMaki提供为这些widget组件库提供了一个公共接口以便让你可以在同一页面中一起使用这些组件库。</span><br><br>Jmaki WebSide:https://ajax.dev.java.net/<br>JmakiDemo: http://www.javapassion.com/handsonlabs/ajaxjmakiintro/<br> <img src ="http://www.blogjava.net/envoydada/aggbug/128069.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/envoydada/" target="_blank">Derek.Guo</a> 2007-07-04 12:46 <a href="http://www.blogjava.net/envoydada/archive/2007/07/04/128069.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate3支持DetachedCriteria(转贴)</title><link>http://www.blogjava.net/envoydada/archive/2007/06/08/122881.html</link><dc:creator>Derek.Guo</dc:creator><author>Derek.Guo</author><pubDate>Fri, 08 Jun 2007 08:46:00 GMT</pubDate><guid>http://www.blogjava.net/envoydada/archive/2007/06/08/122881.html</guid><wfw:comment>http://www.blogjava.net/envoydada/comments/122881.html</wfw:comment><comments>http://www.blogjava.net/envoydada/archive/2007/06/08/122881.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/envoydada/comments/commentRss/122881.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/envoydada/services/trackbacks/122881.html</trackback:ping><description><![CDATA[<div style="FONT-SIZE: 12px">Hibernate3支持DetachedCriteria，这是一个非常有意义的特性！我们知道，在常规的Web编程中，有大量的动态条件查询，即用户在网页上面自由选择某些条件，程序根据用户的选择条件，动态生成SQL语句，进行查询。 <br><br>　　针对这种需求，对于分层应用程序来说，Web层需要传递一个查询的条件列表给业务层对象，业务层对象获得这个条件列表之后，然后依次取出条件，构造查询语句。这里的一个难点是条件列表用什么来构造？传统上使用Map，但是这种方式缺陷很大，Map可以传递的信息非常有限，只能传递name和value，无法传递究竟要做怎样的条件运算，究竟是大于，小于，like，还是其它的什么，业务层对象必须确切掌握每条entry的隐含条件。因此一旦隐含条件改变，业务层对象的查询构造算法必须相应修改，但是这种查询条件的改变是隐式约定的，而不是程序代码约束的，因此非常容易出错。 <br><br>　　DetachedCriteria可以解决这个问题，即在web层，程序员使用DetachedCriteria来构造查询条件，然后将这个DetachedCriteria作为方法调用参数传递给业务层对象。而业务层对象获得DetachedCriteria之后，可以在session范围内直接构造Criteria，进行查询。就此，查询语句的构造完全被搬离到web层实现，而业务层则只负责完成持久化和查询的封装即可，与查询条件构造完全解耦，非常完美！这恐怕也是以前很多企图在web层代码中构造HQL语句的人想实现的梦想吧！ <br><br>　　示例代码片段如下： <br><br>　　web层程序构造查询条件： <br><br>　　java代码:
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">DetachedCriteria&nbsp;detachedCriteria&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;DetachedCriteria.forClass(Department.</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">);&nbsp;<br>detachedCriteria.add(Restrictions.eq(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">name</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">department</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)).createAlias(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">employees</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">e</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">).add(Restrictions.gt((</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">e.age</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">),&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Integer(</span><span style="COLOR: #000000">20</span><span style="COLOR: #000000">)));</span></div>
<br><br>　　Department和Employee是一对多关联，查询条件为： <br><br>　　名称是&#8220;department&#8221;开发部门； <br>　　部门里面的雇员年龄大于20岁； <br><br>　　业务层对象使用该条件执行查询： <br><br>　　java代码:
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">detachedCriteria.getExecutableCriteria(session).list();</span></div>
<br><br>　　最大的意义在于，业务层代码是固定不变的，所有查询条件的构造都在web层完成，业务层只负责在session内执行之。这样代码就可放之四海而皆准，都无须修改了。<br><br>　　然而Spring和Hibernate3的DetachedCriteria有不兼容的问题，因此在Spring环境下面使用Hibernate3需要注意： <br><br>　　Spring的HibernateTemplate提供了Hibernate的完美封装，即通过匿名类实现回调，来保证Session的自动资源管理和事务的管理。其中核心方法是： <br><br>　　java代码:
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">HibernateTemplate.execute(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;HibernateCallback()&nbsp;{&nbsp;<br>　</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;Object&nbsp;doInHibernate(Session&nbsp;session)&nbsp;</span><span style="COLOR: #0000ff">throws</span><span style="COLOR: #000000">&nbsp;HibernateException&nbsp;{&nbsp;<br>　　<img src="http://www.blogjava.net/Images/dot.gif">.&nbsp;<br>　}&nbsp;<br>}</span></div>
<br><br>　　回调方法提供了session作为参数，有了session，就可以自由的使用Hibernate API编程了。使用了spring的之后，代码修改如下： <br><br>　　web层代码： <br><br>　　java代码:
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">DetachedCriteria&nbsp;detachedCriteria&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;DetachedCriteria.forClass(Department.</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">);&nbsp;<br>detachedCriteria.createAlias(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">employees</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">e</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">).add(Restrictions.eq(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">name</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">department</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)).add(Restrictions.gt((</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">e.age</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">),&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Integer(</span><span style="COLOR: #000000">20</span><span style="COLOR: #000000">)));&nbsp;<br>departmentManager.findByCriteria(detachedCriteria);</span></div>
<br><br>　　构造detachedCriteria，作为参数传递给departmentManager <br><br>　　业务层代码使用spring，DepartmentManager的findByCriteria如下： <br><br>　　java代码:
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;List&nbsp;findByCriteria(</span><span style="COLOR: #0000ff">final</span><span style="COLOR: #000000">&nbsp;DetachedCriteria&nbsp;detachedCriteria)&nbsp;{&nbsp;<br>　</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;(List)&nbsp;getHibernateTemplate().execute(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;HibernateCallback()&nbsp;{&nbsp;<br>　　</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;Object&nbsp;doInHibernate(Session&nbsp;session)&nbsp;</span><span style="COLOR: #0000ff">throws</span><span style="COLOR: #000000">&nbsp;HibernateException&nbsp;{&nbsp;<br>　　　Criteria&nbsp;criteria&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;detachedCriteria.getExecutableCriteria(session);&nbsp;<br>　　　</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;criteria.list();&nbsp;<br>　　}&nbsp;<br>　});&nbsp;<br>}</span></div>
<br><br>　　实际上也就是： <br><br>　　java代码:
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">Criteria&nbsp;criteria&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;detachedCriteria.getExecutableCriteria(session);&nbsp;<br></span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;criteria.list();&nbsp;</span></div>
<br><br>　　而已 <br><br>　　但是该程序代码执行，会抛出强制类型转换异常！ <br><br>　　跟踪了一下spring和Hibernate源代码，原因如下： <br><br>　　spring的HibernateTemplate的execute方法提供的回调接口具有Session作为参数，但是实际上，默认情况下，HibernateTemplate传递给回调接口的session并不是org.hibernate.impl.SessionImpl类，而是SessionImpl类的一个Proxy类。之所以替换成为一个Proxy类，HibernateTemplate的注释说明，Proxy提供了一些额外的功能，包括自动设置Cachable，Transaction的超时时间，Session资源的更积极的关闭等等。 <br><br>　　java代码:
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">boolean</span><span style="COLOR: #000000">&nbsp;exposeNativeSession&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">;&nbsp;<br></span></div>
<br><br>　　execute方法内部：
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">Session&nbsp;sessionToExpose&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(exposeNativeSession&nbsp;</span><span style="COLOR: #000000">?</span><span style="COLOR: #000000">&nbsp;session&nbsp;:&nbsp;createSessionProxy(session));&nbsp;<br></span></div>
<br>　　但是遗憾的是，Hibernate的DetachedCriteria的setExecutableCriteria方法却要求将session参数强制转为SessionImpl，但是spring传过来的却是一个Proxy类，因此就报错了。 <br><br>　　java代码:
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;Criteria&nbsp;getExecutableCriteria(Session&nbsp;session)&nbsp;{&nbsp;<br>　impl.setSession(&nbsp;(SessionImpl)&nbsp;session&nbsp;);&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;要求SessionImpl，Spring传递的是Proxy&nbsp;</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">　</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;impl;&nbsp;<br>}&nbsp;<br></span></div>
<br><br>　　解决方法，禁止Spring的HibernateTemplate传递Proxy类，强制要求它传递真实的SessionImpl类，即给exexute方法增加一个参数，提供参数为true，如下： <br><br>　　java代码:
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;List&nbsp;findByCriteria(</span><span style="COLOR: #0000ff">final</span><span style="COLOR: #000000">&nbsp;DetachedCriteria&nbsp;detachedCriteria)&nbsp;{&nbsp;<br>　</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;(List)&nbsp;getHibernateTemplate().execute(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;HibernateCallback()&nbsp;{&nbsp;<br>　　</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;Object&nbsp;doInHibernate(Session&nbsp;session)&nbsp;</span><span style="COLOR: #0000ff">throws</span><span style="COLOR: #000000">&nbsp;HibernateException&nbsp;{&nbsp;<br>　　　Criteria&nbsp;criteria&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;detachedCriteria.getExecutableCriteria(session);&nbsp;<br>　　　</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;criteria.list();&nbsp;<br>　　}&nbsp;<br>　},&nbsp;</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">);&nbsp;<br>}&nbsp;<br></span></div>
<br><br><!--广告代码开始--><script>
var ad_cid;
if (window.location.search.substring(1) != "")
{
ad_cid = window.location.search.substring(1);
} else {
ad_cid = 412;
}
</script><!--小通栏：c-scolumn顶部500*90-->
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008000">//</span><span style="COLOR: #008000">统计记录数</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">Criteria&nbsp;criteria&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;detachedCriteria.getExecutableCriteria(session);&nbsp;<br></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;totalCount&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;((Integer)&nbsp;criteria.setProjection(Projections.rowCount()).uniqueResult</span></div>
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </div>
 <img src ="http://www.blogjava.net/envoydada/aggbug/122881.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/envoydada/" target="_blank">Derek.Guo</a> 2007-06-08 16:46 <a href="http://www.blogjava.net/envoydada/archive/2007/06/08/122881.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA访问LDAP</title><link>http://www.blogjava.net/envoydada/archive/2007/05/09/116195.html</link><dc:creator>Derek.Guo</dc:creator><author>Derek.Guo</author><pubDate>Wed, 09 May 2007 07:12:00 GMT</pubDate><guid>http://www.blogjava.net/envoydada/archive/2007/05/09/116195.html</guid><wfw:comment>http://www.blogjava.net/envoydada/comments/116195.html</wfw:comment><comments>http://www.blogjava.net/envoydada/archive/2007/05/09/116195.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/envoydada/comments/commentRss/116195.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/envoydada/services/trackbacks/116195.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;java.util.Properties;<br></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;javax.naming.</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;javax.naming.ldap.</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&nbsp;javax.naming.directory.</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;Client&nbsp;{<br></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;main&nbsp;(String[]&nbsp;args)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;Properties&nbsp;env&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;Properties();<br>&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;adminName&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">usish\\derek</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;adminPassword&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">dada</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;ldapURL&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">LDAP://192.168.40.42:389</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br>&nbsp;&nbsp;&nbsp;&nbsp;env.put(Context.INITIAL_CONTEXT_FACTORY,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">com.sun.jndi.ldap.LdapCtxFactory</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">set&nbsp;security&nbsp;credentials,&nbsp;note&nbsp;using&nbsp;simple&nbsp;cleartext&nbsp;authentication</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;env.put(Context.SECURITY_AUTHENTICATION,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">simple</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br>&nbsp;&nbsp;&nbsp;&nbsp;env.put(Context.SECURITY_PRINCIPAL,&nbsp;adminName);<br>&nbsp;&nbsp;&nbsp;&nbsp;env.put(Context.SECURITY_CREDENTIALS,&nbsp;adminPassword);<br></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">connect&nbsp;to&nbsp;my&nbsp;domain&nbsp;controller</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;env.put(Context.PROVIDER_URL,&nbsp;ldapURL);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000">&nbsp;{<br></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Create&nbsp;the&nbsp;initial&nbsp;directory&nbsp;context</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LdapContext&nbsp;ctx&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;InitialLdapContext(env,&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">);<br><br></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Create&nbsp;the&nbsp;search&nbsp;controls</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SearchControls&nbsp;searchCtls&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;SearchControls();<br><br></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Specify&nbsp;the&nbsp;search&nbsp;scope</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);<br></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">specify&nbsp;the&nbsp;LDAP&nbsp;search&nbsp;filter</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;searchFilter&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">(&amp;(objectCategory=person)(objectClass=user)(name=004*))</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br><br></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Specify&nbsp;the&nbsp;Base&nbsp;for&nbsp;the&nbsp;search</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;searchBase&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">OU=USISH,DC=usish,DC=com,DC=cn</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">initialize&nbsp;counter&nbsp;to&nbsp;total&nbsp;the&nbsp;group&nbsp;members</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;totalResults&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Specify&nbsp;the&nbsp;attributes&nbsp;to&nbsp;return</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;returnedAtts[]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;{</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">memberOf</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">};<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;searchCtls.setReturningAttributes(returnedAtts);<br><br></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Search&nbsp;for&nbsp;objects&nbsp;using&nbsp;the&nbsp;filter</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NamingEnumeration&nbsp;answer&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;ctx.search(searchBase,&nbsp;searchFilter,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;searchCtls);<br></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Loop&nbsp;through&nbsp;the&nbsp;search&nbsp;results</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">&nbsp;(answer.hasMoreElements())&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SearchResult&nbsp;sr&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(SearchResult)&nbsp;answer.next();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;&gt;&gt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;sr.getName());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Print&nbsp;out&nbsp;the&nbsp;groups</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Attributes&nbsp;attrs&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;sr.getAttributes();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(attrs&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000">&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(NamingEnumeration&nbsp;ae&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;attrs.getAll();&nbsp;ae.hasMore();&nbsp;)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Attribute&nbsp;attr&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(Attribute)&nbsp;ae.next();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">AttributeID:&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;attr.getID());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(NamingEnumeration&nbsp;e&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;attr.getAll();&nbsp;e.hasMore();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;totalResults</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Attributes:</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">e.next());&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000">&nbsp;(NamingException&nbsp;e)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.err.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Problem&nbsp;listing&nbsp;membership:&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;e);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Total&nbsp;groups:&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;totalResults);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ctx.close();<br>&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000">&nbsp;(NamingException&nbsp;e)&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.err.println(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Problem&nbsp;searching&nbsp;directory:&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;e);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;}<br>}<br></span></div>
 <img src ="http://www.blogjava.net/envoydada/aggbug/116195.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/envoydada/" target="_blank">Derek.Guo</a> 2007-05-09 15:12 <a href="http://www.blogjava.net/envoydada/archive/2007/05/09/116195.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate 本地SQL查询SQLQuery</title><link>http://www.blogjava.net/envoydada/archive/2007/03/26/106322.html</link><dc:creator>Derek.Guo</dc:creator><author>Derek.Guo</author><pubDate>Mon, 26 Mar 2007 02:10:00 GMT</pubDate><guid>http://www.blogjava.net/envoydada/archive/2007/03/26/106322.html</guid><wfw:comment>http://www.blogjava.net/envoydada/comments/106322.html</wfw:comment><comments>http://www.blogjava.net/envoydada/archive/2007/03/26/106322.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/envoydada/comments/commentRss/106322.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/envoydada/services/trackbacks/106322.html</trackback:ping><description><![CDATA[		<p>使用SQLQuery<br />对原生SQL查询执行的控制是通过SQLQuery接口进行的，通过执行Session.createSQLQuery()获取这个接口。最简单的情况下，我们可以采用以下形式：</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #000000">List&#160;cats&#160;</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">&#160;sess.createSQLQuery(</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">select&#160;*&#160;from&#160;cats</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">).addEntity(Cat.</span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000">).list();</span>
		</div>
		<p>这个查询指定了:</p>
		<p>SQL查询字符串</p>
		<p>查询返回的实体</p>
		<p>这里，结果集字段名被假设为与映射文件中指明的字段名相同。对于连接了多个表的查询，这就可能造成问题，因为可能在多个表中出现同样名字的字段。下面的方法就可以避免字段名重复的问题:</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #000000">List&#160;cats&#160;</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">&#160;sess.createSQLQuery(</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">select&#160;{cat.*}&#160;from&#160;cats&#160;cat</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">).addEntity(</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">cat</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">,&#160;Cat.</span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000">).list();</span>
		</div>
		<p>这个查询指定了: </p>
		<p>SQL查询语句，它带一个占位符，可以让Hibernate使用字段的别名. </p>
		<p>查询返回的实体，和它的SQL表的别名. </p>
		<p>addEntity()方法将SQL表的别名和实体类联系起来，并且确定查询结果集的形态。 </p>
		<p>addJoin()方法可以被用于载入其他的实体和集合的关联. </p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #000000">List&#160;cats&#160;</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">&#160;sess.createSQLQuery(<br /></span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">select&#160;{cat.*},&#160;{kitten.*}&#160;from&#160;cats&#160;cat,&#160;cats&#160;kitten&#160;where&#160;kitten.mother&#160;=&#160;cat.id</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">)<br />.addEntity(</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">cat</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">,&#160;Cat.</span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000">)<br />.addJoin(</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">kitten</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">,&#160;</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">cat.kittens</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">)<br />.list();</span>
		</div>
		<p>原生的SQL查询可能返回一个简单的标量值或者一个标量和实体的结合体。 </p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #000000">Double&#160;max&#160;</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">&#160;(Double)&#160;sess.createSQLQuery(</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">select&#160;max(cat.weight)&#160;as&#160;maxWeight&#160;from&#160;cats&#160;cat</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">)<br />.addScalar(</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">maxWeight</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">,&#160;Hibernate.DOUBLE);<br />.uniqueResult();</span>
		</div>
		<p>除此之外，你还可以在你的hbm文件中描述结果集映射信息，在查询中使用。</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #000000">List&#160;cats&#160;</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">&#160;sess.createSQLQuery(<br /></span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">select&#160;{cat.*},&#160;{kitten.*}&#160;from&#160;cats&#160;cat,&#160;cats&#160;kitten&#160;where&#160;kitten.mother&#160;=&#160;cat.id</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">)<br />.setResultSetMapping(</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">catAndKitten</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">)<br />.list();</span>
		</div>
		<p>命名SQL查询<br />可以在映射文档中定义查询的名字,然后就可以象调用一个命名的HQL查询一样直接调用命名SQL查询.在这种情况下,我们不 需要调用addEntity()方法. </p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">sql</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000">query&#160;name</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">persons</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />&#160;</span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #0000ff">return</span>
				<span style="COLOR: #000000">&#160;alias</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">person</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">&#160;</span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">eg.Person</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">/&gt;</span>
				<span style="COLOR: #000000">
						<br />&#160;Select&#160;person.NAME&#160;AS&#160;{person.name},person.AGE&#160;AS&#160;{person.age},person.SEX&#160;AS&#160;{person.sex}&#160;FROM&#160;PERSON&#160;person&#160;Where&#160;person.NAME&#160;LIKE&#160;:namePattern<br /></span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">sql</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000">query</span>
				<span style="COLOR: #000000">&gt;</span>
		</div>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #000000">List&#160;people&#160;</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">&#160;sess.getNamedQuery(</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">persons</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">).setString(</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">namePattern</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">,&#160;namePattern)<br />.setMaxResults(</span>
				<span style="COLOR: #000000">50</span>
				<span style="COLOR: #000000">)<br />.list();</span>
		</div>
 <img src ="http://www.blogjava.net/envoydada/aggbug/106322.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/envoydada/" target="_blank">Derek.Guo</a> 2007-03-26 10:10 <a href="http://www.blogjava.net/envoydada/archive/2007/03/26/106322.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring+hibernate分页查询</title><link>http://www.blogjava.net/envoydada/archive/2007/03/06/102152.html</link><dc:creator>Derek.Guo</dc:creator><author>Derek.Guo</author><pubDate>Tue, 06 Mar 2007 06:22:00 GMT</pubDate><guid>http://www.blogjava.net/envoydada/archive/2007/03/06/102152.html</guid><wfw:comment>http://www.blogjava.net/envoydada/comments/102152.html</wfw:comment><comments>http://www.blogjava.net/envoydada/archive/2007/03/06/102152.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/envoydada/comments/commentRss/102152.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/envoydada/services/trackbacks/102152.html</trackback:ping><description><![CDATA[		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #008000">/**</span>
				<span style="COLOR: #008000">
						<br />&#160;&#160;&#160;&#160;&#160;*&#160;TOP查询<br />&#160;&#160;&#160;&#160;&#160;*&#160;</span>
				<span style="COLOR: #808080">@param</span>
				<span style="COLOR: #008000">&#160;sql&#160;String<br />&#160;&#160;&#160;&#160;&#160;*&#160;</span>
				<span style="COLOR: #808080">@param</span>
				<span style="COLOR: #008000">&#160;top&#160;int<br />&#160;&#160;&#160;&#160;&#160;*&#160;</span>
				<span style="COLOR: #808080">@return</span>
				<span style="COLOR: #008000">&#160;List<br />&#160;&#160;&#160;&#160;&#160;</span>
				<span style="COLOR: #008000">*/</span>
				<span style="COLOR: #000000">
						<br />&#160;&#160;&#160;&#160;</span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000">&#160;List&#160;findTop(String&#160;sql,&#160;</span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000">&#160;top)&#160;{<br />&#160;&#160;&#160;&#160;&#160;&#160;HibernateTemplate&#160;ht&#160;</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">&#160;</span>
				<span style="COLOR: #0000ff">this</span>
				<span style="COLOR: #000000">.getHibernateTemplate();<br />&#160;&#160;&#160;&#160;&#160;&#160;ht.setMaxResults(top);<br />&#160;&#160;&#160;&#160;&#160;&#160;</span>
				<span style="COLOR: #0000ff">return</span>
				<span style="COLOR: #000000">&#160;ht.find(sql);<br />&#160;&#160;&#160;&#160;}<br /><br />&#160;&#160;&#160;&#160;</span>
				<span style="COLOR: #008000">/**</span>
				<span style="COLOR: #008000">
						<br />&#160;&#160;&#160;&#160;&#160;*&#160;分页查询<br />&#160;&#160;&#160;&#160;&#160;*&#160;</span>
				<span style="COLOR: #808080">@param</span>
				<span style="COLOR: #008000">&#160;sql&#160;String<br />&#160;&#160;&#160;&#160;&#160;*&#160;</span>
				<span style="COLOR: #808080">@param</span>
				<span style="COLOR: #008000">&#160;firstRow&#160;int<br />&#160;&#160;&#160;&#160;&#160;*&#160;</span>
				<span style="COLOR: #808080">@param</span>
				<span style="COLOR: #008000">&#160;maxRow&#160;int<br />&#160;&#160;&#160;&#160;&#160;*&#160;</span>
				<span style="COLOR: #808080">@return</span>
				<span style="COLOR: #008000">&#160;List<br />&#160;&#160;&#160;&#160;&#160;</span>
				<span style="COLOR: #008000">*/</span>
				<span style="COLOR: #000000">
						<br />&#160;&#160;&#160;&#160;</span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000">&#160;List&#160;findPage(</span>
				<span style="COLOR: #0000ff">final</span>
				<span style="COLOR: #000000">&#160;String&#160;sql,</span>
				<span style="COLOR: #0000ff">final</span>
				<span style="COLOR: #000000">&#160;</span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000">&#160;firstRow,</span>
				<span style="COLOR: #0000ff">final</span>
				<span style="COLOR: #000000">&#160;</span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000">&#160;maxRow)&#160;{<br />&#160;&#160;&#160;&#160;&#160;&#160;</span>
				<span style="COLOR: #0000ff">return</span>
				<span style="COLOR: #000000">&#160;</span>
				<span style="COLOR: #0000ff">this</span>
				<span style="COLOR: #000000">.getHibernateTemplate().executeFind(</span>
				<span style="COLOR: #0000ff">new</span>
				<span style="COLOR: #000000">&#160;HibernateCallback(){<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000">&#160;Object&#160;doInHibernate(Session&#160;session)&#160;</span>
				<span style="COLOR: #0000ff">throws</span>
				<span style="COLOR: #000000">&#160;SQLException,<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;HibernateException&#160;{<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Query&#160;q&#160;</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">&#160;session.createQuery(sql);<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;q.setFirstResult(firstRow);<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;q.setMaxResults(maxRow);<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span>
				<span style="COLOR: #0000ff">return</span>
				<span style="COLOR: #000000">&#160;q.list();<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;});&#160;&#160;&#160;&#160;&#160;&#160;<br />&#160;&#160;&#160;&#160;}</span>
		</div>
 <img src ="http://www.blogjava.net/envoydada/aggbug/102152.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/envoydada/" target="_blank">Derek.Guo</a> 2007-03-06 14:22 <a href="http://www.blogjava.net/envoydada/archive/2007/03/06/102152.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate二级缓存攻略 Ehcache(转贴)</title><link>http://www.blogjava.net/envoydada/archive/2006/12/15/87862.html</link><dc:creator>Derek.Guo</dc:creator><author>Derek.Guo</author><pubDate>Fri, 15 Dec 2006 01:44:00 GMT</pubDate><guid>http://www.blogjava.net/envoydada/archive/2006/12/15/87862.html</guid><wfw:comment>http://www.blogjava.net/envoydada/comments/87862.html</wfw:comment><comments>http://www.blogjava.net/envoydada/archive/2006/12/15/87862.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/envoydada/comments/commentRss/87862.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/envoydada/services/trackbacks/87862.html</trackback:ping><description><![CDATA[		<font size="2">
				<a href="http://blog.csdn.net/soleghost/archive/2006/03/27/640605.aspx">
						<img height="13" src="http://blog.csdn.net/images/zhuan.gif" width="15" border="0" />
						<font size="3">&#160;hibernate二级缓存攻略 Ehcache（from javaEyes）</font>
				</a>
				<font size="3">
				</font>
				<br />hibernate的session提供了一级缓存，每个session，对同一个id进行两次load，不会发送两条sql给数据库，但是session关闭的时候，一级缓存就失效了。 <br /><br />二级缓存是SessionFactory级别的全局缓存，它底下可以使用不同的缓存类库，比如ehcache、oscache等，需要设置hibernate.cache.provider_class，我们这里用ehcache，在2.1中就是 <br />hibernate.cache.provider_class=net.sf.hibernate.cache.EhCacheProvider <br />如果使用查询缓存，加上 <br />hibernate.cache.use_query_cache=true <br /><br /><br />缓存可以简单的看成一个Map，通过key在缓存里面找value。 <br /><br /><span style="FONT-WEIGHT: bold">Class的缓存</span><br />对于一条记录，也就是一个PO来说，是根据ID来找的，缓存的key就是ID，value是POJO。无论list，load还是iterate，只要读出一个对象，都会填充缓存。但是list不会使用缓存，而iterate会先取数据库select id出来，然后一个id一个id的load，如果在缓存里面有，就从缓存取，没有的话就去数据库load。假设是读写缓存，需要设置： <br />&lt;cache usage="read-write"/&gt; <br />如果你使用的二级缓存实现是ehcache的话，需要配置ehcache.xml <br />&lt;cache name="com.xxx.pojo.Foo" maxElementsInMemory="500" eternal="false" timeToLiveSeconds="7200" timeToIdleSeconds="3600" overflowToDisk="true" /&gt; <br />其中eternal表示缓存是不是永远不超时，timeToLiveSeconds是缓存中每个元素（这里也就是一个POJO）的超时时间，如果eternal="false"，超过指定的时间，这个元素就被移走了。timeToIdleSeconds是发呆时间，是可选的。当往缓存里面put的元素超过500个时，如果overflowToDisk="true"，就会把缓存中的部分数据保存在硬盘上的临时文件里面。 <br />每个需要缓存的class都要这样配置。如果你没有配置，hibernate会在启动的时候警告你，然后使用defaultCache的配置，这样多个class会共享一个配置。 <br />当某个ID通过hibernate修改时，hibernate会知道，于是移除缓存。 <br />这样大家可能会想，同样的查询条件，第一次先list，第二次再iterate，就可以使用到缓存了。实际上这是很难的，因为你无法判断什么时候是第一次，而且每次查询的条件通常是不一样的，假如数据库里面有100条记录，id从1到100，第一次list的时候出了前50个id，第二次iterate的时候却查询到30至70号id，那么30-50是从缓存里面取的，51到70是从数据库取的，共发送1+20条sql。所以我一直认为iterate没有什么用，总是会有1+N的问题。 <br />（题外话：有说法说大型查询用list会把整个结果集装入内存，很慢，而iterate只select id比较好，但是大型查询总是要分页查的，谁也不会真的把整个结果集装进来，假如一页20条的话，iterate共需要执行21条语句，list虽然选择若干字段，比iterate第一条select id语句慢一些，但只有一条语句，不装入整个结果集hibernate还会根据数据库方言做优化，比如使用mysql的limit，整体看来应该还是list快。） <br />如果想要对list或者iterate查询的结果缓存，就要用到查询缓存了 <br /><br /><span style="FONT-WEIGHT: bold">查询缓存</span><br />首先需要配置hibernate.cache.use_query_cache=true <br />如果用ehcache，配置ehcache.xml，注意hibernate3.0以后不是net.sf的包名了 <br />&lt;cache name="net.sf.hibernate.cache.StandardQueryCache" <br />maxElementsInMemory="50" eternal="false" timeToIdleSeconds="3600" <br />timeToLiveSeconds="7200" overflowToDisk="true"/&gt; <br />&lt;cache name="net.sf.hibernate.cache.UpdateTimestampsCache" <br />maxElementsInMemory="5000" eternal="true" overflowToDisk="true"/&gt; <br />然后 <br />query.setCacheable(true);//激活查询缓存 <br />query.setCacheRegion("myCacheRegion");//指定要使用的cacheRegion，可选 <br />第二行指定要使用的cacheRegion是myCacheRegion，即你可以给每个查询缓存做一个单独的配置，使用setCacheRegion来做这个指定，需要在ehcache.xml里面配置它： <br />&lt;cache name="myCacheRegion" maxElementsInMemory="10" eternal="false" timeToIdleSeconds="3600" timeToLiveSeconds="7200" overflowToDisk="true" /&gt; <br />如果省略第二行，不设置cacheRegion的话，那么会使用上面提到的标准查询缓存的配置，也就是net.sf.hibernate.cache.StandardQueryCache <br /><br />对于查询缓存来说，缓存的key是根据hql生成的sql，再加上参数，分页等信息（可以通过日志输出看到，不过它的输出不是很可读，最好改一下它的代码）。 <br />比如hql： <br />from Cat c where c.name like ? <br />生成大致如下的sql： <br />select * from cat c where c.name like ? <br />参数是"tiger%"，那么查询缓存的key*大约*是这样的字符串（我是凭记忆写的，并不精确，不过看了也该明白了）： <br />select * from cat c where c.name like ? , parameter:tiger% <br />这样，保证了同样的查询、同样的参数等条件下具有一样的key。 <br />现在说说缓存的value，如果是list方式的话，value在这里并不是整个结果集，而是查询出来的这一串ID。也就是说，不管是list方法还是iterate方法，第一次查询的时候，它们的查询方式很它们平时的方式是一样的，list执行一条sql，iterate执行1+N条，多出来的行为是它们填充了缓存。但是到同样条件第二次查询的时候，就都和iterate的行为一样了，根据缓存的key去缓存里面查到了value，value是一串id，然后在到class的缓存里面去一个一个的load出来。这样做是为了节约内存。 <br />可以看出来，查询缓存需要打开相关类的class缓存。list和iterate方法第一次执行的时候，都是既填充查询缓存又填充class缓存的。 <br /><span style="FONT-WEIGHT: bold">这里还有一个很容易被忽视的重要问题，即打开查询缓存以后，即使是list方法也可能遇到1+N的问题！</span>相同条件第一次list的时候，因为查询缓存中找不到，不管class缓存是否存在数据，总是发送一条sql语句到数据库获取全部数据，然后填充查询缓存和class缓存。但是第二次执行的时候，问题就来了，如果你的class缓存的超时时间比较短，现在class缓存都超时了，但是查询缓存还在，那么list方法在获取id串以后，将会一个一个去数据库load！因此，class缓存的超时时间一定不能短于查询缓存设置的超时时间！如果还设置了发呆时间的话，保证class缓存的发呆时间也大于查询的缓存的生存时间。这里还有其他情况，比如class缓存被程序强制evict了，这种情况就请自己注意了。 <br /><br />另外，如果hql查询包含select字句，那么查询缓存里面的value就是整个结果集了。 <br /><br />当hibernate更新数据库的时候，它怎么知道更新哪些查询缓存呢？ <br />hibernate在一个地方维护每个表的最后更新时间，其实也就是放在上面net.sf.hibernate.cache.UpdateTimestampsCache所指定的缓存配置里面。 <br />当通过hibernate更新的时候，hibernate会知道这次更新影响了哪些表。然后它更新这些表的最后更新时间。每个缓存都有一个生成时间和这个缓存所查询的表，当hibernate查询一个缓存是否存在的时候，如果缓存存在，它还要取出缓存的生成时间和这个缓存所查询的表，然后去查找这些表的最后更新时间，如果有一个表在生成时间后更新过了，那么这个缓存是无效的。 <br />可以看出，只要更新过一个表，那么凡是涉及到这个表的查询缓存就失效了，因此查询缓存的命中率可能会比较低。 <br /><br /><span style="FONT-WEIGHT: bold">Collection缓存</span><br />需要在hbm的collection里面设置 <br />&lt;cache usage="read-write"/&gt; <br />假如class是Cat，collection叫children，那么ehcache里面配置 <br />&lt;cache name="com.xxx.pojo.Cat.children" <br />maxElementsInMemory="20" eternal="false" timeToIdleSeconds="3600" timeToLiveSeconds="7200" <br />overflowToDisk="true" /&gt; <br />Collection的缓存和前面查询缓存的list一样，也是只保持一串id，但它不会因为这个表更新过就失效，一个collection缓存仅在这个collection里面的元素有增删时才失效。 <br />这样有一个问题，如果你的collection是根据某个字段排序的，当其中一个元素更新了该字段时，导致顺序改变时，collection缓存里面的顺序没有做更新。 <br /><br /><span style="FONT-WEIGHT: bold">缓存策略</span><br />只读缓存（read-only）：没有什么好说的 <br />读/写缓存（read-write）:程序可能要的更新数据 <br />不严格的读/写缓存（nonstrict-read-write）：需要更新数据，但是两个事务更新同一条记录的可能性很小，性能比读写缓存好 <br />事务缓存（transactional）：缓存支持事务，发生异常的时候，缓存也能够回滚，只支持jta环境，这个我没有怎么研究过 <br /><br />读写缓存和不严格读写缓存在实现上的区别在于，读写缓存更新缓存的时候会把缓存里面的数据换成一个锁，其他事务如果去取相应的缓存数据，发现被锁住了，然后就直接取数据库查询。 <br />在hibernate2.1的ehcache实现中，如果锁住部分缓存的事务发生了异常，那么缓存会一直被锁住，直到60秒后超时。 <br />不严格读写缓存不锁定缓存中的数据。 <br /><br /><br /><span style="FONT-WEIGHT: bold">使用二级缓存的前置条件</span><br />你的hibernate程序对数据库有独占的写访问权，其他的进程更新了数据库，hibernate是不可能知道的。你操作数据库必需直接通过hibernate，如果你调用存储过程，或者自己使用jdbc更新数据库，hibernate也是不知道的。hibernate3.0的大批量更新和删除是不更新二级缓存的，但是据说3.1已经解决了这个问题。 <br />这个限制相当的棘手，有时候hibernate做批量更新、删除很慢，但是你却不能自己写jdbc来优化，很郁闷吧。 <br />SessionFactory也提供了移除缓存的方法，你一定要自己写一些JDBC的话，可以调用这些方法移除缓存，这些方法是： <br />void evict(Class persistentClass) <br />Evict all entries from the second-level cache. <br />void evict(Class persistentClass, Serializable id) <br />Evict an entry from the second-level cache. <br />void evictCollection(String roleName) <br />Evict all entries from the second-level cache. <br />void evictCollection(String roleName, Serializable id) <br />Evict an entry from the second-level cache. <br />void evictQueries() <br />Evict any query result sets cached in the default query cache region. <br />void evictQueries(String cacheRegion) <br />Evict any query result sets cached in the named query cache region. <br />不过我不建议这样做，因为这样很难维护。比如你现在用JDBC批量更新了某个表，有3个查询缓存会用到这个表，用evictQueries(String cacheRegion)移除了3个查询缓存，然后用evict(Class persistentClass)移除了class缓存，看上去好像完整了。不过哪天你添加了一个相关查询缓存，可能会忘记更新这里的移除代码。如果你的jdbc代码到处都是，在你添加一个查询缓存的时候，还知道其他什么地方也要做相应的改动吗？ <br /><br />---------------------------------------------------- <br /><br /><span style="FONT-WEIGHT: bold">总结：</span><br />不要想当然的以为缓存一定能提高性能，仅仅在你能够驾驭它并且条件合适的情况下才是这样的。hibernate的二级缓存限制还是比较多的，不方便用jdbc可能会大大的降低更新性能。在不了解原理的情况下乱用，可能会有1+N的问题。不当的使用还可能导致读出脏数据。 <br />如果受不了hibernate的诸多限制，那么还是自己在应用程序的层面上做缓存吧。 <br />在越高的层面上做缓存，效果就会越好。就好像尽管磁盘有缓存，数据库还是要实现自己的缓存，尽管数据库有缓存，咱们的应用程序还是要做缓存。因为底层的缓存它并不知道高层要用这些数据干什么，只能做的比较通用，而高层可以有针对性的实现缓存，所以在更高的级别上做缓存，效果也要好些吧。 <br /><br /></font>
 <img src ="http://www.blogjava.net/envoydada/aggbug/87862.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/envoydada/" target="_blank">Derek.Guo</a> 2006-12-15 09:44 <a href="http://www.blogjava.net/envoydada/archive/2006/12/15/87862.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tomcat内存配置</title><link>http://www.blogjava.net/envoydada/archive/2006/11/10/80309.html</link><dc:creator>Derek.Guo</dc:creator><author>Derek.Guo</author><pubDate>Fri, 10 Nov 2006 01:45:00 GMT</pubDate><guid>http://www.blogjava.net/envoydada/archive/2006/11/10/80309.html</guid><wfw:comment>http://www.blogjava.net/envoydada/comments/80309.html</wfw:comment><comments>http://www.blogjava.net/envoydada/archive/2006/11/10/80309.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/envoydada/comments/commentRss/80309.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/envoydada/services/trackbacks/80309.html</trackback:ping><description><![CDATA[		<p>%TOMCAT_HOME%/bin/catalina.sh </p>
		<p>找到这样一段： </p>
		<p>echo "Using CATALINA_BASE: $CATALINA_BASE" </p>
		<p>echo "Using CATALINA_HOME: $CATALINA_HOME" </p>
		<p>echo "Using CATALINA_TMPDIR: $CATALINA_TMPDIR" </p>
		<p>echo "Using JAVA_HOME: $JAVA_HOME" </p>
		<p>在其后加上:<br />CATALINA_OPTS="$CATALINA_OPTS -Xms128m -Xmx256m -XX:MaxNewSize=256m -XX:MaxPermSize=256m $JPDA_OPTS" </p>
		<p>JAVA_OPTS="$JAVA_OPTS -Djava.awt.headless=true" </p>
		<p>echo "Using CATALINA_OPTS: $CATALINA_OPTS" </p>
		<p>echo "Using JAVA_OPTS: $JAVA_OPTS" <br />_________________________________________________________</p>
		<p>
		</p>
		<p>windows下就是.bat </p>
		<p>linux下就是.sh </p>
 <img src ="http://www.blogjava.net/envoydada/aggbug/80309.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/envoydada/" target="_blank">Derek.Guo</a> 2006-11-10 09:45 <a href="http://www.blogjava.net/envoydada/archive/2006/11/10/80309.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tomcat配置SSL</title><link>http://www.blogjava.net/envoydada/archive/2006/11/08/79835.html</link><dc:creator>Derek.Guo</dc:creator><author>Derek.Guo</author><pubDate>Wed, 08 Nov 2006 05:53:00 GMT</pubDate><guid>http://www.blogjava.net/envoydada/archive/2006/11/08/79835.html</guid><wfw:comment>http://www.blogjava.net/envoydada/comments/79835.html</wfw:comment><comments>http://www.blogjava.net/envoydada/archive/2006/11/08/79835.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/envoydada/comments/commentRss/79835.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/envoydada/services/trackbacks/79835.html</trackback:ping><description><![CDATA[		<p>
				<font color="#0000ff">
						<strong>1.使用keytool工具生成keystore文件</strong>
				</font>
				<br />%JAVA_HOME%\bin\keytool&#160;-genkey&#160;-alias&#160;tomcat&#160;-keyalg&#160;RSA</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #000000">输入keystore密码：&#160;&#160;envoydada<br />您的名字与姓氏是什么？<br />&#160;&#160;[Unknown]：&#160;<font color="#ff0000">&#160;</font><font color="#ff0000">IT-0010381</font></span>
				<span style="COLOR: #000000">
						<br />您的组织单位名称是什么？<br />&#160;&#160;[Unknown]：&#160;&#160;it_sd<br />您的组织名称是什么？<br />&#160;&#160;[Unknown]：&#160;&#160;usish<br />您所在的城市或区域名称是什么？<br />&#160;&#160;[Unknown]：&#160;&#160;sh<br />您所在的州或省份名称是什么？<br />&#160;&#160;[Unknown]：&#160;&#160;sh<br />该单位的两字母国家代码是什么<br />&#160;&#160;[Unknown]：&#160;&#160;CN<br />CN</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">IT</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000">0010381</span>
				<span style="COLOR: #000000">,&#160;OU</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">it_sd,&#160;O</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">usish,&#160;L</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">sh,&#160;ST</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">sh,&#160;C</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">CN&#160;正确吗？<br />&#160;&#160;[否]：&#160;&#160;y<br /><br />输入</span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">tomcat</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">的主密码<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;（如果和&#160;keystore&#160;密码相同，按回车）：<br /></span>
		</div>
		<p>(必须密码一致，因此直接回车)<br />然后再把userhome(例如：C:\Documents&#160;and&#160;Settings\Administrator\)下的.keystore复制到tomcat的conf\目录下。<br /><br /><font color="#0000ff"><strong>2.修改Tomcat的 server.xml文件</strong></font></p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">Connector&#160;port</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">8443</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">&#160;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;maxThreads</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">150</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">&#160;minSpareThreads</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">25</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">&#160;maxSpareThreads</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">75</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">
						<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;enableLookups</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">false</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">&#160;disableUploadTimeout</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">true</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">
						<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;acceptCount</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">100</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">&#160;scheme</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">https</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">&#160;secure</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">true</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">
						<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;clientAuth</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">false</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">&#160;sslProtocol</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">TLS</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">&#160;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; keystoreFile</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">conf/.keystore</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">&#160;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; keystorePass</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"envoydada</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">&#160;</span>
				<span style="COLOR: #000000">&lt;!--</span>
				<span style="COLOR: #000000">与先前设置的密码一致</span>
				<span style="COLOR: #000000">--&gt;</span>
				<span style="COLOR: #000000">
						<br />&#160;</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">Connector</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />
				</span>
		</div>
		<br />启动Tomcat,访问地址 <a href="https://IT-0010381:8443">https://<font color="#ff0000">IT-0010381</font>:8443</a>&#160; 将出现安全对话框,<br />(注:其中如果安全提示中出现"<font color="#a52a2a" size="2">安全证书上的名称无效,或者与站点名称不匹配</font>",则有可能是你在地址栏中访问的URL主机名与你在建立keystore文件时填写的名称不符——即见以上红色文字) <img src ="http://www.blogjava.net/envoydada/aggbug/79835.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/envoydada/" target="_blank">Derek.Guo</a> 2006-11-08 13:53 <a href="http://www.blogjava.net/envoydada/archive/2006/11/08/79835.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Tomcat 通过数据库验证的配置方法(BASIC,FORM).</title><link>http://www.blogjava.net/envoydada/archive/2006/11/07/79585.html</link><dc:creator>Derek.Guo</dc:creator><author>Derek.Guo</author><pubDate>Tue, 07 Nov 2006 05:19:00 GMT</pubDate><guid>http://www.blogjava.net/envoydada/archive/2006/11/07/79585.html</guid><wfw:comment>http://www.blogjava.net/envoydada/comments/79585.html</wfw:comment><comments>http://www.blogjava.net/envoydada/archive/2006/11/07/79585.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/envoydada/comments/commentRss/79585.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/envoydada/services/trackbacks/79585.html</trackback:ping><description><![CDATA[		<p>1.Tomcat默认验证的配置 通过tomcat-user.xml进行验证</p>server.xml 
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Realm&#160;className</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">org.apache.catalina.realm.UserDatabaseRealm</span><span style="COLOR: #000000">" </span><span style="COLOR: #000000">&#160;debug</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&#160;resourceName</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">UserDatabase</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/&gt;</span></div>tomcat-user.xml 
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">&lt;?</span><span style="COLOR: #000000">xml&#160;version</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">1.0</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">&#160;encoding</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">utf-8</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">?&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">tomcat</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">users</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br />&#160;&#160;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">role&#160;rolename</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">user</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br />&#160;&#160;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">role&#160;rolename</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">tomcat</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br />&#160;&#160;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">role&#160;rolename</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">role1</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br />&#160;&#160;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">role&#160;rolename</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">manager</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br />&#160;&#160;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">role&#160;rolename</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">admin</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br />&#160;&#160;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">user&#160;username</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">derek</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&#160;password</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">dada</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&#160;roles</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">admin,user</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br />&#160;&#160;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">user&#160;username</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">tomcat</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&#160;password</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">tomcat</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&#160;roles</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">tomcat</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br />&#160;&#160;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">user&#160;username</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">role1</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&#160;password</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">tomcat</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&#160;roles</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">role1</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br />&#160;&#160;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">user&#160;username</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">both</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&#160;password</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">tomcat</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&#160;roles</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">tomcat,role1</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br />&#160;&#160;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">user&#160;username</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">admin</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&#160;password</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">dada</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&#160;roles</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">admin,manager</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">tomcat</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">users</span><span style="COLOR: #000000">&gt;</span></div><br />2.配置验证,通过数据库<br />(用户表member:帐号字段wno,密码字段password; 权限表system_permit: 权限字段system_code)<br />server.xml 
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Realm&#160;&#160;className</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">org.apache.catalina.realm.JDBCRealm</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&#160;debug</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">99</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;driverName</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">net.sourceforge.jtds.jdbc.Driver</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;connectionURL</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">jdbc:jtds:sqlserver://192.168.56.32:1433/testDB</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;connectionName</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"sa</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&#160;connectionPassword</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">sa</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;userTable</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">member</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&#160;userNameCol</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">WNO</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&#160;userCredCol</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Password</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000"><br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;userRoleTable</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">system_permit</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&#160;roleNameCol</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">system_code</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #000000">/&gt;</span></div>driverName 驱动名字<br />connectionURL 数据库连接url<br />connectionName 连接的用户名<br />connectionPassword 连接的密码<br />userTable 用户表<br />userNameCol 用户名列<br />userCredCol 密码列<br />userRoleTable 角色表<br />roleNameCol 角色名字字段<br /><br /><br /><strong><font color="#0000ff">一 Basic验证</font></strong><br />Web.xml 
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008000">&#160; &lt;security-constraint&gt;<br />&#160;&#160;&#160; &lt;web-resource-collection&gt;<br />&#160;&#160;&#160;&#160;&#160; &lt;web-resource-name&gt;admin page&lt;/web-resource-name&gt;<br />&#160;&#160;&#160;&#160;&#160; &lt;url-pattern&gt;/admin/*&lt;/url-pattern&gt;<br />&#160;&#160;&#160; &lt;/web-resource-collection&gt;<br />&#160;&#160;&#160; &lt;auth-constraint&gt;<br />&#160;&#160;&#160;&#160;&#160; &lt;role-name&gt;admin&lt;/role-name&gt;<br />&#160;&#160;&#160; &lt;/auth-constraint&gt;<br />&#160; &lt;/security-constraint&gt;<br />&#160; &lt;login-config&gt;<br />&#160;&#160;&#160; &lt;auth-method&gt;BASIC&lt;/auth-method&gt;<br />&#160;&#160;&#160; &lt;realm-name&gt;Password required&lt;/realm-name&gt;<br />&#160; &lt;/login-config&gt;<br />&#160; &lt;security-role&gt;<br />&#160;&#160;&#160; &lt;role-name&gt;admin&lt;/role-name&gt;<br />&#160; &lt;/security-role&gt;</span></div>取得用户登陆帐号 
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">&#160;&#160;&#160;&#160;&#160;&#160;&#160; String&#160;auth_user&#160;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #0000ff">null</span><span style="COLOR: #000000">;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;String&#160;auth&#160;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&#160;request.getHeader(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Authorization</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;String&#160;encoded&#160;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&#160;auth.substring(</span><span style="COLOR: #000000">6</span><span style="COLOR: #000000">);<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;sun.misc.BASE64Decoder&#160;dec&#160;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&#160;sun.misc.BASE64Decoder();<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;String&#160;decoded&#160;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&#160;String(dec.decodeBuffer(encoded));<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;String[]&#160;userAndPass&#160;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&#160;decoded.split(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">:</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&#160;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">);<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;auth_user&#160;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&#160;userAndPass[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">];<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;session.setAttribute(ADMIN_ID,auth_user);<br /></span></div><br /><br /><font color="#0000ff"><strong>二、FORM验证<br /></strong></font>1.准备login.jsp页面
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">FORM&#160;name</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">logonForm</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&#160;&#160;method</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">post</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&#160;action</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">j_security_check</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br />&#160;&#160;&#160;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">input&#160;name</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">j_username</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&#160;type</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">text</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br />&#160;&#160;&#160;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">input&#160;name</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">j_password</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&#160;type</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">password</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br />&#160;&#160;&#160;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">input&#160;&#160;type</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">submit</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&#160;value</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">LOGIN</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">FORM</span><span style="COLOR: #000000">&gt;</span></div>*&#160;&#160;&#160;&#160; 帐号&#160;&#160;j_username<br />*&#160;&#160;&#160;&#160; 密码&#160;&#160;j_password<br />*&#160;&#160;&#160;&#160; action&#160;&#160;j_security_check <br />&#8220;*&#8221;内容为固定写法，不能改变<br />2.配置web.xml
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008000">&#160; &lt;security-constraint&gt;<br />&#160;&#160;&#160; &lt;web-resource-collection&gt;<br />&#160;&#160;&#160;&#160;&#160; &lt;web-resource-name&gt;admin page&lt;/web-resource-name&gt;<br />&#160;&#160;&#160;&#160;&#160; &lt;url-pattern&gt;/admin/*&lt;/url-pattern&gt;<br />&#160;&#160;&#160; &lt;/web-resource-collection&gt;<br />&#160;&#160;&#160; &lt;auth-constraint&gt;<br />&#160;&#160;&#160;&#160;&#160; &lt;role-name&gt;admin&lt;/role-name&gt;<br />&#160;&#160;&#160; &lt;/auth-constraint&gt;<br />&#160; &lt;/security-constraint&gt;<br />&#160; &lt;login-config&gt;<br />&#160;&#160;&#160; &lt;auth-method&gt;FORM&lt;/auth-method&gt;<br />&#160;&#160;&#160; &lt;form-login-config&gt;<br />&#160;&#160;&#160;&#160;&#160; &lt;form-login-page&gt;/login.jsp&lt;/form-login-page&gt;<br />&#160;&#160;&#160;&#160;&#160; &lt;form-error-page&gt;/error.jsp&lt;/form-error-page&gt;<br />&#160;&#160;&#160; &lt;/form-login-config&gt;<br />&#160; &lt;/login-config&gt;&#160; &lt;security-role&gt;<br />&#160;&#160;&#160; &lt;role-name&gt;admin&lt;/role-name&gt;<br />&#160; &lt;/security-role&gt;</span></div><br /> <img src ="http://www.blogjava.net/envoydada/aggbug/79585.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/envoydada/" target="_blank">Derek.Guo</a> 2006-11-07 13:19 <a href="http://www.blogjava.net/envoydada/archive/2006/11/07/79585.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring DataSource注入</title><link>http://www.blogjava.net/envoydada/archive/2006/11/07/79516.html</link><dc:creator>Derek.Guo</dc:creator><author>Derek.Guo</author><pubDate>Tue, 07 Nov 2006 01:03:00 GMT</pubDate><guid>http://www.blogjava.net/envoydada/archive/2006/11/07/79516.html</guid><wfw:comment>http://www.blogjava.net/envoydada/comments/79516.html</wfw:comment><comments>http://www.blogjava.net/envoydada/archive/2006/11/07/79516.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/envoydada/comments/commentRss/79516.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/envoydada/services/trackbacks/79516.html</trackback:ping><description><![CDATA[		<font face="宋体">DataSource注入 <b><span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?><o:p></o:p></span></b></font>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left">
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">对于不同的数据库存取需求，我们使用<span lang="EN-US">JDBC来解决这个问题，对于不同的数据连接来源需求，Spring则提供了DataSource注入，更换数据来源只要在Bean定义文件中修改配置，而不用修改任何一行程序。 <br clear="all" /><br style="mso-special-character: line-break" clear="all" /><o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left">
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">因应不同的系统，应用程序可能使用不同的数据来源，但如纯綷的使用<span lang="EN-US"> JDBC、透过连接池、或是透过JNDI等等，数据来源的更动是底层的行为，不应影响到上层的业务逻辑，为此，您可以在需要取得连接来源的Bean上保留一个数据来源注入的接口，让依赖的数据来源由该接口注入。例如我们来写一个简单的Bean： <o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left">
				<b>
						<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">DataBean.java</span>
				</b>
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left">
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">
				</span>
		</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #0000ff">package</span>
				<span style="COLOR: #000000">&#160;onlyfun.caterpillar;&#160;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br /></span>
				<span style="COLOR: #0000ff">import</span>
				<span style="COLOR: #000000">&#160;javax.sql.DataSource;&#160;<br /><br /></span>
				<span style="COLOR: #0000ff">import</span>
				<span style="COLOR: #000000">&#160;java.sql.Connection;&#160;<br /><br /></span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000">&#160;</span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000">&#160;DataBean&#160;{&#160;<br /><br />&#160;&#160;&#160;&#160;</span>
				<span style="COLOR: #0000ff">private</span>
				<span style="COLOR: #000000">&#160;DataSource&#160;dataSource;&#160;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br />&#160;&#160;&#160;&#160;</span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000">&#160;</span>
				<span style="COLOR: #0000ff">void</span>
				<span style="COLOR: #000000">&#160;setDataSource(DataSource&#160;dataSource)&#160;{&#160;<br /><br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span>
				<span style="COLOR: #0000ff">this</span>
				<span style="COLOR: #000000">.dataSource&#160;</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">&#160;dataSource;&#160;<br /><br />&#160;&#160;&#160;&#160;}&#160;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br />&#160;&#160;&#160;&#160;</span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000">&#160;</span>
				<span style="COLOR: #0000ff">void</span>
				<span style="COLOR: #000000">&#160;testDataSource()&#160;{&#160;<br /><br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span>
				<span style="COLOR: #0000ff">try</span>
				<span style="COLOR: #000000">&#160;{&#160;<br /><br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Connection&#160;connection&#160;</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">&#160;dataSource.getConnection();&#160;<br /><br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span>
				<span style="COLOR: #0000ff">if</span>
				<span style="COLOR: #000000">(connection&#160;</span>
				<span style="COLOR: #000000">!=</span>
				<span style="COLOR: #000000">&#160;</span>
				<span style="COLOR: #0000ff">null</span>
				<span style="COLOR: #000000">)&#160;<br /><br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;System.out.println(</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">test&#160;ok!</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">);&#160;<br /><br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}&#160;<br /><br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span>
				<span style="COLOR: #0000ff">catch</span>
				<span style="COLOR: #000000">&#160;(Exception&#160;e)&#160;{&#160;<br /><br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;e.printStackTrace();&#160;<br /><br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}&#160;<br /><br />&#160;&#160;&#160;&#160;}&#160;<br /><br />}<br /><br /></span>
		</div>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left">这是一个简单的测试<span lang="EN-US">Spring DataSource注入的程序，我们透过javax.sql.DataSource接口来注入数据来源，Spring提供了 org.springframework.jdbc.datasource.DriverManagerDataSource来取得 DataSource，它实作了javax.sql.DataSource，您将之当作一个Bean，之后再注入DataBean中即可，Bean定义档可以这么撰写： <o:p></o:p></span></p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left">
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">
				</span>
		</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #000000">&lt;?</span>
				<span style="COLOR: #000000">xml&#160;version</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">1.0</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">&#160;encoding</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">UTF-8</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">?&gt;</span>
				<span style="COLOR: #000000">&#160;<br /><br /></span>
				<span style="COLOR: #000000">&lt;!</span>
				<span style="COLOR: #000000">DOCTYPE&#160;beans&#160;PUBLIC&#160;</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">-//SPRING/DTD&#160;BEAN/EN</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">&#160;</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">http://www.springframework.org/dtd/spring-beans.dtd</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">&#160;<br /><br /></span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">beans</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">&#160;<br /><br />&#160;&#160;&#160;&#160;</span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">bean&#160;id</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">dataSource</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">&#160;</span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">
						<font color="#ff0000">org.springframework.jdbc.datasource.DriverManagerDataSource</font>
				</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">&#160;<br /><br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">property&#160;name</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">driverClassName</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">&#160;<br /><br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">value</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">com.mysql.jdbc.Driver</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">value</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">&#160;<br /><br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">property</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">&#160;<br /><br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">property&#160;name</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">url</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">&#160;<br /><br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">value</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">jdbc:mysql:</span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000">localhost:3306/TestDB&lt;/value&gt;&#160;</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #000000">
						<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">property</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">&#160;<br /><br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">property&#160;name</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">username</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">&#160;<br /><br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">value</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">caterpillar</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">value</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">&#160;<br /><br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">property</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">&#160;<br /><br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">property&#160;name</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">password</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">&#160;<br /><br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">value</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">123456</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">value</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">&#160;<br /><br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">property</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">&#160;<br /><br />&#160;&#160;&#160;&#160;</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">bean</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">&#160;<br /><br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br /><br />&#160;&#160;&#160;&#160;</span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">bean&#160;id</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">dataBean</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">&#160;</span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">onlyfun.caterpillar.DataBean</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">&#160;<br /><br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">property&#160;name</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">dataSource</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">&#160;<br /><br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">ref&#160;bean</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">dataSource</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">/&gt;</span>
				<span style="COLOR: #000000">&#160;<br /><br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">property</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">&#160;<br /><br />&#160;&#160;&#160;&#160;</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">bean</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">&#160;<br /><br /></span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">beans</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<br />
				</span>
		</div>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left">如果您之前只使用<span lang="EN-US">spring-core.jar这个类别库，您还必须加入 spring-dao.jar， org.springframework.jdbc.datasource.DriverManagerDataSource是包括在这个类别库中，如果您使用的是spring.jar，当中已经包括了，无需加入任何的jar，当然，为了使用JDBC，您必须要有JDBC驱动程序的jar檔。 <br clear="all" /><br clear="all" />可以用下面这段程序简单的测试一下： <o:p></o:p></span></p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">BeanDefinitionRegistry reg = new DefaultListableBeanFactory(); <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(reg); <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">
						<span style="mso-spacerun: yes">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span>
						<span style="mso-spacerun: yes">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span>
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">reader.loadBeanDefinitions(new ClassPathResource("bean.xml"));; <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">
						<span style="mso-spacerun: yes">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; </span>
						<o:p>
						</o:p>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">BeanFactory bf = (BeanFactory) reg; <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">DataBean dataBean = (DataBean) bf.getBean("dataBean"); <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">dataBean.testDataSource();<o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">
						<br />DriverManagerDataSource并没有提供连接池的功能，只能作作简单的单机连接测试，现在假设连接测试没有问题了，您想要换上DBCP以获得连接池的功能，则原程序不用更动，只要改改Bean定义档就可以了： <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">
				</span>
		</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #000000">&lt;?</span>
				<span style="COLOR: #000000">xml&#160;version</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">1.0</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">&#160;encoding</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">UTF-8</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">?&gt;</span>
				<span style="COLOR: #000000">&#160;<br /><br /></span>
				<span style="COLOR: #000000">&lt;!</span>
				<span style="COLOR: #000000">DOCTYPE&#160;beans&#160;PUBLIC&#160;</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">-//SPRING/DTD&#160;BEAN/EN</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">&#160;</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">http://www.springframework.org/dtd/spring-beans.dtd</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">&#160;<br /><br /></span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">beans</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">&#160;<br /><br />&#160;&#160;&#160;&#160;</span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">bean&#160;id</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">dataSource</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">&#160;</span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">
						<font color="#ff0000">org.apache.commons.dbcp.BasicDataSource</font>
				</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">&#160;destroy</span>
				<span style="COLOR: #000000">-</span>
				<span style="COLOR: #000000">method</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">close</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">&#160;<br /><br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">property&#160;name</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">driverClassName</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">&#160;<br /><br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">value</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">com.mysql.jdbc.Driver</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">value</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">&#160;<br /><br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">property</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">&#160;<br /><br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">property&#160;name</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">url</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">&#160;<br /><br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">value</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">jdbc:mysql:</span>
				<span style="COLOR: #008000">//</span>
				<span style="COLOR: #008000">localhost:3306/TestDB&lt;/value&gt;&#160;</span>
				<span style="COLOR: #008000">
						<br />
				</span>
				<span style="COLOR: #000000">
						<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">property</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">&#160;<br /><br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">property&#160;name</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">username</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">&#160;<br /><br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">value</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">caterpillar</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">value</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">&#160;<br /><br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">property</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">&#160;<br /><br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">property&#160;name</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">password</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">&#160;<br /><br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">value</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">123456</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">value</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">&#160;<br /><br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">property</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">&#160;<br /><br />&#160;&#160;&#160;&#160;</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">bean</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">&#160;<br /><br />&#160;&#160;&#160;&#160;</span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">bean&#160;id</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">dataBean</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">&#160;</span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">onlyfun.caterpillar.DataBean</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">&#160;<br /><br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">property&#160;name</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">dataSource</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">&#160;<br /><br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">ref&#160;bean</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">dataSource</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">/&gt;</span>
				<span style="COLOR: #000000">&#160;<br /><br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">property</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">&#160;<br /><br />&#160;&#160;&#160;&#160;</span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">bean</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">&#160;<br /><br /></span>
				<span style="COLOR: #000000">&lt;/</span>
				<span style="COLOR: #000000">beans</span>
				<span style="COLOR: #000000">&gt;</span>
				<span style="COLOR: #000000">
						<br />
						<br />
				</span>
		</div>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left">
				<br />现在我们使用的是org.apache.commons.dbcp.BasicDataSource作为注入的 DataSource源，为了使用DBCP的功能，您必须要将commons-dbcp.jar加入CLASSPATH中，另外您还需要commons- pool.jar与commons-collections.jar，这些都可以在Spring的相依版本中的lib目录下找到。 <br clear="all" /><br clear="all" />注意到我们在dataSource Bean上宣告了destroy-method，如此可以确保BeanFactory在关闭时也一并关闭BasicDataSource。 <br clear="all" /><br clear="all" />如果您要直接使用JDBC来进行数据存储，使用<font color="#ff0000">org.springframework.jdbc.datasource.DataSourceUtils</font>来取得Connection会是更好的方式： <o:p></o:p></p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">
						<font color="#0000ff">Connection conn = DataSourceUtils.getConnection(dataSource);<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">
						<br />这样作的好处是，所有的SQLException都被Spring的DataAccessException子类CannotGetJdbcConnectionException包装起来。您可以获得更多的信息，并保证存储层的可移值性。 </span>
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-fareast-language: ZH-TW">
						<br clear="all" />
						<br clear="all" />
				</span>
				<span style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">关闭<span lang="EN-US">Connection时，可以用下面的方式： <o:p></o:p></span></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">
						<font color="#0000ff">DataSourceUtils.closeConnectionIfNecessry(connection, dataSource);<o:p></o:p></font>
				</span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align="left">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">
						<br />如果您的Servlet容器提供了JNDI资料源，您也可以简单的换上这个数据源： <o:p></o:p></span>
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left">
		</p>
		<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left">
				<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">
						<o:p>
						</o:p>
				</span>
		</p>
		<span lang="EN-US" style="FONT-SIZE: 12pt; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">
				<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
						<span style="COLOR: #000000">&lt;?</span>
						<span style="COLOR: #000000">xml&#160;version</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">1.0</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">&#160;encoding</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">UTF-8</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">?&gt;</span>
						<span style="COLOR: #000000">&#160;<br /><br /></span>
						<span style="COLOR: #000000">&lt;!</span>
						<span style="COLOR: #000000">DOCTYPE&#160;beans&#160;PUBLIC&#160;</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">-//SPRING/DTD&#160;BEAN/EN</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">&#160;</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">http://www.springframework.org/dtd/spring-beans.dtd</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">&gt;</span>
						<span style="COLOR: #000000">&#160;<br /><br /></span>
						<span style="COLOR: #000000">&lt;</span>
						<span style="COLOR: #000000">beans</span>
						<span style="COLOR: #000000">&gt;</span>
						<span style="COLOR: #000000">&#160;<br /><br />&#160;&#160;&#160;&#160;</span>
						<span style="COLOR: #000000">&lt;</span>
						<span style="COLOR: #000000">bean&#160;id</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">dataSource</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">&#160;</span>
						<span style="COLOR: #0000ff">class</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">
								<font color="#ff0000">org.springframework.indi.JndiObjectFactoryBean</font>
						</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">&gt;</span>
						<span style="COLOR: #000000">&#160;<br /><br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span>
						<span style="COLOR: #000000">&lt;</span>
						<span style="COLOR: #000000">property&#160;name</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">jndiName</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">&gt;</span>
						<span style="COLOR: #000000">&#160;<br /><br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span>
						<span style="COLOR: #000000">&lt;</span>
						<span style="COLOR: #000000">value</span>
						<span style="COLOR: #000000">&gt;</span>
						<span style="COLOR: #000000">jdbc</span>
						<span style="COLOR: #000000">/</span>
						<span style="COLOR: #000000">TestDB</span>
						<span style="COLOR: #000000">&lt;/</span>
						<span style="COLOR: #000000">value</span>
						<span style="COLOR: #000000">&gt;</span>
						<span style="COLOR: #000000">&#160;<br /><br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span>
						<span style="COLOR: #000000">&lt;/</span>
						<span style="COLOR: #000000">property</span>
						<span style="COLOR: #000000">&gt;</span>
						<span style="COLOR: #000000">&#160;<br /><br />&#160;&#160;&#160;&#160;</span>
						<span style="COLOR: #000000">&lt;/</span>
						<span style="COLOR: #000000">bean</span>
						<span style="COLOR: #000000">&gt;</span>
						<span style="COLOR: #000000">&#160;<br /><br />&#160;&#160;&#160;&#160;</span>
						<span style="COLOR: #000000">&lt;</span>
						<span style="COLOR: #000000">bean&#160;id</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">dataBean</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">&#160;</span>
						<span style="COLOR: #0000ff">class</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">onlyfun.caterpillar.DataBean</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">&gt;</span>
						<span style="COLOR: #000000">&#160;<br /><br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span>
						<span style="COLOR: #000000">&lt;</span>
						<span style="COLOR: #000000">property&#160;name</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">dataSource</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">&gt;</span>
						<span style="COLOR: #000000">&#160;<br /><br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span>
						<span style="COLOR: #000000">&lt;</span>
						<span style="COLOR: #000000">ref&#160;bean</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">dataSource</span>
						<span style="COLOR: #000000">"</span>
						<span style="COLOR: #000000">/&gt;</span>
						<span style="COLOR: #000000">&#160;<br /><br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span>
						<span style="COLOR: #000000">&lt;/</span>
						<span style="COLOR: #000000">property</span>
						<span style="COLOR: #000000">&gt;</span>
						<span style="COLOR: #000000">&#160;<br /><br />&#160;&#160;&#160;&#160;</span>
						<span style="COLOR: #000000">&lt;/</span>
						<span style="COLOR: #000000">bean</span>
						<span style="COLOR: #000000">&gt;</span>
						<span style="COLOR: #000000">&#160;<br /><br /></span>
						<span style="COLOR: #000000">&lt;/</span>
						<span style="COLOR: #000000">beans</span>
						<span style="COLOR: #000000">&gt;</span>
						<span style="COLOR: #000000">
								<br />
						</span>
				</div>
				<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; tab-stops: 45.8pt 91.6pt 137.4pt 183.2pt 229.0pt 274.8pt 320.6pt 366.4pt 412.2pt 458.0pt 503.8pt 549.6pt 595.4pt 641.2pt 687.0pt 732.8pt" align="left">
						<br />为了使用org.springframework.indi.JndiObjectFactoryBean，您必须加入 spring-context.jar这个类别库，jndiName实际上要根据您所设定的JNDI查询名称</p>
		</span>
 <img src ="http://www.blogjava.net/envoydada/aggbug/79516.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/envoydada/" target="_blank">Derek.Guo</a> 2006-11-07 09:03 <a href="http://www.blogjava.net/envoydada/archive/2006/11/07/79516.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate one-to-many学习笔记</title><link>http://www.blogjava.net/envoydada/archive/2006/09/07/68308.html</link><dc:creator>Derek.Guo</dc:creator><author>Derek.Guo</author><pubDate>Thu, 07 Sep 2006 08:20:00 GMT</pubDate><guid>http://www.blogjava.net/envoydada/archive/2006/09/07/68308.html</guid><wfw:comment>http://www.blogjava.net/envoydada/comments/68308.html</wfw:comment><comments>http://www.blogjava.net/envoydada/archive/2006/09/07/68308.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/envoydada/comments/commentRss/68308.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/envoydada/services/trackbacks/68308.html</trackback:ping><description><![CDATA[		<font color="#0000ff">EmylinkUpcode&#160; 1...................n&#160; EmylinkUlink</font>&#160;&#160; 一对多关系<br /><br />1.hbm.xml描述<br />&#160; EmylinkUpcode.hbm.xml<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><p><span style="COLOR: #000000">&lt;?xml version="1.0"?&gt;<br />&lt;!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"<br />"<a href="http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd</a>" &gt;<br />&lt;hibernate-mapping package="hbm"&gt;<br />&#160;&lt;class&#160;name="EmylinkUpcode" table="emylink_upcode"&gt;<br />&#160;&#160;&lt;id<br />&#160;&#160;&#160;name="id"&#160;type="integer"&#160;column="plink_code"<br />&#160;&#160;&gt;<br />&#160;&#160;&#160;&lt;generator class="org.hibernate.id.IncrementGenerator"/&gt;<br />&#160;&#160;&lt;/id&gt;</span></p><p><span style="COLOR: #000000">&#160;&#160;&lt;property<br />&#160;&#160;&#160;name="account"<br />&#160;&#160;&#160;column="account"<br />&#160;&#160;&#160;type="string"<br />&#160;&#160;&#160;not-null="true"<br />&#160;&#160;&#160;length="20"<br />&#160;&#160;/&gt;<br />&#160;&#160;&lt;property<br />&#160;&#160;&#160;name="plinkName"<br />&#160;&#160;&#160;column="plink_name"<br />&#160;&#160;&#160;type="string"<br />&#160;&#160;&#160;not-null="true"<br />&#160;&#160;&#160;length="50"<br />&#160;&#160;/&gt;<br />&#160;&#160;&lt;property<br />&#160;&#160;&#160;name="plinkExplain"<br />&#160;&#160;&#160;column="plink_explain"<br />&#160;&#160;&#160;type="string"<br />&#160;&#160;&#160;not-null="false"<br />&#160;&#160;&#160;length="100"<br />&#160;&#160;/&gt;<br />&#160;&#160;&lt;property<br />&#160;&#160;&#160;name="typeCode"<br />&#160;&#160;&#160;column="type_code"<br />&#160;&#160;&#160;type="string"<br />&#160;&#160;&#160;not-null="false"<br />&#160;&#160;&#160;length="8"<br />&#160;&#160;/&gt;<br />&#160;<br />&#160;&#160;&lt;set name="emylinkUlinks" inverse="true" <font color="#ff0000">lazy="true"&#160; </font><font color="#800080">cascade="all"</font>&gt;&#160;<br />&#160;&#160;&#160;&#160; &#160; &lt;key column="plink_code"/&gt;<br />&#160;&#160;&#160;&#160;&#160; &lt;one-to-many class="EmylinkUlink"/&gt;<br />&#160;&#160;&lt;/set&gt;</span></p><p><span style="COLOR: #000000">&#160;&lt;/class&gt;&#160;<br />&lt;/hibernate-mapping&gt;<br /></span><span style="COLOR: #000000"></span></p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 36.26%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; HEIGHT: 122px; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #000000">操作级联（<font color="#800080">cascade</font>）关系。<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />可选值：<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />all&#160;:&#160;所有情况下均进行级联操作。<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />none：所有情况下均不进行级联操作。<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />save</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">update:在执行save</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">update时<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />进行级联操作。<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />delete：在执行delete时进行级联操作。</span></div></div><br />&#160;EmylinkUlink.hbm.xml 
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><p>&lt;?xml version="1.0"?&gt;<br />&lt;!DOCTYPE hibernate-mapping PUBLIC<br />&#160;"-//Hibernate/Hibernate Mapping DTD//EN"<br />&#160;"<a href="http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd</a>" &gt;</p><p>&lt;hibernate-mapping package="hbm"&gt;<br />&#160;&lt;class<br />&#160;&#160;name="EmylinkUlink"<br />&#160;&#160;table="emylink_ulink"<br />&#160;&gt;<br />&#160;&#160;&lt;id<br />&#160;&#160;&#160;name="id"<br />&#160;&#160;&#160;type="integer"<br />&#160;&#160;&#160;column="id"<br />&#160;&#160;&gt;<br />&#160;&#160;&#160;&lt;generator class="org.hibernate.id.IncrementGenerator"/&gt;<br />&#160;&#160;&lt;/id&gt;</p><p>&#160;&#160;&lt;property<br />&#160;&#160;&#160;name="account"<br />&#160;&#160;&#160;column="account"<br />&#160;&#160;&#160;type="string"<br />&#160;&#160;&#160;not-null="true"<br />&#160;&#160;&#160;length="20"<br />&#160;&#160;/&gt;<br />&#160;&#160;&lt;property<br />&#160;&#160;&#160;name="link"<br />&#160;&#160;&#160;column="link"<br />&#160;&#160;&#160;type="string"<br />&#160;&#160;&#160;not-null="true"<br />&#160;&#160;&#160;length="200"<br />&#160;&#160;/&gt;<br />&#160;&#160;&lt;property<br />&#160;&#160;&#160;name="linkName"<br />&#160;&#160;&#160;column="link_name"<br />&#160;&#160;&#160;type="string"<br />&#160;&#160;&#160;not-null="true"<br />&#160;&#160;&#160;length="20"<br />&#160;&#160;/&gt;<br />&#160;&#160;&lt;property<br />&#160;&#160;&#160;name="explain"<br />&#160;&#160;&#160;column="explain"<br />&#160;&#160;&#160;type="string"<br />&#160;&#160;&#160;not-null="false"<br />&#160;&#160;&#160;length="500"<br />&#160;&#160;/&gt;<br />&#160;&#160;&lt;property<br />&#160;&#160;&#160;name="indate"<br />&#160;&#160;&#160;column="indate"<br />&#160;&#160;&#160;type="date"<br />&#160;&#160;&#160;not-null="true"<br />&#160;&#160;&#160;length="16"<br /><font color="#a52a2a">&#160;&#160; insert="false"&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; //不参与插入操作<br />&#160;&#160; update="false"&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; //不参与更新操作<br /></font>&#160;&#160;/&gt;<br />&#160;&#160;&lt;property<br />&#160;&#160;&#160;name="sort"<br />&#160;&#160;&#160;column="sort"<br />&#160;&#160;&#160;type="string"<br />&#160;&#160;&#160;not-null="false"<br />&#160;&#160;&#160;length="3"<br />&#160;&#160;/&gt;<br />&#160;&#160;&lt;property<br />&#160;&#160;&#160;name="private"<br />&#160;&#160;&#160;column="private"<br />&#160;&#160;&#160;type="string"<br />&#160;&#160;&#160;not-null="false"<br />&#160;&#160;&#160;length="1"<br />&#160;&#160;/&gt;<br />&#160;&#160;&lt;many-to-one<br />&#160;&#160;&#160;name="plinkCode"<br />&#160;&#160;&#160;column="plink_code"<br />&#160;&#160;&#160;class="EmylinkUpcode"<br />&#160;&#160;&#160;not-null="true"<br />&#160;&#160;&gt;<br />&#160;&#160;&lt;/many-to-one&gt;<br />&#160;&lt;/class&gt;&#160;<br />&lt;/hibernate-mapping&gt;</p></div><br />2.POJO对象<br />&#160; EmylinkUpcode.java 
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #008000">//</span><span style="COLOR: #008000">略<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&#160;&#160;&#160;&#160;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&#160;primary&#160;key</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">&#160;&#160;&#160;&#160;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&#160;java.lang.Integer&#160;id;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&#160;&#160;&#160;&#160;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&#160;fields</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">&#160;&#160;&#160;&#160;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&#160;java.lang.String&#160;account;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&#160;&#160;&#160;&#160;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&#160;java.lang.String&#160;plinkName;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&#160;&#160;&#160;&#160;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&#160;java.lang.String&#160;plinkExplain;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&#160;&#160;&#160;&#160;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&#160;java.lang.String&#160;typeCode;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&#160;&#160;&#160;&#160;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&#160;collections</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">&#160;&#160;&#160;&#160;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&#160;java.util.Set</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">hbm.EmylinkUlink</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&#160;emylinkUlinks;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">略</span></div><br />&#160; EmylinkUlink.java 
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="COLOR: #008000">//</span><span style="COLOR: #008000">略</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&#160;hashCode&#160;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&#160;Integer.MIN_VALUE;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&#160;&#160;&#160;&#160;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&#160;primary&#160;key</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">&#160;&#160;&#160;&#160;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&#160;java.lang.Integer&#160;id;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&#160;&#160;&#160;&#160;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&#160;fields</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">&#160;&#160;&#160;&#160;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&#160;java.lang.String&#160;account;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&#160;&#160;&#160;&#160;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&#160;java.lang.String&#160;link;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&#160;&#160;&#160;&#160;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&#160;java.lang.String&#160;linkName;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&#160;&#160;&#160;&#160;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&#160;java.lang.String&#160;explain;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&#160;&#160;&#160;&#160;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&#160;java.util.Date&#160;indate;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&#160;&#160;&#160;&#160;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&#160;java.lang.String&#160;sort;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&#160;&#160;&#160;&#160;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&#160;java.lang.String&#160;m_private;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&#160;&#160;&#160;&#160;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&#160;many&#160;to&#160;one</span><span style="COLOR: #008000"><br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #000000">&#160;&#160;&#160;&#160;</span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">&#160;hbm.EmylinkUpcode&#160;plinkCode;<br /><img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">略</span></div><br />通过EmylinkUpcode加载EmylinkUlink(<font color="#ffa500" size="2">注意EmylinkUpcode.hbm.xml中声明了延迟加载</font>)<br /><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">Session&#160;session&#160;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&#160;EmylinkSessionFactory.currentSession();<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Query&#160;q&#160;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&#160;session.createQuery(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">from&#160;EmylinkUpcode&#160;where&#160;account='derek'</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;List&#160;l&#160;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&#160;q.list();<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;EmylinkUpcode&#160;eu&#160;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&#160;&#160;(EmylinkUpcode)l.get(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">);<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;System.out.println(eu.getPlinkName());<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">Hibernate.initialize(eu.getEmylinkUlinks());</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">当延迟加载lazy=true时，强制加载及联对象</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Set&#160;ul&#160;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&#160;eu.getEmylinkUlinks();&#160;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Iterator</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">EmylinkUlink</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&#160;it&#160;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&#160;ul.iterator();</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">lazy=true并且不使用强制加载，则此时才真真及联加载</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(it.hasNext()){<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;System.out.println(it.next().getLinkName());<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br />&#160;EmylinkSessionFactory.closeSession();&#160;&#160;<br /></span></div><p><font color="#ff0000">* 延迟加载</font>&#160;&#160;&#160;<br />&#160; &#160;如果lazy=true(延迟加载), 加载EmylinkUpcode时,hibernate不会立即加载EmylinkUlink,只有当(Iterator<span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">EmylinkUlink</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&#160;it&#160;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&#160;ul.iterator();</span>)执行时,hibernate才加载EmylinkUlink实例;&#160;如果在加载前就关闭session,则报异常<font color="#ff0000">LazyInitializationException&#160;<font color="#000000">;&#160;可以使用</font></font><font color="#0000ff">Hibernate.initialize(Object o)</font><font color="#000000">强制及联加载<br /><br /><u><font color="#c60a00">*J2SE5.0</font><font color="#800080">的泛型 </font></u></font><font color="#0000ff"></font></p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&#160;setEmylinkUlinks&#160;(java.util.Set</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">hbm.EmylinkUlink</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&#160;emylinkUlinks)&#160;{<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.emylinkUlinks&#160;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&#160;emylinkUlinks;<br />&#160;&#160;&#160;&#160;}</span></div><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">Iterator</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">EmylinkUlink</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&#160;it&#160;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&#160;ul.iterator();</span><span style="COLOR: #000000">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(it.hasNext()){<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;EmylinkUlink&#160;el&#160;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&#160;it.next();</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">无需进行强制类型转换</span><span style="COLOR: #008000"><br /></span><span style="COLOR: #000000">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;System.out.println(el.getLinkName());<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}</span></div><p><font size="2">emylinkUlinks集合中只能存放EmylinkUlink对象，从集合中获取对象无需再类型转换<br /></font>&#160;<br />struts+spring+hibernate关于hibernate中lazy="true"的问题。web.xml中用&#160;&#160;&#160;</p><div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #000000">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">filter</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&#160;&#160;&#160;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">filter</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">name</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">openSessionInViewFilter</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">filter</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">name</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&#160;&#160;&#160;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">filter</span><span style="COLOR: #000000">-</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">org.springframework.orm.hibernate.support.OpenSessionInViewFilter</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">filter</span><span style="COLOR: #000000">-</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&#160;&#160;&#160;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">filter</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&#160;&#160;&#160;<br />&#160;&#160;&#160;&#160;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">filter</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">mapping</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&#160;&#160;&#160;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">filter</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">name</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">openSessionInViewFilter</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">filter</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">name</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&#160;&#160;&#160;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">url</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">pattern</span><span style="COLOR: #000000">&gt;*</span><span style="COLOR: #000000">.</span><span style="COLOR: #0000ff">do</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">url</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">pattern</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&#160;&#160;&#160;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">filter</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">mapping</span><span style="COLOR: #000000">&gt;</span></div><p>&#160; 它的原理就是：打开页面的时候打开session，一直到页面装载完毕才关闭session，这样就解决了lazy="true"时session&#160;&#160; is&#160;&#160; closed的问题。<br />&#160; 关于OpenSessionInViewFilter 延迟加载失效问题 <a href="http://www.javaeye.com/topic/15057">http://www.javaeye.com/topic/15057</a><br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; OpenSessionInView的效率问题&#160; <a href="http://www.javaeye.com/topic/17501" target="blank">http://www.javaeye.com/topic/17501</a><br /></p> <img src ="http://www.blogjava.net/envoydada/aggbug/68308.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/envoydada/" target="_blank">Derek.Guo</a> 2006-09-07 16:20 <a href="http://www.blogjava.net/envoydada/archive/2006/09/07/68308.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EL表达式</title><link>http://www.blogjava.net/envoydada/archive/2006/08/30/66559.html</link><dc:creator>Derek.Guo</dc:creator><author>Derek.Guo</author><pubDate>Wed, 30 Aug 2006 01:23:00 GMT</pubDate><guid>http://www.blogjava.net/envoydada/archive/2006/08/30/66559.html</guid><wfw:comment>http://www.blogjava.net/envoydada/comments/66559.html</wfw:comment><comments>http://www.blogjava.net/envoydada/archive/2006/08/30/66559.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/envoydada/comments/commentRss/66559.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/envoydada/services/trackbacks/66559.html</trackback:ping><description><![CDATA[		<li>
				<ol>
						<li>
								<a name="A1">
								</a>
								<font color="#ff6600">
										<strong>EL脚本语言的配置和支持： </strong>
								</font>
								<br />对于一个单个JSP页面，你可以使用定义page指令来设置jsp页面是否支持EL。默认是支持EL(如果要页面不支持EL，请设置为<span class="myp11"><font id="zoom0">isELIgnored=true;</font></span></li>
				</ol>
				<table cellspacing="0" bordercolordark="#ffffff" cellpadding="2" width="400" align="center" bordercolorlight="black" border="1">
						<tbody>
								<tr>
										<td class="code" style="FONT-SIZE: 9pt" valign="center" align="middle" bgcolor="#e6e6e6" height="18">
												<ol>
														<li>
																<span class="myp11">
																		<font id="zoom">&lt;%@ page isELIgnored＝"true|false"%&gt;</font>
																</span>
														</li>
												</ol>
										</td>
								</tr>
						</tbody>
				</table>
				<ol>
						<li>对于整个JSP应用程序，要修改WEB.XML配置(tomcat5.0.16默认是支持EL的); 
</li>
						<li>
								<font color="#0066cc">&lt;jsp-property-group&gt;</font>&#160;<br />&lt;description&gt; For config the ICW sample application &lt;/description&gt; <br />&lt;display-name&gt;JSPConfiguration&lt;/display-name&gt; <br />&lt;url-pattern&gt;/jsp/datareset.jsp&lt;/url-pattern&gt; <br />&lt;el-ignored&gt;true&lt; /<ccid_code> el-ignored&gt; <br />&lt;page-encoding&gt;ISO-8859-1&lt;/page-encoding&gt; <br />&lt;scripting-invalid&gt;true&lt;/scripting-invalid&gt;<br />&lt;include-prelude&gt;/jsp/prelude.jspf&lt;/include-prelude&gt; <br />&lt;include-coda&gt;/jsp/coda.jspf&lt;/include-coda&gt;<br /><font color="#0066cc">&lt;/jsp-property-group&gt;</font></ccid_code></li>
				</ol>
		</li>
		<li>
				<ol>
						<li>
								<a name="A2">
								</a>
								<font color="#ff6600">
										<strong>算术运算符演示：</strong>
								</font>
								<br />以下是EL运算符列表，其中empty可以检查某个值是否为空 </li>
				</ol>
				<table class="clear" cellspacing="1" cellpadding="2" width="75%" align="center" bgcolor="#dddddd" border="0">
						<tbody>
								<tr align="middle" bgcolor="#ffffff">
										<td>
												<ol>
														<li>
																<b>运算符</b>
														</li>
												</ol>
										</td>
										<td>
												<b>说明</b>
										</td>
										<td>
												<b>运算符</b>
										</td>
										<td>
												<b>说明</b>
										</td>
								</tr>
								<tr bgcolor="#ffffff">
										<td>
												<p>+</p>
										</td>
										<td>
												<p>加</p>
										</td>
										<td>&gt; 或 gt</td>
										<td>大于</td>
								</tr>
								<tr bgcolor="#ffffff">
										<td>
												<p>-</p>
										</td>
										<td>
												<p>减</p>
										</td>
										<td>&lt;= 或 le</td>
										<td>小于等于</td>
								</tr>
								<tr bgcolor="#ffffff">
										<td>
												<p>*</p>
										</td>
										<td>
												<p>乘</p>
										</td>
										<td>&gt;= 或 ge</td>
										<td>大于等于</td>
								</tr>
								<tr bgcolor="#ffffff">
										<td>
												<p>/ 或 div</p>
										</td>
										<td>
												<p>除</p>
										</td>
										<td>&amp;&amp; 或 and</td>
										<td>逻辑与</td>
								</tr>
								<tr bgcolor="#ffffff">
										<td>
												<p>% 或 mod</p>
										</td>
										<td>
												<p>模（求余）</p>
										</td>
										<td>|| 或 or</td>
										<td>逻辑或</td>
								</tr>
								<tr bgcolor="#ffffff">
										<td>
												<p>== 或 =</p>
										</td>
										<td>
												<p>等于</p>
										</td>
										<td>! 或 not</td>
										<td>逻辑非</td>
								</tr>
								<tr bgcolor="#ffffff">
										<td>
												<p>!= 或 !=</p>
										</td>
										<td>
												<p>不等于</p>
										</td>
										<td>empty</td>
										<td>检查是否为空值</td>
								</tr>
								<tr bgcolor="#ffffff">
										<td>
												<p>&lt; 或 lt</p>
										</td>
										<td>
												<p>小于</p>
										</td>
										<td>a ? b : c</td>
										<td>条件运算符</td>
								</tr>
						</tbody>
				</table>
				<ol>
						<li>EL表达式使用简单,在网页中"\${}"表示是EL表达式。\${1+1} 显示为 2 </li>
				</ol>
				<table cellspacing="1" cellpadding="5" width="75%" align="center" bgcolor="#dddddd" border="0">
						<tbody>
								<tr align="middle" bgcolor="#ffffff">
										<td>
												<ol>
														<li>
																<b>EL算术表达式</b>
														</li>
												</ol>
										</td>
										<td>
												<b>运算结果</b>
										</td>
										<td>
												<b>EL 关系运算表达式</b>
										</td>
										<td>
												<b>运算结果</b>
										</td>
								</tr>
								<tr bgcolor="#ffffff">
										<td>${1}</td>
										<td>1</td>
										<td>${1 &lt; 2}</td>
										<td>true</td>
								</tr>
								<tr bgcolor="#ffffff">
										<td>${1 + 2}</td>
										<td>3</td>
										<td>${1 lt 2}</td>
										<td>true</td>
								</tr>
								<tr bgcolor="#ffffff">
										<td>${1.2 + 2.3}</td>
										<td>3.5</td>
										<td>${1 &gt; (4/2)}</td>
										<td>false</td>
								</tr>
								<tr bgcolor="#ffffff">
										<td>${-4 - 2}</td>
										<td>-6</td>
										<td>${4.0 &gt;= 3}</td>
										<td>true</td>
								</tr>
								<tr bgcolor="#ffffff">
										<td>${21 * 2}</td>
										<td>42</td>
										<td>${4.0 ge 3}</td>
										<td>true</td>
								</tr>
								<tr bgcolor="#ffffff">
										<td>${10%4}</td>
										<td>2</td>
										<td>${100.0 eq 100}</td>
										<td>true</td>
								</tr>
								<tr bgcolor="#ffffff">
										<td>${10 mod 4}</td>
										<td>2</td>
										<td>${(10*10) != 100}</td>
										<td>false</td>
								</tr>
								<tr bgcolor="#ffffff">
										<td>${(1==2) ? 3 : 4}</td>
										<td>4</td>
										<td>${(10*10) ne 100}</td>
										<td>false</td>
								</tr>
						</tbody>
				</table>
				<p>
				</p>
		</li>
		<li>
				<ol>
						<li>
								<a name="A3">
								</a>
								<strong>
										<font color="#ff6600">隐含对象数据演示：</font>
								</strong>
						</li>
						<li>EL 表达式定义了11个隐含对象,使用这11个对象可以很方便的读取到session,cookie,HttpHeader,用户提交表单<code>(</code>param)等 </li>
				</ol>
				<table class="clear" cellspacing="1" cellpadding="2" width="75%" align="center" bgcolor="#dddddd" border="0">
						<tbody>
								<tr bgcolor="#ffffff">
										<td width="30%">
												<ol>
														<li>
																<div style="TEXT-ALIGN: center" align="center">
																		<b>隐含对象</b>
																</div>
														</li>
												</ol>
										</td>
										<td>
												<p style="TEXT-ALIGN: center" align="center">
														<b>内容</b>
												</p>
										</td>
								</tr>
								<tr bgcolor="#ffffff">
										<td>
												<p>applicationScope</p>
										</td>
										<td>
												<p style="LAYOUT-GRID-MODE: char">应用程序范围内的scoped变量组成的集合</p>
										</td>
								</tr>
								<tr bgcolor="#ffffff">
										<td>
												<p>cookie</p>
										</td>
										<td>
												<p style="LAYOUT-GRID-MODE: char">所有cookie组成的集合</p>
										</td>
								</tr>
								<tr bgcolor="#ffffff">
										<td>
												<p>header</p>
										</td>
										<td>
												<p style="LAYOUT-GRID-MODE: char">HTTP请求头部，字符串</p>
										</td>
								</tr>
								<tr bgcolor="#ffffff">
										<td>
												<p>headerValues</p>
										</td>
										<td>
												<p style="LAYOUT-GRID-MODE: char">HTTP请求头部，字符串集合</p>
										</td>
								</tr>
								<tr bgcolor="#ffffff">
										<td>
												<p>initParam</p>
										</td>
										<td>
												<p style="LAYOUT-GRID-MODE: char">全部应用程序参数名组成的集合</p>
										</td>
								</tr>
								<tr bgcolor="#ffffff">
										<td>
												<p>pageContext</p>
										</td>
										<td>
												<p style="LAYOUT-GRID-MODE: char">当前页面的javax.servlet.jsp.PageContext对象</p>
										</td>
								</tr>
								<tr bgcolor="#ffffff">
										<td>
												<p>pageScope</p>
										</td>
										<td>
												<p style="LAYOUT-GRID-MODE: char">页面范围内所有对象的集合</p>
										</td>
								</tr>
								<tr bgcolor="#ffffff">
										<td>
												<p>param</p>
										</td>
										<td>
												<p style="LAYOUT-GRID-MODE: char">所有请求参数字符串组成的集合</p>
										</td>
								</tr>
								<tr bgcolor="#ffffff">
										<td>
												<p>paramValues</p>
										</td>
										<td>
												<p style="LAYOUT-GRID-MODE: char">所有作为字符串集合的请求参数</p>
										</td>
								</tr>
								<tr bgcolor="#ffffff">
										<td>
												<p>requestScope</p>
										</td>
										<td>
												<p style="LAYOUT-GRID-MODE: char">所有请求范围的对象的集合</p>
										</td>
								</tr>
								<tr bgcolor="#ffffff">
										<td>
												<p>sessionScope</p>
										</td>
										<td>
												<p style="LAYOUT-GRID-MODE: char">所有会话范围的对象的集合</p>
										</td>
								</tr>
						</tbody>
				</table>
				<ol>
						<li>下面是获取HTTP访问头部数据和用户提交数据的示例 </li>
				</ol>
				<table cellspacing="1" cellpadding="5" width="75%" align="center" bgcolor="#dddddd" border="0">
						<tbody>
								<tr bgcolor="#ffffff">
										<td width="30%">
												<ol>
														<li>EL表达式 </li>
												</ol>
										</td>
										<td>运算结果</td>
								</tr>
								<tr bgcolor="#ffffff">
										<td>${header["host"]}<br /></td>
										<td>这里得到HTTP连接头部的host值</td>
								</tr>
								<tr bgcolor="#ffffff">
										<td>${header["accept"]}</td>
										<td>这里获得HTTP头部的accept值</td>
								</tr>
								<tr bgcolor="#ffffff">
										<td>${header["user-agent"]}</td>
										<td>这里获得HTTP头部的user-agent值</td>
								</tr>
								<tr bgcolor="#ffffff">
										<td colspan="2" height="24">
												<a name="B4">
												</a>以下可以读取用户提交的信息,假设用户提交信息为 ?name=myname&amp;alies=now.net.cn(这里有两种访问方式,一种是使用[]来进行访问,另外一种是使用" "来进行访问，两种访问效果是一样的。)</td>
								</tr>
								<tr bgcolor="#ffffff">
										<td>${param["name"] }</td>
										<td>&#160;myname</td>
								</tr>
								<tr bgcolor="#ffffff">
										<td>${param.name} </td>
										<td>&#160;myname</td>
								</tr>
								<tr bgcolor="#ffffff">
										<td>${param["alies"] }</td>
										<td>&#160;now.net.cn</td>
								</tr>
								<tr bgcolor="#ffffff">
										<td height="4">${param.alies}</td>
										<td height="4">now.net.cn</td>
								</tr>
						</tbody>
				</table>
		</li>
		<p>&#160;</p>
		<p>eg:&#160;&#160;&#160;&#160;&#160;<font color="#ff0000"> ${empty(requestScope.backpath)?'admin_TcAction.do?method=findFinish':requestScope.backpath}</font></p>
 <img src ="http://www.blogjava.net/envoydada/aggbug/66559.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/envoydada/" target="_blank">Derek.Guo</a> 2006-08-30 09:23 <a href="http://www.blogjava.net/envoydada/archive/2006/08/30/66559.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring jdbcTemplate</title><link>http://www.blogjava.net/envoydada/archive/2006/08/28/66184.html</link><dc:creator>Derek.Guo</dc:creator><author>Derek.Guo</author><pubDate>Mon, 28 Aug 2006 06:56:00 GMT</pubDate><guid>http://www.blogjava.net/envoydada/archive/2006/08/28/66184.html</guid><wfw:comment>http://www.blogjava.net/envoydada/comments/66184.html</wfw:comment><comments>http://www.blogjava.net/envoydada/archive/2006/08/28/66184.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/envoydada/comments/commentRss/66184.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/envoydada/services/trackbacks/66184.html</trackback:ping><description><![CDATA[		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<font face="Courier New">
						<span style="COLOR: #0000ff">final</span>
						<span style="COLOR: #000000">&#160;List&#160;scopeList&#160;</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">&#160;</span>
						<span style="COLOR: #0000ff">new</span>
				</font>
				<font face="Courier New">
						<span style="COLOR: #000000">&#160;ArrayList();<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;jdbcTemplate.query(sql,</span>
						<span style="COLOR: #0000ff">new</span>
				</font>
				<font face="Courier New">
						<span style="COLOR: #000000">&#160;RowCallbackHandler()&#160;{<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span>
						<span style="COLOR: #0000ff">public</span>
						<span style="COLOR: #000000">&#160;</span>
						<span style="COLOR: #0000ff">void</span>
						<span style="COLOR: #000000">&#160;processRow(ResultSet&#160;rs)&#160;</span>
						<span style="COLOR: #0000ff">throws</span>
				</font>
				<font face="Courier New">
						<span style="COLOR: #000000">&#160;SQLException&#160;{<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Bmbh&#160;bm&#160;</span>
						<span style="COLOR: #000000">=</span>
						<span style="COLOR: #000000">&#160;</span>
						<span style="COLOR: #0000ff">new</span>
				</font>
				<font face="Courier New">
						<span style="COLOR: #000000">&#160;Bmbh();<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;bm.setDeptId(rs.getString(</span>
						<span style="COLOR: #000000">1</span>
				</font>
				<font face="Courier New">
						<span style="COLOR: #000000">));<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;bm.setDeptName(rs.getString(</span>
						<span style="COLOR: #000000">2</span>
				</font>
				<span style="COLOR: #000000">
						<font face="Courier New">));<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;scopeList.add(bm);<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;);</font>
				</span>
		</div>
 <img src ="http://www.blogjava.net/envoydada/aggbug/66184.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/envoydada/" target="_blank">Derek.Guo</a> 2006-08-28 14:56 <a href="http://www.blogjava.net/envoydada/archive/2006/08/28/66184.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring Hibernate 模板实现分页</title><link>http://www.blogjava.net/envoydada/archive/2006/08/28/66182.html</link><dc:creator>Derek.Guo</dc:creator><author>Derek.Guo</author><pubDate>Mon, 28 Aug 2006 06:53:00 GMT</pubDate><guid>http://www.blogjava.net/envoydada/archive/2006/08/28/66182.html</guid><wfw:comment>http://www.blogjava.net/envoydada/comments/66182.html</wfw:comment><comments>http://www.blogjava.net/envoydada/archive/2006/08/28/66182.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.blogjava.net/envoydada/comments/commentRss/66182.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/envoydada/services/trackbacks/66182.html</trackback:ping><description><![CDATA[		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<font color="#000000">
						<font size="3">
								<font face="Arial">
										<span style="COLOR: #0000ff">public</span>
										<span style="COLOR: #000000">&#160;List&#160;find(</span>
										<span style="COLOR: #0000ff">final</span>
										<span style="COLOR: #000000">&#160;String&#160;hsql,&#160;</span>
										<span style="COLOR: #0000ff">final</span>
										<span style="COLOR: #000000">&#160;</span>
										<span style="COLOR: #0000ff">int</span>
										<span style="COLOR: #000000">&#160;firstRow,&#160;</span>
										<span style="COLOR: #0000ff">final</span>
										<span style="COLOR: #000000">&#160;</span>
										<span style="COLOR: #0000ff">int</span>
										<span style="COLOR: #000000">&#160;maxRow)&#160;</span>
										<span style="COLOR: #0000ff">throws</span>
								</font>
						</font>
				</font>
				<font color="#000000">
						<font size="3">
								<font face="Arial">
										<span style="COLOR: #000000">&#160;Exception&#160;{&#160;<br />&#160;&#160; </span>
										<span style="COLOR: #0000ff">return</span>
										<span style="COLOR: #000000">&#160;getHibernateTemplate().executeFind(</span>
										<span style="COLOR: #0000ff">new</span>
								</font>
						</font>
				</font>
				<font color="#000000">
						<font size="3">
								<font face="Arial">
										<span style="COLOR: #000000">&#160;HibernateCallback()&#160;{&#160;<br /></span>
										<span style="COLOR: #0000ff">&#160;&#160;&#160;&#160; public</span>
										<span style="COLOR: #000000">&#160;Object&#160;doInHibernate(Session&#160;s)&#160;</span>
										<span style="COLOR: #0000ff">throws</span>
								</font>
						</font>
				</font>
				<font color="#000000">
						<font size="3">
								<font face="Arial">
										<span style="COLOR: #000000">&#160;HibernateException,&#160;SQLException&#160;{&#160;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Query&#160;query&#160;</span>
										<span style="COLOR: #000000">=</span>
								</font>
						</font>
				</font>
				<font color="#000000">
						<font size="3">
								<font face="Arial">
										<span style="COLOR: #000000">&#160;s.createQuery(hsql);&#160;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; query.setFirstResult(firstRow);&#160;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; query.setMaxResults(maxRow);&#160;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; List&#160;list&#160;</span>
										<span style="COLOR: #000000">=</span>
								</font>
						</font>
				</font>
				<font color="#000000">
						<font size="3">
								<font face="Arial">
										<span style="COLOR: #000000">&#160;query.list();&#160;<br /></span>
										<span style="COLOR: #0000ff">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return</span>
								</font>
						</font>
				</font>
				<span style="COLOR: #000000">
						<font face="Arial" color="#000000" size="3">&#160;list;&#160;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;}&#160;<br />&#160;&#160;&#160;&#160; });&#160;<br />}</font> &#160;</span>
		</div>
		<br />
 <img src ="http://www.blogjava.net/envoydada/aggbug/66182.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/envoydada/" target="_blank">Derek.Guo</a> 2006-08-28 14:53 <a href="http://www.blogjava.net/envoydada/archive/2006/08/28/66182.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate获取数据方式与缓存使用</title><link>http://www.blogjava.net/envoydada/archive/2006/08/16/63928.html</link><dc:creator>Derek.Guo</dc:creator><author>Derek.Guo</author><pubDate>Wed, 16 Aug 2006 08:22:00 GMT</pubDate><guid>http://www.blogjava.net/envoydada/archive/2006/08/16/63928.html</guid><wfw:comment>http://www.blogjava.net/envoydada/comments/63928.html</wfw:comment><comments>http://www.blogjava.net/envoydada/archive/2006/08/16/63928.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/envoydada/comments/commentRss/63928.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/envoydada/services/trackbacks/63928.html</trackback:ping><description><![CDATA[转载--<br />Hibernate获取数据的方式有不同的几种，其与缓存结合使用的效果也不尽相同，而Hibernate中具体怎么使用缓存其实是我们很关心的一个问题，直接涉及到性能方面。<br /><br />缓存在Hibernate中主要有三个方面：一级缓存、二级缓存和查询缓存；一级缓存在Hibernate中对应的即为session范围的缓存，也就是当session关闭时缓存即被清除，一级缓存在Hibernate中是不可配置的部分；二级缓存在Hibernate中对应的即为SessionFactory范围的缓存，通常来讲SessionFactory的生命周期和应用的生命周期相同，所以可以看成是进程缓存或集群缓存，二级缓存在Hibernate中是可以配置的，可以通过class-cache配置类粒度级别的缓存(class-cache在class中数据发生任何变化的情况下自动更新)，同时也可通过collection-cache配置集合粒度级别的缓存(collection-cache仅在collection中增加了元素或者删除了元素的情况下才自动更新，也就是当collection中元素发生值的变化的情况下它是不会自动更新的)，缓存自然会带来并发的访问问题，这个时候相应的就要根据应用来设置缓存所采用的事务隔离级别，和数据库的事务隔离级别概念基本一样，没什么多介绍的，^_^；查询缓存在Hibernate同样是可配置的，默认是关闭的，可以通过设置cache.use_ &#160;query_cache为true来打开查询缓存。根据缓存的通常实现策略，我们可以来理解Hibernate的这三种缓存，缓存的实现通过是通过key/value的Map方式来实现，在Hibernate的一级、二级和查询缓存也同样如此，一级、二级缓存使用的key均为po的主键ID，value即为po实例对象，查询缓存使用的则为查询的条件、查询的参数、查询的页数，value有两种情况，如果采用的是select &#160;po.property这样的方式那么value为整个结果集，如采用的是from这样的方式那么value为获取的结果集中各po对象的主键ID，这样的作用很明显，节省内存，^_^<br /><br />简单介绍完Hibernate的缓存后，再结合Hibernate的获取数据方式来说明缓存的具体使用方式，在Hibernate中获取数据常用的方式主要有四种：Session.load、Session.get、Query.list、Query.iterator。<br /><br />1、Session.load<br />&#160; &#160; &#160; &#160; &#160; &#160;在执行session.load时，Hibernate首先从当前session的一级缓存中获取id对应的值，在获取不到的情况下，将根据该对象是否配置了二级缓存来做相应的处理，如配置了二级缓存，则从二级缓存中获取id对应的值，如仍然获取不到则还需要根据是否配置了延迟加载来决定如何执行，如未配置延迟加载则从数据库中直接获取，在从数据库获取到数据的情况下，Hibernate会相应的填充一级缓存和二级缓存，如配置了延迟加载则直接返回一个代理类，只有在触发代理类的调用时才进行数据库查询的操作。<br />&#160; &#160; &#160; &#160; &#160; &#160;在这样的情况下我们就可以看到，在session一直打开的情况下，要注意在适当的时候对一级缓存进行刷新操作，通常是在该对象具有单向关联维护的时候，在Hibernate中可以使用象session.clear、session.evict的方式来强制刷新一级缓存。<br />&#160; &#160; &#160; &#160; &#160; &#160;二级缓存则在数据发生任何变化(新增、更新、删除)的情况下都会自动的被更新。<br /><br />2、Session.get<br />&#160; &#160; &#160; &#160; &#160; &#160;在执行Session.get时，和Session.load不同的就是在当从缓存中获取不到时，直接从数据库中获取id对应的值。<br /><br />3、Query.list<br />&#160; &#160; &#160; &#160; &#160; &#160;在执行Query.list时，Hibernate的做法是首先检查是否配置了查询缓存，如配置了则从查询缓存中查找key为查询语句+查询参数+分页条件的值，如获取不到则从数据库中进行获取，从数据库获取到后Hibernate将会相应的填充一级、二级和查询缓存，如获取到的为直接的结果集，则直接返回，如获取到的为一堆id的值，则再根据id获取相应的值(Session.load)，最后形成结果集返回，可以看到，在这样的情况下，list也是有可能造成N次的查询的。<br />&#160; &#160; &#160; &#160; &#160; &#160;查询缓存在数据发生任何变化的情况下都会被自动的清空。<br /><br />4、Query.iterator<br />&#160; &#160; &#160; &#160; &#160; &#160;在执行Query.iterator时，和Query.list的不同的在于从数据库获取的处理上，Query.iterator向数据库发起的是select &#160;id &#160;from这样的语句，也就是它是先获取符合查询条件的id，之后在进行iterator.next调用时才再次发起session.load的调用获取实际的数据。<br />&#160; &#160; &#160; &#160; &#160; &#160;可见，在拥有二级缓存并且查询参数多变的情况下，Query.iterator会比Query.list更为高效 <img src ="http://www.blogjava.net/envoydada/aggbug/63928.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/envoydada/" target="_blank">Derek.Guo</a> 2006-08-16 16:22 <a href="http://www.blogjava.net/envoydada/archive/2006/08/16/63928.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA的RSS阅读器</title><link>http://www.blogjava.net/envoydada/archive/2006/08/15/63743.html</link><dc:creator>Derek.Guo</dc:creator><author>Derek.Guo</author><pubDate>Tue, 15 Aug 2006 09:46:00 GMT</pubDate><guid>http://www.blogjava.net/envoydada/archive/2006/08/15/63743.html</guid><wfw:comment>http://www.blogjava.net/envoydada/comments/63743.html</wfw:comment><comments>http://www.blogjava.net/envoydada/archive/2006/08/15/63743.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/envoydada/comments/commentRss/63743.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/envoydada/services/trackbacks/63743.html</trackback:ping><description><![CDATA[		<span lang="en-US">
				<span lang="zh-CN">
				</span>
		</span>
		<div>需要的JAR<br /><ol><li><p style="MARGIN-BOTTOM: 0cm"><span lang="en-US"><span lang="zh-CN">Java SE 1.4</span></span>以上的版本，下载地址<span lang="en-US"><span lang="zh-CN">:</span></span>　<span lang="en-US"><span lang="zh-CN"><a href="http://java.sun.com/">http://java.sun.com/</a></span></span></p></li><li><p style="MARGIN-BOTTOM: 0cm">开源软件<span lang="en-US"><span lang="zh-CN">JDOM</span></span>，下载地址：<span lang="en-US"><span lang="zh-CN"><a href="http://www.jdom.org/"><font color="#002c99">http://www.jdom.org/</font></a></span></span></p></li><li><p style="MARGIN-BOTTOM: 0cm"><span lang="en-US"><span lang="zh-CN">ROME&#160; 下载地址 <span lang="en-US"><a href="http://wiki.java.net/bin/view/Javawsxml/Rome">http://wiki.java.net/bin/view/Javawsxml/Rome</a></span></span></span></p></li></ol><br />1.<span lang="en-US"><span lang="zh-CN"><strong>Rome<br /></strong><span lang="en-US">&#160;&#160;&#160; Rome</span>这个开源工具来实现<span lang="en-US">RSS</span>阅读器。<span lang="en-US">Rome</span>支持的格式很多，有<span lang="en-US">RSS 0.90, RSS 0.91 Netscape, RSS 0.91 Userland, RSS 0.92, RSS 0.93, RSS 0.94, RSS 1.0, RSS 2.0, Atom 0.3, Atom 1.0 </span>等等，几乎囊括了目前所有的<span lang="en-US">RSS </span>和<span lang="en-US">atom</span>版本。最新的<span lang="en-US">Rome</span>版本可以从<span lang="en-US">http://wiki.java.net/bin/view/Javawsxml/Rome</span>上得到。<br />&#160;&#160; 
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><span style="COLOR: #008000">/*</span><span style="COLOR: #008000"><br />&#160;*&#160;Main.java<br />&#160;*<br />&#160;*&#160;Created&#160;on&#160;2006年8月15日,&#160;下午4:00<br />&#160;*<br />&#160;*&#160;To&#160;change&#160;this&#160;template,&#160;choose&#160;Tools&#160;|&#160;Template&#160;Manager<br />&#160;*&#160;and&#160;open&#160;the&#160;template&#160;in&#160;the&#160;editor.<br />&#160;</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br /><br /></span><span style="COLOR: #0000ff">package</span><span style="COLOR: #000000">&#160;rssdemo;<br /><br /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&#160;com.sun.syndication.feed.synd.SyndEntry;<br /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&#160;com.sun.syndication.feed.synd.SyndFeed;<br /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&#160;com.sun.syndication.io.FeedException;<br /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&#160;com.sun.syndication.io.SyndFeedInput;<br /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&#160;com.sun.syndication.io.XmlReader;<br /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&#160;java.io.IOException;<br /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&#160;java.net.MalformedURLException;<br /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&#160;java.net.URL;<br /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&#160;java.net.URLConnection;<br /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&#160;java.util.List;<br /></span><span style="COLOR: #0000ff">import</span><span style="COLOR: #000000">&#160;java.util.Properties;<br /><br /></span><span style="COLOR: #008000">/**</span><span style="COLOR: #008000"><br />&#160;*<br />&#160;*&#160;</span><span style="COLOR: #808080">@author</span><span style="COLOR: #008000">&#160;Administrator<br />&#160;</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br /></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&#160;Main&#160;{<br />&#160;&#160;&#160;&#160;String&#160;urlStr&#160;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">http://rss.sina.com.cn/news/marquee/ddt.xml</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">;<br />&#160;&#160;&#160;&#160;</span><span style="COLOR: #008000">/**</span><span style="COLOR: #008000">&#160;Creates&#160;a&#160;new&#160;instance&#160;of&#160;Main&#160;</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br />&#160;&#160;&#160;&#160;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&#160;Main()&#160;{<br />&#160;&#160;&#160;&#160;}<br />&#160;&#160;&#160;&#160;<br />&#160;&#160;&#160;&#160;</span><span style="COLOR: #008000">/**</span><span style="COLOR: #008000"><br />&#160;&#160;&#160;&#160;&#160;*&#160;链接rss<br />&#160;&#160;&#160;&#160;&#160;</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br />&#160;&#160;&#160;&#160;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&#160;rss(){&#160;&#160;&#160;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000">&#160;{<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;URL&#160;feedUrl&#160;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&#160;URL(urlStr);<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;SyndFeedInput&#160;input&#160;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&#160;SyndFeedInput();<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;SyndFeed&#160;feed&#160;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&#160;input.build(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&#160;XmlReader(feedUrl));<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">.show(feed);<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}&#160;</span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000">&#160;(IllegalArgumentException&#160;ex)&#160;{<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;ex.printStackTrace();<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}&#160;</span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000">&#160;(IOException&#160;ex)&#160;{<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;ex.printStackTrace();<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}&#160;</span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000">&#160;(FeedException&#160;ex)&#160;{<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;ex.printStackTrace();<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br />&#160;&#160;&#160;&#160;}<br />&#160;&#160;&#160;&#160;<br />&#160;&#160;&#160;&#160;&#160;</span><span style="COLOR: #008000">/**</span><span style="COLOR: #008000"><br />&#160;&#160;&#160;&#160;&#160;*&#160;通过代理链接rss<br />&#160;&#160;&#160;&#160;&#160;</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br />&#160;&#160;&#160;&#160;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&#160;agentRss()&#160;{&#160;&#160;&#160;&#160;&#160;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="COLOR: #0000ff">try</span><span style="COLOR: #000000">&#160;{<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;URLConnection&#160;feedUrl&#160;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&#160;URL(urlStr).openConnection();<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;feedUrl.setRequestProperty(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">User-Agent</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&#160;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Mozilla/4.0&#160;(compatible;&#160;MSIE&#160;5.0;&#160;Windows&#160;NT;&#160;DigExt)</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;SyndFeedInput&#160;input&#160;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&#160;SyndFeedInput();&#160;&#160;&#160;&#160;&#160;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;SyndFeed&#160;feed&#160;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&#160;input.build(</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&#160;XmlReader(feedUrl));<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}&#160;</span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000">&#160;(IllegalArgumentException&#160;ex)&#160;{<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;ex.printStackTrace();<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}&#160;</span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000">&#160;(IOException&#160;ex)&#160;{<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;ex.printStackTrace();<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}&#160;</span><span style="COLOR: #0000ff">catch</span><span style="COLOR: #000000">&#160;(FeedException&#160;ex)&#160;{<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;ex.printStackTrace();<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br />&#160;&#160;&#160;&#160;}<br />&#160;&#160;&#160;&#160;<br />&#160;&#160;&#160;&#160;</span><span style="COLOR: #008000">/**</span><span style="COLOR: #008000"><br />&#160;&#160;&#160;&#160;&#160;*设置HTTP代理<br />&#160;&#160;&#160;&#160;&#160;</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br />&#160;&#160;&#160;&#160;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&#160;setHttpProxy(){<br />&#160;&#160;&#160;&#160;Properties&#160;systemSettings&#160;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&#160;System.getProperties();<br />&#160;&#160;&#160;&#160;systemSettings.put(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">http.proxyHost</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&#160;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">192.168.40.80</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br />&#160;&#160;&#160;&#160;systemSettings.put(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">http.proxyPort</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&#160;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">80</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br />&#160;&#160;&#160;&#160;System.setProperties(systemSettings);&#160;&#160;<br />&#160;&#160;&#160;&#160;}<br />&#160;&#160;&#160;&#160;<br />&#160;&#160;&#160;&#160;</span><span style="COLOR: #008000">/**</span><span style="COLOR: #008000"><br />&#160;&#160;&#160;&#160;&#160;*显示信息<br />&#160;&#160;&#160;&#160;&#160;</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br />&#160;&#160;&#160;&#160;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&#160;show(SyndFeed&#160;feed){<br />&#160;&#160;&#160;&#160;List&#160;list&#160;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&#160;feed.getEntries();<br />&#160;&#160;&#160;&#160;&#160;&#160;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&#160;(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&#160;i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">;&#160;i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&#160;list.size();&#160;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)&#160;{<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;SyndEntry&#160;entry&#160;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&#160;(SyndEntry)list.get(i);<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;System.out.println(entry.getTitle()</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&#160;|&#160;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">entry.getAuthor()</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&#160;|&#160;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">entry.getLink());<br />&#160;&#160;&#160;&#160;&#160;&#160;}&#160;<br />&#160;&#160;&#160;&#160;}<br />&#160;&#160;&#160;&#160;</span><span style="COLOR: #008000">/**</span><span style="COLOR: #008000"><br />&#160;&#160;&#160;&#160;&#160;*&#160;</span><span style="COLOR: #808080">@param</span><span style="COLOR: #008000">&#160;args&#160;the&#160;command&#160;line&#160;arguments<br />&#160;&#160;&#160;&#160;&#160;</span><span style="COLOR: #008000">*/</span><span style="COLOR: #000000"><br />&#160;&#160;&#160;&#160;</span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&#160;main(String[]&#160;args)&#160;{<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;Main&#160;m&#160;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&#160;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&#160;Main();<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;m.setHttpProxy();<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;m.rss();<br />&#160;&#160;&#160;&#160;}&#160;&#160;&#160;&#160;<br />}</span></div></span></span></div>
 <img src ="http://www.blogjava.net/envoydada/aggbug/63743.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/envoydada/" target="_blank">Derek.Guo</a> 2006-08-15 17:46 <a href="http://www.blogjava.net/envoydada/archive/2006/08/15/63743.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring异常类</title><link>http://www.blogjava.net/envoydada/archive/2006/06/12/52269.html</link><dc:creator>Derek.Guo</dc:creator><author>Derek.Guo</author><pubDate>Mon, 12 Jun 2006 11:20:00 GMT</pubDate><guid>http://www.blogjava.net/envoydada/archive/2006/06/12/52269.html</guid><wfw:comment>http://www.blogjava.net/envoydada/comments/52269.html</wfw:comment><comments>http://www.blogjava.net/envoydada/archive/2006/06/12/52269.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/envoydada/comments/commentRss/52269.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/envoydada/services/trackbacks/52269.html</trackback:ping><description><![CDATA[Spring<span style="FONT-FAMILY: 宋体"></span><span style="FONT-FAMILY: 宋体">数据访问的根异常是</span><span lang="EN-US" style="FONT-FAMILY: NewBaskervilleITCbyBT-Roman">DataAccessException</span><span style="FONT-FAMILY: 宋体">，所有的</span><span lang="EN-US" style="FONT-FAMILY: NewBaskervilleITCbyBT-Roman">Spring</span><span style="FONT-FAMILY: 宋体">的数据访问异常都继承</span><span lang="EN-US" style="FONT-FAMILY: NewBaskervilleITCbyBT-Roman">DataAccessException</span><span style="FONT-FAMILY: 宋体">。</span><span lang="EN-US" style="FONT-FAMILY: NewBaskervilleITCbyBT-Roman">DataAccessException</span><span style="FONT-FAMILY: 宋体">的</span><span lang="EN-US" style="FONT-FAMILY: NewBaskervilleITCbyBT-Roman">nestedRuntimeException</span><span style="FONT-FAMILY: 宋体">子类中，已经将所有的异常栈都进行了记录。</span><span lang="EN-US" style="FONT-FAMILY: NewBaskervilleITCbyBT-Roman"><?XML:NAMESPACE PREFIX = O /?><o:p></o:p></span><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left" align="left"><span lang="EN-US" style="FONT-FAMILY: NewBaskervilleITCbyBT-Roman">CleanupFailureDataAccessException</span><span style="FONT-FAMILY: 宋体">：清除失败异常</span><span lang="EN-US" style="FONT-FAMILY: NewBaskervilleITCbyBT-Roman"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left" align="left"><span lang="EN-US" style="FONT-FAMILY: NewBaskervilleITCbyBT-Roman">DataAccessResourceFailureException</span><span style="FONT-FAMILY: 宋体">：资源访问异常</span><span lang="EN-US" style="FONT-FAMILY: NewBaskervilleITCbyBT-Roman"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left" align="left"><span lang="EN-US" style="FONT-FAMILY: NewBaskervilleITCbyBT-Roman">DataIntegrityViolationException</span><span style="FONT-FAMILY: 宋体">：完整性约束异常</span><span lang="EN-US" style="FONT-FAMILY: NewBaskervilleITCbyBT-Roman"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left" align="left"><span lang="EN-US" style="FONT-FAMILY: NewBaskervilleITCbyBT-Roman">DataRetrievalFailureException</span><span style="FONT-FAMILY: 宋体">：数据获取异常</span><span lang="EN-US" style="FONT-FAMILY: NewBaskervilleITCbyBT-Roman"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left" align="left"><span lang="EN-US" style="FONT-FAMILY: NewBaskervilleITCbyBT-Roman">DeadlockLoserDataAccessException</span><span style="FONT-FAMILY: 宋体">：死锁访问异常</span><span lang="EN-US" style="FONT-FAMILY: NewBaskervilleITCbyBT-Roman"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left" align="left"><span lang="EN-US" style="FONT-FAMILY: NewBaskervilleITCbyBT-Roman">IncorrectUpdateSemanticsDataAccessException</span><span style="FONT-FAMILY: 宋体">：更新出错异常</span><span lang="EN-US" style="FONT-FAMILY: NewBaskervilleITCbyBT-Roman"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left" align="left"><span lang="EN-US" style="FONT-FAMILY: NewBaskervilleITCbyBT-Roman">InvalidDataAccessApiUsageException</span><span style="FONT-FAMILY: 宋体">：无效数据访问</span><span lang="EN-US" style="FONT-FAMILY: NewBaskervilleITCbyBT-Roman">API</span><span style="FONT-FAMILY: 宋体">使用异常</span><span lang="EN-US" style="FONT-FAMILY: NewBaskervilleITCbyBT-Roman"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left" align="left"><span lang="EN-US" style="FONT-FAMILY: NewBaskervilleITCbyBT-Roman">InvalidDataAccessResourceUsageException</span><span style="FONT-FAMILY: 宋体">：无效数据访问资源使用异常</span><span lang="EN-US" style="FONT-FAMILY: NewBaskervilleITCbyBT-Roman"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left" align="left"><span lang="EN-US" style="FONT-FAMILY: NewBaskervilleITCbyBT-Roman">OptimisticLockingFailureException</span><span style="FONT-FAMILY: 宋体">：乐观锁失败异常</span><span lang="EN-US" style="FONT-FAMILY: NewBaskervilleITCbyBT-Roman"><o:p></o:p></span></p><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-INDENT: 21pt; TEXT-ALIGN: left" align="left"><span lang="EN-US" style="FONT-FAMILY: NewBaskervilleITCbyBT-Roman">TypeMismatchDataAccessException</span><span style="FONT-FAMILY: 宋体">：类型匹配失败异常</span><span lang="EN-US" style="FONT-FAMILY: NewBaskervilleITCbyBT-Roman"><o:p></o:p></span></p>&#160;&#160;&#160;&#160;&#160;&#160; <span lang="EN-US" style="FONT-FAMILY: NewBaskervilleITCbyBT-Roman">UncategorizedDataAccessException</span><span style="FONT-FAMILY: 宋体">：其他原因异常</span> <img src ="http://www.blogjava.net/envoydada/aggbug/52269.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/envoydada/" target="_blank">Derek.Guo</a> 2006-06-12 19:20 <a href="http://www.blogjava.net/envoydada/archive/2006/06/12/52269.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring 定时器</title><link>http://www.blogjava.net/envoydada/archive/2006/06/05/50423.html</link><dc:creator>Derek.Guo</dc:creator><author>Derek.Guo</author><pubDate>Mon, 05 Jun 2006 01:51:00 GMT</pubDate><guid>http://www.blogjava.net/envoydada/archive/2006/06/05/50423.html</guid><wfw:comment>http://www.blogjava.net/envoydada/comments/50423.html</wfw:comment><comments>http://www.blogjava.net/envoydada/archive/2006/06/05/50423.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/envoydada/comments/commentRss/50423.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/envoydada/services/trackbacks/50423.html</trackback:ping><description><![CDATA[<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #000000">&lt;!--1.简单定时--&gt;<br />
&lt;</span> <span style="color: #000000">bean&nbsp;id</span> <span style="color: #000000">=</span> <span style="color: #000000">"</span> <span style="color: #000000">myTask</span> <span style="color: #000000">"</span> <span style="color: #000000">&nbsp;</span> <span style="color: #0000ff">class</span> <span style="color: #000000">=</span> <span style="color: #000000">"</span> <span style="color: #000000">usish.po.pub.MyTask</span> <span style="color: #000000">"</span> <span style="color: #000000">&gt;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!--自己定义的任务extends TimerTask --&gt;</span> <span style="color: #000000"><br />
&nbsp;&nbsp;</span> <span style="color: #000000">&lt;</span> <span style="color: #000000">property&nbsp;name</span> <span style="color: #000000">=</span> <span style="color: #000000">"</span> <span style="color: #000000">generatPo</span> <span style="color: #000000">"</span> <span style="color: #000000">&gt;</span> <span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="color: #000000">&lt;</span> <span style="color: #000000">ref&nbsp;local</span> <span style="color: #000000">=</span> <span style="color: #000000">"</span> <span style="color: #000000">generatPO</span> <span style="color: #000000">"</span> <span style="color: #000000">/&gt;</span> <span style="color: #000000"><br />
&nbsp;&nbsp;</span> <span style="color: #000000">&lt;/</span> <span style="color: #000000">property</span> <span style="color: #000000">&gt;</span> <span style="color: #000000"><br />
&nbsp;&nbsp;</span> <span style="color: #000000">&lt;</span> <span style="color: #000000">property&nbsp;name</span> <span style="color: #000000">=</span> <span style="color: #000000">"</span> <span style="color: #000000">importData</span> <span style="color: #000000">"</span> <span style="color: #000000">&gt;</span> <span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="color: #000000">&lt;</span> <span style="color: #000000">ref&nbsp;local</span> <span style="color: #000000">=</span> <span style="color: #000000">"</span> <span style="color: #000000">importData</span> <span style="color: #000000">"</span> <span style="color: #000000">/&gt;</span> <span style="color: #000000"><br />
&nbsp;&nbsp;</span> <span style="color: #000000">&lt;/</span> <span style="color: #000000">property</span> <span style="color: #000000">&gt;</span> <span style="color: #000000"><br />
</span><span style="color: #000000">&lt;/</span> <span style="color: #000000">bean</span> <span style="color: #000000">&gt;</span> <span style="color: #000000"><br />
<br />
</span><span style="color: #000000">&lt;</span> <span style="color: #000000">bean&nbsp;id</span> <span style="color: #000000">=</span> <span style="color: #000000">"</span> <span style="color: #000000">timer</span> <span style="color: #000000">"</span> <span style="color: #000000">&nbsp;</span> <span style="color: #0000ff">class</span> <span style="color: #000000">=</span> <span style="color: #000000">"</span> <span style="color: #000000">org.springframework.scheduling.timer.TimerFactoryBean</span> <span style="color: #000000">"</span> <span style="color: #000000">&gt;</span> <span style="color: #000000"><br />
&nbsp;&nbsp;</span> <span style="color: #000000">&lt;</span> <span style="color: #000000">property&nbsp;name</span> <span style="color: #000000">=</span> <span style="color: #000000">"</span> <span style="color: #000000">scheduledTimerTasks</span> <span style="color: #000000">"</span> <span style="color: #000000">&gt;</span> <span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="color: #000000">&lt;</span> <span style="color: #000000">list</span> <span style="color: #000000">&gt;</span> <span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="color: #000000">&lt;</span> <span style="color: #000000">ref&nbsp;local</span> <span style="color: #000000">=</span> <span style="color: #000000">"</span> <span style="color: #000000">scheduledTimerTask_1</span> <span style="color: #000000">"</span> <span style="color: #000000">/&gt; &lt;!--定时器的任务链--&gt;</span> <span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="color: #000000">&lt;/</span> <span style="color: #000000">list</span> <span style="color: #000000">&gt;</span> <span style="color: #000000"><br />
&nbsp;&nbsp;</span> <span style="color: #000000">&lt;/</span> <span style="color: #000000">property</span> <span style="color: #000000">&gt;</span> <span style="color: #000000"><br />
</span><span style="color: #000000">&lt;/</span> <span style="color: #000000">bean</span> <span style="color: #000000">&gt;</span> <span style="color: #000000"><br />
<br />
</span><span style="color: #000000">&lt;</span> <span style="color: #000000">bean&nbsp;id</span> <span style="color: #000000">=</span> <span style="color: #000000">"</span> <span style="color: #000000">scheduledTimerTask_1</span> <span style="color: #000000">"</span> <span style="color: #000000">&nbsp;</span> <span style="color: #0000ff">class</span> <span style="color: #000000">=</span> <span style="color: #000000">"</span> <span style="color: #000000">org.springframework.scheduling.timer.ScheduledTimerTask</span> <span style="color: #000000">"</span> <span style="color: #000000">&gt; &lt;!--任务链启动任务--&gt;</span> <span style="color: #000000"><br />
&nbsp;&nbsp;</span> <span style="color: #000000">&lt;</span> <span style="color: #000000">property&nbsp;name</span> <span style="color: #000000">=</span> <span style="color: #000000">"</span> <span style="color: #000000">timerTask</span> <span style="color: #000000">"</span> <span style="color: #000000">&gt;</span> <span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="color: #000000">&lt;</span> <span style="color: #000000">ref&nbsp;local</span> <span style="color: #000000">=</span> <span style="color: #000000">"</span> <span style="color: #000000">myTask</span> <span style="color: #000000">"</span> <span style="color: #000000">/&gt;</span> <span style="color: #000000"><br />
&nbsp;&nbsp;</span> <span style="color: #000000">&lt;/</span> <span style="color: #000000">property</span> <span style="color: #000000">&gt;</span> <span style="color: #000000"><br />
&nbsp;&nbsp;</span> <span style="color: #000000">&lt;</span> <span style="color: #000000">property&nbsp;name</span> <span style="color: #000000">=</span> <span style="color: #000000">"</span> <span style="color: #000000">delay</span> <span style="color: #000000">"</span> <span style="color: #000000">&gt;</span> <span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="color: #000000">&lt;</span> <span style="color: #000000">value</span> <span style="color: #000000">&gt;</span> <span style="color: #000000">1000</span> <span style="color: #000000">&lt;/</span> <span style="color: #000000">value</span> <span style="color: #000000">&gt;</span> <span style="color: #000000"><br />
&nbsp;&nbsp;</span> <span style="color: #000000">&lt;/</span> <span style="color: #000000">property</span> <span style="color: #000000">&gt;</span> <span style="color: #000000"><br />
&nbsp;&nbsp;</span> <span style="color: #000000">&lt;</span> <span style="color: #000000">property&nbsp;name</span> <span style="color: #000000">=</span> <span style="color: #000000">"</span> <span style="color: #000000">period</span> <span style="color: #000000">"</span> <span style="color: #000000">&gt;</span> <span style="color: #000000"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span> <span style="color: #000000">&lt;</span> <span style="color: #000000">value</span> <span style="color: #000000">&gt;</span> <span style="color: #000000">50000</span> <span style="color: #000000">&lt;/</span> <span style="color: #000000">value</span> <span style="color: #000000">&gt;</span> <span style="color: #000000"><br />
&nbsp;&nbsp;</span> <span style="color: #000000">&lt;/</span> <span style="color: #000000">property</span> <span style="color: #000000">&gt;</span> <span style="color: #000000"><br />
</span><span style="color: #000000">&lt;/</span> <span style="color: #000000">bean</span> <span style="color: #000000">&gt;</span> <br />
<br />
&lt;!--2.使用Quartz定时--&gt;<br />
&lt;!-- scheduler --&gt;<br />
&nbsp;&lt;bean id="cacheClearStar" class="com.ztgame.memcached.CacheClearStar" /&gt;<br />
&nbsp;&lt;bean id="cacheClearStarJob"<br />
&nbsp;&nbsp;&nbsp;&nbsp; class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="targetObject"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ref local="cacheClearStar" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="targetMethod"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;clear&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&lt;/bean&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;bean id="cacheClearStarTrigger"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="org.springframework.scheduling.quartz.CronTriggerBean"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="jobDetail"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ref local="cacheClearStarJob" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="cronExpression"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;0 0 0 * * ?&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp; &lt;/bean&gt;<br />
&nbsp; &lt;bean id="scheduler"<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class="org.springframework.scheduling.quartz.SchedulerFactoryBean" lazy-init="false"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property name="triggers"&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;ref local="cacheClearStarTrigger" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp; &lt;/bean&gt;<br />
&nbsp;&lt;!-- scheduler end --&gt;</div>
<p><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">一个cron表达式有至少6个（也可能7个）有空格分隔的时间元素。<br />
按顺序依次为 <br />
1.秒（0~59） <br />
2.分钟（0~59） <br />
</span></span></span><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">3.小时（0~23） </span></span></span><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt"><br />
4.天（月）（0~31，但是你需要考虑你月的天数） <br />
</span></span></span><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">5.月（0~11） <br />
</span></span></span><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">6.天（星期）（1~7 1=SUN 或 SUN，MON，TUE，WED，THU，FRI，SAT） <br />
</span></span></span><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">7.年份（1970－2099）</span></span></span></p>
<p><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">其中每个元素可以是一个值(如6),一个连续区间(9-12),一个间隔时间(8-18/4)(/表示每隔4小时),一个列表(1,3,5),通配符。<br />
由于"月份中的日期"和"星期中的日期"这两个元素互斥的,必须要对其中一个设置?. </span></span></span></p>
<p><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">0 0 10,14,16 * * ? 每天上午10点，下午2点，4点<br />
0 0/30 9-17 * * ??? 朝九晚五工作时间内每半小时<br />
0 0 12 ? * WED 表示每个星期三中午12点 </span></span></span></p>
<p><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">有些子表达式能包含一些范围或列表 <br />
</span></span></span><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">例如：子表达式（天（星期））可以为 &#8220;MON-FRI&#8221;，&#8220;MON，WED，FRI&#8221;，&#8220;MON-WED,SAT&#8221; </span></span></span></p>
<p><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">&#8220;*&#8221;字符代表所有可能的值 <br />
</span></span></span><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">因此，&#8220;*&#8221;在子表达式（月）里表示每个月的含义，&#8220;*&#8221;在子表达式（天（星期））表示星期的每一天 </span></span></span></p>
<p><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">&#8220;/&#8221;字符用来指定数值的增量 <br />
</span></span></span><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">例如：在子表达式（分钟）里的&#8220;0/15&#8221;表示从第0分钟开始，每15分钟 ;<br />
</span></span></span><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">在子表达式（分钟）里的&#8220;3/20&#8221;表示从第3分钟开始，每20分钟（它和&#8220;3，23，43&#8221;）的含义一样 <br />
</span></span></span><br />
<span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">&#8220;？&#8221;字符仅被用于天（月）和天（星期）两个子表达式，表示不指定值 <br />
</span></span></span><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">当2个子表达式其中之一被指定了值以后，为了避免冲突，需要将另一个子表达式的值设为&#8220;？&#8221; </span></span></span></p>
<p><span style="font-size: 12pt"><span style="font-size: 12pt"></span></span></p>
<p><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">&#8220;L&#8221; 字符仅被用于天（月）和天（星期）两个子表达式，它是单词&#8220;last&#8221;的缩写 </span></span></span></p>
<p><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">但是它在两个子表达式里的含义是不同的。 </span></span></span></p>
<p><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">在天（月）子表达式中，&#8220;L&#8221;表示一个月的最后一天 ,<br />
</span></span></span><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">在天（星期）自表达式中，&#8220;L&#8221;表示一个星期的最后一天，也就是SAT </span></span></span></p>
<p><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">如果在&#8220;L&#8221;前有具体的内容，它就具有其他的含义了 </span></span></span></p>
<p><span style="font-size: 12pt"><span style="font-size: 12pt"><span style="font-size: 10pt">例如：&#8220;6L&#8221;表示这个月的倒数第６天，&#8220;ＦＲＩＬ&#8221;表示这个月的最后一个星期五 </span></span></span></p>
<p><span style="font-size: 12pt"><span style="font-size: 10pt"><span style="font-size: 12pt">注意：在使用&#8220;L&#8221;参数时，不要指定列表或范围，因为这会导致问题</span> <br />
</span></span></p>
 <img src ="http://www.blogjava.net/envoydada/aggbug/50423.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/envoydada/" target="_blank">Derek.Guo</a> 2006-06-05 09:51 <a href="http://www.blogjava.net/envoydada/archive/2006/06/05/50423.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DES加密</title><link>http://www.blogjava.net/envoydada/archive/2006/05/19/46964.html</link><dc:creator>Derek.Guo</dc:creator><author>Derek.Guo</author><pubDate>Fri, 19 May 2006 01:23:00 GMT</pubDate><guid>http://www.blogjava.net/envoydada/archive/2006/05/19/46964.html</guid><wfw:comment>http://www.blogjava.net/envoydada/comments/46964.html</wfw:comment><comments>http://www.blogjava.net/envoydada/archive/2006/05/19/46964.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/envoydada/comments/commentRss/46964.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/envoydada/services/trackbacks/46964.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 资源读取类package&#160;com.crypto.encrypt;import&#160;java.io.BufferedInputStream;import&#160;java.io.File;import&#160;java.io.BufferedOutputStream;import&#160;java.io.IOException;import&#160;java.io.Fil...&nbsp;&nbsp;<a href='http://www.blogjava.net/envoydada/archive/2006/05/19/46964.html'>阅读全文</a><img src ="http://www.blogjava.net/envoydada/aggbug/46964.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/envoydada/" target="_blank">Derek.Guo</a> 2006-05-19 09:23 <a href="http://www.blogjava.net/envoydada/archive/2006/05/19/46964.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SHA-1&amp;MD5</title><link>http://www.blogjava.net/envoydada/archive/2006/05/17/46632.html</link><dc:creator>Derek.Guo</dc:creator><author>Derek.Guo</author><pubDate>Wed, 17 May 2006 07:42:00 GMT</pubDate><guid>http://www.blogjava.net/envoydada/archive/2006/05/17/46632.html</guid><wfw:comment>http://www.blogjava.net/envoydada/comments/46632.html</wfw:comment><comments>http://www.blogjava.net/envoydada/archive/2006/05/17/46632.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/envoydada/comments/commentRss/46632.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/envoydada/services/trackbacks/46632.html</trackback:ping><description><![CDATA[		<p>&#160;</p>
		<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee">
				<span style="COLOR: #0000ff">import</span>
				<span style="COLOR: #000000">&#160;java.security.</span>
				<span style="COLOR: #000000">*</span>
				<span style="COLOR: #000000">;<br /><br /></span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000">&#160;</span>
				<span style="COLOR: #0000ff">class</span>
				<span style="COLOR: #000000">&#160;Security&#160;{<br />&#160;&#160;&#160;&#160;<br />&#160;&#160;&#160;&#160;</span>
				<span style="COLOR: #008000">/**</span>
				<span style="COLOR: #008000">
						<br />&#160;&#160;&#160;&#160;&#160;*&#160;字符串加密方法。传入一个字符串，返回经过SHA-1加密后的一个字符串<br />&#160;&#160;&#160;&#160;&#160;*&#160;</span>
				<span style="COLOR: #808080">@param</span>
				<span style="COLOR: #008000">&#160;strInput<br />&#160;&#160;&#160;&#160;&#160;*&#160;</span>
				<span style="COLOR: #808080">@return</span>
				<span style="COLOR: #008000">
						<br />&#160;&#160;&#160;&#160;&#160;</span>
				<span style="COLOR: #008000">*/</span>
				<span style="COLOR: #000000">
						<br />&#160;&#160;&#160;&#160;</span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000">&#160;</span>
				<span style="COLOR: #0000ff">static</span>
				<span style="COLOR: #000000">&#160;String&#160;encryptSHA(String&#160;strInput)&#160;{<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;String&#160;strOutput&#160;</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">&#160;</span>
				<span style="COLOR: #0000ff">new</span>
				<span style="COLOR: #000000">&#160;String(</span>
				<span style="COLOR: #000000">""</span>
				<span style="COLOR: #000000">);<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span>
				<span style="COLOR: #0000ff">try</span>
				<span style="COLOR: #000000">&#160;{<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;MessageDigest&#160;md&#160;</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">&#160;MessageDigest.getInstance(</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">SHA-1</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">);<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;md.update(strInput.getBytes());<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span>
				<span style="COLOR: #0000ff">byte</span>
				<span style="COLOR: #000000">&#160;b[]&#160;</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">&#160;md.digest();<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span>
				<span style="COLOR: #0000ff">for</span>
				<span style="COLOR: #000000">(</span>
				<span style="COLOR: #0000ff">int</span>
				<span style="COLOR: #000000">&#160;i</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">0</span>
				<span style="COLOR: #000000">;i</span>
				<span style="COLOR: #000000">&lt;</span>
				<span style="COLOR: #000000">b.length;i</span>
				<span style="COLOR: #000000">++</span>
				<span style="COLOR: #000000">)&#160;{<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span>
				<span style="COLOR: #0000ff">char</span>
				<span style="COLOR: #000000">[]&#160;digit&#160;</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">&#160;{&#160;</span>
				<span style="COLOR: #000000">'</span>
				<span style="COLOR: #000000">0</span>
				<span style="COLOR: #000000">'</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #000000">'</span>
				<span style="COLOR: #000000">1</span>
				<span style="COLOR: #000000">'</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #000000">'</span>
				<span style="COLOR: #000000">2</span>
				<span style="COLOR: #000000">'</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #000000">'</span>
				<span style="COLOR: #000000">3</span>
				<span style="COLOR: #000000">'</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #000000">'</span>
				<span style="COLOR: #000000">4</span>
				<span style="COLOR: #000000">'</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #000000">'</span>
				<span style="COLOR: #000000">5</span>
				<span style="COLOR: #000000">'</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #000000">'</span>
				<span style="COLOR: #000000">6</span>
				<span style="COLOR: #000000">'</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #000000">'</span>
				<span style="COLOR: #000000">7</span>
				<span style="COLOR: #000000">'</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #000000">'</span>
				<span style="COLOR: #000000">8</span>
				<span style="COLOR: #000000">'</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #000000">'</span>
				<span style="COLOR: #000000">9</span>
				<span style="COLOR: #000000">'</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #000000">'</span>
				<span style="COLOR: #000000">A</span>
				<span style="COLOR: #000000">'</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #000000">'</span>
				<span style="COLOR: #000000">B</span>
				<span style="COLOR: #000000">'</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #000000">'</span>
				<span style="COLOR: #000000">C</span>
				<span style="COLOR: #000000">'</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #000000">'</span>
				<span style="COLOR: #000000">D</span>
				<span style="COLOR: #000000">'</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #000000">'</span>
				<span style="COLOR: #000000">E</span>
				<span style="COLOR: #000000">'</span>
				<span style="COLOR: #000000">,</span>
				<span style="COLOR: #000000">'</span>
				<span style="COLOR: #000000">F</span>
				<span style="COLOR: #000000">'</span>
				<span style="COLOR: #000000">&#160;};<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span>
				<span style="COLOR: #0000ff">char</span>
				<span style="COLOR: #000000">&#160;[]&#160;ob&#160;</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">&#160;</span>
				<span style="COLOR: #0000ff">new</span>
				<span style="COLOR: #000000">&#160;</span>
				<span style="COLOR: #0000ff">char</span>
				<span style="COLOR: #000000">[</span>
				<span style="COLOR: #000000">2</span>
				<span style="COLOR: #000000">];<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;ob[</span>
				<span style="COLOR: #000000">0</span>
				<span style="COLOR: #000000">]&#160;</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">&#160;digit[(b[i]&#160;</span>
				<span style="COLOR: #000000">&gt;&gt;&gt;</span>
				<span style="COLOR: #000000">&#160;</span>
				<span style="COLOR: #000000">4</span>
				<span style="COLOR: #000000">)&#160;</span>
				<span style="COLOR: #000000">&amp;</span>
				<span style="COLOR: #000000">&#160;</span>
				<span style="COLOR: #000000">0X0F</span>
				<span style="COLOR: #000000">];<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;ob[</span>
				<span style="COLOR: #000000">1</span>
				<span style="COLOR: #000000">]&#160;</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">&#160;digit[b[i]&#160;</span>
				<span style="COLOR: #000000">&amp;</span>
				<span style="COLOR: #000000">&#160;</span>
				<span style="COLOR: #000000">0X0F</span>
				<span style="COLOR: #000000">];<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;strOutput&#160;</span>
				<span style="COLOR: #000000">+=</span>
				<span style="COLOR: #000000">&#160;</span>
				<span style="COLOR: #0000ff">new</span>
				<span style="COLOR: #000000">&#160;String(ob);<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span>
				<span style="COLOR: #0000ff">catch</span>
				<span style="COLOR: #000000">(NoSuchAlgorithmException&#160;nsae)&#160;{<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ex.printStackTrace();</span>
				<span style="COLOR: #000000">&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;</span>
				<span style="COLOR: #0000ff">return</span>
				<span style="COLOR: #000000">&#160;strOutput;<br />&#160;&#160;&#160;&#160;}<br />&#160;&#160;&#160;&#160;<br />&#160;&#160;&#160;&#160;</span>
				<span style="COLOR: #008000">/**</span>
				<span style="COLOR: #008000">
						<br />&#160;&#160;&#160;&#160;&#160;*&#160;字符串加密方法。传入一个字符串，返回经过MD5加密后的一个字符串<br />&#160;&#160;&#160;&#160;&#160;*&#160;</span>
				<span style="COLOR: #808080">@param</span>
				<span style="COLOR: #008000">&#160;strInput<br />&#160;&#160;&#160;&#160;&#160;*&#160;</span>
				<span style="COLOR: #808080">@return</span>
				<span style="COLOR: #008000">
						<br />&#160;&#160;&#160;&#160;&#160;</span>
				<span style="COLOR: #008000">*/</span>
				<span style="COLOR: #000000">
						<br />&#160;&#160;&#160;&#160;</span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000">&#160;</span>
				<span style="COLOR: #0000ff">static</span>
				<span style="COLOR: #000000">&#160;String&#160;encryptMD5(String&#160;strInput)&#160;{<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; StringBuffer buf=null;&#160;&#160;&#160;&#160;&#160;&#160;&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; try {<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; MessageDigest md = MessageDigest.getInstance("MD5");<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; md.update(strInput.getBytes());<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; byte b[] = md.digest();&#160;&#160;&#160; <br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; buf = new StringBuffer(b.length * 2);<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; for(int i=0;i&lt;b.length;i++) {<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if (((int)b[i] &amp; 0xff) &lt; 0x10) { // &amp; 0xff转换无符号整型<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; buf.append("0");<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; // buf.append(Long.toString((int) b[i] &amp; 0xff, 16));//转换16进制,下方法同<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; buf.append(Long.toHexString((int)b[i] &amp; 0xff));<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }catch(NoSuchAlgorithmException ex) {<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ex.printStackTrace();<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }&#160;&#160;&#160;<br />&#160;&#160;&#160;&#160;&#160;&#160; return buf.toString();<br /></span>
				<span style="COLOR: #000000">&#160;&#160;&#160;&#160;}<br />&#160;&#160;&#160;&#160;<br />&#160;&#160;&#160;&#160;</span>
				<span style="COLOR: #0000ff">public</span>
				<span style="COLOR: #000000">&#160;</span>
				<span style="COLOR: #0000ff">static</span>
				<span style="COLOR: #000000">&#160;</span>
				<span style="COLOR: #0000ff">void</span>
				<span style="COLOR: #000000">&#160;main(String&#160;args[])&#160;{<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;String&#160;test&#160;</span>
				<span style="COLOR: #000000">=</span>
				<span style="COLOR: #000000">&#160;</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">Derek.G</span>
				<span style="COLOR: #000000">"</span>
				<span style="COLOR: #000000">;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;System.out.print(encryptSHA(test));<br />&#160;&#160;&#160;&#160;}<br />}</span>
		</div>
 <img src ="http://www.blogjava.net/envoydada/aggbug/46632.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/envoydada/" target="_blank">Derek.Guo</a> 2006-05-17 15:42 <a href="http://www.blogjava.net/envoydada/archive/2006/05/17/46632.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java Reflection (JAVA反射)  </title><link>http://www.blogjava.net/envoydada/archive/2006/05/16/46353.html</link><dc:creator>Derek.Guo</dc:creator><author>Derek.Guo</author><pubDate>Tue, 16 May 2006 03:00:00 GMT</pubDate><guid>http://www.blogjava.net/envoydada/archive/2006/05/16/46353.html</guid><wfw:comment>http://www.blogjava.net/envoydada/comments/46353.html</wfw:comment><comments>http://www.blogjava.net/envoydada/archive/2006/05/16/46353.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/envoydada/comments/commentRss/46353.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/envoydada/services/trackbacks/46353.html</trackback:ping><description><![CDATA[Java Reflection (JAVA反射)&#160;&#160;&#160;&#160;----转载<br /><br />&#160;&#160;&#160; Reflection 是 Java 程序开发语言的特征之一，它允许运行中的 Java 程序对自身进行检查，或者说&#8220;自审&#8221;，并能直接操作程序的内部属性。例如，使用它能获得 Java 类中各成员的名称并显示出来。Java 的这一能力在实际应用中也许用得不是很多，但是在其它的程序设计语言中根本就不存在这一特性。例如，Pascal、C 或者 C++ 中就没有办法在程序中获得函数定义相关的信息。<br />JavaBean 是 reflection 的实际应用之一，它能让一些工具可视化的操作软件组件。这些工具通过 reflection 动态的载入并取得 Java 组件(类) 的属性。<br /><br />1. 一个简单的例子<br />考虑下面这个简单的例子，让我们看看 reflection 是如何工作的。<br />import java.lang.reflect.*;<br />public class DumpMethods {<br />&#160;&#160;&#160; public static void main(String args[]) {<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; try {<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Class c = Class.forName(args[0]);<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Method m[] = c.getDeclaredMethods();<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; for (int i = 0; i &lt; m.length; i++)<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.out.println(m[i].toString());<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; } catch (Throwable e) {<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.err.println(e);<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br />&#160;&#160;&#160; }<br />}<br /><p><br />按如下语句执行：<br />java DumpMethods java.util.Stack<br /><br />它的结果输出为：<br />public java.lang.Object java.util.Stack.push(java.lang.Object)<br />public synchronized java.lang.Object java.util.Stack.pop()<br />public synchronized java.lang.Object java.util.Stack.peek()<br />public boolean java.util.Stack.empty()<br />public synchronized int java.util.Stack.search(java.lang.Object)</p><p>这样就列出了java.util.Stack 类的各方法名以及它们的限制符和返回类型。</p><p>这个程序使用 Class.forName 载入指定的类，然后调用 getDeclaredMethods 来获取这个类中定义了的方法列表。java.lang.reflect.Methods 是用来描述某个类中单个方法的一个类。</p><br /><p>2.开始使用 Reflection<br />用于 reflection 的类，如 Method，可以在 java.lang.relfect 包中找到。使用这些类的时候必须要遵循三个步骤：第一步是获得你想操作的类的 java.lang.Class 对象。在运行中的 Java 程序中，用 java.lang.Class 类来描述类和接口等。</p><p>下面就是获得一个 Class 对象的方法之一：<br />Class c = Class.forName("java.lang.String");<br />这条语句得到一个 String 类的类对象。还有另一种方法，如下面的语句：<br />Class c = int.class;&#160;&#160; 或者&#160;&#160; Class c = Integer.TYPE;</p><p>它们可获得基本类型的类信息。其中后一种方法中访问的是基本类型的封装类 (如 Integer) 中预先定义好的 TYPE 字段。<br /><br />第二步是调用诸如 getDeclaredMethods 的方法，以取得该类中定义的所有方法的列表。<br /><br />一旦取得这个信息，就可以进行第三步了——使用 reflection API 来操作这些信息，如下面这段代码：<br />Class c = Class.forName("java.lang.String");<br />Method m[] = c.getDeclaredMethods();<br />System.out.println(m[0].toString());<br />它将以文本方式打印出 String 中定义的第一个方法的原型。<br />在下面的例子中，这三个步骤将为使用 reflection 处理特殊应用程序提供例证。</p><br /><p><br />模拟 instanceof 操作符<br />得到类信息之后，通常下一个步骤就是解决关于 Class 对象的一些基本的问题。例如，Class.isInstance 方法可以用于模拟 instanceof 操作符：<br />class A {<br />}<br /><br />public class instance1 {<br />&#160;&#160;&#160; public static void main(String args[]) {<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; try {<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Class cls = Class.forName("A");<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; boolean b1 = cls.isInstance(new Integer(37));<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.out.println(b1);<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; boolean b2 = cls.isInstance(new A());<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.out.println(b2);<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; } catch (Throwable e) {<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.err.println(e);<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br />&#160;&#160;&#160; }<br />}<br /><br />在这个例子中创建了一个 A 类的 Class 对象，然后检查一些对象是否是 A 的实例。Integer(37) 不是，但 new A() 是。</p><p><br />3.找出类的方法<br />找出一个类中定义了些什么方法，这是一个非常有价值也非常基础的 reflection 用法。下面的代码就实现了这一用法：<br />import java.lang.reflect.*;<br />public class method1 {<br />&#160;&#160;&#160; private int f1(Object p, int x) throws NullPointerException {<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; if (p == null)<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; throw new NullPointerException();<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; return x;<br />&#160;&#160;&#160; }<br />&#160;&#160;&#160; public static void main(String args[]) {<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; try {<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Class cls = Class.forName("method1");<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Method methlist[] = cls.getDeclaredMethods();<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; for (int i = 0; i &lt; methlist.length; i++) {<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Method m = methlist[i];<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.out.println("name = " + m.getName());<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.out.println("decl class = " + m.getDeclaringClass());<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Class pvec[] = m.getParameterTypes();<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; for (int j = 0; j &lt; pvec.length; j++)<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.out.println("param #" + j + " " + pvec[j]);<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Class evec[] = m.getExceptionTypes();<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; for (int j = 0; j &lt; evec.length; j++)<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.out.println("exc #" + j + " " + evec[j]);<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.out.println("return type = " + m.getReturnType());<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.out.println("-----");<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; } catch (Throwable e) {<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.err.println(e);<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br />&#160;&#160;&#160; }<br />}</p><p><br />这个程序首先取得 method1 类的描述，然后调用 getDeclaredMethods 来获取一系列的 Method 对象，它们分别描述了定义在类中的每一个方法，包括 public 方法、protected 方法、package 方法和 private 方法等。如果你在程序中使用 getMethods 来代替 getDeclaredMethods，你还能获得继承来的各个方法的信息。<br /><br />取得了 Method 对象列表之后，要显示这些方法的参数类型、异常类型和返回值类型等就不难了。这些类型是基本类型还是类类型，都可以由描述类的对象按顺序给出。<br /><br />输出的结果如下：<br />name = f1<br />decl class = class method1<br />param #0 class java.lang.Object<br />param #1 int<br />exc #0 class java.lang.NullPointerException<br />return type = int<br />-----<br />name = main<br />decl class = class method1<br />param #0 class [Ljava.lang.String;<br />return type = void<br />-----</p><br /><p>4.获取构造器信息<br />获取类构造器的用法与上述获取方法的用法类似，如：<br />import java.lang.reflect.*;<br />public class constructor1 {<br />&#160;&#160;&#160; public constructor1() {<br />&#160;&#160;&#160; }<br /><br />&#160;&#160;&#160; protected constructor1(int i, double d) {<br />&#160;&#160;&#160; }<br /><br />&#160;&#160;&#160; public static void main(String args[]) {<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; try {<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Class cls = Class.forName("constructor1");<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Constructor ctorlist[] = cls.getDeclaredConstructors();<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; for (int i = 0; i &lt; ctorlist.length; i++) {<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Constructor ct = ctorlist[i];<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.out.println("name = " + ct.getName());<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.out.println("decl class = " + ct.getDeclaringClass());<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Class pvec[] = ct.getParameterTypes();<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; for (int j = 0; j &lt; pvec.length; j++)<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.out.println("param #" + j + " " + pvec[j]);<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Class evec[] = ct.getExceptionTypes();<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; for (int j = 0; j &lt; evec.length; j++)<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.out.println("exc #" + j + " " + evec[j]);<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.out.println("-----");<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; } catch (Throwable e) {<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.err.println(e);<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br />&#160;&#160;&#160; }<br />}</p><p><br />这个例子中没能获得返回类型的相关信息，那是因为构造器没有返回类型。<br />这个程序运行的结果是：<br />name = constructor1<br />decl class = class constructor1<br />-----<br />name = constructor1<br />decl class = class constructor1<br />param #0 int<br />param #1 double<br />-----<br /><br />5.获取类的字段(域)<br />找出一个类中定义了哪些数据字段也是可能的，下面的代码就在干这个事情：<br />import java.lang.reflect.*;<br /><br />public class field1 {<br />&#160;&#160;&#160; private double d;<br />&#160;&#160;&#160; public static final int i = 37;<br />&#160;&#160;&#160; String s = "testing";<br /><br />&#160;&#160;&#160;&#160;&#160;public static void main(String args[]) {<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; try {<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Class cls = Class.forName("field1");<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Field fieldlist[] = cls.getDeclaredFields();<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; for (int i = 0; i &lt; fieldlist.length; i++) {<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Field fld = fieldlist[i];<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.out.println("name = " + fld.getName());<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.out.println("decl class = " + fld.getDeclaringClass());<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.out.println("type = " + fld.getType());<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; int mod = fld.getModifiers();<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.out.println("modifiers = " + Modifier.toString(mod));<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.out.println("-----");<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; } catch (Throwable e) {<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.err.println(e);<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br />&#160;&#160;&#160; }<br />}</p><p><br />这个例子和前面那个例子非常相似。例中使用了一个新东西 Modifier，它也是一个 reflection 类，用来描述字段成员的修饰语，如&#8220;private int&#8221;。这些修饰语自身由整数描述，而且使用 Modifier.toString 来返回以&#8220;官方&#8221;顺序排列的字符串描述 (如&#8220;static&#8221;在&#8220;final&#8221;之前)。这个程序的输出是：<br />name = d<br />decl class = class field1<br />type = double<br />modifiers = private<br />-----<br />name = i<br />decl class = class field1<br />type = int<br />modifiers = public static final<br />-----<br />name = s<br />decl class = class field1<br />type = class java.lang.String<br />modifiers =<br />-----<br /><br />和获取方法的情况一下，获取字段的时候也可以只取得在当前类中申明了的字段信息 (getDeclaredFields)，或者也可以取得父类中定义的字段 (getFields) 。</p><br /><p>6.根据方法的名称来执行方法<br />文本到这里，所举的例子无一例外都与如何获取类的信息有关。我们也可以用 reflection 来做一些其它的事情，比如执行一个指定了名称的方法。下面的示例演示了这一操作：<br />import java.lang.reflect.*;<br />public class method2 {<br />&#160;&#160;&#160; public int add(int a, int b) {<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; return a + b;<br />&#160;&#160;&#160; }<br />&#160;&#160;&#160; public static void main(String args[]) {<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; try {<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Class cls = Class.forName("method2");<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Class partypes[] = new Class[2];<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; partypes[0] = Integer.TYPE;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; partypes[1] = Integer.TYPE;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Method meth = cls.getMethod("add", partypes);<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; method2 methobj = new method2();<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Object arglist[] = new Object[2];<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; arglist[0] = new Integer(37);<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; arglist[1] = new Integer(47);<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Object retobj = meth.invoke(methobj, arglist);<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Integer retval = (Integer) retobj;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.out.println(retval.intValue());<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; } catch (Throwable e) {<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.err.println(e);<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br />&#160;&#160;&#160; }<br />}</p><p><br />假如一个程序在执行的某处的时候才知道需要执行某个方法，这个方法的名称是在程序的运行过程中指定的 (例如，JavaBean 开发环境中就会做这样的事)，那么上面的程序演示了如何做到。</p><p><br />上例中，getMethod 用于查找一个具有两个整型参数且名为 add 的方法。找到该方法并创建了相应的 Method 对象之后，在正确的对象实例中执行它。执行该方法的时候，需要提供一个参数列表，这在上例中是分别包装了整数 37 和 47 的两个 Integer 对象。执行方法的返回的同样是一个 Integer 对象，它封装了返回值 84。</p><p><br />7.创建新的对象<br />对于构造器，则不能像执行方法那样进行，因为执行一个构造器就意味着创建了一个新的对象 (准确的说，创建一个对象的过程包括分配内存和构造对象)。所以，与上例最相似的例子如下：<br />import java.lang.reflect.*;<br />public class constructor2 {<br />&#160;&#160;&#160; public constructor2() {<br />&#160;&#160;&#160; }<br /><br />&#160;&#160;&#160; public constructor2(int a, int b) {<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.out.println("a = " + a + " b = " + b);<br />&#160;&#160;&#160; }<br /><br />&#160;&#160;&#160; public static void main(String args[]) {<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; try {<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Class cls = Class.forName("constructor2");<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Class partypes[] = new Class[2];<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; partypes[0] = Integer.TYPE;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; partypes[1] = Integer.TYPE;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Constructor ct = cls.getConstructor(partypes);<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Object arglist[] = new Object[2];<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; arglist[0] = new Integer(37);<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; arglist[1] = new Integer(47);<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Object retobj = ct.newInstance(arglist);<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; } catch (Throwable e) {<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.err.println(e);<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br />&#160;&#160;&#160; }<br />}<br /><br />根据指定的参数类型找到相应的构造函数并执行它，以创建一个新的对象实例。使用这种方法可以在程序运行时动态地创建对象，而不是在编译的时候创建对象，这一点非常有价值。</p><p><br />8.改变字段(域)的值<br />reflection 的还有一个用处就是改变对象数据字段的值。reflection 可以从正在运行的程序中根据名称找到对象的字段并改变它，下面的例子可以说明这一点：<br />import java.lang.reflect.*;<br />public class field2 {<br />&#160;&#160;&#160; public double d;<br />&#160;&#160;&#160; public static void main(String args[]) {<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; try {<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Class cls = Class.forName("field2");<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Field fld = cls.getField("d");<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; field2 f2obj = new field2();<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.out.println("d = " + f2obj.d);<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; fld.setDouble(f2obj, 12.34);<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.out.println("d = " + f2obj.d);<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; } catch (Throwable e) {<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.err.println(e);<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br />&#160;&#160;&#160; }<br />}</p><p><br />这个例子中，字段 d 的值被变为了 12.34。<br />9.使用数组<br />本文介绍的 reflection 的最后一种用法是创建的操作数组。数组在 Java 语言中是一种特殊的类类型，一个数组的引用可以赋给 Object 引用。观察下面的例子看看数组是怎么工作的：<br />import java.lang.reflect.*;<br />public class array1 {<br />&#160;&#160;&#160; public static void main(String args[]) {<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; try {<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Class cls = Class.forName("java.lang.String");<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Object arr = Array.newInstance(cls, 10);<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Array.set(arr, 5, "this is a test");<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; String s = (String) Array.get(arr, 5);<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.out.println(s);<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; } catch (Throwable e) {<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.err.println(e);<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br />&#160;&#160;&#160; }<br />}</p><p><br />例中创建了 10 个单位长度的 String 数组，为第 5 个位置的字符串赋了值，最后将这个字符串从数组中取得并打印了出来。<br /><br />下面这段代码提供了一个更复杂的例子：<br />import java.lang.reflect.*;<br />public class array2 {<br />&#160;&#160;&#160; public static void main(String args[]) {<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; int dims[] = new int[]{5, 10, 15};<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; Object arr = Array.newInstance(Integer.TYPE, dims);<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; Object arrobj = Array.get(arr, 3);<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; Class cls = arrobj.getClass().getComponentType();<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.out.println(cls);<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; arrobj = Array.get(arrobj, 5);<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; Array.setInt(arrobj, 10, 37);<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; int arrcast[][][] = (int[][][]) arr;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.out.println(arrcast[3][5][10]);<br />&#160;&#160;&#160; }<br />}<br />例中创建了一个 5 x 10 x 15 的整型数组，并为处于 [3][5][10] 的元素赋了值为 37。注意，多维数组实际上就是数组的数组，例如，第一个 Array.get 之后，arrobj 是一个 10 x 15 的数组。进而取得其中的一个元素，即长度为 15 的数组，并使用 Array.setInt 为它的第 10 个元素赋值。<br /><br />注意创建数组时的类型是动态的，在编译时并不知道其类型。</p> <img src ="http://www.blogjava.net/envoydada/aggbug/46353.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/envoydada/" target="_blank">Derek.Guo</a> 2006-05-16 11:00 <a href="http://www.blogjava.net/envoydada/archive/2006/05/16/46353.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java调用windows程序</title><link>http://www.blogjava.net/envoydada/archive/2006/05/11/45645.html</link><dc:creator>Derek.Guo</dc:creator><author>Derek.Guo</author><pubDate>Thu, 11 May 2006 05:27:00 GMT</pubDate><guid>http://www.blogjava.net/envoydada/archive/2006/05/11/45645.html</guid><wfw:comment>http://www.blogjava.net/envoydada/comments/45645.html</wfw:comment><comments>http://www.blogjava.net/envoydada/archive/2006/05/11/45645.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/envoydada/comments/commentRss/45645.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/envoydada/services/trackbacks/45645.html</trackback:ping><description><![CDATA[&#160;&#160;&#160;&#160; Runtime ru = Runtime.getRuntime();<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; try {<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; //调用播放器文件播放指定MP3<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Process p1 = ru.exec("C:\\Program Files\\Windows Media Player\\wmplayer d:\\DADA\\mp3\\0197.mp3");<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; //调用批处理文件&#160;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Process p2 = ru.exec("d:\\a.bat");<br /><br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; //显示执行结果<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; String line;<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; while((line=br.readLine())!=null){<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; System.out.println(line);<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br />&#160;&#160;&#160;&#160;&#160;&#160;&#160; } catch (IOException ex) {ex.printStackTrace();} <img src ="http://www.blogjava.net/envoydada/aggbug/45645.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/envoydada/" target="_blank">Derek.Guo</a> 2006-05-11 13:27 <a href="http://www.blogjava.net/envoydada/archive/2006/05/11/45645.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>