<?xml version="1.0"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>NetBeans星球</title>
    <link>http://www.planetnetbeans.org/zh_cn/</link>
    <language>zh</language>
    <description>NetBeans星球 - http://www.planetnetbeans.org/zh_cn/</description>
    <item>
      <title>BlogJava-Java桌面技术-随笔分类-NetBeans: NetBeans6.10发布计划</title>
      <guid isPermaLink="false">http://www.blogjava.net/javagui/archive/2010/08/19/329310.html</guid>
      <link>http://www.blogjava.net/javagui/archive/2010/08/19/329310.html</link>
      <description>NetBeans下一个版本是6.10，NetBeans小组正在紧锣密鼓地进行了。http://wiki.netbeans.org/NetBeans_610?intcmp=925655 &lt;div&gt;按照计划，6.10将于明年1月发布。&lt;br /&gt; &lt;div&gt;&lt;br /&gt; &lt;/div&gt; &lt;/div&gt; &lt;img src="http://www.blogjava.net/javagui/aggbug/329310.html" height="1" width="1" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="right"&gt;&lt;a style="text-decoration: none;" href="http://www.blogjava.net/javagui/" target="_blank"&gt;sun_java_studio@yahoo.com.cn(电玩)&lt;/a&gt; 2010-08-19 10:05 &lt;a
      style="text-decoration: none;" href="http://www.blogjava.net/javagui/archive/2010/08/19/329310.html#Feedback" target="_blank"&gt;发表评论&lt;/a&gt;&lt;/div&gt;</description>
      <pubDate>Thu, 19 Aug 2010 02:05:00 +0000</pubDate>
    </item>
    <item>
      <title>BlogJava-Java桌面技术-随笔分类-NetBeans: NetBeans6.9正式发布</title>
      <guid isPermaLink="false">http://www.blogjava.net/javagui/archive/2010/06/17/323685.html</guid>
      <link>http://www.blogjava.net/javagui/archive/2010/06/17/323685.html</link>
      <description>摘要: 今天一早来到公司，习惯性地打开www.netbeans.org发现期待已久的6.9版本正式发布。这是一个里程碑的版本，首次正式加入对OSGI的支持。其他编辑特性也明显增强&#160;&#160;&lt;a href="http://www.blogjava.net/javagui/archive/2010/06/17/323685.html"&gt;阅读全文&lt;/a&gt;&lt;img src="http://www.blogjava.net/javagui/aggbug/323685.html" height="1" width="1" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="right"&gt;&lt;a style="text-decoration: none;" href="http://www.blogjava.net/javagui/" target="_blank"&gt;sun_java_studio@yahoo.com.cn(电玩)&lt;/a&gt; 2010-06-17 09:50
      &lt;a style="text-decoration: none;" href="http://www.blogjava.net/javagui/archive/2010/06/17/323685.html#Feedback" target="_blank"&gt;发表评论&lt;/a&gt;&lt;/div&gt;</description>
      <pubDate>Thu, 17 Jun 2010 01:50:00 +0000</pubDate>
    </item>
    <item>
      <title>BlogJava-何以解忧？唯有Java: 发布一个 NetBeans Java ByteCode Viewer 插件</title>
      <guid isPermaLink="false">http://www.blogjava.net/gml520/archive/2010/05/13/320788.html</guid>
      <link>http://www.blogjava.net/gml520/archive/2010/05/13/320788.html</link>
      <description>摘要: 昨天在JavaEye论坛上又一位仁兄用Jclasslib 查看 Java class byte code，http://www.javaeye.com/topic/663117#1489190 &lt;br /&gt;于是去下载 Jclasslib ，发现官方网站上在2005年以后就没有更新了，他的NetBeans 插件也没有更新，对于新版的NetBeans 支持不了，于是就萌生了重新开发 Jclasslib for NetBeans 插件，于是就有了今天的这篇博文，呵呵！ &lt;br /&gt;话不多说，先上图，正所谓一图胜千言,可能有些朋友会觉得使用Java 默认的界面比较丑陋，但是我觉得还行，哈哈！主要是因为这个外观的的Java运行速度比较快，Linux 下用这个外观很实用。 &lt;br /&gt;&#160;&#160;&lt;a href="http://www.blogjava.net/gml520/archive/2010/05/13/320788.html"&gt;阅读全文&lt;/a&gt;&lt;img
      src="http://www.blogjava.net/gml520/aggbug/320788.html" height="1" width="1" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="right"&gt;&lt;a style="text-decoration: none;" href="http://www.blogjava.net/gml520/" target="_blank"&gt;日月雨林@gmail.com&lt;/a&gt; 2010-05-13 12:43 &lt;a style="text-decoration: none;" href="http://www.blogjava.net/gml520/archive/2010/05/13/320788.html#Feedback" target="_blank"&gt;发表评论&lt;/a&gt;&lt;/div&gt;</description>
      <pubDate>Thu, 13 May 2010 04:43:00 +0000</pubDate>
    </item>
    <item>
      <title>BlogJava-何以解忧？唯有Java: NetBeans6.9 开发版的几个新功能</title>
      <guid isPermaLink="false">http://www.blogjava.net/gml520/archive/2010/04/16/318507.html</guid>
      <link>http://www.blogjava.net/gml520/archive/2010/04/16/318507.html</link>
      <description>&lt;br /&gt; 这里只列举几个新特性：&lt;br /&gt; &lt;br /&gt; 1、内置 shell 控制台 &lt;br /&gt; &lt;img src="http://www.blogjava.net/images/blogjava_net/gml520/shell1.png" alt="" /&gt;&lt;br /&gt; &lt;br /&gt; 本地，和远程的shell 视图：&lt;br /&gt; &lt;br /&gt; &lt;img src="http://www.blogjava.net/images/blogjava_net/gml520/shell.png" alt="" /&gt;&lt;br /&gt; &lt;br /&gt; 2、 拼写检查&lt;br /&gt; &lt;img src="http://blogs.sun.com/katakai/resource/2010/nb69-spellcheck-01.png" alt="" height="466" width="480" /&gt;&lt;br
      /&gt; &lt;br /&gt; 注释中的拼写检查&lt;br /&gt; &lt;br /&gt; &lt;img src="http://blogs.sun.com/katakai/resource/2010/nb69-spellcheck-02.png" alt="" /&gt;&lt;br /&gt; &lt;br /&gt; 版本控制中的拼写检查&lt;br /&gt; &lt;img src="http://blogs.sun.com/katakai/resource/2010/nb69-spellcheck-03.png" alt="" /&gt;&lt;br /&gt; &lt;br /&gt; 3、 链接地址显示&lt;br /&gt; &lt;br /&gt; &lt;img src="http://www.blogjava.net/images/blogjava_net/gml520/linksurl2.png" alt="" /&gt;&lt;br /&gt; &lt;br /&gt; 4、 Line wrap&lt;br /&gt; &lt;br /&gt;
      &lt;img src="http://blogs.sun.com/katakai/resource/2010/nb69-linewrap-01.png" alt="" /&gt;&lt;br /&gt; &lt;br /&gt; 效果图：&lt;br /&gt; &lt;br /&gt; &lt;img src="http://blogs.sun.com/katakai/resource/2010/nb69-linewrap-02.png" alt="" /&gt;&lt;br /&gt; &lt;br /&gt; &lt;strong&gt;&lt;span style="color: red;"&gt;&lt;strong&gt;更多的功能请看&lt;/strong&gt;&lt;/span&gt;&lt;/strong&gt;：&lt;a href="http://wiki.netbeans.org/NewAndNoteWorthy"&gt;http://wiki.netbeans.org/NewAndNoteWorthy&lt;/a&gt;&lt;br /&gt; &lt;br
      /&gt; &lt;br /&gt; &lt;br /&gt; &lt;img src="http://www.blogjava.net/gml520/aggbug/318507.html" height="1" width="1" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="right"&gt;&lt;a style="text-decoration: none;" href="http://www.blogjava.net/gml520/" target="_blank"&gt;日月雨林@gmail.com&lt;/a&gt; 2010-04-16 13:22 &lt;a style="text-decoration: none;" href="http://www.blogjava.net/gml520/archive/2010/04/16/318507.html#Feedback" target="_blank"&gt;发表评论&lt;/a&gt;&lt;/div&gt;</description>
      <pubDate>Fri, 16 Apr 2010 05:22:00 +0000</pubDate>
    </item>
    <item>
      <title>BlogJava-何以解忧？唯有Java: 解决ubuntu10.04 Firefox3.6 Java浏览器插件不工作的问题</title>
      <guid isPermaLink="false">http://www.blogjava.net/gml520/archive/2010/03/30/316903.html</guid>
      <link>http://www.blogjava.net/gml520/archive/2010/03/30/316903.html</link>
      <description>这几天忍不住尝试了一下ubuntu10.04，感觉还不错。默认的我的显卡驱动就可以开3D 了，我的是A卡。&lt;br /&gt; 但是今天在安装java 浏览器插件的时候死活的都装不上，firefox 的插件列表里就是没有jre 插件，于是开始&lt;br /&gt; google+baidu&#160; 试了很多种的方法，走了许多的弯路都没有解决，最后在&lt;br /&gt; https://bugs.launchpad.net/ubuntu/+source/sun-java6/+bug/532174&#160;&#160; 这里找到的解决办法：&lt;br /&gt; &lt;br /&gt; &lt;div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"&gt;&lt;span style="color:
      #000000;"&gt;sudo&#160;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;update&lt;/span&gt;&lt;span style="color: #808080;"&gt;-&lt;/span&gt;&lt;span style="color: #000000;"&gt;alternatives&#160;&lt;/span&gt;&lt;span style="color: #008080;"&gt;--&lt;/span&gt;&lt;span style="color: #008080;"&gt;install&#160;/usr/lib/mozilla/plugins/mozilla-javaplugin.so&#160;mozilla-javaplugin.so&#160;/usr/lib/jvm/java-6-sun/jre/lib/i386/libnpjp2.so&#160;1&lt;/span&gt;&lt;/div&gt; &lt;br /&gt;
      只要在命令行下输入这条命令就可以了。前提是你已经安装好jre 的浏览器插件。&lt;br /&gt; &lt;br /&gt; &lt;img src="http://www.blogjava.net/gml520/aggbug/316903.html" height="1" width="1" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="right"&gt;&lt;a style="text-decoration: none;" href="http://www.blogjava.net/gml520/" target="_blank"&gt;日月雨林@gmail.com&lt;/a&gt; 2010-03-30 10:00 &lt;a style="text-decoration: none;" href="http://www.blogjava.net/gml520/archive/2010/03/30/316903.html#Feedback"
      target="_blank"&gt;发表评论&lt;/a&gt;&lt;/div&gt;</description>
      <pubDate>Tue, 30 Mar 2010 02:00:00 +0000</pubDate>
    </item>
    <item>
      <title>BlogJava-何以解忧？唯有Java: NetBeans 6.9 可以将 NetBeans RCP 程序打包成 exe，sh，zip等格式发布</title>
      <guid isPermaLink="false">http://www.blogjava.net/gml520/archive/2010/03/09/314925.html</guid>
      <link>http://www.blogjava.net/gml520/archive/2010/03/09/314925.html</link>
      <description>NetBeans 6.9 最新进展：&lt;br /&gt; &lt;br /&gt; 1. 已经可以支持OSGI 开发&lt;br /&gt; &lt;br /&gt; &lt;img src="http://www.blogjava.net/images/blogjava_net/gml520/nb692.png" alt="" height="212" width="413" /&gt;&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; &lt;img src="http://wiki.netbeans.org/wiki/images/0/0f/Maven-69m1-new-archetypes.png" alt="" /&gt;&lt;br /&gt; &lt;br /&gt; 2. NetBeans 6.9 可以将 NetBeans RCP 程序打包成 exe，sh，zip等格式发布 &lt;br /&gt; （消息来源：&lt;a
      href="http://blogs.sun.com/geertjan/entry/generate_a_netbeans_platform_installer"&gt;http://blogs.sun.com/geertjan/entry/generate_a_netbeans_platform_installer&lt;/a&gt;）&lt;br /&gt; &lt;br /&gt; &lt;img src="http://blogs.sun.com/geertjan/resource/nb-installer-69-1.png" alt="" /&gt;&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; &lt;img src="http://blogs.sun.com/geertjan/resource/nb-installer-69-3.png" alt="" /&gt;&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; &lt;img
      src="http://blogs.sun.com/geertjan/resource/nb-installer-69-4.png" alt="" /&gt;&lt;br /&gt; &lt;br /&gt; 3. Netbeans 6.9 中 woodstock 重新回来了，意味着NetBeans 默认又可以可视化开发了。&lt;br /&gt; （该消息未验证，消息来源：&lt;a href="http://netbeansboy.com/2010/03/08/netbeans-6-9-woodstock-is-back/"&gt;http://netbeansboy.com/2010/03/08/netbeans-6-9-woodstock-is-back/&lt;/a&gt;）&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; &lt;br /&gt; &lt;img src="http://www.blogjava.net/gml520/aggbug/314925.html" height="1" width="1" /&gt;&lt;br
      /&gt;&lt;br /&gt;&lt;div align="right"&gt;&lt;a style="text-decoration: none;" href="http://www.blogjava.net/gml520/" target="_blank"&gt;日月雨林@gmail.com&lt;/a&gt; 2010-03-09 11:35 &lt;a style="text-decoration: none;" href="http://www.blogjava.net/gml520/archive/2010/03/09/314925.html#Feedback" target="_blank"&gt;发表评论&lt;/a&gt;&lt;/div&gt;</description>
      <pubDate>Tue, 09 Mar 2010 03:35:00 +0000</pubDate>
    </item>
    <item>
      <title>BlogJava-何以解忧？唯有Java: NetBeans 6.8 Java Editor Reference Guid</title>
      <guid isPermaLink="false">http://www.blogjava.net/gml520/archive/2010/03/06/314711.html</guid>
      <link>http://www.blogjava.net/gml520/archive/2010/03/06/314711.html</link>
      <description>摘要: &lt;br /&gt;下面是来自Dzone 的一篇关于 NetBeans 6.8 Java Editor Reference Guid 文章介绍了NetBeans 6.8 核心的编辑器特性。 &lt;br /&gt; &lt;br /&gt;地址：http://netbeans.dzone.com/nb-java-editor-ref &lt;br /&gt;&#160;&#160;&lt;a href="http://www.blogjava.net/gml520/archive/2010/03/06/314711.html"&gt;阅读全文&lt;/a&gt;&lt;img src="http://www.blogjava.net/gml520/aggbug/314711.html" height="1" width="1" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="right"&gt;&lt;a style="text-decoration: none;"
      href="http://www.blogjava.net/gml520/" target="_blank"&gt;日月雨林@gmail.com&lt;/a&gt; 2010-03-06 21:01 &lt;a style="text-decoration: none;" href="http://www.blogjava.net/gml520/archive/2010/03/06/314711.html#Feedback" target="_blank"&gt;发表评论&lt;/a&gt;&lt;/div&gt;</description>
      <pubDate>Sat, 06 Mar 2010 13:01:00 +0000</pubDate>
    </item>
    <item>
      <title>BlogJava-何以解忧？唯有Java: 对YOYOPlayer 的一点小小改进</title>
      <guid isPermaLink="false">http://www.blogjava.net/gml520/archive/2010/02/02/311706.html</guid>
      <link>http://www.blogjava.net/gml520/archive/2010/02/02/311706.html</link>
      <description>其实也没什么，就是YOYOPlayer 默认的界面 播放列表里的 JSplitPane 使用的是系统提供的默认皮肤（在Java中提供的几个平台中的一个）。但是如果碰到Java不支持的桌面环境，界面就很难看了，于是就在网上找了点代码，学习了一下如何自定义一些组件，更改了YOYOPlayer默认界面中的那条白色的“竖条” ，如下图所示：&lt;br /&gt; &lt;br /&gt; &#160;&lt;img src="http://www.blogjava.net/images/blogjava_net/gml520/yoyo2.png" alt="" height="464" width="569" /&gt;&lt;br /&gt; &lt;br /&gt; 改进后的界面：（整体感觉是不是更好了点?&lt;img src="http://www.blogjava.net/CuteSoft_Client/CuteEditor/images/emsmilep.gif" alt="" border="0" align="absmiddle" /&gt;）&lt;br
      /&gt; &lt;br /&gt; &lt;img src="http://www.blogjava.net/images/blogjava_net/gml520/yoyo.png" alt="" height="465" width="571" /&gt;&lt;br /&gt; &lt;br /&gt; 原理其实就是写个类 继承 BasicSplitPaneDivider，然后写个 UI类继承 BasicSplitPaneUI ，&lt;br /&gt; &lt;br /&gt; 在继承BasicSplitPaneUI 的类中，需要重写下面的方法：&lt;br /&gt; &lt;br /&gt; &lt;strong&gt;&#160;public BasicSplitPaneDivider createDefaultDivider() {&lt;br /&gt; &#160;&#160;&#160;&#160;&#160;&#160;&#160; &lt;br /&gt; &#160;&#160;&#160; }&lt;br /&gt; &lt;/strong&gt;&lt;br
      /&gt; 最后写完以后，在代码中调用JSplitPane 的setUI() 方法就可以了。&lt;br /&gt; &lt;br /&gt; 最后在上一张完整无处理的图片：&lt;br /&gt; &lt;br /&gt; &lt;img src="http://www.blogjava.net/images/blogjava_net/gml520/yoyo3.png" alt="" height="466" width="570" /&gt;&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; &lt;br /&gt; &lt;img src="http://www.blogjava.net/gml520/aggbug/311706.html" height="1" width="1" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="right"&gt;&lt;a style="text-decoration: none;" href="http://www.blogjava.net/gml520/"
      target="_blank"&gt;日月雨林@gmail.com&lt;/a&gt; 2010-02-02 17:38 &lt;a style="text-decoration: none;" href="http://www.blogjava.net/gml520/archive/2010/02/02/311706.html#Feedback" target="_blank"&gt;发表评论&lt;/a&gt;&lt;/div&gt;</description>
      <pubDate>Tue, 02 Feb 2010 09:38:00 +0000</pubDate>
    </item>
    <item>
      <title>BlogJava-Java桌面技术-随笔分类-NetBeans: JDK6 update18发布</title>
      <guid isPermaLink="false">http://www.blogjava.net/javagui/archive/2010/01/14/309402.html</guid>
      <link>http://www.blogjava.net/javagui/archive/2010/01/14/309402.html</link>
      <description>摘要: JDK6 update18发布了，这次更新包含了许多值得关注的新特性以及性能的提升&#160;&#160;&lt;a href="http://www.blogjava.net/javagui/archive/2010/01/14/309402.html"&gt;阅读全文&lt;/a&gt;&lt;img src="http://www.blogjava.net/javagui/aggbug/309402.html" height="1" width="1" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="right"&gt;&lt;a style="text-decoration: none;" href="http://www.blogjava.net/javagui/" target="_blank"&gt;sun_java_studio@yahoo.com.cn(电玩)&lt;/a&gt; 2010-01-14 09:31 &lt;a style="text-decoration: none;"
      href="http://www.blogjava.net/javagui/archive/2010/01/14/309402.html#Feedback" target="_blank"&gt;发表评论&lt;/a&gt;&lt;/div&gt;</description>
      <pubDate>Thu, 14 Jan 2010 01:31:00 +0000</pubDate>
    </item>
    <item>
      <title>BlogJava-何以解忧？唯有Java: 写了一个快速搜索blogjava首页文章的NetBeans插件</title>
      <guid isPermaLink="false">http://www.blogjava.net/gml520/archive/2010/01/09/308872.html</guid>
      <link>http://www.blogjava.net/gml520/archive/2010/01/09/308872.html</link>
      <description>摘要: 断断续续的学习NetBeans RCP 开发有一段时间了，也用NetBeans RCP开发了一个内部项目，在学习的过程中发现NetBeans真的很强大。 如果大家想学习NetBeans RCP开发的话，官方网站上的入门教程建议大家多看看，还有就是NetBeans Top10 API视频教程。官方网站上的NetBeans platform 教程有部分已经翻译成中文了，中文教程还在陆续的翻译中。 &lt;br /&gt;在学习的过程中，在NetBeans 官方网站上看到一篇关于NetBeans 快速搜索API使用教程，于是模仿着写了这个插件。这个插件功能比较弱，只能搜索到blogjava首页上的文章。有需要的可以拿去用用，开发的时候我用的是NetBeans6.8 。 &lt;br /&gt;&#160;&#160;&lt;a href="http://www.blogjava.net/gml520/archive/2010/01/09/308872.html"&gt;阅读全文&lt;/a&gt;&lt;img
      src="http://www.blogjava.net/gml520/aggbug/308872.html" height="1" width="1" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="right"&gt;&lt;a style="text-decoration: none;" href="http://www.blogjava.net/gml520/" target="_blank"&gt;日月雨林@gmail.com&lt;/a&gt; 2010-01-09 22:10 &lt;a style="text-decoration: none;" href="http://www.blogjava.net/gml520/archive/2010/01/09/308872.html#Feedback" target="_blank"&gt;发表评论&lt;/a&gt;&lt;/div&gt;</description>
      <pubDate>Sat, 09 Jan 2010 14:10:00 +0000</pubDate>
    </item>
    <item>
      <title>BlogJava-何以解忧？唯有Java: JavaFX Designer for NetBeans6.8 即将到来</title>
      <guid isPermaLink="false">http://www.blogjava.net/gml520/archive/2009/12/12/305717.html</guid>
      <link>http://www.blogjava.net/gml520/archive/2009/12/12/305717.html</link>
      <description>摘要: JavaFX 设计器很快就要发布了， JavaFX 一直被人诟病没有可视化的设计器，现在终于有了。 &lt;br /&gt; &lt;br /&gt;大家可以到 netbeans 的wiki上看看 这个设计器的教程，了解这个设计器更多的特性。 &lt;br /&gt; &lt;br /&gt;http://wiki.netbeans.org/JavaFXComposer &lt;br /&gt; &lt;br /&gt;大家还可以关注一下这个人的博客，了解JavaFX 设计器。 &lt;br /&gt; &lt;br /&gt;http://blogs.sun.com/lukas/ &lt;br /&gt; &lt;br /&gt;废话不多说了，先睹为快：&#160;&#160;&lt;a href="http://www.blogjava.net/gml520/archive/2009/12/12/305717.html"&gt;阅读全文&lt;/a&gt;&lt;img
      src="http://www.blogjava.net/gml520/aggbug/305717.html" height="1" width="1" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="right"&gt;&lt;a style="text-decoration: none;" href="http://www.blogjava.net/gml520/" target="_blank"&gt;日月雨林@gmail.com&lt;/a&gt; 2009-12-12 15:52 &lt;a style="text-decoration: none;" href="http://www.blogjava.net/gml520/archive/2009/12/12/305717.html#Feedback" target="_blank"&gt;发表评论&lt;/a&gt;&lt;/div&gt;</description>
      <pubDate>Sat, 12 Dec 2009 07:52:00 +0000</pubDate>
    </item>
    <item>
      <title>Some reminiscences, some memories » NetBeans: Netbeans 6.8 发布，首先需要解决的小bug</title>
      <guid isPermaLink="false">http://www.mikespook.com/?p=441</guid>
      <link>http://www.mikespook.com/index.php/archives/441</link>
      <description>&lt;p&gt;Oracle 对 Sun 的收购，还未真正尘埃落定，坊间就流言四起……Netbeans 6.8 的发布，无疑增强了大家对 Netbeans 在带着神谕的阳光下生存下去的信心。于是，还未上班前，趁着大家吃早餐的时间全速下回来了最新的 Netbeeans 6.8 的 j2se 开发版本。赏玩一番……&lt;/p&gt; &lt;p&gt;本来呢，由于工作的原因，Netbeans 我会用来做 PHP、C 的开发（无奈 python 插件还有许多 bug，python 的开发已经迁移到 pyDev 了），java 本身只是做做作业，随便玩以下的。但是完整的 Netbeans 版本体积直逼 Eclipse，下载起来实在让人心焦，所以就按照以往的习惯，下一基本的版本，再安装插件。&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.mikespook.com/wp-content/uploads/2009/12/netbeans-6.8-splash.png"&gt;&lt;img
      src="http://www.mikespook.com/wp-content/uploads/2009/12/netbeans-6.8-splash.png" title="netbeans-6.8-splash" height="297" width="472" alt="netbeans-6.8-splash" class="alignnone size-full wp-image-442" /&gt;&lt;/a&gt;&lt;span id="more-441"&gt;&lt;/span&gt;新的启动闪屏还是很有感觉的，貌似，能提高编码的兴趣……我是瞎说的……&lt;/p&gt; &lt;p&gt;菜单中文字体过小的这个缺陷看来还没有被修正。或许 Netbeans 的开发人员不觉得菜单字太小是个麻烦吧。&lt;/p&gt; &lt;p&gt;打开了“工具-&gt;插件-&gt;可用插件”准备安装 PHP、Python、C/C++ 的支持插件。这时发现不对了，插件怎么这么少？只有 21 个？看错了？Bug？搜索了以下，PHP 插件只有“Selenuim Module for
      PHP”这个 beta 版的插件。正式版的 PHP 插件没有了。Python 这个 Beta 版的插件有。C/C++ 支持这个正式的插件没有。&lt;/p&gt; &lt;p&gt;这实在太诡异了……是不是插件目录加载不完全？点击“重新装入目录”让 Netbeans 重新加载下插件目录，这时出问题了：&lt;a href="http://www.mikespook.com/wp-content/uploads/2009/12/netbeans-6.8-warning.png"&gt;&lt;img src="http://www.mikespook.com/wp-content/uploads/2009/12/netbeans-6.8-warning.png" title="netbeans-6.8-warning" height="370" width="422" alt="netbeans-6.8-warning" class="alignnone size-full wp-image-443" /&gt;&lt;/a&gt;&lt;/p&gt;
      &lt;p&gt;居然提示我无法连接……难道是给墙了？在浏览器里打开 Netbeans 默认的更新地址：&lt;a href="http://dlc.sun.com.edgesuite.net/netbeans/updates/6.8/uc/final/stable/catalog_zh_CN.xml.gz" target="_blank"&gt;http://dlc.sun.com.edgesuite.net/netbeans/updates/6.8/uc/final/stable/catalog_zh_CN.xml.gz&lt;/a&gt;，404 错误，原来是插件目录文件不存在。&lt;/p&gt; &lt;p&gt;访问 &lt;a href="http://dlc.sun.com.edgesuite.net/netbeans/updates/6.8/uc/final/stable/" target="_blank"&gt;http://dlc.sun.com.edgesuite.net/netbeans/updates/6.8/uc/final/stable/&lt;/a&gt;
      得到插件目录文件 &lt;a href="http://dlc.sun.com.edgesuite.net/netbeans/updates/6.8/uc/final/stable/catalog.xml.gz" target="_blank"&gt;http://dlc.sun.com.edgesuite.net/netbeans/updates/6.8/uc/final/stable/catalog.xml.gz&lt;/a&gt;，通过“工具-&gt;插件-&gt;设置”添加这个插件目录作为更新中心的源。删除原来不存在的更新中心。PHP、C/C++ 的插件再次出现在可安装的插件列表里。&lt;/p&gt; &lt;p&gt;看来是多语言包出的问题啊！&lt;/p&gt; &lt;p&gt;跟进：&lt;a href="https://netbeans.org/bugzilla/show_bug.cgi?id=178459" target="_blank"&gt;https://netbeans.org/bugzilla/show_bug.cgi?id=178459&lt;/a&gt;
      原来，更新中心的文件是对的，但是他们忘记发布了。&lt;/p&gt;</description>
      <pubDate>Fri, 11 Dec 2009 03:02:14 +0000</pubDate>
    </item>
    <item>
      <title>BlogJava-何以解忧？唯有Java: NetBeans6.8 &amp;&amp;JavaEE 6 &amp;&amp; GlassFish v3 正式发布了！</title>
      <guid isPermaLink="false">http://www.blogjava.net/gml520/archive/2009/12/11/305525.html</guid>
      <link>http://www.blogjava.net/gml520/archive/2009/12/11/305525.html</link>
      <description>摘要: 经过漫长的等待，NetBeans6.8 &amp;amp;&amp;amp;JavaEE 6 &amp;amp;&amp;amp; GlassFish v3 终于发布了！ &lt;br /&gt; &lt;br /&gt; NetBeans 6.8 一个你不可错过的版本。不仅功能上改进了非常多，性能上更是提升了不少。 &lt;br /&gt; &lt;br /&gt; NetBeans 6.8 的功能具体介绍：http://wiki.netbeans.org/NewAndNoteWorthy &lt;br /&gt; &lt;br /&gt; NetBeans 6.8 视频教程 http://netbeans.org/kb/docs/intro-screencasts.html &lt;br /&gt;&#160;&#160;&lt;a href="http://www.blogjava.net/gml520/archive/2009/12/11/305525.html"&gt;阅读全文&lt;/a&gt;&lt;img
      src="http://www.blogjava.net/gml520/aggbug/305525.html" height="1" width="1" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="right"&gt;&lt;a style="text-decoration: none;" href="http://www.blogjava.net/gml520/" target="_blank"&gt;日月雨林@gmail.com&lt;/a&gt; 2009-12-11 10:50 &lt;a style="text-decoration: none;" href="http://www.blogjava.net/gml520/archive/2009/12/11/305525.html#Feedback" target="_blank"&gt;发表评论&lt;/a&gt;&lt;/div&gt;</description>
      <pubDate>Fri, 11 Dec 2009 02:50:00 +0000</pubDate>
    </item>
    <item>
      <title>BlogJava-Java桌面技术-随笔分类-NetBeans: NetBeans6.8发布了</title>
      <guid isPermaLink="false">http://www.blogjava.net/javagui/archive/2009/12/11/305509.html</guid>
      <link>http://www.blogjava.net/javagui/archive/2009/12/11/305509.html</link>
      <description>摘要: NetBeans6.8正式发布，同时符合Java EE6规范的GlassFishV3也放出了正式版本。&#160;&#160;&lt;a href="http://www.blogjava.net/javagui/archive/2009/12/11/305509.html"&gt;阅读全文&lt;/a&gt;&lt;img src="http://www.blogjava.net/javagui/aggbug/305509.html" height="1" width="1" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="right"&gt;&lt;a style="text-decoration: none;" href="http://www.blogjava.net/javagui/" target="_blank"&gt;sun_java_studio@yahoo.com.cn(电玩)&lt;/a&gt; 2009-12-11 09:55 &lt;a style="text-decoration: none;"
      href="http://www.blogjava.net/javagui/archive/2009/12/11/305509.html#Feedback" target="_blank"&gt;发表评论&lt;/a&gt;&lt;/div&gt;</description>
      <pubDate>Fri, 11 Dec 2009 01:55:00 +0000</pubDate>
    </item>
    <item>
      <title>BlogJava-何以解忧？唯有Java: 百度的文档分享平台 vs Google Book vs 豆瓣</title>
      <guid isPermaLink="false">http://www.blogjava.net/gml520/archive/2009/12/08/305131.html</guid>
      <link>http://www.blogjava.net/gml520/archive/2009/12/08/305131.html</link>
      <description>&lt;br /&gt; 今天邮箱里收到一封邮件，说是有一份文档与我分享，于是点了链接，跳出来的却是百度的文档分享平台，看了一下界面，和豆瓣，Google 的&lt;br /&gt; 文档显示界面基本上都是一样的，都是用Flex做的，到现在我才知道，原来百度 也开始涉水 文档服务了，就像Google book类似，不过听说最近&lt;br /&gt; Google book 官司不断，不知道百度会如何应对将来发生的 图书纠纷呢？&lt;br /&gt; &lt;br /&gt; &lt;img src="http://www.blogjava.net/images/blogjava_net/gml520/result4.png" alt="" height="719" width="998" /&gt;&lt;br /&gt; &lt;br /&gt; &lt;img src="http://www.blogjava.net/gml520/aggbug/305131.html" height="1" width="1" /&gt;&lt;br /&gt;&lt;br
      /&gt;&lt;div align="right"&gt;&lt;a style="text-decoration: none;" href="http://www.blogjava.net/gml520/" target="_blank"&gt;日月雨林@gmail.com&lt;/a&gt; 2009-12-08 11:37 &lt;a style="text-decoration: none;" href="http://www.blogjava.net/gml520/archive/2009/12/08/305131.html#Feedback" target="_blank"&gt;发表评论&lt;/a&gt;&lt;/div&gt;</description>
      <pubDate>Tue, 08 Dec 2009 03:37:00 +0000</pubDate>
    </item>
    <item>
      <title>BlogJava-何以解忧？唯有Java: JXTaskPane 示例</title>
      <guid isPermaLink="false">http://www.blogjava.net/gml520/archive/2009/11/27/303951.html</guid>
      <link>http://www.blogjava.net/gml520/archive/2009/11/27/303951.html</link>
      <description>JXTaskPane 类似XP 左边的导航栏，在开发Swing应用的时候很好用的。&lt;br /&gt; &lt;br /&gt; 下面两张截图反应了JXTaskPane的动画效果。可以自由的卷起和展开。&lt;br /&gt; &lt;br /&gt; &lt;img src="http://www.blogjava.net/images/blogjava_net/gml520/Screenshot-JXTaskPane.png" alt="" height="384" width="302" /&gt;&#160;&#160; &lt;img src="http://www.blogjava.net/images/blogjava_net/gml520/Screenshot-JXTaskPane2.png" alt="" height="384" width="302" /&gt;&lt;br /&gt; &lt;br /&gt; JXTaskPane的的使用步骤：&lt;br /&gt; &lt;br /&gt; 1、新建一个
      JXTaskPaneContainer &lt;br /&gt; &lt;br /&gt; 2、新建{i}个JXTaskPane&#160;&#160; （i&gt;=1）&lt;br /&gt; &lt;br /&gt; 3、依次将 新建的JXTaskPane 添加到 JXTaskPaneContainer 中去。&lt;br /&gt; &lt;br /&gt; 4、最后将 JXTaskPaneContainer 添加到JFrame 中。&lt;br /&gt; &lt;br /&gt; 附上 SwingX doc中的示例代码&lt;br /&gt; &lt;br /&gt; &lt;div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt; &lt;span style="font-size:
      12pt;"&gt;&lt;span style="color: #000000;"&gt;&#160;JXFrame&#160;frame&#160;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&#160;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&#160;JXFrame();&lt;br /&gt; &#160;&lt;br /&gt; &#160;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color:
      #008000;"&gt;&#160;a&#160;container&#160;to&#160;put&#160;all&#160;JXTaskPane&#160;together&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;&#160;JXTaskPaneContainer&#160;taskPaneContainer&#160;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&#160;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&#160;JXTaskPaneContainer();&lt;br /&gt;
      &#160;&lt;br /&gt; &#160;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&#160;create&#160;a&#160;first&#160;taskPane&#160;with&#160;common&#160;actions&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;&#160;JXTaskPane&#160;actionPane&#160;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&#160;&lt;/span&gt;&lt;span style="color:
      #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&#160;JXTaskPane();&lt;br /&gt; &#160;actionPane.setTitle(&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;Files&#160;and&#160;Folders&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt; &#160;actionPane.setSpecial(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br
      /&gt; &#160;&lt;br /&gt; &#160;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&#160;actions&#160;can&#160;be&#160;added,&#160;a&#160;hyperlink&#160;will&#160;be&#160;created&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;&#160;Action&#160;renameSelectedFile&#160;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color:
      #000000;"&gt;&#160;createRenameFileAction();&lt;br /&gt; &#160;actionPane.add(renameSelectedFile);&lt;br /&gt; &#160;actionPane.add(createDeleteFileAction());&lt;br /&gt; &#160;&lt;br /&gt; &#160;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&#160;add&#160;this&#160;taskPane&#160;to&#160;the&#160;taskPaneContainer&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt; &lt;/span&gt;&lt;span style="color:
      #000000;"&gt;&#160;taskPaneContainer.add(actionPane);&lt;br /&gt; &#160;&lt;br /&gt; &#160;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&#160;create&#160;another&#160;taskPane,&#160;it&#160;will&#160;show&#160;details&#160;of&#160;the&#160;selected&#160;file&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;&#160;JXTaskPane&#160;details&#160;&lt;/span&gt;&lt;span style="color:
      #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&#160;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&#160;JXTaskPane();&lt;br /&gt; &#160;details.setTitle(&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;Details&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt; &#160;&#160;&lt;br /&gt; &#160;&lt;/span&gt;&lt;span
      style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&#160;add&#160;standard&#160;components&#160;to&#160;the&#160;details&#160;taskPane&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;&#160;JLabel&#160;searchLabel&#160;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&#160;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color:
      #000000;"&gt;&#160;JLabel(&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;Search:&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt; &#160;JTextField&#160;searchField&#160;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&#160;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color:
      #000000;"&gt;&#160;JTextField(&lt;/span&gt;&lt;span style="color: #000000;"&gt;""&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt; &#160;details.add(searchLabel);&lt;br /&gt; &#160;details.add(searchField);&lt;br /&gt; &#160;&lt;br /&gt; &#160;taskPaneContainer.add(details);&lt;br /&gt; &#160;&lt;br /&gt; &#160;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color:
      #008000;"&gt;&#160;put&#160;the&#160;action&#160;list&#160;on&#160;the&#160;left&#160;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;&#160;frame.add(taskPaneContainer,&#160;BorderLayout.EAST);&lt;br /&gt; &#160;&lt;br /&gt; &#160;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&#160;and&#160;a&#160;file&#160;browser&#160;in&#160;the&#160;middle&lt;/span&gt;&lt;span style="color:
      #008000;"&gt;&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;&#160;frame.add(fileBrowser,&#160;BorderLayout.CENTER);&lt;br /&gt; &#160;&lt;br /&gt; &#160;frame.pack();&lt;br /&gt; &#160;frame.setVisible(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt; &lt;/span&gt;&lt;/div&gt; &lt;span style="color: red;"&gt;&lt;br /&gt; 默认JXTaskPane
      的动画功能是起用的，你也可以关闭 ：&lt;br /&gt; &lt;br /&gt; 只要 myJXTaskPane.setAnimated(false);&#160; 就可以了。&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; &lt;/span&gt;&lt;br /&gt; &lt;img src="http://www.blogjava.net/gml520/aggbug/303951.html" height="1" width="1" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="right"&gt;&lt;a style="text-decoration: none;" href="http://www.blogjava.net/gml520/" target="_blank"&gt;日月雨林@gmail.com&lt;/a&gt; 2009-11-27 17:47 &lt;a style="text-decoration: none;"
      href="http://www.blogjava.net/gml520/archive/2009/11/27/303951.html#Feedback" target="_blank"&gt;发表评论&lt;/a&gt;&lt;/div&gt;</description>
      <pubDate>Fri, 27 Nov 2009 09:47:00 +0000</pubDate>
    </item>
    <item>
      <title>BlogJava-何以解忧？唯有Java: Fedora 11 3D环境下启动 永中Office</title>
      <guid isPermaLink="false">http://www.blogjava.net/gml520/archive/2009/11/25/303640.html</guid>
      <link>http://www.blogjava.net/gml520/archive/2009/11/25/303640.html</link>
      <description>摘要: Linux 下永中Office 对 doc 文件的兼容性比较好，所以在Linux 我用的最多的office 软件就是永中Office。 &lt;br /&gt;最近操作系统换成了 Fedora 11，安装永中Office 的时候遇到了一些问题，现在把我遇到的问题和解决办法 &lt;br /&gt;写下： &lt;br /&gt;第一个问题： 在 3D环境下不能安装 永中Office &lt;br /&gt;解决：关闭3D效果，然后再安装永中Office ，OK。 &lt;br /&gt; &lt;br /&gt;第二个问题： 在正常模式下可以很快的启动永中Office，但是在3D模式下就启动不了。 &lt;br /&gt;解决：请安下面的步骤进行&#160;&#160;&lt;a href="http://www.blogjava.net/gml520/archive/2009/11/25/303640.html"&gt;阅读全文&lt;/a&gt;&lt;img
      src="http://www.blogjava.net/gml520/aggbug/303640.html" height="1" width="1" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="right"&gt;&lt;a style="text-decoration: none;" href="http://www.blogjava.net/gml520/" target="_blank"&gt;日月雨林@gmail.com&lt;/a&gt; 2009-11-25 15:41 &lt;a style="text-decoration: none;" href="http://www.blogjava.net/gml520/archive/2009/11/25/303640.html#Feedback" target="_blank"&gt;发表评论&lt;/a&gt;&lt;/div&gt;</description>
      <pubDate>Wed, 25 Nov 2009 07:41:00 +0000</pubDate>
    </item>
    <item>
      <title>Some reminiscences, some memories » NetBeans: Netbeans Python 调试，郁闷的包导入问题</title>
      <guid isPermaLink="false">http://www.mikespook.com/?p=419</guid>
      <link>http://www.mikespook.com/index.php/archives/419</link>
      <description>&lt;p&gt;这几天在帮忙开发一个 python 项目。使用 netbeans 的时候，遇到一个诡异的问题。&lt;/p&gt; &lt;p&gt;如果使用“运行”来跑项目，一切正常。而如果使用“调试”来跑项目，当执行到 import 第三方的库的时候，就会产生“ImportError: No module named xxxx”。郁闷不已，上网查了半天，没找到可用的信息。&lt;/p&gt; &lt;p&gt;毛主席教育我们“自己动手，丰衣足食”。于是就祭出“观察、归纳和总结”的科学的研究方法，对这个灵异现象进行了一番探索。&lt;span id="more-419"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;出现导入问题的包都是用了 egg 打包的第三方包。在我的系统中，这几个包都是放在/usr/local/lib/python2.6/dist-packages/下。在命令行能正常执行，在 netbeans 中直接执行也无异常。说明包本身的安装没有问题。那么 netbeans 调试就出现找不到这个包，是不是 netbeans
      的调试环境有什么特殊呢？看了一下 netbeans 的调试窗口，发现这个脚本~/.netbeans/6.7/config/nbPython/debug/nbpythondebug/jpydaemon.py。很明显，这个是 netbeans 为了集成调试功能而开发的一个 python 调试器。难道是这个netbeans自带的调试器的问题？祭出 sys.path 一看，果然正常执行的时候，dist-packages 下的 egg 包都被放到搜索路径里。而调试的时候，没有一个 egg 包在 sys.path 中。而是多了一些 netbeans 使用的目录而已。&lt;/p&gt; &lt;p&gt;郁闷啊，为什么调试器不能直接继承系统环境呢？&lt;/p&gt; &lt;p&gt;于是乎，将每个 egg 包都手工加入 Python Platforms 的 Python Path 里。问题解决了。可以带第三方 egg 包来调试项目了。&lt;/p&gt; &lt;p&gt;虽然问题解决了，不过还是不爽，如果我一个项目要是有 n 个 egg 包，那不是要每个都设置一下？&lt;/p&gt;
      &lt;p&gt;Hacking……&lt;/p&gt; &lt;p&gt;发现 jpydaemon.py 的 1588 行修改了sys.path，导致默认的路径信息丢失。&lt;/p&gt; &lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre style="font-family: monospace;" class="python"&gt;pythonPath = dbgutils.&lt;span style="color: black;"&gt;PythonPathHandler&lt;/span&gt;&lt;span style="color: black;"&gt;(&lt;/span&gt;&lt;span style="color: #008000;"&gt;None&lt;/span&gt;&lt;span style="color: black;"&gt;)&lt;/span&gt; pythonPath.&lt;span style="color:
      black;"&gt;getPyPathFromEnv&lt;/span&gt;&lt;span style="color: black;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt; &lt;p&gt;再检查 dbgutils.py ，原来 netbeans 的调试环境只读取了环境变量 PYTHONPATH，未添加默认的 sys.path。而我并没有使用 PYTHONPATH 环境变量，所以导致一些安装好的包无法导入。164 行直接覆盖了 sys.path。&lt;/p&gt; &lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre style="font-family: monospace;" class="python"&gt; &lt;span style="color: #ff7700; font-weight:
      bold;"&gt;def&lt;/span&gt; getPyPathFromEnv&lt;span style="color: black;"&gt;(&lt;/span&gt; &lt;span style="color: #008000;"&gt;self&lt;/span&gt; &lt;span style="color: black;"&gt;)&lt;/span&gt;: &lt;span style="color: #483d8b;"&gt;"PYTHONPATH env and set sys.path out of it "&lt;/span&gt; pyPath = &lt;span style="color: #dc143c;"&gt;os&lt;/span&gt;.&lt;span style="color: black;"&gt;environ&lt;/span&gt;&lt;span style="color: black;"&gt;[&lt;/span&gt;&lt;span style="color:
      #483d8b;"&gt;"PYTHONPATH"&lt;/span&gt;&lt;span style="color: black;"&gt;]&lt;/span&gt; &lt;span style="color: #808080; font-style: italic;"&gt;# cleanly take care of previous ';' convention&lt;/span&gt; &lt;span style="color: #ff7700; font-weight: bold;"&gt;if&lt;/span&gt; &lt;span style="color: #dc143c;"&gt;os&lt;/span&gt;.&lt;span style="color: black;"&gt;pathsep&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;!&lt;/span&gt;= &lt;span style="color: #483d8b;"&gt;';'&lt;/span&gt;: pyPath.&lt;span
      style="color: black;"&gt;replace&lt;/span&gt;&lt;span style="color: black;"&gt;(&lt;/span&gt;&lt;span style="color: #483d8b;"&gt;';'&lt;/span&gt; , &lt;span style="color: #dc143c;"&gt;os&lt;/span&gt;.&lt;span style="color: black;"&gt;pathsep&lt;/span&gt;&lt;span style="color: black;"&gt;)&lt;/span&gt; &lt;span style="color: #ff7700; font-weight: bold;"&gt;if&lt;/span&gt; pyPath.&lt;span style="color: black;"&gt;find&lt;/span&gt;&lt;span style="color: black;"&gt;(&lt;/span&gt;&lt;span style="color:
      #dc143c;"&gt;os&lt;/span&gt;.&lt;span style="color: black;"&gt;pathsep&lt;/span&gt;&lt;span style="color: black;"&gt;)&lt;/span&gt; &lt;span style="color: #66cc66;"&gt;!&lt;/span&gt;= -&lt;span style="color: #ff4500;"&gt;1&lt;/span&gt;: &lt;span style="color: #dc143c;"&gt;sys&lt;/span&gt;.&lt;span style="color: black;"&gt;path&lt;/span&gt; = pyPath.&lt;span style="color: black;"&gt;split&lt;/span&gt;&lt;span style="color: black;"&gt;(&lt;/span&gt;&lt;span style="color:
      #dc143c;"&gt;os&lt;/span&gt;.&lt;span style="color: black;"&gt;pathsep&lt;/span&gt;&lt;span style="color: black;"&gt;)&lt;/span&gt; &lt;span style="color: #808080; font-style: italic;"&gt;# remove empty nodes first&lt;/span&gt; &lt;span style="color: #ff7700; font-weight: bold;"&gt;for&lt;/span&gt; element &lt;span style="color: #ff7700; font-weight: bold;"&gt;in&lt;/span&gt; &lt;span style="color: #dc143c;"&gt;sys&lt;/span&gt;.&lt;span style="color: black;"&gt;path&lt;/span&gt;: &lt;span
      style="color: #ff7700; font-weight: bold;"&gt;if&lt;/span&gt; &lt;span style="color: black;"&gt;(&lt;/span&gt; &lt;span style="color: #008000;"&gt;len&lt;/span&gt;&lt;span style="color: black;"&gt;(&lt;/span&gt;element.&lt;span style="color: black;"&gt;strip&lt;/span&gt;&lt;span style="color: black;"&gt;(&lt;/span&gt;&lt;span style="color: black;"&gt;)&lt;/span&gt;&lt;span style="color: black;"&gt;)&lt;/span&gt;==&lt;span style="color: #ff4500;"&gt;0&lt;/span&gt; &lt;span style="color:
      black;"&gt;)&lt;/span&gt;: &lt;span style="color: #dc143c;"&gt;sys&lt;/span&gt;.&lt;span style="color: black;"&gt;path&lt;/span&gt;.&lt;span style="color: black;"&gt;remove&lt;/span&gt;&lt;span style="color: black;"&gt;(&lt;/span&gt;element&lt;span style="color: black;"&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt; &lt;p&gt;修改 164 行&lt;/p&gt; &lt;div class="wp_syntax"&gt;&lt;div class="code"&gt;&lt;pre style="font-family: monospace;" class="python"&gt;&lt;span style="color:
      #dc143c;"&gt;sys&lt;/span&gt;.&lt;span style="color: black;"&gt;path&lt;/span&gt; = pyPath.&lt;span style="color: black;"&gt;split&lt;/span&gt;&lt;span style="color: black;"&gt;(&lt;/span&gt;&lt;span style="color: #dc143c;"&gt;os&lt;/span&gt;.&lt;span style="color: black;"&gt;pathsep&lt;/span&gt;&lt;span style="color: black;"&gt;)&lt;/span&gt; + &lt;span style="color: #dc143c;"&gt;sys&lt;/span&gt;.&lt;span style="color: black;"&gt;path&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
      &lt;p&gt;这个世界又清爽了……&lt;/p&gt; &lt;p&gt;不知道会不会有什么问题。有问题，继续 fix 好了。&lt;/p&gt;</description>
      <pubDate>Tue, 10 Nov 2009 03:50:00 +0000</pubDate>
    </item>
    <item>
      <title>BlogJava-何以解忧？唯有Java: 翻译了一个Linux 下的 游戏管理软件 djl</title>
      <guid isPermaLink="false">http://www.blogjava.net/gml520/archive/2009/10/31/300490.html</guid>
      <link>http://www.blogjava.net/gml520/archive/2009/10/31/300490.html</link>
      <description>摘要: Linux 下的游戏没有Windows 多，而且想找游戏玩也比较麻烦，也不知道有什么游戏可以玩。 &lt;br /&gt;最近在网上看了djl 这个游戏管理软件，里面有上百个的游戏可以提供你玩。真的很不错，默认没有中文的 &lt;br /&gt;我顺手翻译了一下，翻译的不是很完整，不过够大家用的了。&#160;&#160;&lt;a href="http://www.blogjava.net/gml520/archive/2009/10/31/300490.html"&gt;阅读全文&lt;/a&gt;&lt;img src="http://www.blogjava.net/gml520/aggbug/300490.html" height="1" width="1" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="right"&gt;&lt;a style="text-decoration: none;" href="http://www.blogjava.net/gml520/"
      target="_blank"&gt;日月雨林@gmail.com&lt;/a&gt; 2009-10-31 17:00 &lt;a style="text-decoration: none;" href="http://www.blogjava.net/gml520/archive/2009/10/31/300490.html#Feedback" target="_blank"&gt;发表评论&lt;/a&gt;&lt;/div&gt;</description>
      <pubDate>Sat, 31 Oct 2009 09:00:00 +0000</pubDate>
    </item>
    <item>
      <title>BlogJava-何以解忧？唯有Java: 使用Lucene 对JTable进行搜索</title>
      <guid isPermaLink="false">http://www.blogjava.net/gml520/archive/2009/10/19/298858.html</guid>
      <link>http://www.blogjava.net/gml520/archive/2009/10/19/298858.html</link>
      <description>摘要: 经常会遇到一个表格中有许多的数据，想要找到一条符合自己要求的数据会比较麻烦，需要一条一条的找。数据量小还好，但是如果有几百条上千条的数据找起来就比较麻烦了。Lucene 提供了一个拓展包 lucene-swing，可以很方便的对JTable进行搜索。&#160;&#160;&lt;a href="http://www.blogjava.net/gml520/archive/2009/10/19/298858.html"&gt;阅读全文&lt;/a&gt;&lt;img src="http://www.blogjava.net/gml520/aggbug/298858.html" height="1" width="1" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="right"&gt;&lt;a style="text-decoration: none;" href="http://www.blogjava.net/gml520/" target="_blank"&gt;日月雨林@gmail.com&lt;/a&gt;
      2009-10-19 15:52 &lt;a style="text-decoration: none;" href="http://www.blogjava.net/gml520/archive/2009/10/19/298858.html#Feedback" target="_blank"&gt;发表评论&lt;/a&gt;&lt;/div&gt;</description>
      <pubDate>Mon, 19 Oct 2009 07:52:00 +0000</pubDate>
    </item>
    <item>
      <title>BlogJava-何以解忧？唯有Java: NetBeans 软件（代码）质量测试工具 SQE</title>
      <guid isPermaLink="false">http://www.blogjava.net/gml520/archive/2009/10/14/298182.html</guid>
      <link>http://www.blogjava.net/gml520/archive/2009/10/14/298182.html</link>
      <description>摘要: SQE 是 software quality enviroment 的缩写， NetBeans 的SQE 插件 官方的介绍是这样的： &lt;br /&gt; &lt;br /&gt;SQE is an attempt at providing first class NetBeans integration for different Software Quality Tools as &lt;br /&gt; &lt;br /&gt; * Code Defect Analysis &lt;br /&gt; o FindBugs &lt;br /&gt; o PMD &lt;br /&gt; o CheckStyle &lt;br /&gt; o Lint4j &lt;br /&gt; * Metrics &lt;br /&gt; o Dependency Finder &lt;br /&gt; * Dependency Analysis &lt;br /&gt; o Dependency Finder &lt;br /&gt; &lt;br /&gt;
      &lt;br /&gt;我把它叫做软件质量测试工具，它可以帮你找到你写的代码中潜在的问题 还会有一些建议。 &lt;br /&gt;PMD 的介绍： &lt;b&gt;&lt;a href="http://www.blogjava.net/gml520/archive/2009/10/14/298182.html"&gt;阅读全文&lt;/a&gt;&lt;img src="http://www.blogjava.net/gml520/aggbug/298182.html" height="1" width="1" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="right"&gt;&lt;a style="text-decoration: none;" href="http://www.blogjava.net/gml520/" target="_blank"&gt;日月雨林@gmail.com&lt;/a&gt; 2009-10-14 11:49 &lt;a style="text-decoration: none;"
      href="http://www.blogjava.net/gml520/archive/2009/10/14/298182.html#Feedback" target="_blank"&gt;发表评论&lt;/a&gt;&lt;/div&gt;&lt;/b&gt;</description>
      <pubDate>Wed, 14 Oct 2009 03:49:00 +0000</pubDate>
    </item>
    <item>
      <title>BlogJava-何以解忧？唯有Java: NetBeans 新的 Substance 皮肤插件！</title>
      <guid isPermaLink="false">http://www.blogjava.net/gml520/archive/2009/08/29/293082.html</guid>
      <link>http://www.blogjava.net/gml520/archive/2009/08/29/293082.html</link>
      <description>摘要: 针对NetBeans的 Substance 官方皮肤插件，已经有很长时间没有更新了，这次 NetBeans 梦之队 成员重新写了个 NetBeans的 &lt;br /&gt;Substance 皮肤插件，虽然现在的可定制性不如 官方的版本，但是官方的版本只支持 NetBeans 6.1 而这个却可以支持 &lt;br /&gt;NetBeans 6.7.1最新的版本。 &lt;br /&gt;&#160;&#160;&lt;a href="http://www.blogjava.net/gml520/archive/2009/08/29/293082.html"&gt;阅读全文&lt;/a&gt;&lt;img src="http://www.blogjava.net/gml520/aggbug/293082.html" height="1" width="1" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="right"&gt;&lt;a style="text-decoration: none;"
      href="http://www.blogjava.net/gml520/" target="_blank"&gt;日月雨林@gmail.com&lt;/a&gt; 2009-08-29 13:24 &lt;a style="text-decoration: none;" href="http://www.blogjava.net/gml520/archive/2009/08/29/293082.html#Feedback" target="_blank"&gt;发表评论&lt;/a&gt;&lt;/div&gt;</description>
      <pubDate>Sat, 29 Aug 2009 05:24:00 +0000</pubDate>
    </item>
    <item>
      <title>BlogJava-何以解忧？唯有Java: NetBeans6.8 M1发布了!添加了嵌入式浏览器支持和JavaEE6 支持</title>
      <guid isPermaLink="false">http://www.blogjava.net/gml520/archive/2009/08/04/289710.html</guid>
      <link>http://www.blogjava.net/gml520/archive/2009/08/04/289710.html</link>
      <description>摘要: NetBeans6.8 M1发布了!添加了嵌入式浏览器支持和JavaEE6 支持 ,此外还有 ruby maven, C++ 等增强特性. &lt;br /&gt;有图有真相: &lt;br /&gt;嵌入浏览器功能默认不开起,需要自己手动开启: 在 工具-&gt;选项 &lt;br /&gt;&#160;&#160;&lt;a href="http://www.blogjava.net/gml520/archive/2009/08/04/289710.html"&gt;阅读全文&lt;/a&gt;&lt;img src="http://www.blogjava.net/gml520/aggbug/289710.html" height="1" width="1" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="right"&gt;&lt;a style="text-decoration: none;" href="http://www.blogjava.net/gml520/"
      target="_blank"&gt;日月雨林@gmail.com&lt;/a&gt; 2009-08-04 09:43 &lt;a style="text-decoration: none;" href="http://www.blogjava.net/gml520/archive/2009/08/04/289710.html#Feedback" target="_blank"&gt;发表评论&lt;/a&gt;&lt;/div&gt;</description>
      <pubDate>Tue, 04 Aug 2009 01:43:00 +0000</pubDate>
    </item>
    <item>
      <title>BlogJava-Java桌面技术-随笔分类-NetBeans: 期待NetBeans6.8的发布</title>
      <guid isPermaLink="false">http://www.blogjava.net/javagui/archive/2009/07/17/287139.html</guid>
      <link>http://www.blogjava.net/javagui/archive/2009/07/17/287139.html</link>
      <description>摘要: 性能问题一向是历代NetBeans发布时的关注焦点。和发布6.7之前的情形一样，6.8版本包含很多值得自豪的改进。&#160;&#160;&lt;a href="http://www.blogjava.net/javagui/archive/2009/07/17/287139.html"&gt;阅读全文&lt;/a&gt;&lt;img src="http://www.blogjava.net/javagui/aggbug/287139.html" height="1" width="1" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="right"&gt;&lt;a style="text-decoration: none;" href="http://www.blogjava.net/javagui/" target="_blank"&gt;sun_java_studio@yahoo.com.cn(电玩)&lt;/a&gt; 2009-07-17 13:55 &lt;a style="text-decoration:
      none;" href="http://www.blogjava.net/javagui/archive/2009/07/17/287139.html#Feedback" target="_blank"&gt;发表评论&lt;/a&gt;&lt;/div&gt;</description>
      <pubDate>Fri, 17 Jul 2009 05:55:00 +0000</pubDate>
    </item>
    <item>
      <title>BlogJava-何以解忧？唯有Java: 对SwingX 做了一些国际化翻译</title>
      <guid isPermaLink="false">http://www.blogjava.net/gml520/archive/2009/07/02/285174.html</guid>
      <link>http://www.blogjava.net/gml520/archive/2009/07/02/285174.html</link>
      <description>今天用到了一些SwingX 的类库，但是显示的时候都是英文的，感觉挺别扭的，于是就对SwingX做了一些国际化！ &lt;p&gt;下载了源代码，然后找到对应的Properties 文件，发现其实SwingX已经有很多个国家的语言版本了，就是少了中国版的，唉！谁叫中国的程序员使用Swing的少呢？ 呵呵！ &lt;/p&gt; &lt;p&gt;用NetBeans打开 项目文件，找到properties文件，为每个原始的Properties文件添加一个 zh_CN的locale 。然后就是翻译了。这里不得不赞美一下NetBeans 对properties 文件的编辑功能相当的好用，可以直接写中文，而不必转换为Unicode。NetBeans 默认已经帮你完成了。&lt;/p&gt; &lt;p&gt;这是我第一次翻译，因为能力有限，所以翻译难免会有一点小毛病，有什么翻译问题请留言，或者发邮件告诉我，让我好改正。&lt;img src="http://gml520.javaeye.com/images/smiles/icon_wink.gif" alt=""
      /&gt;&lt;/p&gt; &lt;p&gt;&lt;br /&gt; &lt;/p&gt; &lt;p&gt;&lt;br /&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #ff1843;"&gt;2009-11-04 更新：&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="color: #ff1843;"&gt;翻译更新到SwingX1.6, SwingX1.6 是一个 Java 6 only 版本，也就是说这个版本需要用JRE1.6 。&lt;br /&gt; &lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;br /&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: #ff1843;"&gt;2009-09-23 更新：&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="color: #ff1843;"&gt;应朋友们的要求，今天放上来 SwingX-1.0
      的国际化版本（并非本地化，仅仅只是国际化）。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="color: #ff1843;"&gt;修复LoginPanel 翻译的问题，原来翻译成中文有乱码，现保留为英文。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="color: #ff1843;"&gt;初步判断是SwingX 中使用了不支持中文的字体造成的。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;br /&gt; &lt;/p&gt; &lt;p&gt;&lt;span style="color: red;"&gt;2009-07-07 更新:&lt;br /&gt; &#160;第一次对SwingX进行翻译&lt;/span&gt;&lt;/p&gt; &lt;br /&gt; ------------------------------传说中华丽的分割线-----------------------------------&lt;br /&gt; &lt;br
      /&gt; &lt;p&gt;&lt;a href="http://www.blogjava.net/Files/gml520/SwingX1.6.zip" title="(SwingX1.6)点这里下载（20091104）"&gt;&#160; (SwingX1.6)点这里下载（20091104）&lt;/a&gt;&lt;/p&gt; &lt;br /&gt; &lt;a href="http://www.blogjava.net/Files/gml520/SwingX-1.0.zip" title="（SwingX-1.0）点这里下载"&gt;（SwingX-1.0）点这里下载&#160;&#160; （20090923）&lt;/a&gt; &lt;p&gt; &lt;/p&gt; &lt;p&gt;&lt;a href="http://www.blogjava.net/Files/gml520/SwingX.rar"&gt;（SwingX-0.9.7）点这里下载（20090702）&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;br /&gt; &lt;/p&gt;
      &lt;br /&gt; &lt;img src="http://www.blogjava.net/gml520/aggbug/285174.html" height="1" width="1" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="right"&gt;&lt;a style="text-decoration: none;" href="http://www.blogjava.net/gml520/" target="_blank"&gt;日月雨林@gmail.com&lt;/a&gt; 2009-07-02 14:44 &lt;a style="text-decoration: none;" href="http://www.blogjava.net/gml520/archive/2009/07/02/285174.html#Feedback" target="_blank"&gt;发表评论&lt;/a&gt;&lt;/div&gt;</description>
      <pubDate>Thu, 02 Jul 2009 06:44:00 +0000</pubDate>
    </item>
    <item>
      <title>BlogJava-Java桌面技术-随笔分类-NetBeans: NetBeans6.7正式版发布了</title>
      <guid isPermaLink="false">http://www.blogjava.net/javagui/archive/2009/06/29/284676.html</guid>
      <link>http://www.blogjava.net/javagui/archive/2009/06/29/284676.html</link>
      <description>摘要: NetBeans6.7正式版发布了&#160;&#160;&lt;a href="http://www.blogjava.net/javagui/archive/2009/06/29/284676.html"&gt;阅读全文&lt;/a&gt;&lt;img src="http://www.blogjava.net/javagui/aggbug/284676.html" height="1" width="1" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="right"&gt;&lt;a style="text-decoration: none;" href="http://www.blogjava.net/javagui/" target="_blank"&gt;sun_java_studio@yahoo.com.cn(电玩)&lt;/a&gt; 2009-06-29 22:10 &lt;a style="text-decoration: none;"
      href="http://www.blogjava.net/javagui/archive/2009/06/29/284676.html#Feedback" target="_blank"&gt;发表评论&lt;/a&gt;&lt;/div&gt;</description>
      <pubDate>Mon, 29 Jun 2009 14:10:00 +0000</pubDate>
    </item>
    <item>
      <title>BlogJava-何以解忧？唯有Java: Swing 本地外观与Substance外观之间的切换问题及解决方案</title>
      <guid isPermaLink="false">http://www.blogjava.net/gml520/archive/2009/06/09/281021.html</guid>
      <link>http://www.blogjava.net/gml520/archive/2009/06/09/281021.html</link>
      <description>摘要: Swing应用程序如果是在开源的Look&amp;amp;&amp;amp;Feel 之间切换，感觉很容易，但是如果把应用程序在开源外观下切换到系统默认的或者JDK自带的外观时，问题就来了。不是没有标题栏，就是标题栏的外观没有改变，用的是系统的窗口装饰。&#160;&#160;&lt;a href="http://www.blogjava.net/gml520/archive/2009/06/09/281021.html"&gt;阅读全文&lt;/a&gt;&lt;img src="http://www.blogjava.net/gml520/aggbug/281021.html" height="1" width="1" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="right"&gt;&lt;a style="text-decoration: none;" href="http://www.blogjava.net/gml520/"
      target="_blank"&gt;日月雨林@gmail.com&lt;/a&gt; 2009-06-09 21:59 &lt;a style="text-decoration: none;" href="http://www.blogjava.net/gml520/archive/2009/06/09/281021.html#Feedback" target="_blank"&gt;发表评论&lt;/a&gt;&lt;/div&gt;</description>
      <pubDate>Tue, 09 Jun 2009 13:59:00 +0000</pubDate>
    </item>
    <item>
      <title>BlogJava-何以解忧？唯有Java: 关于本人的一些信息</title>
      <guid isPermaLink="false">http://www.blogjava.net/gml520/archive/2009/05/31/279293.html</guid>
      <link>http://www.blogjava.net/gml520/archive/2009/05/31/279293.html</link>
      <description>摘要: &#160;&#160;&lt;a href="http://www.blogjava.net/gml520/archive/2009/05/31/279293.html"&gt;阅读全文&lt;/a&gt;&lt;img src="http://www.blogjava.net/gml520/aggbug/279293.html" height="1" width="1" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="right"&gt;&lt;a style="text-decoration: none;" href="http://www.blogjava.net/gml520/" target="_blank"&gt;日月雨林@gmail.com&lt;/a&gt; 2009-05-31 22:13 &lt;a style="text-decoration: none;"
      href="http://www.blogjava.net/gml520/archive/2009/05/31/279293.html#Feedback" target="_blank"&gt;发表评论&lt;/a&gt;&lt;/div&gt;</description>
      <pubDate>Sun, 31 May 2009 14:13:00 +0000</pubDate>
    </item>
    <item>
      <title>BlogJava-Java桌面技术-随笔分类-NetBeans: JDK 1.6.0_14 发布了</title>
      <guid isPermaLink="false">http://www.blogjava.net/javagui/archive/2009/05/29/278934.html</guid>
      <link>http://www.blogjava.net/javagui/archive/2009/05/29/278934.html</link>
      <description>期待已久的JDK 1.6.0_14 发布了。&lt;a href="http://java.sun.com/javase/6/webnotes/6u14.html" title="http://java.sun.com/javase/6/webnotes/6u14.html"&gt;http://java.sun.com/javase/6/webnotes/6u14.html&lt;/a&gt;&lt;br /&gt; 本次更新是继Update 10以来最大的一次更新，包含了众多新特性和bug的修复，喜欢尝鲜的开发人员可以试试最新版本的JDK带来的益处。&lt;br /&gt; &lt;br /&gt; 需要关注的是JRE的安装界面，Sun标志的背景改为了红色，但愿Oracle能使Java更加辉煌吧。&lt;img src="file://C:/DOCUME%7E1/YITONG%7E1/LOCALS%7E1/Temp/moz-screenshot-2.jpg" alt="" /&gt;&lt;img
      src="file://C:/DOCUME%7E1/YITONG%7E1/LOCALS%7E1/Temp/moz-screenshot-3.jpg" alt="" /&gt;&lt;br /&gt; &lt;img src="http://www.blogjava.net/images/blogjava_net/javagui/u14install.jpg" alt="" height="386" width="504" /&gt;&lt;br /&gt; &lt;img src="file://C:/DOCUME%7E1/YITONG%7E1/LOCALS%7E1/Temp/moz-screenshot.jpg" alt="" /&gt;&lt;img src="file://C:/DOCUME%7E1/YITONG%7E1/LOCALS%7E1/Temp/moz-screenshot-1.jpg" alt="" /&gt; &lt;img src="http://www.blogjava.net/javagui/aggbug/278934.html" height="1" width="1"
      /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="right"&gt;&lt;a style="text-decoration: none;" href="http://www.blogjava.net/javagui/" target="_blank"&gt;sun_java_studio@yahoo.com.cn(电玩)&lt;/a&gt; 2009-05-29 18:54 &lt;a style="text-decoration: none;" href="http://www.blogjava.net/javagui/archive/2009/05/29/278934.html#Feedback" target="_blank"&gt;发表评论&lt;/a&gt;&lt;/div&gt;</description>
      <pubDate>Fri, 29 May 2009 10:54:00 +0000</pubDate>
    </item>
    <item>
      <title>BlogJava-何以解忧？唯有Java: 用开源Look&amp;Feel （Substance）写 漂亮的Swing应用程序</title>
      <guid isPermaLink="false">http://www.blogjava.net/gml520/archive/2009/05/23/277603.html</guid>
      <link>http://www.blogjava.net/gml520/archive/2009/05/23/277603.html</link>
      <description>摘要: 今天用Swing 做了一个模仿QQ2009的登录界面，用到了开源的Look&amp;amp;Feel （Substance），在使用的过程中遇到了一些问题，也学到了一些技巧。 &lt;br /&gt;Substance （https://substance.dev.java.net）有很多的外观可以选择，而且都很漂亮，还提供了强大的API供开发者使用。Substance 现在已经 &lt;br /&gt;发展到5.2RC 版了，一开始我使用的是5.1版，但是在使用的过程中发现了一些bug，当我使用Substance中提供的水印功能时，出现了许多的异常，这个bug在5.0的时候是没有的，后来我又下载了最新的5.2RC版，这个问题在5.2版中已经解决了。&#160;&#160;&lt;a href="http://www.blogjava.net/gml520/archive/2009/05/23/277603.html"&gt;阅读全文&lt;/a&gt;&lt;img
      src="http://www.blogjava.net/gml520/aggbug/277603.html" height="1" width="1" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="right"&gt;&lt;a style="text-decoration: none;" href="http://www.blogjava.net/gml520/" target="_blank"&gt;日月雨林@gmail.com&lt;/a&gt; 2009-05-23 20:09 &lt;a style="text-decoration: none;" href="http://www.blogjava.net/gml520/archive/2009/05/23/277603.html#Feedback" target="_blank"&gt;发表评论&lt;/a&gt;&lt;/div&gt;</description>
      <pubDate>Sat, 23 May 2009 12:09:00 +0000</pubDate>
    </item>
    <item>
      <title>BlogJava-何以解忧？唯有Java: Swing中Timer 的一个使用例子</title>
      <guid isPermaLink="false">http://www.blogjava.net/gml520/archive/2009/05/22/277356.html</guid>
      <link>http://www.blogjava.net/gml520/archive/2009/05/22/277356.html</link>
      <description>摘要: 最近在学习Swing中的动画绘制，用到了Timer 这个类，于是写一点笔记，和大家分享。大家有什么好的例子不妨共享出来吧！！ &lt;br /&gt; 计时器在java.swing包中的Timer类来创建，它可以看做是GUI的一个组件。与其他组件不一样的是，它没有可以显示在屏幕上的直观的外观。正如名字所表达的，它只帮我们来计时。 &lt;br /&gt;计时器对象按相等的时间间隔来产生动作事件。执行动画程序时，可以设置计时器来定期产生动作事件，然后在动作监听器中更新动画图形。 &lt;br /&gt; &lt;br /&gt;&#160;&#160;&lt;a href="http://www.blogjava.net/gml520/archive/2009/05/22/277356.html"&gt;阅读全文&lt;/a&gt;&lt;img src="http://www.blogjava.net/gml520/aggbug/277356.html" height="1" width="1" /&gt;&lt;br /&gt;&lt;br
      /&gt;&lt;div align="right"&gt;&lt;a style="text-decoration: none;" href="http://www.blogjava.net/gml520/" target="_blank"&gt;日月雨林@gmail.com&lt;/a&gt; 2009-05-22 16:19 &lt;a style="text-decoration: none;" href="http://www.blogjava.net/gml520/archive/2009/05/22/277356.html#Feedback" target="_blank"&gt;发表评论&lt;/a&gt;&lt;/div&gt;</description>
      <pubDate>Fri, 22 May 2009 08:19:00 +0000</pubDate>
    </item>
    <item>
      <title>Some reminiscences, some memories » NetBeans: 在游戏中使用脚本语言</title>
      <guid isPermaLink="false">http://www.mikespook.com/?p=330</guid>
      <link>http://www.mikespook.com/index.php/archives/330</link>
      <description>&lt;p&gt;这只是一个有趣的探索，demo 使用 java 编写。模拟了一个龙与地下城类 RPG 游戏中，在不同的房间内移动的简单游戏场景。&lt;/p&gt; &lt;p&gt;阅读本文前，首先下载使用 Netbeans 6.5 建立的完整项目代码：&lt;a href="http://www.mikespook.com/wp-content/uploads/2009/05/gamescripting.zip"&gt;下载&lt;/a&gt;。然后，我会用 UML 图的方式来说明如何在游戏中使用脚本，其中可能还会简介一下游戏中实体对象的建立和管理（不知道值得不值得另外写一篇文章来介绍了）。&lt;/p&gt; &lt;p&gt;I have a dream…&lt;span id="more-330"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;现在要构建一个极为无聊的小世界。说它小，是因为我只打算让它有三个房间，三个房间之间两两互通的门。仅此而已。首先上图：&lt;a
      href="http://www.mikespook.com/wp-content/uploads/2009/05/rooms.gif"&gt;&lt;img src="http://www.mikespook.com/wp-content/uploads/2009/05/rooms.gif" title="三个房间" height="241" width="241" alt="三个房间" class="alignright size-full wp-image-333" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;我们假设左边上面的房间叫 room-1，右边上面的房间叫 room-2，下面的房间叫 room-3。玩家在这三个房间中穿行，当然，不可能是穿墙。人，一定是要走门的。如图。就这么简单的逻辑而已，不用脚本语言也能轻松完成。不过如果希望多来一点拓展性呢？比如，room-3 不允许等级在5级以下玩家进入；room-2 当十级以上玩家进入后就会自动瞬间移动到
      room-1；门锁住以后就不能通过，更夸张一点，门锁住以后如果不把锁打坏就不能通过……可能性太多了。不用脚本的情况下，如果要将这么多都实现，是一件非常繁琐的事情。&lt;/p&gt; &lt;p&gt;好吧，让我们来看看那些游戏公司是怎么解决这个问题的。哦，需要说明的是，这里的解决方案仅仅是一个 demo，只用来解释原理。真正的环境中，还要更复杂一点，不过也就是复杂一点点而已。&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.mikespook.com/wp-content/uploads/2009/05/gamescripting-e7b1bbe59bbe-1.jpg"&gt;&lt;img src="http://www.mikespook.com/wp-content/uploads/2009/05/gamescripting-e7b1bbe59bbe-1-300x211.jpg" title="类图" height="211" width="300" alt="类图" class="alignleft size-medium wp-image-334"
      /&gt;&lt;/a&gt;游戏中实体类如图设计，为了简化期间，没有实体管理器，所以也没有集成自统一的父类。&lt;/p&gt; &lt;p&gt;Ninny 类也就是玩家，有保存当前所在房间的成员变量。Room 类也就是房间，保存有在当前房间的玩家列表。Door 是描述门的类，保存了这个门连接的两个房间的列表。&lt;/p&gt; &lt;p&gt;为了简单期间，demo 中使用了 java 内置的 javascript 作为脚本语言，详情看&lt;a href="http://java.sun.com/developer/technicalArticles/J2SE/Desktop/scripting/" target="_blank"&gt;这里&lt;/a&gt;。&lt;/p&gt; &lt;p&gt;&lt;span style="text-decoration: line-through;"&gt;本来还想多写一点的，急着出门。算了，反正有代码，大家看看先。有空回头写。重点在 js 目录下的那几个脚本
      enterDoor.js，exitDoor.js，enterRoom.js，exitRoom.js。&lt;/span&gt;&lt;/p&gt; &lt;p&gt;好，继续！&lt;/p&gt; &lt;p&gt;为了用起来方便，稍稍封装了一下Scripting的代码。大家直接看代码，不说话：&lt;/p&gt; &lt;div class="wp_syntax"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="line_numbers"&gt;&lt;pre&gt;1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 &lt;/pre&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;pre style="font-family: monospace;" class="java"&gt;&lt;span style="color: #000000; font-weight:
      bold;"&gt;import&lt;/span&gt; &lt;span style="color: #006699;"&gt;java.io.FileNotFoundException&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;import&lt;/span&gt; &lt;span style="color: #006699;"&gt;java.io.FileReader&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;import&lt;/span&gt; &lt;span style="color:
      #006699;"&gt;java.util.logging.Level&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;import&lt;/span&gt; &lt;span style="color: #006699;"&gt;java.util.logging.Logger&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;import&lt;/span&gt; &lt;span style="color: #006699;"&gt;javax.script.ScriptEngine&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
      &lt;span style="color: #000000; font-weight: bold;"&gt;import&lt;/span&gt; &lt;span style="color: #006699;"&gt;javax.script.ScriptEngineManager&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;import&lt;/span&gt; &lt;span style="color: #006699;"&gt;javax.script.ScriptException&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt; &#160; &lt;span style="color: #000000; font-weight: bold;"&gt;public&lt;/span&gt; &lt;span
      style="color: #000000; font-weight: bold;"&gt;class&lt;/span&gt; Script &lt;span style="color: #009900;"&gt;{&lt;/span&gt; &#160; &lt;span style="color: #000000; font-weight: bold;"&gt;private&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;final&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;static&lt;/span&gt; ScriptEngineManager factory &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;new&lt;/span&gt;
      ScriptEngineManager&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;private&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;final&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;static&lt;/span&gt; ScriptEngine engine &lt;span style="color: #339933;"&gt;=&lt;/span&gt; factory.&lt;span style="color:
      #006633;"&gt;getEngineByName&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;"JavaScript"&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt; &#160; &lt;span style="color: #000000; font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;void&lt;/span&gt; put&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color:
      #003399;"&gt;String&lt;/span&gt; key, &lt;span style="color: #003399;"&gt;Object&lt;/span&gt; value&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt; engine.&lt;span style="color: #006633;"&gt;put&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;key, value&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt; &lt;span style="color: #009900;"&gt;}&lt;/span&gt; &#160; &lt;span style="color:
      #000000; font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: #003399;"&gt;Object&lt;/span&gt; get&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #003399;"&gt;String&lt;/span&gt; key&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;return&lt;/span&gt; engine.&lt;span style="color: #006633;"&gt;get&lt;/span&gt;&lt;span style="color:
      #009900;"&gt;(&lt;/span&gt;key&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt; &lt;span style="color: #009900;"&gt;}&lt;/span&gt; &#160; &lt;span style="color: #000000; font-weight: bold;"&gt;public&lt;/span&gt; &lt;span style="color: #003399;"&gt;Object&lt;/span&gt; eval&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #003399;"&gt;String&lt;/span&gt; fileName&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span
      style="color: #000000; font-weight: bold;"&gt;throws&lt;/span&gt; ScriptException &lt;span style="color: #009900;"&gt;{&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;try&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;return&lt;/span&gt; engine.&lt;span style="color: #006633;"&gt;eval&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #000000; font-weight:
      bold;"&gt;new&lt;/span&gt; &lt;span style="color: #003399;"&gt;FileReader&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #003399;"&gt;System&lt;/span&gt;.&lt;span style="color: #006633;"&gt;getProperty&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;"user.dir"&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;"."&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color:
      #339933;"&gt;+&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;"/js/"&lt;/span&gt; &lt;span style="color: #339933;"&gt;+&lt;/span&gt; fileName &lt;span style="color: #339933;"&gt;+&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;".js"&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt; &lt;span style="color: #009900;"&gt;}&lt;/span&gt; &lt;span style="color: #000000; font-weight:
      bold;"&gt;catch&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #003399;"&gt;FileNotFoundException&lt;/span&gt; ex&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt; Logger.&lt;span style="color: #006633;"&gt;getLogger&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;Script.&lt;span style="color: #000000; font-weight: bold;"&gt;class&lt;/span&gt;.&lt;span style="color:
      #006633;"&gt;getName&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;.&lt;span style="color: #006633;"&gt;log&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;Level.&lt;span style="color: #006633;"&gt;SEVERE&lt;/span&gt;, &lt;span style="color: #000066; font-weight: bold;"&gt;null&lt;/span&gt;, ex&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color:
      #339933;"&gt;;&lt;/span&gt; &lt;span style="color: #009900;"&gt;}&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;return&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;null&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt; &lt;span style="color: #009900;"&gt;}&lt;/span&gt; &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt; &lt;p&gt;从类图上可以看到，Door 和 Room 都实现了 Enterable
      接口，两个方法：一个入 enter，一个出 exit。显然，当进入一个 Room 的时候，必须从另外一个房间出来。为了保证这个一致性，所以限定玩家不能穿墙只能走门：&lt;/p&gt; &lt;div class="wp_syntax"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="line_numbers"&gt;&lt;pre&gt;1 2 3 4 5 6 7 &lt;/pre&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;pre style="font-family: monospace;" class="java"&gt; Room r1 &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;new&lt;/span&gt; Room&lt;span style="color:
      #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;"room-1"&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt; Room r2 &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;new&lt;/span&gt; Room&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;"room-2"&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color:
      #339933;"&gt;;&lt;/span&gt; Door d12 &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;new&lt;/span&gt; Door&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt; d12.&lt;span style="color: #006633;"&gt;add&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;r1&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color:
      #339933;"&gt;;&lt;/span&gt; d12.&lt;span style="color: #006633;"&gt;add&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;r2&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt; Ninny player &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;new&lt;/span&gt; Ninny&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;"ninny"&lt;/span&gt;, r1&lt;span
      style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt; d12.&lt;span style="color: #006633;"&gt;enter&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;player&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt; &lt;p&gt;在不用脚本的情况下怎么写这个 Door 的 enter 方法呢？首先判断一下 ninny 是不是跟 Door 在同一个房间；获得 ninny 的当前房间后 exit；获得门另一端的房间
      enter。就是这么简单。不过考虑到前面说说的那种种可能性，为了拓展让我们来看一看用脚本是如何处理的：&lt;/p&gt; &lt;div class="wp_syntax"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="line_numbers"&gt;&lt;pre&gt;1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 &lt;/pre&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;pre style="font-family: monospace;" class="java"&gt;&lt;span style="color: #666666; font-style: italic;"&gt;// Door 的 enter 方法&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;public&lt;/span&gt; &lt;span
      style="color: #000066; font-weight: bold;"&gt;boolean&lt;/span&gt; enter&lt;span style="color: #009900;"&gt;(&lt;/span&gt;Ninny ninny&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt; Room currentRoom &lt;span style="color: #339933;"&gt;=&lt;/span&gt; ninny.&lt;span style="color: #006633;"&gt;getOwner&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color:
      #339933;"&gt;;&lt;/span&gt; &lt;span style="color: #666666; font-style: italic;"&gt;// 玩家在当前门所在的房间&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;if&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #339933;"&gt;!&lt;/span&gt;member.&lt;span style="color: #006633;"&gt;containsKey&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;currentRoom.&lt;span style="color: #006633;"&gt;getName&lt;/span&gt;&lt;span style="color:
      #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;return&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;false&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt; &lt;span style="color: #009900;"&gt;}&lt;/span&gt; &lt;span style="color:
      #666666; font-style: italic;"&gt;// 门另一侧的房间&lt;/span&gt; Room nextRoom &lt;span style="color: #339933;"&gt;=&lt;/span&gt; getAnotherRoom&lt;span style="color: #009900;"&gt;(&lt;/span&gt;currentRoom&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt; &#160; &lt;span style="color: #000000; font-weight: bold;"&gt;try&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt; Script script &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span
      style="color: #000000; font-weight: bold;"&gt;new&lt;/span&gt; Script&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt; script.&lt;span style="color: #006633;"&gt;put&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;"room1"&lt;/span&gt;, currentRoom&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;
      script.&lt;span style="color: #006633;"&gt;put&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;"room2"&lt;/span&gt;, nextRoom&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt; script.&lt;span style="color: #006633;"&gt;put&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;"door"&lt;/span&gt;, &lt;span style="color: #000000; font-weight:
      bold;"&gt;this&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt; script.&lt;span style="color: #006633;"&gt;put&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;"player"&lt;/span&gt;, ninny&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt; script.&lt;span style="color: #006633;"&gt;eval&lt;/span&gt;&lt;span style="color:
      #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;"enterDoor"&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt; &lt;span style="color: #003399;"&gt;System&lt;/span&gt;.&lt;span style="color: #006633;"&gt;out&lt;/span&gt;.&lt;span style="color: #006633;"&gt;println&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;"enterDoor: "&lt;/span&gt; &lt;span style="color:
      #339933;"&gt;+&lt;/span&gt; script.&lt;span style="color: #006633;"&gt;get&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;"message"&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;return&lt;/span&gt; &lt;span style="color: #003399;"&gt;Boolean&lt;/span&gt;.&lt;span style="color:
      #006633;"&gt;valueOf&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;script.&lt;span style="color: #006633;"&gt;get&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;"result"&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;.&lt;span style="color: #006633;"&gt;toString&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color:
      #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt; &lt;span style="color: #009900;"&gt;}&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;catch&lt;/span&gt; &lt;span style="color: #009900;"&gt;(&lt;/span&gt;ScriptException ex&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt; Logger.&lt;span style="color: #006633;"&gt;getLogger&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;Door.&lt;span
      style="color: #000000; font-weight: bold;"&gt;class&lt;/span&gt;.&lt;span style="color: #006633;"&gt;getName&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;.&lt;span style="color: #006633;"&gt;log&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;Level.&lt;span style="color: #006633;"&gt;SEVERE&lt;/span&gt;, &lt;span style="color: #000066; font-weight:
      bold;"&gt;null&lt;/span&gt;, ex&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;return&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;false&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt; &lt;span style="color: #009900;"&gt;}&lt;/span&gt; &lt;span style="color:
      #009900;"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt; &lt;p&gt;这里实际上 enter 什么也没有做，只是传递了一些数据到 Script，然后执行了 enterDoor 这个脚本：&lt;/p&gt; &lt;div class="wp_syntax"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="line_numbers"&gt;&lt;pre&gt;1 2 3 4 5 6 7 8 9 &lt;/pre&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;pre style="font-family: monospace;" class="javascript"&gt;importClass&lt;span style="color: #009900;"&gt;(&lt;/span&gt;Packages.&lt;span style="color:
      #660066;"&gt;foobar&lt;/span&gt;.&lt;span style="color: #660066;"&gt;Room&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt; importClass&lt;span style="color: #009900;"&gt;(&lt;/span&gt;Packages.&lt;span style="color: #660066;"&gt;foobar&lt;/span&gt;.&lt;span style="color: #660066;"&gt;Ninny&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt; importClass&lt;span style="color:
      #009900;"&gt;(&lt;/span&gt;Packages.&lt;span style="color: #660066;"&gt;foobar&lt;/span&gt;.&lt;span style="color: #660066;"&gt;Door&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt; &#160; room1.&lt;span style="color: #660066;"&gt;exit&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;player&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt; room2.&lt;span style="color:
      #660066;"&gt;enter&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;player&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt; &#160; &lt;span style="color: #003366; font-weight: bold;"&gt;var&lt;/span&gt; message &lt;span style="color: #339933;"&gt;=&lt;/span&gt; player.&lt;span style="color: #660066;"&gt;getName&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span
      style="color: #339933;"&gt;+&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;" enter from the room "&lt;/span&gt; &lt;span style="color: #339933;"&gt;+&lt;/span&gt; room1.&lt;span style="color: #660066;"&gt;getName&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #339933;"&gt;+&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;" to the romm "&lt;/span&gt; &lt;span style="color: #339933;"&gt;+&lt;/span&gt;
      room2.&lt;span style="color: #660066;"&gt;getName&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #339933;"&gt;+&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;"!"&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt; &lt;span style="color: #003366; font-weight: bold;"&gt;var&lt;/span&gt; result &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #003366; font-weight:
      bold;"&gt;true&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt; &lt;p&gt;脚本也很简单，只是让玩家推出当前房间，进入下一个房间。如果房间对进入的玩家有等级要求，则只需：&lt;/p&gt; &lt;div class="wp_syntax"&gt;&lt;table&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="line_numbers"&gt;&lt;pre&gt;1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 &lt;/pre&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;pre style="font-family: monospace;" class="javascript"&gt;importClass&lt;span style="color:
      #009900;"&gt;(&lt;/span&gt;Packages.&lt;span style="color: #660066;"&gt;foobar&lt;/span&gt;.&lt;span style="color: #660066;"&gt;Room&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt; importClass&lt;span style="color: #009900;"&gt;(&lt;/span&gt;Packages.&lt;span style="color: #660066;"&gt;foobar&lt;/span&gt;.&lt;span style="color: #660066;"&gt;Ninny&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color:
      #339933;"&gt;;&lt;/span&gt; importClass&lt;span style="color: #009900;"&gt;(&lt;/span&gt;Packages.&lt;span style="color: #660066;"&gt;foobar&lt;/span&gt;.&lt;span style="color: #660066;"&gt;Door&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt; &#160; &lt;span style="color: #003366; font-weight: bold;"&gt;var&lt;/span&gt; result &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #003366; font-weight:
      bold;"&gt;false&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt; &lt;span style="color: #003366; font-weight: bold;"&gt;var&lt;/span&gt; message &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;''&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;if&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;room2.&lt;span style="color: #660066;"&gt;needLevel&lt;/span&gt; &lt;span
      style="color: #339933;"&gt;&gt;=&lt;/span&gt; player.&lt;span style="color: #660066;"&gt;level&lt;/span&gt; &lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #009900;"&gt;{&lt;/span&gt; room1.&lt;span style="color: #660066;"&gt;exit&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;player&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt; room2.&lt;span style="color: #660066;"&gt;enter&lt;/span&gt;&lt;span
      style="color: #009900;"&gt;(&lt;/span&gt;player&lt;span style="color: #009900;"&gt;)&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt; &#160; message &lt;span style="color: #339933;"&gt;=&lt;/span&gt; player.&lt;span style="color: #660066;"&gt;getName&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #339933;"&gt;+&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;" enter from the room "&lt;/span&gt;
      &lt;span style="color: #339933;"&gt;+&lt;/span&gt; room1.&lt;span style="color: #660066;"&gt;getName&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #339933;"&gt;+&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;" to the romm "&lt;/span&gt; &lt;span style="color: #339933;"&gt;+&lt;/span&gt; room2.&lt;span style="color: #660066;"&gt;getName&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span
      style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #339933;"&gt;+&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;"!"&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt; result &lt;span style="color: #339933;"&gt;=&lt;/span&gt; &lt;span style="color: #003366; font-weight: bold;"&gt;true&lt;/span&gt;&lt;span style="color: #339933;"&gt;;&lt;/span&gt; &lt;span style="color: #009900;"&gt;}&lt;/span&gt; &lt;span style="color: #000066; font-weight: bold;"&gt;else&lt;/span&gt;
      &lt;span style="color: #009900;"&gt;{&lt;/span&gt; message &lt;span style="color: #339933;"&gt;=&lt;/span&gt; player.&lt;span style="color: #660066;"&gt;getName&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #339933;"&gt;+&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;" can't enter the romm "&lt;/span&gt; &lt;span style="color: #339933;"&gt;+&lt;/span&gt; room2.&lt;span style="color:
      #660066;"&gt;getName&lt;/span&gt;&lt;span style="color: #009900;"&gt;(&lt;/span&gt;&lt;span style="color: #009900;"&gt;)&lt;/span&gt; &lt;span style="color: #339933;"&gt;+&lt;/span&gt; &lt;span style="color: #3366CC;"&gt;"! Level"&lt;/span&gt; &lt;span style="color: #339933;"&gt;+&lt;/span&gt; room2.&lt;span style="color: #660066;"&gt;needLevel&lt;/span&gt; &lt;span style="color: #339933;"&gt;+&lt;/span&gt;&lt;span style="color: #3366CC;"&gt;" needed!"&lt;/span&gt;&lt;span style="color:
      #339933;"&gt;;&lt;/span&gt; &lt;span style="color: #009900;"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt; &lt;p&gt;在我的例子代码中并没有这部分代码，实际上 Room、Door、Ninny 这几个类都应该从一个父类 Entity 中继承。这个 Entity 有一个 Map 的成员变量。通过 setAttr(String, Object) 和 getAttr(String) 两个方法就可以分别设置和获取每个 Entity 的属性。这样就可以在脚本中自由的使用各种属性来实现各种功能。&lt;br /&gt; 通过 Enterable（可进入），Pickable（可捡起），Attackable（可攻击）等接口，调用对应的脚本来完成真正的游戏逻辑。&lt;br /&gt; 其实那神秘的游戏脚本化就是这么简单。本来还想画几个序列图说明一下脚本的调用，实在有些困了。&lt;br /&gt;
      准备洗洗睡觉。尚未补充完整的内容，全当大家进阶学习吧。&lt;/p&gt;</description>
      <pubDate>Fri, 22 May 2009 05:55:34 +0000</pubDate>
    </item>
    <item>
      <title>BlogJava-何以解忧？唯有Java: 用HtmlParser 写个简单的 news爬虫</title>
      <guid isPermaLink="false">http://www.blogjava.net/gml520/archive/2009/05/20/271691.html</guid>
      <link>http://www.blogjava.net/gml520/archive/2009/05/20/271691.html</link>
      <description>摘要: 有一段时间没写博客了，这几天我同学要赶着交毕业设计，让我帮他写个爬虫，专门抓搜狐的新闻，我用过爬虫，但是从来没有自己写过爬虫，于是Google了一下，找到了一篇不错的文章：使用 HttpClient 和 HtmlParser 实现简易爬虫 . 参考里面的代码，自己写了个简易的搜狐新闻爬虫。&#160;&#160;&lt;a href="http://www.blogjava.net/gml520/archive/2009/05/20/271691.html"&gt;阅读全文&lt;/a&gt;&lt;img src="http://www.blogjava.net/gml520/aggbug/271691.html" height="1" width="1" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="right"&gt;&lt;a style="text-decoration: none;" href="http://www.blogjava.net/gml520/"
      target="_blank"&gt;日月雨林@gmail.com&lt;/a&gt; 2009-05-20 12:44 &lt;a style="text-decoration: none;" href="http://www.blogjava.net/gml520/archive/2009/05/20/271691.html#Feedback" target="_blank"&gt;发表评论&lt;/a&gt;&lt;/div&gt;</description>
      <pubDate>Wed, 20 May 2009 04:44:00 +0000</pubDate>
    </item>
    <item>
      <title>BlogJava-何以解忧？唯有Java: JDK 7 中的新特性之客户端增强（Swing&amp;Java2D）</title>
      <guid isPermaLink="false">http://www.blogjava.net/gml520/archive/2009/04/03/263751.html</guid>
      <link>http://www.blogjava.net/gml520/archive/2009/04/03/263751.html</link>
      <description>&lt;span class="Apple-style-span"&gt;&lt;span style="font-size: 12px; line-height: 18px; font-family: Arial; text-align: left;" class="Apple-style-span"&gt; &lt;div style="font-weight: bold;" class="title"&gt;Client&lt;/div&gt; &lt;div style="margin-top: 1.5ex; margin-left: 2em;" id="f653" class="feature"&gt; &lt;div style="font-weight: bold;" class="title"&gt;&lt;span style="color: rgb(0,0,255);"&gt;XRender pipeline for Java 2D&lt;/span&gt;&lt;/div&gt; &lt;div style="margin-top: 1ex;"
      class="summary"&gt;A new Java2D graphics pipeline based upon the X11 XRender extension, which provides access to much of the functionality of modern GPUs&lt;/div&gt; &lt;div style="margin-top: 1ex;" class="refs"&gt; &lt;div class="who"&gt;Lead:&#160;&lt;a style="color: rgb(67,114,145); text-decoration: none;" href="http://linuxhippy.blogspot.com/"&gt;Clemens Eisserer&lt;/a&gt;; team:&#160;&lt;a style="color: rgb(67,114,145); text-decoration: none;" href="http://blogs.sun.com/tdv"&gt;Dmitri
      Trembovetski&lt;/a&gt;&lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;div style="margin-top: 1.5ex; margin-left: 2em;" id="f647" class="feature"&gt; &lt;div style="font-weight: bold;" class="title"&gt;Forward-port 6u10 features&lt;/div&gt; &lt;div style="margin-top: 1ex;" class="summary"&gt;Forward-port implementation-specific features from the&#160;6u10 release: The new Java Plug-In, Java Kernel, Quickstarter, related installer features, and the Swing Nimbus look-and-feel&lt;/div&gt; &lt;div
      style="margin-top: 1ex;" class="refs"&gt;Milestone target: M4&lt;/div&gt; &lt;/div&gt; &lt;div style="margin-top: 1.5ex; margin-left: 2em;" id="f650" class="feature"&gt; &lt;div style="font-weight: bold;" class="title"&gt;Create new platform APIs for forward-ported 6u10 features&lt;/div&gt; &lt;div style="margin-top: 1ex;" class="summary"&gt;Create new platform APIs for features originally implemented in the&#160;6u10 release: Translucent and shaped windows, heavyweight/lightweight mixing, and the
      improved AWT security warning&lt;/div&gt; &lt;div style="margin-top: 1ex;" class="refs"&gt;Milestone target: M4&lt;/div&gt; &lt;/div&gt; &lt;div style="margin-top: 1.5ex; margin-left: 2em;" id="f205" class="feature"&gt; &lt;div style="font-weight: bold;" class="title"&gt;&lt;span style="color: rgb(0,0,255);"&gt;JSR 296: Swing application framework&lt;/span&gt;&lt;/div&gt; &lt;div style="margin-top: 1ex;" class="summary"&gt;&lt;span style="color: rgb(255,0,0);"&gt;An API to define the basic structure
      of a typical Swing application, thereby eliminating lots of boilerplate code and providing a much-improved initial developer experience&lt;/span&gt;&lt;/div&gt; &lt;div style="margin-top: 1ex;" class="refs"&gt; &lt;div class="who"&gt;&lt;span style="color: rgb(255,0,0);"&gt;Lead:&#160;&lt;/span&gt;&lt;a style="color: rgb(67,114,145); text-decoration: none;" href="http://weblogs.java.net/blog/alexfromsun"&gt;&lt;span style="color: rgb(255,0,0);"&gt;Alexander
      Potochkin&lt;/span&gt;&lt;/a&gt;&lt;/div&gt; &lt;/div&gt; &lt;div style="margin-top: 1ex;" class="refs"&gt;&lt;span style="color: rgb(255,0,0);"&gt;Links:&#160;&lt;/span&gt;&lt;a style="color: rgb(67,114,145); text-decoration: none;" href="http://jcp.org/en/jsr/detail?id=296"&gt;&lt;span style="color: rgb(255,0,0);"&gt;JSR 296&lt;/span&gt;&lt;/a&gt;&lt;/div&gt; &lt;div style="margin-top: 1ex;" class="refs"&gt;Milestone target: M5&lt;/div&gt; &lt;/div&gt; &lt;div style="margin-top: 1.5ex; margin-left:
      2em;" id="f652" class="feature"&gt; &lt;div style="font-weight: bold;" class="title"&gt;&lt;span style="color: rgb(0,0,255);"&gt;Swing updates&lt;/span&gt;&lt;/div&gt; &lt;div style="margin-top: 1ex;" class="summary"&gt;&lt;span style="color: rgb(255,0,0);"&gt;Small additions to the Swing API including the JXLayer component decorator, JXDatePicker, and possibly CSS-based styling&lt;/span&gt;&lt;/div&gt; &lt;div style="margin-top: 1ex;" class="refs"&gt; &lt;div class="who"&gt;Lead:&#160;&lt;a
      style="color: rgb(67,114,145); text-decoration: none;" href="http://weblogs.java.net/blog/rbair"&gt;Richard Bair&lt;/a&gt;; team:&#160;&lt;a style="color: rgb(67,114,145); text-decoration: none;" href="http://weblogs.java.net/blog/alexfromsun"&gt;Alexander Potochkin&lt;/a&gt;&lt;/div&gt; &lt;/div&gt; &lt;div style="margin-top: 1ex;" class="refs"&gt;Links:&#160;&lt;a style="color: rgb(67,114,145); text-decoration: none;" href="https://jxlayer.dev.java.net/"&gt;JXLayer project&lt;/a&gt;;&#160;&lt;a
      style="color: rgb(67,114,145); text-decoration: none;" href="http://swinglabs.java.sun.com/hudson/job/SwingX%20Continuous%20Build/javadoc/org/jdesktop/swingx/JXDatePicker.html"&gt;JXDatePicker api&lt;/a&gt;&lt;/div&gt; &lt;/div&gt; &lt;p style="padding-right: 0px; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px;"&gt;&#160;&lt;/p&gt; &lt;/span&gt;&lt;/span&gt; &lt;img src="http://www.blogjava.net/gml520/aggbug/263751.html" height="1" width="1" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div
      align="right"&gt;&lt;a style="text-decoration: none;" href="http://www.blogjava.net/gml520/" target="_blank"&gt;日月雨林@gmail.com&lt;/a&gt; 2009-04-03 14:58 &lt;a style="text-decoration: none;" href="http://www.blogjava.net/gml520/archive/2009/04/03/263751.html#Feedback" target="_blank"&gt;发表评论&lt;/a&gt;&lt;/div&gt;</description>
      <pubDate>Fri, 03 Apr 2009 06:58:00 +0000</pubDate>
    </item>
    <item>
      <title>BlogJava-何以解忧？唯有Java: NetBeans 6.7中 我比较喜欢的改进！</title>
      <guid isPermaLink="false">http://www.blogjava.net/gml520/archive/2009/03/31/263178.html</guid>
      <link>http://www.blogjava.net/gml520/archive/2009/03/31/263178.html</link>
      <description>摘要: netbeans 6.7 m3 基本开发完毕了，意味着netbeans6.7 的发布也不远了。6月份的 JavaOne 大会上，netbeans6.7 &lt;br /&gt;就会发布了。6.7 版本 重点的开发放到了Maven ，Test，Debug 等功能上的完善和增强。 &lt;br /&gt; &lt;br /&gt;我比较喜欢的几个功能的改进： &lt;br /&gt;&#160;&#160;&lt;a href="http://www.blogjava.net/gml520/archive/2009/03/31/263178.html"&gt;阅读全文&lt;/a&gt;&lt;img src="http://www.blogjava.net/gml520/aggbug/263178.html" height="1" width="1" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="right"&gt;&lt;a style="text-decoration: none;"
      href="http://www.blogjava.net/gml520/" target="_blank"&gt;日月雨林@gmail.com&lt;/a&gt; 2009-03-31 17:12 &lt;a style="text-decoration: none;" href="http://www.blogjava.net/gml520/archive/2009/03/31/263178.html#Feedback" target="_blank"&gt;发表评论&lt;/a&gt;&lt;/div&gt;</description>
      <pubDate>Tue, 31 Mar 2009 09:12:00 +0000</pubDate>
    </item>
    <item>
      <title>BlogJava-何以解忧？唯有Java: 几个学习Swing&amp; Java2D 的好地方！（2009年4月2日更新）</title>
      <guid isPermaLink="false">http://www.blogjava.net/gml520/archive/2009/03/30/262811.html</guid>
      <link>http://www.blogjava.net/gml520/archive/2009/03/30/262811.html</link>
      <description>&lt;span&gt; &lt;p&gt; &lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;span&gt;（2009年4月2日更新）&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&#160;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;最近在网上找到了一些比较好的学习Swing 的网站，不敢独享，发表上来大家一起学习。&lt;/p&gt; &lt;p&gt;&#160;&lt;/p&gt; &lt;p&gt;1.第一个就不用说了，Sun官方的教程 相当的不错。（英语基础不一定要很好，安装个Lingoes 就可以了）&lt;/p&gt; &lt;p&gt;&#160;&lt;/p&gt; &lt;p&gt;Swing ：&#160;&#160;&#160;&lt;a
      href="http://java.sun.com/docs/books/tutorial/uiswing/TOC.html"&gt;http://java.sun.com/docs/books/tutorial/uiswing/TOC.html&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&#160;&lt;/p&gt; &lt;p&gt;Java2D：&#160;&#160;&#160;&lt;a href="http://java.sun.com/docs/books/tutorial/2d/index.html"&gt;http://java.sun.com/docs/books/tutorial/2d/index.html&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&#160;&lt;/p&gt; &lt;p&gt;btw：你也可以将教程下载到本地上看&lt;/p&gt; &lt;p&gt;（&lt;a
      href="http://cds.sun.com/is-bin/INTERSHOP.enfinity/WFS/CDS-CDS_Developer-Site/en_US/-/USD/VerifyItem-Start/tutorial-2008_03_14.zip?BundledLineItemUUID=Ga9IBe.oL0QAAAEgy6s0_EWl&amp;amp;amp;amp;OrderID=WkRIBe.oIjoAAAEguqs0_EWl&amp;amp;amp;amp;ProductID=D4NIBe.oo4wAAAEY3mU9OsN.&amp;amp;amp;amp;FileName=/tutorial-2008_03_14.zip"&gt;http://cds.sun.com/is-bin/INTERSHOP.enfinity/WFS/CDS-CDS_Developer-Site/en_US/-/USD/VerifyItem-Start/tutorial-2008_03_14.zip?BundledLineItemUUID=Ga9IBe.oL0QAAAEgy6s0_EWl&amp;amp;OrderID=WkRIBe.oIjoAAAEguqs0_EWl&amp;amp;ProductID=D4NIBe.oo4wAAAEY3mU9OsN.&amp;amp;FileName=/tutorial-2008_03_14.zip&lt;/a&gt;）&lt;/p&gt;
      &lt;p&gt;&#160;&lt;/p&gt; &lt;p&gt;2. 第二个也是个英文的网站 代码和实例都很多，也是难得的学习Swing 和Java2D 的好地方&lt;/p&gt; &lt;p&gt;&#160;&lt;/p&gt; &lt;p&gt;Swing：&lt;a href="http://aplcenmp.apl.jhu.edu/~hall/java/Swing-Tutorial/"&gt;http://aplcenmp.apl.jhu.edu/~hall/java/Swing-Tutorial/&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;span&gt;&lt;span&gt;&lt;strong&gt;&lt;span&gt;&lt;span&gt;&lt;br /&gt; &lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;Java2D：&lt;a
      href="http://www.apl.jhu.edu/~hall/java/Java2D-Tutorial.html"&gt;http://www.apl.jhu.edu/~hall/java/Java2D-Tutorial.html&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&#160;&lt;/p&gt; &lt;h1&gt;&lt;span&gt;&lt;span&gt;3.第三个还是英文的网站，这个网站上介绍的组件不多，但是代码很经典,而且还有几个简单的游戏教程。&lt;/span&gt;&lt;/span&gt;&lt;/h1&gt; &lt;p&gt;Swing ：&lt;a href="http://www.zetcode.com/tutorials/javaswingtutorial/"&gt;http://www.zetcode.com/tutorials/javaswingtutorial/&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&#160;&lt;/p&gt; &lt;p&gt;Java2D：&lt;a
      href="http://www.zetcode.com/tutorials/java2dtutorial/"&gt;http://www.zetcode.com/tutorials/java2dtutorial/&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&#160;&lt;/p&gt; &lt;p&gt;Java2D Games：&lt;a href="http://www.zetcode.com/tutorials/javagamestutorial/"&gt;http://www.zetcode.com/tutorials/javagamestutorial/&lt;/a&gt;&#160;&#160; &#160;（&lt;span&gt;这个游戏教程不错&lt;/span&gt;）&lt;/p&gt; &lt;p&gt;&#160;&lt;/p&gt; &lt;p&gt;4.第四个还是英文的学习站点 ，这个个站点的学习文章比较多，涉及的方面也比较广，是个不错的学习java GUI 的&lt;/p&gt; &lt;p&gt;站点。&#160;&lt;/p&gt;
      &lt;p&gt;&#160;&lt;/p&gt; &lt;p&gt;Swing：&lt;a href="http://life.csu.edu.au/java-tut/uiswing/"&gt;http://life.csu.edu.au/java-tut/uiswing/&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&#160;&lt;/p&gt; &lt;p&gt;ps：为什么国外的Swing教程那么多呢?而且质量也不错！&lt;/p&gt; &lt;p&gt;&#160;&#160; &#160; &#160; 今年的工作不好找，只好再努力的巩固基础，厚积薄发！&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;/span&gt; &lt;img src="http://www.blogjava.net/gml520/aggbug/262811.html" height="1" width="1" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="right"&gt;&lt;a
      style="text-decoration: none;" href="http://www.blogjava.net/gml520/" target="_blank"&gt;日月雨林@gmail.com&lt;/a&gt; 2009-03-30 09:16 &lt;a style="text-decoration: none;" href="http://www.blogjava.net/gml520/archive/2009/03/30/262811.html#Feedback" target="_blank"&gt;发表评论&lt;/a&gt;&lt;/div&gt;</description>
      <pubDate>Mon, 30 Mar 2009 01:16:00 +0000</pubDate>
    </item>
    <item>
      <title>平步星云: Mark Occurrences in NetBeans</title>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-171648533238476397.post-5767573093968662859</guid>
      <link>http://pprun.blogspot.com/2007/03/mark-occurrences-in-netbeans.html</link>
      <description>Mark Occurrences (元素高亮)指的是当鼠标放在某个类元素上时，在当前文件高亮出该元素的 声明和引用。&lt;br /&gt;如果你使用过 Find Usages 的话，你应该能知道这个功能的好处。但是 Mark Occurrences 比起 Find Usages 来属于轻量级的。因为：&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Mark Occurrences 只搜索当前文件&lt;/li&gt;&lt;li&gt;Mark Occurrences 为动态的，不需要菜单来激活只需要将鼠标放在要查看的元素上即可。&lt;/li&gt;&lt;li&gt;Mark Occurrences 懂得语义，比如将鼠标指向当前类的超类，它将显示所有被实现/覆盖的方法；放在方法的返回类型上，将显示方法的所有返回的语句上；...&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;如果你使用的是 NetBeans 6.0 的开发版的话，这个功能已经内置了，不过它被叫做 Highlights：&lt;br /&gt; &lt;span
      style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;成员作用域&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;a href="http://wiki.netbeans.org/wiki/attach/Java_EditorUsersGuide/HL_Identifier.png"&gt;&lt;img src="http://wiki.netbeans.org/wiki/attach/Java_EditorUsersGuide/HL_Identifier.png" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px;" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;方法返回点&lt;/li&gt;&lt;/ul&gt;&lt;a
      href="http://wiki.netbeans.org/wiki/attach/Java_EditorUsersGuide/HL_ExitPoints.png"&gt;&lt;img src="http://wiki.netbeans.org/wiki/attach/Java_EditorUsersGuide/HL_ExitPoints.png" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px;" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;特定异常抛出点&lt;/li&gt;&lt;/ul&gt;&lt;a href="http://wiki.netbeans.org/wiki/attach/Java_EditorUsersGuide/HL_ExceptionPoints.png"&gt;&lt;img
      src="http://wiki.netbeans.org/wiki/attach/Java_EditorUsersGuide/HL_ExceptionPoints.png" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px;" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;如果你使用的是 NetBeans 5.x 系列的话，你需要注册一个更新中心，然后下载插件，具体步骤如下：&lt;br /&gt;&lt;ol&gt;&lt;li&gt;选择 &lt;span style="font-weight: bold;"&gt;Tools | Options&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;单击 &lt;span style="font-weight: bold;"&gt;Advanced
      Options &lt;/span&gt;按钮&lt;/li&gt;&lt;li&gt;选择&lt;span style="font-weight: bold;"&gt; Options | IDE Configuration | System | Autoupdate Types&lt;/span&gt;&lt;/li&gt;&lt;li&gt;右击并选择 &lt;span style="font-weight: bold;"&gt;New | General Update Center&lt;/span&gt;&lt;/li&gt;&lt;li&gt;在 &lt;span style="font-weight: bold;"&gt;Name &lt;/span&gt;输入域中输入&lt;span style="font-weight: bold;"&gt;Sandip Chitale's Modules &lt;/span&gt;然后单击 &lt;span style="font-weight:
      bold;"&gt;Finish&lt;/span&gt;&lt;/li&gt;&lt;li&gt;(此步骤不必，如果你在完成上述步骤后立即进行下面的步骤时) 展开&lt;span style="font-weight: bold;"&gt;Autoupdate Types node&lt;/span&gt;, 选择 &lt;span style="font-weight: bold;"&gt;Sandip Chitale's Modules&lt;/span&gt;&lt;/li&gt;&lt;li&gt;在右边的窗口中的第一个属性值Server URL，输入: http://blogs.sun.com/roller/resources/scblog/update-center.xml&lt;/li&gt;&lt;li&gt;确保&lt;span style="font-weight: bold;"&gt;Enabled&lt;/span&gt; 属性勾上。然后关闭当前窗口&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br
      /&gt;现在这个更新中心就可以用了，我们目标是得到 Mark Occurrences 插件，它就在这个更新中心中：&lt;br /&gt;选择&lt;span style="font-weight: bold;"&gt;Tools | Update Center &lt;/span&gt;菜单. 勾上 &lt;span style="font-weight: bold;"&gt;Sandip Chitale's Modules&lt;/span&gt; 项，如果它还没被勾上的话。依照更新向导在 Select Modules to Install 窗口中选择&lt;br /&gt;Sandip Chitale's Modules 选择Make Occurrences&lt;br /&gt;&lt;br /&gt;&lt;b&gt;虽然作者声明：&lt;/b&gt;这个模块是个实验性的模块，但是到目前为止在我的工作中我一直在用它，而且没有出现任何问题(比起一些 Eclipse 的插件可强多了!)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span
      style="font-weight: bold;"&gt;注意: &lt;/span&gt;安装完后(不记得要不要重启 NetBeans), 你应该能看到工具条上出现一个黄色的按钮(如下图)，或者你可以从 &lt;span style="font-weight: bold;"&gt;View | Mark Occurrences&lt;/span&gt; 激活它：&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_bpUunzIgcNA/RkU4QqKBVvI/AAAAAAAAAAk/Hcjh5jdB9BA/s1600-h/Mark+Occurrences.png"&gt;&lt;img src="http://3.bp.blogspot.com/_bpUunzIgcNA/RkU4QqKBVvI/AAAAAAAAAAk/Hcjh5jdB9BA/s400/Mark+Occurrences.png" alt="" style="margin: 0px auto 10px; display: block;
      text-align: center; cursor: pointer; width: 400px;" border="0" id="BLOGGER_PHOTO_ID_5063515214893373170" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img src="https://blogger.googleusercontent.com/tracker/171648533238476397-5767573093968662859?l=pprun.blogspot.com" alt="" height="1" width="1" /&gt;&lt;/div&gt;</description>
      <pubDate>Wed, 10 Dec 2008 17:08:14 +0000</pubDate>
    </item>
    <item>
      <title>平步星云: Hibernate Jpetstore 之四 表示层技术</title>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-171648533238476397.post-4840119221115522578</guid>
      <link>http://pprun.blogspot.com/2007/06/hibernate-jpetstore.html</link>
      <description>&lt;h2&gt;文档内容&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;概览&lt;/li&gt;&lt;li&gt;Struts 表示层组件 FormBean&lt;/li&gt;&lt;ul&gt;&lt;li&gt;FormBean 配置&lt;/li&gt;&lt;li&gt;FormBean 类层次&lt;/li&gt;&lt;li&gt;BaseActionForm 子类实例 AccountActionForm&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;避免重复提交&lt;/li&gt;&lt;ul&gt;&lt;li&gt;Struts 的事务 Token&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;我们还缺什么?&lt;/li&gt;&lt;ul&gt;&lt;li&gt;客户端校验&lt;/li&gt;&lt;li&gt;漂亮的页面&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;总结&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;a
      href="http://2.bp.blogspot.com/_bpUunzIgcNA/RnKM9o3zgfI/AAAAAAAAAEU/jsleco4RgaY/s1600-h/index.png"&gt;&lt;img src="http://2.bp.blogspot.com/_bpUunzIgcNA/RnKM9o3zgfI/AAAAAAAAAEU/jsleco4RgaY/s400/index.png" alt="" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" border="0" id="BLOGGER_PHOTO_ID_5076274720571359730" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;在阅读本篇文章之前，请先仔细阅读前面系列的相关内容。&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;概览&lt;/h2&gt;&lt;br /&gt;在各种框架欣欣向荣的今天，你能想象最初 Java WEB
      开发者的日子吗？要知道，就算是JSP，当时都被寄予厚望，因为当时，开发者不得不在Servlet 中书写之如：out.println("&amp;lt;html&gt;&amp;lt;head&gt;&amp;lt;title&gt;My God&amp;lt;/title&gt;&amp;lt;/head&gt;&amp;lt;body&gt;");&lt;br /&gt;&lt;br /&gt;你能想象，以这种方式做一个象样的页面是怎样的一种情形。这种情况下，是将“表示层”的内容(HTML标记)渗透进Java代码中了，你哪怕是修改页面上的一个文字，你都不得不在上述的 println 中修改 -&gt; 编译 -&gt; 测试-&gt; ...&lt;br /&gt;&lt;br /&gt;于是，JSP应运而生，可是很快，开发者发现，情况反过来了：在JSP页面代码中到处散布有之如：&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="font-family:
      monospace;"&gt;&amp;lt;%&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;String amount =&lt;br /&gt;request.getParameter("amount");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; if&lt;br /&gt;( amount != null &amp;amp;&amp;amp;&lt;br /&gt;amount.length() &gt; 0 ) {&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;...&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;%&gt;&lt;/span&gt;&lt;br
      /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;也就是说，此时表示逻辑的代码渗透进页面代码中了。&lt;br /&gt;&lt;br /&gt;于是才有后来的 JavaBeans, &amp;lt;jsp:useBean&gt;, Taglibs 等，以及术语 WEB MVC, MVC2 等。&lt;br /&gt;&lt;br /&gt;毫无疑问，对于在JAVA Web 领域工作多年的老手，看到我这篇关于 Struts 的文章肯定会觉得好土，或者甚至老掉牙了! 的确，这也是我这段时间一直在考虑是否需要写这样一个系列的原因。&lt;br /&gt;&lt;br /&gt;不管现在 JSF. WebWorks/Struts2, SpringMVC , JBoss Seam 被如何鼓吹，Struts 作为 Web&lt;br /&gt;框架的先行者，还是有它的位置。尽管此例子中所采用的方法比起最新的 Struts (Struts 1.3.x 系列)也同样显得有些陈旧，但是正如 JAVA
      领域中的一惯作法，“在引入新功能前先考虑向后兼容”，因此，新的功能尽管加入吧，你可以欣喜若狂，但我也同样可以一直运行已经稳定运行好几年的产品。&lt;br /&gt;&lt;br /&gt;随便提一下，本人并不认为上述新的WEB框架使开发工作简化了多少，相反，倒是增加了不少复杂性。作为新手，很难保证在研究这些框架一周后能开发出一个稳&lt;br /&gt;定可靠的方案。相反象几个简单的框架反而在引入面向 Page 的设计方法的同时，简化了开发的难度：&lt;a href="http://wicket.sourceforge.net/"&gt;Wicket&lt;/a&gt; &lt;a href="http://click.sourceforge.net/"&gt;Click&lt;/a&gt; ，而且更加符合当今的 Web2 的需求。&lt;br /&gt;&lt;br /&gt;再有，由于 JSTL 的流行，几乎所有的 Web 框架都依靠它来排除JSP脚本。但是我们不会在这里介绍每个 JSTL 标记的用法，具体的用法见工程的JSP 源代码。&lt;br /&gt;&lt;br
      /&gt;好了，一来就说了这么多，无非是为了引入主角 Struts，但是请原谅，关于整个Struts&lt;br /&gt;的介绍是需要一整书才能介绍完的。所以我们还是以代码为依托，一步步来吧。&lt;br /&gt;我们的主题是表示层的相关技术。&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Struts 表示层组件 FormBean&lt;/h2&gt;&lt;h3&gt;FormBean 配置&lt;/h3&gt;&lt;br /&gt;FormBean 即是我们熟悉的 JSP + JavaBean 设置方式中的 JavaBean，只不过它作为 Struts 框架的组件担任起页面表单与 Struts Action的信息传递的使者。&lt;br /&gt;&lt;br /&gt;为了弄清 FormBean 的工作原理，我们现在给出我们整个的 struts-config.xml 文件的内容&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&amp;lt;?xml
      version="1.0"&lt;br /&gt;encoding="GBK"?&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&amp;lt;!DOCTYPE struts-config PUBLIC&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;"-//Apache Software&lt;br /&gt;Foundation//DTD Struts Configuration 1.1//EN"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;"http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:
      monospace;"&gt;&amp;lt;struts-config&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &amp;lt;!-- 配置此应用中的所有 FormBean&lt;br /&gt;--&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &amp;lt;form-beans&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 204, 0);"&gt;&amp;lt;!-- 这种复用&lt;br /&gt;FormBean 的方式值得讨论，见紧随其后的说明 1 --&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;&amp;lt;!--&lt;br
      /&gt;与注册帐户和帐户信息相关的页面使用的 FormBean --&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&amp;lt;form-bean name="accountForm"&lt;br /&gt;type="org.springframework.samples.jpetstore.web.struts.AccountActionForm"/&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;&amp;lt;!--&lt;br /&gt;与购物车相关的页面使用的 FormBean --&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&amp;lt;form-bean
      name="cartForm"&lt;br /&gt;type="org.springframework.samples.jpetstore.web.struts.CartActionForm"/&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="color: rgb(51, 204, 0);"&gt; &amp;lt;!-- 没有对应的页面元素的&lt;br /&gt;FormBean, 例如点击一个链接或按下搜索按钮等等功能，被设计成不需要 FormBean 来收集用户输入 --&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &amp;lt;form-bean&lt;br /&gt;name="emptyForm"&lt;br
      /&gt;type="org.springframework.samples.jpetstore.web.struts.BaseActionForm"/&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;&amp;lt;!-- 与帐户修改相关的页面使用的&lt;br /&gt;FormBean，因为此时也许在当前的 session 已经存在了一个 accountForm --&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &amp;lt;form-bean&lt;br /&gt;name="workingAccountForm"&lt;br
      /&gt;type="org.springframework.samples.jpetstore.web.struts.AccountActionForm"/&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;&amp;lt;!-- 与所有定单操作相关的页面使用的 FormBean --&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &amp;lt;form-bean&lt;br /&gt;name="workingOrderForm"&lt;br /&gt;type="org.springframework.samples.jpetstore.web.struts.OrderActionForm"/&gt;&lt;/span&gt;&lt;br
      /&gt;&lt;span style="font-family: monospace;"&gt; &amp;lt;/form-beans&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;&amp;lt;!-- 全局跳转声明，这此跳转可以被所有的&lt;br /&gt;Action 中共享 --&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&amp;lt;global-forwards&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &amp;lt;forward&lt;br /&gt;name="failure"
      path="/WEB-INF/jsp/struts/Error.jsp"&lt;br /&gt;redirect="false"/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &amp;lt;forward&lt;br /&gt;name="unknown-error" path="/WEB-INF/jsp/struts/Error.jsp"/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &amp;lt;forward&lt;br /&gt;name="global-signon" path="/WEB-INF/jsp/struts/SignonForm.jsp"/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;
      &amp;lt;/global-forwards&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;&amp;lt;!-- 以下为所有的 Action 映射&lt;br /&gt;--&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&amp;lt;action-mappings&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;&amp;lt;!--&lt;br /&gt;点击链接将一只宠物加入购物车 --&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:
      monospace;"&gt;&lt;br /&gt;&amp;lt;action path="/shop/addItemToCart"&lt;br /&gt;type="org.springframework.samples.jpetstore.web.struts.AddItemToCartAction"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;name="cartForm" scope="session" validate="false"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&amp;lt;forward name="success" path="/WEB-INF/jsp/struts/Cart.jsp"/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:
      monospace;"&gt; &amp;lt;/action&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;&amp;lt;!-- 结算购物车&lt;br /&gt;--&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&amp;lt;action path="/shop/checkout"&lt;br /&gt;type="org.springframework.samples.jpetstore.web.struts.ViewCartAction"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;name="cartForm" scope="session" validate="false"&gt;&lt;/span&gt;&lt;br
      /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&amp;lt;forward name="success" path="/WEB-INF/jsp/struts/Checkout.jsp"/&gt;&lt;/span&gt;&amp;lt;/action&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;&amp;lt;!--&lt;br /&gt;修改帐号信息 --&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;action path="/shop/editAccount"&lt;br /&gt;type="org.springframework.samples.jpetstore.web.struts.EditAccountAction"&lt;br /&gt;&lt;br /&gt;name="workingAccountForm" scope="session"
      validate="true"&lt;br /&gt;input="/WEB-INF/jsp/struts/EditAccountForm.jsp"&gt;&lt;br /&gt;&amp;lt;forward name="success" path="/shop/index.do"/&gt;&lt;br /&gt;&amp;lt;/action&gt;&lt;br /&gt;&amp;lt;action&lt;br /&gt;path="/shop/editAccountForm"&lt;br /&gt;type="org.springframework.samples.jpetstore.web.struts.EditAccountFormAction"&lt;br /&gt;name="workingAccountForm" scope="session"&lt;br /&gt;validate="false"&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&amp;lt;forward
      name="success"&lt;br /&gt;path="/WEB-INF/jsp/struts/EditAccountForm.jsp"/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &amp;lt;/action&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &amp;lt;action&lt;br /&gt;path="/shop/index"&lt;br /&gt;type="org.springframework.samples.jpetstore.web.struts.DoNothingAction"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;validate="false"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span
      style="font-family: monospace;"&gt;&lt;br /&gt;&amp;lt;forward name="success" path="/WEB-INF/jsp/struts/index.jsp"/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &amp;lt;/action&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &amp;lt;action&lt;br /&gt;path="/shop/help"&lt;br /&gt;type="org.springframework.samples.jpetstore.web.struts.DoNothingAction"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br
      /&gt;validate="false"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&amp;lt;forward name="success" path="/WEB-INF/jsp/struts/help.jsp"/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &amp;lt;/action&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &amp;lt;action&lt;br /&gt;path="/shop/listOrders"&lt;br /&gt;type="org.springframework.samples.jpetstore.web.struts.ListOrdersAction"&lt;/span&gt;&lt;br /&gt;&lt;span
      style="font-family: monospace;"&gt;&lt;br /&gt;name="accountForm" scope="session" validate="false"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&amp;lt;forward name="success"&lt;br /&gt;path="/WEB-INF/jsp/struts/ListOrders.jsp"/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &amp;lt;/action&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &amp;lt;action&lt;br /&gt;path="/shop/newAccount"&lt;br
      /&gt;type="org.springframework.samples.jpetstore.web.struts.NewAccountAction"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;name="workingAccountForm" scope="session" validate="true"&lt;br /&gt;input="/WEB-INF/jsp/struts/NewAccountForm.jsp"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&amp;lt;forward name="success" path="/shop/index.do"/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;
      &amp;lt;/action&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &amp;lt;action&lt;br /&gt;path="/shop/newAccountForm"&lt;br /&gt;type="org.springframework.samples.jpetstore.web.struts.NewAccountFormAction"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;name="workingAccountForm" scope="session" validate="false"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&amp;lt;forward name="success"&lt;br
      /&gt;path="/WEB-INF/jsp/struts/NewAccountForm.jsp"/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &amp;lt;/action&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;&amp;lt;!--&lt;br /&gt;进入结算中心页面后，点击继续进入此 --&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&amp;lt;action path="/shop/newOrderForm"&lt;br
      /&gt;type="org.springframework.samples.jpetstore.web.struts.NewOrderFormAction"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;name="workingOrderForm" scope="session" validate="false"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&amp;lt;forward name="success"&lt;br /&gt;path="/WEB-INF/jsp/struts/NewOrderForm.jsp"/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &amp;lt;/action&gt;&lt;br /&gt;&lt;br
      /&gt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt; &lt;span style="font-weight: bold; color: rgb(51, 204, 0);"&gt;&amp;lt;!-- &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 204, 0); font-family: monospace;"&gt;&lt;br /&gt;fixed by pprun: 将原先混在一起的逻辑打破成几个小部分，否则在多步向导式提交&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 204, 0); font-family: monospace;"&gt;&lt;br /&gt;页面中的任何一步出错都无理地返回到 NewOrderForm.jsp
      页面，而不是真正的出错的页面&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(51, 204, 0); font-family: monospace;"&gt;&lt;br /&gt;--&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &amp;lt;!--&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &amp;lt;action&lt;br /&gt;path="/shop/newOrder"&lt;br /&gt;type="org.springframework.samples.jpetstore.web.struts.NewOrderAction"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br
      /&gt;name="workingOrderForm" scope="session" validate="true"&lt;br /&gt;input="/WEB-INF/jsp/struts/NewOrderForm.jsp"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&amp;lt;forward name="confirm"&lt;br /&gt;path="/WEB-INF/jsp/struts/ConfirmOrder.jsp"/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&amp;lt;forward name="shipping"&lt;br /&gt;path="/WEB-INF/jsp/struts/ShippingForm.jsp"/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span
      style="font-family: monospace;"&gt;&lt;br /&gt;&amp;lt;forward name="success" path="/WEB-INF/jsp/struts/ViewOrder.jsp"/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &amp;lt;/action&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; --&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0); font-weight: bold;"&gt;&amp;lt;!--&lt;br /&gt;填写定单信息的多页向导式页面 --&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204,
      0);"&gt;&amp;lt;!--&lt;br /&gt;当第一页校验失败时，需要跳回填写购物单的第一页 --&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&amp;lt;action path="/shop/newOrderStep1"&lt;br /&gt;type="org.springframework.samples.jpetstore.web.struts.NewOrderAction"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;name="workingOrderForm" scope="session" validate="true"&lt;br /&gt;input="/shop/newOrderForm.do"&gt;&lt;/span&gt;&lt;br
      /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&amp;lt;forward name="confirm"&lt;br /&gt;path="/WEB-INF/jsp/struts/ConfirmOrder.jsp"/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&amp;lt;forward name="shipping"&lt;br /&gt;path="/WEB-INF/jsp/struts/ShippingForm.jsp"/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &amp;lt;/action&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 204, 0); font-family:
      monospace;"&gt;&amp;lt;!--&lt;br /&gt;&lt;span&gt;(只有页面上填写了将宠物送到不同的地址时，默认为送到当前用户的地址)，&lt;/span&gt;&lt;br /&gt;&lt;span&gt;才会出现此面。此页校验失败，毫无疑问应该回到这个新地址填写页，&lt;/span&gt;&lt;br /&gt;&lt;span&gt;而不是整个流程的第一页。这就是原版中的BUG所在处，因为它将这个向导性的流程&lt;/span&gt;&lt;br /&gt;&lt;span&gt;处理放到了一个映射中，所以没法处理这种情况 --&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt; &amp;lt;action&lt;br /&gt;path="/shop/newOrderStep2"&lt;br
      /&gt;type="org.springframework.samples.jpetstore.web.struts.NewOrderAction"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;name="workingOrderForm" scope="session" validate="true"&lt;br /&gt;input="/WEB-INF/jsp/struts/ShippingForm.jsp"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&amp;lt;forward name="confirm"&lt;br /&gt;path="/WEB-INF/jsp/struts/ConfirmOrder.jsp"/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:
      monospace;"&gt; &amp;lt;/action&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 204, 0); font-family: monospace;"&gt;&amp;lt;!--&lt;br /&gt;当在最后一步确认时出错，需要跳回填写购物单的第一页 --&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &amp;lt;action&lt;br /&gt;path="/shop/newOrderStep3"&lt;br /&gt;type="org.springframework.samples.jpetstore.web.struts.NewOrderAction"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;name="workingOrderForm"
      scope="session" validate="true"&lt;br /&gt;input="/WEB-INF/jsp/struts/NewOrderForm.jsp"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&amp;lt;forward name="success" path="/WEB-INF/jsp/struts/ViewOrder.jsp"/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &amp;lt;/action&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &amp;lt;!-- fixed&lt;br /&gt;end --&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:
      monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &amp;lt;action&lt;br /&gt;path="/shop/removeItemFromCart"&lt;br /&gt;type="org.springframework.samples.jpetstore.web.struts.RemoveItemFromCartAction"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;name="cartForm" scope="session"
      validate="false"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&amp;lt;forward name="success" path="/WEB-INF/jsp/struts/Cart.jsp"/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &amp;lt;/action&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &amp;lt;action&lt;br /&gt;path="/shop/searchProducts"&lt;br /&gt;type="org.springframework.samples.jpetstore.web.struts.SearchProductsAction"&lt;/span&gt;&lt;br /&gt;&lt;span
      style="font-family: monospace;"&gt;&lt;br /&gt;name="emptyForm" scope="session" validate="false"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&amp;lt;forward name="success"&lt;br /&gt;path="/WEB-INF/jsp/struts/SearchProducts.jsp"/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &amp;lt;/action&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &amp;lt;action&lt;br /&gt;path="/shop/signon"&lt;br
      /&gt;type="org.springframework.samples.jpetstore.web.struts.SignonAction"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;name="accountForm" scope="session" validate="false"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&amp;lt;forward name="success" path="/shop/index.do"/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &amp;lt;/action&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;
      &amp;lt;action&lt;br /&gt;path="/shop/signonForm"&lt;br /&gt;type="org.springframework.samples.jpetstore.web.struts.DoNothingAction"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;validate="false"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&amp;lt;forward name="success"&lt;br /&gt;path="/WEB-INF/jsp/struts/SignonForm.jsp"/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;
      &amp;lt;/action&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &amp;lt;action&lt;br /&gt;path="/shop/updateCartQuantities"&lt;br /&gt;type="org.springframework.samples.jpetstore.web.struts.UpdateCartQuantitiesAction"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;name="cartForm" scope="session" validate="false"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&amp;lt;forward name="success"
      path="/WEB-INF/jsp/struts/Cart.jsp"/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &amp;lt;/action&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &amp;lt;action&lt;br /&gt;path="/shop/viewCart"&lt;br /&gt;type="org.springframework.samples.jpetstore.web.struts.ViewCartAction"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;name="cartForm" scope="session" validate="false"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span
      style="font-family: monospace;"&gt;&lt;br /&gt;&amp;lt;forward name="success" path="/WEB-INF/jsp/struts/Cart.jsp"/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &amp;lt;/action&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &amp;lt;action&lt;br /&gt;path="/shop/viewCategory"&lt;br /&gt;type="org.springframework.samples.jpetstore.web.struts.ViewCategoryAction"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br
      /&gt;name="emptyForm" scope="session" validate="true"&lt;br /&gt;input="/WEB-INF/jsp/struts/index.jsp"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&amp;lt;forward name="success" path="/WEB-INF/jsp/struts/Category.jsp"/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &amp;lt;/action&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &amp;lt;action&lt;br /&gt;path="/shop/viewItem"&lt;br
      /&gt;type="org.springframework.samples.jpetstore.web.struts.ViewItemAction"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;name="emptyForm" scope="session" validate="true"&lt;br /&gt;input="/WEB-INF/jsp/struts/Product.jsp"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&amp;lt;forward name="success" path="/WEB-INF/jsp/struts/Item.jsp"/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;
      &amp;lt;/action&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &amp;lt;action&lt;br /&gt;path="/shop/viewOrder"&lt;br /&gt;type="org.springframework.samples.jpetstore.web.struts.ViewOrderAction"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;name="accountForm" scope="session" validate="false"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&amp;lt;forward name="success"
      path="/WEB-INF/jsp/struts/ViewOrder.jsp"/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &amp;lt;/action&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &amp;lt;action&lt;br /&gt;path="/shop/viewProduct"&lt;br /&gt;type="org.springframework.samples.jpetstore.web.struts.ViewProductAction"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;name="emptyForm" scope="session" validate="true"&lt;br
      /&gt;input="/WEB-INF/jsp/struts/index.jsp"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&amp;lt;forward name="success" path="/WEB-INF/jsp/struts/Product.jsp"/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &amp;lt;/action&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &amp;lt;/action-mappings&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span
      style="font-family: monospace;"&gt;&amp;lt;/struts-config&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;说明：&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;1. 从FormBean 的数量和每个使用了FormBean的 Action 映射可知，这里存在 FormBean&lt;br /&gt;复用问题，即用一个来服务多个 Action, 这种方式可以大大减少 FormBean 的数量，&lt;br /&gt;但是，在 Action中的逻辑变得复杂了。因为在 FormBean 中包括了所有 Action 的需求，&lt;br /&gt;而在Action中不得不排除它所不需要的元素的干扰。这样使代码看起来很混乱。&lt;br /&gt;&lt;br /&gt;2. 有了全局声明，在 Action 的代码中就可以随时发出
      mapping.findForward("failure");&lt;br /&gt;之类的代码，而不需要在对应的 Action 映射中配置该 &amp;lt;forward&gt; 子元素.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;3. 注释掉的 Action 映射是为了修复一个BUG：&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;/span&gt;&lt;br /&gt;因为在涉及到定单提交时，采用的是多页提交(也就向导页面)方式，即收集的信息是从连续多个&lt;br /&gt;页面中获得的，而不是普通的从一个页面中得到的。这样就涉及到，当其中的一个页面出现校验&lt;br /&gt;失败时，将要将流控跳转到出错的页面，通过将原先混在一起的逻辑打破成几个小部分，&lt;br /&gt;否则在多步向导式提交页面中的任何一步出错都无理地返回到 NewOrderForm.jsp
      页面，&lt;br /&gt;而不是真正的出错的页面,请看相应的映射元素的注释说明。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;4. 为了保持连贯性，关于每个映射元素的每个属性，我们重复 &lt;a href="http://pprun.blogspot.com/2007/05/hibernate-jpetstore_31.html"&gt;Hibernate&lt;br /&gt;JPetstore 系列之三: 控制层技术&lt;/a&gt; 中的 ActionForm &amp;lt;-- struts-config.xml --&gt;Action 部分的内容：&lt;br /&gt;&lt;br /&gt;1. path=&lt;span style="font-weight: bold;"&gt;/shop/editAccount&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;所有要去住 /shop/editAccount （严格地讲，如果按照Struts 的方言是 /shop/editAccount.do)&lt;br
      /&gt;的请求，都要遵循这里的配置&lt;br /&gt;&lt;br /&gt;2. &lt;span style="font-weight: bold;"&gt;name="workingAccountForm"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;都将绑定 workingAccountForm ，注意 form-bean 在 Action 中引用是通过 name&lt;br /&gt;属性来引用的，它是在一开始定义的: &amp;lt;form-bean name="workingAccountForm"&lt;br /&gt;type="org.springframework.samples.jpetstore.web.struts.AccountActionForm"/&gt;&lt;br /&gt;&lt;br /&gt;3. &lt;span style="font-weight: bold;"&gt;scope="session"&lt;/span&gt; 该 bean&lt;br /&gt;&lt;br /&gt;将在整个会话其间始终有效
      ，但注意这个配置是多余的，默认就是 session 上下文的，反而如果 bean 只在&lt;br /&gt;request上下文时，才需要明确地声明。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;4. validate="true" 将对表单的输入调用 form-bean 的 validate 方法。但我们发现在&lt;br /&gt;AccountActionForm.java 中，只有 doValidate(...) 方法，并没有 validate()方法，&lt;br /&gt;但细心的话，应该发现了，和所有的Action 都是从BaseAction 中派生而来一样，&lt;br /&gt;所有的ActionForm 中都是从一个基类 BaseActionForm.java 中派生下来。&lt;br /&gt;&lt;br /&gt;其中定义了所有 formbean都需要的东西，对于校验错误的处理。&lt;br /&gt;&lt;br /&gt;其中就是 validate(...) 方法，并在其中调用了 doValidate() 方法，&lt;br
      /&gt;&lt;br /&gt;而每个BaseActionForm 的子类只要override 这个doValidate() 方法，&lt;br /&gt;&lt;br /&gt;如果 validate="true"声明了的话，那么子类中的 doValidate() 方法将会被调用。这是多态性的表现。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;5. input="..." 一般来讲，一个表单在校验失败后都需要回去重纠正错误的输出项，&lt;br /&gt;所以我们通过这个值来告诉 Struts该回到哪去纠错.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;FormBean 类层次&lt;/h3&gt;&lt;br /&gt;与 Action 类一样，FormBean 也基于类的继承关系设计的，这样子类 FormBean&lt;br /&gt;只需实现父类 FormBean指定的约束，所有的子类都复用父类中的功能并按照这种设计约束工作。&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;基类
      BaseActionForm&lt;/h4&gt;该类本身又是从 抽象类 org.apache.struts.action.ActionForm 派生而来，&lt;br /&gt;所以应用中的所有 FormBean只要从 BaseActionForm 派生即可：&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;public class BaseActionForm&lt;br /&gt;extends ActionForm {&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt; /**&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt; *此乃最原始的错误处理方法，将所有错误信息加入到一个列表后，然后存入到&lt;/span&gt;&lt;br /&gt;&lt;span style="color:
      rgb(51, 204, 0);"&gt; *Servlet 请求属性中供页面使用.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt; *更现代的方法是使用 Struts1.1 之后的 commons-validator,关于这个功能在&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt; * 各种关于Struts 的参考或书籍中都有介绍。&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt; *&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt; *是否为调用此方法是通过属性 &lt;span style="color: rgb(102, 0, 204);"&gt;&lt;span style="color: rgb(255, 0,
      0);"&gt;validate&lt;/span&gt; &lt;/span&gt;来控制的，如：&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt; *&amp;lt;action path="/shop/signon"type="org.springframework.samples.jpetstore.web.struts.SignonAction"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt; *name="accountForm" scope="session" &lt;span style="color: rgb(255, 0, 0);"&gt;validate="false"&lt;/span&gt;&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt; *是不会调用的，因为
      validate="false".&lt;br /&gt;　　　&lt;br /&gt; * 这是“模板方法”（Template method) 设计模式中的“方法”&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 204, 0);"&gt; */&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;public ActionErrors validate(ActionMapping mapping,&lt;br /&gt;HttpServletRequest request) {&lt;br /&gt;ActionErrors errorMessages =&lt;br /&gt;null;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;// 整个系统的错误信息列表，通过调用doValidate(mapping, request,
      errorList);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;&lt;br /&gt;// addErrorIfStringEmpty 会将错误信息加入到列表当中，并且它被存入了请求属性当中.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;ArrayList errorList = new&lt;br /&gt;ArrayList();&lt;br /&gt;&lt;br /&gt;doValidate(mapping, request,&lt;br /&gt;errorList);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;request.setAttribute("errors", errorList);&lt;br /&gt;&lt;br /&gt;if (!errorList.isEmpty()) {&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;errorMessages = new
      org.apache.struts.action.ActionErrors();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;errorMessages.add(ActionErrors.GLOBAL_MESSAGE, new&lt;br /&gt;ActionMessage("global.error"));&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;return errorMessages;&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt; *此方法被设计为供子类覆盖的(overriding).&lt;/span&gt;&lt;br /&gt;&lt;span style="color:
      rgb(51, 204, 0);"&gt; *任何子类实现了这个方法，将自动被上面的 validate 方法调用。&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt; *&lt;br /&gt; * 这是“模板方法"模式中的默认钓子方法，由子类的实现方法来替换。&lt;br /&gt; *&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 204, 0);"&gt; * @param mapping&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt; * @param request&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt; * @param&lt;br /&gt;errors&lt;/span&gt;&lt;br /&gt;&lt;span style="color:
      rgb(51, 204, 0);"&gt; */&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;public void doValidate(ActionMapping mapping,&lt;br /&gt;HttpServletRequest request, List errors) {&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt; *此辅助方法被用来给定的页面输入内容是否为空，如果是空的话，将显示给定的出错信息。&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt; *&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51,
      204, 0);"&gt; * @param errors 错误信息列表&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt; * @param message 当 value 为空时，将显示这个错误信息&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt; * @param value 页面元素对应的值&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt; */&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;protected void addErrorIfStringEmpty(List errors,&lt;br /&gt;String message, String value) {&lt;br /&gt;&lt;br /&gt;if (value == null ||&lt;br
      /&gt;value.trim().length() &amp;lt; 1) {&lt;br /&gt;&lt;br /&gt;errors.add(message);&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;BaseActionForm 子类实例 AccountActionForm&lt;/h4&gt;&lt;br /&gt;我仅介绍一个子类 &lt;span style="font-family: monospace;"&gt;AccountActionForm :&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span
      style="font-family: monospace;"&gt;public class AccountActionForm&lt;br /&gt;extends BaseActionForm {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &lt;span style="color: rgb(51, 204, 0);"&gt;/** 用于检验的常量定义，因为在新建帐户与修改帐户时检验逻辑是不一样的。&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 204, 0); font-family: monospace;"&gt;&lt;br /&gt;* 至少在修改帐户时，帐户名是已经存在了 */&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:
      monospace;"&gt; public static final String VALIDATE_EDIT_ACCOUNT = "editAccount";&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; public static final String VALIDATE_NEW_ACCOUNT = "newAccount";&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &lt;span style="color: rgb(51, 204, 0);"&gt;/** 用于存贮用户的首先语言的列表 */&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;
      private static final ArrayList LANGUAGE_LIST = new ArrayList();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &lt;span style="color: rgb(51, 204, 0);"&gt;/* Private Fields */&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0); font-family: monospace;"&gt;&lt;br /&gt;// 看起来好象与 Account 中的成员重复了，这是因为此 Form 被多个页面重复使用的&lt;/span&gt;&lt;span style="color: rgb(51, 204, 0); font-family:
      monospace;"&gt;&lt;br /&gt;// 结果，因为在登录页面时，那时根本不存在 Account, 所以不可能通过&lt;/span&gt;&lt;span style="color: rgb(51, 204, 0); font-family: monospace;"&gt;&lt;br /&gt;// account.getUsername() 和 account.getPassword() 来得到用户的输入值的，&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0); font-family: monospace;"&gt;&lt;br /&gt;// 下面两项即是在登录当时收集输入 信息，&lt;/span&gt; &lt;span style="color: rgb(51, 204, 0); font-family: monospace;"&gt;&lt;br /&gt;// 其它情况（比如修改，新建帐户时）都是间接使用了 Account
      中的成员，因当时都&lt;/span&gt; &lt;span style="color: rgb(51, 204, 0); font-family: monospace;"&gt;&lt;br /&gt;// 已经在 session 中存放了一个 Account 的实例&lt;/span&gt; &lt;span style="color: rgb(51, 204, 0); font-family: monospace;"&gt;&lt;br /&gt;// 所以重用是有代价的（使代码不那么直观了，如果是一个页面表单 Form 对应一个&lt;/span&gt; &lt;span style="color: rgb(51, 204, 0); font-family: monospace;"&gt;&lt;br /&gt;// FormBean 的话，以下成员与页面中的输入元素是一一对应的）&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0); font-family: monospace;"&gt;
      &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0); font-family: monospace;"&gt;&lt;br /&gt;// 供登录页面使用的 元素&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; private String username;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; private String password;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &lt;span style="color: rgb(51, 204, 0);"&gt;//
      登录后，与帐户相关的元素&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; private String repeatedPassword;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; private List languages;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; private List categories;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204,
      0);"&gt;/**&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 204, 0); font-family: monospace;"&gt;&lt;br /&gt;* 这个成员的值是通过页面隐藏元素传入的：&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0); font-family: monospace;"&gt;* &lt;span style="color: rgb(51, 51, 255);"&gt;NewAccountForm.jsp 中: &amp;lt;html:hidden name="workingAccountForm" property="validate"&lt;br /&gt;value="newAccount"/&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255); font-family:
      monospace;"&gt;* EditAccountForm.jsp 中:&amp;lt;html:hidden name="workingAccountForm" property="validate" value="editAccount" /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0); font-family: monospace;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; private String validate;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="color: rgb(51, 204,
      0);"&gt;/**&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 204, 0); font-family: monospace;"&gt;&lt;br /&gt;* 用来记住用户是从哪里跳转过来的，因为准备对购物车进行结算时，如果没有登录&lt;/span&gt;&lt;span style="color: rgb(51, 204, 0); font-family: monospace;"&gt;&lt;br /&gt;* 的话，首先将结算中心页面的地址存入此成员中，登录成功后再跳转过去。&lt;/span&gt;&lt;span style="color: rgb(51, 204, 0); font-family: monospace;"&gt;&lt;br /&gt;* 如果没有这样一步操作的话，那么就会出现讨厌的将你送回首页面(也就是程序&lt;/span&gt;&lt;span style="color: rgb(51, 204, 0); font-family: monospace;"&gt;&lt;br
      /&gt;* 的逻辑流程打扰了用户的进程，&lt;span style="color: rgb(255, 0, 0);"&gt;这是最应当避免的&lt;/span&gt;。)&lt;/span&gt;&lt;span style="color: rgb(51, 204, 0); font-family: monospace;"&gt;&lt;br /&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; private String forwardAction;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;/**&lt;/span&gt;&lt;/span&gt;&lt;span
      style="color: rgb(51, 204, 0); font-family: monospace;"&gt;&lt;br /&gt;* 所有的帐号信息放在这个 POJO 中&lt;/span&gt;&lt;span style="color: rgb(51, 204, 0); font-family: monospace;"&gt;&lt;br /&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; private Account account;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="color:
      rgb(51, 204, 0);"&gt;/**&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 204, 0); font-family: monospace;"&gt;&lt;br /&gt;* 用于显示标语，当你在用户信息页面选择显示标语时&lt;/span&gt;&lt;span style="color: rgb(51, 204, 0); font-family: monospace;"&gt;&lt;br /&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; private String bannerName;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;span
      style="color: rgb(51, 204, 0);"&gt;/**&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 204, 0); font-family: monospace;"&gt;&lt;br /&gt;* 用于显示根据用户的喜好被推荐的宠物列表,当你选择了显示该列表时。&lt;/span&gt;&lt;span style="color: rgb(51, 204, 0); font-family: monospace;"&gt;&lt;br /&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; private PagedListHolder myList;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:
      monospace;"&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;/**&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 204, 0); font-family: monospace;"&gt;&lt;br /&gt;* 用户最喜欢的宠物类别&lt;/span&gt;&lt;span style="color: rgb(51, 204, 0); font-family: monospace;"&gt;&lt;br /&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; private String favCategoryName;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:
      monospace;"&gt; /* Static Initializer */&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; static {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;LANGUAGE_LIST.add("english");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;LANGUAGE_LIST.add("japanese");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; }&lt;/span&gt;&lt;br
      /&gt;&lt;span style="font-family: monospace;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; public AccountActionForm() {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;languages = LANGUAGE_LIST;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; public PagedListHolder getMyList()
      {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;return myList;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; public void setMyList(PagedListHolder myList) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;this.myList = myList;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;span
      style="font-family: monospace;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; public String getForwardAction() {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;return forwardAction;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; public void setForwardAction(String forwardAction) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:
      monospace;"&gt;&lt;br /&gt;this.forwardAction = forwardAction;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; public String getUsername() {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;return username;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;span
      style="font-family: monospace;"&gt; public void setUsername(String username) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;this.username = username;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; public String getPassword() {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br
      /&gt;return password;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; }&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt; public void setPassword(String password) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;this.password = password;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span
      style="font-family: monospace;"&gt; public String getRepeatedPassword() {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;return repeatedPassword;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; }&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt; public void setRepeatedPassword(String repeatedPassword) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;this.repeatedPassword =
      repeatedPassword;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; public Account getAccount() {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;return account;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;
      &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; public void setAccount(Account account) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;this.account = account;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; public List getLanguages() {&lt;/span&gt;&lt;br /&gt;&lt;span
      style="font-family: monospace;"&gt;&lt;br /&gt;return languages;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; public void setLanguages(List languages) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;this.languages = languages;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;
      &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; public List getCategories() {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;return categories;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; public void setCategories(List categories) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;this.categories =
      categories;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; public String getBannerName() {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;return bannerName;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;
      &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; public void setBannerName(String bannerName) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;this.bannerName = bannerName;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; public String getFavCategoryName() {&lt;/span&gt;&lt;br
      /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;return favCategoryName;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; public void setFavCategoryName(String favCategoryName) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;this.favCategoryName = favCategoryName;&lt;/span&gt;&lt;br /&gt;&lt;span
      style="font-family: monospace;"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; public String getValidate() {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;return validate;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; }&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt; public void setValidate(String validate)
      {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;this.validate = validate;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &lt;span style="color: rgb(51, 204, 0);"&gt;/**&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 204, 0); font-family: monospace;"&gt;&lt;br /&gt; *
      覆盖父类中的方法”默认钓子“方法，用于特定于此子类的输入校验&lt;/span&gt;&lt;span style="color: rgb(51, 204, 0); font-family: monospace;"&gt;&lt;br /&gt; */&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; public void doValidate(ActionMapping mapping,&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;HttpServletRequest request, List errors) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;if (validate != null) {&lt;/span&gt;&lt;br /&gt;&lt;span
      style="font-family: monospace;"&gt;&lt;br /&gt;if (VALIDATE_EDIT_ACCOUNT.equals(validate) ||&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &lt;br /&gt;VALIDATE_NEW_ACCOUNT.equals(validate)) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;if (VALIDATE_NEW_ACCOUNT.equals(validate)) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt; //
      是新建帐户时，需要额外的校验&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;account.setStatus("OK");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &lt;br /&gt;addErrorIfStringEmpty(errors, "User ID is required.",&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &lt;br /&gt;account.getUsername());&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span
      style="font-family: monospace;"&gt; &lt;br /&gt;if (account.getPassword() == null ||&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &lt;br /&gt;account.getPassword().length() &amp;lt; 1 ||&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &lt;br /&gt;!account.getPassword().equals(repeatedPassword)) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &lt;br /&gt;errors.add("Passwords did not match or were not provided. " +&lt;/span&gt;&lt;br
      /&gt;&lt;span style="font-family: monospace;"&gt; &lt;br /&gt;"Matching passwords are required.");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;if (account.getPassword() != null &amp;amp;&amp;amp;&lt;/span&gt;&lt;br
      /&gt;&lt;span style="font-family: monospace;"&gt; &lt;br /&gt;account.getPassword().length() &gt; 0) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &lt;br /&gt;if (!account.getPassword().equals(repeatedPassword)) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &lt;br /&gt;errors.add("Passwords did not match.");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:
      monospace;"&gt;&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;addErrorIfStringEmpty(errors, "First name is required.",&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &lt;br /&gt;this.account.getFirstname());&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;addErrorIfStringEmpty(errors, "Last name is
      required.",&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &lt;br /&gt;this.account.getLastname());&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;addErrorIfStringEmpty(errors, "Email address is required.",&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &lt;br /&gt;this.account.getEmail());&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;addErrorIfStringEmpty(errors, "Phone number is
      required.",&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &lt;br /&gt;this.account.getPhone());&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;addErrorIfStringEmpty(errors, "Address (1) is required.",&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &lt;br /&gt;this.account.getUserAddr().getAddr1());&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;addErrorIfStringEmpty(errors, "City is
      required.",&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &lt;br /&gt;this.account.getUserAddr().getCity());&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;addErrorIfStringEmpty(errors, "State is required.",&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &lt;br /&gt;this.account.getUserAddr().getState());&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;addErrorIfStringEmpty(errors, "ZIP is
      required.",&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &lt;br /&gt;this.account.getUserAddr().getZipcode());&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;addErrorIfStringEmpty(errors, "Country is required.",&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &lt;br /&gt;this.account.getUserAddr().getCountry());&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;}&lt;/span&gt;&lt;br
      /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &lt;span style="color: rgb(51, 204, 0);"&gt;/**&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0); font-family:
      monospace;"&gt;&lt;br /&gt;* 此方法是一个很重要的方法，我们看看基类中对该方法的描述:&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0); font-family: monospace;"&gt;&lt;br /&gt;*&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0); font-family: monospace;"&gt;&lt;br /&gt;* Reset bean properties to their default state, as needed.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0); font-family: monospace;"&gt;&lt;br /&gt;* This method is called before the properties are repopulated by the&lt;br
      /&gt;controller.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0); font-family: monospace;"&gt;&lt;br /&gt;* 在需要时，复位 Bean 的属性值，此方法是在控制器重新组装Bean的属性值之前调用的。&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0); font-family: monospace;"&gt;&lt;br /&gt;*&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0); font-family: monospace;"&gt;&lt;br /&gt;* The default implementation does nothing. In practice, the only&lt;br /&gt;properties&lt;/span&gt;&lt;br /&gt;&lt;span
      style="color: rgb(51, 204, 0); font-family: monospace;"&gt;&lt;br /&gt;* that need to be reset are those which represent checkboxes on a&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0); font-family: monospace;"&gt;&lt;br /&gt;* session-scoped form. Otherwise, properties can be given initial values&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0); font-family: monospace;"&gt;&lt;br /&gt;* where the field is declared.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51,
      204, 0); font-family: monospace;"&gt;&lt;br /&gt;* 默认的实现，并没有做任何事。实际上，唯一需要重置的属性是那些基于&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0); font-family: monospace;"&gt;&lt;br /&gt;* session 作用域的复选框页面元素。否则这些元素将使用页面上声明的默认值。&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0); font-family: monospace;"&gt;&lt;br /&gt;* 是勾选还是未勾选。&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0); font-family: monospace;"&gt;&lt;br /&gt;*&lt;/span&gt;&lt;br /&gt;&lt;span style="color:
      rgb(51, 204, 0); font-family: monospace;"&gt;&lt;br /&gt;* If the form is stored in session-scope so that values can be collected&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0); font-family: monospace;"&gt;&lt;br /&gt;* over multiple requests (a "wizard"), you must be very careful of&lt;br /&gt;which properties,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0); font-family: monospace;"&gt;&lt;br /&gt;* if any, are reset. As mentioned, session-scope checkboxes must
      be&lt;br /&gt;reset to&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0); font-family: monospace;"&gt;&lt;br /&gt;* false for any page where this property is set. This is because the&lt;br /&gt;client&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0); font-family: monospace;"&gt;&lt;br /&gt;* does not submit a checkbox value when it is clear (false).&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0); font-family: monospace;"&gt;&lt;br /&gt;* If a session-scoped
      checkbox is not proactively reset, it can never&lt;br /&gt;be set to false.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0); font-family: monospace;"&gt;&lt;br /&gt;* 假如表单是存贮在 Session 作用域中(如：&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0); font-family: monospace;"&gt;&lt;br /&gt;* &lt;span style="color: rgb(102, 51, 255);"&gt;&amp;lt;action&lt;br /&gt;path="/shop/signon"&lt;br
      /&gt;type="org.springframework.samples.jpetstore.web.struts.SignonAction"&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(102, 51, 255); font-family: monospace;"&gt;&lt;br /&gt;* name="accountForm" &lt;span style="color: rgb(255, 0, 0);"&gt;scope="session"&lt;/span&gt;&lt;br /&gt;validate="false"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0); font-family: monospace;"&gt;&lt;br /&gt;* 即声明为 session 范围的 formBean)的话，表单元素的值可以在多个请求(即多页向导性页面)&lt;/span&gt;&lt;br
      /&gt;&lt;span style="color: rgb(51, 204, 0); font-family: monospace;"&gt;&lt;br /&gt;* 中被收集，此时必须小心对等哪些输入域必须重置。象我们前面所述，session&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0); font-family: monospace;"&gt;&lt;br /&gt;* 作用域范围内的 checkbox(复选按钮)，在为它们设置值之前必须重置为 false，&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0); font-family: monospace;"&gt;&lt;br /&gt;* 因为客户端(即浏览器)在复选按钮未被勾选时并不会发送任何值到服务器端。(否则，&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0); font-family:
      monospace;"&gt;&lt;br /&gt;* 就出现这样的问题：如果之前该复选按钮是勾选状态，并且用户请求这一页面&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0); font-family: monospace;"&gt;&lt;br /&gt;* 该按钮显示为勾选状态，在后续的操作中，用户取消选中状态。但是因为 checkbox&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0); font-family: monospace;"&gt;&lt;br /&gt;* 在取消选中状态后，浏览器并不发送任何关于这个控件的信息，但 ActionForm 中&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0); font-family: monospace;"&gt;&lt;br /&gt;*
      要改变控制的状态，必须比较浏览器传上来的状态和当前状态，但因为浏览器并未&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0); font-family: monospace;"&gt;&lt;br /&gt;* 告知它，所以 ActionForm 认为这个控件的状态并未改变。因为从这时开始，无论&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0); font-family: monospace;"&gt;&lt;br /&gt;* 用户怎么做，&lt;span style="color: rgb(255, 0, 0);"&gt;这个控件将永远保持为选中状态&lt;/span&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0); font-family: monospace;"&gt;&lt;br /&gt;*/&lt;/span&gt;&lt;br
      /&gt;&lt;span style="font-family: monospace;"&gt; public void&lt;br /&gt;reset(ActionMapping mapping, HttpServletRequest request) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;super.reset(mapping, request);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;setUsername(null);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;setPassword(null);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:
      monospace;"&gt;&lt;br /&gt;setRepeatedPassword(null);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;// BUG here: by pprun&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0); font-family: monospace;"&gt;&lt;br /&gt;// 按照此方法的 api 文档说明，说 checkbox 的值必须在此复位，&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);
      font-family: monospace;"&gt;&lt;br /&gt;//可是 NewAccountForm.jsp 中 Enable MyList 和 Enable MyBanner 却没有&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0); font-family: monospace;"&gt;&lt;br /&gt;// 所以当用户第一次选中后，以后想改为未选中是没门了，(除了象程序控制那样：&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0); font-family: monospace;"&gt;&lt;br /&gt;// 比如：&lt;br /&gt;acctForm.getAccount().setDisplayMylist(&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0); font-family: monospace;"&gt;&lt;br
      /&gt;//&lt;br /&gt;request.getParameter("account.displayMylist") != null);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0); font-family: monospace;"&gt;&lt;br /&gt;// acctForm.getAccount().setDisplayBanner(&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0); font-family: monospace;"&gt;&lt;br /&gt;//&lt;br /&gt;request.getParameter("account.displayBanner") != null);)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0); font-family: monospace;"&gt;&lt;br
      /&gt;//&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0); font-family: monospace;"&gt;&lt;br /&gt;// 但是当输入错误时重新显示当前页面时，上次选为未选中状态被丢失了！&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0); font-family: monospace;"&gt;&lt;br /&gt;//&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0); font-family: monospace;"&gt;&lt;br /&gt;// 因为按照 api 的说明&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0); font-family: monospace;"&gt;&lt;br /&gt;// 当 checkbox
      为未选中状态时，浏览器是不会发信息到服务器端的，所以&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0); font-family: monospace;"&gt;&lt;br /&gt;// struts 无法设置其值&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0); font-family: monospace;"&gt;&lt;br /&gt;// 解决办法：&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;if (getAccount() != null) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;getAccount().setDisplayMylist(false);&lt;/span&gt;&lt;br
      /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;getAccount().setDisplayBanner(false);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; }&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;基于 JSTL 和 Struts HTML Tag 的 JSP&lt;/h2&gt;&lt;br /&gt;我们主要介绍一下JSP文件的总体结构。&lt;br /&gt;&lt;br /&gt;&lt;br
      /&gt;&lt;br /&gt;由于此应用在表示层来讲，大体上还是属于 Demo 级别的，所以并未采用 Struts Tile&lt;br /&gt;技术来对页面布局进行管理。而是使用传统的JSP表态包含指令，来包含进公共部分，如页眉，页脚及导航区域等。&lt;br /&gt;&lt;br /&gt;所有以 Include 前缀命名的JSP都用来被其它JSP页面包含的页面块。例如：&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&amp;lt;%@ include&lt;br /&gt;file="IncludeTop.jsp" %&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; 页面的具体内容&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:
      monospace;"&gt;&amp;lt;%@ include&lt;br /&gt;file="IncludeBottom.jsp" %&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;在 IncludeTop.jsp 中声明：&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&amp;lt;%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&amp;lt;%@ taglib prefix="fmt" uri="http://java.sun.com/jstl/fmt"
      %&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&amp;lt;%@ taglib prefix="html" uri="http://jakarta.apache.org/struts/tags-html" %&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;这样我们就不需要在所有用到JSTL的页面中重复声明。&lt;br /&gt;同时，我们并没有使用 Struts 的 Bean 和 Logic 等标记库，因为在 Struts 网站上声明有：&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Note:&lt;/strong&gt; - Many of the features in this taglib are also&lt;br /&gt;available in the &lt;a
      href="http://java.sun.com/products/jsp/jstl/"&gt;&lt;br /&gt;JavaServer Pages Standard Tag Library (JSTL).&lt;/a&gt; The Apache Struts&lt;br /&gt;group encourages the use of the standard tags over the Struts specific&lt;br /&gt;tags when possible.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;避免重复提交&lt;/h2&gt;&lt;br /&gt;避免重复提交是一项挑战性的工作，如果你曾经真正参与过一个基于 B/S 结构的项目的话，&lt;br /&gt;甚至基于 C/S结构的界面也同样有这样的工作，正不过在那个领域叫做控制状态管理，&lt;br /&gt;比如，当你按下一个登录按钮后，而按钮并没有变为disable/不可用状态，&lt;br
      /&gt;你可能在不经意间又点了一次该按钮，那么在一瞬间你肯定登录了两次，这种情况还好，&lt;br /&gt;因为登录并不伤害系统的其它情况，只不过统计系统或许会感觉到纳闷，&lt;br /&gt;为什么在不到两秒钟内，你登录了两次？&lt;br /&gt;&lt;br /&gt;但是如果这个操作是插入一条数据或者是删除一条数据呢？&lt;br /&gt;&lt;br /&gt;对于插入一条数据，如果系统没设唯一性检查，则两条相同的数据生成了；&lt;br /&gt;&lt;br /&gt;对于删除数据，则第二次删除必然会失败。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;知道问题的重要性了，可是对B/S 开发人员来说，问题还不止这些：&lt;br /&gt;&lt;br /&gt;1.典型的，网络状况不是很好时，为完成一个插入操作可有会等上好几十秒的时间，&lt;br /&gt;用户此时会“再点”一次，还是会“回退”，甚至是忍无可忍关掉浏览器呢？&lt;br /&gt;&lt;br /&gt;2.
      对于回退，如果前一操作是删除操作，是否需要再次进行一次删除操作？&lt;br /&gt;&lt;br /&gt;3. 如果用户收藏起了这一个进行删除或插入操作的URL，在他/她重新激活这一链接后，&lt;br /&gt;该做何处理，如果这一操作需要授权呢？&lt;br /&gt;&lt;br /&gt;我们要介绍的机制并不是完美的机制，事实上这些现实的问题并没有列入大多数的WEB&lt;br /&gt;框架的设计议程中，所以做WEB应用开发是乏味的，甚至有时会让人冒火!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Struts 的事务 Token&lt;/h3&gt;&lt;br /&gt;通过使用Struts 的事务Token 来防止重复提交是可行的，&lt;br /&gt;仔细阅读org.apache.struts.action.Action中的如下方法的 javadoc&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;generateToken&lt;/li&gt;&lt;br
      /&gt;&lt;li&gt;saveToken&lt;/li&gt;&lt;br /&gt;&lt;li&gt;isTokenValid&lt;/li&gt;&lt;br /&gt;&lt;li&gt;resetToken&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://struts.apache.org/1.3.8/struts-taglib/tagreference.html#link"&gt;&amp;lt;html:link&lt;br /&gt;transaction="true"&gt;&lt;/a&gt; If set to true, any current transaction&lt;br /&gt;control token will be included in the generated hyperlink, so that it&lt;br /&gt;will pass an isTokenValid() test in the receiving Action.&lt;br /&gt;&lt;br
      /&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;我们通过提交定单的例子来看这个事务 Token 的工作流:&lt;br /&gt;&lt;br /&gt;我们的例子中，是要在显示确认页面中，如果点 'Continue' 按钮，会将一个定单插入到数据库中，&lt;br /&gt;显然，我们需避免重复点击该按钮。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;解决方案&lt;/span&gt;：&lt;br /&gt;&lt;br /&gt;我们得看看这个过程的映射配置：&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;&amp;lt;!-- 进入结算中心页面后，点击继续进入此 --&gt;&lt;/span&gt;&lt;br /&gt;&lt;br
      /&gt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&amp;lt;action path="/shop/newOrderForm"&lt;br /&gt;type="org.springframework.samples.jpetstore.web.struts.NewOrderFormAction"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;name="workingOrderForm" scope="session" validate="false"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&amp;lt;forward name="success"&lt;br
      /&gt;path="/WEB-INF/jsp/struts/NewOrderForm.jsp"/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &amp;lt;/action&gt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0); font-weight: bold;"&gt;&amp;lt;!--&lt;br /&gt;填写定单信息的多页向导式页面 --&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;&amp;lt;!--&lt;br
      /&gt;当第一页校验失败时，需要跳回填写购物单的第一页 --&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&amp;lt;action path="/shop/newOrderStep1"&lt;br /&gt;type="org.springframework.samples.jpetstore.web.struts.NewOrderAction"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;name="workingOrderForm" scope="session" validate="true"&lt;br /&gt;input="/shop/newOrderForm.do"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:
      monospace;"&gt;&lt;br /&gt;&amp;lt;forward name="confirm"&lt;br /&gt;path="/WEB-INF/jsp/struts/ConfirmOrder.jsp"/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&amp;lt;forward name="shipping"&lt;br /&gt;path="/WEB-INF/jsp/struts/ShippingForm.jsp"/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &amp;lt;/action&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 204, 0); font-family:
      monospace;"&gt;&amp;lt;!--&lt;br /&gt;(只有页面上填写了将宠物送到不同的地址时，默认为送到当前用户的地址)，才会出现此面。&lt;br /&gt;此页校验失败，毫无疑问应该回到这个新地址填写页，而不是整个流程的第一页。&lt;br /&gt;这就是原版中的BUG所在处，因为它将这个向导性的流程处理放到了一个映射中，&lt;br /&gt;所以没法处理这种情况 --&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &amp;lt;action&lt;br /&gt;path="/shop/newOrderStep2"&lt;br /&gt;type="org.springframework.samples.jpetstore.web.struts.NewOrderAction"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br
      /&gt;name="workingOrderForm" scope="session" validate="true"&lt;br /&gt;input="/WEB-INF/jsp/struts/ShippingForm.jsp"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&amp;lt;forward name="confirm"&lt;br /&gt;path="/WEB-INF/jsp/struts/ConfirmOrder.jsp"/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &amp;lt;/action&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 204, 0); font-family:
      monospace;"&gt;&amp;lt;!--&lt;br /&gt;当在最后一步确认时出错，需要跳回填写购物单的第一页 --&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &amp;lt;action&lt;br /&gt;path="/shop/newOrderStep3"&lt;br /&gt;type="org.springframework.samples.jpetstore.web.struts.NewOrderAction"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;name="workingOrderForm" scope="session" validate="true"&lt;br /&gt;input="/WEB-INF/jsp/struts/NewOrderForm.jsp"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span
      style="font-family: monospace;"&gt;&lt;br /&gt;&amp;lt;forward name="success" path="/WEB-INF/jsp/struts/ViewOrder.jsp"/&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &amp;lt;/action&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;1. 因为最后三个映射使用的是同一个 NewOrderAction，再有作重复提交检查就是在这个 Action 中，因此，不可能在这个Action 的 exeute 方法中调用 &lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;saveToken(request);,&lt;br /&gt;一般来说，总是在进行重复提交检查的前一个Action 中放一个
      Token, 即调用 saveToken(request);方法，因此根据这个流程，我们只能在 &lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;NewOrderFormAction&lt;br /&gt;&lt;/span&gt;中生成：正如你可以在源码中看到一样：&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;//避免重复提交&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;saveToken(request);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;br /&gt;return
      mapping.findForward("success");&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;2. 因为我们是要避免重复按 &lt;span style="font-family: monospace;"&gt;ConfirmOrder.jsp&lt;br /&gt;中的 'Continue' 按钮，因此我们需要这样写:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;&amp;lt;%-- prevent duplication submit --%&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;center&gt;&amp;lt;html:link&lt;br
      /&gt;page="/shop/newOrderStep3.do?step=3&amp;amp;newOrder=true" &lt;span style="color: rgb(255, 0, 0);"&gt;transaction="true"&lt;/span&gt;&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;img border="0"&lt;br /&gt;src="../images/button_continue.gif" /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/html:link&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/center&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;3. 最后，在处理的 Action 中(即 &lt;span style="font-family: monospace;"&gt;&lt;span style="color: rgb(255, 0,
      0);"&gt;NewOrderAction&lt;/span&gt;) 进行有效性检查：&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;protected ActionForward &lt;span style="font-weight: bold;"&gt;doExecute&lt;/span&gt;(ActionMapping mapping, ActionForm form,&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;HttpServletRequest request, HttpServletResponse response) throws Exception {&lt;br /&gt;&lt;br /&gt;if (!isTokenValid(request, false)&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;// 如果结果不是同一个令牌，为多重提交&lt;br /&gt;&lt;br /&gt;//resetToken(request); &lt;span
      style="color: rgb(255, 0, 0);"&gt;// 判断完不自动销毁，留待下面的逻辑处理&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;request.setAttribute("message", "多重提交！");&lt;br /&gt;request.getSession().removeAttribute("workingOrderForm");&lt;br /&gt;request.getSession().removeAttribute("cartForm");&lt;br /&gt;&lt;br /&gt;// Fixed by pprun for duplicate-submitand bug in the next time submit:&lt;br /&gt;// 竟然不再需要确认了！&lt;br /&gt;&lt;br /&gt;request.getSession().removeAttribute("orderForm");&lt;br /&gt;return
      mapping.findForward("failure");&lt;br /&gt;&lt;br /&gt;} else {&lt;br /&gt;&lt;br /&gt;// 多页表单&lt;br /&gt;&lt;br /&gt;OrderActionForm orderForm = (OrderActionForm) form;&lt;br /&gt;&lt;br /&gt;// 是否要进入可选的 shipingAddress 页面&lt;br /&gt;&lt;br /&gt;if&lt;br /&gt;(orderForm.isShippingAddressRequired() &amp;amp;&amp;amp; orderForm.getStep().equals("1")) {&lt;br /&gt;&lt;br /&gt;// 需要将物品寄给别人，而不是自己&lt;br /&gt;&lt;br /&gt;return mapping.findForward("shipping");&lt;br /&gt;&lt;br /&gt;// 两种情况：&lt;br /&gt;//
      1.&lt;br /&gt;从页面1直接进入确认页面（不需要寄到不同的地址时）&lt;br /&gt;&lt;br /&gt;// 2. 从 shipingAddress&lt;br /&gt;进入到确认页面&lt;br /&gt;&lt;br /&gt;} else if&lt;br /&gt;((orderForm.getStep().equals("1") &amp;amp;&amp;amp; orderForm.isShippingAddressRequired() == false)&lt;br /&gt;|| orderForm.getStep().equals("2")) {&lt;br /&gt;&lt;br /&gt;// 进入确认页面&lt;br /&gt;&lt;br /&gt;return mapping.findForward("confirm");&lt;br /&gt;&lt;br /&gt;} else if (orderForm.getOrder() != null) {&lt;br /&gt;&lt;br /&gt;// 最终处理&lt;br
      /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;// 销毁事务标记(放在此处，最开始处很重要，&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;br /&gt;// 以保证不管再快的多重提交都会得到无效的判断的)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;resetToken(request);&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Order order = orderForm.getOrder();&lt;br /&gt;// todo 这段逻辑应该放在 DAO 层？&lt;br /&gt;&lt;br
      /&gt;getPetStore().insertOrder(order);&lt;br /&gt;&lt;br /&gt;// 成功进行后，移除会话状态，&lt;br /&gt;// 以便 NewOrderFormAction 中检查出是否用户后退操作&lt;br /&gt;&lt;br /&gt;request.getSession().removeAttribute("workingOrderForm");&lt;br /&gt;request.getSession().removeAttribute("cartForm");&lt;br /&gt;&lt;br /&gt;// Fixed by pprun for duplicate-submit and bug in the next time submit:&lt;br /&gt;&lt;br /&gt;// 竟然不再需要确认了！所以必须移除它&lt;br /&gt;request.getSession().removeAttribute("orderForm");&lt;br
      /&gt;request.setAttribute("order", order);&lt;br /&gt;request.setAttribute("message", "Thank you, your order has been&lt;br /&gt;submitted.");&lt;br /&gt;&lt;br /&gt;// 选择 ViewOrder.jsp 中的显示方式&lt;br /&gt;&lt;br /&gt;request.setAttribute("newOrder", true);&lt;br /&gt;return mapping.findForward("success");&lt;br /&gt;&lt;br /&gt;} else {&lt;br /&gt;&lt;br /&gt;request.setAttribute("message",&lt;br /&gt;"An error occurred processing your order (order was null).");&lt;br /&gt;&lt;br /&gt;return
      mapping.findForward("failure");&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;调用 &lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;isTokenValid(request,false) 判断我们上述的 1, 2, 3 三处步骤是否是按顺序成功处理完，如果中途哪个步骤重新执行，比如在执行到第三步的 &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="font-weight:
      bold;"&gt;doExecute&lt;/span&gt;()的代码&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;span style="font-weight: bold;"&gt;resetToken(request)之前，&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;又来了一个请求，由于此时 Token 还在，未被 resetToken, 此时比较已经存在的 Token 和 link 带进的&lt;br /&gt;Token，发现它们俩不同，因此&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;span style="font-weight:
      bold;"&gt;isTokenValid(request,false&lt;/span&gt;)将返回 false,告之多重提交，并跳到错误页面。&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&lt;br /&gt;我们之所以调用&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;span style="font-weight: bold;"&gt; isTokenValid(request, false&lt;/span&gt;&lt;/span&gt;) 这个方法并传一个
      false是因为我们使用的向导页面，在这个判断之后到最终的确认页面还有一个或两个页面要处理，因此我们不能在判断完后，立即销毁 Token,而是要等到真正处理完时才这样做。但是对简单逻辑的页面，可以直接调用isTokenValid(request) 或isTokenValid(request,true) 在判断完后，直接销毁 Token.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;我们还缺什么?&lt;/h2&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;客户端校验&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;基于 JavaScript 的检验方式。Struts支持这种处理方式，只不过我们没有把这一功能加入进来而已。因为客户端检验可以在第一时间发现输入数据的问题，而不至于浪费一个数据传输来回(提交错误数&lt;br /&gt;据 -&gt; 在 FormBean 中判断为无效 -&gt; 以错误信息的形式显示给用户)。&lt;br /&gt;&lt;br
      /&gt;但是，请记住!&lt;br /&gt;服务端校验是一定要做的，因为有人总喜欢在中途拦截、篡改客户发来的数据而骗过客户端的校验器。而服务端是发生在服务器上，只要服务器没被攻破，黑客是不&lt;br /&gt;可能篡改这段 FormBean 代码的。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;漂亮的页面&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;现在的页面只是个原型，离最终的漂亮还有段距离。但是这是需要美工设计人员介入的，因为一个人总不可能样样在行的。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;总结&lt;/h2&gt;&lt;br /&gt;对于新手而言，看基于 Struts 的实现代码，有时的确会失去方向。此时，最好将 Strut-config.xml&lt;br /&gt;文件打印一份在手边，然后对应页面上的每一个动作(提交，链接点击等)得到其要去往的URL，然后在Strut-config.xml
      中找到对应的Action 映射。例如：&lt;br /&gt;&lt;br /&gt;在 SignonForm.jsp 页面中有：&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &amp;lt;a href="&amp;lt;c:url&lt;br /&gt;value="&lt;span style="color: rgb(255, 0, 0);"&gt;/shop/newAccountForm&lt;/span&gt;.do"/&gt;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt; &amp;lt;img&lt;br /&gt;border="0" src="../images/button_register_now.gif" /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:
      monospace;"&gt; &amp;lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;于是我们在struts-config.xml 文件中搜索“&lt;span style="color: rgb(255, 0, 0);"&gt;/shop/newAccountForm”&lt;/span&gt; 找到：&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 204, 0);"&gt;&amp;lt;!-- 修改帐号信息 --&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: monospace;"&gt;&lt;br /&gt;&amp;lt;action path="&lt;span style="color: rgb(255, 0,
      0);"&gt;/shop/newAccountForm&lt;/span&gt;"&lt;br /&gt;type="org.springframework.samples.jpetstore.web.struts.&lt;span style="color: rgb(255, 0, 0);"&gt;NewAccountFormAction&lt;/span&gt;"&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;name="&lt;span style="color: rgb(255, 0, 0);"&gt;workingAccountForm&lt;/span&gt;"&lt;br /&gt;scope="session" validate="false"&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;forward name="success"&lt;br /&gt;path="/WEB-INF/jsp/struts/&lt;span style="color: rgb(255, 0,
      0);"&gt;NewAccountForm.jsp&lt;/span&gt;"/&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/action&gt;&lt;/span&gt;&lt;span style="font-family: monospace;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;这样我们得知：&lt;br /&gt;&lt;br /&gt;1. 在页面 SignonForm.jsp 中，如果点击了 注册 按钮的话，Struts 将使用 workingAccountForm&lt;br /&gt;(即，类AccountActionForm) 来收集页面的即将的输入值，&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2. validate="false" 所以这时不需要做任何校验，因为此时，用户还没输入数据，只是在&lt;br
      /&gt;注册页面上点了“注册”按钮被带到了注册信息填写页面。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;3. 执行&lt;span style="font-family: monospace;"&gt; &lt;span style="color: rgb(255, 0, 0);"&gt;NewAccountFormAction&lt;/span&gt;&lt;/span&gt;#execute()方法，在成功处理后，将前进到页面 &lt;span style="font-family: monospace;"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;NewAccountForm.jsp&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;4. 用户输入用户信息数据&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;我们看到在 NewAccountForm.jsp 页面中有：&lt;br
      /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;html:form action="&lt;span style="color: rgb(255, 0, 0);"&gt;/shop/newAccount&lt;/span&gt;.do"&lt;br /&gt;styleId="workingAccountForm" method="post" &gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;5. 我们再次在 struts-config.xml 文件中找 "&lt;span style="font-family: monospace;"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;/shop/newAccount"&lt;/span&gt;, 得到&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;action path="&lt;span style="color: rgb(255, 0,
      0);"&gt;/shop/newAccount&lt;/span&gt;"&lt;br /&gt;type="org.springframework.samples.jpetstore.web.struts.NewAccountAction"&lt;br /&gt;&lt;br /&gt;name="workingAccountForm" scope="session" validate="true"&lt;br /&gt;input="/WEB-INF/jsp/struts/NewAccountForm.jsp"&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;forward name="success" path="&lt;span style="color: rgb(255, 0, 0);"&gt;/shop/index.do&lt;/span&gt;"/&gt;&lt;br /&gt;&amp;lt;/action&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;6. 这一次还是利用同一个
      FormBean(已经在前面收集了用户的输入数据),&lt;br /&gt;因为这一次 在&lt;span style="color: rgb(255, 0, 0);"&gt;NewAccountAction#execute()&lt;/span&gt;方法中要用到 前面的输入值.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;7. 判断输入数据的合法性&lt;br /&gt;&lt;br /&gt;如果不合法，将跳转到同一页面，但此时将显示错误信息&lt;br /&gt;&lt;br /&gt;如果合法，则继续向前，这一次是回到首页，即这一流程宣告结束。&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img
      src="https://blogger.googleusercontent.com/tracker/171648533238476397-4840119221115522578?l=pprun.blogspot.com" alt="" height="1" width="1" /&gt;&lt;/div&gt;</description>
      <pubDate>Wed, 10 Dec 2008 17:08:14 +0000</pubDate>
    </item>
    <item>
      <title>平步星云: NetBeans 6.0 抢先试用</title>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-171648533238476397.post-3739164309819377361</guid>
      <link>http://pprun.blogspot.com/2007/05/netbeans-60.html</link>
      <description>NetBeans 6.0 M9 (Preview) 已经出来好些天了，还剩下最后一个里程碑就要进入测试阶段。&lt;br /&gt;&lt;br /&gt;对我来说，自从从 Oracle JDeveloper 转向 NetBeans 以来，在工作中我一直坚持用它。也许是的我工作表现迫使远在美国那边的同事放弃了说服我使用 Eclipse 吧。你也许想知道，作为一名NetBeans 的老用户，我期待 6.0 的什么，虽然它已经很好了。&lt;br /&gt;&lt;br /&gt;1.不要因为整个 Editor 的体系重组，而使强“稳定性”的口碑打折扣 (基本上大部分模块都重新Retouche了），因为我拒绝使用 Eclipse 的原因之一就是: JVM OutOfMemoryError.&lt;br /&gt;&lt;br /&gt;2.Occurrences Highlight 我在之前的文章中写过关于这一功能&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;3.Javadoc and Declaration View
      我已经等了好几年，我甚至曾经自己利用 NetBeans 的API 实现过一个类似的模块，但是因为NetBeans本身的问题（java meta data record)，功能不完整。有了这两个窗口，就永远不用 Go to Source, Show JavaDoc 了，所有的信息都在手边，只需将鼠标放在想看的类元素上。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_bpUunzIgcNA/RkXXRKKBVwI/AAAAAAAAAAs/IMDowTFQ0lo/s1600-h/1.jpg"&gt;&lt;img src="http://1.bp.blogspot.com/_bpUunzIgcNA/RkXXRKKBVwI/AAAAAAAAAAs/IMDowTFQ0lo/s400/1.jpg" alt="" style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" border="0"
      id="BLOGGER_PHOTO_ID_5063690045832124162" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;4.Code Generation dialog 我的确很厌倦写类的构造器的实现，特别是类的成员很多的情况下。还有标准的、功能完善的、性能良好的　Common Methods: equals, hashcode　的实现等。&lt;br /&gt;有了它，在右图中的例子中我只需要输入&lt;br /&gt;private long id;&lt;br /&gt;private String name;&lt;br /&gt;private int age;&lt;br /&gt;&lt;br /&gt;其它的代码都是由它产生的。&lt;br /&gt;&lt;br /&gt;5. Local History &lt;br /&gt;&lt;br /&gt;或许有些功能被我忽视了，如是这样的话，请见&lt;a
      href="http://wiki.netbeans.org/wiki/view/WhatsCoolInNetBeans60"&gt;此处&lt;/a&gt;的详细列表。还有整个重写的 Editor 的功能都陆续地出现在&lt;a href="http://wiki.netbeans.org/wiki/view/Java_EditorUsersGuide"&gt;这&lt;/a&gt;。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;是的，我也保留些目前还未完善的功能，我本人也没有加紧试用。如果我认为有用的话，我会进一步写出来的。&lt;div class="blogger-post-footer"&gt;&lt;img src="https://blogger.googleusercontent.com/tracker/171648533238476397-3739164309819377361?l=pprun.blogspot.com" alt="" height="1" width="1" /&gt;&lt;/div&gt;</description>
      <pubDate>Wed, 10 Dec 2008 17:08:14 +0000</pubDate>
    </item>
    <item>
      <title>平步星云: NetBeans多语言版本，更换默认 Locale 设置时的问题</title>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-171648533238476397.post-8872930461868475353</guid>
      <link>http://pprun.blogspot.com/2007/05/netbeans-locale.html</link>
      <description>&lt;span style="color: rgb(255, 0, 0);"&gt;update: (这个BUG只会在中文操作系统下出现，在英文版的操作系统上一切正常。看来是一些模块在编写时没有正确地加载对应locale 的 properties 文件)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;在我看来，在日常的工作平台，JDK/NetBeans 的i18n 字体问题已经成为历史了。但是我前些天又登记了一个 &lt;a href="http://www.netbeans.org/issues/show_bug.cgi?id=103908"&gt;BUG &lt;/a&gt;到 NetBeans 的 IssueZilla 中:&lt;br /&gt;&lt;br /&gt;1. 下载多语言版本的安装包，安装&lt;br /&gt;2. 因为我不喜欢那些翻译的不准确的词，所以我打算回退到英文的 locale:&lt;br /&gt;增加一个启动参数到 $NetBeans/etc/netbeans.conf 文件：&lt;br
      /&gt;netbeans_default_options="&lt;span style="font-weight: bold;"&gt;$默认的配置&lt;/span&gt; --locale en"&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;&lt;span style="font-weight: bold; font-family: georgia;"&gt;语法为:&lt;/span&gt; --locale language[:country[:variant]]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;3. 重启后，你将看到“著名的字体问题”重新又出现了，显示为小方框：&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_bpUunzIgcNA/RkvO_QKV81I/AAAAAAAAABI/iB6nXRhgZM0/s1600-h/i18n.png"&gt;&lt;img
      src="http://4.bp.blogspot.com/_bpUunzIgcNA/RkvO_QKV81I/AAAAAAAAABI/iB6nXRhgZM0/s400/i18n.png" alt="" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" border="0" id="BLOGGER_PHOTO_ID_5065369791973684050" /&gt;&lt;/a&gt;&lt;br /&gt;当前，只有两种办法可以解决这一问题：&lt;br /&gt;&lt;br /&gt;1. 去掉加上的 locale 参数，但必须忍受翻译得不佳的词了。&lt;br /&gt;&lt;br /&gt;2. 下载英文版，继续用吧。但这样的话，在 Welcome 中你将看不到中文的 Blog.&lt;div class="blogger-post-footer"&gt;&lt;img
      src="https://blogger.googleusercontent.com/tracker/171648533238476397-8872930461868475353?l=pprun.blogspot.com" alt="" height="1" width="1" /&gt;&lt;/div&gt;</description>
      <pubDate>Wed, 10 Dec 2008 17:08:13 +0000</pubDate>
    </item>
    <item>
      <title>平步星云: GlassFish/Sun App Server 配置 MySqlXADataSource 的问题</title>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-171648533238476397.post-5359638578221088052</guid>
      <link>http://pprun.blogspot.com/2007/05/glassfishsun-app-server.html</link>
      <description>如果你打算使用 GlassFish/Sun App Server，并且打算使用 MySql 的 XA 数据源的话。在目前的配置过程中，会遇到如下问题：&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;重现步骤：&lt;/span&gt;&lt;br /&gt;1. (如果之前没做这一步的话)将 Mysql 的 Connector/J 包 (如我的：mysql-connector-java-3.1.12-bin.jar）放入 GlassFish/Sun App Server 安装目录下子目录 \AppServer\lib\ 中&lt;br /&gt;&lt;br /&gt;2. 启动 GlassFish/Sun App Server. 可通过　右击 Runtime | Servers | Sun App Server 选择 start&lt;br /&gt;&lt;br /&gt;3. 启动后，右击 Sun App Server 选择 View Admin console&lt;br
      /&gt;&lt;br /&gt;4. 登录WEB 管理后台&lt;br /&gt;&lt;br /&gt;5. 在左侧导航器中 点击 Resources | JDBC | Connection Pool s，在表格的头部点击 New... 按钮&lt;br /&gt;&lt;br /&gt;6. 在右侧中填入：&lt;br /&gt;Name: MySql&lt;br /&gt;Resource Type: javax.sql.XADataSource&lt;br /&gt;Database Vendor: mysql &lt;br /&gt;&lt;br /&gt;然后点击 next&lt;br /&gt;&lt;br /&gt;7. 注意在 Datasource class name 中自动填入了: com.mysql.jdbc.jdbc2.optional.MysqlXaConnectionPoolDataSource，这个值是不对的。&lt;br /&gt;&lt;br /&gt;你如果想试试的话，在最下面的　Properties　窗格中填入 :&lt;br /&gt;&lt;br
      /&gt;&lt;a href="http://1.bp.blogspot.com/_bpUunzIgcNA/Rk0F_AKV82I/AAAAAAAAABQ/8-xOwAPMy18/s1600-h/mydqljdbc.png"&gt;&lt;img src="http://1.bp.blogspot.com/_bpUunzIgcNA/Rk0F_AKV82I/AAAAAAAAABQ/8-xOwAPMy18/s400/mydqljdbc.png" alt="" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" border="0" id="BLOGGER_PHOTO_ID_5065711735794955106" /&gt;&lt;/a&gt;&lt;br /&gt;点击 Finish&lt;br /&gt;&lt;br /&gt;8. 在结果窗口中点击 Mysql&lt;br /&gt;&lt;br /&gt;9. 在打开的页面中可以看到一个ping
      按钮，点击是用来测试配置成功与否，点击一下，将出现如下错误：&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_bpUunzIgcNA/Rk0HEAKV83I/AAAAAAAAABY/oYX5Mdt52ec/s1600-h/mydqljdbc_error.png"&gt;&lt;img src="http://1.bp.blogspot.com/_bpUunzIgcNA/Rk0HEAKV83I/AAAAAAAAABY/oYX5Mdt52ec/s400/mydqljdbc_error.png" alt="" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" border="0" id="BLOGGER_PHOTO_ID_5065712921205928818" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-weight:
      bold;"&gt;解决的办法：&lt;/span&gt;&lt;br /&gt;如果解开mysql-connector-java-3.1.12-bin.jar 文件，在包com.mysql.jdbc.jdbc2.optional 中可　看到:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;com/mysql/jdbc/jdbc2/optional/&lt;br /&gt;com/mysql/jdbc/jdbc2/optional/CallableStatementWrapper.class&lt;br /&gt;com/mysql/jdbc/jdbc2/optional/ConnectionWrapper.class&lt;br /&gt;com/mysql/jdbc/jdbc2/optional/MysqlConnectionPoolDataSource.class&lt;br /&gt;com/mysql/jdbc/jdbc2/optional/MysqlDataSource.class&lt;br
      /&gt;com/mysql/jdbc/jdbc2/optional/MysqlDataSourceFactory.class&lt;br /&gt;com/mysql/jdbc/jdbc2/optional/MysqlPooledConnection.class&lt;br /&gt;com/mysql/jdbc/jdbc2/optional/MysqlXAConnection.class&lt;br /&gt;com/mysql/jdbc/jdbc2/optional/MysqlXADataSource.class&lt;br /&gt;com/mysql/jdbc/jdbc2/optional/MysqlXAException.class&lt;br /&gt;com/mysql/jdbc/jdbc2/optional/MysqlXid.class&lt;br /&gt;com/mysql/jdbc/jdbc2/optional/PreparedStatementWrapper.class&lt;br
      /&gt;com/mysql/jdbc/jdbc2/optional/StatementWrapper.class&lt;br /&gt;com/mysql/jdbc/jdbc2/optional/SuspendableXAConnection.class&lt;br /&gt;&lt;br /&gt;...&lt;/pre&gt;其中并没有默认填入的 com.mysql.jdbc.jdbc2.optional.MysqlXaConnectionPoolDataSource, 但是有　com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource&lt;br /&gt;&lt;br /&gt;在页面Application Server &gt; Resources &gt; JDBC &gt; Connection Pools &gt; MySql 中：&lt;br /&gt;1.将 Datasource class name 的值改为：
      com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource&lt;br /&gt;&lt;br /&gt;2.点击 Save 按钮&lt;br /&gt;&lt;br /&gt;3. 点击 Ping 按钮，成功显示：&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_bpUunzIgcNA/Rk0IVwKV84I/AAAAAAAAABg/-SZNDikl42Y/s1600-h/mydqljdbc_success.png"&gt;&lt;img src="http://4.bp.blogspot.com/_bpUunzIgcNA/Rk0IVwKV84I/AAAAAAAAABg/-SZNDikl42Y/s400/mydqljdbc_success.png" alt="" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" border="0"
      id="BLOGGER_PHOTO_ID_5065714325660234626" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img src="https://blogger.googleusercontent.com/tracker/171648533238476397-5359638578221088052?l=pprun.blogspot.com" alt="" height="1" width="1" /&gt;&lt;/div&gt;</description>
      <pubDate>Wed, 10 Dec 2008 17:08:12 +0000</pubDate>
    </item>
    <item>
      <title>平步星云: 体验更多 NetBeans 的新功能</title>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-171648533238476397.post-5203850018959686363</guid>
      <link>http://pprun.blogspot.com/2007/05/netbeans.html</link>
      <description>不喜欢 NetBeans 的开发者往往指出 NetBeans 没有这个功能，没有那个功能。无可厚非，当时他们是对的，但随着时间的推移，现在也许错了：&lt;br /&gt;&lt;br /&gt;1. Last Edit （是近更改按钮，带星号的那个），将你带到最近更改的地方&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_bpUunzIgcNA/RlQLuwKV87I/AAAAAAAAAB4/5kqPXrZ45xc/s1600-h/last+edit.png"&gt;&lt;img src="http://3.bp.blogspot.com/_bpUunzIgcNA/RlQLuwKV87I/AAAAAAAAAB4/5kqPXrZ45xc/s400/last+edit.png" alt="" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" border="0"
      id="BLOGGER_PHOTO_ID_5067688378528822194" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2. Diff SideBar (差异侧条), 根据所在行代码是增加、更改还是删除，在侧条中显示不同的小条，右击可以使用进一步的功能&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_bpUunzIgcNA/RlQMfQKV88I/AAAAAAAAACA/5L0j_Nr2uUo/s1600-h/diff+sidebar.png"&gt;&lt;img src="http://1.bp.blogspot.com/_bpUunzIgcNA/RlQMfQKV88I/AAAAAAAAACA/5L0j_Nr2uUo/s400/diff+sidebar.png" alt="" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;"
      border="0" id="BLOGGER_PHOTO_ID_5067689211752477634" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;3. JUnit4 支持（也就是现在可以使用基于 JDK 5 Annotation 的单元测试了）&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_bpUunzIgcNA/RlQMuwKV89I/AAAAAAAAACI/DlpU2V4jrcA/s1600-h/JUnit4.png"&gt;&lt;img src="http://3.bp.blogspot.com/_bpUunzIgcNA/RlQMuwKV89I/AAAAAAAAACI/DlpU2V4jrcA/s400/JUnit4.png" alt="" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" border="0"
      id="BLOGGER_PHOTO_ID_5067689478040450002" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;4. Find/Replace in Project (全工程范围内搜索)，是的，这个功能我真的也非常需要:&lt;br /&gt;看到左下方的"Replace" 按钮了吗？&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;值得注意的是，这个功能在 M9 中被屏蔽了，但在每日构建的版本中可以使用。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;img src="http://1.bp.blogspot.com/_GUaFO77rw-w/RcDNGbkZUrI/AAAAAAAAAAg/t_qTqZMw834/s1600/nb-find-replace.png"
      alt="[nb-find-replace.png]" border="0" /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;另外，大部分初次使用NetBeans 的开发者，不知道更改“自动完成弹出窗口”的键绑定，因为最常用的"Ctrl + 空格" 是不可工作的，因为在中文操作系统中被绑定到输入法的切换了。所以我一般把它改成 'Ctrl + Enter' , 如下进行：&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Tools | Options -&gt; Keymap -&gt; Other&lt;/li&gt;&lt;li&gt;找到 Show Code Completion Popup, 选中它，点击Add...&lt;/li&gt;&lt;li&gt;按下任何所你希望的键序列，但是如果直接按 Ctrl + Enter 的话，系统提示这个组合键已经被绑定到 Split Line，所以如果我们要使用这个组合键的话，要先把它与 Split Line
      解除绑定&lt;/li&gt;&lt;li&gt;在 Show Code completion Popup 下方第六个即是　Split Line, 选中它，点击移除。你可以为这个功能提供另外的组合键，如果经常使用这一功能的话。&lt;/li&gt;&lt;li&gt;然后，按照上述把"Ctrl + Enter " 加到 Show Code Completion Popup 中去。&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;(期待下一篇)&lt;div class="blogger-post-footer"&gt;&lt;img src="https://blogger.googleusercontent.com/tracker/171648533238476397-5203850018959686363?l=pprun.blogspot.com" alt="" height="1" width="1" /&gt;&lt;/div&gt;</description>
      <pubDate>Wed, 10 Dec 2008 17:08:12 +0000</pubDate>
    </item>
    <item>
      <title>平步星云: NetBeans6 功能介绍: 布置 declaration View 和 Javadoc View</title>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-171648533238476397.post-6690572939674191050</guid>
      <link>http://pprun.blogspot.com/2007/05/netbeans6-declaration-view-javadoc-view.html</link>
      <description>此篇文章介绍一个在 NetBeans 6 中同时查看鼠标指针处的源代码和&lt;br /&gt;Javadoc (不再Go to Source .../ Show JavaDoc)&lt;br /&gt;&lt;br /&gt;1. 首先打开它们：Window | Other | Declaration View 和 Window | Other | Javadoc View, 它们都被搁浅在 Output 窗口的位置，但此时只能看到一个窗口的内容，因为无论切换到其中的任何一个，它们都占据整个下端窗口。如下：&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_bpUunzIgcNA/RlQX3AKV8-I/AAAAAAAAACQ/d7N40OUDYh0/s1600-h/decl_doc_1.png"&gt;&lt;img
      src="http://4.bp.blogspot.com/_bpUunzIgcNA/RlQX3AKV8-I/AAAAAAAAACQ/d7N40OUDYh0/s400/decl_doc_1.png" alt="" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" border="0" id="BLOGGER_PHOTO_ID_5067701714402276322" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;2. 我们要将它们分开，点击其中任一窗口的上方（类似标题栏区域），按住不放，将其拖向左侧（或右侧也可），当出现一个红色的方框后释放，如下：&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_bpUunzIgcNA/RlQYGwKV8_I/AAAAAAAAACY/KBwpchWvfPM/s1600-h/decl_doc_2.png"&gt;&lt;img
      src="http://3.bp.blogspot.com/_bpUunzIgcNA/RlQYGwKV8_I/AAAAAAAAACY/KBwpchWvfPM/s400/decl_doc_2.png" alt="" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" border="0" id="BLOGGER_PHOTO_ID_5067701984985215986" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;释放后的效果如下：&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_bpUunzIgcNA/RlQYPQKV9AI/AAAAAAAAACg/ywrhb2_9JSo/s1600-h/decl_doc_3.png"&gt;&lt;img
      src="http://1.bp.blogspot.com/_bpUunzIgcNA/RlQYPQKV9AI/AAAAAAAAACg/ywrhb2_9JSo/s400/decl_doc_3.png" alt="" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" border="0" id="BLOGGER_PHOTO_ID_5067702131014104066" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;这些位置会被记录下来，只要你在设置之后正常退出了。在下次启动 NetBeans 后，你可以看到同样的布局。&lt;br /&gt;&lt;br /&gt;这个截图中显示的是　Integer.toHexString　方法的 Javadoc 和 实现源码。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;(期待下一篇)&lt;div
      class="blogger-post-footer"&gt;&lt;img src="https://blogger.googleusercontent.com/tracker/171648533238476397-6690572939674191050?l=pprun.blogspot.com" alt="" height="1" width="1" /&gt;&lt;/div&gt;</description>
      <pubDate>Wed, 10 Dec 2008 17:08:11 +0000</pubDate>
    </item>
    <item>
      <title>平步星云: Java 安全拷贝协议 (JSCP: Java Secure Copy Protocol) NetBeans 插件</title>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-171648533238476397.post-8348407469588799409</guid>
      <link>http://pprun.blogspot.com/2007/06/java-jscp-java-secure-copy-protocol.html</link>
      <description>&lt;h3&gt;JSCP NetBeans 插件的作用&lt;/h3&gt;&lt;br /&gt;大家知道，SCP 广泛使用于SSH出现之前的 Unix 之类的平台上，它允许在 Client &amp;lt;-&gt; Server 间进行双向的文件传输（ScpTo, ScpFrom)&lt;br /&gt;&lt;br /&gt;JSCP NetBeans plugin 作为一个 TopComponet 插入到 NetBeans 的 Navigator 方位，通过 Tools | Java SCP 调用。&lt;br /&gt;&lt;br /&gt;SCP 可进行文件双向传输的&lt;br /&gt;&lt;ul&gt;&lt;li&gt;向支持 SCP 的 Unix/Linux 服务器上传文件（ScpTo）&lt;/li&gt;&lt;li&gt;从支持SCP的 Unix/Linux 服务器获得文件（ScpFrom)&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;这两种工作模式是分别作为 &lt;span
      style="font-family: monospace;"&gt;JTabbedPane &lt;/span&gt;的 两个 Tab 出现在 JScp 这个 &lt;span style="font-family: monospace;"&gt;TopComponent &lt;/span&gt;中&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;div style="text-align: left;"&gt;&lt;h3&gt;JSCP NetBeans 插件的使用方法&lt;/h3&gt;&lt;div style="text-align: left;"&gt;从NetBeans &lt;a
      href="http://plugins.netbeans.org/PluginPortal/faces/MainPage.jsp?pluginid=2786"&gt;PluginPortal&lt;/a&gt;&lt;a href="http://plugins.netbeans.org/PluginPortal/faces/MainPage.jsp?pluginid=2786"&gt; &lt;/a&gt; 网站上获得一个压缩包，然后解压到一个目录供下面的步骤使用。&lt;br /&gt;&lt;/div&gt; &lt;h3&gt;&lt;a name="5.1"&gt;&lt;/a&gt;安装 .NBM 文件&lt;/h3&gt;&lt;ol&gt;&lt;li&gt;Tools | Update Center&lt;/li&gt;&lt;li&gt;选择 Install Manually Downloaded Modules (.nbm Files) 后，点击 Next&lt;/li&gt;&lt;li&gt;点击 Add... , 在 Select Directory or .nbm
      Files 对话框中，导航到此插件的两个 .nbm 文件（com-jcraft-jsch.nbm 和 org.pprun-jscp.nbm），同时选中它们后点击 Ok&lt;/li&gt;&lt;li&gt;点击 Next &lt;/li&gt;&lt;li&gt;点击 Next&lt;/li&gt;&lt;li&gt;点击 Next, 在View Certificates and Install Modules 界面点击 Include 列下面的多选框中打上勾。界面将出现版权及插件签名信息。（如果你希望使用计算机的所有用户都使用这个插件，可以将在 Global 列下打勾）&lt;/li&gt;&lt;li&gt; Finish, 不出意外，将显示插件更新界面。&lt;/li&gt;&lt;li&gt;等到NetBeans 的状态条中显示 Turing on modules... done. 后，点击 Tools 菜单，此时将在菜单最底端看到 Java SCP 菜单项，如下：&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;h3&gt;&lt;a
      href="http://1.bp.blogspot.com/_bpUunzIgcNA/RmdvEI3zgXI/AAAAAAAAADY/hKD6I3Qvky0/s1600-h/menu.png"&gt;&lt;img src="http://1.bp.blogspot.com/_bpUunzIgcNA/RmdvEI3zgXI/AAAAAAAAADY/hKD6I3Qvky0/s400/menu.png" alt="" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" border="0" id="BLOGGER_PHOTO_ID_5073145622147858802" /&gt;&lt;/a&gt;&lt;/h3&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3&gt;使用说明&lt;/h3&gt; &lt;h4&gt;&lt;a name="5.2.1"&gt;&lt;/a&gt;前提条件：&lt;/h4&gt;
      &lt;ul&gt;&lt;li&gt;保证网络可以访问到一台支持 SCP/ SSH1 的 Unix/Linux 服务器&lt;/li&gt;&lt;li&gt;保证具有以上服务器上的一个帐户并且对其中的一个目录具有“写”权限（如果你只使用 ScpFrom 的话，此项可选）&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;h4&gt;&lt;a name="5.2.2"&gt;&lt;/a&gt;ScpTo (文件上传)&lt;/h4&gt;&lt;br /&gt;（如果还没打开 JScp Window 的话）通过 Tools | Java SCP 打开，它会出现在左下角并停靠在 Navigator 所在的窗口中，如下图所示：&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;LocalFile&lt;/span&gt; 上传的文件，通过右边的按钮来选择&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight:
      bold;"&gt;User@Host&lt;/span&gt; 用户名和主机名(或IP地址) 的组合&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Password&lt;/span&gt; 上述用户的密码&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;RemoteDir&lt;/span&gt; 上传的文件在服务器上放置的目录&lt;/li&gt;&lt;/ol&gt;&lt;a href="http://1.bp.blogspot.com/_bpUunzIgcNA/RmdutI3zgWI/AAAAAAAAADQ/z_ukNeEy1Kg/s1600-h/ScpFrom.png"&gt;&lt;img src="http://1.bp.blogspot.com/_bpUunzIgcNA/RmdutI3zgWI/AAAAAAAAADQ/z_ukNeEy1Kg/s400/ScpFrom.png" alt="" style="margin: 0px auto
      10px; display: block; text-align: center; cursor: pointer;" border="0" id="BLOGGER_PHOTO_ID_5073145227010867554" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;请注意在输入的过程中，会动态对输入域的值进行校验，如下，桔色的字显示没有指定服务器主机名(或IP地址）：&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_bpUunzIgcNA/Rmdvx43zgYI/AAAAAAAAADg/B7CwA5HwNZ8/s1600-h/warning.png"&gt;&lt;img src="http://4.bp.blogspot.com/_bpUunzIgcNA/Rmdvx43zgYI/AAAAAAAAADg/B7CwA5HwNZ8/s400/warning.png" alt="" style="margin: 0px auto 10px; display: block;
      text-align: center; cursor: pointer;" border="0" id="BLOGGER_PHOTO_ID_5073146408126873986" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;如果所有的输入都合法的话，按钮 Scp 将可用，点击它将进行网络传输，进度条指示这一过程:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_bpUunzIgcNA/RmdwWY3zgbI/AAAAAAAAAD4/JGROQtiQf_k/s1600-h/progress.png"&gt;&lt;img src="http://2.bp.blogspot.com/_bpUunzIgcNA/RmdwWY3zgbI/AAAAAAAAAD4/JGROQtiQf_k/s400/progress.png" alt="" style="margin: 0px auto 10px; display: block; text-align: center; cursor:
      pointer;" border="0" id="BLOGGER_PHOTO_ID_5073147035192099250" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;如果一切正常，最终进度条将停止指示。反之，如果后台操作出现错误的话，错误将显示：&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_bpUunzIgcNA/RmdwBo3zgZI/AAAAAAAAADo/pE1KM2gEZp8/s1600-h/progressError.png"&gt;&lt;img src="http://3.bp.blogspot.com/_bpUunzIgcNA/RmdwBo3zgZI/AAAAAAAAADo/pE1KM2gEZp8/s400/progressError.png" alt="" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;"
      border="0" id="BLOGGER_PHOTO_ID_5073146678709813650" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;&lt;a name="5.2.3"&gt;&lt;/a&gt;ScpFrom (文件下载)&lt;br /&gt;&lt;/h4&gt;&lt;br /&gt;（如果还没打开 JScp Window 的话）通过 Tools | Java SCP 打开，它会出现在左下角并停靠在 Navigator 所在的窗口中，如下图所示：&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;User@Host&lt;/span&gt; 用户名和主机名(或IP地址) 的组合&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Password&lt;/span&gt;
      上述用户的密码&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;RemoteFile&lt;/span&gt; 要下载的服务器上的文件&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;LocalDir&lt;/span&gt; 下载的文件放置的目录，通过右边的按钮来选择&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/_bpUunzIgcNA/Rmduko3zgVI/AAAAAAAAADI/9btBs3U3hfU/s1600-h/ScpTo.png"&gt;&lt;img src="http://3.bp.blogspot.com/_bpUunzIgcNA/Rmduko3zgVI/AAAAAAAAADI/9btBs3U3hfU/s400/ScpTo.png" alt="" style="margin: 0px auto 10px; display: block;
      text-align: center; cursor: pointer;" border="0" id="BLOGGER_PHOTO_ID_5073145080981979474" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;如果所有的输入都合法的话，按钮 Scp 将可用，点击它将进行网络传输。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;&lt;a name="6"&gt;&lt;/a&gt;总结&lt;/h3&gt;&lt;br /&gt;自从 NetBeans 5.0 开始，编写基于 NetBeans 的插件或平台应用已经变得非常简单。对于新来者，最大的障碍无非是一些NetBeans专用的术语及早期遗留下来的几个不大好理解的概念。不过还好， NetBeans 自己在快速前进的同时并没有忘记为开发者提供便利。&lt;br /&gt;&lt;a href="http://wiki.netbeans.org/wiki/view/Main"&gt;NetBeans wiki&lt;/a&gt;
      是各种信息的大轮盘&lt;br /&gt;&lt;a href="http://www.planetnetbeans.org/"&gt;planetnetbeans&lt;/a&gt; 则是全世界NetBeans开发者的乐园。大家为了 NetBeans 开怀畅谈。&lt;br /&gt;&lt;a href="http://blogs.sun.com/geertjan/" title="Geertjan's Weblog"&gt;Geertjan's Weblog&lt;/a&gt; 不得不看&lt;div class="blogger-post-footer"&gt;&lt;img src="https://blogger.googleusercontent.com/tracker/171648533238476397-8348407469588799409?l=pprun.blogspot.com" alt="" height="1" width="1" /&gt;&lt;/div&gt;</description>
      <pubDate>Wed, 10 Dec 2008 17:08:10 +0000</pubDate>
    </item>
    <item>
      <title>平步星云: Hibernate Jpetstore 之五 部署</title>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-171648533238476397.post-5072407594529084050</guid>
      <link>http://pprun.blogspot.com/2007/08/hibernate-jpetstore.html</link>
      <description>文档内容&lt;br /&gt;&lt;ul&gt;&lt;li&gt;概览&lt;/li&gt;&lt;li&gt;获得工程代码&lt;/li&gt;&lt;li&gt;配置&lt;/li&gt;&lt;ul&gt;&lt;li&gt;数据库初始化&lt;/li&gt;&lt;ul&gt;&lt;li&gt;MySQL 5.x&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;Oracle 9i, 10g, HsqlDB, Postgres 及其它&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;应用服务器初始化&lt;/li&gt;&lt;ul&gt;&lt;li&gt;本地数据源（非JNDI 数据源）&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;ul&gt;&lt;li&gt;Tomcat 5.x,&lt;/li&gt;&lt;li&gt;Sun Application Server8.x, 9.x / GlassFish 1.x, 2.x&lt;/li&gt;&lt;li&gt;Jetty
      6.1.3&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;JNDI 数据源&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;ul&gt;&lt;li&gt;Sun Application Server8.x, 9.x / GlassFish 1.x, 2.x&lt;/li&gt;&lt;li&gt;JBoss 4.0.4 +&lt;/li&gt;&lt;li&gt;Jetty 6.1.3&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;/ul&gt;&lt;li&gt;部署并运行&lt;/li&gt;&lt;li&gt;总结&lt;/li&gt;&lt;/ul&gt; PS: &lt;span style="font-style: italic; font-weight: bold;"&gt;为什么这个系列的最后一篇这么长时间才出来？原因是，我跟大家说过，工程的所有源代码最终将发布。所以我要找一个合适的地方上载。&lt;/span&gt;&lt;br /&gt;&lt;span
      style="font-style: italic; font-weight: bold;"&gt; 这个过程还是比较烦的，况且老外们的工作效率普通不如我们，每次交流至少等上一周左右才有回应。试想申请、审批，确认，上载等过程，其实令我这个急性子试 图想把自己家里的电脑搬到主机托管中心，申请一个域名了事！&lt;br /&gt;&lt;br /&gt;&lt;/span&gt; 还好，它终于出来了 (&lt;a href="https://hjpetstore.dev.java.net/"&gt;hjpetstore&lt;/a&gt;)！但愿没让你失望。&lt;br /&gt;&lt;br /&gt;在阅读本篇文章之前，请先仔细阅读前面系列的相关内容。&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;概览&lt;/h2&gt;对于传统的J2EE 项目，当项目开发完后，其工作并未结束，紧接着的部署过程其实是很令开发者头痛的，特别是象重量级的应用服务 WebLogic, WebSphere 等。还好 NetBeans 现在抬简化了这一过程。&lt;br
      /&gt;我们这个例子是基于无存在数据库的方案，所以在我们演示结果前，我们将要导入一些数据。但首先我们得创建相应的数据库用户和数据库方案(Schema).&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;获得工程代码&lt;/h2&gt;1.从 &lt;a href="https://hjpetstore.dev.java.net/"&gt;hjpetstore&lt;/a&gt; 得到工程源代码，具体的步骤网站上有说明，在 NetBeans 中就很简单了：&lt;br /&gt;&lt;br /&gt;CVS | checkout:&lt;br /&gt;cvs root: :pserver:username@cvs.dev.java.net:/cvs (这个 username 是你必须到 java.net 上注册的用户名称，目前 anonymous 好象不能工作了)&lt;br /&gt;password:&lt;br /&gt;&lt;br /&gt;下一页中， module: hjpetstore 下载完后，NetBeans 会问你是否打开该工程，选择是。&lt;br
      /&gt;&lt;br /&gt;2. 你可能需要调整一下lib 的位置，这是 NetBeans 的一个缺陷，保存的路径不是相对路径。&lt;br /&gt;右击工程 | properties&lt;br /&gt;点 Libraries，在Compile 页中将所有 .jar 文件 选中后 'remove'，&lt;br /&gt;再加入下载下来的WEB-INF/lib 目录下的所有 jar 文件&lt;br /&gt;&lt;br /&gt;3. 确保 Clean And Build project 成功&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;配置&lt;/h2&gt;&lt;h3&gt;数据库初始化&lt;/h3&gt;我这里只介绍 MySql 的 配置，其它的数据库配置列作 TBD. (待做，其实大部分脚本已经在工程中了，等待你的加入吧！因为我不是一个数据库专家，也没有太多时间去研究这个。）我成功配置过oracle 和 hsqldb.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:
      bold; color: rgb(255, 0, 0);"&gt;注 意：因为下面的脚本会删除 'hjpetstore'数据库用户及其所有资源，请确保用户 'hjpetstore' (oracle) 或数据库 hjpetstore (mysql) 目前没被使用，如果使用了，请修改数据库脚本。所以最好的办法是使用你的个人数据库来作演示。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;MySQL 5.x&lt;/h4&gt;&lt;br /&gt;1. 创建用户hjpetstore 和 数据库 hjpetstore&lt;br /&gt;&lt;br /&gt;# 在命令行下以 root 身份运行创建脚本&lt;br /&gt;# $hjpetstore 是用真实的工程路径代替&lt;br /&gt;# 其它值根据你的设置作相应的改变，比如你如果连非本机的数据库，那 'localhost' 就是那个机器在 ip 了&lt;br /&gt;&gt; mysql -h localhost -u root -p &amp;lt;
      $hjpetstore\conf\jpetstore_mysql.sql Enter password: ******** 如果程序的输出显示了 hjpetstore, 则表明成功了： Database information_schema &lt;span style="font-weight: bold; color: rgb(102, 102, 204);"&gt;&lt;br /&gt;hjpetstore&lt;/span&gt;&lt;br /&gt;mysql&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;或者，如果有mysql query browser 的话，用它直接运行如下命令也可：&lt;br /&gt;-- frist drop database hjpetstore and user hjpetstore&lt;br /&gt;drop database if exists hjpetstore;&lt;br /&gt;&lt;br /&gt;create database hjpetstore;&lt;br /&gt;&lt;br
      /&gt;-- create user hjpetstore and give the password hjpetstore&lt;br /&gt;grant all privileges on hjpetstore.* to hjpetstore identified by 'hjpetstore';&lt;br /&gt;&lt;br /&gt;show databases;&lt;br /&gt;&lt;br /&gt;2. 得用 hibernate.hbm2ddl.auto 自动生成数据库方案&lt;br /&gt;确保 web/WEB-INF/dataAccessContext-hibernate.xml 中 设置了 update&lt;br /&gt;&lt;br /&gt;这个属性的具体含义，我在前面的系列中已经讲过了，在产品初始化，你就可以安全地把它注释掉。&lt;br /&gt;&lt;br /&gt;3. 在 NetBeans 右击工程 Run project&lt;br /&gt;这一步将所有的数据库表创建出来, 只是没有数据。&lt;br /&gt;&lt;br
      /&gt;4. 加裁数据&lt;br /&gt;使用 NetBeans Sql Editor&lt;br /&gt;4.1 注册mysql 驱动&lt;br /&gt;Runtime | DataBases 右击 -&gt; new Driver&lt;br /&gt;Add ... -&gt; 导航到工程WEB-INF/lib/下的 mysql-connector-java-3.1.12-bin 点 OK&lt;br /&gt;&lt;br /&gt;4.2 创建连接&lt;br /&gt;右击刚注册的驱动 MySql (Connector/J driver) -&gt; Connect using ....&lt;br /&gt;Database URL: jdbc:mysql://localhost:3306/hjpetstore?useUnicode=true&amp;amp;characterEncoding=UTF-8&lt;br /&gt;user name: hjpetstore&lt;br /&gt;password: hjpetstore&lt;br /&gt;&lt;br
      /&gt;点 Ok 后，在Databases 下应该会出现一个新的连接。&lt;br /&gt;&lt;br /&gt;4.3 执行 SQL 脚本&lt;br /&gt;1. 在 Files 窗口中导航到 db/mhsql/jpetstore-mysql-dataload.sql 并双击打开它&lt;br /&gt;2. 在编辑器的工具条中 Connection: 选择 刚创建的数据库连接：jdbc:mysql://localhost:3306/hjpetstore?useUnicode=true&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;ampamp;characterEncoding=UTF-8&lt;br /&gt;3. 点击编辑器工具条上，紧挨着下拉框的 run sql&lt;br /&gt;&lt;br /&gt;确保没有显示错误信息。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Oracle 9i, 10g, HsqlDB, Postgres 及其它&lt;/h4&gt;&lt;br
      /&gt;数据库脚本都已经在工程中了，你所要做的就是利用这些数据库提供的工具创建一个用户 'hjpetstore',&lt;br /&gt;之后的步骤与上述相同。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;应用服务器初始化&lt;/h3&gt;&lt;h4&gt;本地数据源（非JNDI 数据源）&lt;/h4&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Tomcat 5.x,&lt;/span&gt;&lt;br /&gt;事实上，工程默认是使用 Tomcat 服务器的，所以现在你根本不需要改动什么就可以运行工程了。&lt;br /&gt;有关数据源的配置是在 web/META-INF/ context.xml 文件中&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Sun Application Server8.x, 9.x / GlassFish 1.x, 2.x &lt;/span&gt;&lt;br
      /&gt;同样的配置，只不过要生成一个 sun-web.xml 文件，&lt;br /&gt;很好，NetBeans 会帮你自动产生，如下：&lt;br /&gt;右击工程 -&gt; Run | Server: 选择注册的Sun App Server (如果你还没注册 Sun App Server 的话，你需要先注册一下，具体步骤见相关文档)&lt;br /&gt;&lt;br /&gt;此时，文件已经产生，右击工程 -&gt; Run Project&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Jetty 6.1.3&lt;/span&gt;&lt;br /&gt;所有的配置文件已经在 WEB-INF 下了： jetty-web.xml, jetty-env.xml, 所以要做的只剩下将dist 上下生成的 hibernateJpetstore.war&lt;br /&gt;放到 Jetty 的部署目录，还好这个目录跟 Tomcat 的目录同名叫 webapps&lt;br /&gt;&lt;br /&gt;在
      Jetty 目录下运行:&lt;br /&gt;java -jar start.jar&lt;br /&gt;然后在浏览器中请求: http://localhost:8080/hjpetstore/&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;JNDI 数据源&lt;/h4&gt;&lt;br /&gt;使用JNDI数据源当然是为了使用其 JTA(包容器管理的事务及其数据库连接池的实现），&lt;br /&gt;只需要按正确的名称 jdbc/hjpetstore 在管理界面配好数据库连接池和相应的数据源，运行起来还是挺方便的,&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Sun Application Server8.x, 9.x / GlassFish 1.x, 2.x&lt;/span&gt;&lt;br /&gt;1. 首先按照这篇文章介绍的步骤正确配置 mysql 数据源连接池&lt;br /&gt;(中文)
      http://pprun.blogspot.com/2007/05/glassfishsun-app-server.html&lt;br /&gt;(English) http://enpprun.blogspot.com/2007/05/problem-in-setting-mysql-xa-datasource.html&lt;br /&gt;注意，我文章中介绍的是使用root/root 作为用户名/密码，此时可以设置成hjpetstore/hjpetstore&lt;br /&gt;&lt;br /&gt;2. 配置数据源&lt;br /&gt;在应用服务器的 管理 界面 导航Resources | JDBC | JDBC Resources&lt;br /&gt;点击右边主页面中的 new 后进入配置页面，填入：&lt;br /&gt;JNDI Name: jdbc/hjpetstore&lt;br /&gt;Pool Name: 选择前面配置的数据源:连接池：mysql&lt;br /&gt;完成后点击 Ok&lt;br /&gt;&lt;br /&gt;&lt;br
      /&gt;&lt;span style="font-weight: bold;"&gt;JBoss 4.0.4 +&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;1. 使用 JBoss 也许是冲着所谓的 #1 应用服务器而来的吧，但其配置有一些变化：&lt;br /&gt;第一它实现了自己的一套日志方式，所以需要把 web.xml 中的&lt;br /&gt;&lt;br /&gt;org.springframework.web.util.Log4jConfigListener&lt;br /&gt;&lt;br /&gt;注释掉。&lt;br /&gt;&lt;br /&gt;2. 它的数据源的配法也不相同，只需要将相应的数据库的配置文件(如：mysql-ds.xml ，内容见随后)放到&lt;br /&gt;jboss-4.0.4.GA\server\default\deploy 目录下，&lt;br /&gt;再在 jboss-4.0.4.GA\server\default\conf\login-config.xml 中加入:&lt;br
      /&gt;&lt;pre&gt; &amp;lt;application-policy name = "MySqlDbRealm"&gt;&lt;br /&gt;&amp;lt;authentication&gt;&lt;br /&gt;&amp;lt;login-module code&lt;br /&gt;= "org.jboss.resource.security.ConfiguredIdentityLoginModule" flag =&lt;br /&gt;"required"&gt;&lt;br /&gt;&amp;lt;module-option name ="principal"&gt;hjpetstore&amp;lt;/module-option&gt;&lt;br /&gt;&amp;lt;module-option name ="userName"&gt;hjpetstore&amp;lt;/module-option&gt;&lt;br /&gt;&amp;lt;module-option name
      ="password"&gt;hjpetstore&amp;lt;/module-option&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;module-option name&lt;br /&gt;="managedConnectionFactoryName"&gt;jboss.jca:service=LocalTxCM,name=hjpetstore-mysql&amp;lt;/module-option&gt;&lt;br /&gt;&amp;lt;/login-module&gt;&lt;br /&gt;&amp;lt;/authentication&gt;&lt;br /&gt;&amp;lt;/application-policy&gt;&lt;br /&gt;&lt;/pre&gt; mysql-ds.xml 相应的内容如下：&lt;br /&gt;&lt;pre&gt; &amp;lt;?xml version="1.0" encoding="UTF-8"?&gt;&lt;br /&gt;&amp;lt;datasources&gt;&lt;br
      /&gt;&amp;lt;local-tx-datasource&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;jndi-name&gt;hjpetstore-mysql&amp;lt;/jndi-name&gt;&lt;br /&gt;&amp;lt;connection-url&gt;jdbc:mysql://localhost:3306/hjpetstore&amp;lt;/connection-url&gt;&lt;br /&gt;&amp;lt;driver-class&gt;com.mysql.jdbc.Driver&amp;lt;/driver-class&gt;&lt;br /&gt;&amp;lt;user-name&gt;hjpetstore&amp;lt;/user-name&gt;&lt;br /&gt;&amp;lt;password&gt;hjpetstore&amp;lt;/password&gt;&lt;br
      /&gt;&amp;lt;exception-sorter-class-name&gt;org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter&amp;lt;/exception-sorter-class-name&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- should only be used on drivers after 3.22.1 with "ping" support&lt;br /&gt;&lt;br /&gt;&amp;lt;valid-connection-checker-class-name&gt;org.jboss.resource.adapter.jdbc.vendor.MySQLValidConnectionChecker&amp;lt;/valid-connection-checker-class-name&gt;&lt;br /&gt;--&gt;&lt;br /&gt;&amp;lt;!-- sql to call when&lt;br
      /&gt;connection is created&lt;br /&gt;&lt;br /&gt;&amp;lt;new-connection-sql&gt;some arbitrary sql&amp;lt;/new-connection-sql&gt;&lt;br /&gt; --&gt;&lt;br /&gt;&amp;lt;!-- sql to call on an&lt;br /&gt;existing pooled connection when it is obtained from pool -&lt;br /&gt;MySQLValidConnectionChecker is preferred for newer drivers&lt;br /&gt;&lt;br /&gt;&amp;lt;check-valid-connection-sql&gt;some arbitrary&lt;br /&gt;sql&amp;lt;/check-valid-connection-sql&gt;&lt;br /&gt;&lt;br /&gt; --&gt;&lt;br
      /&gt;&lt;br /&gt;&amp;lt;!-- corresponding&lt;br /&gt;type-mapping in the standardjbosscmp-jdbc.xml (optional for ejb) --&gt;&lt;br /&gt;&amp;lt;metadata&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;type-mapping&gt;mySQL&amp;lt;/type-mapping&gt;&lt;br /&gt;&amp;lt;/metadata&gt;&lt;br /&gt;&amp;lt;/local-tx-datasource&gt;&lt;br /&gt;&amp;lt;/datasources&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;3. 还有，就是JBoss 的 JNDI 的名称有些怪：&lt;br /&gt;&lt;pre&gt; &amp;lt;bean id="dataSource"&lt;br
      /&gt;class="org.springframework.jndi.JndiObjectFactoryBean"&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- JBoss&lt;br /&gt;--&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;property name="jndiName" value="java:/hjpetstore-mysql"&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- other standard Java EE server&lt;br /&gt;&lt;br /&gt;&amp;lt;property name="jndiName"&lt;br /&gt;value="java:comp/env/jdbc/hjpetstore"&gt;&lt;br /&gt;--&gt;&lt;br /&gt;&amp;lt;/bean&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br
      /&gt;看到区别了吗？它只需要java:/hjpetstore-mysql&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Jetty 6.1.3&lt;/span&gt;&lt;br /&gt;目前，还未测试成功！&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;部署并运行&lt;/h2&gt;&lt;br /&gt;在 NetBeans 中，只需要在 工程属性中选定所要运行的 服务器后，点 Run Project 即可运行在本地数据源配置上。&lt;br /&gt;此外，还可以按照服务指定的自动部署目录，将生成的 dist/hibernateJpetstore.war 文件放到该目录，&lt;br /&gt;如果服务器已经运行，一切就 ok 了，如果没有，启动服务器即可。&lt;br /&gt;&lt;br /&gt;如果要运行在 JNDI 配置上，则需要改一下 web.xml :&lt;br /&gt;&lt;pre&gt;&lt;br
      /&gt;&amp;lt;!--&lt;br /&gt;- Location of the XML file that defines the root&lt;br /&gt;application context.&lt;br /&gt;- Applied by ContextLoaderServlet.&lt;br /&gt;--&gt;&lt;br /&gt;&amp;lt;context-param&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;param-name&gt;contextConfigLocation&amp;lt;/param-name&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- local datasource --&gt;&lt;br /&gt;&amp;lt;param-value&gt;&lt;br /&gt;/WEB-INF/dataAccessContext-hibernate.xml&lt;br /&gt;/WEB-INF/applicationContext.xml&lt;br
      /&gt;&amp;lt;/param-value&gt;&lt;br /&gt;&amp;lt;!-- jndi datasource and JTA (for a transactional&lt;br /&gt;JNDI DataSource)&lt;br /&gt;&lt;br /&gt;&amp;lt;param-value&gt;&lt;br /&gt;&lt;br /&gt;/WEB-INF/dataAccessContext-hibernate-jndi.xml&lt;br /&gt;/WEB-INF/applicationContext.xml&lt;br /&gt;&amp;lt;/param-value&gt;&lt;br /&gt;--&gt;&lt;br /&gt;&amp;lt;/context-param&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;这几行配置说的应该很明白了，上面的是默认情况下的本地数据源，如果使用JNDI数据源，是这样了:&lt;br /&gt;&lt;pre&gt;&lt;br
      /&gt;&amp;lt;context-param&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;param-name&gt;contextConfigLocation&amp;lt;/param-name&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- jndi datasource and JTA (for a&lt;br /&gt;transactional JNDI DataSource) --&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;param-value&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;/WEB-INF/dataAccessContext-hibernate-jndi.xml&lt;br /&gt;/WEB-INF/applicationContext.xml&lt;br /&gt;&lt;br /&gt;&amp;lt;/param-value&gt;&lt;br
      /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/context-param&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;只要按照上述的步骤配置好了应用服务器的数据源，现在运行的效果应该跟本地数据源是一样的。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;总结&lt;/h2&gt;&lt;br /&gt;NetBeans 对于 Java EE 的开发是全面的，除了几个服务器还未集成进来之外，其它的功能已经走在了所有IDE的最前列，&lt;br /&gt;但这也不防碍开发者使用这些未集成的服务器，因为大部分服务器都支持热部署，当NetBeans 给你的工程生成了 WAR 文件后，&lt;br /&gt;剩下的就是“将它放入热部署目录”了。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;看运行在 Jetty6.1.3 上的效果 (注意脚注部分显示，当前运行在什么服务器上):&lt;br /&gt;&lt;br
      /&gt;&lt;a href="http://2.bp.blogspot.com/_bpUunzIgcNA/RsQSbKLv0eI/AAAAAAAAAEc/VADoU4S28o8/s1600-h/hjpetstore_poweredby_jetty.png"&gt;&lt;img src="http://2.bp.blogspot.com/_bpUunzIgcNA/RsQSbKLv0eI/AAAAAAAAAEc/VADoU4S28o8/s400/hjpetstore_poweredby_jetty.png" alt="" style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" border="0" id="BLOGGER_PHOTO_ID_5099220935889637858" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img
      src="https://blogger.googleusercontent.com/tracker/171648533238476397-5072407594529084050?l=pprun.blogspot.com" alt="" height="1" width="1" /&gt;&lt;/div&gt;</description>
      <pubDate>Wed, 10 Dec 2008 17:08:09 +0000</pubDate>
    </item>
    <item>
      <title>平步星云: NetBeans 6.0 beta1 终于出来了！</title>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-171648533238476397.post-9129667678153033769</guid>
      <link>http://pprun.blogspot.com/2007/09/netbeans-60-beta1.html</link>
      <description>经过“漫长”的等待，beta1 终于出来了！其实我一直在用它的最近的 daily build, 因为 M10 实在是太不稳定了。&lt;br /&gt;&lt;div&gt;beta1 给人的第一印象是，更换了主题（桌面 icon, welcome 页，向导图案），使用的是接近于 Vista 类似的蓝绿色调，给人以清新的感觉！&lt;br /&gt;加紧试用吧！&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_bpUunzIgcNA/Ru86uiJaeQI/AAAAAAAAAE8/Ly1jrQe_DGw/s1600-h/nb6.png"&gt;&lt;img src="http://2.bp.blogspot.com/_bpUunzIgcNA/Ru86uiJaeQI/AAAAAAAAAE8/Ly1jrQe_DGw/s400/nb6.png" alt="" style="margin: 0px auto 10px; display: block; text-align: center;
      cursor: pointer;" border="0" id="BLOGGER_PHOTO_ID_5111368673203484930" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img src="https://blogger.googleusercontent.com/tracker/171648533238476397-9129667678153033769?l=pprun.blogspot.com" alt="" height="1" width="1" /&gt;&lt;/div&gt;</description>
      <pubDate>Wed, 10 Dec 2008 17:08:08 +0000</pubDate>
    </item>
    <item>
      <title>BlogJava-Java桌面技术-随笔分类-NetBeans: 《FilthyRichClients》读书笔记(二)-让Swing正确显示Gif</title>
      <guid isPermaLink="false">http://www.blogjava.net/javagui/archive/2008/12/07/javafx.html</guid>
      <link>http://www.blogjava.net/javagui/archive/2008/12/07/javafx.html</link>
      <description>摘要: 显示GIF图片一直是swing的诟病,本文给出一个用swing处理gif类型图片的参考实现&#160;&#160;&lt;a href="http://www.blogjava.net/javagui/archive/2008/12/07/javafx.html"&gt;阅读全文&lt;/a&gt;&lt;img src="http://www.blogjava.net/javagui/aggbug/244891.html" height="1" width="1" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="right"&gt;&lt;a style="text-decoration: none;" href="http://www.blogjava.net/javagui/" target="_blank"&gt;sun_java_studio@yahoo.com.cn(电玩)&lt;/a&gt; 2008-12-07 20:36 &lt;a style="text-decoration: none;"
      href="http://www.blogjava.net/javagui/archive/2008/12/07/javafx.html#Feedback" target="_blank"&gt;发表评论&lt;/a&gt;&lt;/div&gt;</description>
      <pubDate>Sun, 07 Dec 2008 12:36:00 +0000</pubDate>
    </item>
    <item>
      <title>Some reminiscences, some memories » NetBeans: 在 Netbeans 6.5 中运行和调试基于 Darkstar 的服务器程序</title>
      <guid isPermaLink="false">http://www.mikespook.com/?p=247</guid>
      <link>http://www.mikespook.com/index.php/archives/247</link>
      <description>&lt;p&gt;Web game 一直以来被大家认为是开发技术门槛低，推广容易的一种游戏形式。但是在我1年来开发 web game 积累下来的经验来看，没有服务器端的 web game 只能被当作玩具，而不是一个可以运营的游戏（当然关于 Web game 技术考量关于这个话题，是我可能要写的另外一篇文章了）。为了这个目的，最近特意研究了一下 Darkstar。&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.projectdarkstar.com/" target="_blank"&gt;Darkstar&lt;/a&gt; 是 SUN 公司支持的一个开源的多人在线游戏（MMO）架构，它提供了任务、数据、信道以及会话管理等一系列的功能。使得开发人员可以更加专注的设计开发游戏相关逻辑，而不是服务器基本功能设计或负载调优等等重复的体力活。关于 Darkstar 的详细介绍，可能要写 N 篇文章来说明。先有个大概了解就好了。&lt;/p&gt; &lt;p&gt;基于 Darkstar 开发服务器端的时候，不需要自己写主类。只要按照
      Darkstar 提供的标准实现如 AppListener 等等的接口，就可以将开发人员实现的相关功能加入 Darkstar 架构中执行。Darkstar 分别在 *nix 系统和 windows 系统提供了 sgs.sh 和 sgs.bat 两个脚本，以方便使用。&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.netbeans.org/" target="_blank"&gt;Netbeans 6.5&lt;/a&gt; 的发布，给沉闷的开发带来了一丝生气。即使是我那 512M 内存的运行 xubuntu 的笔记本，跑起 Netbeans 也如行云流水般流畅（Eclipse 的粉丝别砸我，Eclipse 我开都不敢开）。&lt;span id="more-247"&gt;&lt;/span&gt;我一般是使用 Netbeans 编写 java 代码，上网找了一下，netbeans 的一个 Darkstar 插件已经有一些时候没有更新了。这使得在 Netbeans 中开发 Darkstar 很不方便，不能直接运行，也不能调试。在研究了 sgs.sh 和
      sgs.bat 之后发现，这两个脚本实际上只是设置了 java 命令的一些参数，使得 Darkstar 可以执行。那么将这些参数移入 Netbeans 就可以在其中直接运行和调试了（这篇&lt;a href="http://www.projectdarkstar.com/component/option,com_smf/Itemid,120/topic,634.0" target="_blank"&gt;帖子&lt;/a&gt;验证了这个想法）。&lt;/p&gt; &lt;p&gt;首先添加库的时候，除了设置类路径和 javadoc 外，还应将 sgs-server-0.9.7-sources.jar 设置到源中去，方便开发和调试。&lt;/p&gt; &lt;p&gt;然后在“项目属性”中找到“运行”，按照下表填写：&lt;/p&gt; &lt;p&gt;主类：com.sun.sgs.impl.kernel.Kernel&lt;/p&gt; &lt;p&gt;参数：foobar.properties&lt;/p&gt;
      &lt;p&gt;工作目录：F:\java\FoobarServer\data&lt;/p&gt; &lt;p&gt;VM 选项：-Djava.library.path=F:\java\libs\sgs\sgs-server-0.9.7\lib\bdb\win32-x86&lt;/p&gt; &lt;p&gt;其中&lt;strong&gt;主类&lt;/strong&gt;是在项目导入的 sgs-server.jar 中的类。在任何环境下都只可以填写这个 Kernel 类。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;参数&lt;/strong&gt;是项目的配置文件，这个文件一般有下面的内容：&lt;/p&gt; &lt;p&gt;com.sun.sgs.app.name=HelloFoobar&lt;br /&gt; com.sun.sgs.app.root=F:/java/FoobarServer/data/&lt;br /&gt; com.sun.sgs.app.port=1139&lt;br /&gt;
      com.sun.sgs.app.listener=com.xxiyy.game.server.FoobarServer&lt;/p&gt; &lt;p&gt;name 是项目名称。root 是项目根目录，跟目录必须含有子目录 dsdb，用来存储序列会对象数据。port 是服务器监听的端口。listener 即是实现 AppListener 接口的用户类了。需要注意的是，如果不是用绝对路径，properties 文件是相对于&lt;strong&gt;工作目录&lt;/strong&gt;来说的。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;工作目录&lt;/strong&gt;需要对应 properties 文件中的 root 选项。一定要注意，工作目录必须含有子目录 dsdb。否则运行的时候会提示无法找到路径的错误。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;VM 选项&lt;/strong&gt;是因为 Darkstar 默认使用了Berkeley db，需要加载动态库文件。对于windows 就是 bdb 所带 win32-x86 目录中的
      libdb_java45.dll。对于 32 位 linux 就是 linux-x86 目录中的 libdb-4.5.so 和 libdb_java-4.5.so。其他不同系统类推。如果你在运行后出现 java.lang.UnsatisfiedLinkError: no libdb_java45 in java.library.path 这样的异常，说明你的 java.library.path 没有设置正确。&lt;/p&gt; &lt;p&gt;确定后，就可以像普通 java 程序那样在 netbeans 中直接运行或调试 Darkstar 程序了。&lt;/p&gt;</description>
      <pubDate>Thu, 04 Dec 2008 08:43:45 +0000</pubDate>
    </item>
    <item>
      <title>平步星云: NetBeans 6.5 出来了！</title>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-171648533238476397.post-679783427554738185</guid>
      <link>http://pprun.blogspot.com/2008/11/netbeans-65.html</link>
      <description>&lt;a href="http://www.netbeans.org/downloads/"&gt;&lt;img src="http://www.netbeans.org/images/collateral/65/netbeans-button-110x32.gif" alt="Download NetBeans!" height="32" border="0" width="110" /&gt;&lt;/a&gt;&lt;br /&gt;尽管这一版 6.5 一直在“鼓吹”给 PHP 的朋友听，&lt;br /&gt;但是NetBeans team 还是没有忘本，有关JAVA IDE 的特征也不少：&lt;br /&gt;&lt;a href="http://wiki.netbeans.org/NewAndNoteWorthy"&gt;NetBeans IDE 6.5 Release Client - New and Noteworthy&lt;/a&gt;&lt;a
      href="http://www.netbeans.org/community/releases/65/"&gt;&lt;br /&gt;6.5 Release Information&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;下面这些是我个人比较喜欢的：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Automatic Compile on Save&lt;/li&gt;&lt;li&gt;Improved Eclipse project import and synchronization&lt;/li&gt;&lt;li&gt;Java Call Hierarchy&lt;/li&gt;&lt;li&gt;Analyze Javadoc&lt;/li&gt;&lt;li&gt;CamelCase code completion &lt;/li&gt;&lt;li&gt;Customize formatting settings per project&lt;/li&gt;&lt;li&gt;Enhanced support for Spring,
      Hibernate&lt;/li&gt;&lt;li&gt;New multi-threaded debugging with improved UI and work-flow&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Have fun!&lt;div class="blogger-post-footer"&gt;&lt;img src="https://blogger.googleusercontent.com/tracker/171648533238476397-679783427554738185?l=pprun.blogspot.com" alt="" height="1" width="1" /&gt;&lt;/div&gt;</description>
      <pubDate>Wed, 19 Nov 2008 15:03:09 +0000</pubDate>
    </item>
    <item>
      <title>平步星云: JAVA 1.6.0_10 -Xmx</title>
      <guid isPermaLink="false">tag:blogger.com,1999:blog-171648533238476397.post-6031146870129978775</guid>
      <link>http://pprun.blogspot.com/2008/11/java-16010-xmx.html</link>
      <description>依次执行如下命令&lt;br /&gt;&lt;br /&gt;C:\Documents and Settings\pprun&gt;ver&lt;br /&gt;&lt;br /&gt;Microsoft Windows XP [版本 5.1.2600]&lt;br /&gt;&lt;br /&gt;C:\Documents and Settings\pprun&gt;java -version&lt;br /&gt;java version "1.6.0_10"&lt;br /&gt;Java(TM) SE Runtime Environment (build 1.6.0_10-b33)&lt;br /&gt;Java HotSpot(TM) Client VM (build 11.0-b15, mixed mode, sharing)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;C:\Documents and Settings\pprun&gt;java -Xmx&lt;span style="color: rgb(255, 0,
      0);"&gt;2048m&lt;/span&gt; -version&lt;br /&gt;Error occurred during initialization of VM&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;Could not reserve enough space for object heap&lt;/span&gt;&lt;br /&gt;Could not create the Java virtual machine.&lt;br /&gt;&lt;br /&gt;2 G 内存，很新鲜吗？&lt;br /&gt;我刚加了一条，才百多块。&lt;br /&gt;然而，直到我试到 &lt;span style="color: rgb(0, 153, 0); font-weight: bold;"&gt;1446&lt;/span&gt; 这个可爱的幸运数字时，才成功：&lt;br /&gt;C:\Documents and Settings\pprun&gt;java -Xmx&lt;span
      style="color: rgb(255, 0, 0);"&gt;1447m&lt;/span&gt; -version&lt;br /&gt;Error occurred during initialization of VM&lt;br /&gt;Could not reserve enough space for object heap&lt;br /&gt;Could not create the Java virtual machine.&lt;br /&gt;&lt;br /&gt;C:\Documents and Settings\pprun&gt;java -Xmx&lt;span style="color: rgb(0, 153, 0);"&gt;1446m&lt;/span&gt; -version&lt;br /&gt;java version "1.6.0_10"&lt;br /&gt;Java(TM) SE Runtime Environment (build 1.6.0_10-b33)&lt;br /&gt;Java HotSpot(TM) Client VM
      (build 11.0-b15, mixed mode)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;我立即切换到 Ubunut8.04,进行了一下测试:&lt;br /&gt;&lt;br /&gt;pprun@pprun-t61:~$ uname -r&lt;br /&gt;2.6.24-21-generic&lt;br /&gt;pprun@pprun-t61:~$ sudo lsb_release -a&lt;br /&gt;No LSB modules are available.&lt;br /&gt;Distributor ID: Ubuntu&lt;br /&gt;Description: Ubuntu 8.04.1&lt;br /&gt;Release: 8.04&lt;br /&gt;Codename: hardy&lt;br /&gt;&lt;br /&gt;pprun@pprun-t61:~$ java -Xmx3072m -version&lt;br /&gt;java version "1.6.0_10"&lt;br
      /&gt;Java(TM) SE Runtime Environment (build 1.6.0_10-b33)&lt;br /&gt;Java HotSpot(TM) Server VM (build 11.0-b15, mixed mode)&lt;br /&gt;&lt;br /&gt;pprun@pprun-t61:~$ java -Xmx3722m -version&lt;br /&gt;java version "1.6.0_10"&lt;br /&gt;Java(TM) SE Runtime Environment (build 1.6.0_10-b33)&lt;br /&gt;Java HotSpot(TM) Server VM (build 11.0-b15, mixed mode)&lt;br /&gt;&lt;br /&gt;pprun@pprun-t61:~$ java -Xmx&lt;span style="color: rgb(255, 0, 0);"&gt;3723m&lt;/span&gt; -version&lt;br /&gt;Error occurred
      during initialization of VM&lt;br /&gt;Could not reserve enough space for object heap&lt;br /&gt;Could not create the Java virtual machine.&lt;br /&gt;&lt;br /&gt;是不是 JAVA 也赞成 Windows XP 黑屏？&lt;br /&gt;竟然不能够分配超过 &lt;span style="color: rgb(0, 153, 0);"&gt;1446m &lt;span style="color: rgb(0, 0, 0);"&gt;(1.446g) 内存堆！&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img
      src="https://blogger.googleusercontent.com/tracker/171648533238476397-6031146870129978775?l=pprun.blogspot.com" alt="" height="1" width="1" /&gt;&lt;/div&gt;</description>
      <pubDate>Sun, 16 Nov 2008 16:29:40 +0000</pubDate>
    </item>
    <item>
      <title>BlogJava-何以解忧？唯有Java: nbPython 的代码提示功能！</title>
      <guid isPermaLink="false">http://www.blogjava.net/gml520/archive/2008/11/15/240637.html</guid>
      <link>http://www.blogjava.net/gml520/archive/2008/11/15/240637.html</link>
      <description>摘要: 这篇文章很不错, 介绍了nbPython 大部分的的代码提示工能。&#160;&#160;&lt;a href="http://www.blogjava.net/gml520/archive/2008/11/15/240637.html"&gt;阅读全文&lt;/a&gt;&lt;img src="http://www.blogjava.net/gml520/aggbug/240637.html" height="1" width="1" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="right"&gt;&lt;a style="text-decoration: none;" href="http://www.blogjava.net/gml520/" target="_blank"&gt;日月雨林@gmail.com&lt;/a&gt; 2008-11-15 09:43 &lt;a style="text-decoration: none;"
      href="http://www.blogjava.net/gml520/archive/2008/11/15/240637.html#Feedback" target="_blank"&gt;发表评论&lt;/a&gt;&lt;/div&gt;</description>
      <pubDate>Sat, 15 Nov 2008 01:43:00 +0000</pubDate>
    </item>
    <item>
      <title>BlogJava-何以解忧？唯有Java: NetBeans 教程系列以及相关文章索引 （不定时更新！）</title>
      <guid isPermaLink="false">http://www.blogjava.net/gml520/archive/2008/11/13/240291.html</guid>
      <link>http://www.blogjava.net/gml520/archive/2008/11/13/240291.html</link>
      <description>摘要: 一、NetBeans 教程系列: &lt;br /&gt; &lt;br /&gt;NetBeans6.1 入门教程系列（1）--- 数据库的基本操作 &lt;br /&gt; &lt;br /&gt;NetBeans6.1 入门教程系列（2）--- 数据库的设计查询以及创建视图&#160;&#160;&lt;a href="http://www.blogjava.net/gml520/archive/2008/11/13/240291.html"&gt;阅读全文&lt;/a&gt;&lt;img src="http://www.blogjava.net/gml520/aggbug/240291.html" height="1" width="1" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="right"&gt;&lt;a style="text-decoration: none;" href="http://www.blogjava.net/gml520/"
      target="_blank"&gt;日月雨林@gmail.com&lt;/a&gt; 2008-11-13 12:26 &lt;a style="text-decoration: none;" href="http://www.blogjava.net/gml520/archive/2008/11/13/240291.html#Feedback" target="_blank"&gt;发表评论&lt;/a&gt;&lt;/div&gt;</description>
      <pubDate>Thu, 13 Nov 2008 04:26:00 +0000</pubDate>
    </item>
    <item>
      <title>BlogJava-何以解忧？唯有Java: Python for NetBeans 将与NetBeans6.5 正式版同时发布!</title>
      <guid isPermaLink="false">http://www.blogjava.net/gml520/archive/2008/11/13/240246.html</guid>
      <link>http://www.blogjava.net/gml520/archive/2008/11/13/240246.html</link>
      <description>&lt;a href="http://gml520.javaeye.com/admin/blogs/266428/edit"&gt;&lt;/a&gt;&lt;strong&gt;&lt;/strong&gt; &lt;a href="http://codesnakes.blogspot.com/2008/11/python-in-netbeans-is-go.html"&gt;Python in Netbeans is a go!!!!&lt;/a&gt; &lt;div&gt; &lt;div&gt; &lt;/div&gt; &lt;p&gt;&lt;a href="http://4.bp.blogspot.com/_FMMRL6HCtTU/SRtpAjtkJ5I/AAAAAAAAAEA/2HjekkMo5X0/s1600-h/nbPythonSplash.png"&gt;&lt;img
      src="http://4.bp.blogspot.com/_FMMRL6HCtTU/SRtpAjtkJ5I/AAAAAAAAAEA/2HjekkMo5X0/s320/nbPythonSplash.png" alt="" style="margin: 0px auto 10px; display: block; width: 320px; cursor: pointer; height: 185px; text-align: center;" border="0" id="BLOGGER_PHOTO_ID_5267919647447197586" /&gt;&lt;/a&gt;&lt;br /&gt; After a 6 months of development. nbPython has been given the green light to be release as the official python build for Netbeans. The EA release will be released with Netbeans6.5. This feels like a
      real achievement for us. I would like to thank all the people who made this possable:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Ted Leung&lt;br /&gt; &lt;/li&gt; &lt;li&gt;Tor Norbye&lt;br /&gt; &lt;/li&gt; &lt;li&gt;Frank Wierzbicki&lt;br /&gt; &lt;/li&gt; &lt;li&gt;Jean-Yves Mengant&lt;br /&gt; &lt;/li&gt; &lt;li&gt;Amit Saha &lt;/li&gt; &lt;li&gt;The rest of the nbPython Development team&lt;br /&gt; &lt;/li&gt; &lt;li&gt;Netbeans QA Team&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Most of all the user community, With
      out you this would have been all for nothing. &lt;/p&gt; &lt;/div&gt; &lt;img src="http://www.blogjava.net/gml520/aggbug/240246.html" height="1" width="1" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="right"&gt;&lt;a style="text-decoration: none;" href="http://www.blogjava.net/gml520/" target="_blank"&gt;日月雨林@gmail.com&lt;/a&gt; 2008-11-13 10:29 &lt;a style="text-decoration: none;" href="http://www.blogjava.net/gml520/archive/2008/11/13/240246.html#Feedback"
      target="_blank"&gt;发表评论&lt;/a&gt;&lt;/div&gt;</description>
      <pubDate>Thu, 13 Nov 2008 02:29:00 +0000</pubDate>
    </item>
    <item>
      <title>BlogJava-何以解忧？唯有Java: NetBeans6.1 入门教程系列（2）--- 数据库的设计查询以及创建视图</title>
      <guid isPermaLink="false">http://www.blogjava.net/gml520/archive/2008/10/31/237887.html</guid>
      <link>http://www.blogjava.net/gml520/archive/2008/10/31/237887.html</link>
      <description>摘要: 用过MS SQL的朋友都知道他有个视图设计器，可以很方便的创建视图。在NetBeans6.1 中也有这样的功能。大家看看截图：&#160;&#160;&lt;a href="http://www.blogjava.net/gml520/archive/2008/10/31/237887.html"&gt;阅读全文&lt;/a&gt;&lt;img src="http://www.blogjava.net/gml520/aggbug/237887.html" height="1" width="1" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="right"&gt;&lt;a style="text-decoration: none;" href="http://www.blogjava.net/gml520/" target="_blank"&gt;日月雨林@gmail.com&lt;/a&gt; 2008-10-31 20:27 &lt;a style="text-decoration: none;"
      href="http://www.blogjava.net/gml520/archive/2008/10/31/237887.html#Feedback" target="_blank"&gt;发表评论&lt;/a&gt;&lt;/div&gt;</description>
      <pubDate>Fri, 31 Oct 2008 12:27:00 +0000</pubDate>
    </item>
    <item>
      <title>Some reminiscences, some memories » NetBeans: netbeans 6.5 rc 下建立 Zend Framework 项目</title>
      <guid isPermaLink="false">http://www.mikespook.com/?p=205</guid>
      <link>http://www.mikespook.com/index.php/archives/205</link>
      <description>&lt;p&gt;首先，这不是一个指南，这只是一个简易说明。描述了如何在 netbeans 6.5 rc for php 中建立、开发、调试 Zend Framework 项目。&lt;/p&gt; &lt;p&gt;step by step:&lt;span id="more-205"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;1. 安装 netbeans 6.5 rc for php，由于 netbeans 6.5 rc for php 官方只放出了&lt;a href="http://download.netbeans.org/netbeans/6.5/rc/bundles/netbeans-6.5rc1-php-windows.exe" target="_blank"&gt;英文版本&lt;/a&gt;。中文版本要在&lt;a href="http://dlc.sun.com.edgesuite.net/netbeans/6.5/rc/" target="_blank"&gt;这里下载&lt;/a&gt;。&lt;/p&gt;
      &lt;p&gt;2. 安装 xdebug，这不是必要的一部，不过如果你想在 netbeans 中调试 php。这是非常必要的。相关内容去 &lt;a href="http://xdebug.org/" target="_blank"&gt;xdebug 官方网站&lt;/a&gt;了解，&lt;a href="http://www.mikespook.com/index.php/archives/34" target="_blank"&gt;这里&lt;/a&gt;也有简单的说明。&lt;/p&gt; &lt;p&gt;3. 我假设你在安装 netbeans 6.5 rc for php 未遇到任何问题，如果遇到了，请参考 netbeans 的 &lt;a href="http://wiki.netbeans.org/NetBeansUserFAQ#section-NetBeansUserFAQ-Installation" target="_blank"&gt;FAQ 关于安装的部分&lt;/a&gt;。&lt;/p&gt; &lt;p&gt;4. 打开 netbeans 6.5 rc for
      php，在菜单中选择“新建项目”。当然更多时候 Ctrl+Shift+N 是一个更好的主意。&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.mikespook.com/wp-content/uploads/2008/10/netbeans_for_php_1.jpg"&gt;&lt;img src="http://www.mikespook.com/wp-content/uploads/2008/10/netbeans_for_php_1.jpg" title="netbeans_for_php_1" height="128" width="296" alt="" class="alignnone size-medium wp-image-208" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;5. 选择“PHP 应用程序”点下一步。也可以导入现有的代码，实际上两者并无本质区别。&lt;/p&gt; &lt;p&gt;6.
      设置项目的名称以及存储目录。实际上这个存储目录需要将所有项目用到的文件，如代码、文档、配置都包含进去，否则开发时将遇到无穷无尽的从 netbeans 切换到其他工具，再切换回来的情况。而用到的不再进行修改的库文件，反而可以不用包含。&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.mikespook.com/wp-content/uploads/2008/10/netbeans_for_php_7.jpg"&gt;&lt;img src="http://www.mikespook.com/wp-content/uploads/2008/10/netbeans_for_php_7.jpg" title="netbeans_for_php_7" height="99" width="148" alt="" class="alignnone size-medium wp-image-209" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;7.
      设置好名称和目录后，在“运行配置”中选择项目的部署方式，以及索引文件。通常本地开发网站，默认选择第一种方式即可。这时，netbeans 会默认以项目目录作为 webroot。索引文件可先随意选择一个项目目录中的文件。通常 Zend Framework 开发中 webroot 只是包含 index.php 入口和样式、图片等客户端使用的文件。例如目录“&amp;lt;项目目录&gt;/www”。由于 Zend Framework 部署的特殊性，这里还要做修改。&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.mikespook.com/wp-content/uploads/2008/10/netbeans_for_php_2.jpg"&gt;&lt;img src="http://www.mikespook.com/wp-content/uploads/2008/10/netbeans_for_php_2-300x94.jpg" title="netbeans_for_php_2" height="94" width="300" alt=""
      class="alignnone size-medium wp-image-210" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;8. 在“项目”面板中选择刚才建立的 php 项目，点击鼠标右键选择菜单项“属性”。&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.mikespook.com/wp-content/uploads/2008/10/netbeans_for_php_8.jpg"&gt;&lt;img src="http://www.mikespook.com/wp-content/uploads/2008/10/netbeans_for_php_8-225x300.jpg" title="netbeans_for_php_8" height="300" width="225" alt="" class="alignnone size-medium wp-image-211" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;9. 在类别“源”的“Web 根目录”选择你真正的
      webroot。例如：&amp;lt;项目目录&gt;/www。&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.mikespook.com/wp-content/uploads/2008/10/netbeans_for_php_3.jpg"&gt;&lt;img src="http://www.mikespook.com/wp-content/uploads/2008/10/netbeans_for_php_3-300x84.jpg" title="netbeans_for_php_3" height="84" width="300" alt="" class="alignnone size-medium wp-image-212" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;10. 在“项目属性”的“运行配置”类别中，调整索引文件到 index.php。实际上，如果你完成了 step 9，这里会有一个“不是合法的索引文件”的警告。直到你重新调整索引文件为合法文件。&lt;/p&gt; &lt;p&gt;&lt;a
      href="http://www.mikespook.com/wp-content/uploads/2008/10/netbeans_for_php_4.jpg"&gt;&lt;img src="http://www.mikespook.com/wp-content/uploads/2008/10/netbeans_for_php_4-300x72.jpg" title="netbeans_for_php_4" height="72" width="300" alt="" class="alignnone size-medium wp-image-213" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;11. 在“项目属性”的“PHP 包含路径”中设置你的 Zend Framework 路径。例如从 svn 导出的某个路径 ~/Zend Framework\library。&lt;/p&gt; &lt;p&gt;&lt;a
      href="http://www.mikespook.com/wp-content/uploads/2008/10/netbeans_for_php_5.jpg"&gt;&lt;img src="http://www.mikespook.com/wp-content/uploads/2008/10/netbeans_for_php_5-300x99.jpg" title="netbeans_for_php_5" height="99" width="300" alt="" class="alignnone size-medium wp-image-214" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;12. 至此已经基本设置完成，需要注意的是“项目属性”中的“调试服务器端 PHP”和“调试客户端 JavaScript” 需要勾上才可以正常调试。&lt;/p&gt; &lt;p&gt;&lt;a
      href="http://www.mikespook.com/wp-content/uploads/2008/10/netbeans_for_php_6.jpg"&gt;&lt;img src="http://www.mikespook.com/wp-content/uploads/2008/10/netbeans_for_php_6-300x90.jpg" title="netbeans_for_php_6" height="90" width="300" alt="" class="alignnone size-medium wp-image-215" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;简单测试一下代码编辑和调试的情况：&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.mikespook.com/wp-content/uploads/2008/10/netbeans_for_php_9.jpg"&gt;&lt;img
      src="http://www.mikespook.com/wp-content/uploads/2008/10/netbeans_for_php_9-283x300.jpg" title="netbeans_for_php_9" height="300" width="283" alt="" class="alignnone size-medium wp-image-216" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;漂亮完整的代码提示，包括方法或属性类型、参数、所在的类名或文件名等等。同时还会解析 phpdoc。&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.mikespook.com/wp-content/uploads/2008/10/netbeans_for_php_10.jpg"&gt;&lt;img src="http://www.mikespook.com/wp-content/uploads/2008/10/netbeans_for_php_10-300x94.jpg"
      title="netbeans_for_php_10" height="94" width="300" alt="" class="alignnone size-medium wp-image-217" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;强大的单步调试，我以前说过 php 让我头疼的就是调试。虽然 xdebug 很完美，但是所有调试器都有这样那样的不足。现在 netbeans 带来的是 java style 的调试方式，很好，很强大。&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.mikespook.com/wp-content/uploads/2008/10/netbeans_for_php_11.jpg"&gt;&lt;img src="http://www.mikespook.com/wp-content/uploads/2008/10/netbeans_for_php_11-300x176.jpg" title="netbeans_for_php_11" height="176" width="300"
      alt="" class="alignnone size-medium wp-image-218" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;变量的监视信息详实准确，无需再为一个变量的值而 echo 来 var_dump 去了。&lt;/p&gt; &lt;p&gt;总体上来说，netbeans 6.5rc for php 是我见过的比较好的 IDE for php 之一。即便我坚信 IDE is evil ，netbeans for php 也让我眼前一亮。再配合其他插件如 svn、uml、database，已经无需其他工具辅助即可完成 php 日常开发所需。不过试用之后，也发现一些不足的地方：比如有一些提示框中英文混杂在一起；新建 php 工程的向导设置也过于简单，以至于建立 Zend Framework 项目时需要建立好后再次调整项目设置；又比如会莫名其妙的提示一个临时目录下某文件无法访问；再如代码提示时不能正确解析魔法方法，无法提示魔法方法提供的魔法属性等等。不过相信在正式的 6.5 版中这些问题都会一一得到解决，作为一个 rc
      版本的软件来说，netbeans 已经做得够好了。&lt;/p&gt; &lt;p&gt;我计划在 PNP-广州 PHP 街坊群中推荐 netbeans 作为初学 Zend Framework 的平台，这样可以利用强大的单步功能，和代码提示功能来学习 Zend Framework，了解 Zend Framework 的运行机制。不知道大家对此有什么看法和意见，欢迎讨论。&lt;/p&gt; &lt;p&gt;PS: 推荐 eclipse 的朋友务必请考虑一下我那只有 512M 内存的本本，当时选择用 netbeans 写 java，就是因为它不是那么消耗内存和 cpu。&lt;/p&gt;</description>
      <pubDate>Fri, 24 Oct 2008 04:37:13 +0000</pubDate>
    </item>
    <item>
      <title>BlogJava-何以解忧？唯有Java: Linux 下用NetBeans开发GTK 程序</title>
      <guid isPermaLink="false">http://www.blogjava.net/gml520/archive/2008/10/19/235287.html</guid>
      <link>http://www.blogjava.net/gml520/archive/2008/10/19/235287.html</link>
      <description>摘要: 用了Linux 突然间想写点C的程序，大家都说GTK 好用，所以就拿GTK 作实验。 &lt;br /&gt;第一步：搭建开发环境 &lt;br /&gt;1.gcc和java，这个应该不难，一般的发行版里都有gcc，Java可以到www.sun.com下载，安装配置，google 一下到处都是。 &lt;br /&gt;2.到www.netbeans.org 下载netbeans IDE ，有专门的C＋＋ 版。 &lt;br /&gt;3.Gtk+可以直接安装libgtk2.0-dev软件包，也可以从http://www.gtk.org/下载源码，编译安装。可能需要其他依赖的软件包如下： &lt;br /&gt; &lt;br /&gt; * pkg-config &lt;br /&gt; * GNU make &lt;br /&gt; * JPEG, PNG and TIFF image libraries &lt;br /&gt; * FreeType &lt;br /&gt; * fontconfig &lt;br /&gt; * GNU
      libiconv library &lt;br /&gt; * GNU gettext &lt;br /&gt; * GLib &lt;br /&gt; * Pango &lt;br /&gt; * ATK &lt;br /&gt; &#160;&#160;&lt;a href="http://www.blogjava.net/gml520/archive/2008/10/19/235287.html"&gt;阅读全文&lt;/a&gt;&lt;img src="http://www.blogjava.net/gml520/aggbug/235287.html" height="1" width="1" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="right"&gt;&lt;a style="text-decoration: none;" href="http://www.blogjava.net/gml520/" target="_blank"&gt;日月雨林@gmail.com&lt;/a&gt; 2008-10-19 12:30 &lt;a
      style="text-decoration: none;" href="http://www.blogjava.net/gml520/archive/2008/10/19/235287.html#Feedback" target="_blank"&gt;发表评论&lt;/a&gt;&lt;/div&gt;</description>
      <pubDate>Sun, 19 Oct 2008 04:30:00 +0000</pubDate>
    </item>
    <item>
      <title>BlogJava-何以解忧？唯有Java: SwingHacks学习笔记(2)-----自定义JLabel，JButton</title>
      <guid isPermaLink="false">http://www.blogjava.net/gml520/archive/2008/10/14/234306.html</guid>
      <link>http://www.blogjava.net/gml520/archive/2008/10/14/234306.html</link>
      <description>摘要: 关键字: swinghacks，swing &lt;br /&gt; &lt;br /&gt;接着上次的进度，上次写完了背景， &lt;br /&gt;SwingHacks学习笔记(1)-----自定义JPanel(一个以图像填充的组件) &lt;br /&gt; &lt;br /&gt;现在可以考虑标签和按钮了。 &lt;br /&gt; &lt;br /&gt;这个标签是位于背景上的某个位置的静态图像。 &lt;br /&gt; &lt;br /&gt;例1.3：一个图像标签类&#160;&#160;&lt;a href="http://www.blogjava.net/gml520/archive/2008/10/14/234306.html"&gt;阅读全文&lt;/a&gt;&lt;img src="http://www.blogjava.net/gml520/aggbug/234306.html" height="1" width="1" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div
      align="right"&gt;&lt;a style="text-decoration: none;" href="http://www.blogjava.net/gml520/" target="_blank"&gt;日月雨林@gmail.com&lt;/a&gt; 2008-10-14 21:17 &lt;a style="text-decoration: none;" href="http://www.blogjava.net/gml520/archive/2008/10/14/234306.html#Feedback" target="_blank"&gt;发表评论&lt;/a&gt;&lt;/div&gt;</description>
      <pubDate>Tue, 14 Oct 2008 13:17:00 +0000</pubDate>
    </item>
    <item>
      <title>BlogJava-何以解忧？唯有Java: 测试ScribeFire 工具</title>
      <guid isPermaLink="false">http://www.blogjava.net/gml520/articles/233801.html</guid>
      <link>http://www.blogjava.net/gml520/articles/233801.html</link>
      <description>测试ScribeFire 工具，如果好用，以后就用他了。linux 下用这个很方便。这个Firefox 的拓展 很不错。&lt;br /&gt;&lt;img src="http://www.blogjava.net/gml520/aggbug/233801.html" height="1" width="1" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="right"&gt;&lt;a style="text-decoration: none;" href="http://www.blogjava.net/gml520/" target="_blank"&gt;日月雨林@gmail.com&lt;/a&gt; 2008-10-11 22:34 &lt;a style="text-decoration: none;" href="http://www.blogjava.net/gml520/articles/233801.html#Feedback"
      target="_blank"&gt;发表评论&lt;/a&gt;&lt;/div&gt;</description>
      <pubDate>Sat, 11 Oct 2008 14:34:00 +0000</pubDate>
    </item>
    <item>
      <title>BlogJava-何以解忧？唯有Java: SwingHacks学习笔记(1)-----自定义JPanel(一个以图像填充的组件)</title>
      <guid isPermaLink="false">http://www.blogjava.net/gml520/archive/2008/10/11/233773.html</guid>
      <link>http://www.blogjava.net/gml520/archive/2008/10/11/233773.html</link>
      <description>摘要: Swing 自定义组件系列－SwingHacks学习笔记(1) &lt;br /&gt; &lt;br /&gt; &lt;br /&gt;一、自定义JPanel(一个以图像填充的组件) &lt;br /&gt; &lt;br /&gt;例1.1 ：一个JPanel 的定制子类 &lt;br /&gt; &lt;br /&gt;ImagePanel.java:&#160;&#160;&lt;a href="http://www.blogjava.net/gml520/archive/2008/10/11/233773.html"&gt;阅读全文&lt;/a&gt;&lt;img src="http://www.blogjava.net/gml520/aggbug/233773.html" height="1" width="1" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="right"&gt;&lt;a style="text-decoration: none;"
      href="http://www.blogjava.net/gml520/" target="_blank"&gt;日月雨林@gmail.com&lt;/a&gt; 2008-10-11 18:51 &lt;a style="text-decoration: none;" href="http://www.blogjava.net/gml520/archive/2008/10/11/233773.html#Feedback" target="_blank"&gt;发表评论&lt;/a&gt;&lt;/div&gt;</description>
      <pubDate>Sat, 11 Oct 2008 10:51:00 +0000</pubDate>
    </item>
    <item>
      <title>BlogJava-何以解忧？唯有Java: 一个易用不比Ubuntu差的Linux</title>
      <guid isPermaLink="false">http://www.blogjava.net/gml520/archive/2008/10/05/232564.html</guid>
      <link>http://www.blogjava.net/gml520/archive/2008/10/05/232564.html</link>
      <description>摘要: 以前用过ubuntu ，但是对我的机器支持的不好，特别是显卡，于是换了块显卡，ubuntu 还是不支持，装了受限驱动，屏幕的分辨率又有问题，真是拿他没办法，于是换了现在的Everest （珠穆朗玛峰） linux，安装完以后默认没有3d驱动，但是屏幕不闪，至少眼睛不疼了（Ubuntu 下就不行了，安装完驱动，刷新率只有61，看得我眼睛疼）。更新源里的显卡驱动相对老了点，于是到官方下了个最新的驱动，安装完以后，3d 就能打开了，而且一点也不卡。眼睛舒服多了。&#160;&#160;&lt;a href="http://www.blogjava.net/gml520/archive/2008/10/05/232564.html"&gt;阅读全文&lt;/a&gt;&lt;img src="http://www.blogjava.net/gml520/aggbug/232564.html" height="1" width="1" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div align="right"&gt;&lt;a
      style="text-decoration: none;" href="http://www.blogjava.net/gml520/" target="_blank"&gt;日月雨林@gmail.com&lt;/a&gt; 2008-10-05 22:12 &lt;a style="text-decoration: none;" href="http://www.blogjava.net/gml520/archive/2008/10/05/232564.html#Feedback" target="_blank"&gt;发表评论&lt;/a&gt;&lt;/div&gt;</description>
      <pubDate>Sun, 05 Oct 2008 14:12:00 +0000</pubDate>
    </item>
  </channel>
</rss>
