<?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: 对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>&lt;p&gt;今天用到了一些SwingX 的类库，但是显示的时候都是英文的，感觉挺别扭的，于是就对SwingX做了一些国际化！&lt;/p&gt; &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;a href="http://www.blogjava.net/Files/gml520/SwingX.rar"&gt;&lt;br /&gt; &lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.blogjava.net/Files/gml520/SwingX.rar"&gt;点这里下载&lt;br /&gt; &lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://www.blogjava.net/Files/gml520/SwingX.rar"&gt;&lt;br /&gt; &lt;/a&gt;&lt;/p&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>摘要: 我的简历，不知道这样写的简历，有多大的机会？有什么不足之处请大家帮忙指出，没有用过ssh开发过项目，目前正在学习ssh。 &lt;br /&gt; &lt;br /&gt;在招聘会上，各个企业都打出要求会ssh 架构的。无奈啊！我不熟悉!&#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>Jerry's Blog--NetBeans: 使用 NetBeans 开发 Firefox 插件</title>
      <guid isPermaLink="false">http://maoa.cn/jerry/html/2009/01/200901220101423339.htm</guid>
      <link>http://maoa.cn/jerry/html/2009/01/200901220101423339.htm</link>
      <description>&lt;p&gt;用 NetBeans 配上 foxbeans 插件，我们可以方便开发 Mozilla 插件，包括：&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Mozilla Firefox&lt;/li&gt; &lt;li&gt;Mozilla Thunderbird&lt;/li&gt; &lt;li&gt;Netscape&lt;/li&gt; &lt;li&gt;SeaMonkey&lt;/li&gt; &lt;li&gt;Flock&lt;/li&gt; &lt;li&gt;Sunbird&lt;/li&gt; &lt;li&gt;Nvu&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;下面以 Firefox 为例，开发一个简单示例插件。在此使用的 NetBeans 版本为 6.5 简体中文版，下载地址：&lt;a
      href="http://zh-cn.netbeans.org/download/6.5/ml/"&gt;http://zh-cn.netbeans.org/download/6.5/ml/&lt;/a&gt;&lt;/p&gt; &lt;p&gt;1. 访问 NetBeans 插件中心：&lt;a href="http://plugins.netbeans.org/"&gt;http://plugins.netbeans.org/&lt;/a&gt;，搜索并下载 foxbeans 插件，下载后的插件文件名为：1228475566510_com-teesoft-foxbeans.nbm。&lt;/p&gt; &lt;p&gt;&lt;img src="http://maoa.cn/jerry/upfiles/images/200901/2009-01-22_002600.png" alt="" /&gt;&lt;/p&gt; &lt;p&gt;2. 启动 NetBeans IDE
      6.5，选择菜单“工具”-“插件”。在“插件”管理面板中，选择“已下载”标签，点击“添加插件”按钮，选择刚刚下载的插件进行安装，重启 IDE。&lt;/p&gt; &lt;p&gt;3. 新建一个项目，类别选择：Mozilla Addons，项目选择：Mozilla Addon Project。自己定义一个项目名称，例如：helloFirefox，选择好项目路径。&lt;/p&gt; &lt;p&gt;4.“扩展设置”中，填写好作者、插件名称和标识等信息，在“支持的应用程序”点击 Application，选择“Mozilla Firefox”。如果您使用的是 Firefox 3.1 beta，记得修改 Version Max 为 3.1.*。选好 Firefox 程序的安装路径，点击“完成”。&lt;/p&gt; &lt;p&gt;&lt;img src="http://maoa.cn/jerry/upfiles/images/200901/2009-01-22_005147.png" alt="" /&gt;&lt;/p&gt; &lt;p&gt;5.
      在项目面板中可以查看插件项目及代码，我们可以直接 F6 运行主项目。此时将自动启动 Firefox，并启用该插件。我们可以从“Tools”菜单中找到“helloFirefox”这个插件。点击后，将出现欢迎示例对话框。&lt;/p&gt; &lt;p&gt;&lt;img src="http://maoa.cn/jerry/upfiles/images/200901/2009-01-22_005712.png" alt="" /&gt;&lt;/p&gt; &lt;p&gt;6. 在项目的 dist 目录下，可以找到该插件的 xpi 文件，方便分发。&lt;/p&gt;</description>
      <pubDate>Thu, 22 Jan 2009 01:01:42 +0000</pubDate>
    </item>
    <item>
      <title>Jerry's Blog--NetBeans: JavaFX.com 简体中文版全新上线</title>
      <guid isPermaLink="false">http://maoa.cn/jerry/html/2008/12/200812222210015812.htm</guid>
      <link>http://maoa.cn/jerry/html/2008/12/200812222210015812.htm</link>
      <description>&lt;p&gt;JavaFX 提供了一种新的脚本语言（JavaFX Script），专为喜欢在可视化编程中的 Web 脚本人员和应用程序开发人员量身定做。JavaFX Script 是一种简单的、易于学习的声明性脚本语言，它允许开发人员编写精确匹配 GUI 布局代码。同时，这种语言完全面向对象，包括方法和属性，允许专业程序员构建高度复杂且健壮的界面。&lt;/p&gt; &lt;p&gt;JavaFX SDK 1.0 已经在12月初正式发布，其官方站点 JavaFX.com 的简体中文版本也于近日在 &lt;a href="http://developers.sun.com.cn/"&gt;Sun 中国技术社区&lt;/a&gt;网站全新上线。该网站提供了大量的示例代码和中文教程供学习和体验，同时 NetBeans 和 JavaFX 插件打包版本也一并放出，这使得开发 JavaFX 更加便捷和迅速。&lt;/p&gt; &lt;ul&gt; &lt;li&gt;JavaFX.com 简体中文版&lt;br /&gt; &lt;a
      href="http://developers.sun.com.cn/javafx/"&gt;http://developers.sun.com.cn/javafx/&lt;/a&gt;&lt;/li&gt; &lt;li&gt;JavaFX 开发者中心&lt;br /&gt; &lt;a href="http://developers.sun.com.cn/javafx/index2.jsp"&gt;http://developers.sun.com.cn/javafx/index2.jsp&lt;/a&gt;&lt;/li&gt; &lt;li&gt;JavaFX Script 入门教程&lt;br /&gt; &lt;a href="http://developers.sun.com.cn/javafx/1/tutorials/core/index.html"&gt;http://developers.sun.com.cn/javafx/1/tutorials/core/index.html&lt;/a&gt;&lt;/li&gt; &lt;li&gt;使用 JavaFX 构建 GUI
      教程&lt;br /&gt; &lt;a href="http://developers.sun.com.cn/javafx/1/tutorials/ui/index.html"&gt;http://developers.sun.com.cn/javafx/1/tutorials/ui/index.html&lt;/a&gt;&lt;/li&gt; &lt;li&gt;JavaFX with NetBeans 6.5&lt;br /&gt; &lt;a href="http://download.developers.sun.com.cn/javafx/netbeans-6.5-javafx-windows.exe"&gt;http://download.developers.sun.com.cn/javafx/netbeans-6.5-javafx-windows.exe&lt;/a&gt;&lt;/li&gt; &lt;li&gt;JavaFX SDK v1.0&lt;br /&gt; &lt;a
      href="http://download.developers.sun.com.cn/javafx/javafx_sdk-1_0-windows-i586.exe"&gt;http://download.developers.sun.com.cn/javafx/javafx_sdk-1_0-windows-i586.exe&lt;/a&gt;&lt;/li&gt; &lt;li&gt;JavaFX Production Suite&lt;br /&gt; &lt;a href="http://download.developers.sun.com.cn/javafx/javafx_production_suite-1_0-windows-i586.exe"&gt;http://download.developers.sun.com.cn/javafx/javafx_production_suite-1_0-windows-i586.exe&lt;/a&gt;&lt;/li&gt; &lt;li&gt;JDK 1.6.0 Update 11&lt;br /&gt; &lt;a
      href="http://developers.sun.com.cn/download/java_se.html"&gt;http://developers.sun.com.cn/download/java_se.html&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt; &lt;p&gt; &lt;/p&gt;</description>
      <pubDate>Mon, 22 Dec 2008 22:10:01 +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" 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" 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" 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" 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" 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" 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" 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" 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" 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" 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>Jerry's Blog--NetBeans: 从 Tech Day 看 NetBeans</title>
      <guid isPermaLink="false">http://maoa.cn/jerry/html/2008/12/200812011459055069.htm</guid>
      <link>http://maoa.cn/jerry/html/2008/12/200812011459055069.htm</link>
      <description>&lt;p&gt;今年的 Sun Tech Day 于11月19日和11月21日-22日分别在广州和北京两地举行。现在大会的讲义和录音已由 Sun 中国技术社区 (&lt;a href="http://developers.sun.com.cn"&gt;http://developers.sun.com.cn&lt;/a&gt;) 整理完毕并提供下载。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;NetBeans 特别主题包括：&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;炫酷创新NetBeans （&lt;a href="http://download.developers.sun.com.cn/event/sun_tech_day_china/2008/20081122_beijing_day2/track1/1_NB_New_Cool_wen_huang.mp3"&gt;录音&lt;/a&gt; &lt;a
      href="http://download.developers.sun.com.cn/event/sun_tech_day_china/2008/20081122_beijing_day2/track1/1_NB_New_Cool_wen_huang.pdf"&gt;讲义&lt;/a&gt;）&lt;/li&gt; &lt;li&gt;Elixir技术专题：Elixir + NetBeans + MySQL：商业智能(BI) 2.0的新动力 （&lt;a href="http://download.developers.sun.com.cn/event/sun_tech_day_china/2008/20081122_beijing_day2/track2/4_Elixir_SunTechDays_Beijing.mp3"&gt;录音&lt;/a&gt; &lt;a
      href="http://download.developers.sun.com.cn/event/sun_tech_day_china/2008/20081122_beijing_day2/track2/4_Elixir_SunTechDays_Beijing.pdf"&gt;讲义&lt;/a&gt;）&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;当然，NetBeans 的内容不仅仅只有这两部分，在很多 Java 话题中都可以看到 NetBeans 的身影。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;更多精彩内容：&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="http://developers.sun.com.cn/events/techday2008/guangzhou.html"&gt;Sun Tech Day 2008 - &lt;/a&gt;&lt;a
      href="http://developers.sun.com.cn/events/techday2008/guangzhou.html"&gt;广州 &lt;/a&gt;&lt;a href="http://developers.sun.com.cn/events/techday2008/guangzhou.html"&gt;2008年11月19日 东方宾馆&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://developers.sun.com.cn/events/techday2008/beijing.html"&gt;Sun Tech Day 2008 - &lt;/a&gt;&lt;a href="http://developers.sun.com.cn/events/techday2008/beijing.html"&gt;北京 &lt;/a&gt;&lt;a href="http://developers.sun.com.cn/events/techday2008/beijing.html"&gt;2008年11月21日-22日
      北京国际会议中心&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;&lt;strong&gt;历届回顾：&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="http://developers.sun.com.cn/events/techday2007/down_sh.html"&gt;Sun Tech Day 2007 - 上海 2007年10月23日-24日 上海国际会议中心&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://developers.sun.com.cn/events/techday2007/down_bj.html"&gt;Sun Tech Day 2007 - 北京 2007年11月1日-2日 北京国际会议中心&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a
      href="http://developers.sun.com.cn/events/techday2006/overview.html"&gt;Sun Tech Day 2006 - 上海 2006年9月23日-24日 上海国际会议中心&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://developers.sun.com.cn/events/techday2006/overview.html"&gt;Sun Tech Day 2006 - 北京 2006年9月27日-28日 北京国际会议中心&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;</description>
      <pubDate>Mon, 01 Dec 2008 14:59:05 +0000</pubDate>
    </item>
    <item>
      <title>Jerry's Blog--NetBeans: NetBeans IDE 6.5 本地下载</title>
      <guid isPermaLink="false">http://maoa.cn/jerry/html/2008/11/200811231528232083.htm</guid>
      <link>http://maoa.cn/jerry/html/2008/11/200811231528232083.htm</link>
      <description>&lt;p&gt;NetBeans IDE 6.5 完全支持所有 Java 平台（Java SE、Java EE、Java ME 和 JavaFX），此外还是 PHP、Ajax 和 JavaScript、Groovy 和 Grails、Ruby 和 Ruby on Rails 以及 C/C++ 软件开发的理想工具。6.5 发行版增强了对 Web 框架 (Hibernate, Spring, JSF, JPA)、GlassFish v3 应用服务器以及数据库的支持。此外，它还包括新增的在 IDE 范围内快速搜索的快捷键、更加友好的用户界面以及自动在保存时编译功能。&lt;/p&gt; &lt;ul&gt; &lt;li&gt;NetBeans 6.5 国内本地下载：&lt;br /&gt; &lt;a href="http://zh-cn.netbeans.org/download/6.5/ml/"&gt;http://zh-cn.netbeans.org/download/6.5/ml/&lt;/a&gt;&lt;/li&gt; &lt;li&gt;查看
      NetBeans 6.5 发行信息：&lt;br /&gt; &lt;a href="http://zh-cn.netbeans.org/community/releases/65/index.html"&gt;http://zh-cn.netbeans.org/community/releases/65/index.html&lt;/a&gt;&lt;/li&gt; &lt;li&gt;JDK 1.6 Update 10 本地下载：&lt;br /&gt; &lt;a href="http://developers.sun.com.cn/download/java_se.html"&gt;http://developers.sun.com.cn/download/java_se.html&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;</description>
      <pubDate>Sun, 23 Nov 2008 15:28:23 +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" 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" 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>Jerry's Blog--NetBeans: JavaPassion 中文版上线</title>
      <guid isPermaLink="false">http://maoa.cn/jerry/html/2008/10/200810192324372963.htm</guid>
      <link>http://maoa.cn/jerry/html/2008/10/200810192324372963.htm</link>
      <description>&lt;p&gt;JavaPassion 中文站 (JavaPassion.cn) 于2008年10月20日正式上线。原网站由 Sun Microsystems 技术架构师、咨询师和技术传教士 &lt;a href="http://developers.sun.com.cn/events/star/sangshin.html"&gt;Sang Shin&lt;/a&gt; 打造，包含丰富的在线学习课程及 NetBeans 动手实验指导，目前的专题内容有 Java SE，Java EE，AJAX，JSF，Ruby，JavaFX 等。&lt;/p&gt; &lt;p&gt;地址：&lt;a href="http://www.javapassion.cn"&gt;http://www.javapassion.cn&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Sun, 19 Oct 2008 23:24:37 +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>
    <item>
      <title>BlogJava-何以解忧？唯有Java: 关于java 读取propterties 文件的疑惑 和问题的解决</title>
      <guid isPermaLink="false">http://www.blogjava.net/gml520/archive/2008/10/03/232245.html</guid>
      <link>http://www.blogjava.net/gml520/archive/2008/10/03/232245.html</link>
      <description>摘要: 最近在重构自己的小Demo 想把自己的下Demo 变成可以配置的程序。但是遇到了一些困难，走了不少的弯路，最终还是解决了。 如果你是个牛人，你不用看了，写这些东西是给和我一样的菜鸟看的。 &lt;br /&gt;先说说我的Demo吧，我写的是一个简单新闻管理系统，很简陋的那种，不过麻雀虽小，但是五脏俱全。 &lt;br /&gt;基本的增、删、查、改，都有，用到了FCKeditor。一开始我连接数据库用的是最原始的方法，把数据库的连接信息全写在代码里，写完以后就没去管他了，十一放假这几天，看了看自己的代码，觉得代码结果不好，于是就开始重构自己的代码，首先就是重写数据库的连接管理我把连接数据库的一些基本信息写到了 database.properties 文件里，然后从程序中读取连接数据库所需要的信息。但是看似简单的东西，比且很容易的完成的工作，我却遇到了不少麻烦。首先就是路径的问题，其次是该以何种方式读取；就这两个问题困扰了两天。（呵呵，见笑了）&#160;&#160;&lt;a
      href="http://www.blogjava.net/gml520/archive/2008/10/03/232245.html"&gt;阅读全文&lt;/a&gt;&lt;img src="http://www.blogjava.net/gml520/aggbug/232245.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-03 20:40 &lt;a style="text-decoration: none;" href="http://www.blogjava.net/gml520/archive/2008/10/03/232245.html#Feedback"
      target="_blank"&gt;发表评论&lt;/a&gt;&lt;/div&gt;</description>
      <pubDate>Fri, 03 Oct 2008 12:40:00 +0000</pubDate>
    </item>
    <item>
      <title>BlogJava-何以解忧？唯有Java: NetBeans中freeform project的作用（熟悉Ant 的朋友比较喜欢）</title>
      <guid isPermaLink="false">http://www.blogjava.net/gml520/archive/2008/10/01/231945.html</guid>
      <link>http://www.blogjava.net/gml520/archive/2008/10/01/231945.html</link>
      <description>摘要: What is freeform? &lt;br /&gt;Freeform is a NetBeans project type that allows you to use Ant build script supplied with your sources. Typical usecase can be that you have already some sources, you are developing them "in you own way" (other IDE, or using VI, or...) and you want to work on them using NetBeans. Other common usecase for free-form can be that you check out some opensource project and you want to work on it in NetBeans IDE. &#160;&#160;&lt;a
      href="http://www.blogjava.net/gml520/archive/2008/10/01/231945.html"&gt;阅读全文&lt;/a&gt;&lt;img src="http://www.blogjava.net/gml520/aggbug/231945.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-01 08:25 &lt;a style="text-decoration: none;" href="http://www.blogjava.net/gml520/archive/2008/10/01/231945.html#Feedback"
      target="_blank"&gt;发表评论&lt;/a&gt;&lt;/div&gt;</description>
      <pubDate>Wed, 01 Oct 2008 00:25:00 +0000</pubDate>
    </item>
    <item>
      <title>BlogJava-何以解忧？唯有Java: MySQL hacker needs $400K for his son's bone-marrow</title>
      <guid isPermaLink="false">http://www.blogjava.net/gml520/archive/2008/09/30/231847.html</guid>
      <link>http://www.blogjava.net/gml520/archive/2008/09/30/231847.html</link>
      <description>The MySQL community -- who create, maintain and support the leading free database -- are raising funds for Andrii Nikitin, a MySQL support engineer in Ukraine whose little boy, Ivan, needs a $400,000 bone-barrow transplant. &lt;img src="http://craphound.com/images/andrii-and-ivan.jpg" align="left" alt="" /&gt; "My family got bad news - doctors said allogenic bone marrow transplantation is the only chance for my son Ivan. &lt;p&gt;"8 months of heavy and expensive immune suppression
      brought some positive results so we hoped that recovering is just question of time. &lt;/p&gt; &lt;p&gt;"Ivan is very brave boy - not every human meets so much suffering during whole life, like Ivan already met in his 2,5 years. But long road is still in front of us to get full recover - we are ready to come it through. &lt;/p&gt; &lt;p&gt;"Ukrainian clinics have no technical possibility to do such complex operation, so we need 150-250K EUR for Israel or European or US clinic. The final decision will
      be made considering amount we able to find. Perhaps my family is able to get ~60% of that by selling the flat where parents leave and some other goods, but we still require external help." &lt;/p&gt; &lt;img src="http://www.blogjava.net/gml520/aggbug/231847.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-09-30 08:52 &lt;a style="text-decoration:
      none;" href="http://www.blogjava.net/gml520/archive/2008/09/30/231847.html#Feedback" target="_blank"&gt;发表评论&lt;/a&gt;&lt;/div&gt;</description>
      <pubDate>Tue, 30 Sep 2008 00:52:00 +0000</pubDate>
    </item>
    <item>
      <title>BlogJava-何以解忧？唯有Java: 学习JavaFX 的好地方！</title>
      <guid isPermaLink="false">http://www.blogjava.net/gml520/archive/2008/09/28/231679.html</guid>
      <link>http://www.blogjava.net/gml520/archive/2008/09/28/231679.html</link>
      <description>摘要: 这里推荐3个 blog ： &lt;br /&gt; &lt;br /&gt; * Chris Oliver's Weblog &lt;br /&gt; * Jim Weaver's JavaFX Blog &lt;br /&gt; * Joshua Marinacci's Blog &lt;br /&gt; &lt;br /&gt;顺便贴几张JavaFX demo 截图： &lt;br /&gt;&#160;&#160;&lt;a href="http://www.blogjava.net/gml520/archive/2008/09/28/231679.html"&gt;阅读全文&lt;/a&gt;&lt;img src="http://www.blogjava.net/gml520/aggbug/231679.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-09-28 14:51 &lt;a style="text-decoration: none;" href="http://www.blogjava.net/gml520/archive/2008/09/28/231679.html#Feedback" target="_blank"&gt;发表评论&lt;/a&gt;&lt;/div&gt;</description>
      <pubDate>Sun, 28 Sep 2008 06:51:00 +0000</pubDate>
    </item>
    <item>
      <title>BlogJava-何以解忧？唯有Java: netbeans 6.5 多国语言 开发版发布了！</title>
      <guid isPermaLink="false">http://www.blogjava.net/gml520/archive/2008/09/24/230891.html</guid>
      <link>http://www.blogjava.net/gml520/archive/2008/09/24/230891.html</link>
      <description>摘要: 这个不是最终版，想尝鲜的朋友可以到官方 网站上下载了！ &lt;br /&gt; &lt;br /&gt;更新：最经中文的好像没了，大家还是下载英文的吧。Netbeas 已经开始做语言包插件了 &lt;br /&gt;相信很快就会出来了。 &lt;br /&gt; &lt;br /&gt;http://bits.netbeans.org/download/trunk/nightly/latest/ml/?pagelang=zh_CN &lt;br /&gt; &lt;br /&gt;NetBeans 6.5 带来很多新的特性，大家可以尝试一下，说不定 你就会喜欢上他的。呵呵！ &lt;br /&gt; &lt;br /&gt;下面是NetBeans 6.5 中新增的特性以及 增强的功能 一览表： &lt;br /&gt; &lt;br /&gt;http://wiki.netbeans.org/NewAndNoteWorthyMilestone1NB65 &lt;br /&gt; &lt;br
      /&gt;http://wiki.netbeans.org/NewAndNoteWorthyMilestone2NB65 &#160;&#160;&lt;a href="http://www.blogjava.net/gml520/archive/2008/09/24/230891.html"&gt;阅读全文&lt;/a&gt;&lt;img src="http://www.blogjava.net/gml520/aggbug/230891.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-09-24 15:15 &lt;a style="text-decoration: none;"
      href="http://www.blogjava.net/gml520/archive/2008/09/24/230891.html#Feedback" target="_blank"&gt;发表评论&lt;/a&gt;&lt;/div&gt;</description>
      <pubDate>Wed, 24 Sep 2008 07:15:00 +0000</pubDate>
    </item>
    <item>
      <title>BlogJava-何以解忧？唯有Java: 我与NetBeans的情结</title>
      <guid isPermaLink="false">http://www.blogjava.net/gml520/archive/2008/09/14/228842.html</guid>
      <link>http://www.blogjava.net/gml520/archive/2008/09/14/228842.html</link>
      <description>今天真是很不顺啊，不是停电就是 登不上论坛，害我想写点东西都没心情了。幸好宿舍晚上不熄灯，可以让我在下半夜写东西。唉！明天要睡一个早上了！&lt;br /&gt; &#160; &#160;&#160; &#160;结识NetBeans 是在2007 年五月份，那时候自己刚开始自学java ，一开始用的是最原始的方法NotePad2 + JDK 。后来看到csdn 上关于NetBeans的插件开发教程，才开始接触NetBeans的，那个时候NetBeans是5.5.1 版本。在下载了视频教程看以后，我就到官方网站下载了NetBeans，感觉NetBeans太棒了，特别是GUI 设计，当时感觉太神奇了，那么快就可以建立一个桌面应用程序。后来自己对java 学的相对有点进阶的时候，发现自己对NetBeans 的了解也更深了点，应该说是NetBeans的的操作更熟练了，为了学习NetBeans的操作，我把csdn 上的所有视频教程都下载来看。直到NetBeans6.0 的发布。我才真正有点了解NetBeans。说到这里有人会说了“ NetBeans
      不过就是个开发工具嘛！至于要那样努力学吗？不要本末倒置了！“&#160;&#160;对于这句话，我想说的是： 一个语言如何，从用它写的IDE 里就可以看出不少东西来，我记得国外有一篇博客就讲到”The IDE is the Language！“ 。因为我对java 比较喜欢，特别是Swing ，用Siwng 开发桌面应用，我感觉自己很有成就感，特别是我写出我自己的第一个桌面应用程序，当初学C语言的时候就想写一些GUI 的程序，但是我当时不知道原来有很多的C 的拓展库，原因是我刚接触C 语言的时候用的是TC2.0&#160;&#160;只能写控制台程序，不能写GUI 程序。感觉学习C语言满足不了我的要求，于是就开始自学java。&lt;br /&gt; &lt;br /&gt; &lt;font style="font-size: 10.5pt;"&gt;&lt;font face="宋体 "&gt;&#160; &#160; 学习了一些java基本知识之后感觉 java 比C
      简单多了。而且还能很快的写出GUI程序。这是我一直想要做的事情。之后对java的了解更进一步点，开始到个大论坛去转，看到了不少的好东西，学到了很 多。最初接触的是csdn 的论坛，后来时Javaeye上的论坛。还有一些其他的论坛我就不说了，去的比较少，现在基本上都在Javaeye 上潜水了，我发现Javaeye上的牛人特多，我是不敢轻易在论坛上发言，感觉自己的水平还不够，所以更多的时间是在潜水。&lt;/font&gt;&lt;/font&gt;&lt;br /&gt; &lt;br /&gt; &lt;font style="font-size: 10.5pt;"&gt;&#160; &#160;&#160; &#160; NetBeans 6.0 &lt;font face="宋体 "&gt;出来 以后，我就第一时间下载了，按照官方的例子做了一些Demo ，感觉太棒了。因为官方上的教程大部分都是英文的，所以也就促使我 更加努力的学习英语，争取能够明白教程上讲的是什么。 现在让我看一些英语的blog ，已经不是太困难了，自从我把自己的blog 加入到&lt;a
      href="http://www.planetbeans.org/" target="_blank"&gt;www.planetnetbeans.org&lt;/a&gt;&#160;&#160;(NetBeans 星球) 里以后我就经常的关顾这个网站，看到了不少的好文章。学到了不少东西。&lt;/font&gt;&lt;/font&gt;&lt;br /&gt; &lt;br /&gt; &lt;font style="font-size: 10.5pt;"&gt;&#160; &#160;&#160; &#160;&lt;font face="宋体 "&gt;从我开始接触NetBeans到现 在，NetBeans 经历了5.5.1，6.0，6.1 还有现在的6.5 ，一路走来感觉NetBeans的进步太多了，无论从速度上，还是从代码编辑器上，以及对不同语言的支持上，都有长足的进步。真的很感谢NetBeans 团队，让我们能用上这么好的IDE 。在接触NetBeans的同时我也接触了Eclipse
      ，网上有很多关于NetBeans和Eclipse的比较文章，感觉有的很片面，比较的不是很客观。有很多人把NetBeans 和那些 收费的Eclipse进行对比，这对NetBeans 是很不公平的，他们都要求NetBeans 要比那些收费的Eclipse 插件更好用才会说NetBeans 好用。 还有的是说NetBeans的启动速度慢，从我用Eclipse的经验来看，Eclipse的启动速度在3.3之前都比NetBeans快一点，当不是很 多。在不同的机器，不同的操作系统上的表现也不一样，在Windows 下，Eclipse 可能要快一点，但是到了Linux下就变了。NetBeans 绝对比Eclipse 快。Eclipse 3.4 发布有一段时间了，我发现他的启动速度真是不敢恭维，比NetBeans 还要慢！我的机器CPU AMD 闪龙3000+ 1.6GHZ ，960 M的内存，跑Eclipse3.4 比跑NetBeans6.1 要卡的多，特别是builde 几个项目以后。最新的NetBeans6.5 也试用了几天，感觉上比NetBeans6.1
      又快了一点。对项目的扫描也更快了，内存占用也降低了，NetBeans 真是越来越好用了。&lt;/font&gt;&lt;/font&gt;&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; &#160; &#160;今天比较晚了，明天在接着写吧。看看时间已经凌晨4:19分了。现在已经是8月15 了！！祝大家中秋节快乐！！&lt;br /&gt; &lt;img src="http://www.blogjava.net/gml520/aggbug/228842.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-09-14 04:30 &lt;a style="text-decoration: none;"
      href="http://www.blogjava.net/gml520/archive/2008/09/14/228842.html#Feedback" target="_blank"&gt;发表评论&lt;/a&gt;&lt;/div&gt;</description>
      <pubDate>Sat, 13 Sep 2008 20:30:00 +0000</pubDate>
    </item>
    <item>
      <title>BlogJava-何以解忧？唯有Java: 让NetBeans 在Windows下拥有Mac 的外观</title>
      <guid isPermaLink="false">http://www.blogjava.net/gml520/archive/2008/09/10/228245.html</guid>
      <link>http://www.blogjava.net/gml520/archive/2008/09/10/228245.html</link>
      <description>&lt;br /&gt; &#160;&#160;&lt;strong&gt; 先让大家看看效果图吧：&lt;/strong&gt;&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; &lt;img src="http://www.blogjava.net/images/blogjava_net/gml520/mac2.jpg" alt="" height="657" width="978" /&gt;&lt;br /&gt; &lt;br /&gt; &lt;img src="http://www.blogjava.net/images/blogjava_net/gml520/Mac.JPG" alt="" height="768" width="1024" /&gt;&lt;br /&gt; &lt;br /&gt; 中文版的NetBeans 外观：&lt;br /&gt; &lt;br /&gt; &lt;img
      src="http://www.blogjava.net/images/blogjava_net/gml520/macnet.jpg" alt="" height="675" width="956" /&gt;&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; &lt;br /&gt; &#160; 还不错吧，只是有点遗憾的是标题栏没有改变！如果标题栏也改变了，那就完美了！如果谁有更好的方法&lt;br /&gt; 不妨留言交流一下！共同学习！&lt;br /&gt; 具体的方法是：启动NetBeans 的时候添加启动参数&lt;br /&gt; netbeans -cp:p&lt;span style="color: red;"&gt; D:/NBpro/&lt;/span&gt;quaqua.jar --laf ch.randelshofer.quaqua.QuaquaLookAndFeel&#160; &lt;br /&gt; &lt;br /&gt; 红色部分表示的是你的laf jar包所在文件夹。quaqua jar包&lt;a
      href="http://www.randelshofer.ch/quaqua/files/quaqua-5.0.nested.zip" title="点击这里下载"&gt; 点击这里下载&lt;/a&gt;&lt;br /&gt; &lt;br /&gt; 用这种方法还可以设置其它的外观，不仅如此，这样还修正了NetBeans在Windows 默认的主题下&lt;br /&gt; 显示的问题（第一张图片红色框框部分）&lt;br /&gt; &lt;br /&gt; 具体内容你们也可以看看这篇博客：&lt;a href="http://mrhaki.blogspot.com/2008/09/using-jtattoo-look-and-feel-with.html"&gt;http://mrhaki.blogspot.com/2008/09/using-jtattoo-look-and-feel-with.html&lt;/a&gt;&lt;br /&gt; &lt;br /&gt; &lt;img
      src="http://www.blogjava.net/gml520/aggbug/228245.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-09-10 23:56 &lt;a style="text-decoration: none;" href="http://www.blogjava.net/gml520/archive/2008/09/10/228245.html#Feedback" target="_blank"&gt;发表评论&lt;/a&gt;&lt;/div&gt;</description>
      <pubDate>Wed, 10 Sep 2008 15:56:00 +0000</pubDate>
    </item>
    <item>
      <title>BlogJava-何以解忧？唯有Java: 从Flash开发转到JavaFX开发的一些问题和解答(英文)</title>
      <guid isPermaLink="false">http://www.blogjava.net/gml520/archive/2008/09/07/227464.html</guid>
      <link>http://www.blogjava.net/gml520/archive/2008/09/07/227464.html</link>
      <description>摘要: 这个是sun 官方论坛里的一个主题贴,这个帖子很有代表性,他回答了大部分Flash 开发人员的问题. &lt;br /&gt;下面是问题和解答的详细内容:&#160;&#160;&lt;a href="http://www.blogjava.net/gml520/archive/2008/09/07/227464.html"&gt;阅读全文&lt;/a&gt;&lt;img src="http://www.blogjava.net/gml520/aggbug/227464.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-09-07 00:22 &lt;a style="text-decoration:
      none;" href="http://www.blogjava.net/gml520/archive/2008/09/07/227464.html#Feedback" target="_blank"&gt;发表评论&lt;/a&gt;&lt;/div&gt;</description>
      <pubDate>Sat, 06 Sep 2008 16:22:00 +0000</pubDate>
    </item>
    <item>
      <title>BlogJava-何以解忧？唯有Java: SwingDesigner 简介</title>
      <guid isPermaLink="false">http://www.blogjava.net/gml520/articles/227071.html</guid>
      <link>http://www.blogjava.net/gml520/articles/227071.html</link>
      <description>&lt;font id="xxad0" size="4"&gt;&lt;strong id="xxad1"&gt; &lt;div style="padding: 1em 0px; text-align: center;" id="v5_r"&gt;SwingDesigner &lt;/div&gt; &lt;/strong&gt; &lt;/font&gt; &lt;h4 id="xxad2"&gt;&lt;font id="xxad3" face="黑体"&gt;&lt;font color="#0000ff" id="xxad6"&gt;简介&lt;/font&gt;&lt;/font&gt;: &lt;/h4&gt; &lt;p style="margin-bottom: 0in;" id="xxad8"&gt;&lt;font id="xxad11" face="宋体"&gt;&lt;strong id="m:k6"&gt;SwingDesigner&lt;/strong&gt; 是用&lt;/font&gt;Eclipse&lt;font
      id="xxad17" face="宋体"&gt;开发的 一款免费的、开源的、功能上与&lt;/font&gt;Mattise Project&lt;font id="xxad23" face="宋体"&gt;相近的界面设计工具插件&lt;/font&gt;. &lt;font id="xxad29" face="宋体"&gt;他可以简化您开发应用程序的步骤&lt;/font&gt;,&lt;font id="xxad35" face="宋体"&gt;缩短开&lt;/font&gt;Swing&lt;font id="xxad65" face="宋体"&gt;于&lt;/font&gt;VE(Eclipse&lt;font id="xxad68" face="宋体"&gt;的另一款插件&lt;/font&gt;)&lt;font id="xxad71" face="宋体"&gt;，每个组件用一个&lt;/font&gt;getXXX&lt;font id="xxad74" face="宋体"&gt;返回，代码可读性很强，&lt;/font&gt;&lt;font id="zhax0"
      face="宋体"&gt;而且开发者可以自由修改代码&lt;/font&gt;,&lt;font id="xxad77" face="宋体"&gt;保存后保持和界面同步更新&lt;/font&gt;.Designer &lt;font id="m:k65" face="宋体"&gt;发周期&lt;/font&gt;.&lt;font id="xxad41" face="宋体"&gt;它具有很多&lt;/font&gt;Mattise &lt;font id="xxad47" face="宋体"&gt;所不具有的功能&lt;/font&gt;. &lt;font id="xxad52" face="宋体"&gt;生成的代码也没有&lt;/font&gt;NetBeans &lt;font id="xxad57" face="宋体"&gt;生成的代码那样复杂&lt;/font&gt;, &lt;font id="xxad62" face="宋体"&gt;这个工具不需要&lt;/font&gt;form&lt;font id="m:k68"
      face="宋体"&gt;文件，生成的代码也是类似&lt;/font&gt; &lt;/p&gt; &lt;p align="justify" style="margin-top: 0.07in; margin-bottom: 0in;" id="xxad80"&gt;&lt;br id="xxad81" /&gt; &lt;/p&gt; &lt;p align="justify" style="margin-top: 0.07in; margin-bottom: 0in;" id="xxad82"&gt;&lt;font id="xxad83" face="宋体"&gt;&lt;strong id="u13z"&gt;开发工具&lt;/strong&gt; &lt;/font&gt;: Eclipse3.4 &lt;/p&gt; &lt;p align="justify" style="margin-top: 0.07in; margin-bottom: 0in;" id="xxad84"&gt;&lt;strong
      id="u13z0"&gt;JDK&lt;/strong&gt;&lt;font id="xxad87" face="宋体"&gt;&lt;strong id="u13z1"&gt;版本&lt;/strong&gt; &lt;/font&gt;: JDK 1.6 (NimbusLookAndFeel &lt;font id="xxad92" face="宋体"&gt;需要&lt;/font&gt;JDK1.6 u10)&lt;font id="xxad96" face="宋体"&gt;或更高&lt;/font&gt; &lt;/p&gt; &lt;p align="justify" style="margin-top: 0.07in; margin-bottom: 0in;" id="xxad99"&gt;&lt;font id="xxad100" face="宋体"&gt;&lt;strong id="u13z2"&gt;开发平台&lt;/strong&gt; &lt;/font&gt;: Windows XP SP2 &lt;/p&gt; &lt;h4
      id="xxad101"&gt;&lt;font color="#0000ff" id="xxad102"&gt;&lt;font id="xxad103" face="黑体"&gt;开发动机&lt;/font&gt;:(为什么是基于Eclipse的SwingDesigner?)&lt;/font&gt; &lt;/h4&gt; &lt;p style="margin-bottom: 0in;" id="xxad104"&gt;&lt;font id="xxad105" face="宋体"&gt;一直以来非常喜欢&lt;/font&gt;Swing&lt;font id="xxad106" face="宋体"&gt;，对&lt;/font&gt;Swing&lt;font id="xxad107" face="宋体"&gt;的研究也有很长一段时间了，一直希望&lt;/font&gt;Swing&lt;font id="xxad108" face="宋体"&gt;在&lt;/font&gt;Java&lt;font id="xxad109"
      face="宋体"&gt;桌面开发中扮演重要的角色。但是很久以来&lt;/font&gt;Java&lt;font id="xxad110" face="宋体"&gt;桌面开发始终是个弱项，其中很大一部分原因是缺乏比较好用的界面设计工具。 &lt;/font&gt;&lt;/p&gt; &lt;p align="justify" style="margin-bottom: 0in;" id="xxad111"&gt;&lt;br id="xxad112" /&gt; &lt;/p&gt; &lt;p align="justify" style="margin-bottom: 0in;" id="xxad113"&gt;NetBeans&lt;font id="xxad114" face="宋体"&gt;的界面设计工具&lt;/font&gt;(&lt;font id="xxad115" face="宋体"&gt;以前叫&lt;/font&gt;Matisse Project)&lt;font id="xxad116"
      face="宋体"&gt;的出现给&lt;/font&gt;Java&lt;font id="xxad117" face="宋体"&gt;的&lt;/font&gt;Gui&lt;font id="xxad118" face="宋体"&gt;开发尤其是&lt;/font&gt;Swing&lt;font id="xxad119" face="宋体"&gt;开发带来了希望，但遗憾的是当前&lt;/font&gt;Java&lt;font id="xxad120" face="宋体"&gt;集成开发环境仍然是&lt;/font&gt;Eclipse&lt;font id="xxad121" face="宋体"&gt;的天下，据统计，目前市场上至少&lt;/font&gt;2/3&lt;font id="xxad122" face="宋体"&gt;的份额是被&lt;/font&gt;eclipse&lt;font id="xxad123" face="宋体"&gt;占有。虽然&lt;/font&gt;netbeans&lt;font id="xxad124"
      face="宋体"&gt;已经获得长足的进步，并进一步吸引了更多的&lt;/font&gt;developer&lt;font id="xxad125" face="宋体"&gt;，但是由于历史习惯和遗留系统等等问题，这个市场份额在最近几年肯定还是&lt;/font&gt;eclipse&lt;font id="xxad126" face="宋体"&gt;的天下。 &lt;/font&gt;&lt;/p&gt; &lt;p align="justify" style="margin-bottom: 0in;" id="xxad127"&gt;&lt;br id="xxad128" /&gt; &lt;/p&gt; &lt;p align="justify" style="margin-bottom: 0in;" id="xxad129"&gt;&lt;font id="xxad130" face="宋体"&gt;当然&lt;/font&gt;eclipse&lt;font id="xxad133"
      face="宋体"&gt;也有很多很优秀的界面工具插件，可惜的是免费的插件其质量难以与&lt;/font&gt;netbeans&lt;font id="xxad136" face="宋体"&gt;的匹敌，好用的插件又都是收费的。因此&lt;strong id="xxad138"&gt;一直想为&lt;/strong&gt;&lt;/font&gt;&lt;strong id="xxad140"&gt;eclipse&lt;/strong&gt;&lt;font id="xxad141" face="宋体"&gt;&lt;strong id="xxad143"&gt;开发一款免费的、开源的、功能上与&lt;/strong&gt;&lt;/font&gt;&lt;strong id="xxad145"&gt;Mattise Project&lt;/strong&gt;&lt;font id="xxad146" face="宋体"&gt;&lt;strong id="xxad148"&gt;相近的界面设计工具，&lt;/strong&gt;算是为&lt;/font&gt;Swing&lt;font
      id="xxad150" face="宋体"&gt;的发展做一点贡献。 &lt;/font&gt;&lt;/p&gt; &lt;p align="justify" style="margin-bottom: 0in;" id="xxad152"&gt;&lt;br id="xxad153" /&gt; &lt;/p&gt; &lt;p align="justify" style="margin-bottom: 0in;" id="xxad154"&gt;&lt;font id="xxad155" face="宋体"&gt;从今年&lt;/font&gt;1&lt;font id="xxad156" face="宋体"&gt;月份开始，我来到一家新公司，主要做基于&lt;/font&gt;eclipse&lt;font id="xxad157" face="宋体"&gt;插件平台的开发，得以学习了&lt;/font&gt;eclipse&lt;font id="xxad158" face="宋体"&gt;的插件开发知识。以前曾经使用 &lt;/font&gt;swing&lt;font
      id="xxad159" face="宋体"&gt;做过一个&lt;/font&gt;swing&lt;font id="xxad160" face="宋体"&gt;的界面设计工具，但由于是一款独立的工具，没有集成到任何&lt;/font&gt;IDE&lt;font id="xxad161" face="宋体"&gt;中，因此几乎没有实用价值。因此决定在闲暇时间将这个工具重新用&lt;/font&gt;eclipse&lt;font id="xxad162" face="宋体"&gt;插件技术进行开发。 &lt;/font&gt;&lt;/p&gt; &lt;p align="justify" style="margin-bottom: 0in;" id="xxad163"&gt;&lt;br id="xxad164" /&gt; &lt;/p&gt; &lt;p align="justify" style="margin-bottom: 0in;" id="xxad165"&gt;&lt;br id="xxad166" /&gt; &lt;/p&gt; &lt;h3
      id="xxad167"&gt;&lt;font id="xxad168" face="宋体"&gt;&lt;font color="#0000ff" id="xxad170"&gt;&lt;strong id="xxad171"&gt;开发这款工具的目标计划&lt;/strong&gt;： &lt;/font&gt;&lt;/font&gt;&lt;/h3&gt; &lt;p align="justify" style="margin-bottom: 0in;" id="xxad173"&gt;&lt;br id="xxad174" /&gt; &lt;/p&gt; &lt;p align="justify" style="margin-bottom: 0in;" id="xxad175"&gt;&lt;strong id="xxad177"&gt;1. &lt;/strong&gt;&lt;font id="xxad178" face="宋体"&gt;&lt;strong id="xxad180"&gt;界面布局模仿&lt;/strong&gt;&lt;/font&gt;&lt;strong
      id="xxad182"&gt;Netbeans&lt;/strong&gt;&lt;font id="xxad183" face="宋体"&gt;&lt;strong id="xxad185"&gt;界面设计工具，操作和&lt;/strong&gt;&lt;/font&gt;&lt;strong id="xxad187"&gt;netbeans&lt;/strong&gt;&lt;font id="xxad188" face="宋体"&gt;&lt;strong id="xxad190"&gt;设计工具基本一模一样，容易直观的实现布局。&lt;/strong&gt;这是第一目标。目前已经实现。 &lt;/font&gt;&lt;/p&gt; &lt;p align="justify" style="margin-bottom: 0in;" id="xxad191"&gt;&lt;br id="xxad192" /&gt; &lt;/p&gt; &lt;p align="justify" style="margin-bottom: 0in;" id="xxad193"&gt;&lt;strong
      id="xxad195"&gt;2. &lt;/strong&gt;&lt;font id="xxad196" face="宋体"&gt;&lt;strong id="xxad198"&gt;代码的生成和解析不需要辅助&lt;/strong&gt;&lt;/font&gt;&lt;strong id="xxad200"&gt;form&lt;/strong&gt;&lt;font id="xxad201" face="宋体"&gt;&lt;strong id="xxad203"&gt;文件，直接从源代码文件进行解析生成。生成代码可读性要强，要可以编辑并且同步。&lt;/strong&gt;目前已经基本实现，有些折中处理，采用约定代替配置的办法提高代码解析速度。 &lt;/font&gt;&lt;/p&gt; &lt;p align="justify" style="margin-bottom: 0in;" id="xxad204"&gt;&lt;br id="xxad205" /&gt; &lt;/p&gt; &lt;p align="justify" style="margin-bottom:
      0in;" id="xxad206"&gt;&lt;strong id="xxad208"&gt;3. &lt;/strong&gt;&lt;font id="xxad209" face="宋体"&gt;&lt;strong id="xxad211"&gt;直接支持树和表的界面设计，不需要写代码，直观的采用界面操作，便可以直接生成表和树的数据模型代码。&lt;/strong&gt;此功能已经实现。而且目前的框架可以很容易扩展，实现类似其他复杂组件的界面设计。 &lt;/font&gt;&lt;/p&gt; &lt;p align="justify" style="margin-bottom: 0in;" id="xxad212"&gt;&lt;br id="xxad213" /&gt; &lt;/p&gt; &lt;p align="justify" style="margin-bottom: 0in;" id="xxad214"&gt;&lt;strong id="xxad216"&gt;4. &lt;/strong&gt;&lt;font id="xxad217"
      face="宋体"&gt;&lt;strong id="xxad219"&gt;工具的性能良好，界面设计功能流畅，代码解析&lt;/strong&gt;&lt;/font&gt;&lt;strong id="xxad221"&gt;/&lt;/strong&gt;&lt;font id="xxad222" face="宋体"&gt;&lt;strong id="xxad224"&gt;生成速度快。&lt;/strong&gt;目前来看，速度和性能还不错，初步的打算是将速度放在最后处理优化。 &lt;/font&gt;&lt;/p&gt; &lt;p align="justify" style="margin-bottom: 0in;" id="xxad225"&gt;&lt;br id="xxad226" /&gt; &lt;/p&gt; &lt;p align="justify" style="margin-bottom: 0in;" id="xxad227"&gt;&lt;strong id="xxad229"&gt;5.&lt;/strong&gt;&lt;font
      id="xxad230" face="宋体"&gt;&lt;strong id="xxad232"&gt;支持在设计时切换&lt;/strong&gt;&lt;/font&gt;&lt;strong id="xxad234"&gt;LookAndFeel,&lt;/strong&gt;&lt;font id="xxad235" face="宋体"&gt;&lt;strong id="xxad237"&gt;并能生成所设定&lt;/strong&gt;&lt;/font&gt;&lt;strong id="xxad239"&gt;LookAndFeel&lt;/strong&gt;&lt;font id="xxad240" face="宋体"&gt;&lt;strong id="xxad242"&gt;的代码。&lt;/strong&gt;这样就能做到设计时和运行时完全一致。而&lt;/font&gt;NetBeans&lt;font id="xxad244" face="宋体"&gt;的设计工具只能以&lt;/font&gt;NetBeans&lt;font id="xxad247"
      face="宋体"&gt;自身相同的&lt;/font&gt;LookAndFeel&lt;font id="xxad250" face="宋体"&gt;设计，然后使用另外的&lt;/font&gt;LookAndFeel&lt;font id="xxad253" face="宋体"&gt;预览。 &lt;/font&gt;&lt;/p&gt; &lt;p align="justify" style="margin-bottom: 0in;" id="qdix"&gt;&lt;font id="qdix0" face="宋体"&gt;&lt;strong id="qdix2"&gt;6.更多的特性 将在以后的版本中添加.&lt;/strong&gt;&lt;/font&gt; &lt;/p&gt; &lt;h4 id="xxad255"&gt;&lt;font color="#0000ff" id="xxad256"&gt;&lt;font id="xxad257" face="黑体"&gt;代码位置 &lt;/font&gt;&lt;/font&gt;&lt;/h4&gt; &lt;p
      align="justify" style="margin-bottom: 0in;" id="xxad258"&gt;http://code.google.com/p/visualswing4eclipse/ &lt;/p&gt; &lt;h4 id="xxad259"&gt;&lt;font color="#0000ff" id="xxad260"&gt;&lt;font id="xxad261" face="黑体"&gt;授权方式&lt;/font&gt;:&lt;/font&gt; &lt;/h4&gt; &lt;p align="justify" style="margin-bottom: 0in;" id="xxad262"&gt;&lt;font id="xxad263" face="宋体"&gt;本工具使用的是&lt;/font&gt;LGPL&lt;font id="xxad264" face="宋体"&gt;授权方式。照顾商业利用和开源改进而采用此授权。 &lt;/font&gt;&lt;/p&gt; &lt;p align="justify"
      style="margin-bottom: 0in;" id="xxad265"&gt;&lt;font id="xxad266" face="宋体"&gt;目前支持的&lt;/font&gt;Eclipse&lt;font id="xxad267" face="宋体"&gt;平台是&lt;/font&gt;3.4&lt;font id="xxad268" face="宋体"&gt;，&lt;/font&gt;JDK&lt;font id="xxad269" face="宋体"&gt;请使用&lt;/font&gt;1.6 &lt;/p&gt; &lt;h4 id="xxad270"&gt;&lt;font color="#0000ff" id="xxad271"&gt;&lt;font id="xxad272" face="黑体"&gt;联系方式&lt;/font&gt;:&lt;/font&gt; &lt;/h4&gt; &lt;p align="justify" style="margin-bottom: 0in;" id="xxad273"&gt;Msn : rehte @
      hotmail . com &lt;/p&gt; &lt;p align="justify" style="margin-bottom: 0in;" id="xxad274"&gt;&lt;br id="xxad275" /&gt; &lt;/p&gt; &lt;h4 id="xxad276"&gt;&lt;font color="#0000ff" id="xxad277"&gt;&lt;font id="xxad278" face="黑体"&gt;常见问题解答&lt;/font&gt;:&lt;/font&gt; &lt;/h4&gt; &lt;p align="justify" style="margin-bottom: 0in;" id="xxad279"&gt;&lt;font id="xxad284" face="宋体"&gt;1、变量命名为什么是&lt;/font&gt;$nameLabel&lt;font id="xxad285" face="宋体"&gt;这样的，是为了读取方便么？&lt;/font&gt; &lt;/p&gt; &lt;p align="justify"
      style="margin-bottom: 0in;" id="xxad286"&gt;&lt;br id="xxad287" /&gt; &lt;/p&gt; &lt;p align="justify" style="margin-bottom: 0in;" id="xxad288"&gt;&lt;strong id="xxad290"&gt;Re&lt;/strong&gt;&lt;font id="xxad291" face="宋体"&gt;&lt;strong id="xxad293"&gt;：&lt;/strong&gt;这儿是&lt;/font&gt;netbeans form&lt;font id="xxad295" face="宋体"&gt;解析法和&lt;/font&gt;VE&lt;font id="xxad298" face="宋体"&gt;的&lt;/font&gt;AST&lt;font id="xxad301" face="宋体"&gt;语法数解析法的一个折中，提高解析速度，降低&lt;/font&gt; &lt;/p&gt; &lt;p
      align="justify" style="margin-bottom: 0in;" id="xxad303"&gt;&lt;font id="xxad304" face="宋体"&gt;解析复杂度，同时有抛弃了&lt;/font&gt;form&lt;font id="xxad305" face="宋体"&gt;文件的一个折中办法，被设计的界面组件的&lt;/font&gt;field&lt;font id="xxad306" face="宋体"&gt;名称需要以&lt;/font&gt;$&lt;font id="xxad307" face="宋体"&gt;作为识别，当然这个&lt;/font&gt;$&lt;font id="xxad308" face="宋体"&gt;是可以替换的。目前还没有做这一步。&lt;/font&gt; &lt;/p&gt; &lt;p align="justify" style="margin-bottom: 0in;" id="xxad309"&gt;&lt;font id="xxad314"
      face="宋体"&gt;2、方法名字为什么是&lt;/font&gt;changeBtn_action_actionPerformed&lt;font id="xxad315" face="宋体"&gt;这样的，不符合&lt;/font&gt;java&lt;font id="xxad316" face="宋体"&gt;的规范，有配置可以改么？&lt;/font&gt; &lt;/p&gt; &lt;p align="justify" style="margin-bottom: 0in;" id="xxad317"&gt;&lt;br id="xxad318" /&gt; &lt;/p&gt; &lt;p align="justify" style="margin-bottom: 0in;" id="xxad319"&gt;&lt;strong id="xxad321"&gt;Re&lt;/strong&gt;&lt;font id="xxad322" face="宋体"&gt;&lt;strong
      id="xxad324"&gt;：&lt;/strong&gt;这个以后会增加配置进行配置，但目前太多其他的细化工作要做，本人精力实在有限。&lt;/font&gt; &lt;/p&gt; &lt;p align="justify" style="margin-bottom: 0in;" id="xxad325"&gt;&lt;br id="xxad326" /&gt; &lt;/p&gt; &lt;p align="justify" style="margin-bottom: 0in;" id="xxad327"&gt;3&lt;font id="xxad328" face="宋体"&gt;、我这里用的英文版的&lt;/font&gt;eclipse3.4&lt;font id="xxad329" face="宋体"&gt;，改变变量时，确认和取消按钮为乱码，没有国际化支持么？&lt;/font&gt; &lt;/p&gt; &lt;p align="justify" style="margin-bottom: 0in;" id="xxad330"&gt;&lt;br id="xxad331"
      /&gt; &lt;/p&gt; &lt;p align="justify" style="margin-bottom: 0in;" id="xxad332"&gt;&lt;strong id="xxad334"&gt;Re&lt;/strong&gt;&lt;font id="xxad335" face="宋体"&gt;&lt;strong id="xxad337"&gt;：&lt;/strong&gt;目前只是出于功能实现阶段，国际化还没有考虑，不过&lt;/font&gt;eclipse&lt;font id="xxad339" face="宋体"&gt;的国际化是很简单的事情，打算把它作为最后阶段解决的问题。&lt;/font&gt; &lt;/p&gt; &lt;p align="justify" style="margin-bottom: 0in;" id="xxad341"&gt;&lt;br id="xxad342" /&gt; &lt;/p&gt; &lt;p align="justify" style="margin-bottom: 0in;"
      id="xxad343"&gt;4&lt;font id="xxad344" face="宋体"&gt;、&lt;/font&gt;netbeans&lt;font id="xxad345" face="宋体"&gt;中双击&lt;/font&gt;button&lt;font id="xxad346" face="宋体"&gt;可以直接生成&lt;/font&gt;action&lt;font id="xxad347" face="宋体"&gt;调用方法，希望也提供这个功能。&lt;/font&gt; &lt;/p&gt; &lt;p align="justify" style="margin-bottom: 0in;" id="xxad348"&gt;&lt;br id="xxad349" /&gt; &lt;/p&gt; &lt;p align="justify" style="margin-bottom: 0in;" id="xxad350"&gt;&lt;strong id="xxad352"&gt;Re&lt;/strong&gt;&lt;font id="xxad353"
      face="宋体"&gt;&lt;strong id="xxad355"&gt;：&lt;/strong&gt;这个没有问题。只不过这儿双击是调出&lt;/font&gt;in-place editor&lt;font id="xxad357" face="宋体"&gt;来实地编辑组件值。比如双击&lt;/font&gt;Table&lt;font id="xxad360" face="宋体"&gt;和&lt;/font&gt;tree&lt;font id="xxad363" face="宋体"&gt;能够调出直接编辑表格和树的设计器。&lt;/font&gt; &lt;/p&gt; &lt;p align="justify" style="margin-bottom: 0in;" id="xxad365"&gt;&lt;br id="xxad366" /&gt; &lt;/p&gt; &lt;p align="justify" style="margin-bottom: 0in;" id="xxad367"&gt;5&lt;font id="xxad368"
      face="宋体"&gt;、怎么没有直接切换到代码的视图，还有到了代码后我直接 运行 怎么出来不了东西。。？ &lt;/font&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" id="xxad369"&gt;&lt;br id="xxad370" /&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0in;" id="xxad371"&gt;&lt;strong id="xxad373"&gt;Re&lt;/strong&gt;&lt;font id="xxad374" face="宋体"&gt;&lt;strong id="xxad376"&gt;：&lt;/strong&gt;目前不好用是因为功能还没有完全完成。很正常，因此我把版本定在&lt;/font&gt;0.9.0&lt;font id="xxad378" face="宋体"&gt;，甚至应该更低，但是目前大部分功能框架和实现已经完成，缺少只是细化，所以我希望对于&lt;/font&gt;Swing&lt;font id="xxad381"
      face="宋体"&gt;和&lt;/font&gt;SWT&lt;font id="xxad384" face="宋体"&gt;以及&lt;/font&gt;Eclipse RCP&lt;font id="xxad387" face="宋体"&gt;开发功底比较深的人能够加入进来，帮助完善。 &lt;/font&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" id="xxad389"&gt;&lt;br id="xxad390" /&gt; &lt;/p&gt; &lt;h4 id="xxad391"&gt;&lt;font color="#0000ff" id="xxad392"&gt;&lt;font id="xxad393" face="黑体"&gt;开发步骤&lt;/font&gt;:&lt;/font&gt; &lt;/h4&gt; &lt;p id="sq2h"&gt;1、新建一个Java工程 &lt;/p&gt; &lt;div style="padding: 1em 0px; text-align: left;"
      id="fd9b"&gt;&lt;img src="http://docs.google.com/File?id=dgxg3xv7_6cjcp7vft_b" alt="" id="s:k5" /&gt; &lt;/div&gt; &lt;p align="justify" style="margin-bottom: 0in;" id="xxad394"&gt;&lt;font id="xxad395" face="宋体"&gt;2、安装插件以后，在&lt;/font&gt;New Class Wizard&lt;font id="xxad396" face="宋体"&gt;中可以发现一个&lt;/font&gt;Visual Swing Class&lt;font id="xxad397" face="宋体"&gt;，选择该项以生成可视化&lt;/font&gt;JPanel&lt;font id="xxad398" face="宋体"&gt;，目前只支持&lt;/font&gt;JPanel&lt;font id="xxad399"
      face="宋体"&gt;，以后可以很容易扩展&lt;/font&gt;,&lt;font id="xxad400" face="宋体"&gt;会有更多的支持。 &lt;/font&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" id="xxad401"&gt;&lt;img src="http://www.javaeye.com/upload/picture/pic/16791/ef7bbe3e-6bed-33b3-98a5-322b180d0aff.png?1214564577" name="graphics1" align="bottom" height="521" width="521" alt="" border="0" id="xxad402" /&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0in;" id="qst-0"&gt;初始化界面 &lt;/p&gt; &lt;p style="margin-bottom: 0in;" id="qst-1"&gt;&#160;&lt;img
      src="http://docs.google.com/File?id=dgxg3xv7_7g45br8fp_b" alt="" id="d_.7" /&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0in;" id="xxad403"&gt;&lt;br id="xxad404" /&gt; &lt;/p&gt; &lt;h4 id="xxad405"&gt;&lt;font color="#0000ff" id="xxad406"&gt;&lt;font id="xxad407" face="黑体"&gt;目前完成的特性截图&lt;/font&gt;:&lt;/font&gt; &lt;/h4&gt; &lt;p align="justify" style="margin-top: 0.07in; margin-bottom: 0in;" id="xxad408"&gt;&lt;font id="xxad409"
      face="宋体"&gt;下面是一个典型的设计界面的场景，红框标出的是该插件提供的视图和按钮，支持&lt;/font&gt;LookAndFeel&lt;font id="xxad410" face="宋体"&gt;切换： &lt;/font&gt;&lt;/p&gt; &lt;div style="padding: 1em 0px; text-align: center;" id="yi5k"&gt;&lt;img src="http://www.javaeye.com/upload/picture/pic/16789/7a5fe012-7311-3053-b09b-2798312d597d.png?1214564559" style="width: 100%;" name="graphics2" alt="" border="0" id="xxad412" /&gt; &lt;/div&gt; &lt;p style="margin-bottom: 0in;" id="xxad413"&gt;&lt;br id="xxad414" /&gt; &lt;/p&gt; &lt;p
      align="justify" style="margin-top: 0.07in; margin-bottom: 0in;" id="xxad415"&gt;&lt;font id="xxad416" face="宋体"&gt;这儿是拖拽组件时显示布局提示，和&lt;/font&gt;netbeans&lt;font id="xxad417" face="宋体"&gt;的界面布局设计类似： &lt;/font&gt;&lt;/p&gt; &lt;div style="padding: 1em 0px; text-align: center;" id="c6tk"&gt;&lt;img src="http://www.javaeye.com/upload/picture/pic/16781/e1840351-46d6-3e2f-87e6-6639593dfcaa.png?1214564498" style="width: 1075px; height: 822px;" name="graphics3" alt="" border="0" id="xxad419" /&gt;
      &lt;/div&gt; &lt;p align="justify" style="margin-top: 0.07in; margin-bottom: 0in;" id="xxad420"&gt;&lt;font id="xxad421" face="宋体"&gt;这是生成的源代码，可以直接修改源代码，保存后，会自动同步的到设计界面上去： &lt;/font&gt;&lt;/p&gt; &lt;div style="padding: 1em 0px; text-align: center;" id="rimn"&gt;&lt;img src="http://www.javaeye.com/upload/picture/pic/16783/69be9aa8-cee4-3a94-ab1f-877a961d5f6d.png?1214564513" style="width: 100%;" name="graphics4" alt="" border="0" id="xxad423" /&gt; &lt;/div&gt; &lt;p align="justify" style="margin-top:
      0.07in; margin-bottom: 0in;" id="xxad424"&gt;&lt;font id="xxad425" face="宋体"&gt;这是一个表格的设计器，你可以直接在界面上拖拽，添加删除编辑表格： &lt;/font&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" id="xxad426"&gt;&lt;img src="http://www.javaeye.com/upload/picture/pic/16785/5322d0bc-2bdd-3803-aeb6-645bf26ef9fe.png?1214564526" style="margin: 1em 1em 0px 0px; float: left; width: 100%;" name="graphics5" alt="" border="0" id="xxad427" /&gt; &lt;/p&gt; &lt;p style="margin-bottom: 0in;" id="xxad428"&gt;&lt;br id="xxad429" /&gt;
      &lt;/p&gt; &lt;p align="justify" style="margin-top: 0.07in; margin-bottom: 0in;" id="dyi41"&gt;&lt;font id="dyi42" face="宋体"&gt;这是一个树的设计器，你可以直观的添加删除编辑树的节点： &lt;/font&gt;&lt;/p&gt; &lt;p style="margin-bottom: 0in;" id="xxad432"&gt;&lt;img src="http://www.javaeye.com/upload/picture/pic/16787/06d76029-433f-34eb-8d20-91a01b75f0b3.png?1214564541" style="margin: 1em 1em 0px 0px; float: left; width: 100%;" name="graphics6" alt="" border="0" id="xxad433" /&gt; &lt;/p&gt; &lt;p align="justify"
      style="margin-top: 0.07in; margin-bottom: 0in;" id="xxad434"&gt;&lt;font id="xxad435" face="宋体"&gt;多&lt;/font&gt;LookAndFeel&lt;font id="xxad436" face="宋体"&gt;同时设计的抓图，含有&lt;/font&gt;NimbusLookAndFeel &lt;/p&gt; &lt;p align="justify" style="margin-bottom: 0in;" id="xxad437"&gt;NimbusLookAndFeel&lt;font id="xxad438" face="宋体"&gt;显得得体大方，字体也很好看，图标精致，组件显得既圆润而又不过分华丽。不知你注意没有，新的&lt;/font&gt;Java2D&lt;font id="xxad439" face="宋体"&gt;的字体渲染是使用本地渲染库渲染的，已经完全和本地程序的字体一模一样的。的确不错&lt;/font&gt;:) &lt;/p&gt; &lt;div
      style="padding: 1em 0px; text-align: left;" id="fwz3"&gt;&lt;img src="http://www.javaeye.com/upload/picture/pic/17117/fe470ef2-50b3-3499-ac23-92824e1d694c.png?1214986361" style="width: 99.99%; height: 693px;" name="graphics7" height="618" alt="" border="0" id="xxad441" /&gt; &lt;/div&gt; &lt;img src="http://www.blogjava.net/gml520/aggbug/227071.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-09-04 22:03 &lt;a style="text-decoration: none;" href="http://www.blogjava.net/gml520/articles/227071.html#Feedback" target="_blank"&gt;发表评论&lt;/a&gt;&lt;/div&gt;</description>
      <pubDate>Thu, 04 Sep 2008 14:03:00 +0000</pubDate>
    </item>
    <item>
      <title>BlogJava-何以解忧？唯有Java: NetBeans6.5 增强的项目导入功能</title>
      <guid isPermaLink="false">http://www.blogjava.net/gml520/archive/2008/09/02/226528.html</guid>
      <link>http://www.blogjava.net/gml520/archive/2008/09/02/226528.html</link>
      <description>今天我下载了NetBeans6.5 的每日更新版，感觉和beta版又有些不同了，好像修复了1600多个bug，&lt;br /&gt; 下面是一篇blog上的内容！&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;span style="color: red;"&gt;&lt;span style="color: #000000;"&gt;&lt;span style="color: #ff0000;"&gt;&lt;span style="color: #000000;"&gt;&lt;span style="color: red;"&gt;&lt;span style="color:
      #000000;"&gt;NetBeans&#160;&lt;/span&gt;&lt;span style="color: #000000;"&gt;6.5&lt;/span&gt;&lt;span style="color: #000000;"&gt;&#160;Beta&#160;was&#160;published&#160;almost&#160;&lt;/span&gt;&lt;span style="color: #000000;"&gt;3&lt;/span&gt;&lt;span style="color: #000000;"&gt;&#160;weeks&#160;ago.&#160;For&#160;me&#160;the&#160;beta&#160;is&#160;obsolete &lt;br /&gt; and&#160;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color:
      #000000;"&gt;&#160;you&#160;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;try&lt;/span&gt;&lt;span style="color: #000000;"&gt;&#160;a&#160;recent&#160;build,&#160;you&#160;can&#160;notice&#160;that&#160;there&#160;was&#160;fixed&#160;many&#160;issues. &lt;br /&gt; In&#160;Issuezilla&#160;there&#160;are&#160;more&#160;then&#160;&lt;/span&gt;&lt;span style="color: #000000;"&gt;1600&lt;/span&gt;&lt;span style="color:
      #000000;"&gt;&#160;fixed&#160;issues&#160;during&#160;last&#160;three&#160;weeks.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt; &#160;I&#160;would&#160;like&#160;to&#160;hihglight&#160;some&#160;improvements&#160;in&#160;PHP&#160;support:&lt;br /&gt; &lt;br /&gt; &#160;&#160;&#160;&#160;&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color:
      #000000;"&gt;&#160;The&#160;performence&#160;of&#160;code&#160;completion&#160;was&#160;significantly&#160;improved.&lt;br /&gt; &#160;&#160;&#160;&#160;&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;&#160;The&#160;editor&#160;has&#160;about&#160;&lt;/span&gt;&lt;span style="color: #000000;"&gt;40&lt;/span&gt;&lt;span style="color: #000000;"&gt;&#160;fixes&#160;since&#160;the&#160;beta. &lt;br /&gt; &#160;&#160;&#160;&#160;&#160;
      The&#160;code&#160;completion&#160;is&#160;more&#160;context&#160;sensitive&#160;and&#160;it&#160;is&#160;able&#160;to&#160;offer&#160;more&#160;precise&#160;results.&lt;br /&gt; &#160;&#160;&#160;&#160;&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;&#160;There&#160;was&#160;also&#160;improved&#160;the&#160;navigation&#160;functionality. &lt;br /&gt; &#160;&#160;&#160;&#160;&#160;
      Fixes&#160;in&#160;the&#160;PHP&#160;Navigator,&#160;Hyperlink&#160;and&#160;also&#160;implementation&#160;of&#160;Go&#160;To&#160;Symbol&#160;was&#160;added.&lt;br /&gt; &#160;&#160;&#160;&#160;&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color: #000000;"&gt;&#160;Fixes&#160;in&#160;the&#160;project&#160;and&#160;debugger.&lt;br /&gt; &#160;&#160;&#160;&#160;&lt;/span&gt;&lt;span style="color: #000000;"&gt;*&lt;/span&gt;&lt;span style="color:
      #000000;"&gt;&#160;Small&#160;improvements&#160;in&#160;FTP&#160;support.&lt;br /&gt; &lt;br /&gt; Over&#160;all&#160;there&#160;are&#160;still&#160;things&#160;which&#160;can&#160;be&#160;fixed&#160;and&#160;improved.&#160;I&#160;would&#160;like&#160;to&#160;thanks&#160;to&#160;all,&lt;br /&gt; &#160;who&#160;tried&#160;the&#160;PHP&#160;support&#160;in&#160;NetBeans&#160;and&#160;entered&#160;an&#160;issue.&#160;We&#160;have&#160;a&#160;few&#160;more&#160;weeks&#160;to&#160;stabilizing&lt;br /&gt;
      &#160;and&#160;fixing.&#160;Thanks&#160;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt;&#160;your&#160;help.&lt;/span&gt;&lt;/div&gt; &lt;br /&gt; 具体大家可以自己到&lt;a href="http://blogs.sun.com/netbeansphp/entry/differences_between_beta_and_latest"&gt;NetBeans星球博&lt;/a&gt;客看看。&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; &#160;&#160; NetBeans6.5 增强了项目导入的功能，导入功能不再单一的显示黄色的图标而是不同项目显示的图标&lt;br /&gt; &lt;img
      src="http://www.blogjava.net/images/blogjava_net/gml520/project.jpg" alt="" height="372" width="583" /&gt;&lt;br /&gt; &lt;br /&gt; &#160;Eclipse 项目的导入功能也增强了，不要在为把Eclipse项目导入到NetBeans 中感到头痛了！下面&lt;br /&gt; 是引用只NetBeans wiki 上的一幅图片。&lt;br /&gt; &lt;br /&gt; &lt;img src="http://wiki.netbeans.org/attach/NewAndNoteWorthyMilestone1NB65/wizard1.png" alt="" /&gt;&lt;br /&gt; &lt;br /&gt; 还有增强的Subversion 客服端，这个是NetBeans 最新的Subversion 客户端！&lt;br /&gt; 下面是一段blog的原文：&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;Luckily&#160;it&#160;is&#160;easy&#160;to&#160;change&#160;the&#160;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;default&lt;/span&gt;&lt;span style="color: #000000;"&gt;&#160;client&#160;and&#160;use&#160;a&#160;newer&#160;client&#160;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt;&#160;Subversion.&lt;br /&gt;
      &#160;We&#160;only&#160;have&#160;to&#160;go&#160;to&#160;Tools&#160;&lt;/span&gt;&lt;span style="color: #000000;"&gt;|&lt;/span&gt;&lt;span style="color: #000000;"&gt;&#160;Options&#160;&lt;/span&gt;&lt;span style="color: #000000;"&gt;|&lt;/span&gt;&lt;span style="color: #000000;"&gt;&#160;Miscellaneous&#160;&lt;/span&gt;&lt;span style="color: #000000;"&gt;|&lt;/span&gt;&lt;span style="color: #000000;"&gt;&#160;Versioning&#160;&lt;/span&gt;&lt;span style="color: #000000;"&gt;|&lt;/span&gt;&lt;span
      style="color: #000000;"&gt;&#160;Subversion.&lt;br /&gt; &#160;There&#160;we&#160;have&#160;a&#160;input&#160;field&#160;Specify&#160;the&#160;SVN&#160;home&#160;folder&#160;with&#160;a&#160;Browse&#160;button. &lt;br /&gt; Here&#160;we&#160;can&#160;specify&#160;where&#160;we&#160;installed&#160;our&#160;latest&#160;Subversion&#160;client&#160;software.&lt;/span&gt;&lt;/div&gt; &lt;br /&gt; &lt;br /&gt; &lt;img
      src="http://4.bp.blogspot.com/_-vJw6r2W-bw/SLzY_786GwI/AAAAAAAABO0/-_A6UXs0hKI/s1600/netbeans-new-subversion-client.png" alt="" /&gt;&lt;br /&gt; &lt;br /&gt; &lt;br /&gt; &lt;br /&gt; &lt;img src="http://www.blogjava.net/gml520/aggbug/226528.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-09-02 23:31 &lt;a style="text-decoration: none;"
      href="http://www.blogjava.net/gml520/archive/2008/09/02/226528.html#Feedback" target="_blank"&gt;发表评论&lt;/a&gt;&lt;/div&gt;</description>
      <pubDate>Tue, 02 Sep 2008 15:31:00 +0000</pubDate>
    </item>
    <item>
      <title>BlogJava-何以解忧？唯有Java: NetBeans6.1 入门教程系列（1）--- 数据库的基本操作</title>
      <guid isPermaLink="false">http://www.blogjava.net/gml520/archive/2008/09/02/226523.html</guid>
      <link>http://www.blogjava.net/gml520/archive/2008/09/02/226523.html</link>
      <description>摘要: 假期终于结束了! 面临毕业的时间越来越近了!时间真的过的好快啊! 今天发一个上个学期期末的时候写的关于如何使用NetBeans来管理数据的文章,也是 号召志愿者合写一本开源免费的Netbeans 6.1 教程 &lt;br /&gt;这个计划的第一篇文章,肯定有一些不足之处,也希望大家能够指点出来,给点建议!帮忙改进.先谢谢大家了! &lt;br /&gt;&#160;&#160;&lt;a href="http://www.blogjava.net/gml520/archive/2008/09/02/226523.html"&gt;阅读全文&lt;/a&gt;&lt;img src="http://www.blogjava.net/gml520/aggbug/226523.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-09-02 22:59 &lt;a style="text-decoration: none;" href="http://www.blogjava.net/gml520/archive/2008/09/02/226523.html#Feedback" target="_blank"&gt;发表评论&lt;/a&gt;&lt;/div&gt;</description>
      <pubDate>Tue, 02 Sep 2008 14:59:00 +0000</pubDate>
    </item>
    <item>
      <title>Jerry's Blog--NetBeans: NetBeans IDE 6.5 Beta 国内下载</title>
      <guid isPermaLink="false">http://maoa.cn/jerry/html/2008/08/200808221712444293.htm</guid>
      <link>http://maoa.cn/jerry/html/2008/08/200808221712444293.htm</link>
      <description>&lt;p&gt;英文版国内本地下载，直接地址放出，尽情享用。&lt;/p&gt; &lt;p&gt;Windows 版本&lt;/p&gt; &lt;p&gt;&lt;a href="http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-cpp-windows.exe"&gt;http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-cpp-windows.exe&lt;/a&gt;&lt;br /&gt; &lt;a
      href="http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-javase-windows.exe"&gt;http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-javase-windows.exe&lt;/a&gt;&lt;br /&gt; &lt;a href="http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-java-windows.exe"&gt;http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-java-windows.exe&lt;/a&gt;&lt;br /&gt; &lt;a
      href="http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-php-windows.exe"&gt;http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-php-windows.exe&lt;/a&gt;&lt;br /&gt; &lt;a href="http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-ruby-windows.exe"&gt;http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-ruby-windows.exe&lt;/a&gt;&lt;br /&gt; &lt;a
      href="http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-windows.exe"&gt;http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-windows.exe&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Solaris 版本&lt;/p&gt; &lt;p&gt;&lt;a href="http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-cpp-solaris-sparc.sh"&gt;http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-cpp-solaris-sparc.sh&lt;/a&gt;&lt;br /&gt; &lt;a
      href="http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-cpp-solaris-x86.sh"&gt;http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-cpp-solaris-x86.sh&lt;/a&gt;&lt;br /&gt; &lt;a href="http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-javase-solaris-sparc.sh"&gt;http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-javase-solaris-sparc.sh&lt;/a&gt;&lt;br /&gt; &lt;a
      href="http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-javase-solaris-x86.sh"&gt;http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-javase-solaris-x86.sh&lt;/a&gt;&lt;br /&gt; &lt;a href="http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-java-solaris-sparc.sh"&gt;http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-java-solaris-sparc.sh&lt;/a&gt;&lt;br /&gt; &lt;a
      href="http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-java-solaris-x86.sh"&gt;http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-java-solaris-x86.sh&lt;/a&gt;&lt;br /&gt; &lt;a href="http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-php-solaris-sparc.sh"&gt;http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-php-solaris-sparc.sh&lt;/a&gt;&lt;br /&gt; &lt;a
      href="http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-php-solaris-x86.sh"&gt;http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-php-solaris-x86.sh&lt;/a&gt;&lt;br /&gt; &lt;a href="http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-ruby-solaris-sparc.sh"&gt;http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-ruby-solaris-sparc.sh&lt;/a&gt;&lt;br /&gt; &lt;a
      href="http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-ruby-solaris-x86.sh"&gt;http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-ruby-solaris-x86.sh&lt;/a&gt;&lt;br /&gt; &lt;a href="http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-solaris-sparc.sh"&gt;http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-solaris-sparc.sh&lt;/a&gt;&lt;br /&gt; &lt;a
      href="http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-solaris-x86.sh"&gt;http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-solaris-x86.sh&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Linux 版本&lt;/p&gt; &lt;p&gt;&lt;a href="http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-cpp-linux.sh"&gt;http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-cpp-linux.sh&lt;/a&gt;&lt;br /&gt; &lt;a
      href="http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-java-linux.sh"&gt;http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-java-linux.sh&lt;/a&gt;&lt;br /&gt; &lt;a href="http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-javase-linux.sh"&gt;http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-javase-linux.sh&lt;/a&gt;&lt;br /&gt; &lt;a
      href="http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-linux.sh"&gt;http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-linux.sh&lt;/a&gt;&lt;br /&gt; &lt;a href="http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-php-linux.sh"&gt;http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-php-linux.sh&lt;/a&gt;&lt;br /&gt; &lt;a
      href="http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-ruby-linux.sh"&gt;http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-ruby-linux.sh&lt;/a&gt;&lt;/p&gt; &lt;p&gt;MacOS 版本&lt;/p&gt; &lt;p&gt;&lt;a href="http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-cpp-macosx.dmg"&gt;http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-cpp-macosx.dmg&lt;/a&gt;&lt;br /&gt; &lt;a
      href="http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-cpp-macosx-ppc.tgz"&gt;http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-cpp-macosx-ppc.tgz&lt;/a&gt;&lt;br /&gt; &lt;a href="http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-cpp-macosx-x86.tgz"&gt;http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-cpp-macosx-x86.tgz&lt;/a&gt;&lt;br /&gt; &lt;a
      href="http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-java-macosx.dmg"&gt;http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-java-macosx.dmg&lt;/a&gt;&lt;br /&gt; &lt;a href="http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-java-macosx-ppc.tgz"&gt;http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-java-macosx-ppc.tgz&lt;/a&gt;&lt;br /&gt; &lt;a
      href="http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-java-macosx-x86.tgz"&gt;http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-java-macosx-x86.tgz&lt;/a&gt;&lt;br /&gt; &lt;a href="http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-javase-macosx.dmg"&gt;http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-javase-macosx.dmg&lt;/a&gt;&lt;br /&gt; &lt;a
      href="http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-javase-macosx-ppc.tgz"&gt;http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-javase-macosx-ppc.tgz&lt;/a&gt;&lt;br /&gt; &lt;a href="http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-javase-macosx-x86.tgz"&gt;http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-javase-macosx-x86.tgz&lt;/a&gt;&lt;br /&gt; &lt;a
      href="http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-macosx.dmg"&gt;http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-macosx.dmg&lt;/a&gt;&lt;br /&gt; &lt;a href="http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-macosx-ppc.tgz"&gt;http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-macosx-ppc.tgz&lt;/a&gt;&lt;br /&gt; &lt;a
      href="http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-macosx-x86.tgz"&gt;http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-macosx-x86.tgz&lt;/a&gt;&lt;br /&gt; &lt;a href="http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-php-macosx.dmg"&gt;http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-php-macosx.dmg&lt;/a&gt;&lt;br /&gt; &lt;a
      href="http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-php-macosx-ppc.tgz"&gt;http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-php-macosx-ppc.tgz&lt;/a&gt;&lt;br /&gt; &lt;a href="http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-php-macosx-x86.tgz"&gt;http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-php-macosx-x86.tgz&lt;/a&gt;&lt;br /&gt; &lt;a
      href="http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-ruby-macosx.dmg"&gt;http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-ruby-macosx.dmg&lt;/a&gt;&lt;br /&gt; &lt;a href="http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-ruby-macosx-ppc.tgz"&gt;http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-ruby-macosx-ppc.tgz&lt;/a&gt;&lt;br /&gt; &lt;a
      href="http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-ruby-macosx-x86.tgz"&gt;http://download.developers.sun.com.cn/netbeans/6.5/bundles/netbeans-6.5beta-ruby-macosx-x86.tgz&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Fri, 22 Aug 2008 17:12:44 +0000</pubDate>
    </item>
    <item>
      <title>Jerry's Blog--NetBeans: 体验 NetBeans 6.5 和 PHP</title>
      <guid isPermaLink="false">http://maoa.cn/jerry/html/2008/08/200808191108438033.htm</guid>
      <link>http://maoa.cn/jerry/html/2008/08/200808191108438033.htm</link>
      <description>&lt;p&gt;体验一把在 NetBeans 开发 PHP 的感觉。&lt;/p&gt; &lt;ul&gt; &lt;li&gt;IDE：NetBeans 6.5 Beta&lt;br /&gt; 下载：&lt;a href="http://dlc.sun.com.edgesuite.net/netbeans/6.5/beta/"&gt;http://dlc.sun.com.edgesuite.net/netbeans/6.5/beta/&lt;/a&gt;&lt;/li&gt; &lt;li&gt;PHP 服务器环境：WampServer 2.0 (Apache 2.2.8, PHP 5.2.6 + PECL, SQLitemanager, MySQL 5.0.51b, Phpmyadmin)&lt;br /&gt; 下载：&lt;a href="http://www.wampserver.com/en/download.php"&gt;http://www.wampserver.com/en/download.php&lt;/a&gt;&lt;/li&gt;
      &lt;/ul&gt; &lt;p&gt;&lt;img src="http://maoa.cn/jerry/upfiles/images/200808/2008-08-19_110154.png" alt="" /&gt;&lt;/p&gt; &lt;p&gt;新建一个 PHP 项目：&lt;/p&gt; &lt;p&gt;&lt;img src="http://maoa.cn/jerry/upfiles/images/200808/2008-08-19_104734.png" alt="" /&gt;&lt;/p&gt; &lt;p&gt;选择运行环境：&lt;/p&gt; &lt;p&gt;&lt;img src="http://maoa.cn/jerry/upfiles/images/200808/2008-08-19_104852.png" alt="" /&gt;&lt;/p&gt; &lt;p&gt;代码提示：&lt;/p&gt; &lt;p&gt;&lt;img
      src="http://maoa.cn/jerry/upfiles/images/200808/2008-08-19_105739.png" alt="" /&gt;&lt;/p&gt; &lt;p&gt;直接运行：&lt;/p&gt; &lt;p&gt;&lt;img src="http://maoa.cn/jerry/upfiles/images/200808/2008-08-19_104936.png" alt="" /&gt;&lt;/p&gt; &lt;p&gt;运行结果：&lt;/p&gt; &lt;p&gt;&lt;img src="http://maoa.cn/jerry/upfiles/images/200808/2008-08-19_104959.png" alt="" /&gt;&lt;/p&gt; &lt;p&gt;感觉不错。&lt;/p&gt;</description>
      <pubDate>Tue, 19 Aug 2008 11:08:43 +0000</pubDate>
    </item>
    <item>
      <title>Jerry's Blog--NetBeans: NetBeans 6.1 + JavaFX</title>
      <guid isPermaLink="false">http://maoa.cn/jerry/html/2008/08/200808011151223826.htm</guid>
      <link>http://maoa.cn/jerry/html/2008/08/200808011151223826.htm</link>
      <description>&lt;p&gt;2008年7月31日，Sun 最新发布 JavaFX Preview SDK。&lt;font face="Arial"&gt;JavaFX™ 技术可用于开发富互联网应用程序。JavaFX™ Preview SDK 包含用于开发 JavaFX 应用程序的库和支持文档。利用 NetBeans™ 提供的 JavaFX 支持，我们可以轻松开发、调试和部署 JavaFX 应用程序。&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Arial"&gt;敬请访问：&lt;a href="http://developers.sun.com.cn/javafx/"&gt;http://developers.sun.com.cn/javafx/&lt;/a&gt;&lt;/font&gt;&lt;/p&gt; &lt;p align="center"&gt;&lt;font face="Arial"&gt;&lt;img
      src="http://maoa.cn/jerry/upfiles/images/200808/2008-08-10_131716.jpg" alt="" /&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;技术文档&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;JavaFX 技术入门 &lt;br /&gt; &lt;a href="http://developers.sun.com.cn/javafx/JavaFX-NetBeans-Docs/JFXNB-GettingStarted/javafx-netbeans-getting-started.html"&gt;http://developers.sun.com.cn/javafx/JavaFX-NetBeans-Docs/JFXNB-GettingStarted/javafx-netbeans-getting-started.html&lt;/a&gt;&lt;/li&gt; &lt;li&gt;NetBeans 6.1 IDE With
      JavaFX 预览版发行说明 &lt;br /&gt; &lt;a href="http://developers.sun.com.cn/javafx/JavaFX-NetBeans-Docs/JFXNB-Release-Notes/javafx-netbeans-release-notes.html"&gt;http://developers.sun.com.cn/javafx/JavaFX-NetBeans-Docs/JFXNB-Release-Notes/javafx-netbeans-release-notes.html&lt;/a&gt;&lt;/li&gt; &lt;li&gt;使用 NetBeans IDE 创建一个简单的 JavaFX 应用程序 &lt;br /&gt; &lt;a
      href="http://developers.sun.com.cn/javafx/JavaFX-NetBeans-Docs/JFXNB-Simple-App-Tutorial/simple_javafx_nb_app.html"&gt;http://developers.sun.com.cn/javafx/JavaFX-NetBeans-Docs/JFXNB-Simple-App-Tutorial/simple_javafx_nb_app.html&lt;/a&gt;&lt;/li&gt; &lt;li&gt;JavaFX 预览版 SDK 发行说明 &lt;br /&gt; &lt;a href="http://developers.sun.com.cn/javafx/JavaFX-SDK-Docs/javafx-sdk-release-notes.html"&gt;http://developers.sun.com.cn/javafx/JavaFX-SDK-Docs/javafx-sdk-release-notes.html&lt;/a&gt;&lt;/li&gt; &lt;li&gt;安装
      Project Nile &lt;br /&gt; &lt;a href="http://developers.sun.com.cn/javafx/ProjectNile-Docs/project-nile-installing.htmlProject"&gt;http://developers.sun.com.cn/javafx/ProjectNile-Docs/project-nile-installing.htmlProject&lt;/a&gt;&lt;/li&gt; &lt;li&gt;Nile 预览版发行说明 &lt;br /&gt; &lt;a href="http://developers.sun.com.cn/javafx/ProjectNile-Docs/project-nile-release-notes.html"&gt;http://developers.sun.com.cn/javafx/ProjectNile-Docs/project-nile-release-notes.html&lt;/a&gt;&lt;/li&gt; &lt;li&gt;将图形资源集成到
      JavaFX 应用程序中 &lt;br /&gt; &lt;a href="http://developers.sun.com.cn/javafx/ProjectNile-Docs/project-nile-tutorial-1.html"&gt;http://developers.sun.com.cn/javafx/ProjectNile-Docs/project-nile-tutorial-1.html&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;&lt;strong&gt;相关下载&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;NetBeans IDE 6.1 + JavaFX&lt;br /&gt; &lt;a
      href="http://download.developers.sun.com.cn/javafx/netbeans-6.1-javafx-windows.exe"&gt;http://download.developers.sun.com.cn/javafx/netbeans-6.1-javafx-windows.exe&lt;/a&gt;&lt;/li&gt; &lt;li&gt;JDK 1.6u10 beta build25 for Windows &lt;br /&gt; &lt;a href="http://download.developers.sun.com.cn/jdk/6u10-beta-b25/jdk-6u10-beta-windows-i586-p.exe"&gt;http://download.developers.sun.com.cn/jdk/6u10-beta-b25/jdk-6u10-beta-windows-i586-p.exe&lt;/a&gt;&lt;/li&gt; &lt;li&gt;JRE 1.6u10 beta build25 for Windows
      &lt;br /&gt; &lt;a href="http://download.developers.sun.com.cn/jdk/6u10-beta-b25/jre-6u10-beta-windows-i586-p.exe"&gt;http://download.developers.sun.com.cn/jdk/6u10-beta-b25/jre-6u10-beta-windows-i586-p.exe&lt;/a&gt;&lt;/li&gt; &lt;li&gt;JDK 1.6u7 for Windows &lt;br /&gt; &lt;a href="http://download.developers.sun.com.cn/jdk/6u7/jdk-6u7-windows-i586-p.exe"&gt;http://download.developers.sun.com.cn/jdk/6u7/jdk-6u7-windows-i586-p.exe&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;</description>
      <pubDate>Fri, 01 Aug 2008 11:51:22 +0000</pubDate>
    </item>
    <item>
      <title>Jerry's Blog--NetBeans: NetBeans 将支持 Python</title>
      <guid isPermaLink="false">http://maoa.cn/jerry/html/2008/07/200807170113440616.htm</guid>
      <link>http://maoa.cn/jerry/html/2008/07/200807170113440616.htm</link>
      <description>&lt;p&gt;NetBeans 是一款伟大的 IDE！它不仅仅是用来开发 Java 的，还可以用来开发多种脚本语言。比如在 NetBeans 6.5 中将完全支持 PHP 开发。在未来版本中，还会加入 Python/Jython 的支持。&lt;/p&gt; &lt;p&gt;关于 Python 和 NetBeans，敬请访问这个项目：&lt;a href="https://nbpython.dev.java.net/"&gt;https://nbpython.dev.java.net/&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Thu, 17 Jul 2008 01:13:44 +0000</pubDate>
    </item>
    <item>
      <title>Jerry's Blog--NetBeans: 通过实例学习 NetBeans 6 的新功能</title>
      <guid isPermaLink="false">http://maoa.cn/jerry/html/2008/07/200807150258073324.htm</guid>
      <link>http://maoa.cn/jerry/html/2008/07/200807150258073324.htm</link>
      <description>&lt;p&gt;NetBeans 6.1 是一款“无所不能”的 IDE。本系列文章围绕刚刚发布的 NetBeans 6.1 中文版的概要和实际使用方法进行介绍，并提供一些示例程序。&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="http://developers.sun.com.cn/Java/nb6_200802.html"&gt;第 1 部分：引言&lt;/a&gt;&lt;br /&gt; 本部分将介绍如何安装 NetBeans 和运行示例程序。&lt;/li&gt; &lt;li&gt;&lt;a href="http://developers.sun.com.cn/Java/nb6_200803.html"&gt;第 2 部分：Java 桌面应用程序&lt;/a&gt;&lt;br /&gt; 本部分将主要介绍 Java SE 的相关功能，以及如何使用 GUI 设计器和 Swing 应用程序框架开发一个简单的桌面应用程序，然后将该应用程序发布到 Web Start。&lt;/li&gt; &lt;li&gt;&lt;a
      href="http://developers.sun.com.cn/Java/nb6_200804.html"&gt;第 3 部分：使用 Mobility 开发游戏&lt;/a&gt;&lt;br /&gt; NetBeans 6.1 拥有非常强大的 Java ME 集成开发环境。本部分将介绍用于游戏开发的游戏编辑器，具体的技术信息请参阅本文结束部分的参考资料以及 NetBeans Mobility 中包含的示例源代码，这些信息对游戏设计器本身和游戏的开发进行了说明。在本文中，我们将介绍如何使用游戏编辑器开发游戏。请轻松阅读本部分内容。&lt;/li&gt; &lt;li&gt;&lt;a href="http://developers.sun.com.cn/Java/nb6_200805.html"&gt;第 4 部分：源代码的版本管理&lt;/a&gt;&lt;br /&gt; 本系列文章适用于 NetBeans 6.1。英文版和中文版的 NetBeans 6.1 已经发布，本部分将展示 NetBeans 6.1 中文环境的一些例子。&lt;/li&gt; &lt;li&gt;&lt;a
      href="http://developers.sun.com.cn/Java/nb6_200806.html"&gt;第 5 部分：Ruby on Rails 开发环境&lt;/a&gt;&lt;br /&gt; NetBeans 6.1 将 Ruby 和 Ruby on Rails 开发环境合并后得到了用户的高度评价，各地举行的 Ruby on Rails 交流会也都在使用这个开发环境。本月初发布的 NetBeans 6.1 中文版对此进行了扩展，使用也更加方便。由于 NetBeans 中绑定了 JRuby 运行环境，因此安装好 IDE 后就可以开始 JRuby 开发。本章将介绍其中的 Ruby on Rails 开发环境。&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;敬请访问：&lt;a href="http://developers.sun.com.cn/Java/nb6_index.html"&gt;http://developers.sun.com.cn/Java/nb6_index.html&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Tue, 15 Jul 2008 02:58:07 +0000</pubDate>
    </item>
    <item>
      <title>Jerry's Blog--NetBeans: NetBeans 中文版界面字体</title>
      <guid isPermaLink="false">http://maoa.cn/jerry/html/2008/07/200807091642194475.htm</guid>
      <link>http://maoa.cn/jerry/html/2008/07/200807091642194475.htm</link>
      <description>&lt;p&gt;一直使用 Vista 和 Solaris，NetBeans 6.1 中文版界面的字体还算正常。&lt;/p&gt; &lt;p&gt;今天怀个旧，用了用 Windows XP，发现 NetBeans 中文版在这上面的字体实在是不尽人意。&lt;/p&gt; &lt;p&gt;最简单的修改方法，在 NetBeans 快捷方式的“目标”命令行后面，添加：--fontsize 12。&lt;/p&gt; &lt;p&gt;修改前：&lt;/p&gt; &lt;p&gt;&lt;img src="http://maoa.cn/jerry/upfiles/images/2008-07-09_163445.png" alt="" /&gt;&lt;/p&gt; &lt;p&gt;修改后：&lt;/p&gt; &lt;p&gt;&lt;img src="http://maoa.cn/jerry/upfiles/images/2008-07-09_163414.png" alt="" /&gt;&lt;/p&gt;</description>
      <pubDate>Wed, 09 Jul 2008 16:42:19 +0000</pubDate>
    </item>
    <item>
      <title>太阳照在科技大厦: 免费的 Ruby 在线课程</title>
      <guid isPermaLink="false">http://blogs.sun.com/sunnyday/entry/%E5%85%8D%E8%B4%B9%E7%9A%84_ruby_%E5%9C%A8%E7%BA%BF%E8%AF%BE%E7%A8%8B</guid>
      <link>http://blogs.sun.com/sunnyday/entry/%E5%85%8D%E8%B4%B9%E7%9A%84_ruby_%E5%9C%A8%E7%BA%BF%E8%AF%BE%E7%A8%8B</link>
      <description>2008年7月15日开课。&lt;br /&gt;&lt;br /&gt; 参加方法：&lt;br /&gt; 1。提前阅读材料&lt;br /&gt; 2。阅读课程讲稿，动手实验&lt;br /&gt; 3。完成作业&lt;br /&gt; 4。加入课程邮件列表提问答疑&lt;br /&gt; 发空白邮件到邮件列表 ruby-on-rails-programming-with-passion-subscribe@googlegroups.com，即可注册加入&lt;a href="http://groups.google.com/group/ruby-on-rails-programming-with-passion"&gt;课堂论坛&lt;/a&gt;。 &lt;br /&gt;&lt;br /&gt; 课程安排 （7-8月）：&lt;br /&gt; 1。&lt;a href="http://www.javapassion.com/rubyonrails/#JRuby_Basics"&gt;Ruby Basics&lt;/a&gt;
      (7/15/2008)&lt;br /&gt; 2。&lt;a href="http://www.javapassion.com/rubyonrails/#Ruby_Language_Meta_Programming"&gt;Ruby Meta-programming&lt;/a&gt; (7/22/2008)&lt;br /&gt; 3。&lt;a href="http://www.javapassion.com/rubyonrails/#JRuby_Basics"&gt;JRuby Basics&lt;/a&gt;(7/29/2008)&lt;br /&gt; 4。&lt;a href="http://www.javapassion.com/rubyonrails/#Ruby_On_Rails_Basics"&gt;Ruby On Rails Basics&lt;/a&gt; (8/5/2008)&lt;br /&gt; 5。&lt;a
      href="http://www.javapassion.com/rubyonrails/#Scaffolding"&gt;Scaffolding&lt;/a&gt; (8/12/2008)&lt;br /&gt; 6。&lt;a href="http://www.javapassion.com/rubyonrails/#JRuby_and_RoR_Support_in_NetBeans"&gt;JRuby and Rails Support in NetBeans&lt;/a&gt; (8/12/2008)&lt;br /&gt; &lt;br /&gt; FAQ:&lt;br /&gt; 不清楚的问题，见&lt;a href="http://www.javapassion.com/coursefaq.html"&gt;FAQ&lt;/a&gt;。&lt;br /&gt; &lt;br /&gt; 更多在线课程：&lt;br /&gt; 请点击&lt;a href="http://www.javapassion.com"&gt;此处&lt;/a&gt;。</description>
      <pubDate>Tue, 08 Jul 2008 03:55:26 +0000</pubDate>
    </item>
    <item>
      <title>Jerry's Blog--NetBeans: 技术社区最新文章 07/08</title>
      <guid isPermaLink="false">http://maoa.cn/jerry/html/2008/07/200807080127151055.htm</guid>
      <link>http://maoa.cn/jerry/html/2008/07/200807080127151055.htm</link>
      <description>&lt;p&gt;Sun 中国技术社区 (developers.sun.com.cn) 每周都有数篇新的中文技术文档上线。可惜现在的归档工作做的还不是很好，小弟在此定期自行手工整理下 NetBeans, Java 相关的技术文档更新列表，以方便各位看官查阅。&lt;/p&gt; &lt;p&gt;以下是2008年5月1日-2008年7月8日的更新列表：&lt;/p&gt; &lt;ul&gt; &lt;li&gt;NetBeans 6.5 开发计划&lt;br /&gt; &lt;a href="http://developers.sun.com.cn/Java/NB65EngineeringPlan.html"&gt;http://developers.sun.com.cn/Java/NB65EngineeringPlan.html&lt;/a&gt;&lt;/li&gt; &lt;li&gt;NetBeans IDE 6.1 ClearCase 使用指南&lt;br /&gt; &lt;a
      href="http://developers.sun.com.cn/Java/clearcase.html"&gt;http://developers.sun.com.cn/Java/clearcase.html&lt;/a&gt;&lt;/li&gt; &lt;li&gt;使用 NetBeans IDE 为 Web 站点创建 Portlet &lt;br /&gt; &lt;a href="http://developers.sun.com.cn/Java/nb_portlets.html"&gt;http://developers.sun.com.cn/Java/nb_portlets.html&lt;/a&gt;&lt;/li&gt; &lt;li&gt;使用 NetBeans 6.1 和 Glassfish 创建 EJB3 Sessions Beans&lt;br /&gt; &lt;a
      href="http://developers.sun.com.cn/Java/CreatingEJB3UsingNetbeansAndGlassfish.html"&gt;http://developers.sun.com.cn/Java/CreatingEJB3UsingNetbeansAndGlassfish.html&lt;/a&gt;&lt;/li&gt; &lt;li&gt;在 Java ME 平台中使用 Subversion、 NetBeans IDE 和 Sun Java System Web Server&lt;br /&gt; &lt;a href="http://developers.sun.com.cn/Java/add_ons.html"&gt;http://developers.sun.com.cn/Java/add_ons.html&lt;/a&gt;&lt;/li&gt; &lt;li&gt;使用 OpenGL ES 和 Mobile Sensor API 获得全新游戏体验&lt;br /&gt; &lt;a
      href="http://developers.sun.com.cn/Java/opengles_mobilesensor.html"&gt;http://developers.sun.com.cn/Java/opengles_mobilesensor.html&lt;/a&gt;&lt;/li&gt; &lt;li&gt;使用编译的 JavaFX Script 技术中的 UI 组件&lt;br /&gt; &lt;a href="http://developers.sun.com.cn/Java/ria_2.html"&gt;http://developers.sun.com.cn/Java/ria_2.html&lt;/a&gt;&lt;/li&gt; &lt;li&gt;Mashup 样式，第 1 部分：服务器端混搭&lt;br /&gt; &lt;a
      href="http://developers.sun.com.cn/Java/mashup_1.html"&gt;http://developers.sun.com.cn/Java/mashup_1.html&lt;/a&gt;&lt;/li&gt; &lt;li&gt;Mashup 样式，第 2 部分：客户端混搭&lt;br /&gt; &lt;a href="http://developers.sun.com.cn/Java/mashup_2.html"&gt;http://developers.sun.com.cn/Java/mashup_2.html&lt;/a&gt;&lt;/li&gt; &lt;li&gt;在 GlassFish 应用服务器上使用 MySQL 和 Memcached&lt;br /&gt; &lt;a href="http://developers.sun.com.cn/Java/mysql_gf.html"&gt;http://developers.sun.com.cn/Java/mysql_gf.html&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;Java SE 6 update 10 Beta 简介&lt;br /&gt; &lt;a href="http://developers.sun.com.cn/Java/java6u10.html"&gt;http://developers.sun.com.cn/Java/java6u10.html&lt;/a&gt;&lt;/li&gt; &lt;li&gt;用于移动电话的自定义用户界面&lt;br /&gt; &lt;a href="http://developers.sun.com.cn/Java/customized-ui-for-mobile-phones.html"&gt;http://developers.sun.com.cn/Java/customized-ui-for-mobile-phones.html&lt;/a&gt;&lt;/li&gt; &lt;li&gt;GlassFish 快速入门指南&lt;br /&gt; &lt;a
      href="http://developers.sun.com.cn/Java/glassfish_quickstart.html"&gt;http://developers.sun.com.cn/Java/glassfish_quickstart.html&lt;/a&gt;&lt;/li&gt; &lt;li&gt;绑定 Beans&lt;br /&gt; &lt;a href="http://developers.sun.com.cn/Java/binding-beans.html"&gt;http://developers.sun.com.cn/Java/binding-beans.html&lt;/a&gt;&lt;/li&gt; &lt;li&gt;为 Web 应用程序的请求提供保护&lt;br /&gt; &lt;a
      href="http://developers.sun.com.cn/Java/securing-your-applications-request-parameters.html"&gt;http://developers.sun.com.cn/Java/securing-your-applications-request-parameters.html&lt;/a&gt;&lt;/li&gt; &lt;li&gt;在 Visual Web JSF 应用程序中使用 Hibernate &lt;br /&gt; &lt;a href="http://developers.sun.com.cn/Java/hibernate-vwp.html"&gt;http://developers.sun.com.cn/Java/hibernate-vwp.html&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;</description>
      <pubDate>Tue, 08 Jul 2008 01:27:15 +0000</pubDate>
    </item>
  </channel>
</rss>
