﻿<?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-为我所爱，奋斗一生</title><link>http://www.blogjava.net/yuweixia2008/</link><description>java的点滴</description><language>zh-cn</language><lastBuildDate>Fri, 17 Apr 2026 21:08:34 GMT</lastBuildDate><pubDate>Fri, 17 Apr 2026 21:08:34 GMT</pubDate><ttl>60</ttl><item><title>利用 Java dump 进行 JVM 故障诊断</title><link>http://www.blogjava.net/yuweixia2008/archive/2010/02/01/311471.html</link><dc:creator>希</dc:creator><author>希</author><pubDate>Mon, 01 Feb 2010 02:38:00 GMT</pubDate><guid>http://www.blogjava.net/yuweixia2008/archive/2010/02/01/311471.html</guid><wfw:comment>http://www.blogjava.net/yuweixia2008/comments/311471.html</wfw:comment><comments>http://www.blogjava.net/yuweixia2008/archive/2010/02/01/311471.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yuweixia2008/comments/commentRss/311471.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yuweixia2008/services/trackbacks/311471.html</trackback:ping><description><![CDATA[<table class="no-print" cellspacing="0" cellpadding="0" width="160" align="right" border="0" sizset="31" sizcache="2">
    <tbody sizset="32" sizcache="2">
        <tr sizset="32" sizcache="2">
            <td width="10"><img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="10" /></td>
            <td sizset="32" sizcache="2">
            <table cellspacing="0" cellpadding="0" width="150" border="0" sizset="32" sizcache="2">
                <tbody sizset="32" sizcache="1">
                    <tr>
                        <td class="v14-header-1-small">文档选项</td>
                    </tr>
                </tbody>
            </table>
            <table class="v14-gray-table-border" cellspacing="0" cellpadding="0" border="0" sizset="33" sizcache="2">
                <tbody sizset="34" sizcache="2">
                    <tr sizset="34" sizcache="2">
                        <td class="no-padding" width="150" sizset="34" sizcache="2">
                        <table cellspacing="0" cellpadding="0" width="143" border="0" sizset="34" sizcache="2">
                            <script language="JavaScript" type="text/javascript">
<!-- document.write('<tr valign="top"><td width="8"><img src="//www.ibm.com/i/c.gif" width="8" height="1" alt="" /></td><td width="16"><img alt="将打印机的版面设置成横向打印模式" height="16" src="//www.ibm.com/i/v14/icons/printer.gif" width="16" vspace="3"  /></td><td width="122"><p><strong><a class="smallplainlink" href="javascript:print()">打印本页</a></strong></p></td></tr>');
//-->
</script>
                            <tbody sizset="34" sizcache="1">
                                <tr valign="top">
                                    <td width="8"><img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="8" /></td>
                                    <td width="16"><img height="16" alt="将打印机的版面设置成横向打印模式" src="http://www.ibm.com/i/v14/icons/printer.gif" width="16" vspace="3" /></td>
                                    <td width="122">
                                    <p><strong><a class="smallplainlink" href="javascript:print()">打印本页</a></strong></p>
                                    </td>
                                </tr>
                                <noscript></noscript>
                                <form name="email" action="https://www.ibm.com/developerworks/secure/email-it.jsp" sizset="35" sizcache="1">
                                    <input type="hidden" value="本文将向读者介绍利用 Java dump 诊断 JVM Crash 和 CPU 饥饿等问题的方法和技巧，以便使用户更加全面的了解 Java dump 在故障诊断过程中的作用。" name="body" /><input type="hidden" value="利用 Java dump 进行 JVM 故障诊断" name="subject" /><input type="hidden" value="cn" name="lang" /> <script language="JavaScript" type="text/javascript">
<!-- document.write('<tr valign="top"><td width="8"><img src="//www.ibm.com/i/c.gif" width="8" height="1" alt="" /></td><td width="16"><img src="//www.ibm.com/i/v14/icons/em.gif" height="16" width="16" vspace="3" alt="将此页作为电子邮件发送"  /></td><td width="122"><p><a class="smallplainlink" href="javascript:document.email.submit();"><strong>将此页作为电子邮件发送</strong></a></p></td></tr>');
//-->
</script>
                                    <tr valign="top">
                                        <td width="8"><img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="8" /></td>
                                        <td width="16"><img height="16" alt="将此页作为电子邮件发送" src="http://www.ibm.com/i/v14/icons/em.gif" width="16" vspace="3" /></td>
                                        <td width="122">
                                        <p><a class="smallplainlink" href="javascript:document.email.submit();"><strong>将此页作为电子邮件发送</strong></a></p>
                                        </td>
                                    </tr>
                                    <noscript>
                                    <tr valign="top">
                                        <td width="8"><img alt="" height="1" width="8" src="//www.ibm.com/i/c.gif"  /></td>
                                        <td width="16"><img alt="" width="16" height="16" src="//www.ibm.com/i/c.gif"  /></td>
                                        <td class="small" width="122">
                                        <p><span class="ast">未显示需要 JavaScript 的文档选项</span></p>
                                        </td>
                                    </tr>
                                    </noscript>
                                </form>
                            </tbody>
                        </table>
                        </td>
                    </tr>
                </tbody>
            </table>
            <!--start RESERVED FOR FUTURE USE INCLUDE FILES--><!-- this content will be automatically generated across all content areas --><!--end RESERVED FOR FUTURE USE INCLUDE FILES--><br />
            </td>
        </tr>
    </tbody>
</table>
<p>级别： 初级</p>
<p><a href="http://www.ibm.com/developerworks/cn/websphere/library/techarticles/0903_suipf_javadump/#author">隋 鹏飞</a> (<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#115;&#117;&#105;&#112;&#102;&#64;&#99;&#110;&#46;&#105;&#98;&#109;&#46;&#99;&#111;&#109;&#63;&#115;&#117;&#98;&#106;&#101;&#99;&#116;&#61;&#21033;&#29992;&#32;&#74;&#97;&#118;&#97;&#32;&#100;&#117;&#109;&#112;&#32;&#36827;&#34892;&#32;&#74;&#86;&#77;&#32;&#25925;&#38556;&#35786;&#26029;">suipf@cn.ibm.com</a>), 软件工程师, IBM <br />
<a href="http://www.ibm.com/developerworks/cn/websphere/library/techarticles/0903_suipf_javadump/#author">伍 亦方</a> (<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#119;&#117;&#121;&#105;&#102;&#97;&#110;&#103;&#64;&#99;&#110;&#46;&#105;&#98;&#109;&#46;&#99;&#111;&#109;&#63;&#115;&#117;&#98;&#106;&#101;&#99;&#116;&#61;&#21033;&#29992;&#32;&#74;&#97;&#118;&#97;&#32;&#100;&#117;&#109;&#112;&#32;&#36827;&#34892;&#32;&#74;&#86;&#77;&#32;&#25925;&#38556;&#35786;&#26029;">wuyifang@cn.ibm.com</a>), 软件工程师, IBM <br />
</p>
<p>2009 年 3 月 11 日</p>
<blockquote>本文将向读者介绍利用 Java dump 诊断 JVM Crash 和 CPU 饥饿等问题的方法和技巧，以便使用户更加全面的了解 Java dump 在故障诊断过程中的作用。</blockquote><!--start RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --><!--end RESERVED FOR FUTURE USE INCLUDE FILES-->
<table cellspacing="0" cellpadding="0" width="40%" align="right" border="0" sizset="36" sizcache="2">
    <tbody sizset="37" sizcache="2">
        <tr sizset="37" sizcache="2">
            <td width="10"><img height="1" alt="" src="http://www.ibm.com/i/c.gif" width="10" /></td>
            <td sizset="37" sizcache="2">
            <table cellspacing="0" cellpadding="5" width="100%" border="1" sizset="37" sizcache="2">
                <tbody sizset="37" sizcache="1">
                    <tr>
                        <td bgcolor="#eeeeee">
                        <p>更多关于 Java dump 进行 JVM 故障诊断的内容，请参考：
                        <ul>
                            <li><a href="http://www.ibm.com/developerworks/cn/websphere/library/techarticles/0805_smith/0805_smith.html">在 WAS V6.1 应用程序中跟踪死锁</a>：本文讲述了如何使用 WAS V6.1 中的线程转储工具了解您的系统环境，检查是否发生死锁以及提取信息来帮助避免或解决自己应用程序的死锁情况。 </li>
                        </ul>
                        <p>&nbsp;</p>
                        <p>本文对上面的文章做了进一步的补充，介绍了如何利用 Java dump 诊断 JVM Crash 和 CPU 饥饿等问题的方法和技巧。</p>
                        </td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<p><a name="1.引言|outline"><span class="atitle">引言</span></a></p>
<p>对于大型 java 应用程序来说，再精细的测试都难以堵住所有的漏洞，即便我们在测试阶段进行了大量卓有成效的工作，很多问题还是会在生产环境下暴露出来，并且很难在测试环境中进行重现。JVM 能够记录下问题发生时系统的运行状态并将其存储在转储(dump)文件中，从而为我们分析和诊断问题提供了重要的依据。常见的转储文件包括 Java Dump， Heap dump 和 System dump。这里我们主要介绍 Java dump 在 JVM 故障诊断中的应用。</p>
<p>Java dump，也叫做 Thread dump，是 JVM 故障诊断中最重要的转储文件之一。JVM 的许多问题都可以使用这个文件进行诊断，其中比较典型的包括线程阻塞，CPU 使用率过高，JVM Crash，堆内存不足，和类装载等问题。作为一款轻量级（与 Heap dump 和 System dump 相比）的转储文件，Java dump 的确是我们诊断 JVM 问题的首选。本文将系统的介绍使用 Java dump 进行 JVM 故障诊断的方法和技巧，希望能够为大家提供一些帮助。</p>
<br />
<table cellspacing="0" cellpadding="0" width="100%" border="0" sizset="38" sizcache="2">
    <tbody sizset="38" sizcache="1">
        <tr>
            <td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br />
            <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td>
        </tr>
    </tbody>
</table>
<table class="no-print" cellspacing="0" cellpadding="0" align="right" sizset="39" sizcache="2">
    <tbody sizset="40" sizcache="2">
        <tr align="right" sizset="40" sizcache="2">
            <td sizset="40" sizcache="2"><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br />
            <table cellspacing="0" cellpadding="0" border="0" sizset="40" sizcache="2">
                <tbody sizset="40" sizcache="1">
                    <tr>
                        <td valign="middle"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br />
                        </td>
                        <td valign="top" align="right"><a class="fbox" href="http://www.ibm.com/developerworks/cn/websphere/library/techarticles/0903_suipf_javadump/#main"><strong>回页首</strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
<p><a name="2.Java dump 文件的格式和内容|outline"><span class="atitle">Java dump 文件的格式和内容</span></a></p>
<p>Java dump 通常是文本格式(.txt)，因此可以通过一般的文本编辑器进行阅读，阅读时需要注意段与行的格式：</p>
<p><a name="2.1.段格式|outline"><span class="smalltitle">段格式</span></a></p>
<p>为了便于大家的分析，Java dump 的每一段的开头，都会用&#8220;-----&#8221;与上一段明显的区分开来。而每一段的标题也会用&#8220;=====&#8221;作为标识，这样我们就能够很容易的找到每一段的开头和标题部分（如清单 1）。</p>
<br />
<a name="N100DC"><strong>清单 1. Java dump 段标题示例</strong></a><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0" sizset="41" sizcache="2">
    <tbody sizset="41" sizcache="1">
        <tr>
            <td class="code-outline">
            <pre class="displaycode">NULL --------------------------------
            0SECTION TITLE subcomponent dump routine
            NULL ===============================
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p><a name="2.2.行格式|outline"><span class="smalltitle">行格式</span></a></p>
<p>Java dump 文件中，每一行都包含一个标签，这个标签最多由 15 个字符组成（如清单2中所示）。其中第一位数字代表信息的详细级别（0，1，2，3，4），级别越高代表信息越详细；接下来的两个字符是段标题的缩写，比如，&#8220;CI&#8221; 代表 &#8220;Command-line interpreter&#8221;，&#8220;CL&#8221; 代表 &#8220;Class loader&#8221;，&#8220;LK&#8221; 代表 &#8220;Locking&#8221;，&#8220;ST&#8221; 代表 &#8220;Storage&#8221;，&#8220;TI&#8221; 代表 &#8220;Title&#8221;，&#8220;XE&#8221; 代表 &#8220;Execution engine&#8221;等等；其余部分为信息的概述。</p>
<br />
<a name="N100EE"><strong>清单 2. Java dump 行标签和内容示例</strong></a><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0" sizset="42" sizcache="2">
    <tbody sizset="42" sizcache="1">
        <tr>
            <td class="code-outline">
            <pre class="displaycode">1TISIGINFO Dump Event "uncaught" (00008000) Detail "java/lang/OutOfMemoryError" received</pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>不同版本的 JVM 所产生的 Java dump 的格式可能会稍有不同，但基本上都会包含以下几个方面的内容：</p>
<ul>
    <li>TITLE 信息块：描述 JAVA DUMP 产生的原因，时间以及文件的路径。
    <li>GPINFO信息块：GPF 信息。
    <li>ENVINFO 信息块：系统运行时的环境及 JVM 启动参数。
    <li>MEMINFO 信息块：内存的使用情况和垃圾回收记录。
    <li>LOCKS 信息块：用户监视器(Monitor)和系统监视器(Monitor)。
    <li>THREADS信息块：所有 java 线程的状态信息和执行堆栈。
    <li>CLASSES信息块：类加载信息。 </li>
</ul>
<a name="IDA0ITRB" sizset="43" sizcache="2"><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0" sizset="43" sizcache="2">
    <tbody sizset="43" sizcache="1">
        <tr>
            <td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br />
            <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td>
        </tr>
    </tbody>
</table>
<table class="no-print" cellspacing="0" cellpadding="0" align="right" sizset="44" sizcache="2">
    <tbody sizset="45" sizcache="2">
        <tr align="right" sizset="45" sizcache="2">
            <td sizset="45" sizcache="2"><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br />
            <table cellspacing="0" cellpadding="0" border="0" sizset="45" sizcache="2">
                <tbody sizset="45" sizcache="1">
                    <tr>
                        <td valign="middle"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br />
                        </td>
                        <td valign="top" align="right"><a class="fbox" href="http://www.ibm.com/developerworks/cn/websphere/library/techarticles/0903_suipf_javadump/#main"><strong>回页首</strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
<p><a name="3.利用 Java Dump 进行 JVM 故障诊断|outline"><span class="atitle">利用 Java Dump 进行 JVM 故障诊断</span></a></p>
<p>由于 Java dump 文件包含的内容比较广泛，因此 JVM 的很多问题都可以通过 java dump进行诊断。这些问题主要包括线程阻塞，CPU 使用率过高，JVM Crash，堆内存不足，和类装载等问题。</p>
<p><a name="3.1.诊断线程阻塞问题|outline"><span class="smalltitle">诊断线程阻塞问题</span></a></p>
<p>线程阻塞是我们在 java 多线程编程中经常遇到的问题。由于对后端有限资源的争用以及过度同步等问题，经常会发现 Java dump 中某个资源（锁对象）下有太多的线程处于等待状态，这时候我们通常需要从以下三个方面去诊断这个问题：</p>
<ul>
    <li>这个锁存在的目的是什么？有没有可能去掉这个锁或者缩小这个锁保护的范围，从而减少线程等待问题发生的几率。
    <li>有哪些线程需要用到这个锁，有没有可能改用其它更好的替代方案。
    <li>当前哪个线程正在持有这个锁，持有的时间是多长，有没有可能缩短持有的时间。 </li>
</ul>
<p>比线程阻塞更严重的是死锁问题，当两个以上的线程互相等待对方的锁，从而形成一个环的时候，就会发生死锁。关于如何使用 Java dump 诊断死锁的问题，请参考 <a href="http://www.ibm.com/developerworks/cn/websphere/library/techarticles/0805_smith/0805_smith.html">在 WebSphere Application Server V6.1 应用程序中跟踪死锁</a> 一文，该文对此问题做了较为详细的介绍。</p>
<p><a name="3.2.诊断 JVM Crash 问题|outline"><span class="smalltitle">诊断 JVM Crash 问题</span></a></p>
<p>JVM Crash 是我们所碰到的最棘手的问题之一，它对整个系统的影响是致命的，并且总是让人防不胜防。导致 JVM 崩溃的原因有很多，通常都是一些底层的错误。比如 JVM 本身的 bug，错误的 JNI 调用，第三方原生模块（比如数据库驱动程序）中的 bug 等。JVM崩溃的原因复杂，并且大多都难以重现，所以诊断起来有一定的难度。</p>
<p>一般来说，JVM 崩溃的时候，系统一般会自动产生一个 Java dump 文件（JVM 默认的设置参数就会触发）。这个 Java dump 会帮我们记录下 JVM 崩溃的原因，相关的信息会记录在 TITLE 信息块，GPINFO 信息块和 THREADS 信息块中。</p>
<ul>
    <li>TITLE 信息块：用于确认问题产生的原因，即是否是由于一些底层错误而导致 JVM Crash。
    <li>GPINFO 信息块：用于查看问题的详细信息和问题定位。
    <li>THREADS信息块：用于了解问题线程的运行情况。 </li>
</ul>
<p>下面我们通过一个具体的例子来介绍 JVM Crash 问题的诊断方法。TestJni 是一个简单的 Java 应用，它通过 JNI 调用本地代码 CallJin.dll 中的 doSomeThing() 函数。</p>
<br />
<a name="N10151"><strong>清单 3. 在 TestJni 类中调用 CallJin.dll 中的函数</strong></a><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0" sizset="46" sizcache="2">
    <tbody sizset="46" sizcache="1">
        <tr>
            <td class="code-outline">
            <pre class="displaycode">package test;
            public class TestJin {
            /**
            * @param args
            */
            public static void main(String[] args) {
            // TODO Auto-generated method stub
            TestJin testObj = new TestJin();
            testObj.work();
            }
            public void work() {
            CallJni.doSomeThing();
            }
            }
            package test;
            public class CallJni {
            static
            {
            System.loadLibrary("CallJni");
            System.out.println("Dll Loaded");
            }
            public native static void doSomeThing();
            }
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>CallJin.dll 是 C++ 编写得本地库，其源代码如清单 3 所示：</p>
<br />
<a name="N1015D"><strong>清单 4. CallJni.dll 的 C++ 实现代码</strong></a><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0" sizset="47" sizcache="2">
    <tbody sizset="47" sizcache="1">
        <tr>
            <td class="code-outline">
            <pre class="displaycode">#include &lt;com_test_CallJni.h&gt;
            /*
            * Class:     com_test_CallJni
            * Method:    doSomeThing
            */
            JNIEXPORT void JNICALL Java_test_CallJni_doSomeThing
            (JNIEnv *, jclass){
            int *i;
            *i = 100;
            }
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>在这段 C++ 代码中，整形指针 I 还没有分配空间就被赋了值，这是一个非常严重的错误。当然 java 应用程序员并不知道这一点，并且在 java 应用程序中调用了 doSomeThing（） 这个 JNI 函数。结果导致 JVM 发生了崩溃。</p>
<p>在这段 C++ 代码中，整形指针 I 还没有分配空间就被赋了值，这是一个非常严重的错误。当然 java 应用程序员并不知道这一点，并且在 java 应用程序中调用了 doSomeThing（） 这个 JNI 函数。结果导致 JVM 发生了崩溃。</p>
<p>下面是 JVM 崩溃时，系统为我们生成的 Java dump 文件的片断。</p>
<br />
<a name="N1016F"><strong>清单5. Java dump 文件片断</strong></a><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0" sizset="48" sizcache="2">
    <tbody sizset="48" sizcache="1">
        <tr>
            <td class="code-outline">
            <pre class="displaycode">NULL           ----------------------------------------------
            0SECTION       TITLE subcomponent dump routine
            NULL           ===============================
            1TISIGINFO     Dump Event "gpf" (00002000) received
            1TIDATETIME    Date:                 2008/11/12 at 20:45:24
            1TIFILENAME Javacore filename:
            C:\eclipse\workspace\Serviceability\TestApps\SampleLeak\TestJin\
            javacore.20081112.204522.5656.txt
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>从 TITLE 信息块中我们可以看到，这个 java 是由一个 "gpf" 事件触发的，GPF 是 General Protection Fault 的缩写，表明应用程序发生了一般性保护错误，这种错误常常导致 JVM 突然崩溃。</p>
<p>除了 "gpf" 之外，Java dump 还可能由如下事件触发（清单 6）。</p>
<br />
<a name="N1017E"><strong>清单 6. 常见 Java dump 触发事件</strong></a><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0" sizset="49" sizcache="2">
    <tbody sizset="49" sizcache="1">
        <tr>
            <td class="code-outline">
            <pre class="displaycode">user       SIGQUIT signal (Ctrl-Brk on Windows, Ctrl-\ on Linux, Ctrl-V on z/OS)
            abort      a controlled crash, as triggered by the abort() system call
            vmstart    the VM has finished initialization
            vmstop     the VM is about to shutdown
            load       a new class has been loaded
            unload     a classloader has been unloaded
            throw      a Java exception has been thrown
            catch      a Java exception has been caught
            uncaught   a Java exception was not handled by the application
            thrstart    a new thread has started
            thrstop    an old thread has stopped
            blocked    a thread is blocked entering a monitor
            fullgc      garbage collection has started
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>从 TITLE 信息块，我们只能初步了解问题产生的原因，如果要进一步了解问题的详细信息，还要查看 GPINFO 信息块（清单 7）：</p>
<br />
<a name="N1018A"><strong>清单7. GPINFO 信息块</strong></a><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0" sizset="50" sizcache="2">
    <tbody sizset="50" sizcache="1">
        <tr>
            <td class="code-outline">
            <pre class="displaycode">NULL           ----------------------------------------------
            0SECTION       GPINFO subcomponent dump routine
            NULL           ================================
            2XHOSLEVEL     OS Level         : Windows XP 5.1 build 2600 Service Pack 3
            2XHCPUS        Processors -
            3XHCPUARCH       Architecture   : x86
            3XHNUMCPUS       How Many       : 2
            NULL
            1XHEXCPCODE    J9Generic_Signal_Number: 00000004
            1XHEXCPCODE    ExceptionCode: C0000005
            1XHEXCPCODE    ExceptionAddress: 412E136E
            1XHEXCPCODE    ContextFlags: 0001003F
            1XHEXCPCODE    Handler1: 7EFB04E0
            1XHEXCPCODE    Handler2: 7F057A80
            1XHEXCPCODE    InaccessibleAddress: CCCCCCCC
            NULL
            1XHEXCPMODULE  Module:
            C:\eclipse\workspace\Serviceability\TestApps\SampleLeak\TestJin\CallJni.dll
            1XHEXCPMODULE  Module_base_address: 412D0000
            1XHEXCPMODULE  Offset_in_DLL: 0001136E
            NULL
            1XHFLAGS       VM flags:00040000
            NULL
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>GPINFO 信息块中我们可以找到问题的异常代码，<code>ExceptionCode: C0000005</code> 代表内存访问错误或者非法的内存操作。<code>Module: C:\eclipse\workspace\Serviceability\TestApps\TestJin\CallJni.dll</code> 指明了发生问题的原生模块。 CallJni.dll 这个动态连接库是我们自己的 JNI 代码，因此很容易发现问题的所在。在一个复杂的 java 运行环境下，很多时候异常是在第三方的代码库中产生的，我们没有办法查看源代码中的问题，这时候只能通过文件名中的一些关键字来推测问题发生的位置，这些关键字包括（清单 8）：</p>
<br />
<a name="N1019E"><strong>清单 8. 需要注意的关键字</strong></a><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0" sizset="51" sizcache="2">
    <tbody sizset="51" sizcache="1">
        <tr>
            <td class="code-outline">
            <pre class="displaycode">GC = garbage collection/collector (how Java frees memory)
            JIT = just-in-time compiler, a feature of JVM
            JDBC = Java feature for database access
            ORB = object request broker, lower layer of app server
            JMS = java messaging service, feature of web server or add-on
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>例如，Module: C:\JDK\IBM\java1.5.0\jre\bin\j9jit23.dll</p>
<p>说明 JIT 模块发生问题，用户可以使用 JITC_COMPILEOPT 变量的 SKIP 选项禁用对当前方法进行 JIT 编译，然后再对系统的运行情况进行进一步的跟踪。</p>
<p><code>JITC_COMPILEOPT=SKIP{failingPackage/failingClass}{failingMethod}</code></p>
<p>除此之外，查看 THREADS 信息块中当前线程的执行堆栈也有助于我们对问题的诊断。从清单 9 我们可以看到 main 线程在执行 CallJni.doSomeThing 方法数的过程中发生了问题，据此我们可以返回源代码中查找相应的方法，进而确定问题的根源。</p>
<br />
<a name="N101B5"><strong>清单 9. Threads 信息块</strong></a><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0" sizset="52" sizcache="2">
    <tbody sizset="52" sizcache="1">
        <tr>
            <td class="code-outline">
            <pre class="displaycode">NULL           ----------------------------------------------------
            0SECTION       THREADS subcomponent dump routine
            NULL           =================================
            NULL
            1XMCURTHDINFO  Current Thread Details
            NULL           ----------------------
            3XMTHREADINFO  "main" (TID:0x408C7C00, sys_thread_t:0x00366278, state:R,
            native ID:0x000016CC) prio=5
            4XESTACKTRACE          at test/CallJni.doSomeThing(Native Method)
            4XESTACKTRACE          at test/TestJin.work(TestJin.java:16)
            4XESTACKTRACE          at test/TestJin.main(TestJin.java:11)
            NULL
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p><a name="3.3.诊断 CPU 利用率过高问题|outline"><span class="smalltitle">诊断 CPU 利用率过高问题</span></a></p>
<p>CPU 使用率过高可能是由于某些线程陷入了死循环或者执行了不适当的操作引起的，其诊断方法就是将这些线程找出来，修正问题或者进行代码优化。由于 Java Dump 中并没有包含各线程的资源使用情况，因此我们需要结合其他的操作系统命令/工具（prstat、top、pslist 等等），将 CPU 使用率较高的线程映射到 Java Dump 中，并分析这些线程的状态以及可能发生的问题。</p>
<p>从下面这段 PSList 的输出结果中我们可以看到 jvm 内部每个线程消耗的总的&#8220;用户时间&#8221;和&#8220;内核时间&#8221;，比较几次 PSList 的输出结果，我们就能从中找出那些 CPU 使用时间显著增加的线程，再将这些线程的 TID 映射到Java Dump中，进而查看问题线程的详细信息。</p>
<br />
<a name="N101CA"><strong>清单 10. PSList 的输出结果</strong></a><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0" sizset="53" sizcache="2">
    <tbody sizset="53" sizcache="1">
        <tr>
            <td class="code-outline">
            <pre class="displaycode">pslist -d &lt;Java PID&gt;
            Tid Pri    Cswtch            State     User Time   Kernel Time   Elapsed Time
            2908   8      2025   Wait:Executive  0:00:00.359   0:00:01.312    1:48:08.046
            4344  15       157     Wait:UserReq  0:00:00.218   0:00:00.015    1:48:07.921
            4836  15    415456     Wait:UserReq  0:00:00.000   0:00:00.000    1:48:07.921
            2496   8         1     Wait:UserReq  0:00:00.000   0:00:00.000    1:48:07.796
            4648   9         1     Wait:UserReq  0:00:00.000   0:00:00.000    1:48:07.796
            3116   9         7     Wait:UserReq  0:00:00.000   0:00:00.000    1:48:07.796
            5268   8       189     Wait:UserReq  0:00:00.015   0:00:00.000    1:48:07.796
            5220   7   6991523          Running  1:47:42.031   0:00:01.218    1:48:05.593
            3932   9         2     Wait:UserReq  0:00:00.000   0:00:00.000    1:48:05.125
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p>与线程死锁问题不同，在分析 CPU 利用率过高的问题时，我们不需要关心那些处于等待状态的线程，因为线程处于等待状态不需要消耗 CPU 资源。我们关注的重点应该是 THREADS 信息块中那些正在运行（state:R 状态）的线程。很多时候为了分析线程状态的一些变化，我们需要对比多个 Java Dump 文件，看哪些线程状态发生了变化，哪些一直在执行相同的函数，从而找出那些可疑的问题线程。</p>
<p><a name="3.4.诊断堆内存不足问题|outline"><span class="smalltitle">诊断堆内存不足问题</span></a></p>
<p>除了 Thread 相关的信息外，Java Dump 还包含 Memory 和 GC 等方面的信息，虽然这些信息不像 Heap Dump 和 VerboseGC 那么详细，但对于一些比较简单的问题定位还是很有帮助的。例如，下面的 Java dump 清单中，<code>Dump Event "uncaught" (00008000) Detail "java/lang/OutOfMemoryError" received</code> 告诉我们问题是由于内存溢出引起的，并且从 MEMINFO 信息块中可以找到当前堆中的空间使用情况， 1ffa0 的剩余空间说明系统的可用堆内存已经严重不足了，需要我们扩大堆内存的大小或者修改应用程序使其占用更少的内存。</p>
<br />
<a name="N101E3"><strong>清单 11. MEMINFO 信息块</strong></a><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0" sizset="54" sizcache="2">
    <tbody sizset="54" sizcache="1">
        <tr>
            <td class="code-outline">
            <pre class="displaycode">NULL         ----------------------------------------------------
            0SECTION     TITLE subcomponent dump routine
            NULL         ===============================
            1TISIGINFO  Dump Event "uncaught" (00008000) Detail "java/lang/OutOfMemoryError" received
            1TIDATETIME  Date:                 2008/04/20 at 19:13:50
            1TIFILENAME  Javacore filename:
            c:\Serviceability\AppServer\profiles\AppSrv01\javacore.20080420.185326.948.txt
            NULL           ----------------------------------------------------
            0SECTION       MEMINFO subcomponent dump routine
            NULL           =================================
            1STHEAPFREE    Bytes of Heap Space Free: 1ffa0
            1STHEAPALLOC   Bytes of Heap Space Allocated: 40000000
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<p><a name="3.5.类加载问题|outline"><span class="smalltitle">类加载问题</span></a></p>
<p>常见的类加载问题包括： ClassNotFoundException，Jar 包冲突以及由类装入引发的其他问题（例如 jdk 1.4 中的内存碎片问题） Java Dump 文件的 Classes 信息块的格式如清单中示，这些信息可以帮我们确定以下问题： </p>
<ul>
    <li>当前系统中有哪些 Class 文件被加载进来。
    <li>确认某个 Class 是否被正确的 ClassLoader 所加载，即不同的 ClassLoader 之间是否有 Jar 包冲突。
    <li>已经加载的 Class 的个数。在IBM Jre1.4中，我们可以参考系统中 Class 的个数来设置 KCluster 的大小。 </li>
</ul>
<br />
<a name="N10200"><strong>清单 12. CLASSES 信息块</strong></a><br />
<table cellspacing="0" cellpadding="0" width="100%" border="0" sizset="55" sizcache="2">
    <tbody sizset="55" sizcache="1">
        <tr>
            <td class="code-outline">
            <pre class="displaycode">NULL     ---------------------------------------------------------
            0SECTION       CLASSES subcomponent dump routine
            NULL           =================================
            1CLTEXTCLLOS       Classloader summaries
            1CLTEXTCLLSS           12345678:
            1=primordial,2=extension,3=shareable,4=middleware,5=system,
            6=trusted,7=application,8=delegating
            2CLTEXTCLLOADER        p---st-- Loader *System*(0x008DA0B0)
            3CLNMBRLOADEDLIB        Number of loaded libraries 3
            3CLNMBRLOADEDCL            Number of loaded classes 347
            2CLTEXTCLLOADER        -x--st-- Loader sun/misc/Launcher$ExtClassLoader(0x008E5E38),
            Parent *none*(0x00000000)
            3CLNMBRLOADEDLIB        Number of loaded libraries 0
            3CLNMBRLOADEDCL            Number of loaded classes 0
            2CLTEXTCLLOADER        -----ta- Loader sun/misc/Launcher$AppClassLoader(0x008EF3E0),
            Parentsun/misc/Launcher$ExtClassLoader(0x008E5E38)
            3CLNMBRLOADEDLIB        Number of loaded libraries 0
            3CLNMBRLOADEDCL            Number of loaded classes 2
            1CLTEXTCLLIB       ClassLoader loaded libraries
            2CLTEXTCLLIB          Loader *System*(0x008DA0B0)
            3CLTEXTLIB               C:\JDK\IBM\java1.5.0\jre\bin\java
            3CLTEXTLIB               C:\JDK\IBM\java1.5.0\jre\bin\jclscar_23
            3CLTEXTLIB               C:\JDK\IBM\java1.5.0\jre\bin\zip
            1CLTEXTCLLOD       ClassLoader loaded classes
            2CLTEXTCLLOAD          Loader *System*(0x008DA0B0)
            3CLTEXTCLASS               java/io/ByteArrayOutputStream(0x40D40098)
            3CLTEXTCLASS               sun/nio/ByteBuffered(0x40D40330)
            3CLTEXTCLASS               java/lang/ref/PhantomReference(0x40DB9360)
            3CLTEXTCLASS               sun/misc/Cleaner(0x40DB94A8)
            </pre>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
<table cellspacing="0" cellpadding="0" width="100%" border="0" sizset="56" sizcache="2">
    <tbody sizset="56" sizcache="1">
        <tr>
            <td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br />
            <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td>
        </tr>
    </tbody>
</table>
<table class="no-print" cellspacing="0" cellpadding="0" align="right" sizset="57" sizcache="2">
    <tbody sizset="58" sizcache="2">
        <tr align="right" sizset="58" sizcache="2">
            <td sizset="58" sizcache="2"><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br />
            <table cellspacing="0" cellpadding="0" border="0" sizset="58" sizcache="2">
                <tbody sizset="58" sizcache="1">
                    <tr>
                        <td valign="middle"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br />
                        </td>
                        <td valign="top" align="right"><a class="fbox" href="http://www.ibm.com/developerworks/cn/websphere/library/techarticles/0903_suipf_javadump/#main"><strong>回页首</strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
<p><a name="4.常见问题|outline"><span class="atitle">常见问题</span></a></p>
<p>关于 Java dump，下面是一些有可能让你产生困惑的问题：</p>
<p><strong><em>为什么发生 JVM Crash 时，JVM 没有自动生成 Java dump 文件？</em></strong></p>
<p>答：这种情况大多与系统的环境变量或者 JVM 启动参数的设置有关，比如设置了 <code>DISABLE_JAVADUMP=true，IBM_NOSIGHANDLER=true</code> 等等，因此可以首先检查系统设置和 JVM 启动参数。当然也不排除因为一些不确定因素导致 JVM 无法产生 Java dump，虽然这种可能性比较小。 </p>
<p><strong><em>JVM 在生成 Java dump 的同时也生成了 Heap dump，它们之间有没有什么联系？</em></strong></p>
<p>答：有，但是关系不大。因为 java dump 主要反映的是线程的运行状态，而 Heap dump 则主要反映对象之间的引用关系，所以两者之间没有太大的联系。有时候我们可以通过锁对象或者 Class 对象的起始地址找到它在 Heap dump 中的位置，但大多数时候这对故障诊断并没有多大意义。</p>
<p><strong><em>为什么有些 java dump 的锁没有 owner? </em></strong></p>
<p>答：并不是所有的锁都被其它线程持有，有些锁是用作主动等待的，比如 sleep() ，wait()，join() 等，这些锁并没有被其它线程占用，被它阻塞的线程只是在等待通知，即 &#8220;Waiting to be notified&#8221;。从线程状态上看，这些锁一般都处于 &#8220;CW&#8221; 状态。</p>
<p><strong><em>Java Dump 中的很多线程处于 state:CW 和 state:B 状态，它们之间有何区别？</em></strong></p>
<p>答：两者都处于等待状态。不同是：</p>
<p>CW - Condition Wait &#8211; 条件等待. 这种等待一般是线程主动等待或者正在进行某种 IO 操作，而并非等待其它线程释放资源。比如 sleep() ，wait()，join() 等方法的调用。</p>
<p>B &#8211; Blocked &#8211; 线程被阻塞，与条件等待不同，线程被阻塞一般不是线程主动进行的，而是由于当前线程需要的资源正在被其他线程占用，因此不得不等待资源释放以后才能继续执行，例如 synchronized 代码块。</p>
<p><strong><em>为什么我在 PsList 里看到的线程无法映射到 Java dump 中？</em></strong></p>
<p>答：由于很多操作系统工具和命令输出的线程的 TID 都是十进制的，映射到 Java dump 时首先要将其转换为十六进制数字，然后再到 Java dump 中查找对应的 native ID。Java dump 中每个线程都有两个ID, 一个是 java 线程的TID, 另一个是对应操作系统线程的 native ID。</p>
<p><strong><em>阅读 Websphere Appliaction Server 产生的 Java dump 文件有没有什么特别的技巧？</em></strong></p>
<p>答：对于 WAS 应用程序来说，线程信息往往要比一般的应用程序复杂的多。记住一些常见的 ThreadName 可以帮助我们更好的理解应用程序的运行状态，例如：</p>
<table class="data-table-1" cellspacing="0" cellpadding="0" border="0" sizset="59" sizcache="2">
    <tbody sizset="59" sizcache="1">
        <tr>
            <td style="vertical-align: top; text-align: left">线程名 </td>
            <td style="vertical-align: top; text-align: left">线程信息 </td>
        </tr>
        <tr>
            <td style="vertical-align: top; text-align: left">Web Container: # </td>
            <td style="vertical-align: top; text-align: left">WAS web container * </td>
        </tr>
        <tr>
            <td style="vertical-align: top; text-align: left">Alarm Thread # </td>
            <td style="vertical-align: top; text-align: left">handles timer processing </td>
        </tr>
        <tr>
            <td style="vertical-align: top; text-align: left">Session.Transports.Threads:### </td>
            <td style="vertical-align: top; text-align: left">servlet threads for processing HTTP requests </td>
        </tr>
        <tr>
            <td style="vertical-align: top; text-align: left">ORB.thread.pool:### </td>
            <td style="vertical-align: top; text-align: left">ORB thread (ORB data) </td>
        </tr>
        <tr>
            <td style="vertical-align: top; text-align: left">P=437206:O=0:<br />
            StandardRT=19027:LocalPort=9001:RemoteHost=hostname.ibm.com:RemoteP </td>
            <td style="vertical-align: top; text-align: left">an ORB thread for receiving an EJB request or other ORB request </td>
        </tr>
        <tr>
            <td style="vertical-align: top; text-align: left">Thread-## </td>
            <td style="vertical-align: top; text-align: left">JVM thread (default name) </td>
        </tr>
    </tbody>
</table>
<br />
<br />
<table cellspacing="0" cellpadding="0" width="100%" border="0" sizset="66" sizcache="2">
    <tbody sizset="66" sizcache="1">
        <tr>
            <td><img height="1" alt="" src="http://www.ibm.com/i/v14/rules/blue_rule.gif" width="100%" /><br />
            <img height="6" alt="" src="http://www.ibm.com/i/c.gif" width="8" border="0" /></td>
        </tr>
    </tbody>
</table>
<table class="no-print" cellspacing="0" cellpadding="0" align="right" sizset="67" sizcache="2">
    <tbody sizset="68" sizcache="2">
        <tr align="right" sizset="68" sizcache="2">
            <td sizset="68" sizcache="2"><img height="4" alt="" src="http://www.ibm.com/i/c.gif" width="100%" /><br />
            <table cellspacing="0" cellpadding="0" border="0" sizset="68" sizcache="2">
                <tbody sizset="68" sizcache="1">
                    <tr>
                        <td valign="middle"><img height="16" alt="" src="http://www.ibm.com/i/v14/icons/u_bold.gif" width="16" border="0" /><br />
                        </td>
                        <td valign="top" align="right"><a class="fbox" href="http://www.ibm.com/developerworks/cn/websphere/library/techarticles/0903_suipf_javadump/#main"><strong>回页首</strong></a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<br />
<br />
<p><a name="5.结束语|outline"><span class="atitle">结束语</span></a></p>
<p>本文比较全面的介绍了 Java dump 在 JVM 故障诊断过程中的作用。正像你所看到的，Java dump 文件主要帮我们解决与线程相关的各种问题，但同时它还为我们提供了很多其它有用的信息（比如 JVM Crash），在某些情况下，这些信息对于我们至关重要，所以充分的利用 Java dump 文件可以帮我们更快的找到解决问题的方向。</p>
<br />
<br />
<p><a name="resources"><span class="atitle">参考资料 </span></a></p>
<strong>学习</strong><br />
<ul>
    <li><a href="http://www.ibm.com/developerworks/cn/websphere/library/techarticles/0805_smith/0805_smith.html">在 WebSphere Application Server V6.1 应用程序中跟踪死锁</a>：介绍了利用Java Dump跟踪死锁问题的步骤和方法。 <br />
    <br />
    <li><a href="http://www.ibm.com/developerworks/cn/java/j-dclp1/">类装入问题解密，第 1 部分: 类装入和调试工具介绍</a>：讨论类装入问题的系列文章之一。 <br />
    <br />
    <li><a href="http://publib.boulder.ibm.com/infocenter/javasdk/v5r0">IBM JDK1.5 Information Center</a>：帮您了解 IBM JVM 的工作机制、诊断技术、诊断工具等。 <br />
    <br />
    <li><a href="http://www.ibm.com/developerworks/cn/websphere/zones/was/wasv7.html">WebSphere Application Server V7 专题</a>：为您总结了与 WAS V7 相关最新的内容和资源，其中包括入门介绍及开发技巧、配置与管理、迁移、监控与测试等。 <br />
    <br />
    <li><a href="http://www.ibm.com/developerworks/cn/websphere/whatisnew.html">WebSphere 产品家族新特性系列 </a>：本专题向您提供了目前 WebSphere 系列中新产品的新增功能的介绍。 <br />
    <br />
    <li><a href="http://www.ibm.com/developerworks/cn/websphere/zones/was/wasfaqs.html">WebSphere Application Server 常见问题及解答</a>：向您提供了关于 IBM WebSphere Application Server 产品家族的问题集锦。 <br />
    <br />
    <li><a href="http://www.ibm.com/developerworks/cn/websphere/zones/was/">WebSphere Application Server 产品专题</a>：在这里您可以获得关于 WebSphere Application Server 最新的文章、教程等技术资源。 <br />
    <br />
    </li>
</ul>
<br />
<strong>获得产品和技术</strong><br />
<ul>
    <li>马上下载<a onmouseover="linkQueryAppend(this)" href="http://www.ibm.com/developerworks/downloads/ws/was/">WebSphere Application Server V7 试用版</a>。 <br />
    <br />
    <li>更多<a href="http://www.ibm.com/developerworks/cn/websphere/downloads/">WebSphere 试用版下载</a>。 </li>
</ul>
<br />
<img src ="http://www.blogjava.net/yuweixia2008/aggbug/311471.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yuweixia2008/" target="_blank">希</a> 2010-02-01 10:38 <a href="http://www.blogjava.net/yuweixia2008/archive/2010/02/01/311471.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>丁磊加盟杭州大学生创业联盟赠八字箴言</title><link>http://www.blogjava.net/yuweixia2008/archive/2009/12/22/306901.html</link><dc:creator>希</dc:creator><author>希</author><pubDate>Tue, 22 Dec 2009 06:02:00 GMT</pubDate><guid>http://www.blogjava.net/yuweixia2008/archive/2009/12/22/306901.html</guid><wfw:comment>http://www.blogjava.net/yuweixia2008/comments/306901.html</wfw:comment><comments>http://www.blogjava.net/yuweixia2008/archive/2009/12/22/306901.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yuweixia2008/comments/commentRss/306901.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yuweixia2008/services/trackbacks/306901.html</trackback:ping><description><![CDATA[<p>中新网杭州 (记者 汪恩民 实习生 沈兰)长江后浪推前浪，江山代有才人出。面对台下有志创业的&#8220;后浪&#8221;们，网易CEO<a href="http://go.tech.163.com/renwu/data/1.html">丁磊</a>今天在&#8220;杭州大学生创业联盟成立仪式&#8221;上&#8220;抛&#8221;出&#8220;自信、坚持、认真、包容&#8221;八字箴言。</p>
<p><strong>特别顾问：创业的路上遍布着挫折</strong></p>
<p>&#8220;回想我的创业之路，我当年很幸运。&#8221;作为杭州大学生创业联盟特别顾问，丁磊很庆幸在年轻的时候可以做自己喜欢的事情。&#8220;创业是一个很热门的词。但是，我要提醒大家一件事，创业的路上遍布着挫折。&#8221;</p>
<p>对于自己抛出的八字箴言，丁磊为创业者作了详细的解释。&#8220;首先，你必须要自信。如果对自己做的事情都没有信心，那么你将很难获得成功。有自信你不一定能获得成功，但没有自信你一定不会成功。其次，你必须要学会坚持。我已经说过，创业的路上会有很多挫折，每一个成功的人都要经历挫折的考验。这个过程中就需要坚持。另外，你还需要认真。也就是说，你要学会踏踏实实做事情。最后，你还要学会包容。认真是对自己的要求，包容则是对别人的。包容就是要我们能够宽恕别人的错误。&#8221;</p>
<p>丁磊在最后强调了一点：&#8220;大学生创业要无时无刻保持一颗谦虚求知的心。&#8221;</p>
<p><strong>创业导师：时间是属于年轻人的</strong></p>
<p>创业导师代表田宁表示，时间是属于年轻人的。&#8220;60后可以分到房子，70后可以分到工作，那么我们这些80后和90后呢？我们要靠自己的双手创造一切。很多IT业的巨头，你可以去查他们的发家史，很多都是大学生。&#8221;</p>
<p>田宁称，这一代人是幸福的。&#8220;我们失去很多的同时，也获得了很多。当60后和70后小时候只能玩泥土的时候，我们小时候就可以玩电脑了。&#8221;</p>
<p>&#8220;对于大学生创业，他们需要得到前辈们的指导。&#8221;田宁表示，创业导师应该把自己痛苦的创业经历告诉他们。</p>
<p><strong>轮值主席：创业群体需要&#8220;转型升级&#8221;</strong></p>
<p>&#8220;16年前，我来到杭州开始创业。那时候的情况跟今天比较，真是今非昔比。&#8221;杭州大学生创业联盟轮值主席林东表示，那时候的创业主流群体还不是大学生。&#8220;然而，他们依然撑起了现在的经济发展。&#8221;</p>
<p>林东称，现在需要的不仅是技术的转型升级，还需要创业群体的转型升级。&#8220;在十年以后，现在一些黑心商人的形象就很少看到了，更多的是<a href="http://go.tech.163.com/renwu/data/6.html">李开复</a>这样的商人。&#8221;</p>
<p>&#8220;创业充满了风险。&#8221;林东表示，创业导师的成长离不开社会的支持，大家有义务和责任帮助&#8220;小朋友们&#8221;创业。&#8220;有我们大家一起的努力，我相信一定会取得更大的辉煌。&#8221;</p>
<p><strong>杭州市长：大学生创业应永不言败</strong></p>
<p>&#8220;大学生创业应该永不言败！&#8221;杭州市长蔡奇表示，创业带动就业，应该形成杭州的一面旗帜。&#8220;杭州应该坚持人才强市战略，抓住大学生创业为杭州积蓄力量，为天堂硅谷积蓄续力量。千万不要小看大学生今天创业的弱小和落魄，通过他们能看到杭州的明天。&#8221;</p>
<p>&nbsp;</p>
<div class="gg200x300"></div>
<p>记者了解到，杭州大学生创业联盟是根据杭州市委市政府提出&#8220;以创业带动就业&#8221;的工作部署，成立服务大学生创业工作社团组织。创新工场董事长兼CEO李开复、<a href="http://go.tech.163.com/info/detail.jsp?id=15">阿里巴巴<img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" alt="" src="http://cimg20.163.com/tech/2008/3/31/20080331145327d1893.png" border="0" /></a>集团董事局主席兼CEO<a href="http://go.tech.163.com/renwu/data/3.html">马云</a>、网易CEO丁磊、赛伯乐(中国)投资董事长朱敏加盟杭州大学生创业联盟出任特别顾问。</p>
<p>蔡奇称，杭州大学生创业联盟有三个特点。&#8220;首先，它是创业大学生集聚的组织。所有愿意创业的大学生，都可以从那里得到帮助。其次，它是整合资源的创业中心。特别值得一提的，是创业投资基金也加入了这个组织里。最后，大学生创业联盟是个非政府机构。只靠政府是不够的，我们需要更多非政府组织参与，来做政府做不到的事情。&#8221;</p>
<img src ="http://www.blogjava.net/yuweixia2008/aggbug/306901.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yuweixia2008/" target="_blank">希</a> 2009-12-22 14:02 <a href="http://www.blogjava.net/yuweixia2008/archive/2009/12/22/306901.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>蜗居的感触</title><link>http://www.blogjava.net/yuweixia2008/archive/2009/11/27/303886.html</link><dc:creator>希</dc:creator><author>希</author><pubDate>Fri, 27 Nov 2009 05:33:00 GMT</pubDate><guid>http://www.blogjava.net/yuweixia2008/archive/2009/11/27/303886.html</guid><wfw:comment>http://www.blogjava.net/yuweixia2008/comments/303886.html</wfw:comment><comments>http://www.blogjava.net/yuweixia2008/archive/2009/11/27/303886.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yuweixia2008/comments/commentRss/303886.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yuweixia2008/services/trackbacks/303886.html</trackback:ping><description><![CDATA[刚看蜗居第一集我就忍不住哭了，海平告诉海藻&#8220;现在是工作挑人不是人挑工作。。。。。&#8221;想起了自己当时找工作，好像也是一样的，但是知道自己被录用了心理的欢喜。。。。。我觉得现在80后 90后的人和他们的家长都改看看，看看海平复旦毕业，结果呢。。。前两天有个同学给我打电话说她和她的男友在北京过的非常的难，告诉我他们为了生活的种种争吵。 
<img src ="http://www.blogjava.net/yuweixia2008/aggbug/303886.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yuweixia2008/" target="_blank">希</a> 2009-11-27 13:33 <a href="http://www.blogjava.net/yuweixia2008/archive/2009/11/27/303886.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>更改aspx页面编码格式</title><link>http://www.blogjava.net/yuweixia2008/archive/2009/08/05/289951.html</link><dc:creator>希</dc:creator><author>希</author><pubDate>Wed, 05 Aug 2009 06:49:00 GMT</pubDate><guid>http://www.blogjava.net/yuweixia2008/archive/2009/08/05/289951.html</guid><wfw:comment>http://www.blogjava.net/yuweixia2008/comments/289951.html</wfw:comment><comments>http://www.blogjava.net/yuweixia2008/archive/2009/08/05/289951.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yuweixia2008/comments/commentRss/289951.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yuweixia2008/services/trackbacks/289951.html</trackback:ping><description><![CDATA[<table style="table-layout: fixed">
    <tbody>
        <tr>
            <td>
            <div class="cnt" id="blog_text">
            <p>如何更改Web.Config里默认的编码设置及其对于单个aspx页面的编码格式的设置</p>
            <p>把全球化设置改成这样会省下很多事！</p>
            <p>&lt;globalization fileEncoding="GB2312" requestEncoding="GB2312" responseEncoding="GB2312"/&gt;</p>
            <p>这样一来，使用Request.QueryString[""]的时候就不用手动检索编码并解码了！省事啊！</p>
            <p>在Web.Config中设置单个aspx页面的编码格式 <br />
            <br />
            &nbsp;&nbsp; &lt;location path="Member/MyShortMessage.aspx"&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp; &lt;system.web&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;globalization requestEncoding="utf-8" responseEncoding="utf-8"/&gt;<br />
            &nbsp;&nbsp;&nbsp;&nbsp; &lt;/system.web&gt;<br />
            &nbsp;&nbsp; &lt;/location&gt;</p>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<img src ="http://www.blogjava.net/yuweixia2008/aggbug/289951.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yuweixia2008/" target="_blank">希</a> 2009-08-05 14:49 <a href="http://www.blogjava.net/yuweixia2008/archive/2009/08/05/289951.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>中国电子商务现状及未来的20大猜想</title><link>http://www.blogjava.net/yuweixia2008/archive/2009/07/26/288446.html</link><dc:creator>希</dc:creator><author>希</author><pubDate>Sun, 26 Jul 2009 08:08:00 GMT</pubDate><guid>http://www.blogjava.net/yuweixia2008/archive/2009/07/26/288446.html</guid><wfw:comment>http://www.blogjava.net/yuweixia2008/comments/288446.html</wfw:comment><comments>http://www.blogjava.net/yuweixia2008/archive/2009/07/26/288446.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yuweixia2008/comments/commentRss/288446.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yuweixia2008/services/trackbacks/288446.html</trackback:ping><description><![CDATA[<div class="postTitle"><a href="http://blog.donews.com/xinggo/archive/2009/03/24/1479426.aspx"></a>&nbsp;</div>
<div class="postText">
<div>&nbsp;
<p _extended="true">本内容源自于老邢这8年来的电子商务从业经验、派代网的运营体会及与众多电子商务相关人士交流综合整理而得。其中，这8年重点涉足了B2C、C2C和B2B，同时，还有社区的建设、运营和UI/UE等。</p>
<p _extended="true">本内容纯粹是个人观点，必然有偏颇之处，看官仁者见仁，还望多多指正。</p>
<p _extended="true">&nbsp;</p>
<p _extended="true"><strong _extended="true">第一部分 B2C的本质</strong></p>
<div class="O" _extended="true" v:shape="_x0000_s1026">
<div _extended="true"><span lang="EN-US" _extended="true">1</span><span _extended="true">、</span><span _extended="true"> B2C</span><span _extended="true">本质上就是零售业，所以，要做大，现金流是命根子。 </span></div>
<div _extended="true"><span _extended="true">2、规模是零售企业撬动上下游资源的核心法宝之一，B2C也不例外；</span></div>
<div _extended="true"><span _extended="true">3、</span><span lang="EN-US" _extended="true">B2C</span><span _extended="true">要上规模，就必须要标准化管理，如把人干的事情部分或全部交给机器（即程序）去做。 </span></div>
<div _extended="true"><span _extended="true">4、网上零售和传统零售的核心区别：售前更近</span><span lang="EN-US" _extended="true">80</span><span _extended="true">米（即用户没购物之前，能知道用户的购物偏好，这个需要很强的技术作为支撑）；</span></div>
<div _extended="true">&nbsp;</div>
<div _extended="true"><span _extended="true"><strong _extended="true">第二部分 用户体验</strong></span></div>
<div _extended="true"><span _extended="true">5、眼前，中国的</span><span lang="EN-US" _extended="true">B2C</span><span _extended="true">普遍不够重视网站的</span><span lang="EN-US" _extended="true">UI</span><span _extended="true">和</span><span lang="EN-US" _extended="true">UE</span><span _extended="true">等，其重要性理同于超市的货架及商品摆设等； </span></div>
<div _extended="true"><span _extended="true">6、全备库是提高用户购物体验的核心办法之一，即别指望在中国靠虚库也能做大（这个是阶段性问题，初期虚库或部分虚库是很务实和需要的的）； </span></div>
<div _extended="true"><span _extended="true">7、物流已是中国</span><span lang="EN-US" _extended="true">B2C</span><span _extended="true">高速发展的金箍圈（其背后还连带着资金流），也是影响购物体验的障碍之一； </span></div>
<div _extended="true">&nbsp;</div>
<div _extended="true"><span _extended="true"><strong _extended="true">第三部分 市场和运营</strong></span></div>
<div _extended="true"><span _extended="true"><span _extended="true">8、中国</span><span lang="EN-US" _extended="true">B2C</span><span _extended="true">和美国</span><span lang="EN-US" _extended="true">B2C</span><span _extended="true">最大的区别：美国是走在高速路上，而中国是土路</span><span lang="EN-US" _extended="true">+</span><span _extended="true">高速路；</span></span></div>
<div _extended="true"><span _extended="true">9、中国不是一个市场，是由</span><span lang="EN-US" _extended="true">N</span><span _extended="true">多个消费观念差异巨大的市场组成； </span></div>
<div _extended="true"><span _extended="true">10、网购人群是个崭新的消费群体，切勿用其他传统的消费观念去套，这好比用</span><span _extended="true">&#8220;</span><span lang="EN-US" _extended="true">70</span><span lang="EN-US" _extended="true">&#8221;</span><span _extended="true">看不懂</span><span _extended="true">&#8220;</span><span lang="EN-US" _extended="true">90</span><span lang="EN-US" _extended="true">&#8221;</span><span _extended="true">一样；</span></div>
<div _extended="true"><span _extended="true">11、中国<span lang="EN-US" _extended="true">B2C</span><span _extended="true">仍然处于</span><span _extended="true">&#8220;</span><span _extended="true">推广</span><span _extended="true">&#8221;</span><span _extended="true">年代，远谈不上营销及品牌管理；</span></span></div>
<div _extended="true"><span _extended="true"><font face="Tahoma" _extended="true">12</font>、在中国电商界，低价是个杀手锏，也是个双刃剑，但切勿忽略消费者对好价格无好服务的疲倦； </span></div>
<div _extended="true"><span _extended="true"><font face="Tahoma" _extended="true">13</font>、仅重</span><span _extended="true">&#8220;</span><span _extended="true">电子</span><span _extended="true">&#8221;</span><span _extended="true">，或仅重</span><span _extended="true">&#8220;</span><span _extended="true">商务</span><span _extended="true">&#8221;</span><span _extended="true">的</span><span lang="EN-US" _extended="true">B2C</span><span _extended="true">公司要做大的概率不大，但是，可以成为一个养家糊口的生意； </span></div>
<div _extended="true"><span lang="EN-US" _extended="true">14</span><span _extended="true">、意识和体制是传统渠道进入电子商务最大的障碍，其背后是勇气和利益分割等；</span></div>
<div _extended="true">&nbsp;</div>
<div _extended="true"><span _extended="true"><strong _extended="true">第四部分 未来猜测</strong></span></div>
<div _extended="true"><span lang="EN-US" _extended="true">15</span><span _extended="true">、淘宝成就了中国的网购，也将成就中国的</span><span lang="EN-US" _extended="true">B2C</span><span _extended="true">，但未必能成就自己； </span></div>
<div _extended="true"><span lang="EN-US" _extended="true">16</span><span _extended="true">、中国出现</span><span _extended="true">&#8220;</span><span lang="EN-US" _extended="true">amazon</span><span lang="EN-US" _extended="true">&#8221;</span><span _extended="true">的概率近乎为零；要有，所花的时间和金钱将是</span><span lang="EN-US" _extended="true">amazon</span><span _extended="true">的倍级；&nbsp;</span><span _extended="true">&nbsp;</span></div>
<div _extended="true"><span lang="EN-US" _extended="true">17</span><span _extended="true">、中国</span><span lang="EN-US" _extended="true">B2C</span><span _extended="true">的机会，属于那些重视且具有营销、技术和管理能力的企业； </span></div>
<div _extended="true"><span lang="EN-US" _extended="true">18</span><span _extended="true">、中国</span><span lang="EN-US" _extended="true">B2C</span><span _extended="true">已经上了高速发展的快车道，且这种高速度将维持约</span><span lang="EN-US" _extended="true">5</span><span _extended="true">年左右； </span></div>
<div _extended="true"><span lang="EN-US" _extended="true">19</span><span _extended="true">、</span><span lang="EN-US" _extended="true">B2C</span><span _extended="true">已逐步呈现出类似传统零售的业态，有全国性的大连锁、区域连锁和小区便利店； </span></div>
<div _extended="true"><span lang="EN-US" _extended="true">20</span><span _extended="true">、中国电子商务未来的主流，不属于</span><span lang="EN-US" _extended="true">B2B</span><span _extended="true">，也不属于</span><span lang="EN-US" _extended="true">C2C</span><span _extended="true">，而必然属于</span><span lang="EN-US" _extended="true">B2C</span><span _extended="true">；</span></div>
</div>
</div>
</div>
<img src ="http://www.blogjava.net/yuweixia2008/aggbug/288446.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yuweixia2008/" target="_blank">希</a> 2009-07-26 16:08 <a href="http://www.blogjava.net/yuweixia2008/archive/2009/07/26/288446.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>FlowLayout的另一种布局方法</title><link>http://www.blogjava.net/yuweixia2008/archive/2009/07/22/287889.html</link><dc:creator>希</dc:creator><author>希</author><pubDate>Wed, 22 Jul 2009 09:38:00 GMT</pubDate><guid>http://www.blogjava.net/yuweixia2008/archive/2009/07/22/287889.html</guid><wfw:comment>http://www.blogjava.net/yuweixia2008/comments/287889.html</wfw:comment><comments>http://www.blogjava.net/yuweixia2008/archive/2009/07/22/287889.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yuweixia2008/comments/commentRss/287889.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yuweixia2008/services/trackbacks/287889.html</trackback:ping><description><![CDATA[new JPanel(new FlowLayout(FlowLayout.LEFT, 5, 0))<br />
<img src ="http://www.blogjava.net/yuweixia2008/aggbug/287889.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yuweixia2008/" target="_blank">希</a> 2009-07-22 17:38 <a href="http://www.blogjava.net/yuweixia2008/archive/2009/07/22/287889.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GridBagConstraints</title><link>http://www.blogjava.net/yuweixia2008/archive/2009/07/22/287841.html</link><dc:creator>希</dc:creator><author>希</author><pubDate>Wed, 22 Jul 2009 05:45:00 GMT</pubDate><guid>http://www.blogjava.net/yuweixia2008/archive/2009/07/22/287841.html</guid><wfw:comment>http://www.blogjava.net/yuweixia2008/comments/287841.html</wfw:comment><comments>http://www.blogjava.net/yuweixia2008/archive/2009/07/22/287841.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yuweixia2008/comments/commentRss/287841.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yuweixia2008/services/trackbacks/287841.html</trackback:ping><description><![CDATA[<code><strong><a href="mk:@MSITStore:D:\书\JDK1.5API_CN.CHM::/api/java/awt/GridBagConstraints.html#GridBagConstraints(int, int, int, int, double, double, int, int, java.awt.Insets, int, int)">GridBagConstraints</a></strong>(int&nbsp;gridx, int&nbsp;gridy, int&nbsp;gridwidth, int&nbsp;gridheight, double&nbsp;weightx, double&nbsp;weighty, int&nbsp;anchor, int&nbsp;fill, <a title="java.awt 中的类" href="mk:@MSITStore:D:\书\JDK1.5API_CN.CHM::/api/java/awt/Insets.html">Insets</a>&nbsp;insets, int&nbsp;ipadx, int&nbsp;ipady)<br />
组件的位置 第gridx行 第gridy列 此组件占gridwidth行单元格，占gridheight列单元格，weightx，weighty剩余单元格的 anchor当组件小于其显示区域时使用此字段</code>
<img src ="http://www.blogjava.net/yuweixia2008/aggbug/287841.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yuweixia2008/" target="_blank">希</a> 2009-07-22 13:45 <a href="http://www.blogjava.net/yuweixia2008/archive/2009/07/22/287841.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java访问系统托盘</title><link>http://www.blogjava.net/yuweixia2008/archive/2009/07/07/285869.html</link><dc:creator>希</dc:creator><author>希</author><pubDate>Tue, 07 Jul 2009 14:01:00 GMT</pubDate><guid>http://www.blogjava.net/yuweixia2008/archive/2009/07/07/285869.html</guid><wfw:comment>http://www.blogjava.net/yuweixia2008/comments/285869.html</wfw:comment><comments>http://www.blogjava.net/yuweixia2008/archive/2009/07/07/285869.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yuweixia2008/comments/commentRss/285869.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yuweixia2008/services/trackbacks/285869.html</trackback:ping><description><![CDATA[类java.awt.SystemTray代表了桌面的系统托盘.你可以通过静态方法SystemTray.getSystemTray()来进行访问.但是,在这之前,你的程序应该用静态方法SystemTray.isSupported()来测试一下系统是否支持托盘.如果系统托盘不存在或者系统不支持托盘,isSupported()将返回flase.在这种情况下调用getSysemTray的话,它将抛出java.lang.UnsupportedOperationException.<br />
每个java应用程序都只有一个单一的SystemTray实例.所以,一个程序不能创建只属于它自己的SystemTray实例;而它必须用getSystemTray()方法来取得已有的那个.<br />
SystemTray包含有一个或多个TrayIcon.通过SystemTray的方法add(java.awt.TrayIcon)方法可以添加一个TrayIcon到托盘,通过remove(java.awt.TrayIcon)将一个TrayIcon从托盘移除.注意最近添加的测试代码指明,如操作系统或者Java runtime不添加TrayIcon到托盘,add()方法可能会抛出AWTException.例如,在X-Windows中,如果托盘不存在,它将抛出AWTException<br />
下面的代码演示了如果访问系统托盘:
<div style="border-right: windowtext 0.5pt solid; padding-right: 5.4pt; border-top: windowtext 0.5pt solid; padding-left: 5.4pt; background: #e6e6e6; padding-bottom: 4px; border-left: windowtext 0.5pt solid; width: 95%; word-break: break-all; padding-top: 4px; border-bottom: windowtext 0.5pt solid">
<div><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;TrayIcon&nbsp;trayIcon;<br />
<br />
</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(SystemTray.isSupported())&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;SystemTray&nbsp;tray&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;SystemTray.getSystemTray();<br />
&nbsp;&nbsp;&nbsp;&nbsp;Image&nbsp;image&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Toolkit.getDefaultToolkit().getImage(</span><span style="color: #000000">"</span><span style="color: #000000">tray.gif</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;MouseListener&nbsp;mouseListener&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;MouseListener()&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;mouseClicked(MouseEvent&nbsp;e)&nbsp;{<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">Tray&nbsp;Icon&nbsp;-&nbsp;Mouse&nbsp;clicked!</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;mouseEntered(MouseEvent&nbsp;e)&nbsp;{<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">Tray&nbsp;Icon&nbsp;-&nbsp;Mouse&nbsp;entered!</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;mouseExited(MouseEvent&nbsp;e)&nbsp;{<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">Tray&nbsp;Icon&nbsp;-&nbsp;Mouse&nbsp;exited!</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;mousePressed(MouseEvent&nbsp;e)&nbsp;{<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">Tray&nbsp;Icon&nbsp;-&nbsp;Mouse&nbsp;pressed!</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;mouseReleased(MouseEvent&nbsp;e)&nbsp;{<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">Tray&nbsp;Icon&nbsp;-&nbsp;Mouse&nbsp;released!</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;};<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;ActionListener&nbsp;exitListener&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ActionListener()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;actionPerformed(ActionEvent&nbsp;e)&nbsp;{<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">Exiting...</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.exit(</span><span style="color: #000000">0</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;};&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;PopupMenu&nbsp;popup&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;PopupMenu();<br />
&nbsp;&nbsp;&nbsp;&nbsp;MenuItem&nbsp;defaultItem&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;MenuItem(</span><span style="color: #000000">"</span><span style="color: #000000">Exit</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;defaultItem.addActionListener(exitListener);<br />
&nbsp;&nbsp;&nbsp;&nbsp;popup.add(defaultItem);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;trayIcon&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;TrayIcon(image,&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Tray&nbsp;Demo</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;popup);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;ActionListener&nbsp;actionListener&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ActionListener()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;actionPerformed(ActionEvent&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;trayIcon.displayMessage(</span><span style="color: #000000">"</span><span style="color: #000000">Action&nbsp;Event</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">An&nbsp;Action&nbsp;Event&nbsp;Has&nbsp;Been&nbsp;Peformed!</span><span style="color: #000000">"</span><span style="color: #000000">,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TrayIcon.MessageType.INFO);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;};&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;trayIcon.setImageAutoSize(</span><span style="color: #0000ff">true</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;trayIcon.addActionListener(actionListener);<br />
&nbsp;&nbsp;&nbsp;&nbsp;trayIcon.addMouseListener(mouseListener);<br />
<br />
&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;tray.add(trayIcon);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(AWTException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.err.println(</span><span style="color: #000000">"</span><span style="color: #000000">TrayIcon&nbsp;could&nbsp;not&nbsp;be&nbsp;added.</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
}&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000">&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;不支持系统托盘</span><span style="color: #008000"><br />
</span><span style="color: #000000"><br />
}<br />
</span></div>
</div>
<div><font size="1"><strong>实现Tray Icon</strong></font><br />
系统托盘允许一个或多个java.awt.TrayIcon添加到它或从它移除:一个TrayIcon对象代表着一个可以添加到系统托盘的托盘图标.但是,TrayIcon的功能不止是一个显示在托盘里的图标.它还可以有工具提示(tooltip),有一个AWT的弹出菜单,还有一系列相关的侦听器<br />
&nbsp;一个TrayIcon会产生各种各样的MouseEvent(pressed,released,和clicked).可以对它添加相关的侦听器去接收这些事件的通知.但是要注意,在MouseEvent从TrayIcon接收到的坐标是相对于屏幕而不是TrayIcon它自己的.TrayIcon它自己处理这些事件.例如,默认情况下,当右击TrayIcon时,和它相关的弹出菜单就会显示.当鼠标在它上面停留时,工具提示就会出现.TrayIcon也可以产生ActionEvent.在一些平台上,ActionEvent产生于用户通过鼠标或键盘选择该TrayIcon时.一个实现良好的TrayIcon应该用不同的方法去显示弹出菜单和选择托盘图标.<br />
注意,根据最新的javadocs,当一个鼠标事件被发送到它的侦听器时,它的component属性(通过父类ComponentEvent.getComponent()获取)将会被设置为null.而source属性(通过EventObject.getSource()获取)将被设置为该TrayIcon<br />
有用的特点<br />
用setImage()方法可以在以后更新TrayIcon的图标:<br />
&nbsp;&nbsp;&nbsp;&nbsp; trayIcon.setImage(updatedImage);<br />
同样你可以更新工具提示:<br />
&nbsp;&nbsp;&nbsp;&nbsp; trayIcon.setTooltip("I'm busy. Go away.");<br />
TrayIcon有一个非常有用的自动调整大小的属性.这个属性决定是否自动调整图片的大小以适应托盘的大小.默认这个属性是false的.如果图片的大小不适合托盘的大小,图片仍会以它原来的大小绘制到托盘上.也就是说,如果图片比分配的托盘空间大,图片将被剪切.另一方面,如果自动调整大小被设为true,那么图片将伸缩以适应托盘图标的大小<br />
&nbsp;&nbsp;&nbsp;&nbsp; trayIcon.setImageAutoSize(true);<br />
最后,如果你想偶尔用工具提示通知用户程序的一些变化,你可以用displayMessage()方法.这个方法弹出一个在托盘图标上弹出一个消息.这个消息会在一段时间之后,或者用户单击它之后消失.单击它的时候,根据系统的情况,会产生ActionEvent <br />
&nbsp;&nbsp;&nbsp;&nbsp; trayIcon.displayMessage("Finished downloading", <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "Your Java application has finished downloading",<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TrayIcon.MessageType.INFO);<br />
第一个参数是标题.它通常在弹出消息里会以粗体显示.第二个参数是要显示的消息.最后,最后一个参数是TrayIcon的一个枚举类型TrayIcon.Message,有四个选择.这些选项可以用作决定在显示消息时,是否应执行某些图形操作或其他系统动作.四个选择如下:<br />
TrayIcon.MessageType.ERROR&nbsp;&nbsp; An error message <br />
TrayIcon.MessageType.INFO&nbsp;&nbsp; An information message <br />
TrayIcon.MessageType.NONE&nbsp;&nbsp; A simple message <br />
TrayIcon.MessageType.WARNING&nbsp;&nbsp; A warning message <br />
===================================================<br />
下面是我自己写的例子</div>
<div>&nbsp;</div>
<div style="border-right: windowtext 0.5pt solid; padding-right: 5.4pt; border-top: windowtext 0.5pt solid; padding-left: 5.4pt; background: #e6e6e6; padding-bottom: 4px; border-left: windowtext 0.5pt solid; width: 95%; word-break: break-all; padding-top: 4px; border-bottom: windowtext 0.5pt solid">
<div><span style="color: #0000ff">package</span><span style="color: #000000">&nbsp;blog.swing;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.awt.event.ActionListener;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.awt.event.ActionEvent;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.awt.event.MouseListener;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.awt.event.MouseEvent;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.awt.PopupMenu;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.awt.MenuItem;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.awt.Image;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.awt.AWTException;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.awt.Toolkit;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.awt.SystemTray;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.awt.TrayIcon;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.text.SimpleDateFormat;<br />
</span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.Calendar;<br />
<br />
</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;SystemTrayDemo&nbsp;<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;SystemTray&nbsp;systemTray;<br />
&nbsp;&nbsp;&nbsp;&nbsp;TrayIcon&nbsp;trayIcon;<br />
&nbsp;&nbsp;&nbsp;&nbsp;Image&nbsp;trayImage;<br />
&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;trayTip;<br />
&nbsp;&nbsp;&nbsp;&nbsp;PopupMenu&nbsp;trayPopupMenu;<br />
&nbsp;&nbsp;&nbsp;&nbsp;MenuItem&nbsp;trayMenuItem;<br />
&nbsp;&nbsp;&nbsp;&nbsp;ActionListener&nbsp;trayActionListener;<br />
&nbsp;&nbsp;&nbsp;&nbsp;ActionListener&nbsp;menuActionListener;<br />
&nbsp;&nbsp;&nbsp;&nbsp;MouseListener&nbsp;trayMouseListener;<br />
&nbsp;&nbsp;&nbsp;&nbsp;Thread&nbsp;displayTime;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;SystemTrayDemo()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(&nbsp;SystemTray.isSupported()&nbsp;){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;trayMouseListener&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;MouseListener()&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;mouseClicked(MouseEvent&nbsp;e)&nbsp;{<br />
&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">Tray&nbsp;Icon&nbsp;-&nbsp;Mouse&nbsp;clicked!</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;mouseEntered(MouseEvent&nbsp;e)&nbsp;{<br />
&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">Tray&nbsp;Icon&nbsp;-&nbsp;Mouse&nbsp;entered!</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;mouseExited(MouseEvent&nbsp;e)&nbsp;{<br />
&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">Tray&nbsp;Icon&nbsp;-&nbsp;Mouse&nbsp;exited!</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;mousePressed(MouseEvent&nbsp;e)&nbsp;{<br />
&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">Tray&nbsp;Icon&nbsp;-&nbsp;Mouse&nbsp;pressed!</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;mouseReleased(MouseEvent&nbsp;e)&nbsp;{<br />
&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">Tray&nbsp;Icon&nbsp;-&nbsp;Mouse&nbsp;released!</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;trayActionListener&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ActionListener(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;actionPerformed(&nbsp;ActionEvent&nbsp;e&nbsp;){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Tray&nbsp;Icon&nbsp;-&nbsp;Action&nbsp;event&nbsp;happened!</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;}<br />
&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;menuActionListener&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ActionListener(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;actionPerformed(&nbsp;ActionEvent&nbsp;e&nbsp;){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.exit(</span><span style="color: #000000">0</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;trayPopupMenu&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;PopupMenu();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;trayMenuItem&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;MenuItem(</span><span style="color: #000000">"</span><span style="color: #000000">exit</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;trayMenuItem.addActionListener(&nbsp;menuActionListener&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;trayPopupMenu.add(&nbsp;trayMenuItem&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;trayTip&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">This&nbsp;is&nbsp;a&nbsp;SystemTray&nbsp;Demo</span><span style="color: #000000">"</span><span style="color: #000000">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;trayImage&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Toolkit.getDefaultToolkit().getImage(</span><span style="color: #000000">"</span><span style="color: #000000">images/leaf.gif</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;trayIcon&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;TrayIcon(&nbsp;trayImage,trayTip,trayPopupMenu&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;trayIcon.addActionListener(&nbsp;trayActionListener&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;trayIcon.addMouseListener(&nbsp;trayMouseListener&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;trayIcon.setImageAutoSize(&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;systemTray&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;SystemTray.getSystemTray();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;systemTray.add(&nbsp;trayIcon&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #0000ff">catch</span><span style="color: #000000">(&nbsp;AWTException&nbsp;e&nbsp;){<br />
&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;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #0000ff">else</span><span style="color: #000000">{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">SystemTray&nbsp;unsupported!</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;displayTime&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Thread(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Runnable(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;run(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Calendar&nbsp;now;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SimpleDateFormat&nbsp;sdf&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;SimpleDateFormat(</span><span style="color: #000000">"</span><span style="color: #000000">yyyy-MM-dd&nbsp;hh:mm:ss</span><span style="color: #000000">"</span><span style="color: #000000">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;time;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">(</span><span style="color: #0000ff">true</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;now&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Calendar.getInstance();&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;time</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;sdf.format(&nbsp;now.getTime()&nbsp;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;trayIcon.displayMessage(</span><span style="color: #000000">"</span><span style="color: #000000">报时</span><span style="color: #000000">"</span><span style="color: #000000">,time,TrayIcon.MessageType.INFO);<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">try</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;&nbsp;&nbsp;&nbsp;Thread.sleep(</span><span style="color: #000000">60000</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: #0000ff">catch</span><span style="color: #000000">(&nbsp;InterruptedException&nbsp;e&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;e.printStackTrace();<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;}<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;displayTime.start();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;SystemTrayDemo();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></div>
</div>
<img src ="http://www.blogjava.net/yuweixia2008/aggbug/285869.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yuweixia2008/" target="_blank">希</a> 2009-07-07 22:01 <a href="http://www.blogjava.net/yuweixia2008/archive/2009/07/07/285869.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>struts相对路径</title><link>http://www.blogjava.net/yuweixia2008/archive/2009/06/17/282887.html</link><dc:creator>希</dc:creator><author>希</author><pubDate>Wed, 17 Jun 2009 09:39:00 GMT</pubDate><guid>http://www.blogjava.net/yuweixia2008/archive/2009/06/17/282887.html</guid><wfw:comment>http://www.blogjava.net/yuweixia2008/comments/282887.html</wfw:comment><comments>http://www.blogjava.net/yuweixia2008/archive/2009/06/17/282887.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yuweixia2008/comments/commentRss/282887.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yuweixia2008/services/trackbacks/282887.html</trackback:ping><description><![CDATA[在struts-config。xml文件中在&lt;forword&gt;中加入redirect="true"&nbsp; contextRelative="false"即可在当前相对路径下
 <img src ="http://www.blogjava.net/yuweixia2008/aggbug/282887.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yuweixia2008/" target="_blank">希</a> 2009-06-17 17:39 <a href="http://www.blogjava.net/yuweixia2008/archive/2009/06/17/282887.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernian 一对多异常AbstractEntityTuplizer.createProxy(AbstractEntityTuplizer.java:372</title><link>http://www.blogjava.net/yuweixia2008/archive/2009/06/17/282886.html</link><dc:creator>希</dc:creator><author>希</author><pubDate>Wed, 17 Jun 2009 09:35:00 GMT</pubDate><guid>http://www.blogjava.net/yuweixia2008/archive/2009/06/17/282886.html</guid><wfw:comment>http://www.blogjava.net/yuweixia2008/comments/282886.html</wfw:comment><comments>http://www.blogjava.net/yuweixia2008/archive/2009/06/17/282886.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/yuweixia2008/comments/commentRss/282886.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/yuweixia2008/services/trackbacks/282886.html</trackback:ping><description><![CDATA[严重: Servlet.service() for servlet action threw exception<br />
java.lang.NullPointerException<br />
&nbsp;at org.hibernate.tuple.AbstractEntityTuplizer.createProxy(AbstractEntityTuplizer.java:372)<br />
&nbsp;at org.hibernate.persister.entity.AbstractEntityPersister.createProxy(AbstractEntityPersister.java:3121)<br />
&nbsp;at org.hibernate.event.def.DefaultLoadEventListener.createProxyIfNecessary(DefaultLoadEventListener.java:232)<br />
&nbsp;at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:173)<br />
&nbsp;at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:87)<br />
&nbsp;at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:862)<br />
&nbsp;at org.hibernate.impl.SessionImpl.internalLoad(SessionImpl.java:830)<br />
&nbsp;at org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:266)<br />
&nbsp;at org.hibernate.type.EntityType.resolve(EntityType.java:303)<br />
&nbsp;at org.hibernate.engine.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:116)<br />
&nbsp;at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:842)<br />
&nbsp;at org.hibernate.loader.Loader.doQuery(Loader.java:717)<br />
&nbsp;at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)<br />
&nbsp;at org.hibernate.loader.Loader.doList(Loader.java:2145)<br />
&nbsp;at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2029)<br />
&nbsp;at org.hibernate.loader.Loader.list(Loader.java:2024)<br />
&nbsp;at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:375)<br />
&nbsp;at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:308)<br />
&nbsp;at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:153)<br />
&nbsp;at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1106)<br />
&nbsp;at org.hibernate.impl.QueryImpl.list(QueryImpl.java:79)<br />
&nbsp;at org.springframework.orm.hibernate3.HibernateTemplate$29.doInHibernate(HibernateTemplate.java:849)<br />
&nbsp;at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:372)<br />
&nbsp;at org.springframework.orm.hibernate3.HibernateTemplate.find(HibernateTemplate.java:840)<br />
&nbsp;at org.springframework.orm.hibernate3.HibernateTemplate.find(HibernateTemplate.java:832)<br />
&nbsp;at dao.daoImlHibernate.WordDaoImplHibernate.listAll(WordDaoImplHibernate.java:36)<br />
&nbsp;at service.serviceImpl.WordServiceImpl.listAll(WordServiceImpl.java:24)<br />
&nbsp;at com.yourcompany.struts.action.WordAction.listAll(WordAction.java:45)<br />
&nbsp;at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)<br />
&nbsp;at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)<br />
&nbsp;at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)<br />
&nbsp;at java.lang.reflect.Method.invoke(Unknown Source)<br />
&nbsp;at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:270)<br />
&nbsp;at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:187)<br />
&nbsp;at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)<br />
&nbsp;at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)<br />
&nbsp;at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)<br />
&nbsp;at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)<br />
&nbsp;at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)<br />
&nbsp;at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)<br />
&nbsp;at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)<br />
&nbsp;at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)<br />
&nbsp;at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:228)<br />
&nbsp;at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)<br />
&nbsp;at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)<br />
&nbsp;at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)<br />
&nbsp;at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)<br />
&nbsp;at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:216)<br />
&nbsp;at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)<br />
&nbsp;at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:634)<br />
&nbsp;at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:445)<br />
&nbsp;at java.lang.Thread.run(Unknown Source)<br />
<br />
<br />
解决方法在从表中&nbsp;&lt;many-to-one name="usrs" class="model.Usrs" fetch="select" lazy="false"&gt;将lazy=&#8220;false&#8221;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;column name="usr_id" /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/many-to-one&gt;
 <img src ="http://www.blogjava.net/yuweixia2008/aggbug/282886.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/yuweixia2008/" target="_blank">希</a> 2009-06-17 17:35 <a href="http://www.blogjava.net/yuweixia2008/archive/2009/06/17/282886.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>