<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>cn_arthurs</title>
    <description></description>
    <link>http://cn-arthurs.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>cn_arthurs</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://cn-arthurs.javaeye.com">cn_arthurs</a>&nbsp;
          链接：<a href="http://cn-arthurs.javaeye.com/blog/185000" style="color:red;">http://cn-arthurs.javaeye.com/blog/185000</a>&nbsp;
          发表时间: 2008年04月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="java">/**
	 * 根据某年某月某周,获取这个周的开始时间和结束时间
	 * &quot;2008-4-4&quot; 2008年4月份的第4周的每天日期
	 * @throws ParseException 
	 */
	public static void getDaysByWeek(String week) throws ParseException{
		Calendar cal  = Calendar.getInstance();
//		cal.set(GregorianCalendar.DAY_OF_WEEK,GregorianCalendar.MONDAY);
	    SimpleDateFormat format = new SimpleDateFormat(&quot;yyyy-MM-WW&quot;);//年-月-周格式
	    Date d = format.parse(week);
	    SimpleDateFormat format2 = new SimpleDateFormat(&quot;yyyy-MM-dd&quot;);//标准格式
	    Calendar cal2  = Calendar.getInstance();
	    cal2.setTime(d);
//	    cal2.setFirstDayOfWeek(GregorianCalendar.MONDAY);
	    cal2.set(GregorianCalendar.DAY_OF_WEEK,GregorianCalendar.MONDAY);
	    System.out.println(format2.format(cal2.getTime()));
	    cal2.set(GregorianCalendar.DAY_OF_WEEK,GregorianCalendar.TUESDAY);
	    System.out.println(format2.format(cal2.getTime()));
	    cal2.set(GregorianCalendar.DAY_OF_WEEK,GregorianCalendar.WEDNESDAY);
	    System.out.println(format2.format(cal2.getTime()));
	    cal2.set(GregorianCalendar.DAY_OF_WEEK,GregorianCalendar.THURSDAY);
	    System.out.println(format2.format(cal2.getTime()));
	    cal2.set(GregorianCalendar.DAY_OF_WEEK,GregorianCalendar.FRIDAY);
	    System.out.println(format2.format(cal2.getTime()));
	    cal2.set(GregorianCalendar.DAY_OF_WEEK,GregorianCalendar.SATURDAY);
	    System.out.println(format2.format(cal2.getTime()));
	    cal2.add(Calendar.DATE, 1);
	    System.out.println(format2.format(cal2.getTime()));
	}</pre>
&nbsp;
          <br/>
          <span style="color:red;">
            <a href="http://cn-arthurs.javaeye.com/blog/185000#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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 21 Apr 2008 15:46:23 +0800</pubDate>
        <link>http://cn-arthurs.javaeye.com/blog/185000</link>
        <guid>http://cn-arthurs.javaeye.com/blog/185000</guid>
      </item>
      <item>
        <title>jBPM开发入门指南(2) </title>
        <author>cn_arthurs</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://cn-arthurs.javaeye.com">cn_arthurs</a>&nbsp;
          链接：<a href="http://cn-arthurs.javaeye.com/blog/180660" style="color:red;">http://cn-arthurs.javaeye.com/blog/180660</a>&nbsp;
          发表时间: 2008年04月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <h2><a href="http://www.blogjava.net/chengang/archive/2006/08/22/65132.html" id="viewpost1_TitleUrl">jBPM开发入门指南(2) </a></h2><div class="postbody"><h2 style="margin: 12pt 0cm"><span><span style="font-family: Arial">4 </span></span><span style="font-family: 黑体">数据库初始化</span> </h2><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 0cm"><span>jBPM</span> <span style="font-family: 宋体">需要数据库支持，</span> <span>jBPM</span> <span style="font-family: 宋体">会把自己的一个初始化数据存储到数据库，同时工作流的数据也是存储到数据库中的。</span> <span>jBPM</span> <span style="font-family: 宋体">使用</span> <span>Hibernate</span> <span style="font-family: 宋体">来做为自己的存储层，因此只要是</span> <span>Hibernate</span> <span style="font-family: 宋体">支持的数据库，</span> <span>jBPM</span> <span style="font-family: 宋体">也就支持。</span> </p><span>&nbsp; </span><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 0cm"><span style="font-family: 宋体">本文先以</span> <span>MySQL</span> <span style="font-family: 宋体">为例，然后再以</span> <span>Oracle</span> <span style="font-family: 宋体">为例，来谈谈</span> <span>jBPM</span> <span style="font-family: 宋体">的数据库初始化操作。</span> </p><span>&nbsp; </span><p class="a0" style="margin: 6pt 0cm"><span style="font-size: x-small"><span style="background-color: #dddddd"><span style="font-family: 楷体_GB2312">注：在上面的</span> <span>JBoss</span> <span style="font-family: 楷体_GB2312">自带的示例中，并没有设置数据库，那是因为</span> <span>jBPM</span> <span style="font-family: 楷体_GB2312">默认使用的是内存数据库</span> <span>hsqldb</span> <span style="font-family: 楷体_GB2312">。</span> </span></span></p><h3 style="margin: 12pt 0cm 6pt"><span><span style="font-size: small; font-family: 宋体, MS Song">4.1<span>&nbsp; </span>MySQL</span> </span></h3><span>&nbsp; </span><p class="4" style="margin: 6pt 0cm; text-indent: 21pt"><span>1</span> <span style="font-family: 楷体_GB2312">、首先安装</span> <span>MySQL</span> <span style="font-family: 楷体_GB2312">。</span> </p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span>MySQL</span> <span style="font-family: 宋体">的安装比较简单，网上也有很多文章，本文不再赘述。本指南所用</span> <span>MySQL</span> <span style="font-family: 宋体">版本为</span> <span>MySQL 4.1</span> <span style="font-family: 宋体">（</span> <span>for windows</span> <span style="font-family: 宋体">）。再找一个</span> <span>MySQL</span> <span style="font-family: 宋体">客户端，目的是方便查看数据库中的数据，本文推荐使用</span> <span>MySQL</span> <span style="font-family: 宋体">网站上免费提供的&ldquo;</span> <span>MySQL Query Brower</span> <span style="font-family: 宋体">&rdquo;，当然你用其他的客户端也行，比如</span> <span>MySQL-Front</span> <span style="font-family: 宋体">。</span> </p><span>&nbsp; </span><p class="4" style="margin: 6pt 0cm; text-indent: 21pt"><span>2</span> <span style="font-family: 楷体_GB2312">、建库</span> </p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span>MySQL</span> <span style="font-family: 宋体">中创建一个库，库名：</span> <span>jbpm</span> </p><span>&nbsp; </span><p class="4" style="margin: 6pt 0cm; text-indent: 21pt"><span>3</span> <span style="font-family: 楷体_GB2312">、生成建表的</span> <span>SQL</span> <span style="font-family: 楷体_GB2312">语句并建表</span> </p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">将</span> <span>jbpm-starters-kit-3.1.1</span> <span style="font-family: 宋体">下的子目录</span> <span>jbpm</span> <span style="font-family: 宋体">改名为</span> <span>jbpm.3</span> <span style="font-family: 宋体">，否则在执行下面的</span> <span>ant</span> <span style="font-family: 宋体">命令时会报如</span> <span>jbpm.3</span> <span style="font-family: 宋体">目录不存在的错误：</span> </p><div style="border-right: medium none; padding-right: 0cm; border-top: windowtext 1pt solid; padding-left: 0cm; background: #fff4e9; padding-bottom: 1pt; border-left: medium none; padding-top: 1pt; border-bottom: windowtext 1pt solid"><p class="a" style="margin: 0cm 0cm 0pt"><span><span style="font-size: x-small; font-family: Courier New">D:\jbpm-starters-kit-3.1.1\jbpm-db\build.xml:361: The following error occurred while executing this line:</span> </span></p><p class="a" style="margin: 0cm 0cm 0pt"><span><span style="font-size: x-small; font-family: Courier New">D:\jbpm-starters-kit-3.1.1\jbpm-db\build.xml:68: Basedir D:\jbpm-starters-kit-3.1.1\jbpm.3 does not exist</span> </span></p></div><span>&nbsp; </span><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">在</span> <span>DOS</span> <span style="font-family: 宋体">窗下，进入</span> <span>D:\jbpm-starters-kit-3.1.1\jbpm-db</span> <span style="font-family: 宋体">目录，执行如下命令：</span> </p><div style="border-right: medium none; padding-right: 0cm; border-top: windowtext 1pt solid; padding-left: 0cm; background: #fff4e9; padding-bottom: 1pt; border-left: medium none; padding-top: 1pt; border-bottom: windowtext 1pt solid"><p class="a" style="margin: 0cm 0cm 0pt"><span><span style="font-size: x-small; font-family: Courier New">ant mysql.scripts</span> </span></p></div><span>&nbsp; </span><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 0cm"><span style="font-family: 宋体">执行成功后，在</span> <span>D:\jbpm-starters-kit-3.1.1\jbpm-db\build\mysql\scripts</span> <span style="font-family: 宋体">目录里生成了四个</span> <span>sql</span> <span style="font-family: 宋体">文件，它们做什么用的一看名字就知道了。在</span> <span>MySQL</span> <span style="font-family: 宋体">客户端中执行&ldquo;</span> <span>mysql.create.sql</span> <span style="font-family: 宋体">&rdquo;脚本，这样将在</span> <span>jbpm</span> <span style="font-family: 宋体">库中创建一个个的数据表。</span> </p><span>&nbsp; </span><span>&nbsp; </span><h3 style="margin: 12pt 0cm 6pt"><span><span style="font-size: small; font-family: 宋体, MS Song">4.2<span>&nbsp; </span>Oracle</span> </span></h3><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">先安装好</span> <span>Oracle</span> <span style="font-family: 宋体">服务器。我们公司有现存的</span> <span>Oracle</span> <span style="font-family: 宋体">服务器，也提供给了我一个属于我自己的用户名，一登录就可以任意在我的库之下创建表了。所以这一步就省了，没有的自个先装好吧。</span> </p><p class="MsoNormal" style="margin: 0cm 0cm 0pt"><span style="font-family: 宋体">访问</span> <span>Oracle</span> <span style="font-family: 宋体">推荐用&ldquo;</span> <span>PLSQL Developer</span> <span style="font-family: 宋体">&rdquo;。不过要连接</span> <span>Oracle</span> <span style="font-family: 宋体">还要在本机上装上</span> <span>Oracle</span> <span style="font-family: 宋体">自己的客户端程序，里面提供了</span> <span>JDBC</span> <span style="font-family: 宋体">包和一些配置。要连接服务器还得配置一下，我一般都是不用</span> <span>GUI</span> <span style="font-family: 宋体">而直接改</span> <span>tnsnames.ora</span> <span style="font-family: 宋体">文件，在我的电脑里此文件的目录地址是：</span> <span>D:\oracle\ora92\network\ADMIN\tnsnames.ora</span> <span style="font-family: 宋体">，内容如下</span> <span>(</span> <span style="font-family: 宋体">两面有两个配置了</span> <span>)</span> <span style="font-family: 宋体">：</span> </p><div style="border-right: medium none; padding-right: 0cm; border-top: windowtext 1pt solid; padding-left: 0cm; background: #fff4e9; padding-bottom: 1pt; border-left: medium none; padding-top: 1pt; border-bottom: windowtext 1pt solid"><p class="a" style="margin: 0cm 0cm 0pt"><span><span style="font-size: x-small; font-family: Courier New"># TNSNAMES.ORA Network Configuration File: E:\oracle\ora92\network\admin\tnsnames.ora</span> </span></p><p class="a" style="margin: 0cm 0cm 0pt"><span><span style="font-size: x-small; font-family: Courier New"># Generated by Oracle configuration tools.</span> </span></p><span><span style="font-size: x-small; font-family: Courier New">&nbsp;</span> </span><p class="a" style="margin: 0cm 0cm 0pt"><span><span style="font-size: x-small; font-family: Courier New">WXXRDB_192.168.3.2 =</span> </span></p><p class="a" style="margin: 0cm 0cm 0pt"><span><span style="font-size: x-small"><span style="font-family: Courier New"><span>&nbsp; </span>(DESCRIPTION =</span> </span></span></p><p class="a" style="margin: 0cm 0cm 0pt"><span><span style="font-size: x-small"><span style="font-family: Courier New"><span>&nbsp;&nbsp;&nbsp; </span>(ADDRESS_LIST =</span> </span></span></p><p class="a" style="margin: 0cm 0cm 0pt"><span><span style="font-size: x-small"><span style="font-family: Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.3.2)(PORT = 1521))</span> </span></span></p><p class="a" style="margin: 0cm 0cm 0pt"><span><span style="font-size: x-small"><span style="font-family: Courier New"><span>&nbsp;&nbsp;&nbsp; </span>)</span> </span></span></p><p class="a" style="margin: 0cm 0cm 0pt"><span><span style="font-size: x-small"><span style="font-family: Courier New"><span>&nbsp;&nbsp;&nbsp; </span>(CONNECT_DATA =</span> </span></span></p><p class="a" style="margin: 0cm 0cm 0pt"><span><span style="font-size: x-small"><span style="font-family: Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>(SID = wxxrDB)</span> </span></span></p><p class="a" style="margin: 0cm 0cm 0pt"><span><span style="font-size: x-small"><span style="font-family: Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>(SERVER = DEDICATED)</span> </span></span></p><p class="a" style="margin: 0cm 0cm 0pt"><span><span style="font-size: x-small"><span style="font-family: Courier New"><span>&nbsp;&nbsp;&nbsp; </span>)</span> </span></span></p><p class="a" style="margin: 0cm 0cm 0pt"><span><span style="font-size: x-small"><span style="font-family: Courier New"><span>&nbsp; </span>)</span> </span></span></p><span><span style="font-size: x-small; font-family: Courier New">&nbsp;</span> </span><p class="a" style="margin: 0cm 0cm 0pt"><span><span style="font-size: x-small; font-family: Courier New">WXXRDB_192.168.4.2 =</span> </span></p><p class="a" style="margin: 0cm 0cm 0pt"><span><span style="font-size: x-small"><span style="font-family: Courier New"><span>&nbsp; </span>(DESCRIPTION =</span> </span></span></p><p class="a" style="margin: 0cm 0cm 0pt"><span><span style="font-size: x-small"><span style="font-family: Courier New"><span>&nbsp;&nbsp;&nbsp; </span>(ADDRESS_LIST =</span> </span></span></p><p class="a" style="margin: 0cm 0cm 0pt"><span><span style="font-size: x-small"><span style="font-family: Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.4.2)(PORT = 1521))</span> </span></span></p><p class="a" style="margin: 0cm 0cm 0pt"><span><span style="font-size: x-small"><span style="font-family: Courier New"><span>&nbsp;&nbsp;&nbsp; </span>)</span> </span></span></p><p class="a" style="margin: 0cm 0cm 0pt"><span><span style="font-size: x-small"><span style="font-family: Courier New"><span>&nbsp;&nbsp;&nbsp; </span>(CONNECT_DATA =</span> </span></span></p><p class="a" style="margin: 0cm 0cm 0pt"><span><span style="font-size: x-small"><span style="font-family: Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>(SID = wxxrDB)</span> </span></span></p><p class="a" style="margin: 0cm 0cm 0pt"><span><span style="font-size: x-small"><span style="font-family: Courier New"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>(SERVER = DEDICATED)</span> </span></span></p><p class="a" style="margin: 0cm 0cm 0pt"><span><span style="font-size: x-small"><span style="font-family: Courier New"><span>&nbsp;&nbsp;&nbsp; </span>)</span> </span></span></p><p class="a" style="margin: 0cm 0cm 0pt"><span><span style="font-size: x-small"><span style="font-family: Courier New"><span>&nbsp; </span>)</span> </span></span></p></div><span>&nbsp; </span><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 0cm"><span style="font-family: 宋体">前面都是</span> <span>Oracle</span> <span style="font-family: 宋体">的一些知识，不会的</span> <span>Google</span> <span style="font-family: 宋体">一下吧。最后配置好后，用</span> <span>PLSQL Developer</span> <span style="font-family: 宋体">输入你的用户名和密码联接到</span> <span>Oracle</span> <span style="font-family: 宋体">，就算</span> <span>OK</span> <span style="font-family: 宋体">了。</span> </p><span>&nbsp; </span><p class="MsoNormal" style="margin: 0cm 0cm 0pt; text-indent: 0cm"><span style="font-family: 宋体">参考上面</span> <span>MySQL</span> <span style="font-family: 宋体">的步骤，基本一样：</span> </p><p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt; text-indent: -36pt; tab-stops: list 36.0pt"><span><span>（1）<span style="font-family: 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体">将</span> <span>jbpm</span> <span style="font-family: 宋体">改名为</span> <span>jbpm.3</span> </p><p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt; text-indent: -36pt; tab-stops: list 36.0pt"><span><span>（2）<span style="font-family: 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体">再执行</span> <span class="Char"><span style="font-size: 9pt"><span style="font-family: Courier New">ant oracle.scripts</span> </span></span></p><p class="MsoNormal" style="margin: 0cm 0cm 0pt 36pt; text-indent: -36pt; tab-stops: list 36.0pt"><span><span>（3）<span style="font-family: 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-family: 宋体">用</span> <span>jbpm-db\build\oracle\scripts</span> <span style="font-family: 宋体">目录的</span> <span>oracle.create.sql</span> <span style="font-family: 宋体">脚本，在</span> <span>Oracle</span> <span style="font-family: 宋体">中生成</span> <span>jBPM</span> <span style="font-family: 宋体">的所有表。在&ldquo;</span> <span>PLSQL Developer</span> <span style="font-family: 宋体">&rdquo;中可以新建一个</span> <span>Command Windows</span> <span style="font-family: 宋体">窗口然后输入命令：</span> <span>@D:\jbpm-starters-kit-3.1.1\jbpm-db\build\oracle\scripts\oracle.create.sql</span> </p><span>&nbsp;<br /><br /><span style="font-family: 宋体"><strong>作者简介<br /></strong>陈刚，广西桂林人，著作有《Eclipse从入门到精通》<br />您可以通过其博客了解更多信息和文章：</span><a href="http://www.chengang.com.cn/"><span style="color: #000033; font-family: 宋体">http://www.ChenGang.com.cn</span></a> </span></div>
          <br/>
          <span style="color:red;">
            <a href="http://cn-arthurs.javaeye.com/blog/180660#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/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 09 Apr 2008 00:20:04 +0800</pubDate>
        <link>http://cn-arthurs.javaeye.com/blog/180660</link>
        <guid>http://cn-arthurs.javaeye.com/blog/180660</guid>
      </item>
      <item>
        <title>jBPM开发入门指南(1) </title>
        <author>cn_arthurs</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://cn-arthurs.javaeye.com">cn_arthurs</a>&nbsp;
          链接：<a href="http://cn-arthurs.javaeye.com/blog/180659" style="color:red;">http://cn-arthurs.javaeye.com/blog/180659</a>&nbsp;
          发表时间: 2008年04月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <h2><a href="http://www.blogjava.net/chengang/archive/2006/07/13/57986.html" id="viewpost1_TitleUrl">jBPM开发入门指南(1)</a> </h2><div class="postbody"><div class="Section1" style="layout-grid: 15.6pt none"><p class="MsoNormal" style="text-indent: 0cm"><span style="font-family: 宋体">工作流虽然还在不成熟的发展阶段，甚至还没有一个公认的规范标准。但其应用却已经在快速展开，这说明市场对工作流框架的需求是急迫而巨大的。</span> </p><p class="MsoNormal" style="text-indent: 0cm"><span style="font-family: 宋体">我们公司的后台短信管理系统涉及短信编发、领导层层审核等操作，这是一个比较典型的工作流系统。过去我们用的工作流引擎是</span> <span>shark</span> <span style="font-family: 宋体">，然后在使用后发现其过于庞大，后台数据库操作频繁而未进行优化，直接导致的后果就是前台操作缓慢。于是经研究决定，将工作流引擎由</span> <span>shark</span> <span style="font-family: 宋体">换成</span> <span>jBPM</span> <span style="font-family: 宋体">。</span> </p><p class="MsoNormal" style="text-indent: 0cm"><span>jBPM</span> <span style="font-family: 宋体">之前是一个开源软件，后加入</span> <span>JBoss</span> <span style="font-family: 宋体">组织。正好我们公司也是用</span> <span>JBoss</span> <span style="font-family: 宋体">的。不过</span> <span>jBPM</span> <span style="font-family: 宋体">并没有绑定在</span> <span>JBOSS</span> <span style="font-family: 宋体">上，</span> <span>Tomcat</span> <span style="font-family: 宋体">等也可以使用它。</span> </p><p class="MsoNormal" style="text-indent: 0cm"><span>jBPM</span> <span style="font-family: 宋体">的正处在不断发展中，做为开源软件的特点，其设计变化往往很大。所以一些过去的资料可能已经不适用了。于是作者根据自己的使用经验，重新整理出这份文档，以备学习参考。</span> </p><p class="MsoNormal" style="text-indent: 0cm"><span style="font-family: 楷体_GB2312">注：本文使用的</span> <span>jBPM</span> <span style="font-family: 楷体_GB2312">版本为</span> <span>3.1.1</span> </p><h2><span style="font-family: 黑体">环境准备</span> </h2><h3><span>1</span>、安装<span>JDK</span></h3><p class="MsoNormal"><span style="font-family: 宋体">所有</span> <span>JAVA</span> <span style="font-family: 宋体">开发第一个需要安装的，没什么好说的。记得把系统变量</span> <span>JAVA_HOME</span> <span style="font-family: 宋体">设上。</span> </p><h3><span>2</span>、安装<span>Ant</span></h3><p class="MsoNormal" style="text-indent: 0cm"><span>Ant</span> <span style="font-family: 宋体">是使用</span> <span>jBPM</span> <span style="font-family: 宋体">必须的一个工具。</span> <span>jBPM</span> <span style="font-family: 宋体">中的很多操作都要用到</span> <span>Ant</span> <span style="font-family: 宋体">。</span> </p><p class="MsoNormal" style="text-indent: 0cm"><span style="font-family: 宋体">安装方法：</span> </p><p class="MsoNormal" style="text-indent: 0cm"><span style="font-family: 宋体">（</span> <span>1</span> <span style="font-family: 宋体">）先下载：</span> <span><a href="http://archive.apache.org/dist/ant/binaries/">http://archive.apache.org/dist/ant/binaries/</a> </span><span style="font-family: 宋体">，选一个如：</span> <span>apache-ant-1.6.5-bin.zip</span> <span style="font-family: 宋体">。</span> </p><p class="MsoNormal" style="text-indent: 0cm"><span style="font-family: 宋体">（</span> <span>2</span> <span style="font-family: 宋体">）解压到</span> <span>D:\ant</span> <span style="font-family: 宋体">（当然其他目录也可以）。</span> </p><p class="MsoNormal" style="text-indent: 0cm"><span style="font-family: 宋体">（</span> <span>3</span> <span style="font-family: 宋体">）设置如下系统变量：</span> <span>ANT_HOME=d:\ant</span> <span style="font-family: 宋体">。</span> </p><p class="MsoNormal" style="text-indent: 0cm"><span style="font-family: 宋体">（</span> <span>4</span> <span style="font-family: 宋体">）把</span> <span>%ANT_HOME%\bin</span> <span style="font-family: 宋体">加入到系统变量</span> <span>PATH</span> <span style="font-family: 宋体">中。</span> </p><h3><span>3</span>、安装<span>Eclipse</span></h3><p class="MsoNormal" style="text-indent: 0cm"><span>Eclipse</span> <span style="font-family: 宋体">不是开发</span> <span>jBPM</span> <span style="font-family: 宋体">必须的工具，但它是对</span> <span>jBPM</span> <span style="font-family: 宋体">开发很有帮助的工具，特别是</span> <span>jBPM</span> <span style="font-family: 宋体">提供了一个</span> <span>Eclipse</span> <span style="font-family: 宋体">插件用来辅助开发</span> <span>jBPM</span> <span style="font-family: 宋体">。关于</span> <span>Eclipse</span> <span style="font-family: 宋体">的安装不赘述了，本文用的版本是：</span> <span>Eclipse3.2</span> </p><p class="MsoNormal" style="text-indent: 0cm">&nbsp;</p><h2><span style="font-family: 黑体">安装</span> <span>jBPM</span> </h2><p class="MsoNormal" style="text-indent: 0cm"><span>jBPM</span> <span style="font-family: 宋体">的下载地址：</span> <span><a href="http://www.jboss.com/products/jbpm/downloads">http://www.jboss.com/products/jbpm/downloads</a> </span><span style="font-family: 宋体">　</span> </p><p class="a1"><span style="font-size: 7.5pt; font-family: Wingdings">l<span style="font-family: 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>JBoss jBPM</span> <span style="font-family: 宋体">是</span> <span>jBPM</span> <span style="font-family: 宋体">的软件包</span> </p><p class="a1"><span style="font-size: 7.5pt; font-family: Wingdings">l<span style="font-family: 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>JBoss jBPM Starters Kit</span> <span style="font-family: 宋体">　是一个综合包，它包括了</span> <span>jBPM</span> <span style="font-family: 宋体">软件包、开发插件、一个配置好了的基于</span> <span>JBoss</span> <span style="font-family: 宋体">的</span> <span>jBPM</span> <span style="font-family: 宋体">示例、一些数据库配置文件示例。</span> </p><p class="a1"><span style="font-size: 7.5pt; font-family: Wingdings">l<span style="font-family: 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>JBoss jBPM Process Designer Plugin</span> <span style="font-family: 宋体">　是辅助开发</span> <span>jBPM</span> <span style="font-family: 宋体">的</span> <span>Eclipse</span> <span style="font-family: 宋体">插件。</span> </p><p class="a1"><span style="font-size: 7.5pt; font-family: Wingdings">l<span style="font-family: 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>JBoss jBPM BPEL Extension jBPM</span> <span style="font-family: 宋体">关于</span> <span>BPEL</span> <span style="font-family: 宋体">的扩展包</span> </p><p class="a1"><span style="font-family: 宋体">本指南选择下载：</span> <span>JBoss jBPM Starters Kit</span> <span style="font-family: 宋体">。下载后解压到</span> <span>D:\jbpm-starters-kit-3.1</span> <span style="font-family: 宋体">，目录下含有五个子目录：</span> </p><p class="a1"><span style="font-size: 7.5pt; font-family: Wingdings">l<span style="font-family: 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>jbpm</span> <span style="font-family: 宋体">　</span> <span>jBPM</span> <span style="font-family: 宋体">的软件包</span> </p><p class="a1"><span style="font-size: 7.5pt; font-family: Wingdings">l<span style="font-family: 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>jbpm-bpel </span><span style="font-family: 宋体">只含有一个网页</span> </p><p class="a1"><span style="font-size: 7.5pt; font-family: Wingdings">l<span style="font-family: 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>jbpm-db </span><span style="font-family: 宋体">各种数据库</span> <span>hibernate</span> <span style="font-family: 宋体">配置文件示例，有些还包含了相应的</span> <span>jdbc</span> <span style="font-family: 宋体">驱动程序。</span> </p><p class="a1"><span style="font-size: 7.5pt; font-family: Wingdings">l<span style="font-family: 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>jbpm-designer</span> <span style="font-family: 宋体">　辅助开发</span> <span>jBPM</span> <span style="font-family: 宋体">的</span> <span>Eclipse</span> <span style="font-family: 宋体">插件，具体在</span> <span>jbpm-gpd-feature</span> <span style="font-family: 宋体">子目录中</span> </p><p class="a1"><span style="font-size: 7.5pt; font-family: Wingdings">l<span style="font-family: 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span>jbpm-server</span> <span style="font-family: 宋体">　一个已经配置好了的基于</span> <span>JBoss</span> <span style="font-family: 宋体">的</span> <span>jBPM</span> <span style="font-family: 宋体">示例</span> <span>.</span> </p><p class="MsoNormal" style="text-indent: 0cm">&nbsp;</p><h2><span style="font-family: 黑体">感觉下工作流</span> </h2><p class="MsoNormal" style="text-indent: 0cm"><span style="font-family: 宋体">前面我们说了，在</span> <span>JBoss jBPM Starters Kit</span> <span style="font-family: 宋体">的</span> <span>jbpm-server</span> <span style="font-family: 宋体">目录是一个已经配置好的了</span> <span>jBPM</span> <span style="font-family: 宋体">示例，那么让我们来感觉一下</span> <span>jBPM</span> <span style="font-family: 宋体">做出的东西吧。</span> </p><p class="MsoNormal" style="text-indent: 0cm">&nbsp;</p><p class="MsoNormal" style="text-indent: 0cm"><span style="font-family: 宋体">双击</span> <span>jbpm-server</span> <span style="font-family: 宋体">目录下的</span> <span>start.bat</span> <span style="font-family: 宋体">文件，启动</span> <span>JBoss</span> <span style="font-family: 宋体">服务。这时会打开一个</span> <span>DOS</span> <span style="font-family: 宋体">窗口，启动完成后，日志会不断输出，其中最后一句是&ldquo;</span> <span>13:55:39,937 DEBUG [StaticNotifier] going to wait for (CMD_EXECUTOR, java.lang.Object@1df59bd)</span> <span style="font-family: 宋体">&rdquo;，这表示</span> <span>jBPM</span> <span style="font-family: 宋体">在开始工作了，它不断进行轮询。</span> </p><p class="MsoNormal" style="text-indent: 0cm"><span style="font-family: 宋体">打开网页：</span> <span><a href="http://localhost:8080/jbpm/">http://localhost:8080/jbpm/</a> </span><span style="font-family: 宋体">　得到如下画面</span> </p><p class="MsoNormal" style="text-indent: 0cm"><span>&nbsp;<img src="http://www.blogjava.net/images/blogjava_net/chengang/jbpm/20060713_image001.jpg" border="0" height="191" alt="20060713_image001.jpg" width="554" /></span> </p><p class="MsoNormal" style="text-indent: 0cm"><span style="font-family: 宋体">这是一个已经用</span> <span>jBPM</span> <span style="font-family: 宋体">开发好的用户定单流程，具有下单、审核、估价等流程。它所用的数据库是一个内置的数据库。</span> </p><p class="MsoNormal" style="text-indent: 0cm"><span style="font-family: 宋体">以</span> <span>cookie monster</span> <span style="font-family: 宋体">用户登录，选择&ldquo;</span> <span>create new web sale order</span> <span style="font-family: 宋体">&rdquo;可以创建一个定单。如下图所示，在图左边是填写的定单情况，右边一整个定货流程的示意图，红色框表示流程进行到哪一步了。填写好定单好，选择&ldquo;</span> <span>Save and Close Task</span> <span style="font-family: 宋体">&rdquo;，完成定单提交。</span> </p><p class="MsoNormal" style="text-indent: 0cm"><span>&nbsp;<img src="http://www.blogjava.net/images/blogjava_net/chengang/jbpm/20060713_image002.jpg" border="0" height="326" alt="20060713_image002.jpg" width="553" /></span> </p><p class="MsoNormal" style="text-indent: 0cm"><span style="font-family: 宋体">选择右上角的&ldquo;</span> <span>Login as another user</span> <span style="font-family: 宋体">&rdquo;以另外一个用户名</span> <span>ernie</span> <span style="font-family: 宋体">登录。这时可以看到</span> <span>ernie</span> <span style="font-family: 宋体">用户的任务列表中多了一项。</span> </p><p class="MsoNormal" style="text-indent: 0cm"><span>&nbsp;<img src="http://www.blogjava.net/images/blogjava_net/chengang/jbpm/20060713_image003.jpg" border="0" height="302" alt="20060713_image003.jpg" width="489" /></span> </p><p class="MsoNormal" style="text-indent: 0cm"><span style="font-family: 宋体">点进去后，显示如下画面。这个示例对中文的支持不好，全都显示成了</span> <span>unicode</span> <span style="font-family: 宋体">码了。不管这什么多，反正知道是这么回事就行了。在</span> <span>comment</span> <span style="font-family: 宋体">项填写意见，选</span> <span>OK</span> <span style="font-family: 宋体">按钮，进入到下一步。如果选择</span> <span>more info needed</span> <span style="font-family: 宋体">按钮，则打回给</span> <span>cookie monster</span> <span style="font-family: 宋体">用户修改定单。</span> </p><p class="MsoNormal" style="text-indent: 0cm"><span>&nbsp;<img src="http://www.blogjava.net/images/blogjava_net/chengang/jbpm/20060713_image004.jpg" border="0" height="271" alt="20060713_image004.jpg" width="553" /></span> </p><p class="MsoNormal" style="text-indent: 0cm"><span style="font-family: 宋体">下面的流程，这里就不再赘述了。在这个很标准的工作流示例中，我们基本可以看到</span> <span>jBPM</span> <span style="font-family: 宋体">的应用范围还是比较广的。而且从这个示例，我们是看不出有</span> <span>jBPM</span> <span style="font-family: 宋体">的，也就是说</span> <span>jBPM</span> <span style="font-family: 宋体">在后台起着作用。</span> </p><p class="MsoNormal" style="text-indent: 0cm"><span style="font-family: 宋体">从这个例子，还看不出</span> <span>jBPM</span> <span style="font-family: 宋体">的优势。不过，如果在一个流程不确定，经常需要变动的项目中，</span> <span>jBPM</span> <span style="font-family: 宋体">的好处将会显然出来。应用</span> <span>jBPM</span> <span style="font-family: 宋体">后，改变流程只需改变流程描述文件，这将在后面的内容提到。</span> </p><p class="MsoNormal" style="text-indent: 0cm"><span style="font-family: 宋体">这是一个已做好的示例，接下来我们将仿造这个实例来开发一个请假流程。</span></p><p class="MsoNormal" style="text-indent: 0cm">&nbsp;</p><p class="MsoNormal" style="text-indent: 0cm"><span style="font-family: 宋体"><strong>作者简介<br /></strong>陈刚，广西桂林人，著作有《Eclipse从入门到精通》<br />您可以通过其博客了解更多信息和文章：<a href="http://www.chengang.com.cn/"><span style="color: #000033">http://www.chenGang.com.cn</span></a> </span></p></div></div>
          <br/>
          <span style="color:red;">
            <a href="http://cn-arthurs.javaeye.com/blog/180659#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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 09 Apr 2008 00:19:01 +0800</pubDate>
        <link>http://cn-arthurs.javaeye.com/blog/180659</link>
        <guid>http://cn-arthurs.javaeye.com/blog/180659</guid>
      </item>
      <item>
        <title>使用 JFreeChart来创建基于web的图表</title>
        <author>cn_arthurs</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://cn-arthurs.javaeye.com">cn_arthurs</a>&nbsp;
          链接：<a href="http://cn-arthurs.javaeye.com/blog/177888" style="color:red;">http://cn-arthurs.javaeye.com/blog/177888</a>&nbsp;
          发表时间: 2008年03月31日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <table class="no-print" cellspacing="0" border="0" align="right" width="160" cellpadding="0"><tbody><tr><td width="10"><img src="http://www.ibm.com/i/c.gif" height="1" alt="" width="10" /></td><td><table cellspacing="0" border="0" width="150" cellpadding="0"><tbody><tr><td class="v14-header-1-small">文档选项</td></tr></tbody></table><table class="v14-gray-table-border" cellspacing="0" border="0" cellpadding="0"><tbody><tr><td class="no-padding" width="150"><table cellspacing="0" border="0" width="143" cellpadding="0"><img src="http://www.ibm.com/i/c.gif" height="1" alt="" width="8" />  <tbody><tr valign="top"><td width="8"><img src="http://www.ibm.com/i/c.gif" height="1" alt="" width="8" /></td><td width="16"><img src="http://www.ibm.com/i/v14/icons/em.gif" vspace="3" height="16" alt="将此页作为电子邮件发送" width="16" /></td><td width="122"><p><a href="javascript:document.email.submit();" class="smallplainlink"><strong><span style="font-size: x-small; color: #5c81a7">将此页作为电子邮件发送</span></strong></a></p></td></tr></tbody></table></td></tr></tbody></table><!--START RESERVED FOR FUTURE USE INCLUDE FILES--><!-- this content will be automatically generated across all content areas --><!--END RESERVED FOR FUTURE USE INCLUDE FILES--><br /></td></tr></tbody></table><p>级别： 初级</p><p><a href="http://www-128.ibm.com/developerworks/cn/java/l-jfreechart/#author"><span style="color: #996699">刘冬</span></a> (<a href="mailto:winter.lau@163.com?subject=使用 JFreeChart来创建基于web的图表&amp;cc=winter.lau@163.com"><span style="color: #5c81a7">winter.lau@163.com</span></a>), 软件工程师, 珠海市创我科技发展有限公司</p><p>2003 年 9 月 08 日</p><blockquote>WWW的发展使得基于因特网的应用程序不再局限于静态或者简单的动态内容提供。传统的一些以软件包形式发布应用程序例如报表系统等都在逐渐搬到因特网上。但是这两者之间有着天壤之别，虽然对于数据获取、业务处理等方面基本类似，但是最大的差别在于用户界面。为了能在web浏览器上显示要求用户界面使用HTML以及图片的方式来展现数据，而传统的一些利用操作系统本身的控件来开发的用户界面无法适应琳琅满目的客户端，因此在这里也变得无能为力。回到本文的题目上来，为了创建一个可以在web浏览器上查看到图表一般有两种做法：第一种就是使用applet利用java本身对图形的支持来显示一个图表；第二种就是直接在web服务器端生成好图表图片文件后发送给浏览器。第一种方式显然对于客户端要求太高，随着现在主流浏览器放弃对JAVA的支持后，这种方式只适合一些局域网的应用，而对于因特网的环境就显得不太适合。因此我们下面将介绍一个JAVA的图表引擎JFreeChart用来产生基于WEB的图表。</blockquote><!--START RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --><!--END RESERVED FOR FUTURE USE INCLUDE FILES--><p><a name="1"></a><span class="atitle">JFreeChart项目简介</span></p><p>JFreeChart是开放源代码站点SourceForge.net上的一个JAVA项目，它主要用来各种各样的图表，这些图表包括：饼图、柱状图(普通柱状图以及堆栈柱状图)、线图、区域图、分布图、混合图、甘特图以及一些仪表盘等等。这些不同式样的图表基本上可以满足目前的要求。为了减少篇幅本文主要介绍前面三种类型的图表，读者可以触类旁通去开发其他样式的图表。下面几个是JFreeChart产生的这三种类型图表的结果： </p><p><br /><a name="N10050"></a><strong>图1</strong><br /><img src="http://www-128.ibm.com/developerworks/cn/java/l-jfreechart/images/image001.gif" alt="" /> <br /><br /><a name="N1005D"></a><strong>图2</strong><br /><img src="http://www-128.ibm.com/developerworks/cn/java/l-jfreechart/images/image002.gif" alt="" /> <br /><br /><a name="N1006A"></a><strong>图3</strong><br /><img src="http://www-128.ibm.com/developerworks/cn/java/l-jfreechart/images/image003.gif" alt="" /> </p><p>上面的三个图都是表示四个季度的某个产品的销量信息。在继续下面小节之前必须先准备好开发环境，因为是基于WEB浏览器的图表展现，因此需要一个Servlet引擎或者是J2EE应用服务器（例如WebSphere，Tomcat等）。WEB环境的搭建就不累赘了，读者根据喜好自行安装。JFreeChart引擎本身需要到SourceForge.net上下载，地址如下： </p><p><table cellspacing="0" border="0" width="100%" cellpadding="0"><tbody><tr><td class="code-outline"><pre class="displaycode">JFreeChart主页：
        <a href="http://www.jfree.org/jfreechart/index.html"><span style="color: #996699">http://www.jfree.org/jfreechart/index.html</span></a>
JFreeChart下载页面：
        <a href="http://sourceforge.net/projects/jfreechart/"><span style="color: #996699">http://sourceforge.net/projects/jfreechart/</span></a>
				
      </pre></td></tr></tbody></table></p><p>下载的时候需要注意的是必须下载两个文件：JFreeChart以及Jcommon。目前最新配套版本是：JFreeChart 0.9.11 Jcommon 0.8.6 </p><p>这里有点笔者在开发中遇见的问题需要注意的是：在使用Eclipse开发的时候会报一个莫名其妙的错误，错误可能指向某个类文件的第一行。遇到这样的问题一般是因为没有把Jcommon的jar包设置到项目的类路径中的缘故。具体的原因不祥。 </p><p><br /><table cellspacing="0" border="0" width="100%" cellpadding="0"><tbody><tr><td><img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" height="1" alt="" width="100%" /><br /><img src="http://www.ibm.com/i/c.gif" border="0" height="6" alt="" width="8" /></td></tr></tbody></table><table class="no-print" cellspacing="0" border="0" align="right" cellpadding="0"><tbody><tr align="right"><td><img src="http://www.ibm.com/i/c.gif" height="4" alt="" width="100%" /><br /><table cellspacing="0" border="0" cellpadding="0"><tbody><tr><td valign="middle"><img src="http://www.ibm.com/i/v14/icons/u_bold.gif" border="0" height="16" alt="" width="16" /><br /></td><td align="right" valign="top"><a href="http://www-128.ibm.com/developerworks/cn/java/l-jfreechart/#main" class="fbox"><strong><span style="color: #996699">回页首</span></strong></a></td></tr></tbody></table></td></tr></tbody></table><br /></p><p><a name="2"></a><span class="atitle">解读JFreeChart的源码结构</span></p><p>在开始使用JFreeChart之前我们有必要先大概了解一下JFreeChart本身的结构以及它所带一些例子程序，这样有助于我们下一步自行开发。下载JFreeChart包后已经带有非常丰富的例子，因为JFreeChart这个项目本身的使用文档非常少，因此学习它最好的办法就是学习它所带的例子源码。在包org.jfree.chart.demo中有几十个文件用于展示JFreeChart所能支持的所有图表的结果。如果你的JDK是比较新的情况下可能在运行这些例子时会有问题，现象如下： </p><p><table cellspacing="0" border="0" width="100%" cellpadding="0"><tbody><tr><td class="code-outline"><pre class="displaycode">java.lang.UnsatisfiedLinkError: initDDraw
	at sun.awt.windows.Win32OffScreenSurfaceData.initDDraw(Native Method)
	at sun.awt.windows.Win32OffScreenSurfaceData.&lt;clinit&gt;(Win32OffScreenSurfaceData.java:141)
	at sun.awt.Win32GraphicsDevice.&lt;clinit&gt;(Win32GraphicsDevice.java:58)
	at sun.awt.Win32GraphicsEnvironment.makeScreenDevice(Win32GraphicsEnvironment.java:168)
	at sun.java2d.SunGraphicsEnvironment.getScreenDevices(SunGraphicsEnvironment.java:240)
	at sun.awt.Win32GraphicsEnvironment.getDefaultScreenDevice(Win32GraphicsEnvironment.java:61)
	at java.awt.Window.init(Window.java:224)
	at java.awt.Window.&lt;init&gt;(Window.java:268)
	at java.awt.Frame.&lt;init&gt;(Frame.java:398)
	at javax.swing.JFrame.&lt;init&gt;(JFrame.java:198)
	at org.jfree.chart.demo.JFreeChartDemo.&lt;init&gt;(JFreeChartDemo.java:148)
	at org.jfree.chart.demo.JFreeChartDemo.main(JFreeChartDemo.java:285)
Exception in thread &quot;main&quot;
</pre></td></tr></tbody></table></p><p>这个错误是由于新版的Swing大量的使用了微软的DirectDraw的技术来提高画图的性能，而可能你的显卡在这时候会跟你闹点情绪或者显卡本身并不支持这样的一个技术。难道就没有办法了嘛？要解决这个问题也非常简单，我们可以屏蔽掉DirectDraw，不让Swing使用该技术就可以了。在运行这些代码时给虚拟机指定参数-Dsun.java2d.noddraw即可。 </p><p>这时可能你又该纳闷了，不说是基于Web的图表嘛，怎么又扯到Swing上了？这是因为为了使开发者容易上手，无需配置任何运行环境，所以这些例子都是基于GUI方式的用于展现给开发者如果生成一个图表，我们要学习的也就是如何利用这个引擎生成图表而不是怎么来显示一个图表。当我们把生成的图表对象Export到一个图像文件即可在Web上发布。 </p><p>下面我们来介绍JFreeChart中几个核心的对象类：</p><p><table cellspacing="0" border="1" width="100%" cellpadding="5"><tbody><tr bgcolor="#99ccff"><td width="30%">类名</td><td width="70%">类的作用以及简单描述</td></tr><tr><td>JFreeChart</td><td>图表对象，任何类型的图表的最终表现形式都是在该对象进行一些属性的定制。JFreeChart引擎本身提供了一个工厂类用于创建不同类型的图表对象</td></tr><tr><td>XXXXXDataset</td><td>数据集对象，用于提供显示图表所用的数据。根据不同类型的图表对应着很多类型的数据集对象类</td></tr><tr><td>XXXXXPlot</td><td>图表区域对象，基本上这个对象决定着什么样式的图表，创建该对象的时候需要Axis、Renderer以及数据集对象的支持</td></tr><tr><td>XXXXXAxis</td><td>用于处理图表的两个轴：纵轴和横轴</td></tr><tr><td>XXXXXRenderer</td><td>负责如何显示一个图表对象</td></tr><tr><td>XXXXXURLGenerator</td><td>用于生成Web图表中每个项目的鼠标点击链接</td></tr><tr><td>XXXXXToolTipGenerator</td><td>用于生成图象的帮助提示，不同类型图表对应不同类型的工具提示类</td></tr></tbody></table></p><p>基本上我认为JFreeChart项目本身的类结构的设计并不是很好，首先在创建图表的时候用到了大量的工厂方法，这样做虽然可以简化创建图表对象的代码，但是对项目本身或者开发人员来讲自行扩展一种新的图表都仍然是一件很麻烦的事情；其次除图表对象本身外其余的类过于复杂，使用者必须去了解每个类型的图表对象应该对应哪些Axis、Plot、Renderer类，并且必须非常熟悉这些类的构造函数中每个参数的具体含义。这些问题都大大困扰很多初学者。不过，虽然存在很多问题，但是JFreeChart本身仍不失为一个非常优秀的图表引擎，况且项目本身也在逐渐的发展中。 </p><p>在非常简略的介绍了JFreeChart本身的代码结构后，下面我们开始动手试验几个常用的图表并把他们放到web上。 </p><p><br /><table cellspacing="0" border="0" width="100%" cellpadding="0"><tbody><tr><td><img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" height="1" alt="" width="100%" /><br /><img src="http://www.ibm.com/i/c.gif" border="0" height="6" alt="" width="8" /></td></tr></tbody></table><table class="no-print" cellspacing="0" border="0" align="right" cellpadding="0"><tbody><tr align="right"><td><img src="http://www.ibm.com/i/c.gif" height="4" alt="" width="100%" /><br /><table cellspacing="0" border="0" cellpadding="0"><tbody><tr><td valign="middle"><img src="http://www.ibm.com/i/v14/icons/u_bold.gif" border="0" height="16" alt="" width="16" /><br /></td><td align="right" valign="top"><a href="http://www-128.ibm.com/developerworks/cn/java/l-jfreechart/#main" class="fbox"><strong><span style="color: #996699">回页首</span></strong></a></td></tr></tbody></table></td></tr></tbody></table><br /></p><p><a name="3"></a><span class="atitle">使用JFreeChart生成各种样式的图表</span></p><p>限于篇幅的问题我们在这里只实现两种常用的图表，其他类型图表读者可以触类旁通。我们先给出柱状图的实现，饼图的实现再来跟柱状图进行比较。 </p><p><a name="N10101"></a><span class="smalltitle"><strong><span style="font-size: small; font-family: Arial">1 柱状图</span></strong></span></p><p><table cellspacing="0" border="0" width="100%" cellpadding="0"><tbody><tr><td class="code-outline"><pre class="displaycode">package lius.chart.demo;
import java.io.*;
import org.jfree.data.*;
import org.jfree.chart.*;
import org.jfree.chart.plot.*;
/**
 * 该类用于演示最简单的柱状图生成
 * @author Winter Lau
 */
public class BarChartDemo {
	public static void main(String[] args) throws IOException{
		CategoryDataset dataset = getDataSet2();
		JFreeChart chart = ChartFactory.createBarChart3D(
							&quot;水果产量图&quot;, // 图表标题
							&quot;水果&quot;, // 目录轴的显示标签
							&quot;产量&quot;, // 数值轴的显示标签
							dataset, // 数据集
							PlotOrientation.VERTICAL, // 图表方向：水平、垂直
							true, 	// 是否显示图例(对于简单的柱状图必须是false)
							false, 	// 是否生成工具
							false 	// 是否生成URL链接
							);
							
		FileOutputStream fos_jpg = null;
		try {
			fos_jpg = new FileOutputStream(&quot;D:\\fruit.jpg&quot;);
			ChartUtilities.writeChartAsJPEG(fos_jpg,100,chart,400,300,null);
		} finally {
			try {
				fos_jpg.close();
			} catch (Exception e) {}
		}
	}
	/**
	 * 获取一个演示用的简单数据集对象
	 * @return
	 */
	private static CategoryDataset getDataSet() {
		DefaultCategoryDataset dataset = new DefaultCategoryDataset();
		dataset.addValue(100, null, &quot;苹果&quot;);
		dataset.addValue(200, null, &quot;梨子&quot;);
		dataset.addValue(300, null, &quot;葡萄&quot;);
		dataset.addValue(400, null, &quot;香蕉&quot;);
		dataset.addValue(500, null, &quot;荔枝&quot;);
		return dataset;
	}
	/**
	 * 获取一个演示用的组合数据集对象
	 * @return
	 */
	private static CategoryDataset getDataSet2() {
		DefaultCategoryDataset dataset = new DefaultCategoryDataset();
		dataset.addValue(100, &quot;北京&quot;, &quot;苹果&quot;);
		dataset.addValue(100, &quot;上海&quot;, &quot;苹果&quot;);
		dataset.addValue(100, &quot;广州&quot;, &quot;苹果&quot;);
		dataset.addValue(200, &quot;北京&quot;, &quot;梨子&quot;);
		dataset.addValue(200, &quot;上海&quot;, &quot;梨子&quot;);
		dataset.addValue(200, &quot;广州&quot;, &quot;梨子&quot;);
		dataset.addValue(300, &quot;北京&quot;, &quot;葡萄&quot;);
		dataset.addValue(300, &quot;上海&quot;, &quot;葡萄&quot;);
		dataset.addValue(300, &quot;广州&quot;, &quot;葡萄&quot;);
		dataset.addValue(400, &quot;北京&quot;, &quot;香蕉&quot;);
		dataset.addValue(400, &quot;上海&quot;, &quot;香蕉&quot;);
		dataset.addValue(400, &quot;广州&quot;, &quot;香蕉&quot;);
		dataset.addValue(500, &quot;北京&quot;, &quot;荔枝&quot;);
		dataset.addValue(500, &quot;上海&quot;, &quot;荔枝&quot;);
		dataset.addValue(500, &quot;广州&quot;, &quot;荔枝&quot;);
		return dataset;
	}
}
</pre></td></tr></tbody></table></p><p>程序运行结束后生成的图片文件效果如下图所示：</p><p><br /><a name="N10112"></a><strong>图4</strong><br /><img src="http://www-128.ibm.com/developerworks/cn/java/l-jfreechart/images/image004.gif" alt="" /> </p><p>如果是使用简单的数据即使用getDataSet方法获取数据集时产生的图片文件如下：</p><p><br /><a name="N10122"></a><strong>图5</strong><br /><img src="http://www-128.ibm.com/developerworks/cn/java/l-jfreechart/images/image005.gif" alt="" /> </p><p><a name="N1012D"></a><span class="smalltitle"><strong><span style="font-size: small; font-family: Arial">2 饼图</span></strong></span></p><p><strong></strong></p><p>对于饼图而言，数据集的获取用的不是同一个数据集类，另外饼图不支持同一个类别的项目中还有子项目这样的数据。我们只给出创建饼图的代码，至于写图表到一个文件则与柱状图一致，无需重复。 </p><p><table cellspacing="0" border="0" width="100%" cellpadding="0"><tbody><tr><td class="code-outline"><pre class="displaycode">package lius.chart.demo;
import java.io.*;
import org.jfree.data.*;
import org.jfree.chart.*;
/**
 * 用于演示饼图的生成
 * @author Winter Lau
 */
public class PieChartDemo {
	public static void main(String[] args) throws IOException{
		DefaultPieDataset data = getDataSet();
		JFreeChart chart = ChartFactory.createPie3DChart(&quot;水果产量图&quot;,  // 图表标题
		data, 
		true, // 是否显示图例
		false,
		false
		);
		//写图表对象到文件，参照柱状图生成源码
	}
	/**
	 * 获取一个演示用的简单数据集对象
	 * @return
	 */
	private static DefaultPieDataset getDataSet() {
		DefaultPieDataset dataset = new DefaultPieDataset();
		dataset.setValue(&quot;苹果&quot;,100);
		dataset.setValue(&quot;梨子&quot;,200);
		dataset.setValue(&quot;葡萄&quot;,300);
		dataset.setValue(&quot;香蕉&quot;,400);
		dataset.setValue(&quot;荔枝&quot;,500);
		return dataset;
	}
}
</pre></td></tr></tbody></table></p><p>生成的饼图文件效果如下： </p><p><br /><a name="N10141"></a><strong>图6</strong><br /><img src="http://www-128.ibm.com/developerworks/cn/java/l-jfreechart/images/image006.gif" alt="" /> <br /><br /><table cellspacing="0" border="0" width="100%" cellpadding="0"><tbody><tr><td><img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" height="1" alt="" width="100%" /><br /><img src="http://www.ibm.com/i/c.gif" border="0" height="6" alt="" width="8" /></td></tr></tbody></table><table class="no-print" cellspacing="0" border="0" align="right" cellpadding="0"><tbody><tr align="right"><td><img src="http://www.ibm.com/i/c.gif" height="4" alt="" width="100%" /><br /><table cellspacing="0" border="0" cellpadding="0"><tbody><tr><td valign="middle"><img src="http://www.ibm.com/i/v14/icons/u_bold.gif" border="0" height="16" alt="" width="16" /><br /></td><td align="right" valign="top"><a href="http://www-128.ibm.com/developerworks/cn/java/l-jfreechart/#main" class="fbox"><strong><span style="color: #996699">回页首</span></strong></a></td></tr></tbody></table></td></tr></tbody></table><br /></p><p><a name="4"></a><span class="atitle">将生成的图表移到浏览器上</span></p><p>为了将生成的图表直接传给客户端浏览器，只需要将前面两个例子中的文件流换成是通过HttpServletResponse对象获取到的输出流，详细代码清单如下： </p><p><table cellspacing="0" border="0" width="100%" cellpadding="0"><tbody><tr><td class="code-outline"><pre class="displaycode">package lius.chart.demo;
import java.io.IOException;
import javax.servlet.*;
import javax.servlet.http.HttpServlet;
import org.jfree.data.*;
import org.jfree.chart.*;
/**
 * 演示通过servlet直接输出图表
 * @author Winter Lau
 */
public class ChartDemoServlet extends HttpServlet {
	public void service(ServletRequest req, ServletResponse res)
		throws ServletException, IOException 
	{
		res.setContentType(&quot;image/jpeg&quot;);
		DefaultPieDataset data = getDataSet();
		JFreeChart chart = ChartFactory.createPie3DChart(&quot;水果产量图&quot;,
		data,
		true,
		false,
		false
		);
				
		ChartUtilities.writeChartAsJPEG(res.getOutputStream(),
			100,chart,400,300,null);
	}
	/**
	 * 获取一个演示用的简单数据集对象
	 * @return
	 */
	private static DefaultPieDataset getDataSet() {
		DefaultPieDataset dataset = new DefaultPieDataset();
		dataset.setValue(&quot;苹果&quot;,100);
		dataset.setValue(&quot;梨子&quot;,200);
		dataset.setValue(&quot;葡萄&quot;,300);
		dataset.setValue(&quot;香蕉&quot;,400);
		dataset.setValue(&quot;荔枝&quot;,500);
		return dataset;
	}
}
</pre></td></tr></tbody></table><br /><br /><table cellspacing="0" border="0" width="100%" cellpadding="0"><tbody><tr><td><img src="http://www.ibm.com/i/v14/rules/blue_rule.gif" height="1" alt="" width="100%" /><br /><img src="http://www.ibm.com/i/c.gif" border="0" height="6" alt="" width="8" /></td></tr></tbody></table><table class="no-print" cellspacing="0" border="0" align="right" cellpadding="0"><tbody><tr align="right"><td><img src="http://www.ibm.com/i/c.gif" height="4" alt="" width="100%" /><br /><table cellspacing="0" border="0" cellpadding="0"><tbody><tr><td valign="middle"><img src="http://www.ibm.com/i/v14/icons/u_bold.gif" border="0" height="16" alt="" width="16" /><br /></td><td align="right" valign="top"><a href="http://www-128.ibm.com/developerworks/cn/java/l-jfreechart/#main" class="fbox"><strong><span style="color: #996699">回页首</span></strong></a></td></tr></tbody></table></td></tr></tbody></table><br /></p><p><a name="5"></a><span class="atitle">高级主题</span></p><p>很多情况我们不仅仅要求可以在浏览器上显示一个图表，我们更需要客户可以直接在图表上做一下交互的操作，例如获取信息提示，点击图表某个部分进行更详细信息的展示等等。例如前面生成的简单柱状图，用户需要在看到柱状图后点击某种水果例如是苹果即可看到各个地区苹果产量的情况。为此就要求该图形具有交互操作的功能。在HTML中为了让一个图像具有可交互的功能就必须给该图像定义一个Map对象。下表节选一段具有该功能的HTML代码 </p><p><table cellspacing="0" border="0" width="100%" cellpadding="0"><tbody><tr><td class="code-outline"><pre class="displaycode">&lt;MAP NAME=&quot;chartMap&quot;&gt;
&lt;AREA SHAPE=&quot;RECT&quot; COORDS=&quot;81,15,126,254&quot; href=&quot;?series=0&amp;category=100&quot; title=&quot;100 = 7,048&quot; 
	onclick=&quot;javascript:clickChart('100');return false;&quot;&gt;
&lt;AREA SHAPE=&quot;RECT&quot; COORDS=&quot;143,27,188,255&quot; href=&quot;?series=0&amp;category=200&quot; title=&quot;200 = 6,721&quot; 
	onclick=&quot;javascript: clickChart ('200');return false;&quot;&gt;
&lt;AREA SHAPE=&quot;RECT&quot; COORDS=&quot;205,54,250,255&quot; href=&quot;?series=0&amp;category=300&quot; title=&quot;300 = 5,929&quot; 
	onclick=&quot;javascript: clickChart ('300');return false;&quot;&gt;
&lt;AREA SHAPE=&quot;RECT&quot; COORDS=&quot;267,85,312,255&quot; href=&quot;?series=0&amp;category=400&quot; title=&quot;400 = 5,005&quot; 
	onclick=&quot;javascript: clickChart ('400');return false;&quot;&gt;
&lt;AREA SHAPE=&quot;RECT&quot; COORDS=&quot;329,17,374,255&quot; href=&quot;?series=0&amp;category=Diet&quot; title=&quot;Diet = 7,017&quot; onclick=&quot;javascript: 
	clickChart ('Diet');return false;&quot;&gt;
&lt;/MAP&gt;
</pre></td></tr></tbody></table></p><p>由此就产生了一个问题：如果根据一个图像来生成对应的MAP对象。我们回头看看刚才的代码，在创建一个图表对象时候有两个参数，我们举柱状图的例子来讲这两个参数就是ChartFactory. createBarChart3D方法中的最后两个参数，这两个参数的类型都是布尔值。这两个参数意思分别是：是否创建工具提示(tooltip)以及是否生成URL。这两个参数分别对应着MAP中一个AREA的title属性以及href属性。 </p><p>可是我想知道的是怎么来产生这个MAP啊！哈哈，不要着急，JFreeChart已经帮我们做好生成MAP对象的功能。为了生成MAP对象就要引入另外一个对象：ChartRenderingInfo。因为JFreeChart没有直接的方法利用一个图表对象直接生成MAP数据，它需要一个中间对象来过渡，这个对象就是ChartRenderingInfo。下图是生成MAP数据的流程图： </p><p><br /><a name="N1016E"></a><strong>图7</strong><br /><img src="http://www-128.ibm.com/developerworks/cn/java/l-jfreechart/images/image007.gif" alt="" /> </p><p>如上图所示，ChartUtilities类是整个流程的核心，它周围的对象都是一些例如数据对象或者是文件等。这个流程简单描述如下：首先创建一个ChartRenderingInfo对象并在调用ChartUtilities的writeChartAsJPEG时作为最后一个参数传递进去。调用该方法结束后将产生一个图像文件以及一个填充好MAP数据的ChartRenderingInfo对象，有了这个对象我们还是没有办法获取具体的MAP数据，我们还必须借助于ChartUtilities的writeImageMap方法来将ChartRenderingInfo对象读取出来，获取MAP数据的代码片断如下： </p><p><table cellspacing="0" border="0" width="100%" cellpadding="0"><tbody><tr><td class="code-outline"><pre class="displaycode">		PrintWriter w = null;
		FileOutputStream fos_jpg = null;
		FileOutputStream fos_cri = null;
		try{
			//根据不同类型的图表使用不同类，以下是针对饼图的操作
			PiePlot plot = (PiePlot) chart.getPlot();
			plot.setURLGenerator(new StandardPieURLGenerator(url));
			//设置工具提示
		   plot.setToolTipGenerator(new StandardPieToolTipGenerator());
			fos_jpg = new FileOutputStream(&ldquo;d:\\fruit.jpg&rdquo;); 
			ChartUtilities.writeChartAsJPEG(
				fos_jpg,
				100,
				chart,
				400,
				300,
				info);
			fos_cri = new FileOutputStream(__d:\\fruit.map__);
			w = new PrintWriter(fos_cri);
			ChartUtilities.writeImageMap(w, __mapname__, info);
			w.flush();
		}finally{
			try{
				w.close();
			}catch(Exception e){}	
			try{
				fos_cri.close();
			}catch(Exception e){}	
			try{
				fos_jpg.close();
			}catch(Exception e){}
		}
</pre></td></tr></tbody></table></p><p>打开文件D:\fruit.map，文件的内容就是要写到页面上的MAP数据。把生成的图像文件以及MAP数据文件写到页面上即可完成热点图表的功能。至于怎么结合两者之间的关系例如图像的useMap属性值必须与MAP对象的名称结合起来，必须根据实际的应用情况进行相应的处理。笔者建议把二者通过标签库封装起来，图像文件的名称以及MAP对象的名称由标签库统一进行控制，这样可以保证二者的一致性。 </p><p><br /><br />&nbsp;</p><p><a name="resources"></a><span class="atitle">参考资料 </span></p><ul><li><a href="http://www.jfree.org/jfreechart/index.html"><span style="color: #996699">JFreeChart图表引擎首页</span></a> <br /><br /></li><li><a href="http://cewolf.sourceforge.net/"><span style="color: #5c81a7">Cewolf自定义图表标签库</span></a> <br /></li></ul><p><br /><br />&nbsp;</p><p><a name="author"></a><span class="atitle">关于作者</span></p><table cellspacing="0" border="0" width="100%" cellpadding="0"><tbody><tr><td colspan="3"><img src="http://www.ibm.com/i/c.gif" height="5" alt="" width="100%" /></td></tr><tr align="left" valign="top"><td><p>&nbsp;</p></td><td><img src="http://www.ibm.com/i/c.gif" height="5" alt="" width="4" /></td><td width="100%"><p>刘冬，他已经不再叫凤梨罐头了。珠海市创我科技发展有限公司软件工程师，主要从事在J2EE平台上实现商业智能（BI）方面的开发。 <br />联系电话：0756-3377435-383 <br />电子邮件： <a href="mailto:winter.lau@163.com?cc=winter.lau@163.com"><span style="color: #5c81a7">winter.lau@163.com</span></a> </p></td></tr></tbody></table>
          <br/>
          <span style="color:red;">
            <a href="http://cn-arthurs.javaeye.com/blog/177888#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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 31 Mar 2008 01:02:19 +0800</pubDate>
        <link>http://cn-arthurs.javaeye.com/blog/177888</link>
        <guid>http://cn-arthurs.javaeye.com/blog/177888</guid>
      </item>
      <item>
        <title>dhtmlxTree总结</title>
        <author>cn_arthurs</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://cn-arthurs.javaeye.com">cn_arthurs</a>&nbsp;
          链接：<a href="http://cn-arthurs.javaeye.com/blog/142932" style="color:red;">http://cn-arthurs.javaeye.com/blog/142932</a>&nbsp;
          发表时间: 2007年11月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>最近有一个项目需要做到无限级树型菜单,而且要实现右键的功能,经别人的介绍,我接触到了dhtmlxtree,虽然最后并没有使用它,但是我想以后会有机会用的</p>
<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">xml</span><span>&nbsp;</span><span class="attribute">version</span><span>=</span><span class="attribute-value">'1.0'</span><span>&nbsp;</span><span class="attribute">encoding</span><span>=</span><span class="attribute-value">'utf-8'</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">tree</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;0&quot;</span><span>&nbsp;</span><span class="attribute">text</span><span>=</span><span class="attribute-value">&quot;root&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">item</span><span>&nbsp;</span><span class="attribute">text</span><span>=</span><span class="attribute-value">&quot;Books&quot;</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;books&quot;</span><span>&nbsp;</span><span class="attribute">im0</span><span>=</span><span class="attribute-value">&quot;books_close.gif&quot;</span><span>&nbsp;</span><span class="attribute">im1</span><span>=</span><span class="attribute-value">&quot;tombs.gif&quot;</span><span>&nbsp;</span><span class="attribute">im2</span><span>=</span><span class="attribute-value">&quot;tombs.gif&quot;</span><span>&nbsp;</span><span class="attribute">src</span><span>=</span><span class="attribute-value">&quot;http://www.baidu.com&quot;</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">item</span><span>&nbsp;</span><span class="attribute">text</span><span>=</span><span class="attribute-value">&quot;Mystery&nbsp;&amp;amp;&nbsp;Thrillers&quot;</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;mystery&quot;</span><span>&nbsp;</span><span class="attribute">im0</span><span>=</span><span class="attribute-value">&quot;book.gif&quot;</span><span>&nbsp;</span><span class="attribute">im1</span><span>=</span><span class="attribute-value">&quot;books_open.gif&quot;</span><span>&nbsp;</span><span class="attribute">im2</span><span>=</span><span class="attribute-value">&quot;books_close.gif&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">item</span><span>&nbsp;</span><span class="attribute">text</span><span>=</span><span class="attribute-value">&quot;Lawrence&nbsp;Block&quot;</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;lb&quot;</span><span>&nbsp;</span><span class="attribute">im0</span><span>=</span><span class="attribute-value">&quot;book.gif&quot;</span><span>&nbsp;</span><span class="attribute">im1</span><span>=</span><span class="attribute-value">&quot;books_open.gif&quot;</span><span>&nbsp;</span><span class="attribute">im2</span><span>=</span><span class="attribute-value">&quot;book.gif&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;</span><span class="tag">&lt;</span><span class="tag-name">item</span><span>&nbsp;</span><span class="attribute">text</span><span>=</span><span class="attribute-value">&quot;All&nbsp;the&nbsp;Flowers&nbsp;Are&nbsp;Dying&quot;</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;a1&quot;</span><span>&nbsp;</span><span class="attribute">im0</span><span>=</span><span class="attribute-value">&quot;book_titel.gif&quot;</span><span>&nbsp;</span><span class="attribute">im1</span><span>=</span><span class="attribute-value">&quot;book_titel.gif&quot;</span><span>&nbsp;</span><span class="attribute">im2</span><span>=</span><span class="attribute-value">&quot;book_titel.gif&quot;</span><span>&nbsp;&nbsp;</span><span class="attribute">child</span><span>=</span><span class="attribute-value">&quot;1&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;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;/</span><span class="tag-name">item</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">item</span><span>&nbsp;</span><span class="attribute">text</span><span>=</span><span class="attribute-value">&quot;The&nbsp;Burglar&nbsp;on&nbsp;the&nbsp;Prowl&quot;</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;lb_2&quot;</span><span>&nbsp;</span><span class="attribute">im0</span><span>=</span><span class="attribute-value">&quot;book_titel.gif&quot;</span><span>&nbsp;</span><span class="attribute">im1</span><span>=</span><span class="attribute-value">&quot;book_titel.gif&quot;</span><span>&nbsp;</span><span class="attribute">im2</span><span>=</span><span class="attribute-value">&quot;book_titel.gif&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;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">item</span><span>&nbsp;</span><span class="attribute">text</span><span>=</span><span class="attribute-value">&quot;The&nbsp;Plot&nbsp;Thickens&quot;</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;lb_3&quot;</span><span>&nbsp;</span><span class="attribute">im0</span><span>=</span><span class="attribute-value">&quot;book_titel.gif&quot;</span><span>&nbsp;</span><span class="attribute">im1</span><span>=</span><span class="attribute-value">&quot;book_titel.gif&quot;</span><span>&nbsp;</span><span class="attribute">im2</span><span>=</span><span class="attribute-value">&quot;book_titel.gif&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;</span><span class="tag">&lt;</span><span class="tag-name">item</span><span>&nbsp;</span><span class="attribute">text</span><span>=</span><span class="attribute-value">&quot;Grifter's&nbsp;Game&quot;</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;lb_4&quot;</span><span>&nbsp;</span><span class="attribute">im0</span><span>=</span><span class="attribute-value">&quot;book_titel.gif&quot;</span><span>&nbsp;</span><span class="attribute">im1</span><span>=</span><span class="attribute-value">&quot;book_titel.gif&quot;</span><span>&nbsp;</span><span class="attribute">im2</span><span>=</span><span class="attribute-value">&quot;book_titel.gif&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;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="tag">&lt;</span><span class="tag-name">item</span><span>&nbsp;</span><span class="attribute">text</span><span>=</span><span class="attribute-value">&quot;The&nbsp;Burglar&nbsp;Who&nbsp;Thought&nbsp;He&nbsp;Was&nbsp;Bogart&quot;</span><span>&nbsp;</span><span class="attribute">id</span><span>=</span><span class="attribute-value">&quot;lb_5&quot;</span><span>&nbsp;</span><span class="attribute">im0</span><span>=</span><span class="attribute-value">&quot;book_titel.gif&quot;</span><span>&nbsp;</span><span class="attribute">im1</span><span>=</span><span class="attribute-value">&quot;book_titel.gif&quot;</span><span>&nbsp;</span><span class="attribute">im2</span><span>=</span><span class="attribute-value">&quot;book_titel.gif&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;</span><span class="tag">&lt;/</span><span class="tag-name">item</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">item</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">item</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="tag">&lt;/</span><span class="tag-name">tree</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>简单了解下,id就是这个节点ID,text是显示的内容,src是点击时的超链接,有了这个xml文件的结构之后,我们就可以通过页面发出请求访问后台,由后台生成类似的xml的字符串,发送到页面,有页面进行接收处理</p>
<p>在页面中的显示如下</p>
<div class="code_title">js 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-c">
    <li class="alt"><span><span>&lt;link&nbsp;rel=</span><span class="string">&quot;STYLESHEET&quot;</span><span>&nbsp;type=</span><span class="string">&quot;text/css&quot;</span><span>&nbsp;href=</span><span class="string">&quot;../css/dhtmlXTree.css&quot;</span><span>&gt; &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;script&nbsp;src=</span><span class="string">&quot;../js/dhtmlXCommon.js&quot;</span><span>&gt;&lt;/script&gt; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&lt;script&nbsp;src=</span><span class="string">&quot;../js/dhtmlXTree.js&quot;</span><span>&gt;&lt;/script&gt; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>...... &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&lt;div&nbsp;id=</span><span class="string">&quot;treeboxbox_tree&quot;</span><span>&gt;&lt;/div&gt; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&lt;script&gt; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;tree=</span><span class="keyword">new</span><span>&nbsp;dhtmlXTreeObject(</span><span class="string">&quot;treeboxbox_tree&quot;</span><span>,</span><span class="string">&quot;100%&quot;</span><span>,</span><span class="string">&quot;100%&quot;</span><span>,0); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;tree.setImagePath(</span><span class="string">&quot;../imgs/&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;tree.setXMLAutoLoading(</span><span class="string">&quot;http://localhost:8082/jh_directoryManager/tree/treeLoad.do?method=open&quot;</span><span>);&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;tree.loadXML(</span><span class="string">&quot;http://localhost:8082/jh_directoryManager/tree/treeLoad.do?method=init&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;tree.setOnRightClickHandler(viewRight);</span><span class="comment">//设置右键调用方法 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&lt;/script&gt;&nbsp;&nbsp;</span></li>
</ol>
</div>
<p>这里的tree.loadXML说的明白一点,就是页面第一次打开的时候,访问的请求</p>
<p>tree.setXMLAutoLoading是展开树发送的请求</p>
<p>还可以通过查看API定义一些事件处理如</p>
<div class="code_title">js 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-c">
    <li class="alt"><span><span>tree.setOnRightClickHandler(viewRight);</span><span class="comment">//设置右键调用方法</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
<p>这是的意思是说当在树节点上点击右键的时候,会调用viewRight方法</p>
<p>因为在dhtmlxtree中定义右键菜单,我始终没有弄出来,所以最后放弃使用这个工具</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="comment">/** </span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;初始化root表显示根节点使用dhtmlTree </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;mapping </span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;form </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;request </span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;response </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return </span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;ActionForward&nbsp;init(ActionMapping&nbsp;mapping,&nbsp;ActionForm&nbsp;form, &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpServletRequest&nbsp;request,&nbsp;HttpServletResponse&nbsp;response){ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FtpRootPathService&nbsp;ftpRootPathService&nbsp;=&nbsp;(FtpRootPathService)</span><span class="keyword">this</span><span>.getWebApplicationContext().getBean(</span><span class="string">&quot;ftpRootPathService&quot;</span><span>);&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OrganizationService&nbsp;organizationService&nbsp;=&nbsp;(OrganizationService)</span><span class="keyword">this</span><span>.getWebApplicationContext().getBean(</span><span class="string">&quot;organizationService&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="comment">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;list&nbsp;=&nbsp;organizationService.getRootOrgs(); </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="comment">//---&nbsp;测试数据开始&nbsp;&nbsp;&nbsp;&nbsp; </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;list&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;ArrayList(); &nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="comment">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TreeBean&nbsp;bean&nbsp;=&nbsp;new&nbsp;TreeBean(); </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="comment">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bean.setId(&quot;1&quot;);bean.setName(&quot;机构1&quot;);bean.setCount(&quot;10&quot;); </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="comment">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.add(bean); </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="comment">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TreeBean&nbsp;bean2&nbsp;=&nbsp;new&nbsp;TreeBean(); </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="comment">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bean2.setId(&quot;2&quot;);bean2.setName(&quot;机构2&quot;);bean2.setCount(&quot;0&quot;); </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="comment">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.add(bean2); </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="comment">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TreeBean&nbsp;bean4&nbsp;=&nbsp;new&nbsp;TreeBean(); </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="comment">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bean4.setId(&quot;3&quot;);bean4.setName(&quot;机构4&quot;);bean4.setCount(&quot;3&quot;); </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="comment">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list.add(bean4); </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="comment">//---&nbsp;测试数据结束 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.setContentType(</span><span class="string">&quot;text/xml;charset=UTF-8&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.setHeader(</span><span class="string">&quot;Cache-Control&quot;</span><span>,</span><span class="string">&quot;no-cache&quot;</span><span>); &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;System.out.println(createDHTMLXML(</span><span class="string">&quot;0&quot;</span><span>,list));&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.getWriter().print(createDHTMLXML(</span><span class="string">&quot;0&quot;</span><span>,list));</span><span class="comment">//dhtmlxTree方式 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(IOException&nbsp;e)&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace(); &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">return</span><span>&nbsp;</span><span class="keyword">null</span><span>; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">/** </span>&nbsp;</li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;展开子节点处理 </span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;mapping </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;form </span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;request </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;response </span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;ActionForward&nbsp;open(ActionMapping&nbsp;mapping,&nbsp;ActionForm&nbsp;form, &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpServletRequest&nbsp;request,&nbsp;HttpServletResponse&nbsp;response){ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FtpRootPathService&nbsp;ftpRootPathService&nbsp;=&nbsp;(FtpRootPathService)</span><span class="keyword">this</span><span>.getWebApplicationContext().getBean(</span><span class="string">&quot;ftpRootPathService&quot;</span><span>);&nbsp;&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OrganizationService&nbsp;organizationService&nbsp;=&nbsp;(OrganizationService)</span><span class="keyword">this</span><span>.getWebApplicationContext().getBean(</span><span class="string">&quot;organizationService&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.setContentType(</span><span class="string">&quot;text/xml;charset=UTF-8&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.setHeader(</span><span class="string">&quot;Cache-Control&quot;</span><span>,</span><span class="string">&quot;no-cache&quot;</span><span>); &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;&nbsp;&nbsp;String&nbsp;id&nbsp;=&nbsp;request.getParameter(</span><span class="string">&quot;id&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//根据上一级节点,查询该节点下的所有节点及再下一级节点总个数 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;orgList&nbsp;=&nbsp;organizationService.getOrgChilds(id); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="comment">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringBuffer&nbsp;sb&nbsp;=&nbsp;new&nbsp;StringBuffer(); </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="comment">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(&quot;&lt;?xml&nbsp;version='1.0'&nbsp;encoding='utf-8'?&gt;\n&quot;); </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="comment">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(&quot;&lt;tree&nbsp;id=\&quot;&quot;+id+&quot;\&quot;&gt;\n&quot;); </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="comment">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(int&nbsp;i=0;i&lt;4;i++){ </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="comment">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(&quot;&lt;item&nbsp;text=\&quot;&quot;+id+&quot;_&quot;+i+&quot;\&quot;&nbsp;id=\&quot;&quot;+id+&quot;_&quot;+i+&quot;\&quot;&nbsp;im0=\&quot;books_close.gif\&quot;&nbsp;im1=\&quot;tombs.gif\&quot;&nbsp;im2=\&quot;tombs.gif\&quot;&nbsp;child=\&quot;1\&quot;&gt;&lt;/item&gt;\n&quot;); </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="comment">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="comment">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sb.append(&quot;&lt;/tree&gt;&quot;); </span><span>&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;System.out.println(createDHTMLXML(id,orgList)); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;response.getWriter().print(createDHTMLXML(id,orgList)); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(IOException&nbsp;e)&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace(); &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">return</span><span>&nbsp;</span><span class="keyword">null</span><span>; &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></span><span class="comment">/** </span>&nbsp;</li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;生成dhtmlTree的xml文件 </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;rootList </span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">public</span><span>&nbsp;String&nbsp;createDHTMLXML(String&nbsp;id,List&nbsp;rootList){ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringBuffer&nbsp;buffer&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;StringBuffer(); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buffer.append(</span><span class="string">&quot;&lt;?xml&nbsp;version='1.0'&nbsp;encoding='utf-8'?&gt;\n&lt;tree&nbsp;id=\&quot;&quot;</span><span>+id+</span><span class="string">&quot;\&quot;&gt;\n&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">for</span><span>(</span><span class="keyword">int</span><span>&nbsp;i=</span><span class="number">0</span><span>;i&lt;rootList.size();i++){ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TreeBean&nbsp;bean&nbsp;=&nbsp;(TreeBean)rootList.get(i); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//添加主目录 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buffer.append(</span><span class="string">&quot;\t&lt;item&nbsp;text=\&quot;&quot;</span><span>+bean.getName()+</span><span class="string">&quot;\&quot;&nbsp;id=\&quot;&quot;</span><span>+bean.getId()+</span><span class="string">&quot;\&quot;&nbsp;im0=\&quot;books_close.gif\&quot;&nbsp;im1=\&quot;tombs.gif\&quot;&nbsp;im2=\&quot;tombs.gif\&quot;&nbsp;&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;</span><span class="comment">//判断是否有子节点,有的话,虚拟一个,强制页面显示有子节点样式 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>(!bean.getCount().equals(</span><span class="string">&quot;0&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;buffer.append(</span><span class="string">&quot;&nbsp;child=\&quot;1\&quot;&quot;</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;buffer.append(</span><span class="string">&quot;&gt;\n&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buffer.append(</span><span class="string">&quot;\t&lt;/item&gt;\n&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="comment">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buffer.append(&quot;&lt;item&nbsp;text=&quot;+id+&quot;_&quot;+i+&quot;&nbsp;id=&quot;+id+&quot;_&quot;+i+&quot;&nbsp;&nbsp;im0=\&quot;books_close.gif\&quot;&nbsp;im1=\&quot;tombs.gif\&quot;&nbsp;im2=\&quot;tombs.gif\&quot;&gt;&lt;/item&gt;&quot;); </span><span>&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;&nbsp;&nbsp;buffer.append(</span><span class="string">&quot;&lt;/tree&gt;&nbsp;&quot;</span><span>); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;buffer.toString(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li>
</ol>
</div>
结语:如果哪位高手在dhtmlxtree中加入了右键菜单,还望不吝赐教
          <br/>
          <span style="color:red;">
            <a href="http://cn-arthurs.javaeye.com/blog/142932#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/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 23 Nov 2007 09:41:42 +0800</pubDate>
        <link>http://cn-arthurs.javaeye.com/blog/142932</link>
        <guid>http://cn-arthurs.javaeye.com/blog/142932</guid>
      </item>
      <item>
        <title>java实现网卡数据包抓取学习</title>
        <author>cn_arthurs</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://cn-arthurs.javaeye.com">cn_arthurs</a>&nbsp;
          链接：<a href="http://cn-arthurs.javaeye.com/blog/131902" style="color:red;">http://cn-arthurs.javaeye.com/blog/131902</a>&nbsp;
          发表时间: 2007年10月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>Windows:<br />
1: 下载jdk6后，双击安装<br />
2:下载JpcapSetup-0.7.exe，双击安装，下载WinPcap_4_0_1.exe，双击安装<br />
3:下载JpcapDumper-src.zip，解压缩<br />
4:启动eclipse，新建一个java项目，选择从已有的源代码创建工程，将刚才的解压缩目录选上，其他的要填写的内容不再说了<br />
5:找到新创建的工程的main()函数，run，可以用了。<br />
6:按理说到上面为止就可以了，但我的不知道为什么不可以，所以只好手动添加一下，在新建的项目上点击右键，propertise-&gt;java build path-&gt;libraries，选择add external jars，把刚才安装的jpcapsetup生成的jpcap.jar选上，OK。<br />
<br />
<br />
Linux:<br />
1:下载jdk6后，双击安装，或者./jdk-6u2-linux-i586-rpm.bin<br />
2:下载jpcap-0.7-1.i386.rpm，双击安装（如果想卸载的话rpm -e jpcap）<br />
3:下载libpcap-0.9.7.tar.gz，解压缩，./configure -&gt; make -&gt; make install<br />
4:下载JpcapDumper-src.zip，解压缩<br />
5:本步骤跟Widows下的一样了，参考执行吧<br />
<br />
至此java环境下的抓包环境就搭建好了，不过要特撇说明的是，一定要用jdk6，因为用jdk6会省去我们很多麻烦事，以前的jdk版本不是不可以用，而是如果用以前的就还要修改很多地方，比如classpath，所以还是用jdk6最好。<br />
</p>
<p>以上转载自:<font face="Arial">http://blog.csdn.net/zcy618/archive/2007/08/15/1745750.aspx</font></p>
<p>&nbsp;学习资料:</p>
<p><font face="Arial"><a href="http://tag.csdn.net/tag/jpcap.xml">http://tag.csdn.net/tag/jpcap.xml</a></font></p>
<p>下载:</p>
<p><font face="Arial"><a href="http://netresearch.ics.uci.edu/kfujii/jpcap/doc/download.html">http://netresearch.ics.uci.edu/kfujii/jpcap/doc/down</a></font><font face="Arial">load.html</font><span><span></span></span></p>
          <br/>
          <span style="color:red;">
            <a href="http://cn-arthurs.javaeye.com/blog/131902#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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 15 Oct 2007 11:36:49 +0800</pubDate>
        <link>http://cn-arthurs.javaeye.com/blog/131902</link>
        <guid>http://cn-arthurs.javaeye.com/blog/131902</guid>
      </item>
      <item>
        <title>spring框架中执行可修改的定时任务</title>
        <author>cn_arthurs</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://cn-arthurs.javaeye.com">cn_arthurs</a>&nbsp;
          链接：<a href="http://cn-arthurs.javaeye.com/blog/131093" style="color:red;">http://cn-arthurs.javaeye.com/blog/131093</a>&nbsp;
          发表时间: 2007年10月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>最近做了一个用java实现oracle备份的业务实现,现理清一下思路,做个备份^_^</p>
<p>业务难点:</p>
<p>1.由于要执行的定时任务是可以修改的,也就是动态的,用户可以选择是否要执行自动备份,什么时候备份,间隔多长时间备份一次</p>
<p>首先考虑到用quartz,但是quartz是需要配置的,而且用户如果不想要自动备份需要停止的时候,如果只单单使用quartz是很难办到的,在得到了众多网友的帮助下,终于想通了</p>
<p>思路如下:</p>
<p>使用quartz定义每隔一小时,查询一遍数据库autodb表,autodb表中仅有一条记录,</p>
<p><font face="Arial">create table AUTODB<br />
(<br />
&nbsp; ID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NUMBER(10) not null,<br />
&nbsp; ISAUTO&nbsp;&nbsp;&nbsp;&nbsp; CHAR(1) default 0,<br />
&nbsp; NEXTTIME&nbsp;&nbsp; DATE,<br />
&nbsp; TYPE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NUMBER(1) default 1,<br />
&nbsp; CYC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NUMBER(2) default 1,<br />
&nbsp; HOUR&nbsp;&nbsp;&nbsp;&nbsp; NUMBER(2) default 0,<br />
&nbsp; MINUTE&nbsp;&nbsp; NUMBER(2) default 0,<br />
&nbsp; constraint PK_AUTODB primary key (ID)<br />
);<br />
insert into AUTODB(id,isauto,type,cyc) values(1,0,1,1);</font></p>
<p>未写完,....</p>
          <br/>
          <span style="color:red;">
            <a href="http://cn-arthurs.javaeye.com/blog/131093#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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 11 Oct 2007 15:52:04 +0800</pubDate>
        <link>http://cn-arthurs.javaeye.com/blog/131093</link>
        <guid>http://cn-arthurs.javaeye.com/blog/131093</guid>
      </item>
      <item>
        <title>Vector还是ArrayList这是个问题[转载]</title>
        <author>cn_arthurs</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://cn-arthurs.javaeye.com">cn_arthurs</a>&nbsp;
          链接：<a href="http://cn-arthurs.javaeye.com/blog/127786" style="color:red;">http://cn-arthurs.javaeye.com/blog/127786</a>&nbsp;
          发表时间: 2007年09月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>要回答这个问题不能一概而论，有时候使用Vector比较好；有时是ArrayList，有时候这两个都不是最好的选择。你别指望能够获得一个简单肯定答案，因为这要看你用它们干什么。下面有4个要考虑的因素：<br />
l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;API<br />
l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;同步处理<br />
l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;数据增长性<br />
l&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;使用模式<br />
下面针对这4个方面进行一一探讨<br />
<strong>API </strong><br />
在由Ken Arnold等编著的《Java Programming Language》(Addison-Wesley, June 2000)一书中有这样的描述，Vector类似于ArrayList.。所有从API的角度来看这两个类非常相<strong>似。但他们之间也还是有一些主要的区别的。<br />
<br />
[b]同步性</strong><br />
Vector是同步的。这个类中的一些方法保证了Vector中的对象是线程安全的。而ArrayList则是异步的，因此ArrayList中的对象并不是线程安全的。因为同步的要求会影响执行的效率，所以如果你不需要线程安全的集合那么使用ArrayList是一个很好的选择，这样可以避免由于同步带来的不必要的性能开销。<br />
<strong>数据增长</strong><br />
从内部实现机制来讲ArrayList和Vector都是使用数组(Array)来控制集合中的对象。当你向这两种类型中增加元素的时候，如果元素的数目超出了内部数组目前的长度它们都需要扩展内部数组的长度，Vector缺省情况下自动增长原来一倍的数组长度，ArrayList是原来的50%,所以最后你获得的这个集合所占的空间总是比你实际需要的要大。所以如果你要在集合中保存大量的数据那么使用Vector有一些优势，因为你可以通过设置集合的初始化大小来避免不必要的资源开销。<br />
<strong>使用模式</strong><br />
在ArrayList和Vector中，从一个指定的位置（通过索引）查找数据或是在集合的末尾增加、移除一个元素所花费的时间是一样的，这个时间我们用O(1)表示。但是，如果在集合的其他位置增加或移除元素那么花费的时间会呈线形增长：O(n-i)，其中n代表集合中元素的个数，i代表元素增加或移除元素的索引位置。为什么会这样呢？以为在进行上述操作的时候集合中第i和第i个元素之后的所有元素都要执行位移的操作。这一切意味着什么呢？<br />
这意味着，你只是查找特定位置的元素或只在集合的末端增加、移除元素，那么使用Vector或ArrayList都可以。如果是其他操作，你最好选择其他的集合操作类。比如，LinkList集合类在增加或移除集合中任何位置的元素所花费的时间都是一样的&mdash;O(1)，但它在索引一个元素的使用缺比较慢－O(i),其中i是索引的位置.使用ArrayList也很容易，因为你可以简单的使用索引来代替创建iterator对象的操作。LinkList也会为每个插入的元素创建对象，所有你要明白它也会带来额外的开销。<br />
最后，在《Practical Java》一书中Peter Haggar建议使用一个简单的数组（Array）来代替Vector或ArrayList。尤其是对于执行效率要求高的程序更应如此。因为使用数组(Array)避免了同步、额外的方法调用和不必要的重新分配空间的操作。<br />
</p>
<p>转载自:<font face="Arial">http://www2.matrix.org.cn/resource/article/2003-12-16/745.html</font></p>
          <br/>
          <span style="color:red;">
            <a href="http://cn-arthurs.javaeye.com/blog/127786#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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 28 Sep 2007 09:55:12 +0800</pubDate>
        <link>http://cn-arthurs.javaeye.com/blog/127786</link>
        <guid>http://cn-arthurs.javaeye.com/blog/127786</guid>
      </item>
      <item>
        <title>简单级聊天室程序</title>
        <author>cn_arthurs</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://cn-arthurs.javaeye.com">cn_arthurs</a>&nbsp;
          链接：<a href="http://cn-arthurs.javaeye.com/blog/122877" style="color:red;">http://cn-arthurs.javaeye.com/blog/122877</a>&nbsp;
          发表时间: 2007年09月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div class="code_title">
<div class="code_title">java 代码</div>
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="comment">//服务器端代码 </span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span></span><span class="keyword">import</span><span>&nbsp;java.io.BufferedReader; &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">import</span><span>&nbsp;java.io.BufferedWriter; &nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="keyword">import</span><span>&nbsp;java.io.IOException; &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">import</span><span>&nbsp;java.io.InputStreamReader; &nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="keyword">import</span><span>&nbsp;java.io.OutputStreamWriter; &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">import</span><span>&nbsp;java.io.PrintWriter; &nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="keyword">import</span><span>&nbsp;java.net.ServerSocket; &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">import</span><span>&nbsp;java.net.Socket; &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">class</span><span>&nbsp;Server{ &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">void</span><span>&nbsp;main(String[]&nbsp;args)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;IOException&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">int</span><span>&nbsp;PORT&nbsp;=&nbsp;</span><span class="number">8999</span><span>; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BufferedReader&nbsp;in&nbsp;=&nbsp;</span><span class="keyword">null</span><span>;PrintWriter&nbsp;out&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;</span><span class="keyword">try</span><span>{ &nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="comment">//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;以端口PORT创建一个服务器Socket </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ServerSocket&nbsp;s&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;ServerSocket(PORT); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//监听并接受与此socket的连接,该方法会阻塞直到有一个连接产生 </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Socket&nbsp;socket&nbsp;=&nbsp;s.accept(); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">&quot;服务器启动成功,等待客户端请求&quot;</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="comment">//创建新的数据输入流,以便从指定的输入流中读取数据 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">try</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;in&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;BufferedReader(</span><span class="keyword">new</span><span>&nbsp;InputStreamReader(socket.getInputStream())); &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="comment">//创建新的数据输出流,以便从指定的输出流中写出数据 </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;out&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;PrintWriter(</span><span class="keyword">new</span><span>&nbsp;BufferedWriter(</span><span class="keyword">new</span><span>&nbsp;OutputStreamWriter(socket.getOutputStream())),</span><span class="keyword">true</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;System.out.println(</span><span class="string">&quot;Client&nbsp;ip&nbsp;:&nbsp;&quot;</span><span>+s.getInetAddress()); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.println(</span><span class="string">&quot;welcome&nbsp;to&nbsp;my&nbsp;chatRoom!&quot;</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="keyword">while</span><span>&nbsp;(</span><span class="keyword">true</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;String&nbsp;str&nbsp;=&nbsp;in.readLine(); &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;</span><span class="keyword">if</span><span>&nbsp;(str.equals(</span><span class="string">&quot;exit&quot;</span><span>)&nbsp;||&nbsp;str==</span><span class="keyword">null</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;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">break</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;</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="keyword">if</span><span>&nbsp;(str&nbsp;!=&nbsp;</span><span class="keyword">null</span><span>&nbsp;&amp;&amp;&nbsp;str.length()&nbsp;&gt;&nbsp;</span><span class="number">0</span><span>)&nbsp;{ &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;System.out.println(</span><span class="string">&quot;客户端:&quot;</span><span>&nbsp;+&nbsp;str); &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;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;System.out.println(</span><span class="string">&quot;Client&nbsp;ip&nbsp;:&nbsp;&quot;</span><span>+s.getInetAddress()+</span><span class="string">&quot;&nbsp;want&nbsp;to&nbsp;leave&quot;</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;</span><span class="keyword">finally</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;in.close(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.close(); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;socket.close(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s.close(); &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;}</span><span class="keyword">catch</span><span>(Exception&nbsp;e){ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace(); &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;&nbsp;</span></li>
    <li class="alt"><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
<p>&nbsp;</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="comment">//客户端代码 </span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span></span><span class="keyword">import</span><span>&nbsp;java.io.BufferedReader; &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">import</span><span>&nbsp;java.io.BufferedWriter; &nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="keyword">import</span><span>&nbsp;java.io.DataInputStream; &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">import</span><span>&nbsp;java.io.IOException; &nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="keyword">import</span><span>&nbsp;java.io.InputStreamReader; &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">import</span><span>&nbsp;java.io.OutputStreamWriter; &nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="keyword">import</span><span>&nbsp;java.io.PrintWriter; &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="keyword">import</span><span>&nbsp;java.net.Socket; &nbsp;&nbsp;</span></li>
    <li class=""><span></span><span class="keyword">import</span><span>&nbsp;java.net.UnknownHostException; &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="comment">/** </span>&nbsp;</li>
    <li class=""><span><span class="comment">&nbsp;*&nbsp;Socket网络编程客户端程序 </span>&nbsp;</span></li>
    <li class="alt"><span><span class="comment">&nbsp;*&nbsp;@author&nbsp;arthurs </span>&nbsp;</span></li>
    <li class=""><span><span class="comment">&nbsp;*/</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span></span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;Client&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">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main(String[]&nbsp;args)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;IOException&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//创建一个socket连接,参数包括服务器端IP地址,端口号; </span><span>&nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Socket&nbsp;socket&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;Socket(</span><span class="string">&quot;localhost&quot;</span><span>,</span><span class="number">8999</span><span>); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BufferedReader&nbsp;in&nbsp;=&nbsp;</span><span class="keyword">null</span><span>;PrintWriter&nbsp;out&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;BufferedReader&nbsp;sysin&nbsp;=&nbsp;</span><span class="keyword">null</span><span>; &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">//&nbsp;if(outCh.toString().equals(&quot;exit&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">//&nbsp;break; </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="comment">//&nbsp;创建一个数据输入流,从指定的输入流中读取数据 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;BufferedReader(</span><span class="keyword">new</span><span>&nbsp;InputStreamReader(socket.getInputStream())); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;创建一个数据输出流,从指定的输出流中写出数据 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;PrintWriter(</span><span class="keyword">new</span><span>&nbsp;BufferedWriter(</span><span class="keyword">new</span><span>&nbsp;OutputStreamWriter(socket.getOutputStream())),&nbsp;</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;String&nbsp;str&nbsp;=&nbsp;in.readLine(); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span class="string">&quot;服务器端:&quot;</span><span>&nbsp;+&nbsp;str); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sysin&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;BufferedReader(</span><span class="keyword">new</span><span>&nbsp;InputStreamReader(</span><span class="keyword">new</span><span>&nbsp;DataInputStream(System.in))); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;strOut&nbsp;=&nbsp;sysin.readLine(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">while</span><span>(!strOut.equals(</span><span class="string">&quot;exit&quot;</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;out.println(strOut); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strOut&nbsp;=&nbsp;sysin.readLine(); &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;</span><span class="keyword">catch</span><span>&nbsp;(UnknownHostException&nbsp;e)&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">catch</span><span>&nbsp;(IOException&nbsp;e)&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span class="keyword">finally</span><span>&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in.close(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.close(); &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sysin.close(); &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;socket.close(); &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>
    <li class=""><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
          <br/>
          <span style="color:red;">
            <a href="http://cn-arthurs.javaeye.com/blog/122877#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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 11 Sep 2007 13:58:35 +0800</pubDate>
        <link>http://cn-arthurs.javaeye.com/blog/122877</link>
        <guid>http://cn-arthurs.javaeye.com/blog/122877</guid>
      </item>
      <item>
        <title>window下架设SVN服务器,及常见错误</title>
        <author>cn_arthurs</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://cn-arthurs.javaeye.com">cn_arthurs</a>&nbsp;
          链接：<a href="http://cn-arthurs.javaeye.com/blog/122873" style="color:red;">http://cn-arthurs.javaeye.com/blog/122873</a>&nbsp;
          发表时间: 2007年09月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div>OS: Windows XP SP2</div>
<div>1) 安装Apache Server<br />
2) 安装SVN<br