<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>yangsq</title>
    <description></description>
    <link>http://yangsq.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>新的开端</title>
        <author>yangsq</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yangsq.javaeye.com">yangsq</a>&nbsp;
          链接：<a href="http://yangsq.javaeye.com/blog/164659" style="color:red;">http://yangsq.javaeye.com/blog/164659</a>&nbsp;
          发表时间: 2008年02月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p> 现在是2008年2月25日的凌晨1：36分；</p><p>&nbsp;</p><p>经过不停的F5，我终于完成了&ldquo;我变态&rdquo;考试的报名；</p><p>&nbsp;</p><p>在过去的一个月里，中国经历了巨大的雪害；</p><p>在过去的一个星期里，穆沙拉夫的党被反对党夺去了议会的席位；</p><p>昨天，卡斯特罗夫proclaim了他的退休；</p><p>今天，我不想回望我的过去；</p><p>此时，我对未来许了一个愿！</p><p>&nbsp;</p><p>我甚至都不敢理解我的这种转变；</p><p>三年或五年可能太遥远；</p><p>真的，任何事情都是会改变；</p><p>&nbsp;</p><p>现在，我要计划我的未来；</p><p>年轻不是资本；</p><p>浪费时间就注定会被淘汰；</p><p>&nbsp;</p><p>好了，空说只会浪费时间；</p><p>最后一句话：</p><p>是爷们就要像爷们那样去奋斗！</p>
          <br/>
          <span style="color:red;">
            <a href="http://yangsq.javaeye.com/blog/164659#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 25 Feb 2008 02:02:16 +0800</pubDate>
        <link>http://yangsq.javaeye.com/blog/164659</link>
        <guid>http://yangsq.javaeye.com/blog/164659</guid>
      </item>
      <item>
        <title>ubuntu下svn服务环境配置</title>
        <author>yangsq</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yangsq.javaeye.com">yangsq</a>&nbsp;
          链接：<a href="http://yangsq.javaeye.com/blog/162649" style="color:red;">http://yangsq.javaeye.com/blog/162649</a>&nbsp;
          发表时间: 2008年02月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>平时的团队开发，少不了要用一个协作工具。对于以前，无疑cvs是个无错的选择（像IBM的全球代码维护）。但是，科技在发展吗，现在有了更好的svn了，所以直接就是svn吧。有关svn的具体信息可以上它的官网或<a href="http://www.subversion.org.cn/">www.subversion.org.cn</a></p><p>网上关于svn的也不少，不过感觉大都出自一处，也不知道quote的人真的试过没有。当然，学习吗，但个人感觉学完人家的东西一定要有自己的体会。下面是我的一个简单的配置过程。</p><p>&nbsp;</p><p>首先，肯定是svn的安装，这个很简单：</p><p>sudo apt-get install subversion</p><p>sudo apt-get install libapache2-svn（这个是和apache配合使用的，apache的安装就不说了）</p><p>完成安装后，给系统添加一个用户组（如svn），把想要加入这个组的加一下（至少要把你自己加进吧）。</p><p>显然，像代码维护，版本控制这种东西，肯定是cs结构的。所以下面先从svn服务器的配置说起。</p><p>&nbsp;</p><p><strong>svn服务器的配置和简单管理</strong></p><p>svn服务器端的配置主要是一个资源库的创建，这个资源库可以就一个，也可以是一个树状结构的（不建议使用森林结构）。我想创建一个test资源库，并把它放在/usr/local/svn下（资源库一般都放在/usr/local or /home下）：</p><p>$cd /usr/local/</p><p>$sudo mkdir svn</p><p>$sudo mkdir svn/test</p><p>$sudo chown -R root:svn svn/</p><p>$sudo chmod -R g+rws svn/</p><p>准备工作做好了，下面就是创建资源库了：</p><p>$sudo svnadmin create /usr/local/svn/test</p><p>好了，这样一个资源库就建好了，很简单，如果你要ls /usr/local/svn/test一下，就会发现出现了一些文件和文件夹（如，conf db等），它们的作用就不说了，去org上看吧。</p><p>别急，这时你还要做些工作</p><p><span style="color: #ff0000; background-color: #ffffff">$sudo chown -R root:svn svn/</span></p><p><span style="color: #ff0000; background-color: #ffffff">$sudo chmod -R g+rws svn/</span></p><p>如果没有这个，接下来就可能会出错，除非你是root。</p><p>还有一些好使的工具，如svnlook，svnadmin，svndumpfilter，他们涉及到svn资源库管理的方方面面，很强大，这里不介绍了，用的时候就查吧<a href="http://www.subversion.org.cn/svnbook">www.subversion.org.cn/svnbook</a>。需要注意的是，这些管理工具的使用，后面跟的是绝对路径，不要和下面客户端的所使用路径混淆。</p><p>&nbsp;</p><p><strong>svn客户端的使用</strong></p><p>svn客户端就是用来访问操作资源库资源的，它有多方式，如直接的file访问，自带协议的访问，http，https等待。这里只介绍两种，即file直接访问和自带协议的访问。</p><p>&nbsp;</p><p>直接访问</p><p>所谓直接访问就是通过命令行直接对资源库进行访问。下面是一些例子：</p><p>我在我的家目录下有个workspace文件夹，下面有个用eclipse创建的简单工程叫com.sun.yangsq。我想把他维护到资源库中</p><p>$cd workspace</p><p>$svn&nbsp; import com.sun.yangsq&nbsp; <a href="file:///usr/local/svn/test/com.sun.yangsq/trunk">file:///usr/local/svn/test/com.sun.yangsq/trunk</a> -m &quot;test import&quot;</p><p>这样，这个工程就被import到资源库了。</p><p>如果想查看一下资源库的信息，可以使用</p><p>$svn list <a href="file:///usr/local/svn/test/">file:///usr/local/svn/test/</a>&nbsp;</p><p>如果想查看log信息，可以使用</p><p>$svn log <a href="file:///usr/local/svn/test/">file:///usr/local/svn/test/</a></p><p>此外，svn还有好多的命令可以使用，如checkout（co），diff，move，delete，add等等，上网查去吧。</p><p>&nbsp;</p><p><strong>自带协议（svn://）的使用</strong></p><p>subversion自带了一种访问协议，很好用。但是，如果要使用这种协议，需要启动svnserve，这也很简单，如下：</p><p>$svnserve -d</p><p>这样就把本地的所有资源发到了网上，默认3690端口。访问时使用的路径如：</p><p>svn://ip/usr/local/svn/test/..... (这个ip不用带端口)</p><p>如果只想发布某个资源，可以使用</p><p>$svnserve -d -r /usr/local/svn/test</p><p>访问时使用的路径如：</p><p>svn://ip/com.sun.yangsq</p><p>如果要checkout，可以</p><p>$svn checkout svn://ip/com.sun.yangsq</p><p>需要注意的是，客户端在使用类似svn，http://这种网络协议访问资源时（即通过svnserve进程），会通过一定的权限验证，这种验证是通过资源的一些配置文件设定的。如在本例中，这些配置文件放在了/usr/local/svn/test/conf/下，包括三个authz，passwd，svnserve.conf。这三个文件的配置就不详谈了。另外的几种客户端方式如http也不介绍了，svnbook上去看，都有。</p><p>&nbsp;</p><p>如果想通过网络方式，即svn，http等访问（推荐使用这种方式，而不是file://方式），必须要把svnserve进程启动，如果你不小心把机器重新启动了，一定要手动把它再启动一边。</p><p>&nbsp;</p><p>svn确实很好使，eclipse也有它的插件（叫sublipse），很方便。但是，如果要想使好，还得好好琢磨琢磨。</p>
          <br/>
          <span style="color:red;">
            <a href="http://yangsq.javaeye.com/blog/162649#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 16 Feb 2008 15:55:40 +0800</pubDate>
        <link>http://yangsq.javaeye.com/blog/162649</link>
        <guid>http://yangsq.javaeye.com/blog/162649</guid>
      </item>
      <item>
        <title>Ubuntu下安装KDE</title>
        <author>yangsq</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yangsq.javaeye.com">yangsq</a>&nbsp;
          链接：<a href="http://yangsq.javaeye.com/blog/160275" style="color:red;">http://yangsq.javaeye.com/blog/160275</a>&nbsp;
          发表时间: 2008年01月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>我们知道，ubuntu的桌面是gnome的，但是时我们需要使用KDE。例如，前些天，我开发一个Swing程序，但运行时总是报错，swing的什么LookAndFeel的错，我估计是编写程序的时候PlatFormUI引起的。我一开始以为是JDK的bug，查了Sun的官网，目前JDK只支持RedHat和Suse。没办法，只能装个KDE了。</p><p>不要担心，gnome和KDE只是不同的桌面管理器而已，软件阿什么的是不受影响的，放心装吧。</p><p>&nbsp;</p><p>下面是安装KDE的过程：</p><p>sudo apt-get install kubuntu-desktop</p><p>遇到选yes or no的yes就行，之后会有一个蓝屏的文字窗口，寻问你要选择Kdm 还是gdm,这个看个人喜好，因为这只是开机登陆窗是KDE的还是GNOME的差别而已。我选择的是gdm，按回车，OK</p><p>&nbsp;</p><p>重启Xwindows（Ctrl+Alt+Backspace）,在登陆窗的&ldquo;会话&rdquo;中选择KDE，登陆后就是变成KDE了（如果想回到ubuntu的话，可以在&ldquo;会话&rdquo;中改成gnome）</p><p>&nbsp;</p><p>注意：一定不用担心兼容问题，在ubuntu下安装的一切软件都可以在Kubuntu下使用，同理，Ubuntu下也可以使用KDE的软件。简言之，所以软件是共用的。</p><p>&nbsp;</p><p>KDE为英文界面，可以为它安装中文环境：</p><p>sudo apt-get install language-pack-kde-zh language-pack-kde-zh-base language-pack-zh language-pack-zh-base language-support-zh</p><p>重启Xwindows就行了。</p>
          <br/>
          <span style="color:red;">
            <a href="http://yangsq.javaeye.com/blog/160275#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 30 Jan 2008 10:40:18 +0800</pubDate>
        <link>http://yangsq.javaeye.com/blog/160275</link>
        <guid>http://yangsq.javaeye.com/blog/160275</guid>
      </item>
      <item>
        <title>构建Ubuntu下的开发环境（java，c，c++）</title>
        <author>yangsq</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yangsq.javaeye.com">yangsq</a>&nbsp;
          链接：<a href="http://yangsq.javaeye.com/blog/160154" style="color:red;">http://yangsq.javaeye.com/blog/160154</a>&nbsp;
          发表时间: 2008年01月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><strong>Java 环境配置：</strong></p><p>sudo apt-get install sun-java6-jre</p><p>sudo apt-get install sun-java6-jdk</p><p><strong>设置当前默认的java解释器：</strong></p><p>sudo update-alternatives --config java</p><p>此时，会出现几个选项让你选，选择那个带sun,java的。</p><p><strong>配置JAVA环境变量:</strong></p><p>sudo gedit /etc/environment</p><p>&nbsp;在其中添加如下两行：<br />CLASSPATH=.:/usr/lib/jvm/java-6-sun/lib<br />JAVA_HOME=/usr/lib/jvm/java-6-sun</p><p>&nbsp;</p><p>sudo gedit /etc/jvm<br />将<br />/usr/lib/jvm/java-6-sun<br />这一行填入到配置块的顶部<br /><br /><strong>安装浏览器的JAVA Plugin（可选）：</strong><br />sudo apt-get install sun-java6-plugin </p><p>&nbsp;</p><p><strong><br />安装gcc,g++,make等</strong><br />sudo apt-get install build-essential<br /><br /><strong>安装头文件和库</strong><br />sudo apt-get install libc6-dev libstdc++6-4.0-dev<br /><br /><strong>安装libncurses5-dev</strong><br />sudo apt-get install libncurses5-dev<br /><br /><strong>安装gdb 调试器</strong><br />sudo apt-get install gdb<br /><strong><br />安装图形界面ddd 调试器</strong><br />sudo apt-get install ddd<br /><br /><strong>安装automake工具</strong><br />sudo apt-get install automake<br />sudo apt-get install autoconf<br />sudo apt-get install autogen<br /><br />autoconf是一个用于生成可以自动地配置软件源代码包以适应多种UNIX类系统的shell脚本的工具。<br />automake是一个从文件Makefile.am自动生成Makefile.in的工具。<br /><br /><strong>安装indent</strong><br />sudo apt-get install indent&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 调整C原始代码文件的格式。<br /><br /><strong>sudo apt-get install libtool</strong><br />GNU libtool 是一个通用库支持脚本，将使用动态库的复杂性隐藏在统一、可移植的接口中。<br /><strong><br />安装文档</strong><br />sudo apt-get install binutils-doc cpp-doc gcc-4.0-doc gcc-doc glibc-doc libstdc++6-4.0-doc stl-manual cpp-4.0-doc<br /><strong><br />安装gvim编辑器</strong><br />&nbsp;&nbsp; apt-get install vim-gtk<br />&nbsp; vim的配置文件网上一大堆，这里不赘述了 </p><p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://yangsq.javaeye.com/blog/160154#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 29 Jan 2008 16:22:09 +0800</pubDate>
        <link>http://yangsq.javaeye.com/blog/160154</link>
        <guid>http://yangsq.javaeye.com/blog/160154</guid>
      </item>
      <item>
        <title>How to use apt-get behind proxy server</title>
        <author>yangsq</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yangsq.javaeye.com">yangsq</a>&nbsp;
          链接：<a href="http://yangsq.javaeye.com/blog/160094" style="color:red;">http://yangsq.javaeye.com/blog/160094</a>&nbsp;
          发表时间: 2008年01月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          (from http://blog.mypapit.net/2006/02/how-to-use-apt-get-behind-proxy-server-ubuntudebian.html)<br /><br />If you are a Debian-based GNU/Linux user, then you&rsquo;re probably familiar with synaptic and apt-get to install application from software repositories. This post focussed on how to use apt-get/synaptic behind proxy server/firewall which under normal circumstances, you&rsquo;re unable to use apt-get.<br /><br /><strong>If you&rsquo;re using Synaptic</strong><br />Open up your Synaptic package manager (usually as root), go to Settings-&gt; Preference -&gt; Network. Enter your proxy server details like : username:password@proxyserver.net, and put the proxy server port (usually 8080).<br /><br /><strong>If you&rsquo;re using command-line apt-get</strong><br />Edit your /etc/bash.bashrc file as root.<br /><br />Put these line at the end of your /etc/bash.bashrc file :<br /><br />export http_proxy=http://username:password@proxyserver.net:port/<br />export ftp_proxy=http://username:password@proxyserver.netport/<br /><br />You can omit the username:password, if your proxy server has no password. That&rsquo;s all for today! Happy apt-get-ing!<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://yangsq.javaeye.com/blog/160094#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 29 Jan 2008 12:37:58 +0800</pubDate>
        <link>http://yangsq.javaeye.com/blog/160094</link>
        <guid>http://yangsq.javaeye.com/blog/160094</guid>
      </item>
      <item>
        <title>MOF - the Meta-Object Facility</title>
        <author>yangsq</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yangsq.javaeye.com">yangsq</a>&nbsp;
          链接：<a href="http://yangsq.javaeye.com/blog/145552" style="color:red;">http://yangsq.javaeye.com/blog/145552</a>&nbsp;
          发表时间: 2007年12月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <h2>MOF - the Meta-Object Facility</h2>
<p>This is probably the least known of the OMG standards, although I personally consider it to be the most important one. MOF is a conceptual framework for describing meta-data. Meta-data is, as the names suggests, data about data. To explain this, consider the following layers: </p>
<p>0. A customer, ACME Corp., has placed an order for 32 boxes of candy on the 23rd of April. <br />
1. A customer has a name and can place zero to n orders, each order having a date and referencing a specfic item that is being sold. <br />
2. Classes have attributes which have a type, and classes can be related to each other. <br />
3. There are things that describe something, and there are connections between those things. <br />
</p>
<p>With numbers increasing, we move away from pure information (level 0) to a model layer (1), to a meta-model layer roughly resembling UML (2), to a meta-meta-model layer representing a way to describe meta-models. </p>
<p>MOF is mainly concerned with level 3, for which it contains a hard-coded set of &quot;things&quot;. (If you're not confused enough already: in fact this layer is a subset of UML. Don't worry, things will hopefully become clearer soon). </p>
<p>So what is MOF? MOF is way to describe meta-models, which in turn describe a specific way to model something. One example of a well-known meta-model is UML. But the separation allows MOF to be independent of UML and support other meta-models as well. MOF is thus a very generic and very powerful framework for expressing model and meta data information. </p>
<p>Apart from being a conceptual framework, MOF also defines a CORBA IDL mapping that specifies how MOF data can be accessed from CORBA applications. With JMI, the Java Metadata Interface, the JCP has just finalized a mapping of these interfaces for the Java language.</p>
<p>copy from <a href="http://www.innoq.com/blog/st/2003/07/mda_from_a_developers_perspective.html">MDA from a Developer's Perspective</a></p>
          <br/>
          <span style="color:red;">
            <a href="http://yangsq.javaeye.com/blog/145552#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 03 Dec 2007 11:26:25 +0800</pubDate>
        <link>http://yangsq.javaeye.com/blog/145552</link>
        <guid>http://yangsq.javaeye.com/blog/145552</guid>
      </item>
      <item>
        <title>python 字符串中的中文识别</title>
        <author>yangsq</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yangsq.javaeye.com">yangsq</a>&nbsp;
          链接：<a href="http://yangsq.javaeye.com/blog/142325" style="color:red;">http://yangsq.javaeye.com/blog/142325</a>&nbsp;
          发表时间: 2007年11月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font size="2">python的中文问题一直是让人不爽的一件事情，而python的一个强大之处恰恰是string的处理，而且string就难免不包含chinese。所以处理string中的chinese就变得很重要了。</font></p>
<p>实验室的complex network项目，目前是数据处理阶段，考虑到python的高效和强大的string功能，我决定使用python对大量的数据进行处理。</p>
<p>下面是一个简单的demo，先贴代码，然后进行说明：</p>
<div class="code_title">python 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-py">
    <li class="alt"><span><span class="comment">#&nbsp;-*-&nbsp;coding:&nbsp;gb18030&nbsp;-*- </span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span></span><span class="keyword">import</span><span>&nbsp;</span><span class="commonlibs">string</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="keyword">import</span><span>&nbsp;</span><span class="commonlibs">re</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>identify&nbsp;=&nbsp;</span><span class="commonlibs">string</span><span>.maketrans('',&nbsp;'') &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>delEStr&nbsp;=&nbsp;</span><span class="commonlibs">string</span><span>.punctuation&nbsp;+&nbsp;'&nbsp;'&nbsp;+&nbsp;</span><span class="commonlibs">string</span><span>.digits&nbsp;&nbsp;</span><span class="comment">#ASCII&nbsp;标点符号，空格和数字 </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>delCStr&nbsp;=&nbsp;'《》（）&amp;%￥</span><span class="comment">#@！{}【】' </span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>s&nbsp;=&nbsp;'中华人民共和国（北京）' &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>s&nbsp;=&nbsp;s.translate(identify,&nbsp;delEStr)&nbsp;</span><span class="comment">#去掉ASCII&nbsp;标点符号和空格 </span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="keyword">if</span><span>&nbsp;</span><span class="commonlibs">re</span><span>.findall('[\x80-\xff].',&nbsp;s):&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">#s为中文 </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;s&nbsp;=&nbsp;s.translate(identify,&nbsp;delCStr) &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;</span><span class="keyword">print</span><span>&nbsp;s &nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="keyword">else</span><span>:&nbsp;</span><span class="comment">#s为英文 </span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">print</span><span>&nbsp;s&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>当然，首先是要import string和re（这里需要正则表达式功能）。</p>
<p>delEStr是一个包含英文标点符号和数字的字符串，就如 <font color="#ff0000">'(){}&lt;&gt;1234 '</font> 这样。delCStr是一个包含中文标点符号的字符串。s是一个测试字符串。</p>
<p>12行的功能就是把s中的英文标点符号都删除。下面一句是关键：</p>
<div class="code_title">python 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-py">
    <li class="alt"><span><span class="commonlibs">re</span><span>.findall('[\x80-\xff].',&nbsp;s)&nbsp;&nbsp;</span></span> </li>
</ol>
</div>
<p>这行代码将返回一个list，如果s中包含中文，则返回一个包含每个汉字的非空的list，如果s中不包含中文，则返回一个空list（即[ ]）。</p>
<p>第14行要删除这个含中文的字符串中的中文标点符号。</p>
<p>运行这段程序，打印出来的是<font color="#ff0000">&ldquo;<font face="Arial">中华人民共和国北</font>&rdquo;</font>，&ldquo;京&rdquo;呢？不见了。这就是python让人头疼的地方。错误出在第14行，可能原因是&ldquo;京&rdquo;的unicode编码和某两个相邻标点的组合编码相同了。<font color="#808000">我现在还没找到好的解决办法</font><img src="/javascripts/fckeditor/editor/images/smiley/msn/sad_smile.gif" alt="" /></p>
<p>这段代码最主要的应用就是translate和findall两个函数，不过在使用translate函数之前要构造一个identify，就像第5行代码那样。</p>
<p>出现了问题是好事，它可以促使自己更加深入的去学习，并且现在处于学习阶段，多遇到问题毕竟是好事，继续学习ing....</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://yangsq.javaeye.com/blog/142325#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 21 Nov 2007 15:42:00 +0800</pubDate>
        <link>http://yangsq.javaeye.com/blog/142325</link>
        <guid>http://yangsq.javaeye.com/blog/142325</guid>
      </item>
      <item>
        <title>XSD to Ecore connection Mapping</title>
        <author>yangsq</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yangsq.javaeye.com">yangsq</a>&nbsp;
          链接：<a href="http://yangsq.javaeye.com/blog/140698" style="color:red;">http://yangsq.javaeye.com/blog/140698</a>&nbsp;
          发表时间: 2007年11月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font size="2">在MBI的intern主题就是做关于Model driven的工作，其中大部分是插件、rcp的开发，用的技术也主要是EMF，GEF和GMF。其中，EMF是基础，领域模型总是要放在最前面。EMF的对建模提供了好几种方式，用UML工具、java annotation，xmi，xsd等。当然，用UML工具，如EclipseUML是最方便的了。可是如果应用要涉及到xml的话，还是用xml schema吧，而且xml schema也是比较简单的。</font></p>
<p><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; 虽然xsd的学习成本不大，不过对于xsd和ecore的映射问题，我感觉还是有必要学一下。因为用xsd gen ecore的话，为了得到一个比较满意的ecore，就要用一些ecore的标签。如果想详细了解xsd 的ecore标签，google一下&ldquo;XML Schema to Ecore Mapping&rdquo;，介绍的比较详细，我这里只想介绍一点关于connection的知识。</font></p>
<p><font size="2">&nbsp;&nbsp;&nbsp;&nbsp; 实际上，从xsd到ecore，大部分的映射还是比较简单的。像<xsd:complextype>直接就映射成EClass了，<xsd:attribute>映射成EAttribute。当然，还可以用还多的限定，这里不说了，还是说说关于connection的东西吧。所谓connection，就是面向对象里的关联，聚集之类的概念。</xsd:attribute></xsd:complextype></font></p>
<p><font size="2"><strong>（1）聚集</strong></font><font size="2">&nbsp; </font></p>
<p><font size="2">A类里有个属性名为container的Elist(注意，如果使用在UML建模的话，以EclipseUML为例，建立关系的时候，要把Property中的Containment设为true)。在xsd里，如何表达这种关系呢。如下：</font></p>
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;</span><strong><span>xsd:complexType&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;A&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></strong></span><strong> </strong></li>
    <li class=""><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">xsd:sequence</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </strong></li>
    <li class="alt"><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">xsd:element</span><span>&nbsp;</span><span class="attribute">maxOccurs</span><span>=</span><span class="attribute-value">&quot;unbounded&quot;</span><span>&nbsp;</span><span class="attribute">minOccurs</span><span>=</span><span class="attribute-value">&quot;0&quot;</span><span>&nbsp;&nbsp;</span> </strong></li>
    <li class=""><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;container&quot;</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;demo:B&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span> </strong></li>
    <li class="alt"><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">xsd:sequence</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></strong></li>
    <li class=""><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">xsd:complexType</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></strong></li>
    <li class="alt"><strong><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </strong></li>
    <li class=""><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">xsd:complexType</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;B&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </strong></li>
    <li class="alt"><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">xsd:complexType</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></strong></li>
</ol>
</div>
<font size="2"></font>
<p><font size="2">和普通的xsd定义没什么区别。</font></p>
<p><font size="2"><strong>（2）关联</strong></font></p>
<p><font size="2"></font></p>
<p><font size="2">对于这种方式的联系，EClass会有EReference生成，EReference是non-containment的，所以就不用设置Containment属性了（默认为false）。xsd定义如下：</font></p>
<div class="code_title">
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">xsd:complexType</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;C&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">xsd:attribute</span><span>&nbsp;</span><span class="attribute">ecore:reference</span><span>=</span><span class="attribute-value">&quot;demo:D&quot;</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;xsd:IDREFS&quot;</span><span>&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;container&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">xsd:complexType</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">xsd:complexType</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;D&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">xsd:complexType</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
</ol>
</div>
</div>
<p>可以看到ecore:reference标签的使用，它会生成一个属性为container的Elist<d></d>。<font face="Arial">type=&quot;xsd:IDREFS&quot;表明0..*。如果<font face="Arial">type=&quot;xsd:anyURI&quot;，则为0..1；<font face="Arial">type=&quot;xsd:IDREF&quot;也为0..1。<font face="Arial">type=&quot;xsd:anyURI&quot;使用了代理，可以关联到不同文档中的其他模型。</font></font></font></font></p>
<p><strong>双向关联</strong></p>
<p>在这种双向关联中，如果使用EclipseUML，在生成的ecore模型中，C中会有一个名称为ds的Elist<d></d>，D中会有一个名称为cs的Elist<c></c>。xsd定义如下：</p>
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;</span><strong><span>xsd:complexType&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;C&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></strong></span><strong> </strong></li>
    <li class=""><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">xsd:attribute</span><span>&nbsp;</span><span class="attribute">ecore:reference</span><span>=</span><span class="attribute-value">&quot;demo:D&quot;</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;xsd:IDREF&quot;</span><span>&nbsp; &nbsp;&nbsp;</span> </strong></li>
    <li class="alt"><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;ds&quot;</span><span>&nbsp;</span><span class="attribute">ecore:opposite</span><span>=</span><span class="attribute-value">&quot;cs&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span> </strong></li>
    <li class=""><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">xsd:complexType</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></strong></li>
    <li class="alt"><strong><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </strong></li>
    <li class=""><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">xsd:complexType</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;D&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </strong></li>
    <li class="alt"><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">xsd:attribute</span><span>&nbsp;</span><span class="attribute">ecore:reference</span><span>=</span><span class="attribute-value">&quot;demo:C&quot;</span><span>&nbsp; &nbsp;&nbsp;</span> </strong></li>
    <li class=""><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;cs&quot;</span><span>&nbsp;</span><span class="attribute">ecore:opposite</span><span>=</span><span class="attribute-value">&quot;ds&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </strong></li>
    <li class="alt"><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">xsd:simpleType</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </strong></li>
    <li class=""><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">xsd:list</span><span>&nbsp;</span><span class="attribute">itemType</span><span>=</span><span class="attribute-value">&quot;xsd:anyURI&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span> </strong></li>
    <li class="alt"><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">xsd:simpleType</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></strong></li>
    <li class=""><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">xsd:attribute</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></strong></li>
    <li class="alt"><strong><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">xsd:complexType</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></strong></li>
</ol>
</div>
<p>可以看出，比较单向关联，双向关联增加了<ecore:opposite>属性。当然，EMF并没有硬性的要求这样做，也就是说，在C和D的xsd定义中，<ecore:opposite>属性是可选的，不过还是建议带上它。</ecore:opposite></ecore:opposite></p>
<p><ecore:opposite><ecore:opposite>最后要说明一些在用xsd建模时需要注意的一些问题：</ecore:opposite></ecore:opposite></p>
<p><ecore:opposite><ecore:opposite>一般情况下，使用GMF是为了开发工具（这种活在MBI很是常见），所以最后的应用就是带一个pallete，还有一些node啊，edge啊之类的东西。所以在使用xsd建立模型的时候，要注意一些ecore标签的使用。例如，如果将来需要生成一个从C到D的edge边，就像上例那样，那么一定要在xsd中使用<ecore:reference>标签，否则会出问题。如果不需要拖拽一天edeg来建立两个node之间的联系，那么<ecore:reference>标签就无所谓了。通俗点说，如果想通过在将来的pallete里拖拽edge来建立两个node之间的联系的话，在定义xsd时，就要使用&lt;xsd:reference&gt;标签。</ecore:reference></ecore:reference></ecore:opposite></ecore:opposite></p>
<p>从我个人来讲，比起EclipseUML，我更喜欢直接定义xsd，再gen model。这样在将来的应用中可以更方便的处理xml了。不过这样也会要缺点，尤其是在用到GMF时，可能会产生一些error。</p>
          <br/>
          <span style="color:red;">
            <a href="http://yangsq.javaeye.com/blog/140698#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 14 Nov 2007 19:58:23 +0800</pubDate>
        <link>http://yangsq.javaeye.com/blog/140698</link>
        <guid>http://yangsq.javaeye.com/blog/140698</guid>
      </item>
      <item>
        <title>Python Database学习</title>
        <author>yangsq</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yangsq.javaeye.com">yangsq</a>&nbsp;
          链接：<a href="http://yangsq.javaeye.com/blog/139345" style="color:red;">http://yangsq.javaeye.com/blog/139345</a>&nbsp;
          发表时间: 2007年11月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font size="2">进行程序设计，很容易用到数据库。最近实验室课题要处理大量的文本数据，于是想到了python，顺便学习一下python的数据库编程。这里只是针对mysql（5.0）和sqlserver（2005）的连接性学习，至于深入的学习，以后再看DBAPI吧。</font></p>
<ul>
    <li><font size="2">Mysql connection test</font> </li>
</ul>
<p><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 和java要下mysql connection driver一样，python也得下driver才能用，python的mysql driver 叫做<font face="Arial">MySQLdb，我在sourceForge上下了一个<font face="Arial">MySQL-python-1.2.2.win32-py2.5.exe。下好后直接安装就行，可能过程中会选择一下python的安装路径。超简单，下面是<font face="Arial"><a href="http://www.devshed.com/">http://www.devshed.com/</a>上copy的一个例子，如下：</font></font></font></font></p>
<div class="code_title">python 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-py">
    <li class="alt"><span><span class="comment">#&nbsp;import&nbsp;mysql&nbsp;module </span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span></span><span class="keyword">import</span><span>&nbsp;MySQLdb &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="comment">#&nbsp;create&nbsp;a&nbsp;connection </span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>db&nbsp;=&nbsp;MySQLdb.connect(host='localhost',&nbsp;</span><span class="commonlibs">user</span><span>='root',&nbsp;passwd='123456',&nbsp;db='test') &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="comment">#&nbsp;create&nbsp;a&nbsp;cursor </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>cursor&nbsp;=&nbsp;db.cursor() &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="comment">#&nbsp;execute&nbsp;sql&nbsp;statement </span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>cursor.execute('</span><span class="commonlibs">select</span><span>&nbsp;*&nbsp;</span><span class="keyword">from</span><span>&nbsp;node') &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="comment">#&nbsp;get&nbsp;result&nbsp;set </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="comment">#&nbsp;fetchall()&nbsp;return&nbsp;a&nbsp;tuple&nbsp;that&nbsp;contains&nbsp;results&nbsp;as&nbsp;tuples </span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="comment">#&nbsp;inner&nbsp;tuple&nbsp;represent&nbsp;a&nbsp;row&nbsp;of&nbsp;the&nbsp;result&nbsp;set </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>result&nbsp;=&nbsp;cursor.fetchall() &nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="keyword">for</span><span>&nbsp;record&nbsp;</span><span class="keyword">in</span><span>&nbsp;result: &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">print</span><span>&nbsp;record &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="comment">#&nbsp;close&nbsp;the&nbsp;connection </span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>db.</span><span class="builtins">close</span><span>()&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>输出结果是：（test是我建的一个测试表，字段有id（主键）、name、gender）</p>
<div class="code_title">sql 代码</div>
<p>&nbsp;</p>
<div class="dp-highlighter">
<ol class="dp-sql">
    <li class="alt"><span><span>&gt;&gt;&gt;&nbsp; &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>(1L,&nbsp;'Jeff',&nbsp;'M') &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>(2L,&nbsp;'Ed',&nbsp;'F') &nbsp;&nbsp;</span> </li>
    <li class=""><span>(3L,&nbsp;'Christiaan',&nbsp;'F') &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>(4L,&nbsp;'yangsq',&nbsp;'M') &nbsp;&nbsp;</span> </li>
    <li class=""><span>(5L,&nbsp;'Adam',&nbsp;'M') &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>(6L,&nbsp;'Cynthia',&nbsp;'M') &nbsp;&nbsp;</span> </li>
    <li class=""><span>(7L,&nbsp;'Joylette',&nbsp;'F') &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>(8L,&nbsp;'Amanda',&nbsp;'M') &nbsp;&nbsp;</span> </li>
    <li class=""><span>(9L,&nbsp;'Nathaniel',&nbsp;'M') &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>(10L,&nbsp;'Bryan',&nbsp;'M')&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>&nbsp;</p>
<ul>
    <li>SqlServer connection test </li>
</ul>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 同样，下driver先，还是sourceForge，名字叫pymssql，我下的是<font face="Arial">pymssql-0.8.0.win32-py2.5.exe，安装和mysql的一样。下面是链接测试代码：</font></p>
<div class="code_title">python 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-py">
    <li class="alt"><span><span class="keyword">import</span><span>&nbsp;pymssql &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>con&nbsp;=&nbsp;pymssql.connect(host='59.64.159.50',&nbsp;</span><span class="commonlibs">user</span><span>='sa',&nbsp;password='admin233',&nbsp;database='test') &nbsp;&nbsp;</span> </li>
    <li class=""><span>cur&nbsp;=&nbsp;con.cursor() &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>query&nbsp;=&nbsp;'</span><span class="commonlibs">select</span><span>&nbsp;top&nbsp;100&nbsp;*&nbsp;</span><span class="keyword">from</span><span>&nbsp;demo' &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>cur.execute(query) &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>result&nbsp;=&nbsp;cur.fetchall() &nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="keyword">for</span><span>&nbsp;record&nbsp;</span><span class="keyword">in</span><span>&nbsp;result: &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">print</span><span>&nbsp;record &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>con.</span><span class="builtins">close</span><span>()&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>上面的代码看起来和mysql的没啥区别，结果就不帖了。</p>
<p>至于其他数据库，还没用到，先不学了。python还提供了更多关于数据库方面的支持，以后再说吧。</p>
          <br/>
          <span style="color:red;">
            <a href="http://yangsq.javaeye.com/blog/139345#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 13 Nov 2007 17:54:00 +0800</pubDate>
        <link>http://yangsq.javaeye.com/blog/139345</link>
        <guid>http://yangsq.javaeye.com/blog/139345</guid>
      </item>
      <item>
        <title>xml schema的几点学习</title>
        <author>yangsq</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yangsq.javaeye.com">yangsq</a>&nbsp;
          链接：<a href="http://yangsq.javaeye.com/blog/138819" style="color:red;">http://yangsq.javaeye.com/blog/138819</a>&nbsp;
          发表时间: 2007年11月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font size="2"><strong>1.</strong> 有时候，我们希望定义的xsd某个元素具有固定的某几个值，这时候可以用&lt;xs:restriction&gt;和&lt;xs:enumeration&gt;这两个标签。例如，定义某个元素，其值只能具有12，456，789这三个中的一个，可以定义如下:</font></p>
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">xs:element</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;DataType&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">xs:simpleType</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">xs:restriction</span><span>&nbsp;</span><span class="attribute">base</span><span>=</span><span class="attribute-value">&quot;xs:string&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">xs:enumeration</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;123&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">xs:enumeration</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;456&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">xs:enumeration</span><span>&nbsp;</span><span class="attribute">value</span><span>=</span><span class="attribute-value">&quot;789&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">xs:restriction</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">xs:simpleType</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">xs:element</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>这样在定义xml文档时，就可以有如下的形式：</p>
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">DataType</span><span class="tag">&gt;</span><span>123</span><span class="tag">&lt;/</span><span class="tag-name">DataType</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span></span><span class="tag">&lt;</span><span class="tag-name">DataType</span><span class="tag">&gt;</span><span>789</span><span class="tag">&lt;/</span><span class="tag-name">DataType</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
</ol>
</div>
<p><strong>2.</strong> 有时候，我们希望xml文件中，父元素的子元素可以是元素A，也可以是元素B。</p>
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">xs:complexType</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;Father&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">xs:choice</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">xs:element</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;ChildA&quot;</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;xs:string&quot; </span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">xs:element</span><span>&nbsp;</span><span class="attribute">name</span><span>=</span><span class="attribute-value">&quot;ChildB&quot;</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">&quot;xs:string&quot;</span><span>&nbsp;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">xs:choice</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">xs:complexType</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>这里关键是&lt;xs:choice&gt;的使用。这样的定义可以使父节点的孩子为A和B的一个排列。</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://yangsq.javaeye.com/blog/138819#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 07 Nov 2007 17:03:55 +0800</pubDate>
        <link>http://yangsq.javaeye.com/blog/138819</link>
        <guid>http://yangsq.javaeye.com/blog/138819</guid>
      </item>
      <item>
        <title>Use Eclipse with keyboard shortcuts</title>
        <author>yangsq</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yangsq.javaeye.com">yangsq</a>&nbsp;
          链接：<a href="http://yangsq.javaeye.com/blog/138011" style="color:red;">http://yangsq.javaeye.com/blog/138011</a>&nbsp;
          发表时间: 2007年11月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font size="2">使用Eclipse可谓是每天的必需之事，个人感觉和Eclipse在一起的时间要比和女友在一起的时间多。既然这样，那就要深入了解一下Eclipse，那么学会使用快捷键就是第一步。平时在使用的时候也使用过一些快捷键，不过还不全面，在加上本人记性不好是，所以就拿这篇blog来做个记事本吧<img src="/javascripts/fckeditor/editor/images/smiley/msn/regular_smile.gif" alt="" /></font></p>
<p><font size="2">在eclipse里，设置快捷键的地方是preferences-&gt;General-&gt;keys，但是我感觉还是使用Eclipse默认的快捷键合适，不要瞎改。下面是一些常用的快捷键</font></p>
<p><font size="2"><font color="#ff0000">Organize Imports</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>Ctrl+Shift+o</strong>（不是0喔）</font></p>
<p><font size="2"><font color="#ff0000">Content Assist</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>Alt+/</strong>（我感觉这个是个万能键）</font></p>
<p><font size="2"><font color="#ff0000">References in Workspace</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>Ctrl+Shilt+G</strong></font></p>
<p><font size="2"><font color="#ff0000">New</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>Ctrl+n</strong> </font></p>
<p><font size="2"><font color="#ff0000">New Menu</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>Alt+Shift+n </strong>（执行完这个组合键，再按c可以创建类，按i可以创建接口）</font></p>
<p><font size="2"><font color="#ff0000">Last Edit Location</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>Ctrl+Q</strong> （上一编辑处）</font></p>
<p><font size="2"><font color="#ff0000">Backward History</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>Alt+Left</strong> （上一浏览处）</font></p>
<p><font size="2"><font color="#ff0000">Forward History</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>Alt+Right</strong>（下一浏览处）</font></p>
<p><font size="2"><font color="#ff0000">Find Next</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>Ctrl+k</strong> （需要首先选中某个单词）</font></p>
<p><font size="2"><font color="#ff0000">Find Previous</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>Ctrl+Shift+K</strong> （需要首先选中某个单词）</font></p>
<p><font size="2"><font color="#ff0000">Format</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>Ctrl+Shift+F</strong></font></p>
<p><font size="2"><font color="#ff0000">Maximize Active View or Editor</font><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ctrl+M</strong></font></p>
<p><font size="2"><font color="#ff0000">Activate Editor</font><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; F12</strong></font></p>
<p><font size="2"><font color="#ff0000">Next Editor</font><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ctrl+F6</strong></font></p>
<p><font size="2"><font color="#ff0000">Next View</font><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ctrl+F7</strong></font></p>
<p><font size="2"><font color="#ff0000">References in Workspace</font><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ctrl+Shift+G</strong></font></p>
<p><font size="2">学到什么，记到什么。</font></p>
          <br/>
          <span style="color:red;">
            <a href="http://yangsq.javaeye.com/blog/138011#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 05 Nov 2007 11:15:19 +0800</pubDate>
        <link>http://yangsq.javaeye.com/blog/138011</link>
        <guid>http://yangsq.javaeye.com/blog/138011</guid>
      </item>
      <item>
        <title>Use prefuse with database</title>
        <author>yangsq</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yangsq.javaeye.com">yangsq</a>&nbsp;
          链接：<a href="http://yangsq.javaeye.com/blog/137867" style="color:red;">http://yangsq.javaeye.com/blog/137867</a>&nbsp;
          发表时间: 2007年11月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font size="2">prefuse是一个非常不错的开源可视化项目，尤其是用在social network/complex network上，个人感觉要比jung好。不过可惜的是，prefuse的user manual还在建设中，并且google resource也少得可怜。好在开源提供了源码，只好看源码了，呵呵。</font></p>
<p><font size="2">prefuse user manual上提供了一个简单的例子，这个例子的数据来自一个符合<font face="Arial">GraphML标准的xml文件（<font face="Arial">socialnet.xml），大致内容如下：</font></font></font></p>
<div class="code_title">xml 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag"><!--sp--><span class="tag-name">xml</span><span>&nbsp;</span><span class="attribute">version</span><span>=</span><span class="attribute-value">&quot;1.0&quot;</span><span>&nbsp;</span><span class="attribute">encoding</span><span>=</span><span class="attribute-value">&quot;UTF-8&quot;</span><span class="tag">?&gt;</span><span>&nbsp;&nbsp;</span></span> </span></li>
    <li class=""><span></span><span class="comments"><!--  An excerpt of an egocentric social network  --></span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="tag">&lt;</span><span class="tag-name">graphml</span><span>&nbsp;</span><span class="attribute">xmlns</span><span>=</span><span class="attribute-value">&quot;http://graphml.graphdrawing.org/xmlns&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">graph</span><span>&nbsp;</span><span class="attribute">edgedefault</span><span>=</span><span class="attribute-value">&quot;undirected&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comments"><!-- data schema --></span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">key</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;name&quot;</span><span>&nbsp;</span><span class="attribute">for</span><span>=</span><span class="attribute-value">&quot;node&quot;</span><span>&nbsp;</span><span class="attribute">attr.name</span><span>=</span><span class="attribute-value">&quot;name&quot;</span><span>&nbsp;</span><span class="attribute">attr.type</span><span>=</span><span class="attribute-value">&quot;string&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">key</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;gender&quot;</span><span>&nbsp;</span><span class="attribute">for</span><span>=</span><span class="attribute-value">&quot;node&quot;</span><span>&nbsp;</span><span class="attribute">attr.name</span><span>=</span><span class="attribute-value">&quot;gender&quot;</span><span>&nbsp;</span><span class="attribute">attr.type</span><span>=</span><span class="attribute-value">&quot;string&quot;</span><span class="tag">/&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comments"><!-- nodes --></span><span>&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">node</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;1&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">data</span><span>&nbsp;</span><span class="attribute">key</span><span>=</span><span class="attribute-value">&quot;name&quot;</span><span class="tag">&gt;</span><span>Jeff</span><span class="tag"><span class="tag-name">data</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">data</span><span>&nbsp;</span><span class="attribute">key</span><span>=</span><span class="attribute-value">&quot;gender&quot;</span><span class="tag">&gt;</span><span>M</span><span class="tag"><span class="tag-name">data</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">node</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">node</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;2&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">data</span><span>&nbsp;</span><span class="attribute">key</span><span>=</span><span class="attribute-value">&quot;name&quot;</span><span class="tag">&gt;</span><span>Ed</span><span class="tag"><span class="tag-name">data</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">data</span><span>&nbsp;</span><span class="attribute">key</span><span>=</span><span class="attribute-value">&quot;gender&quot;</span><span class="tag">&gt;</span><span>M</span><span class="tag"><span class="tag-name">data</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">node</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;........................... &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">edge</span><span>&nbsp;</span><span class="attribute">source</span><span>=</span><span class="attribute-value">&quot;1&quot;</span><span>&nbsp;</span><span class="attribute">target</span><span>=</span><span class="attribute-value">&quot;2&quot;</span><span class="tag">&gt;</span><span class="tag"><span class="tag-name">edge</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">edge</span><span>&nbsp;</span><span class="attribute">source</span><span>=</span><span class="attribute-value">&quot;1&quot;</span><span>&nbsp;</span><span class="attribute">target</span><span>=</span><span class="attribute-value">&quot;3&quot;</span><span class="tag">&gt;</span><span class="tag"><span class="tag-name">edge</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp; ............................ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span><span class="tag"><span class="tag-name">graph</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
    <li class=""><span></span><span class="tag"><span class="tag-name">graphml</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span> </span></li>
</ol>
</div>
<p>大致就是这个样子，程序也比较简单。但是不可能在想要可视化某个社群网络的时候，数据都来自xml，其实大部分还是来自数据库的。prefuse支持从数据库直接获取数据。不过它的user manual上没讲。只好自己探索。</p>
<p>先建立一个在mysql上测试数据库。一个代表节点，一个代表边。</p>
<div class="code_title">sql 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-sql">
    <li class="alt"><span><span class="keyword">DROP</span><span>&nbsp;</span><span class="keyword">TABLE</span><span>&nbsp;IF&nbsp;EXISTS&nbsp;`test`.`node`; &nbsp;&nbsp;</span></span> </li>
    <li class=""><span></span><span class="keyword">CREATE</span><span>&nbsp;</span><span class="keyword">TABLE</span><span>&nbsp;&nbsp;`test`.`node`&nbsp;( &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;`id`&nbsp;</span><span class="keyword">int</span><span>(10)&nbsp;unsigned&nbsp;</span><span class="op">NOT</span><span>&nbsp;</span><span class="op">NULL</span><span>&nbsp;auto_increment, &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;`</span><span class="keyword">name</span><span>`&nbsp;</span><span class="keyword">varchar</span><span>(45)&nbsp;</span><span class="op">NOT</span><span>&nbsp;</span><span class="op">NULL</span><span>, &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;`gender`&nbsp;</span><span class="keyword">varchar</span><span>(45)&nbsp;</span><span class="op">NOT</span><span>&nbsp;</span><span class="op">NULL</span><span>, &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span><span class="keyword">PRIMARY</span><span>&nbsp;</span><span class="keyword">KEY</span><span>&nbsp;&nbsp;(`id`) &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>)&nbsp;ENGINE=InnoDB&nbsp;</span><span class="keyword">DEFAULT</span><span>&nbsp;CHARSET=utf8; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="keyword">DROP</span><span>&nbsp;</span><span class="keyword">TABLE</span><span>&nbsp;IF&nbsp;EXISTS&nbsp;`test`.`edge`; &nbsp;&nbsp;</span> </li>
    <li class=""><span></span><span class="keyword">CREATE</span><span>&nbsp;</span><span class="keyword">TABLE</span><span>&nbsp;&nbsp;`test`.`edge`&nbsp;( &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;`id`&nbsp;</span><span class="keyword">int</span><span>(10)&nbsp;unsigned&nbsp;</span><span class="op">NOT</span><span>&nbsp;</span><span class="op">NULL</span><span>&nbsp;auto_increment, &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;`sid`&nbsp;</span><span class="keyword">int</span><span>(10)&nbsp;unsigned&nbsp;</span><span class="op">NOT</span><span>&nbsp;</span><span class="op">NULL</span><span>, &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;`tid`&nbsp;</span><span class="keyword">int</span><span>(10)&nbsp;unsigned&nbsp;</span><span class="op">NOT</span><span>&nbsp;</span><span class="op">NULL</span><span>, &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span><span class="keyword">PRIMARY</span><span>&nbsp;</span><span class="keyword">KEY</span><span>&nbsp;&nbsp;(`id`) &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>)&nbsp;ENGINE=InnoDB&nbsp;</span><span class="keyword">DEFAULT</span><span>&nbsp;CHARSET=utf8;&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>接下来随便在两个表中插入几条数据，需要注意的是edge表中，sid和tid一定要在node表中存在（即node表中有id与其对应），否则prefuse在读取时会抛出异常。</p>
<p>接下来是程序了：</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;TestMysql&nbsp;{ &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">final</span><span>&nbsp;String&nbsp;driverName&nbsp;&nbsp;&nbsp;=&nbsp;</span><span class="string">&quot;com.mysql.jdbc.Driver&quot;</span><span>; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">final</span><span>&nbsp;String&nbsp;dbURL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;</span><span class="string">&quot;jdbc:mysql://localhost:3306/test&quot;</span><span>; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">final</span><span>&nbsp;String&nbsp;userName&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;</span><span class="string">&quot;root&quot;</span><span>; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">final</span><span>&nbsp;String&nbsp;userPwd&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;</span><span class="string">&quot;123456&quot;</span><span>; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main(String[]&nbsp;args)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DatabaseDataSource&nbsp;datasrc&nbsp;=&nbsp;</span><span class="keyword">null</span><span>; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</span><span>&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//get&nbsp;database&nbsp;connection </span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ff0000">datasrc&nbsp;=&nbsp;ConnectionFactory.getDatabaseConnection( &nbsp;&nbsp;</font></span> </li>
    <li class="alt"><span><font color="#ff0000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;driverName,&nbsp;dbURL,&nbsp;userName,&nbsp;userPwd); &nbsp;&nbsp;</font></span> </li>
    <li class=""><span><font color="#ff0000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</font></span> </li>
    <li class="alt"><font color="#ff0000"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//create&nbsp;a&nbsp;table&nbsp;of&nbsp;data </span><span>&nbsp;&nbsp;</span></font> </li>
    <li class=""><font color="#ff0000"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ff0000">Table&nbsp;nodes&nbsp;=&nbsp;datasrc.getData(</font></span></font><font color="#ff0000"><span class="string"><font color="#ff0000">&quot;select&nbsp;*&nbsp;from&nbsp;node&quot;</font></span><span><font color="#ff0000">)</font>; &nbsp;&nbsp;</span></font> </li>
    <li class="alt"><font color="#ff0000"><font color="#ff0000"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ff0000">Table&nbsp;edges&nbsp;=&nbsp;datasrc.getData(</font></span><span class="string"><font color="#ff0000">&quot;select&nbsp;*&nbsp;from&nbsp;edge</font>&quot;</span></font><span><font color="#ff0000">);</font> &nbsp;&nbsp;</span></font> </li>
    <li class=""><span><font color="#ff0000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</font></span> </li>
    <li class="alt"><font color="#ff0000"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ff0000">Graph&nbsp;graph&nbsp;=&nbsp;</font></span></font><font color="#ff0000"><font color="#ff0000"><span class="keyword">new</span><span>&nbsp;Graph(nodes,&nbsp;edges,&nbsp;</span><span class="keyword">false</span><span>,&nbsp;</span><span class="string">&quot;id&quot;</span><span>,&nbsp;</span><span class="string">&quot;sid&quot;</span><span>,&nbsp;</span></font><span class="string"><font color="#ff0000">&quot;tid</font>&quot;</span></font><span><font color="#ff0000"><font color="#ff0000">)</font>;</font> &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Visualization&nbsp;vis&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Visualization(); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vis.add(</span><span class="string">&quot;graph&quot;</span><span>,&nbsp;graph); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LabelRenderer&nbsp;r&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;LabelRenderer(</span><span class="string">&quot;name&quot;</span><span>); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r.setRoundedCorner(</span><span class="number">8</span><span>,&nbsp;</span><span class="number">8</span><span>); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vis.setRendererFactory(</span><span class="keyword">new</span><span>&nbsp;DefaultRendererFactory(r)); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">int</span><span>[]&nbsp;palette&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;</span><span class="keyword">int</span><span>[]&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ColorLib.rgb(</span><span class="number">255</span><span>,</span><span class="number">180</span><span>,</span><span class="number">180</span><span>),&nbsp;ColorLib.rgb(</span><span class="number">190</span><span>,</span><span class="number">190</span><span>,</span><span class="number">255</span><span>) &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DataColorAction&nbsp;fill&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;DataColorAction(</span><span class="string">&quot;graph.nodes&quot;</span><span>,&nbsp;</span><span class="string">&quot;gender&quot;</span><span>, &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Constants.NOMINAL,&nbsp;VisualItem.FILLCOLOR,&nbsp;palette); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ColorAction&nbsp;textColor&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;ColorAction(</span><span class="string">&quot;graph.nodes&quot;</span><span>, &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VisualItem.TEXTCOLOR,&nbsp;ColorLib.gray(</span><span class="number">0</span><span>)); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ColorAction&nbsp;edgesColor&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;ColorAction(</span><span class="string">&quot;graph.edges&quot;</span><span>, &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VisualItem.STROKECOLOR,&nbsp;ColorLib.gray(</span><span class="number">200</span><span>)); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ActionList&nbsp;color&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;ActionList(); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;color.add(fill); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;color.add(textColor); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;color.add(edgesColor); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ActionList&nbsp;layout&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;ActionList(Activity.INFINITY); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;layout.add(</span><span class="keyword">new</span><span>&nbsp;ForceDirectedLayout(</span><span class="string">&quot;graph&quot;</span><span>)); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;layout.add(</span><span class="keyword">new</span><span>&nbsp;RepaintAction()); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vis.putAction(</span><span class="string">&quot;color&quot;</span><span>,&nbsp;color); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vis.putAction(</span><span class="string">&quot;layout&quot;</span><span>,&nbsp;layout); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Display&nbsp;d&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Display(vis); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d.setSize(</span><span class="number">720</span><span>,&nbsp;</span><span class="number">500</span><span>); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d.addControlListener(</span><span class="keyword">new</span><span>&nbsp;DragControl()); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d.addControlListener(</span><span class="keyword">new</span><span>&nbsp;PanControl()); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d.addControlListener(</span><span class="keyword">new</span><span>&nbsp;ZoomControl()); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d.addControlListener(</span><span class="keyword">new</span><span>&nbsp;NeighborHighlightControl()); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JFrame&nbsp;frame&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;JFrame(</span><span class="string">&quot;haha&quot;</span><span>); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;frame.setSize(</span><span class="number">800</span><span>,&nbsp;</span><span class="number">600</span><span>); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;frame.add(d); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;frame.setVisible(</span><span class="keyword">true</span><span>); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vis.run(</span><span class="string">&quot;color&quot;</span><span>); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vis.run(</span><span class="string">&quot;layout&quot;</span><span>); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(Exception&nbsp;e)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace(); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p><strong>第19行：</strong>生成一个graph对象，这是可视化的关键。graph对象可以有多种生成方式，光是从数据库生成（也可以说是从table生成，应为prefuse从数据库中取出的都封装成Table）就有好几个方式。不过推荐本例的生成方式，提供的信息越多越可以更精确的描述自己。参数意义分别是：节点的Table，边的Table，是否是有向（true有，false无），节点的主键，边中代表源的列名（与edge表中对应），边中代表目标的列名（与edge表中对应）。</p>
<p>其他的就没得说了，和user manual上差不多。个人认为prefuse的另外一个优点是final类比较少，也就是说可扩展性比较强。例如53-56行添加的动作（在prefuse.controls包），我们就可以随意生成自己的Control。</p>
          <br/>
          <span style="color:red;">
            <a href="http://yangsq.javaeye.com/blog/137867#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 04 Nov 2007 11:30:08 +0800</pubDate>
        <link>http://yangsq.javaeye.com/blog/137867</link>
        <guid>http://yangsq.javaeye.com/blog/137867</guid>
      </item>
      <item>
        <title>java中的Observer模式</title>
        <author>yangsq</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yangsq.javaeye.com">yangsq</a>&nbsp;
          链接：<a href="http://yangsq.javaeye.com/blog/135798" style="color:red;">http://yangsq.javaeye.com/blog/135798</a>&nbsp;
          发表时间: 2007年10月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font size="3">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font><font size="2"> java语言里包含了许多对设计模式的直接支持，如command模式，agent模式，observer模式等。虽然java提供的对这些模式的支持很简单，不能满足比较复杂的应用。但在简单的场景下，使用这些类往往能够得到立杆见影的效果。所以，如果没有什么特殊需求，还是最好利用java的这些类。</font></p>
<p><font size="3"><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Observer模式，又称监听模式，观察者模式，是经典设计模式之一（one of GOF）。java语言中，对这种模式支持的类和接口主要有以下几个，全部来自java.beans包：</font></font></p>
<p class="alt"><em><strong><span><span>java.beans.PropertyChangeListener (interface)&nbsp;&nbsp;</span></span> </strong></em></p>
<p class=""><em><strong><span>java.beans.PropertyChangeSupport&nbsp;&nbsp;(class)</span> </strong></em></p>
<p class=""><span><em><strong>java.beans.PropertyChangeEvent&nbsp;(class)</strong></em></span></p>
<ul>
    <li><font size="2"><span><span><strong>java.beans.PropertyChangeListener</strong></span></span></font> </li>
</ul>
<p><font size="2"><span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这是一个接口，很显然，所有实现这个接口的类就是listener啦（或者叫observer），它会对被监听的对象的某些</span></span></font><font size="2"><span><span>变化感兴趣。这个接口就一个方法:</span></span></font></p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;propertyChange(PropertyChangeEvent&nbsp;evt)&nbsp;{ &nbsp;&nbsp;</span></span> </li>
    <li class=""><span></span><span class="comment">//&nbsp;TODO&nbsp;Auto-generated&nbsp;method&nbsp;stub </span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>}&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p>接口定义很简单，作用也很明显。接受一个event（被监听者产生的<font face="Arial">PropertyChangeEvent</font>），然后根据这个event做点反应。</p>
<ul>
    <li>&nbsp; <strong><span><font size="2">java.beans.PropertyChangeSupport&nbsp;</font></span></strong> </li>
</ul>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个类用在被观察者的类里，用来保存注册的观察者，并负责向他们提供被观察者的变化信息。这个类的方法也不多，不过还是只介绍100%用到的，要不脑子就不够使了，呵呵。<font size="2"><span><span></span></span></font></p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;PropertyChangeSupport(Object&nbsp;sourceBean)&nbsp;&nbsp;</span></span> </li>
</ol>
</div>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这是构造函数，参数就是被监听者。PropertyChangeListener一般作为被监听者的一个属性。一般如下使用：</p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">private</span><span>&nbsp;PropertyChangeSupport&nbsp;listeners&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;PropertyChangeSupport(</span><span class="keyword">this</span><span>);&nbsp;&nbsp;</span></span> </li>
</ol>
</div>
<p><span><span><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 注意，这个listeners可不是只代表一个监听者，他可能是一群监听者。那么如何这些listeners是谁呢？这回用到下面的方法了。</font></span></span></p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;addPropertyChangeListener(PropertyChangeListener&nbsp;listener)&nbsp;&nbsp;</span></span> </li>
</ol>
</div>
<p><font size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个类太容易了，把监听者加进来。就像开十七大一样，记者想要采访，就得先登记一下。显然这个方法可以多次调用（add嘛）。有加就有减：</font></p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;removePropertyChangeListener(PropertyChangeListener&nbsp;listener)&nbsp;&nbsp;</span></span> </li>
</ol>
</div>
<p><font size="2">如果这个监听者对被监听者的任何变化多不感兴趣了，就被被监听者赶了出去。</font></p>
<p><font size="2">好了，记者都到齐了，被监听者有变化了就该通知人家了，使用如下方法的一个：</font></p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;firePropertyChange(PropertyChangeEvent&nbsp;evt) &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;firePropertyChange(String&nbsp;propertyName, &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">boolean</span><span>&nbsp;oldValue, &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">boolean</span><span>&nbsp;newValue) &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;firePropertyChange(String&nbsp;propertyName, &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">int</span><span>&nbsp;oldValue, &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">int</span><span>&nbsp;newValue) &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;firePropertyChange(String&nbsp;propertyName, &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;oldValue, &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;newValue)&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p><font size="2">实际上，后三个方法的参数都会封装成<font face="Arial">PropertyChangeEvent，然后调用第一个方法。不过在实际中，我们还是喜欢直接调用后三个中的一个，封装的事我们就不管了。后三个方法的参数都是三个，其中的oldValue和newValue就是改变前后的值，第一个就是给改变一个名字，好让监听者们根据这个名子来做响应。就像开会，政府的所有信息都会被记者听到，但是有的记者只对台湾问题感兴趣，而有的记者对中日问题感兴趣。</font></font></p>
<p><font size="2">对<font face="Arial">PropertyChangeSupport方法的介绍就这么多吧。注意，<font face="Arial">PropertyChangeSupport既然被用到了被观察者的类（一般是一个model）里，那么他的这些方法就只在被观察这里调用。</font></font></font></p>
<ul>
    <li><span><strong><font size="2">java.beans.PropertyChangeEvent</font></strong></span> </li>
</ul>
<p><span><font size="2"><strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </strong>这个类我也懒得介绍，看看他的主要方法就明白怎么回事了</font></span></p>
<span>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;String&nbsp;getPropertyName() &nbsp;&nbsp;</span></span> </li>
    <li class=""><span></span><span class="keyword">public</span><span>&nbsp;Object&nbsp;getNewValue() &nbsp;&nbsp;</span> </li>
    <li class="alt"><span></span><span class="keyword">public</span><span>&nbsp;Object&nbsp;getOldValue()&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p><font size="2">就者三个类，再有就是具体问题具体分析了。来个<font color="#ff0000">例子</font>吧，首先是被观察者：</font></p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;Domain{ &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">protected</span><span>&nbsp;String&nbsp;id; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">protected</span><span>&nbsp;String&nbsp;name; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">protected</span><span>&nbsp;String&nbsp;desName; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">protected</span><span>&nbsp;PropertyChangeSupport&nbsp;listeners&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;PropertyChangeSupport(</span><span class="keyword">this</span><span>); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;String&nbsp;getId()&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;id; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setId(String&nbsp;id)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.id&nbsp;=&nbsp;id; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;firePropertyChange(</span><span class="string">&quot;Domain.id&quot;</span><span>,&nbsp;</span><span class="keyword">null</span><span>,&nbsp;id); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;String&nbsp;getDesName()&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;desName; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setDesName(String&nbsp;desName)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.desName&nbsp;=&nbsp;desName; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;firePropertyChange(</span><span class="string">&quot;Domain.desName&quot;</span><span>,&nbsp;</span><span class="keyword">null</span><span>,&nbsp;desName); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;String&nbsp;getName()&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;name; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;setName(String&nbsp;name)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">this</span><span>.name&nbsp;=&nbsp;name; &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;firePropertyChange(</span><span class="string">&quot;Domain.name&quot;</span><span>,&nbsp;</span><span class="keyword">null</span><span>,&nbsp;name); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;addPropertyChangeListener(PropertyChangeListener&nbsp;listener)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;listeners.addPropertyChangeListener(listener); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;firePropertyChange(String&nbsp;propName,&nbsp;Object&nbsp;oldValue,&nbsp;Object&nbsp;newValue)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;listeners.firePropertyChange(propName,&nbsp;oldValue,&nbsp;newValue); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;removePropertyChangeListener(PropertyChangeListener&nbsp;listener)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;listeners.removePropertyChangeListener(listener); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>}&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p><font size="2">有人对Domain的三个属性感兴趣。下面就是这些人中的一个：</font></p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;SimpleObserver&nbsp;</span><span class="keyword">implements</span><span>&nbsp;PropertyChangeListener&nbsp;{ &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;.... &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="annotation">@Override</span><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;propertyChange(PropertyChangeEvent&nbsp;evt)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(evt.getPropertyName().equals(</span><span class="string">&quot;Domain.name&quot;</span><span>)){ &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//do&nbsp;some&nbsp;work </span><span>&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;</span> </li>
    <li class=""><span>}&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p><font size="2">下面是个简单的测试类：</font></p>
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;SimpleTest{ &nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main(String[]&nbsp;args)&nbsp;{ &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SimpleObserver&nbsp;observer&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;SimpleObserver(); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Domain&nbsp;domain&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Domain(); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;domain.addPropertyChangeListener(observer); &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;domain.setName(</span><span class="string">&quot;yangsq&quot;</span><span>); &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...... &nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span> </li>
    <li class="alt"><span>}&nbsp;&nbsp;</span> </li>
</ol>
</div>
<p><font size="2">很显然，可以观察到SimpleObserver中propertyChange方法的执行。</font></p>
</span>
          <br/>
          <span style="color:red;">
            <a href="http://yangsq.javaeye.com/blog/135798#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 26 Oct 2007 18:03:37 +0800</pubDate>
        <link>http://yangsq.javaeye.com/blog/135798</link>
        <guid>http://yangsq.javaeye.com/blog/135798</guid>
      </item>
      <item>
        <title>How to configure RCP project</title>
        <author>yangsq</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yangsq.javaeye.com">yangsq</a>&nbsp;
          链接：<a href="http://yangsq.javaeye.com/blog/132018" style="color:red;">http://yangsq.javaeye.com/blog/132018</a>&nbsp;
          发表时间: 2007年10月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font size="3" face="Comic Sans MS">When develop a RCP application, we usually configure the needed plugin at the&nbsp;&quot;Dependencies&quot;&nbsp;tab of plugin.xml(Notice: we only talk about plugin in need, but not extension).&nbsp;&nbsp;</font></p>
<p><font size="3" face="Comic Sans MS">Usually&nbsp;when&nbsp;a RCP project is created, there are&nbsp;only&nbsp;two plugin needful, &nbsp;org.eclipse.core.runtime and org.eclipse.ui. After the firt run,&nbsp;&nbsp;open <font face="Courier New">Run-&gt;Open Run Dialog-&gt;Eclipse Application</font>, there will be a <font face="Courier New">&quot;your project name.application&quot;</font> item. Ok, that's just the right.</font></p>
<p><font size="3" face="Comic Sans MS">But along with your development, you may neend some other plugins to support your application, such as org.eclipse.emf.ecore. Then you may&nbsp;open the &quot;Dependencies&quot; tab of plugin.xml and add&nbsp; that plugin. Save it and run the eclipse application, the RCP window can't be opened and the error may be like <font face="Courier New">&quot;Application 'xxx' could not be found in the registry......&quot;,</font> why?</font></p>
<p><font size="3" face="Comic Sans MS">That's not terrible. When a application is started in eclipse, the Run Configuration is very important. That is to say, if a application can't be started or there is some error,&nbsp; you'd better check out it's Run Configuration.</font></p>
<p><font size="3" face="Comic Sans MS">Take the case of a RCP project. If &quot;org.eclipse.emf.ecore&quot; plugin is added&nbsp; through the &quot;Dependencies&quot; tab of plugin.xml, it's actually not be included in its Run Configuration.To handle this type of problem, you should modify it by hand. <font face="Courier New">Run-&gt;Open Run Dialog-&gt;Eclipse Application-&gt;&quot;your project name.application&quot;-&gt;Plug-ins</font> tab, select your plugin, Apply and Run.</font></p>
<p><font size="3" face="Comic Sans MS">If you don't want to configure the Run configuration, there is another way, just delete <font face="Courier New">&quot;your project name.application&quot;</font> item under <font face="Courier New">Run-&gt;Open Run Dialog-&gt;Eclipse Application</font>. Run it and that's maybe useful.</font></p>
          <br/>
          <span style="color:red;">
            <a href="http://yangsq.javaeye.com/blog/132018#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/97' target='_blank'><span style="color:blue;font-weight:bold;">Oracle专区上线，有Oracle最新文章，重要下载及知识库等精彩内容，欢迎访问。</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 15 Oct 2007 18:02:36 +0800</pubDate>
        <link>http://yangsq.javaeye.com/blog/132018</link>
        <guid>http://yangsq.javaeye.com/blog/132018</guid>
      </item>
      <item>
        <title>Configure SSH and Use putty for remote-control</title>
        <author>yangsq</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://yangsq.javaeye.com">yangsq</a>&nbsp;
          链接：<a href="http://yangsq.javaeye.com/blog/131745" style="color:red;">http://yangsq.javaeye.com/blog/131745</a>&nbsp;
          发表时间: 2007年10月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font size="3" face="Comic Sans MS">Firstly, what is SSH?Which is a <font face="Comic Sans MS">abbreviation of &quot;</font>Secure Shell Protocol&quot;, it is a protocol that support remote logon through <font face="Comic Sans MS">insecure network.&nbsp;So, if we want to use putty on a client. we should install that ssh on the server side.</font></font></p>
<p><font size="3" face="Comic Sans MS">1) check the active internet connections</font></p>
<div class="dp-highlighter">
<ol class="dp-sql">
    <li class="alt"><span><span>~#&nbsp;netstat&nbsp;-at&nbsp;&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<p><font size="3" face="Comic Sans MS">The result will be all(-a) the socket using TCP protocol. But there is no socket listening at ssh port (default 22). That is to say, if we run</font></p>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-sql">
    <li class="alt"><span><span>~#&nbsp;netstat&nbsp;-</spa