<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>pfwang</title>
    <description></description>
    <link>http://pfwang.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>Liferay更改数据库</title>
        <author>pfwang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pfwang.javaeye.com">pfwang</a>&nbsp;
                    链接：<a href="http://pfwang.javaeye.com/blog/213171" style="color:red;">http://pfwang.javaeye.com/blog/213171</a>&nbsp;
          发表时间: 2008年07月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Liferay默认是使用HSQL这个数据库，如果要在项目中使用其他的数据库，应该做如下相关设定。<br />以ORACLE为例。<br />下载Liferay Oracle 10g的数据库文件。下载地址为<br /><br />http://www.liferay.com/web/guest/downloads/additional，<br />下载liferay portal 4.3.2 SQL Oracle 10 Dump，是一个dmp文件。<br />该文件需要用imp命令导入到Oracle数据库中去。操作步骤如下：<br />1、打开Oracle数据库。(创建角色liferay/liferay，这个自己设定，非硬性规定)<br />2、运行——cmd，在控制台里输入imp后回车，用户名密码输入之前已经设定好的liferay/liferay<br />3、导入dmp文件，输入下载后保存该文件的路径。如：e:/liferay-oracle.dmp，缓冲设定预设30000，只<br /><br />列出到处内容：no，然后一路yes到完成。<br />4、打开Tomcat目录下的conf--Catalina--localhost目录下的ROOT.XML文件。找到<br /><br />xml 代码<br /> <br />&lt;!-- Hypersonic -->&nbsp;&nbsp; <br />&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; &lt;Resource&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name="jdbc/LiferayPool"&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; auth="Container"&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type="javax.sql.DataSource"&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; driverClassName="org.hsqldb.jdbcDriver"&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; url="jdbc:hsqldb:lportal"&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; username="sa"&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; password=""&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maxActive="20"&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; />&nbsp;&nbsp; <br />并注释掉，这是liferay的默认数据设定，然后找到<br /><br />xml 代码<br /> <br />&lt;!-- Oracle -->&nbsp;&nbsp; <br />&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; &lt;Resource&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name="jdbc/LiferayPool"&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; auth="Container"&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type="javax.sql.DataSource"&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; driverClassName="oracle.jdbc.driver.OracleDriver"&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; url="jdbc:oracle:thin:@localhost:1521:orcl"&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; username="liferay"&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; password="liferay"&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maxActive="20"&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; />&nbsp;&nbsp; <br />并取消注释，同时更改符合你本地环境的相关设定。<br />5、下载Oracle 10g的最新驱动*14.jar，如果是用10g的数据库文件，用*12.jar是会报错的，可去Oracle<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 但是光这样还是不行的，应为Liferay professional版底层采用了Hibernate，所以还需要设置Hibernate Dialect。这是在portal-ext.properties中配置。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hibernate.dialect=org.hibernate.dialect.OracleDialect
          <br/><br/>
          <span style="color:red;">
            <a href="http://pfwang.javaeye.com/blog/213171#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 09 Jul 2008 17:24:09 +0800</pubDate>
        <link>http://pfwang.javaeye.com/blog/213171</link>
        <guid>http://pfwang.javaeye.com/blog/213171</guid>
      </item>
          <item>
        <title>Swing窗口初始最大化的方法</title>
        <author>pfwang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pfwang.javaeye.com">pfwang</a>&nbsp;
                    链接：<a href="http://pfwang.javaeye.com/blog/158566" style="color:red;">http://pfwang.javaeye.com/blog/158566</a>&nbsp;
          发表时间: 2008年01月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          有三种方法 1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JFrame frame =new JFrame();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; frame.setSize(Toolkit.getDefaultToolkit().getScreenSize());&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; frame.setLocation(0,0);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; frame.show(); <br />2.(JDK1.4以上)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JFrame frame =new JFrame();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; frame.show();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 3.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JFrame frame=new JFrame();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; frame.show();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GraphicsEnvironment.getLocalGraphicsEnvironment().&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; getDefaultScreenDevice().setFullScreenWindow(frame);&nbsp;&nbsp;&nbsp; }
          <br/><br/>
          <span style="color:red;">
            <a href="http://pfwang.javaeye.com/blog/158566#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 23 Jan 2008 11:18:37 +0800</pubDate>
        <link>http://pfwang.javaeye.com/blog/158566</link>
        <guid>http://pfwang.javaeye.com/blog/158566</guid>
      </item>
          <item>
        <title>Tomcat+SSL</title>
        <author>pfwang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pfwang.javaeye.com">pfwang</a>&nbsp;
                    链接：<a href="http://pfwang.javaeye.com/blog/137097" style="color:red;">http://pfwang.javaeye.com/blog/137097</a>&nbsp;
          发表时间: 2007年10月31日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>以下以Tomcat5为例：<br />
<strong>1、</strong>安装Tomcat5（略）<br />
<strong>2、</strong>生成keystore<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 转到%JAVA_HOME%/bin(JDK安装目录)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 运行：keytool -genkey -keyalg RSA -alias tomcat<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 提示输入keystore（输入changeit，Tomcat默认是这个，便于后面Tomcat的配置，<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 或者输入其它的，但后面在tomcat配置中要写明这里的密钥）<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其它的如名称、地区&hellip;&hellip;自己填；<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 最后的一个密钥要和keystore相同，默认回车就行。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Y 确认后会在你的用户目录下（Documents and Settings/userhome/）<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 生成&quot;.keystore&quot;文件，不用动这个文件的。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>或者：</strong>用CA产生一个CSR(Certificate Signing Request):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; keytool -certreq -alias tomcat -keyalg RSA<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -file &lt;csr_file&gt; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>或者：</strong>输入一个证书:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; keytool -import -trustcacerts -alias tomcat <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -file &lt;ca-cert-filename&gt; <br />
<strong>3、</strong>配置Tomcat<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 打开%Tomcat_Home%/conf/server.xml<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 找到这个，按要求做：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!--&nbsp; Define a SSL Coyote HTTP/1.1 Connector on port 8443 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --&gt; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;!-- 《－－－－去掉这个注释<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Connector port=&quot;8443&quot; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; maxThreads=&quot;150&quot; minSpareThreads=&quot;25&quot; maxSpareThreads=&quot;75&quot;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; enableLookups=&quot;false&quot; disableUploadTimeout=&quot;true&quot;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; acceptCount=&quot;100&quot; debug=&quot;0&quot; scheme=&quot;https&quot; secure=&quot;true&quot;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; clientAuth=&quot;false&quot; sslProtocol=&quot;TLS&quot; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --&gt; 《－－－－去掉这个注释<br />
<strong>4、</strong>自定义配置<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果第2步是按照自定义密钥的，则需要选择添加如下一些信息<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; keystoreFile=&quot;your key file&quot;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; keystorePass=&quot;your key pass&quot;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; keystoreType=&quot;your key type&quot;(JKS 或 PKCS12)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &hellip;&hellip;（其它参见Tomcat文档SSL篇）<br />
<strong>5、</strong>重启Tomcat<br />
6、打开页面：<a href="https://localhost:8443/">https://localhost:8443</a><br />
7、成功。<br />
</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://pfwang.javaeye.com/blog/137097#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 31 Oct 2007 20:13:16 +0800</pubDate>
        <link>http://pfwang.javaeye.com/blog/137097</link>
        <guid>http://pfwang.javaeye.com/blog/137097</guid>
      </item>
          <item>
        <title>栅格数据结构与矢量数据结构[理解、比较、转换]</title>
        <author>pfwang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pfwang.javaeye.com">pfwang</a>&nbsp;
                    链接：<a href="http://pfwang.javaeye.com/blog/137067" style="color:red;">http://pfwang.javaeye.com/blog/137067</a>&nbsp;
          发表时间: 2007年10月31日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p align="left"><strong>栅格数据结构 </strong></p>
<p align="left">栅格结构是以规则的阵列来表示空间地物或现象分布的数据组织,组织中的每个数据表示地物或现象的非几何属性特征。 </p>
<p align="left">栅格结构的<span>显著特点:属性明显,定位隐含,即数据直接记录属性的指针或数据本身,而所在位置则根据行列号转换为相应的坐标。</span></p>
<span>
<p align="left">栅格数据的<span>编码方法:直接栅格编码,就是将栅格数据看作一个数据矩阵,逐行（或逐列）逐个记录代码;压缩编码,包括</span>链码（<span>弗里曼链码）比较适合存储图形数据;</span>游程长度编码通过记录行或列上相邻若干属性相同点的代码来实现;块码是有成长度编码扩展到二维的情况,采用方形区域为记录单元;四叉树编码是最有效的栅格数据压缩编码方法之一,还能提高图形操作效率,具有可变的分辨率。</p>
<p align="left"><strong>矢量数据结构</strong></p>
<p align="left">矢量数据结构是通过记录坐标的方式尽可能精确地表示点、线和多边形等地理实体,坐标空间设为连续,允许任意位置、长度和面积的精确定义。</p>
<p align="left">矢量结构的<span>显著特点:定位明显,属性隐含。</span></p>
<p align="left">矢量数据的<span>编码方法:</span></p>
<p align="left">对于点实体和线实体,直接记录空间信息和属性信息;</p>
<p align="left">对于多边形地物,有<span>坐标序列法、树状索引编码法和拓扑结构编码法。坐标序列法是由多边形边界的</span>x,y坐标对集合及说明信息组成,是最简单的一种多边形矢量编码法,文件结构简单,但多边形边界被存储两次产生数据冗余,而且缺少邻域信息;树状索引编码法是将所有边界点进行数字化,顺序存储坐标对,由点索引与边界线号相联系,以线索引与各多边形相联系,形成树状索引结构,消除了相邻多边形边界数据冗余问题;拓扑结构编码法是通过建立一个完整的拓扑关系结构,彻底解决邻域和岛状信息处理问题的方法,但增加了算法的复杂性和数据库的大小。</p>
<p align="left"><strong>矢量栅格数据的比较 </strong></p>
<p align="left">矢量数据的优缺点:</p>
<p align="left"><strong>优点</strong>为数据结构紧凑、冗余度低,有利于网络和检索分析,图形显示质量好、精度高;</p>
<p align="left">缺点为数据结构复杂,多边形叠加分析比较困难。</p>
<p align="left">栅格数据的优缺点:</p>
<p align="left"><strong>优点</strong>为数据结构简单,便于空间分析和地表模拟,现势性较强;</p>
<p align="left">缺点为数据量大,投影转换比较复杂。</p>
<p align="left">两者比较:</p>
<p align="left">栅格数据操作总的来说容易实现,矢量数据操作则比较复杂;</p>
<p align="left">栅格结构是矢量结构在某种程度上的一种近似,对于同一地物达到于矢量数据相同的精度需要更大量的数据;在坐标位置搜索、计算多边形形状面积等方面栅格结构更为有效,而且易于遥感相结合,易于信息共享;矢量结构对于拓扑关系的搜索则更为高效,网络信息只有用矢量才能完全描述,而且精度较高。对于地理信息系统软件来说,两者共存,各自发挥优势是十分有效的。</p>
<p align="left"><strong>矢量栅格相互转换算法</strong></p>
<p align="left"><strong>矢量转栅格</strong>:内部点扩散法,即由多边形内部种子点向周围邻点扩散,直至到达各边界为止;复数积分算法,即由待判别点对多边形的封闭边界计算复数积分,来判断两者关系;射线算法和扫描算法,即由图外某点向待判点引射线,通过射线与多边形边界交点数来判断内外关系;边界代数算法,是一种基于积分思想的矢量转栅格算法,适合于记录拓扑关系的多边形矢量数据转换,方法是由多边形边界上某点开始,顺时针搜索边界线,上行时边界左侧具有相同行坐标的栅格减去某值,下行时边界左侧所有栅格点加上该值,边界搜索完毕之后即完成多边形的转换。</p>
<p align="left"><strong>栅格转矢量</strong>:即是提取具有相同编号的栅格集合表示的多边形区域的边界和边界的拓扑关系,并表示成矢量格式边界线的过程。步骤包括:多边形边界提取,即使用高通滤波将栅格图像二值化;边界线追踪,即对每个弧段由一个节点向另一个节点搜索;拓扑关系生成和去处多余点及曲线圆滑</p>
</span>
          <br/><br/>
          <span style="color:red;">
            <a href="http://pfwang.javaeye.com/blog/137067#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 31 Oct 2007 17:19:25 +0800</pubDate>
        <link>http://pfwang.javaeye.com/blog/137067</link>
        <guid>http://pfwang.javaeye.com/blog/137067</guid>
      </item>
          <item>
        <title>关于Oracle与SqlServer中获取所有字段、主键、外键的sql语句  </title>
        <author>pfwang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pfwang.javaeye.com">pfwang</a>&nbsp;
                    链接：<a href="http://pfwang.javaeye.com/blog/125568" style="color:red;">http://pfwang.javaeye.com/blog/125568</a>&nbsp;
          发表时间: 2007年09月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>关于Oracle与SqlServer中获取所有字段、主键、外键的sql语句 标签： 主键&nbsp; 外键&nbsp; sql&nbsp; <br />
最近在做的社会网络分析原型系统需要将多种不同数据库中的表的字段、主外键信息读出，实现这些功能费了不少功夫，记录下来以备用吧<br />
Oracle:<br />
查询某个表中的字段名称、类型、精度、长度、是否为空<br />
select COLUMN_NAME,DATA_TYPE,DATA_PRECISION,DATA_SCALE,NULLABLE <br />
from user_tab_columns <br />
where table_name ='YourTableName'<br />
查询某个表中的主键字段名<br />
select col.column_name <br />
from user_constraints con,&nbsp; user_cons_columns col <br />
where con.constraint_name = col.constraint_name <br />
and con.constraint_type='P' <br />
and col.table_name = 'YourTableName'<br />
查询某个表中的外键字段名称、所引用表名、所应用字段名<br />
select distinct(col.column_name),r.table_name,r.column_name <br />
from <br />
user_constraints con,<br />
user_cons_columns col, <br />
(select t2.table_name,t2.column_name,t1.r_constraint_name <br />
&nbsp;from user_constraints t1,user_cons_columns t2 <br />
&nbsp;where t1.r_constraint_name=t2.constraint_name <br />
&nbsp;and t1.table_name='YourTableName'<br />
&nbsp;) r <br />
where con.constraint_name=col.constraint_name <br />
and con.r_constraint_name=r.r_constraint_name <br />
and con.table_name='YourTableName'</p>
<p>SQLServer中的实现：<br />
字段：<br />
SELECT c.name,t.name,c.xprec,c.xscale,c.isnullable <br />
FROM systypes t,syscolumns c <br />
WHERE t.xtype=c.xtype <br />
AND c.id = (SELECT id FROM sysobjects WHERE name='YourTableName') <br />
ORDER BY c.colid</p>
<p>主键（参考SqlServer系统存储过程sp_pkeys）：<br />
select COLUMN_NAME = convert(sysname,c.name)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
from&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
sysindexes i, syscolumns c, sysobjects o&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
where o.id = object_id('[YourTableName]')&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
and o.id = c.id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
and o.id = i.id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
and (i.status &amp; 0x800) = 0x800&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
and (c.name = index_col ('[YourTableName]', i.indid,&nbsp; 1) or&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; c.name = index_col ('[YourTableName]', i.indid,&nbsp; 2) or&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; c.name = index_col ('[YourTableName]', i.indid,&nbsp; 3) or&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; c.name = index_col ('[YourTableName]', i.indid,&nbsp; 4) or&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; c.name = index_col ('[YourTableName]', i.indid,&nbsp; 5) or&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; c.name = index_col ('[YourTableName]', i.indid,&nbsp; 6) or&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; c.name = index_col ('[YourTableName]', i.indid,&nbsp; 7) or&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; c.name = index_col ('[YourTableName]', i.indid,&nbsp; 8) or&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; c.name = index_col ('[YourTableName]', i.indid,&nbsp; 9) or&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; c.name = index_col ('[YourTableName]', i.indid, 10) or&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; c.name = index_col ('[YourTableName]', i.indid, 11) or&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; c.name = index_col ('[YourTableName]', i.indid, 12) or&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; c.name = index_col ('[YourTableName]', i.indid, 13) or&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; c.name = index_col ('[YourTableName]', i.indid, 14) or&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; c.name = index_col ('[YourTableName]', i.indid, 15) or&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; c.name = index_col ('[YourTableName]', i.indid, 16)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; )</p>
<p>外键：<br />
select t1.name,t2.rtableName,t2.name <br />
from <br />
(select col.name, f.constid as temp <br />
&nbsp;from syscolumns col,sysforeignkeys f <br />
&nbsp;where f.fkeyid=col.id <br />
&nbsp;and f.fkey=col.colid <br />
&nbsp;and f.constid in <br />
&nbsp;( select distinct(id)&nbsp; <br />
&nbsp;&nbsp; from sysobjects <br />
&nbsp;&nbsp; where OBJECT_NAME(parent_obj)='YourTableName' <br />
&nbsp;&nbsp; and xtype='F' <br />
&nbsp; ) <br />
&nbsp;) as t1 , <br />
(select OBJECT_NAME(f.rkeyid) as rtableName,col.name, f.constid as temp <br />
&nbsp;from syscolumns col,sysforeignkeys f <br />
&nbsp;where f.rkeyid=col.id <br />
&nbsp;and f.rkey=col.colid <br />
&nbsp;and f.constid in <br />
&nbsp;( select distinct(id) <br />
&nbsp;&nbsp; from sysobjects <br />
&nbsp;&nbsp; where OBJECT_NAME(parent_obj)='YourTableName' <br />
&nbsp;&nbsp; and xtype='F' <br />
&nbsp;) <br />
) as t2 <br />
where t1.temp=t2.temp</p>
<p>&nbsp;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://pfwang.javaeye.com/blog/125568#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 20 Sep 2007 09:21:02 +0800</pubDate>
        <link>http://pfwang.javaeye.com/blog/125568</link>
        <guid>http://pfwang.javaeye.com/blog/125568</guid>
      </item>
          <item>
        <title>OSWorkFlow分析</title>
        <author>pfwang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pfwang.javaeye.com">pfwang</a>&nbsp;
                    链接：<a href="http://pfwang.javaeye.com/blog/98187" style="color:red;">http://pfwang.javaeye.com/blog/98187</a>&nbsp;
          发表时间: 2007年07月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          .&nbsp;&nbsp;&nbsp;&nbsp;OSWorkFlow基本概念<br />
&nbsp;&nbsp;&nbsp;&nbsp;在商用和开源世界里，OSWorkflow&nbsp;都不同于这些已有的工作流系统。最大不同在于&nbsp;OSWorkflow&nbsp;有着非常优秀的灵活性。在开始接触&nbsp;OSWorkflow&nbsp;时可能较难掌握（有人说不适合工作流新手入门），比如，OSWorkflow&nbsp;不要求图形化工具来开发工作流，而推荐手工编写&nbsp;xml&nbsp;格式的工作流程描述符。它能为应用程序开发者提供集成，也能与现有的代码和数据库进行集成。这一切似乎给正在寻找快速&ldquo;即插即用&rdquo;工作流解决方案的人制造了麻烦，但研究发现，那些&ldquo;即插即用&rdquo;方案也不能在一个成熟的应用程序中提供足够的灵活性来实现所有需求。<br />
2.&nbsp;&nbsp;&nbsp;&nbsp;OSWorkFlow主要优势<br />
OSWorkflow&nbsp;给你绝对的灵活性。OSWorkflow&nbsp;被认为是一种&ldquo;低级别&rdquo;工作流实现。与其他工作流系统能用图标表现&ldquo;Loops(回路)&rdquo;和&ldquo;Conditions(条件)&rdquo;相比，OSWorkflow&nbsp;只是手工&ldquo;编码(Coded)&rdquo;来实现的。但这并不能说实际的代码是需要完全手工编码的，脚本语言能胜任这种情形。OSWorkflow&nbsp;不希望一个非技术用户修改工作流程，虽然一些其他工作流系统提供了简单的&nbsp;GUI&nbsp;用于工作流编辑，但像这样改变工作流，通常会破坏这些应用。所以，进行工作流调整的最佳人选是开发人员，他们知道该怎么改变。不过，在最新的版本中，OSWorkflow&nbsp;也提供了&nbsp;GUI&nbsp;设计器来协助工作流的编辑。<br />
<br />
OSWorkflow&nbsp;基于有限状态机概念。每个&nbsp;state&nbsp;由&nbsp;step&nbsp;ID&nbsp;和&nbsp;status&nbsp;联合表现（可简单理解为&nbsp;step&nbsp;及其&nbsp;status&nbsp;表示有限状态机的&nbsp;state）。一个&nbsp;state&nbsp;到另一&nbsp;state&nbsp;的&nbsp;transition&nbsp;依赖于&nbsp;action&nbsp;的发生，在工作流生命期内有至少一个或多个活动的&nbsp;state。这些简单概念展现了&nbsp;OSWorkflow&nbsp;引擎的核心思想，并允许一个简单&nbsp;XML&nbsp;文件解释工作流业务流程。<br />
3.&nbsp;&nbsp;&nbsp;&nbsp;OSWorkFlow核心概念<br />
3.1.&nbsp;&nbsp;&nbsp;&nbsp;概念定义<br />
&nbsp;<br />
步骤（Step）<br />
&nbsp;&nbsp;&nbsp;&nbsp;一个&nbsp;Step&nbsp;描述的是工作流所处的位置。可能从一个&nbsp;Step&nbsp;Transtion（流转）到另外一个&nbsp;Step，或者也可以在同一个&nbsp;Step&nbsp;内流转（因为&nbsp;Step&nbsp;可以通&nbsp;Status&nbsp;来细分，形成多个State）。一个流程里面可以多个Step。<br />
<br />
状态（Status）<br />
&nbsp;&nbsp;&nbsp;&nbsp;工作流&nbsp;Status&nbsp;是用来描述工作流程中具体Step（步骤）状态的字符串。OSWorkflow&nbsp;的有&nbsp;Underway（进行中）、Queued（等候处理中）、Finished（完成）三种&nbsp;Status。一个实际State（状态）真正是由两部分组成：State&nbsp;=&nbsp;(Step&nbsp;+&nbsp;Status)&nbsp;。<br />
<br />
流转（Transtion）<br />
&nbsp;&nbsp;&nbsp;&nbsp;一个State到另一个State的转移。<br />
<br />
动作（Action）<br />
&nbsp;&nbsp;&nbsp;&nbsp;Action&nbsp;触发了发生在&nbsp;Step&nbsp;内或&nbsp;Step&nbsp;间的流转，或者说是基于&nbsp;State&nbsp;的流转。一个&nbsp;step&nbsp;里面可以有多个Action。Action&nbsp;和Step&nbsp;之间的关系是，Step&nbsp;说明&ldquo;在哪里&rdquo;，Action&nbsp;说明&ldquo;去哪里&rdquo;。&nbsp;一个&nbsp;Action&nbsp;典型地由两部分组成：可以执行此Action（动作）的<br />
Condition（条件），以及执行此动作后的&nbsp;Result（结果）。&nbsp;&nbsp;&nbsp;&nbsp;<br />
<br />
条件（Condition）<br />
类似于逻辑判断，可包含&ldquo;AND&rdquo;和&ldquo;OR&rdquo;逻辑。比如一个请假流程中的&ldquo;本部门审批阶段&rdquo;，该阶段利用&ldquo;AND&rdquo;逻辑，判断流程状态是否为等候处理中，以及审批者是否为本部门主管。<br />
<br />
结果（Result）<br />
Result&nbsp;代表执行Action（动作）后的结果，指向新的&nbsp;Step&nbsp;及其&nbsp;Step&nbsp;Status，也可能进入&nbsp;Split&nbsp;或者&nbsp;Join。Result&nbsp;分为两种，&nbsp;Contidional-Result&nbsp;（有条件结果），只有条件为真时才使用该结果，和&nbsp;Unconditional-Result（无条件结果），当条件不满足或没有条件时使用该结果。<br />
<br />
分离/连接（Split/Join）<br />
流程的切分和融合。很简单的概念，Split&nbsp;可以提供多个&nbsp;Result（结果）；Join&nbsp;则判断多个&nbsp;Current&nbsp;Step&nbsp;的态提供一个&nbsp;Result（结果）。<br />
3.2.&nbsp;&nbsp;&nbsp;&nbsp;步骤、状态和动作(Step,&nbsp;Status,&nbsp;and&nbsp;Action)<br />
工作流要描述步骤(Step)、步骤的状态(Status)、各个步骤之间的关系以及执行各个步骤的条件和权限，每个步骤中可以含有一个或多个动作(Action)，动作将会使一个步骤的状态发生改变。<br />
<br />
对于一个执行的工作流来讲，步骤的切换是不可避免的。一个工作流在某一时刻会有一个或多个当前步骤，每个当前步骤都有一个状态值，当前步骤的状态值组成了工作流实例的状态值。一旦完成了一个步骤，那么这个步骤将不再是当前步骤（而是切换到一个新的步骤），通常一个新的当前步骤将随之建立起来，以保证工作流继续执行。完成了的步骤的最终状态值是用Old-Status属性指定的，这个状态值的设定将发生在切换到其他步骤之前。Old-Status的值可以是任意的，但在一般情况下，我们设置为Finished。<br />
<br />
切换本身是一个动作（Action）的执行结果。每个步骤可以含有多个动作，究竟要载入哪个动作是由最终用户、外部事件或者Tiggerd的自动调用决定的。随着动作的完成，一个特定的步骤切换也将发生。动作可以被限制在用户、用户组或当前状态。每一个动作都必须包含一个Unconditional&nbsp;Result和0个或多个Conditional&nbsp;Results。<br />
<br />
所以，总体来说，一个工作流由多个步骤组成。每个步骤有一个当前状态（例如：Queued,&nbsp;Underway&nbsp;or&nbsp;Finished），一个步骤包含多个动作。每个步骤含有多个可以执行的动作。每个动作都有执行的条件，也有要执行的函数。动作包含有可以改变状态和当前工作流步骤的results。<br />
3.3.&nbsp;&nbsp;&nbsp;&nbsp;结果、分支和连接(Results,&nbsp;Joins,&nbsp;and&nbsp;Splits)<br />
3.3.1.&nbsp;&nbsp;&nbsp;&nbsp;无条件结果(Unconditional&nbsp;Result)<br />
对于每一个动作来讲，必须存在一个Unconditional&nbsp;Result。一个result是一系列指令，这些指令将告诉OSWorkFlow下一个任务要做什么。这包括使工作流从一个状态切换到另一个状态。<br />
3.3.2.&nbsp;&nbsp;&nbsp;&nbsp;有条件结果(Conditional&nbsp;Result)<br />
Conditional&nbsp;Result是Unconditional&nbsp;Result的一个扩展。它需要一个或多个Condition子标签。第一个为true的Conditional（使用AND或OR类型），会指明发生切换的步骤，这个切换步骤的发生是由于某个用户执行了某个动作的结果导致的。<br />
3.3.3.&nbsp;&nbsp;&nbsp;&nbsp;三种不同的Results(conditional&nbsp;or&nbsp;unconditional)<br />
一个新的、单一的步骤和状态的组合。<br />
一个分裂成两个或多个步骤和状态的组合。<br />
将这个和其他的切换组合成一个新的单一的步骤和状态的组合。<br />
每种不同的result对应了不同的xml描述，你可以阅读<a href="http://www.opensymphony.com/osworkflow/workflow_2_7.dtd">http://www.opensymphony.com/osworkflow/workflow_2_7.dtd</a>，获取更多的信息。<br />
注意：通常，一个split或一个join不会再导致一个split&nbsp;或&nbsp;join的发生。<br />
3.4.&nbsp;&nbsp;&nbsp;&nbsp;自动步骤(Auto&nbsp;actions)<br />
有的时候，我们需要一些动作可以基于一些条件自动地执行。为了达到这个目的，你可以在action中加入auto=&quot;true&quot;属性。流程将考察这个动作的条件和限制，如果条件符合，那么将执行这个动作。&nbsp;Auto&nbsp;action是由当前的调用者执行的，所以将对该动作的调用者执行权限检查。<br />
3.5.&nbsp;&nbsp;&nbsp;&nbsp;整合抽象实例(Integrating&nbsp;with&nbsp;Abstract&nbsp;Entities)<br />
建议在你的核心实体中，例如&quot;Document&quot;&nbsp;或&nbsp;&quot;Order&quot;，在内部创建一个新的属性：workflowId。这样，当新的&quot;Document&quot;&nbsp;或&nbsp;&quot;Order&quot;被创建的时候，它能够和一个workflow实例关联起来。那么，你的代码可以通过OSWorkflow&nbsp;API查找到这个workflow实例并且得到这个workflow的信息和动作。<br />
3.6.&nbsp;&nbsp;&nbsp;&nbsp;工作流实例状态(Workflow&nbsp;Instance&nbsp;State)<br />
有的时候，为整个workflow实例指定一个状态是很有帮助的，它独立于流程的执行步骤。OSWorkflow提供一些workflow实例中可以包含的&quot;meta-states&quot;。这些&quot;meta-states&quot;可以是CREATED,&nbsp;ACTIVATED,&nbsp;SUSPENDED,&nbsp;KILLED&nbsp;和&nbsp;COMPLETED。当一个工作流实例被创建的时候，它将处于CREATED状态。然后，只要一个动作被执行，它就会自动的变成ACTIVATED状态。如果调用者没有明确地改变实例的状态，工作流将一直保持这个状态直到工作流结束。当工作流不可能再执行任何其他的动作的时候，工作流将自动的变成COMPLETED状态。<br />
<br />
然而，当工作流处于ACTIVATED状态的时候，调用者可以终止或挂起这个工作流（设置工作流的状态为KILLED&nbsp;或&nbsp;SUSPENDED）。一个终止了的工作流将不能再执行任何动作，而且将永远保持着终止状态。一个被挂起了的工作流会被冻结，他也不能执行任何的动作，除非它的状态再变成ACTIVATED。<br />
4.&nbsp;&nbsp;&nbsp;&nbsp;OSWorkFlow包用途分析及代码片断<br />
4.1.&nbsp;&nbsp;&nbsp;&nbsp;com.opensymphony.workflow<br />
该包为整个OSWorkflow&nbsp;引擎提供核心接口。例如&nbsp;com.opensymphony.workflow.Workflow&nbsp;接口，可以说，实际开发中的大部分工作都是围绕该接口展开的，该接口有&nbsp;BasicWorkflow、EJBWorkflow、OfbizWorkflow&nbsp;三个实现类。<br />
4.2.&nbsp;&nbsp;&nbsp;&nbsp;com.opensymphony.workflow.basic<br />
该包有两个类，BasicWorkflow&nbsp;与&nbsp;BasicWorkflowContext。BasicWorkflow&nbsp;不支持事务，尽管依赖持久实现，事务也不能包裹它。BasicWorkflowContext&nbsp;在实际开发中很少使用。<br />
<br />
public&nbsp;void&nbsp;setWorkflow(int&nbsp;userId)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;Workflow&nbsp;workflow&nbsp;=&nbsp;new&nbsp;BasicWorkflow(Integer.toString(userId));<br />
}<br />
<br />
4.3.&nbsp;&nbsp;&nbsp;&nbsp;com.opensymphony.workflow.config<br />
该包有一个接口和两个该接口的实现类。在&nbsp;OSWorkflow&nbsp;2.7&nbsp;以前，状态由多个地方的静态字段维护，这种方式很方便，但是有很多缺陷和约束。最主要的缺点是无法通过不同配置运行多个&nbsp;OSWorkflow&nbsp;实例。实现类&nbsp;DefaultConfiguration&nbsp;用于一般的配置文件载入。而&nbsp;SpringConfiguration&nbsp;则是让&nbsp;Spring&nbsp;容器管理配置信息。<br />
<br />
public&nbsp;void&nbsp;setWorkflow(int&nbsp;userId)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;Workflow&nbsp;workflow&nbsp;=&nbsp;new&nbsp;BasicWorkflow(Integer.toString(userId));<br />
}<br />
4.4.&nbsp;&nbsp;&nbsp;&nbsp;com.opensymphony.workflow.ejb<br />
&nbsp;&nbsp;&nbsp;&nbsp;该包有两个接口&nbsp;WorkflowHome&nbsp;和&nbsp;WorkflowRemote。该包的若干类中，最重要的是&nbsp;EJBWorkflow，该类和&nbsp;BasicWorkflow&nbsp;的作用一样，是&nbsp;OSWorkflow&nbsp;的核心，并利用&nbsp;EJB&nbsp;容器管理事务，也作为工作流&nbsp;session&nbsp;bean&nbsp;的包装器。<br />
4.5.&nbsp;&nbsp;&nbsp;&nbsp;com.opensymphony.workflow.loader<br />
该包有若干类，用得最多的是&nbsp;XxxxDescriptor，如果在工作流引擎运行时需要了解指定的动作、步骤的状态、名字，等信息时，这些描述符会起到很大作用。<br />
<br />
public&nbsp;String&nbsp;findNameByStepId(int&nbsp;stepId,String&nbsp;wfName)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;WorkflowDescriptor&nbsp;wd&nbsp;=&nbsp;workflow.getWorkflowDescriptor(wfName);<br />
&nbsp;&nbsp;&nbsp;&nbsp;StepDescriptor&nbsp;stepDes&nbsp;=&nbsp;wd.getStep(stepId);<br />
&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;stepDes.getName();<br />
}<br />
4.6.&nbsp;&nbsp;&nbsp;&nbsp;com.opensymphony.workflow.ofbiz<br />
&nbsp;&nbsp;&nbsp;&nbsp;OfbizWorkflow&nbsp;和&nbsp;BasicWorkflow&nbsp;在很多方面非常相似，除了需要调用&nbsp;ofbiz&nbsp;的&nbsp;TransactionUtil&nbsp;来包装事务。<br />
4.7.&nbsp;&nbsp;&nbsp;&nbsp;com.opensymphony.workflow.query<br />
该包主要为查询而设计，但不是所有的工作流存储都支持查询。通常，Hibernate&nbsp;和&nbsp;JDBC&nbsp;都支持，而内存工作流存储不支持。值得注意的是&nbsp;Hibernate&nbsp;存储不支持混合型查询（例如，一个查询同时包含了&nbsp;history&nbsp;step&nbsp;上下文和&nbsp;current&nbsp;step&nbsp;上下文）。执行一个查询，需要创建&nbsp;WorkflowExpressionQuery&nbsp;实例，接着调用&nbsp;Workflow&nbsp;对象的&nbsp;query&nbsp;方法来得到最终查询结果。<br />
<br />
public&nbsp;List&nbsp;queryDepAdmin(int&nbsp;userId,int&nbsp;type)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;int[]&nbsp;arr&nbsp;=&nbsp;getSubPerson(userId,type);<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;//构造表达式<br />
&nbsp;&nbsp;&nbsp;&nbsp;Expression[]&nbsp;expressions&nbsp;=&nbsp;new&nbsp;Expression[1&nbsp;+&nbsp;arr.length];<br />
&nbsp;&nbsp;&nbsp;&nbsp;Expression&nbsp;expStatus&nbsp;=&nbsp;new&nbsp;FieldExpression(FieldExpression.STATUS,<br />
&nbsp;&nbsp;&nbsp;&nbsp;FieldExpression.CURRENT_STEPS,&nbsp;FieldExpression.EQUALS,&nbsp;&quot;Queued&quot;);<br />
&nbsp;&nbsp;&nbsp;&nbsp;expressions[0]&nbsp;=&nbsp;expStatus;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;&lt;&nbsp;arr.length;&nbsp;i++)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Expression&nbsp;expOwner&nbsp;=&nbsp;new&nbsp;FieldExpression(FieldExpression.OWNER,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FieldExpression.CURRENT_STEPS,&nbsp;FieldExpression.EQUALS,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Integer.toString(arr[i]));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;expressions[i&nbsp;+&nbsp;1]&nbsp;=&nbsp;expOwner;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;//查询未完成流编号<br />
&nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;wfIdList&nbsp;=&nbsp;null;<br />
&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WorkflowExpressionQuery&nbsp;query&nbsp;=&nbsp;new&nbsp;WorkflowExpressionQuery(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new&nbsp;NestedExpression(expressions,&nbsp;NestedExpression.AND));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wfIdList&nbsp;=&nbsp;workflow.query(query);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(Exception&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
4.8.&nbsp;&nbsp;&nbsp;&nbsp;com.opensymphony.workflow.soap<br />
&nbsp;&nbsp;&nbsp;&nbsp;OSWorkflow&nbsp;通过&nbsp;SOAP&nbsp;来支持远端调用。这种调用借助&nbsp;WebMethods&nbsp;实现。<br />
4.9.&nbsp;&nbsp;&nbsp;&nbsp;com.opensymphony.workflow.spi<br />
该包可以说是&nbsp;OSWorkflow&nbsp;与持久层打交道的途径，如当前工作流的实体，其中包括：EJB、Hibernate、JDBC、Memory、Ofbiz、OJB、Prevayler。<br />
<br />
HibernateWorkflowEntry&nbsp;hwfe&nbsp;=&nbsp;(HibernateWorkflowEntry)&nbsp;getHibernateTemplate()<br />
&nbsp;&nbsp;&nbsp;&nbsp;.find(&quot;from&nbsp;HibernateWorkflowEntry&nbsp;where&nbsp;Id=&quot;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;wfIdList.get(i)).get(0);<br />
4.10.&nbsp;&nbsp;&nbsp;&nbsp;com.opensymphony.workflow.util<br />
该包是&nbsp;OSWorkflow&nbsp;的工具包，包括了对&nbsp;BeanShell、BSF、EJB&nbsp;Local、EJB&nbsp;Remote、JNDI&nbsp;的支持。<br />
5.&nbsp;&nbsp;&nbsp;&nbsp;OSWorkFlow表结构分析<br />
5.1.&nbsp;&nbsp;&nbsp;&nbsp;OS_WFENTRY<br />
工作流主表，存放工作流名称和状态<br />
<br />
字段名&nbsp;&nbsp;&nbsp;&nbsp;数据类型&nbsp;&nbsp;&nbsp;&nbsp;说明<br />
ID&nbsp;&nbsp;&nbsp;&nbsp;NUMBER&nbsp;&nbsp;&nbsp;&nbsp;自动编号<br />
NAME&nbsp;&nbsp;&nbsp;&nbsp;VARCHAR2(20)&nbsp;&nbsp;&nbsp;&nbsp;工作流名称<br />
STATE&nbsp;&nbsp;&nbsp;&nbsp;NUMBER&nbsp;&nbsp;&nbsp;&nbsp;工作流状态<br />
<br />
5.2.&nbsp;&nbsp;&nbsp;&nbsp;OS_CURRENTSTEP<br />
当前步骤表，存放当前正在进行步骤的数据<br />
<br />
字段名&nbsp;&nbsp;&nbsp;&nbsp;数据类型&nbsp;&nbsp;&nbsp;&nbsp;说明<br />
ID&nbsp;&nbsp;&nbsp;&nbsp;NUMBER&nbsp;&nbsp;&nbsp;&nbsp;自动编号<br />
ENTRY_ID&nbsp;&nbsp;&nbsp;&nbsp;NUMBER&nbsp;&nbsp;&nbsp;&nbsp;工作流编号<br />
STEP_ID&nbsp;&nbsp;&nbsp;&nbsp;NUMBER&nbsp;&nbsp;&nbsp;&nbsp;步骤编号<br />
ACTION_ID&nbsp;&nbsp;&nbsp;&nbsp;NUMBER&nbsp;&nbsp;&nbsp;&nbsp;动作编号<br />
OWNER&nbsp;&nbsp;&nbsp;&nbsp;VARCHAR2(20)&nbsp;&nbsp;&nbsp;&nbsp;步骤的所有者<br />
START_DATE&nbsp;&nbsp;&nbsp;&nbsp;DATE&nbsp;&nbsp;&nbsp;&nbsp;开始时间<br />
FINISH_DATE&nbsp;&nbsp;&nbsp;&nbsp;DATE&nbsp;&nbsp;&nbsp;&nbsp;结束时间<br />
DUE_DATE&nbsp;&nbsp;&nbsp;&nbsp;DATE&nbsp;&nbsp;&nbsp;&nbsp;授权时间<br />
STATUS&nbsp;&nbsp;&nbsp;&nbsp;VARCHAR2(20)&nbsp;&nbsp;&nbsp;&nbsp;状态<br />
CALLER&nbsp;&nbsp;&nbsp;&nbsp;VARCHAR2(20)&nbsp;&nbsp;&nbsp;&nbsp;操作人员的帐号名称<br />
<br />
5.3.&nbsp;&nbsp;&nbsp;&nbsp;OS_CURRENTSTEP_PREV<br />
前步骤表，存放当前步骤和上一个步骤的关联数据<br />
<br />
字段名&nbsp;&nbsp;&nbsp;&nbsp;数据类型&nbsp;&nbsp;&nbsp;&nbsp;说明<br />
ID&nbsp;&nbsp;&nbsp;&nbsp;NUMBER&nbsp;&nbsp;&nbsp;&nbsp;当前步骤编号<br />
PREVIOUS&nbsp;&nbsp;&nbsp;&nbsp;NUMBER&nbsp;&nbsp;&nbsp;&nbsp;前步骤编号<br />
<br />
5.4.&nbsp;&nbsp;&nbsp;&nbsp;OS_HISTORYSTEP<br />
历史步骤表，存放当前正在进行步骤的数据<br />
<br />
字段名&nbsp;&nbsp;&nbsp;&nbsp;数据类型&nbsp;&nbsp;&nbsp;&nbsp;说明<br />
ID&nbsp;&nbsp;&nbsp;&nbsp;NUMBER&nbsp;&nbsp;&nbsp;&nbsp;自动编号<br />
ENTRY_ID&nbsp;&nbsp;&nbsp;&nbsp;NUMBER&nbsp;&nbsp;&nbsp;&nbsp;工作流编号<br />
STEP_ID&nbsp;&nbsp;&nbsp;&nbsp;NUMBER&nbsp;&nbsp;&nbsp;&nbsp;步骤编号<br />
ACTION_ID&nbsp;&nbsp;&nbsp;&nbsp;NUMBER&nbsp;&nbsp;&nbsp;&nbsp;动作编号<br />
OWNER&nbsp;&nbsp;&nbsp;&nbsp;VARCHAR2(20)&nbsp;&nbsp;&nbsp;&nbsp;步骤的所有者<br />
START_DATE&nbsp;&nbsp;&nbsp;&nbsp;DATE&nbsp;&nbsp;&nbsp;&nbsp;开始时间<br />
FINISH_DATE&nbsp;&nbsp;&nbsp;&nbsp;DATE&nbsp;&nbsp;&nbsp;&nbsp;结束时间<br />
DUE_DATE&nbsp;&nbsp;&nbsp;&nbsp;DATE&nbsp;&nbsp;&nbsp;&nbsp;授权时间<br />
STATUS&nbsp;&nbsp;&nbsp;&nbsp;VARCHAR2(20)&nbsp;&nbsp;&nbsp;&nbsp;状态<br />
CALLER&nbsp;&nbsp;&nbsp;&nbsp;VARCHAR2(20)&nbsp;&nbsp;&nbsp;&nbsp;操作人员的帐号名称<br />
<br />
5.5.&nbsp;&nbsp;&nbsp;&nbsp;OS_HISTORYSTEP_PREV<br />
前历史步骤表，存放历史步骤和上一个步骤的关联数据<br />
<br />
字段名&nbsp;&nbsp;&nbsp;&nbsp;数据类型&nbsp;&nbsp;&nbsp;&nbsp;说明<br />
ID&nbsp;&nbsp;&nbsp;&nbsp;NUMBER&nbsp;&nbsp;&nbsp;&nbsp;当前历史步骤编号<br />
PREVIOUS&nbsp;&nbsp;&nbsp;&nbsp;NUMBER&nbsp;&nbsp;&nbsp;&nbsp;前历史步骤编号<br />
<br />
5.6.&nbsp;&nbsp;&nbsp;&nbsp;OS_PROPERTYENTRY<br />
属性表，存放临时变量<br />
<br />
字段名&nbsp;&nbsp;&nbsp;&nbsp;数据类型&nbsp;&nbsp;&nbsp;&nbsp;说明<br />
GLOBAL_KEY&nbsp;&nbsp;&nbsp;&nbsp;VARCHAR2(255)&nbsp;&nbsp;&nbsp;&nbsp;全局关键字<br />
ITEM_KEY&nbsp;&nbsp;&nbsp;&nbsp;VARCHAR2(255)&nbsp;&nbsp;&nbsp;&nbsp;条目关键字<br />
ITEM_TYPE&nbsp;&nbsp;&nbsp;&nbsp;NUMBER&nbsp;&nbsp;&nbsp;&nbsp;条目类型<br />
STRING_VALUE&nbsp;&nbsp;&nbsp;&nbsp;VARCHAR2(255)&nbsp;&nbsp;&nbsp;&nbsp;字符值<br />
DATE_VALUE&nbsp;&nbsp;&nbsp;&nbsp;DATE&nbsp;&nbsp;&nbsp;&nbsp;日期值<br />
DATA_VALUE&nbsp;&nbsp;&nbsp;&nbsp;BLOB&nbsp;&nbsp;&nbsp;&nbsp;数据值<br />
FLOAT_VALUE&nbsp;&nbsp;&nbsp;&nbsp;FLOAT&nbsp;&nbsp;&nbsp;&nbsp;浮点值<br />
          <br/><br/>
          <span style="color:red;">
            <a href="http://pfwang.javaeye.com/blog/98187#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</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>Thu, 05 Jul 2007 17:05:33 +0800</pubDate>
        <link>http://pfwang.javaeye.com/blog/98187</link>
        <guid>http://pfwang.javaeye.com/blog/98187</guid>
      </item>
          <item>
        <title>osworkflow代码分析</title>
        <author>pfwang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pfwang.javaeye.com">pfwang</a>&nbsp;
                    链接：<a href="http://pfwang.javaeye.com/blog/98185" style="color:red;">http://pfwang.javaeye.com/blog/98185</a>&nbsp;
          发表时间: 2007年07月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>1.com.opensymphony.workflow.Workflow 工作流的用户接口。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 主要定义了用户对工作流的操作方法和用户获得工作流信息的方法。如doAction(long id, int actionId, Map inputs)方法可以执行工作流的Action并产生transaction；用户调用getAvailableActions(long id, Map inputs)可以获得知道工作流实例中符合条件的可以执行的Action。</p>
<p>2.com.opensymphony.workflow.WorkflowContext 工作流的Context接口。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 只有两个方法，其中getCaller()获得调用者，setRollbackOnly()可以回滚Action造成的transaction。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setRollbackOnly()方法非常重要，可以在此方法中实现工作流数据与业务数据的事务处理。由于工作流引擎将流程数据与业务数据分离开管理，所以工作流数据与业务数据之间的事务处理往往比较困难，甚至有很多商业的工作流引擎都没有解决这个问题，造成软件上的漏洞。可惜在BasicWorkflowContext中并没有实现回滚时的事务处理，但实现起来应该不会很困难，在以后会单独考虑。</p>
<p>3.com.opensymphony.workflow.spi.WorkflowEntry 工作流实例的接口。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 定义了获得工作流实例信息的方法。</p>
<p>4.com.opensymphony.workflow.config.Configuration 工作流配置接口。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 获得osworkflw的配置信息和流程的定义信息， osworkflow中的例子就是使用此接口的默认实现。如果想让osworkflw与自己的系统更好的整合，这个接口需要自己实现。</p>
<p>5.com.opensymphony.workflow.loader.AbstractWorkflowFactory 流程定义的解析器。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; osworkflow中提供了此抽象类的3种实现，最常用的是XMLWorkflowFactory，可以对编写的工作流定义xml文件进行解析。</p>
<p>6.com.opensymphony.workflow.spi.WorkflowStore 工作流存储接口。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;实现此接口可以实现用多种途径保存工作流信息，jdbc,hibernate,ejb,memory.........<br />
<br />
</p>
<p>AbstractWorkflow类是workflow接口的最基本的实现。</p>
<p>1.public int[] getAvailableActions(long id, Map inputs)方法：</p>
<p>返回当前可以执行的Ation。</p>
<ul>
    <li>得到工作流流程实例。 </li>
    <li>得到工作流实例的定义。 </li>
    <li>得到工作流实例的PropertySet。 </li>
    <li>得到工作流的当前Step。 </li>
    <li>产生TransientVars。 </li>
    <li>得到Global Actions。 </li>
    <li>判断可以执行的Global Action增加到可执行Action列表中。 </li>
    <li>获得当前Steps中的可执行Action并添加到可执行Action列表中。 </li>
    <li>返回可执行Actions。 </li>
</ul>
<p>2. public void setConfiguration(Configuration configuration)方法：</p>
<p>设置工作流配置方法。</p>
<p>3.public Configuration getConfiguration()方法：</p>
<p>返回工作流配置方法，如果没有获得配置信息，初始化配置信息。</p>
<p>4.public List getCurrentSteps(long id)：</p>
<p>获得工作流当前所在步骤。</p>
<p>5.public int getEntryState(long id):</p>
<p>获得工作流的状态。</p>
<p>6.public List getHistorySteps(long id)</p>
<p>获得工作流的历史步骤。</p>
<p>7. public Properties getPersistenceProperties()</p>
<p>获得设置的持久化参数。</p>
<p>8.public PropertySet getPropertySet(long id)</p>
<p>得到工作流的PropertySet，调用store中的方法。</p>
<p>9.public List getSecurityPermissions(long id)</p>
<p>得到工作流当前Step的permissions。</p>
<p>10.public WorkflowDescriptor getWorkflowDescriptor(String workflowName)</p>
<p>得到工作流的定义。</p>
<p>11.public String getWorkflowName(long id)</p>
<p>根据工作流实例返回工作流定义名。</p>
<p>12. public String[] getWorkflowNames()</p>
<p>返回系统中配置的所有工作流的名字。</p>
<p>13.public boolean canInitialize(String workflowName, int initialAction)，public boolean canInitialize(String workflowName, int initialAction, Map inputs)，private boolean canInitialize(String workflowName, int initialAction, Map transientVars, PropertySet ps) throws WorkflowException</p>
<p>判断指定的工作流初始化Action是不是可以执行。</p>
<p>14.public boolean canModifyEntryState(long id, int newState)</p>
<p>判断工作流是不是可以转换到指定状态。</p>
<ul>
    <li>不可以转换到CREATED状态。 </li>
    <li>CREATED，SUSPENDED可以转换到ACTIVATED状态。 </li>
    <li>ACTIVATED可以转换到SUSPENDED状态。 </li>
    <li>CREATED，ACTIVATED，SUSPENDED&nbsp;可以转换到KILLED状态。 </li>
</ul>
<p>15.public void changeEntryState(long id, int newState) throws WorkflowException</p>
<p>转换工作流状态。</p>
<p>16.public void doAction(long id, int actionId, Map inputs) throws WorkflowException</p>
<p>执行Action。</p>
<ul>
    <li>获得工作流store，和流程实例entry。 </li>
    <li>判断是不是活动的工作流，不是就返回。 </li>
    <li>获得工作流的定义。 </li>
    <li>获得工作流当前所再Steps。 </li>
    <li>获得工作流PropertySet。 </li>
    <li>生成transientVars。 </li>
    <li>从GlobalActions中和当前Steps的普通Actions中判断执行的Action是否试可执行的。 </li>
    <li>完成Action的Transition。 </li>
</ul>
<p>17.public void executeTriggerFunction(long id, int triggerId) throws WorkflowException</p>
<p>调用工作流的Trigger Function</p>
<p>18.public long initialize(String workflowName, int initialAction, Map inputs) throws InvalidRoleException, InvalidInputException, WorkflowException</p>
<p>初始化一个新的流程实例。返回流程实例id。</p>
<p>19.public List query(WorkflowQuery query)，public List query(WorkflowExpressionQuery query)</p>
<p>查询流程实例。</p>
<p>20.public boolean removeWorkflowDescriptor(String workflowName) throws FactoryException</p>
<p>删除已经配置的工作流定义。</p>
<p>21.public boolean saveWorkflowDescriptor(String workflowName, WorkflowDescriptor descriptor, boolean replace) throws FactoryException </p>
<p>保存工作流定义。</p>
<p>22.protected List getAvailableActionsForStep(WorkflowDescriptor wf, Step step, Map transientVars, PropertySet ps) throws WorkflowException</p>
<p>获得指定步骤的可用Actions。</p>
<p>23.protected int[] getAvailableAutoActions(long id, Map inputs)</p>
<p>返回可执行的AutoActions。</p>
<p>24.protected List getAvailableAutoActionsForStep(WorkflowDescriptor wf, Step step, Map transientVars, PropertySet ps) throws WorkflowException </p>
<p>返回指定Step中可执行的AutoActions。</p>
<p>25.protected WorkflowStore getPersistence() throws StoreException</p>
<p>返回配置的store。</p>
<p>26.protected void checkImplicitFinish(long id) throws WorkflowException</p>
<p>判断工作流是不是还有可执行的Action，如果没有，完成此工作流实例。</p>
<p>27.protected void completeEntry(long id, Collection currentSteps) throws StoreException</p>
<p>结束工作流实例，就是把改变流程实例的状态并把当前的Steps都放入到历史表中。&nbsp;</p>
<p>28.protected boolean passesCondition(ConditionDescriptor conditionDesc, Map transientVars, PropertySet ps, int currentStepId) throws WorkflowException</p>
<p>29.protected boolean passesCondition(ConditionDescriptor conditionDesc, Map transientVars, PropertySet ps, int currentStepId) throws WorkflowException，protected boolean passesConditions(String conditionType, List conditions, Map transientVars, PropertySet ps, int currentStepId) throws WorkflowException </p>
<p>判断条件是不是符合。</p>
<p>30.protected void populateTransientMap(WorkflowEntry entry, Map transientVars, List registers, Integer actionId, Collection currentSteps) throws WorkflowException</p>
<p>产生临时变量transientVars，包含context，entry，store，descriptor，actionId，currentSteps，以及定义的register和用户的输入变量。</p>
<p>31.protected void verifyInputs(WorkflowEntry entry, List validators, Map transientVars, PropertySet ps) throws WorkflowException</p>
<p>验证用户的输入。</p>
<p>32.private boolean isActionAvailable(ActionDescriptor action, Map transientVars, PropertySet ps, int stepId) throws WorkflowException</p>
<p>判断Action是否可用。</p>
<p>33.private Step getCurrentStep(WorkflowDescriptor wfDesc, int actionId, List currentSteps, Map transientVars, PropertySet ps) throws WorkflowException </p>
<p>获得Action所在Step。</p>
<p>34.private boolean canInitialize(String workflowName, int initialAction, Map transientVars, PropertySet ps) throws WorkflowException</p>
<p>判断工作流是不是可以实例化。</p>
<p>35.private Step createNewCurrentStep(ResultDescriptor theResult, WorkflowEntry entry, WorkflowStore store, int actionId, Step currentStep, long[] previousIds, Map transientVars, PropertySet ps) throws WorkflowException </p>
<p>产生新的当前Step。</p>
<ul>
    <li>从resulte中获得nextStep，如果为-1，nextStep为当前Step。 </li>
    <li>获得定义中的owner，oldStatus，status。 </li>
    <li>完成当前Step，并且将当前Step保存到历史库中。 </li>
    <li>生成新的Step。 </li>
</ul>
<p>36.private void executeFunction(FunctionDescriptor function, Map transientVars, PropertySet ps) throws WorkflowException</p>
<p>执行Function。</p>
<p>37.private boolean transitionWorkflow(WorkflowEntry entry, List currentSteps, WorkflowStore store, WorkflowDescriptor wf, ActionDescriptor action, Map transientVars, Map inputs, PropertySet ps) throws WorkflowException </p>
<p>完成工作流的transation。<br />
<br />
</p>
<div>DefaultConfiguration是Configuration接口的默认实现，用于初始化系统的基本配置信息。</div>
<div>1.public WorkflowDescriptor getWorkflow(String name) throws FactoryException</div>
<div>根据工作流的定义名获得工作流的定义。</div>
<div>2.public WorkflowStore getWorkflowStore() throws StoreException </div>
<div>获得配置的持久化类Store。</div>
<div>3.public void load(URL url) throws FactoryException</div>
<div>装载配置信息。</div>
<ul>
    <li>得到配置文件流，并解析。 </li>
    <li>获得持久化信息，包括持久化类的路径和持久化类初始化参数。 </li>
    <li>获得工作流信息解析类路径，并初始化。 </li>
</ul>
<p>4. public WorkflowStore getWorkflowStore() throws StoreException </p>
<p>获得工作流初始化类。<br />
<br />
</p>
<div>XMLWorkflowFactory用于解析工作流定义xml文件，获得工作流信息。</div>
<div>1.public WorkflowDescriptor getWorkflow(String name) throws FactoryException </div>
<div>根据工作流定义名获得工作流定义。</div>
<div>2.public String[] getWorkflowNames()</div>
<div>得到所有已经定义的工作流名称。</div>
<div>3.public void initDone() throws FactoryException</div>
<div>初始化workflows.xml文件中列出的工作流定义文件信息。<br />
<br />
</div>
          <br/><br/>
          <span style="color:red;">
            <a href="http://pfwang.javaeye.com/blog/98185#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 05 Jul 2007 17:02:30 +0800</pubDate>
        <link>http://pfwang.javaeye.com/blog/98185</link>
        <guid>http://pfwang.javaeye.com/blog/98185</guid>
      </item>
          <item>
        <title>osworkflow概念 </title>
        <author>pfwang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pfwang.javaeye.com">pfwang</a>&nbsp;
                    链接：<a href="http://pfwang.javaeye.com/blog/98161" style="color:red;">http://pfwang.javaeye.com/blog/98161</a>&nbsp;
          发表时间: 2007年07月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>1. Step：工作流所在的位置，整个工作流的步骤，也可以是一系列工作中的某个工作，比如某个审批流程中的文件交到某个领导处审批，此过程可能包括接收秘书交来的文件、然后阅读、提出自己的意见、签字、叫给秘书继续处理，这整个过程可以是一个Step。但并不是FSM中的Status。</p>
<p>2. Status：某个Step的状态，每个Step可以有多个Status。比如上例中阅读，等待提意见，等待签字，等待交秘书处理，都是Step的状态。Step＋Status共同组成了工作流的状态，也就实现了FSM中的Status。Step的Status在OSWorkflow中就是一段文本，状态的判断其实就是自定义的一段文本的比较，非常灵活。</p>
<p>3. Action：造成工作流状态转换的动作，比如&rdquo;阅读文件&ldquo;动作，造成了工作流状态从&rdquo;领导审批＋等待阅读&quot;转换成&ldquo;领导审批＋等待提出意见&rdquo;。由于工作流的状态是Step＋Status，所以Action可以造成Stats的变化，也可以造成Step的变化。</p>
<p>4. Result：工作流状态的转换，也就是Action造成的结果。也就是FSM中的Transition。每个Action中至少包含一个unconditional result和包含0或多个conditional result，Result的优先级顺序是 第一个符合条件的conditional result &gt;&nbsp;其他符合条件的conditional result&nbsp;&nbsp;&gt; unconditional result。</p>
<p>5.Split/Join:字面意思就可以解释。Split可以产生多个unconditional result；而Join可以判断多个Step的状态，如果都满足条件的时候，Join产生一个unconditional result。可以用来实现其他工作流产品定义中的同步区的作用，比如一个投标文件的评标过程，分别要在技术方面和商务方面对标书进行评分，这样就可以使用Split将工作流分开进入商务评标组和技术评标组分别进行评标，当两个评标过程都完成后使用Join将两个流程合并，并对两个评标做的评分进行汇总。</p>
<p>6.External Functions：执行的功能和动作。任何的工作流引擎都要与实际的业务操作相结合，External Functions就是OSWorkflow中执行业务操作的部分，比如审批流程中，领导填写意见后将领导的意见更新到业务数据库中的过程。Functions有两种类型，pre step function和post step function，分别发生转移前和发生转移后执行。Functions可以被定义到Step中和Action中。</p>
<p>7.Trigger Functions，一种不是定义在Action中的Function，依靠计划自动执行。</p>
<p>8.Validators：用来检验用户输入是否符合条件，只有符合条件，Action对应的转移才能执行，如果不符合条件，返回<em>InvalidInputException</em>异常。<br />
</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://pfwang.javaeye.com/blog/98161#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</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>Thu, 05 Jul 2007 16:16:47 +0800</pubDate>
        <link>http://pfwang.javaeye.com/blog/98161</link>
        <guid>http://pfwang.javaeye.com/blog/98161</guid>
      </item>
          <item>
        <title>用PowerDesigner生成注释要注意的问题</title>
        <author>pfwang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pfwang.javaeye.com">pfwang</a>&nbsp;
                    链接：<a href="http://pfwang.javaeye.com/blog/96891" style="color:red;">http://pfwang.javaeye.com/blog/96891</a>&nbsp;
          发表时间: 2007年07月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          错误信息：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 服务器: 消息 15135，级别 16，状态 1，过程 sp_validatepropertyinputs，行 100. 对象无效。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不允许在 '.cash_flux' 上使用扩展属性，或对象不存在。<br />
<br />
在使用PowerDesigner11.0设计数据库时，没有为表指定Owner，于是出现了上述错误，因为我需要为表和字段生成注释，如下：<br />
execute sp_addextendedproperty 'MS_Description', <br />
&nbsp;&nbsp; '客户-现金流量表',<br />
&nbsp;&nbsp; 'user', '', 'table', 'cash_flux'<br />
go<br />
在执行存储过程sp_addextendedproperty 时需要调用存储过程sp_validatepropertyinputs来验证其参数是否有效，<font color="#ff0000">所以在设计数据库时最好为表指定其Owner 为dbo</font>
          <br/><br/>
          <span style="color:red;">
            <a href="http://pfwang.javaeye.com/blog/96891#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 02 Jul 2007 13:18:48 +0800</pubDate>
        <link>http://pfwang.javaeye.com/blog/96891</link>
        <guid>http://pfwang.javaeye.com/blog/96891</guid>
      </item>
          <item>
        <title>使用JFreeChart生成热点图表</title>
        <author>pfwang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pfwang.javaeye.com">pfwang</a>&nbsp;
                    链接：<a href="http://pfwang.javaeye.com/blog/88927" style="color:red;">http://pfwang.javaeye.com/blog/88927</a>&nbsp;
          发表时间: 2007年06月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          ＜一＞前言：<br />
<br />
　　JFreeChart是开放源代码站点SourceForge.net上的一个JAVA项目。它的功能十分强大，能创建饼图、柱状图(普通柱状图以及堆栈柱状图)、线图、区域图、分布图、混合图、甘特图以及一些仪表盘等等，并可生成PNG或JPG图片格式文件。<br />
　　本人在学习过程中发现，网上很多文章都是讲一些JFreeChart的基本应用，而对JFreeChart生成热点图表这样常用的功能虽有所提及却没有一个完整的例子，所以我就写一个简单示例供大家参考，希望对大家的学习有所帮助。 <br />
<br />
　　＜二＞示例说明：<br />
<br />
　　假设有一个关于程序员北京，上海，广洲三地程序员学历，开发语言，薪金情况的调查。首先要以饼图显示程序员学历的分布情况(index.jsp)。点击饼图的每一部分会以柱状图显示该层次程序员所用开发语言和薪金的情况(barview.jsp)。重点演示怎样在饼图上添加链接。 <br />
<br />
　　＜三＞准备工作：<br />
<br />
　　1.下载最新版本的JFreeChart,当前为jfreechart-1.0.0-rc1<br />
下载地址：http://www.jfree.org/jfreechart/index.html<br />
<br />
　　2.解压文件，将jfreechart-1.0.0-rc1/lib下的jcommon-1.0.0-rc1.jar，jfreechart-1.0.0-rc1.jar复制到WEB应用的lib目录下。<br />
<br />
　　3.在web.xml文件中增加以下内容：<br />
<br />
<table border="1" bordercolor="#ffcc66" align="center" bgcolor="#e3e3e3" width="90%">
    <tbody>
        <tr>
            <td>＜servlet＞ <br />
            ＜servlet-name＞DisplayChart＜/servlet-name＞ <br />
            ＜servlet-class＞org.jfree.chart.servlet.DisplayChart＜/servlet-class＞ <br />
            ＜/servlet＞ <br />
            ＜servlet-mapping＞ <br />
            ＜servlet-name＞DisplayChart＜/servlet-name＞ <br />
            ＜url-pattern＞/servletDisplayChart＜/url-pattern＞ <br />
            ＜/servlet-mapping＞ </td>
        </tr>
    </tbody>
</table>
<br />
　　＜四＞饼图页面代码（index.jsp） <br />
<br />
<table border="1" bordercolor="#ffcc66" align="center" bgcolor="#e3e3e3" width="90%">
    <tbody>
        <tr>
            <td><br />
            ＜%@ page contentType=&quot;text/html;charset=GBK&quot;%＞ <br />
            ＜%@ page import=&quot;org.jfree.data.general.DefaultPieDataset&quot;%＞ <br />
            ＜%@ page import=&quot;org.jfree.chart.*&quot;%＞ <br />
            ＜%@ page import=&quot;org.jfree.chart.plot.*&quot;%＞ <br />
            ＜%@ page import=&quot;org.jfree.chart.servlet.ServletUtilities&quot;%＞ <br />
            ＜%@ page import=&quot;org.jfree.chart.labels.StandardPieItemLabelGenerator&quot;%＞ <br />
            ＜%@ page import=&quot;org.jfree.chart.urls.StandardPieURLGenerator&quot;%＞ <br />
            ＜%@ page import=&quot;org.jfree.chart.entity.StandardEntityCollection&quot;%＞ <br />
            ＜%@ page import=&quot;java.io.*&quot;%＞ <br />
            ＜HTML＞ <br />
            ＜HEAD＞ <br />
            ＜META http-equiv=Content-Type content=&quot;text/html; charset=GBK&quot;＞ <br />
            ＜TITLE＞nacl_zhuang@hotmail.com＜/TITLE＞ <br />
            ＜/HEAD＞ <br />
            ＜BODY＞ <br />
            ＜% <br />
            <br />
            DefaultPieDataset data = new DefaultPieDataset(); <br />
            data.setValue(&quot;高中以下&quot;,370); <br />
            data.setValue(&quot;高中&quot;,1530); <br />
            data.setValue(&quot;大专&quot;,5700); <br />
            data.setValue(&quot;本科&quot;,8280); <br />
            data.setValue(&quot;硕士&quot;,4420); <br />
            data.setValue(&quot;博士&quot;,80); <br />
            <br />
            PiePlot3D plot = new PiePlot3D(data);//3D饼图 <br />
            plot.setURLGenerator(new StandardPieURLGenerator(&quot;barview.jsp&quot;));//设定链接 <br />
            JFreeChart chart = new JFreeChart(&quot;&quot;,JFreeChart.DEFAULT_TITLE_FONT, plot, true); <br />
            chart.setBackgroundPaint(java.awt.Color.white);//可选，设置图片背景色 <br />
            chart.setTitle(&quot;程序员学历情况调查表&quot;);//可选，设置图片标题 <br />
            plot.setToolTipGenerator(new StandardPieItemLabelGenerator()); <br />
            StandardEntityCollection sec = new StandardEntityCollection(); <br />
            ChartRenderingInfo info = new ChartRenderingInfo(sec); <br />
            PrintWriter w = new PrintWriter(out);//输出MAP信息 <br />
            //500是图片长度，300是图片高度 <br />
            String filename = ServletUtilities.saveChartAsPNG(chart, 500, 300, info, session); <br />
            ChartUtilities.writeImageMap(w, &quot;map0&quot;, info, false); <br />
            <br />
            String graphURL = request.getContextPath() + &quot;/servlet/DisplayChart?filename=&quot; + filename; <br />
            <br />
            %＞ <br />
            <br />
            ＜P ALIGN=&quot;CENTER&quot;＞ <br />
            ＜img src=&quot;＜%= graphURL %＞&quot; width=500 height=300 border=0 usemap=&quot;#map0&quot;＞ <br />
            ＜/P＞ <br />
            ＜/BODY＞ <br />
            ＜/HTML＞ </td>
        </tr>
    </tbody>
</table>
<br />
　　生成的图片如下<br />
<br />
<table border="0" align="center" width="90%">
    <tbody>
        <tr>
            <td>
            <div align="center"><img src="http://dev.yesky.com/imagelist/05/07/3xz313engrxf.png" alt="" /></div>
            </td>
        </tr>
    </tbody>
</table>
<br />
　　在浏览器中点右键－＞查看源文件会发现有以下一段HTML代码： <br />
<br />
<table border="1" bordercolor="#ffcc66" align="center" bgcolor="#e3e3e3" width="90%">
    <tbody>
        <tr>
            <td>＜map id=&quot;map0&quot; name=&quot;map0&quot;＞ <br />
            ＜area shape=&quot;poly&quot; coords=&quot;247,61,250,61,250,123,250,123&quot; title=&quot;博士 = 80&quot; alt=&quot;&quot; href=&quot;barview.jsp?category=博士&amp;pieIndex=0&quot;/＞ <br />
            ＜area shape=&quot;poly&quot; coords=&quot;148,112,153,102,160,92,170,83,182,76,196,70,212,65,229,62,247,61,250,123,250,123&quot; title=&quot;硕士 = 4,420&quot; alt=&quot;&quot; href=&quot;barview.jsp?category=硕士&amp;pieIndex=0&quot;/＞ <br />
            ＜area shape=&quot;poly&quot; coords=&quot;324,167,311,173,297,179,282,182,266,185,250,186,234,185,217,183,202,179,188,173,175,167,<br />
            　 165,159,157,151,151,142,147,132,146,122,148,112,250,123,250,123&quot; title=&quot;本科 = 8,280&quot; alt=&quot;&quot; <br />
            　href=&quot;barview.jsp?category=本科&amp;pieIndex=0&quot;/＞ <br />
            ＜area shape=&quot;poly&quot; coords=&quot;307,72,324,80,338,91,347,103,352,117,352,131,347,144,338,156,324,167,250,123,250,123&quot; title=&quot;大专 = 5,700&quot; alt=&quot;&quot; href=&quot;barview.jsp?category=大专&amp;pieIndex=0&quot;/＞ <br />
            ＜area shape=&quot;poly&quot; coords=&quot;261,62,285,65,307,72,250,123,250,123&quot; title=&quot;高中 <br />
            　= 1,530&quot; alt=&quot;&quot; href=&quot;barview.jsp?category=高中&amp;pieIndex=0&quot;/＞ <br />
            ＜area shape=&quot;poly&quot; coords=&quot;250,61,261,62,250,123,250,123&quot; title=&quot;高中以下 = 370&quot; alt=&quot;&quot; href=&quot;barview.jsp?category=高中以下&amp;pieIndex=0&quot;/＞ <br />
            ＜/map＞ </td>
        </tr>
    </tbody>
</table>
<br />
<br />
　　这就是MAP信息，我们在IMG标签中加入usemap=&quot;#map0&quot;就可以为饼图的每一部分加入链接。<br />
<br />
　　＜五＞柱状图页面代码：(barview.jsp)<br />
<br />
<table border="1" bordercolor="#ffcc66" align="center" bgcolor="#e3e3e3" width="90%">
    <tbody>
        <tr>
            <td>＜HTML＞ <br />
            ＜HEAD＞ <br />
            ＜META http-equiv=Content-Type content=&quot;text/html; charset=GBK&quot;＞ <br />
            ＜TITLE＞nacl_zhuang@hotmail.com＜/TITLE＞ <br />
            ＜/HEAD＞ <br />
            <br />
            ＜body＞ <br />
            <br />
            ＜%@ page contentType=&quot;text/html;charset=GBK&quot;%＞ <br />
            ＜%@ page import=&quot;org.jfree.chart.ChartFactory, <br />
            org.jfree.chart.JFreeChart, <br />
            org.jfree.chart.plot.PlotOrientation, <br />
            org.jfree.chart.servlet.ServletUtilities, <br />
            org.jfree.data.category.*&quot;%＞ <br />
            ＜% <br />
            CategoryDataset dataset; <br />
            String category=request.getParameter(&quot;category&quot;); <br />
            category= new String(category.getBytes(&quot;ISO8859_1&quot;), &quot;GBK&quot;); <br />
            if(category.equals(&quot;本科&quot;)||category.equals(&quot;高中&quot;)||category.equals(&quot;大专&quot;)) <br />
            { <br />
            　dataset=getDataSet(); <br />
            } <br />
            else if(category.equals(&quot;硕士&quot;)||category.equals(&quot;博士&quot;)) <br />
            { <br />
            　dataset=getDataSet2(); <br />
            }else <br />
            { <br />
            　dataset=getDataSet3(); <br />
            } <br />
            String title=category+&quot;程序员在各城市薪金情况统计&quot;; <br />
            JFreeChart chart = ChartFactory.createBarChart3D(title, <br />
            &quot;城市&quot;, <br />
            &quot;薪金&quot;, <br />
            dataset, <br />
            PlotOrientation.VERTICAL, <br />
            true, <br />
            false, <br />
            false); <br />
            <br />
            String filename = ServletUtilities.saveChartAsPNG(chart, 500, 300, null, session); <br />
            String graphURL = request.getContextPath() + &quot;/servlet/DisplayChart?filename=&quot; + filename; <br />
            %＞ <br />
            ＜P ALIGN=&quot;CENTER&quot;＞ <br />
            ＜img src=&quot;＜%= graphURL %＞&quot; width=500 height=300 border=0 usemap=&quot;#＜%= filename %＞&quot;＞ <br />
            ＜/P＞ <br />
            ＜%! <br />
            private static CategoryDataset getDataSet() { <br />
            　DefaultCategoryDataset dataset = new DefaultCategoryDataset(); <br />
            　dataset.addValue(2000, &quot;北京&quot;, &quot;VB&quot;); <br />
            　dataset.addValue(1800, &quot;上海&quot;, &quot;VB&quot;); <br />
            　dataset.addValue(2200, &quot;广州&quot;, &quot;VB&quot;); <br />
            　dataset.addValue(3200, &quot;北京&quot;, &quot;JAVA&quot;); <br />
            　dataset.addValue(3500, &quot;上海&quot;, &quot;JAVA&quot;); <br />
            　dataset.addValue(3600, &quot;广州&quot;, &quot;JAVA&quot;); <br />
            　dataset.addValue(3300, &quot;北京&quot;, &quot;DOT NET&quot;); <br />
            　dataset.addValue(3400, &quot;上海&quot;, &quot;DOT NET&quot;); <br />
            　dataset.addValue(3700, &quot;广州&quot;, &quot;DOT NET&quot;); <br />
            　dataset.addValue(2500, &quot;北京&quot;, &quot;DELPHI&quot;); <br />
            　dataset.addValue(2800, &quot;上海&quot;, &quot;DELPHI&quot;); <br />
            　dataset.addValue(3200, &quot;广州&quot;, &quot;DELPHI&quot;); <br />
            　dataset.addValue(5000, &quot;北京&quot;, &quot;VC&quot;); <br />
            　dataset.addValue(3500, &quot;上海&quot;, &quot;VC&quot;); <br />
            　dataset.addValue(4600, &quot;广州&quot;, &quot;VC&quot;); <br />
            　return dataset; <br />
            } <br />
            private static CategoryDataset getDataSet2() { <br />
            　DefaultCategoryDataset dataset = new DefaultCategoryDataset(); <br />
            　dataset.addValue(2000, &quot;上海&quot;, &quot;VB&quot;); <br />
            　dataset.addValue(3000, &quot;北京&quot;, &quot;JAVA&quot;); <br />
            　dataset.addValue(3330, &quot;上海&quot;, &quot;JAVA&quot;); <br />
            　dataset.addValue(3500, &quot;广州&quot;, &quot;JAVA&quot;); <br />
            　dataset.addValue(3500, &quot;北京&quot;, &quot;DOT NET&quot;); <br />
            　dataset.addValue(4000, &quot;上海&quot;, &quot;DOT NET&quot;); <br />
            　dataset.addValue(4800, &quot;广州&quot;, &quot;DOT NET&quot;); <br />
            　dataset.addValue(2600, &quot;北京&quot;, &quot;DELPHI&quot;); <br />
            　dataset.addValue(2200, &quot;上海&quot;, &quot;DELPHI&quot;); <br />
            　dataset.addValue(4000, &quot;北京&quot;, &quot;VC&quot;); <br />
            　dataset.addValue(4000, &quot;上海&quot;, &quot;VC&quot;); <br />
            　dataset.addValue(4200, &quot;广州&quot;, &quot;VC&quot;); <br />
            　return dataset; <br />
            } <br />
            private static CategoryDataset getDataSet3() { <br />
            　DefaultCategoryDataset dataset = new DefaultCategoryDataset(); <br />
            　dataset.addValue(2100, &quot;北京&quot;, &quot;VB&quot;); <br />
            　dataset.addValue(2200, &quot;上海&quot;, &quot;VB&quot;); <br />
            　dataset.addValue(2100, &quot;广州&quot;, &quot;VB&quot;); <br />
            　dataset.addValue(3000, &quot;北京&quot;, &quot;JAVA&quot;); <br />
            　dataset.addValue(3200, &quot;上海&quot;, &quot;JAVA&quot;); <br />
            　dataset.addValue(3600, &quot;广州&quot;, &quot;JAVA&quot;); <br />
            　dataset.addValue(4100, &quot;北京&quot;, &quot;DOT NET&quot;); <br />
            　dataset.addValue(4200, &quot;上海&quot;, &quot;DOT NET&quot;); <br />
            　dataset.addValue(4160, &quot;广州&quot;, &quot;DOT NET&quot;); <br />
            　dataset.addValue(2400, &quot;北京&quot;, &quot;DELPHI&quot;); <br />
            　dataset.addValue(2600, &quot;上海&quot;, &quot;DELPHI&quot;); <br />
            　dataset.addValue(2500, &quot;广州&quot;, &quot;DELPHI&quot;); <br />
            　dataset.addValue(5400, &quot;北京&quot;, &quot;VC&quot;); <br />
            　dataset.addValue(5000, &quot;上海&quot;, &quot;VC&quot;); <br />
            　dataset.addValue(5500, &quot;广州&quot;, &quot;VC&quot;); <br />
            　return dataset; <br />
            } <br />
            %＞ <br />
            ＜/body＞ <br />
            ＜/html＞ </td>
        </tr>
    </tbody>
</table>
<br />
　　生成图片如下： <br />
<br />
<table border="0" align="center" width="90%">
    <tbody>
        <tr>
            <td>
            <div align="center"><img src="http://dev.yesky.com/imagelist/05/07/d31esdqg2i74.png" alt="" /></div>
            </td>
        </tr>
    </tbody>
</table>
<br />
　　＜六＞后记<br />
<br />
　　1.这是本人发表的第一篇文章，如有不妥之处，请大家指正。<br />
<br />
　　2.本人以程序员学历调查为例，实属对很多企业不接受低学历程序员的现象身有感触。本人认为，如果一个低学历的人真正的的想做程序员，他就会比其他人更加刻苦学习更多的知识。如果一个企业愿意用一个没有学历的程序员，他也会对这家企业心存感激，认真工作，不会轻易跳槽。
          <br/><br/>
          <span style="color:red;">
            <a href="http://pfwang.javaeye.com/blog/88927#comments" style="color:red;">已有 <strong>1</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</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>Sun, 10 Jun 2007 15:53:00 +0800</pubDate>
        <link>http://pfwang.javaeye.com/blog/88927</link>
        <guid>http://pfwang.javaeye.com/blog/88927</guid>
      </item>
          <item>
        <title>jfreechart+sql实现时间曲线图(显示曲线数据点)</title>
        <author>pfwang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pfwang.javaeye.com">pfwang</a>&nbsp;
                    链接：<a href="http://pfwang.javaeye.com/blog/88928" style="color:red;">http://pfwang.javaeye.com/blog/88928</a>&nbsp;
          发表时间: 2007年06月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font size="2"><strong><font size="3">一、JFreeChart获取。</font></strong><br />
&nbsp;JFreeChart是JFreeChart公司在开源网站SourceForge.net上的一个项目，该公司的主要产品有如下：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、JFreeReport：报表解决工具<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、JFreeChart：Java图形解决方案（Application/Applet/Servlet/Jsp）<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、JCommon：JFreeReport和JFreeChart的公共类库<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4、JFreeDesigner：JFreeReport的报表设计工具</font></p>
<p><font size="2">&nbsp;&nbsp;&nbsp; 我们可以从jfree官方网站上获取最新版本和相关资料（但是jfree的document需要40美金才能获取），<br />
&nbsp;&nbsp;&nbsp; 获取地址：</font><a href="http://www.jfree.org/jfreechart/index.html"><font size="2">http://www.jfree.org/jfreechart/index.html</font></a><font size="2">（同时可以获得简明介绍）<br />
&nbsp;&nbsp;&nbsp; 我们以当前最新版本：jfreechart_0.9.21.zip为例子进行说明。</font></p>
<p><font size="2"><strong><font size="3">二、JFreeChart配置安装</font></strong><br />
&nbsp;&nbsp;&nbsp; 1、解压jfreechart_0.9.21.zip到指定位置，其中source是jfreechart的源码，jfreechart-0.9.21-demo.jar<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 是例子程序（该部分留给大家自己去研究）<br />
&nbsp;&nbsp;&nbsp; 2、为了配置成功，我们需要关注的文件有如下三个：jfreechart-0.9.21.jar、lib\jcommon-0.9.6.jar、<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lib\gnujaxp.jar<br />
&nbsp;&nbsp;&nbsp; 3、如果是Application开发，把上述三个文件拷贝到%JAVA_HOME%\LIB中，同时在环境变量CLASSPATH中加入<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果是WEB开发，以TOMCAT中的一个WEB项目TEST为例子说明：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 把上述三个文件拷贝到TEST\WEB-INF\LIB中，然后修改TEST\WEB-INF\web.xml文件，在其中加入如下代码：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;DisplayChart&lt;/servlet-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-class&gt;org.jfree.chart.servlet.DisplayChart&lt;/servlet-class&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/servlet&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-mapping&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;DisplayChart&lt;/servlet-name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;/servlet/DisplayChart&lt;/url-pattern&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/servlet-mapping&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 至此jfreechart的配置就完成了，下面就可以进行jfreechart的开发了。这里值得提出的是jfreechart的类<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 结构设计前后兼容性不是很好，不同版本的jfreechart中类库结构可能不一样，有时候可能需要查源码。如果<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 是中文显示的时候可能依据观感需要改变源码的字体，不过我个人觉得这个版本比以前版本要好一些。</font></p>
<p><strong>三、Demo</strong><br />
<font size="2">&lt;%@ page contentType=&quot;text/html;charset=GBK&quot;%&gt;<br />
&lt;%@ page import =&quot; java.awt.*,<br />
java.text.SimpleDateFormat,<br />
javax.swing.JPanel,<br />
org.jfree.chart.ChartFactory,<br />
org.jfree.chart.ChartPanel,<br />
org.jfree.chart.JFreeChart,<br />
org.jfree.chart.axis.DateAxis,<br />
org.jfree.chart.plot.XYPlot,<br />
org.jfree.chart.renderer.xy.XYItemRenderer,<br />
org.jfree.chart.renderer.xy.XYLineAndShapeRenderer,<br />
org.jfree.data.time.*,<br />
org.jfree.data.time.TimeSeries,<br />
org.jfree.data.time.TimeSeriesCollection,<br />
org.jfree.data.xy.XYDataset&quot;%&gt;<br />
&lt;%@ page import=&quot;org.jfree.chart.servlet.ServletUtilities&quot;%&gt;<br />
&lt;%@ page import=&quot;java.util.*&quot;%&gt;<br />
&lt;%@ page import = &quot;org.jfree.ui.RectangleInsets&quot;%&gt;<br />
&lt;%@ page import = &quot;java.sql.*&quot;%&gt;<br />
&lt;%<br />
//连接数据库<br />
Class.forName(&quot;com.microsoft.jdbc.sqlserver.SQLServerDriver&quot;).newInstance();<br />
String url=&quot;jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=jfree&quot;;<br />
String usr=&quot;sa&quot;;<br />
String pwd=&quot;&quot;;<br />
Connection conn=DriverManager.getConnection(url,usr,pwd);<br />
Statement stmt=conn.createStatement();<br />
String sql=&quot;select * from jfree order by id&quot;;<br />
ResultSet rs=stmt.executeQuery(sql);</font></p>
<p><font size="2">//设置曲线，共三条曲线<br />
TimeSeries timeseries = new TimeSeries(&quot;平均&quot;,Minute.class);//时间的最小单位为分，线值名是&ldquo;平均&rdquo;<br />
TimeSeries timeseries1 = new TimeSeries(&quot;usl&quot;,Minute.class);<br />
TimeSeries timeseries2 = new TimeSeries(&quot;lsl&quot;,Minute.class);</font></p>
<p><font size="2">//从数据库中取值，数据和时间<br />
while(rs.next())<br />
{<br />
float y0=rs.getFloat(&quot;lengthavg&quot;);<br />
float y1=rs.getFloat(&quot;lengthusl&quot;);<br />
float y2=rs.getFloat(&quot;lengthlsl&quot;);<br />
String s=rs.getString(&quot;addtime&quot;);<br />
//从yyyyMMddHHmm时间格式的char中取出年月日小时分设为int值<br />
int x=Integer.parseInt(s.substring(0,4));<br />
int y=Integer.parseInt(s.substring(4,6));<br />
int z=Integer.parseInt(s.substring(6,8));<br />
int a=Integer.parseInt(s.substring(8,10));<br />
int b=Integer.parseInt(s.substring(10,12));</font></p>
<p><font size="2">timeseries.add(new Minute(b,new Hour(a,new Day(z,y,x))),y0);<br />
timeseries1.add(new Minute(b,new Hour(a,new Day(z,y,x))),y1);<br />
timeseries2.add(new Minute(b,new Hour(a,new Day(z,y,x))),y2);</font></p>
<p><font size="2">}</font></p>
<p><font size="2">//连接曲线<br />
TimeSeriesCollection dataset = new TimeSeriesCollection();<br />
dataset.addSeries(timeseries);<br />
dataset.addSeries(timeseries1);<br />
dataset.addSeries(timeseries2);<br />
dataset.setDomainIsPointsInTime(true);</font></p>
<p><font size="2">//设置曲线图<br />
XYDataset xydataset = (XYDataset) dataset;<br />
JFreeChart chart = ChartFactory.createTimeSeriesChart(<br />
&quot;走势图&quot;,<br />
&quot;时间&quot;,<br />
&quot;值&quot;,<br />
xydataset,<br />
true,<br />
true,<br />
true<br />
);<br />
chart.setBackgroundPaint(Color.white);//设置曲线图背景色</font></p>
<p><font size="2">XYPlot plot = (XYPlot) chart.getPlot();<br />
XYLineAndShapeRenderer xylineandshaperenderer = (XYLineAndShapeRenderer)plot.getRenderer();<br />
plot.setBackgroundPaint(Color.white));//设置网格背景颜色<br />
plot.setDomainGridlinePaint(Color.pink);//设置网格竖线颜色<br />
plot.setRangeGridlinePaint(Color.pink);//设置网格横线颜色<br />
plot.setAxisOffset(new RectangleInsets(0D, 0D, 0D, 10D));//设置曲线图与xy轴的距离<br />
xylineandshaperenderer.setBaseShapesVisible(true);//设置曲线是否显示数据点</font></p>
<p><font size="2">String filename = ServletUtilities.saveChartAsPNG(chart, 500, 300, null, session);<br />
String graphURL = request.getContextPath() + &quot;/servlet/DisplayChart?filename=&quot; + filename;<br />
%&gt;<br />
&lt;img src=&quot;&lt;%= graphURL %&gt;&quot; border=0 usemap=&quot;#&lt;%= filename %&gt;&quot;&gt;</font></p>
<p><br />
<font size="2">另外说一下，以前看到有很多人都说不能显示图，出来一个叉，一般那都是设置的servlet的错，我看到有的人就是用设置为servlets的<br />
所以就要在String graphURL = request.getContextPath() + &quot;/<font color="#ff0000">servlet</font>/DisplayChart?filename=&quot; + filename;中<br />
改为String graphURL = request.getContextPath() + &quot;/<font color="#ff0000">servlets</font> /DisplayChart?filename=&quot; + filename;的<br />
这个都要具体对待，出来叉的话有一点是肯定的，程序代码中没有程序错误，只是路径错误而已</font></p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://pfwang.javaeye.com/blog/88928#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</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>Sun, 10 Jun 2007 15:52:36 +0800</pubDate>
        <link>http://pfwang.javaeye.com/blog/88928</link>
        <guid>http://pfwang.javaeye.com/blog/88928</guid>
      </item>
          <item>
        <title>深入探究JFreeChart（2）   </title>
        <author>pfwang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pfwang.javaeye.com">pfwang</a>&nbsp;
                    链接：<a href="http://pfwang.javaeye.com/blog/83939" style="color:red;">http://pfwang.javaeye.com/blog/83939</a>&nbsp;
          发表时间: 2007年05月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>3&nbsp;&nbsp;数据源处理<br />
<br />
JFreeChart&nbsp;中的数据源是DataSet接口类型。该接口有三个主要的子类接口：CategoryDataset、PieDataset、SeriesDataset<br />
<br />
CategoryDataset&nbsp;接口的实现类基本上都维护了一个三元组的列表结构。不同的实现类中value&nbsp;的类型不相同。唯一确定一个三元组。CategoryDataset的实现类提供对这个三元组的增删改查操作。<br />
<br />
PieDataset&nbsp;接口有两个主要的实现类：CategoryToPieDataset&nbsp;、DefaultPieDataset。PieDataset接口的实现类基本上都维护了一个二元组的列表结构。Key唯一确定一个二元组。CategoryDataset的实现类提供对这个二元组的增删改查操作。CategoryToPieDataset中的二元结构列表通过对CategoryDataset类型的对象指定行或者列转化过来。DefaultPieDataset直接维护一个二元结构列表。<br />
<br />
SeriesDataset&nbsp;接口的实现类基本上都维护了一种特定数据结构的列表。以TimeSeriesCollection为例。它维护一个TimeSeries对象列表，提供对该列表的增删查操作。每个TimeSeries对象维护一个列表，提供对该列表的增删改查操作。<br />
三&nbsp;JFreeChart&nbsp;中对常见图形的处理<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JFreeChart&nbsp;并不存在多个不同的类来生成不同的图形。所有的图形都是具体类&nbsp;JFreeChart&nbsp;的实例化对象，初始化&nbsp;JFreeChart&nbsp;对象的时候通过指定不同的&nbsp;Plot&nbsp;实现类就可以显示出不同的图形。不同的&nbsp;Plot&nbsp;实现类具有不同的&nbsp;Renderer&nbsp;对象、&nbsp;Axis&nbsp;对象、&nbsp;Dataset&nbsp;对象。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JFreeChart&nbsp;提供工厂类&nbsp;ChartFactory&nbsp;方便使用者生成各种不同的图形。&nbsp;ChartFactory&nbsp;类的各个工厂方法中实现对具体&nbsp;Plot&nbsp;的指定以及对类&nbsp;JFreeChart&nbsp;构造函数的调用。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;下面以常用图形说一下常用的使用流程（大部分的操作讲的并不全面，比如&nbsp;JFreeChart&nbsp;可能提供了很多增加、修改数据的方式，下文中可能只列举一种）。<br />
1&nbsp;柱状图<br />
<br />
（&nbsp;1&nbsp;）平面柱状图<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;生成柱状图操作：<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JFreeChart&nbsp;chart&nbsp;=&nbsp;ChartFactory.createBarChart(<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;title,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;图标题<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;categoryAxisLabel,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//x&nbsp;轴标题<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;valueAxisLabel,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//y&nbsp;轴标题<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CategoryDataset&nbsp;dataset,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;数据源<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PlotOrientation&nbsp;orientation,&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;显示方向<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;boolean&nbsp;legend,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;是否显示图例<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;boolean&nbsp;tooltips,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;是否显示&nbsp;tooltip<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;boolean&nbsp;urls)&nbsp;；&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;是否指定&nbsp;url<br />
<br />
平面柱状图的&nbsp;Plot&nbsp;对象是&nbsp;CategoryPlot&nbsp;类型。&nbsp;CategoryPlot&nbsp;对象的&nbsp;x&nbsp;轴是&nbsp;CategoryAxis&nbsp;对象，&nbsp;y&nbsp;轴是&nbsp;NumberAxis&nbsp;对象，绘制单元是&nbsp;BarRenderer&nbsp;对象，数据源是&nbsp;CategoryDataset&nbsp;对象。<br />
<br />
&nbsp;<br />
<br />
获取&nbsp;CategoryPlot&nbsp;对象操作为：<br />
<br />
CategoryPlot&nbsp;plot&nbsp;=&nbsp;(&nbsp;CategoryPlot&nbsp;)&nbsp;chart.getPlot();&nbsp;或者<br />
<br />
CategoryPlot&nbsp;plot&nbsp;=&nbsp;chart.getCategoryPlot();<br />
<br />
获取绘制单元操作：<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BarRenderer&nbsp;renderer&nbsp;=&nbsp;(BarRenderer)&nbsp;plot.getRenderer();<br />
<br />
获取&nbsp;x&nbsp;轴的操作：<br />
<br />
CategoryAxis&nbsp;xAxis&nbsp;=&nbsp;(&nbsp;CategoryAxis&nbsp;)&nbsp;plot.getDomainAxis();<br />
<br />
获取&nbsp;y&nbsp;轴操作：<br />
<br />
NumberAxis&nbsp;yAxis&nbsp;=&nbsp;(NumberAxis)&nbsp;plot.getRangeAxis();<br />
<br />
获取数据源：<br />
<br />
CategoryDataset&nbsp;dataset=plot.getDataset();<br />
<br />
&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;柱状图可以接受一切&nbsp;CategoryDataset&nbsp;类型的数据源，下面讲解一下常用的&nbsp;CategoryDataset&nbsp;类型&nbsp;DefaultCategoryDataset&nbsp;的使用方式<br />
<br />
实例化：<br />
<br />
DefaultCategoryDataset&nbsp;dataset&nbsp;=&nbsp;new&nbsp;DefaultCategoryDataset();<br />
<br />
增加数据<br />
<br />
dataset&nbsp;.addValue(double&nbsp;value,&nbsp;Comparable&nbsp;rowKey,&nbsp;Comparable&nbsp;columnKey)&nbsp;;<br />
<br />
删除数据：<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dataset&nbsp;.removeValue(Comparable&nbsp;rowKey,&nbsp;Comparable&nbsp;columnKey);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;或者<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dataset.&nbsp;removeColumn(int&nbsp;columnIndex);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;或者<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dataset.&nbsp;removeColumn(Comparable&nbsp;columnKey);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;对行同样有上述两种删除方式，不在列举。<br />
<br />
修改数据：<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dataset.&nbsp;setValue(double&nbsp;value,&nbsp;Comparable&nbsp;rowKey,&nbsp;Comparable&nbsp;columnKey);<br />
<br />
查询数据&nbsp;:<br />
<br />
对&nbsp;plot&nbsp;对象、绘制单元、&nbsp;x&nbsp;轴、&nbsp;y&nbsp;轴的显示特性修改不再一一介绍。<br />
<br />
（&nbsp;2&nbsp;）&nbsp;3D&nbsp;柱状图<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;对应的工厂方法为&nbsp;createBarChart3D&nbsp;，该方法的参数与平面柱状图相同。&nbsp;3D&nbsp;柱状图的&nbsp;Plot&nbsp;对象是&nbsp;CategoryPlot&nbsp;类型。&nbsp;CategoryPlot&nbsp;对象的&nbsp;x&nbsp;轴是&nbsp;CategoryAxis3D&nbsp;对象，&nbsp;y&nbsp;轴是&nbsp;NumberAxis3D&nbsp;对象，绘制单元是&nbsp;BarRenderer3D&nbsp;对象，数据源是&nbsp;CategoryDataset&nbsp;对象。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;具体使用以及操作与平面柱状图雷同，不在详述。<br />
2&nbsp;饼状图<br />
<br />
(1)&nbsp;平面饼状图<br />
<br />
生成平面饼状图：<br />
<br />
JFreeChart&nbsp;chart&nbsp;=&nbsp;ChartFactory.&nbsp;createPieChart(String&nbsp;title,&nbsp;//&nbsp;图标题<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PieDataset&nbsp;dataset,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;数据源<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;boolean&nbsp;legend,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;是否显示图例<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;boolean&nbsp;tooltips,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;是否显示tooltip<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;boolean&nbsp;urls)&nbsp;；&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;是否指定url<br />
<br />
平面饼状图的Plot对象是PiePlot类型。PiePlot对象没有x轴对象、y轴对象、绘制单元对象，数据源是PieDataset对象。<br />
<br />
&nbsp;<br />
<br />
获取PiePlot对象操作为：<br />
<br />
PiePlot&nbsp;plot&nbsp;=&nbsp;(PiePlot)&nbsp;chart.getPlot();<br />
<br />
获取数据源：<br />
<br />
PieDataset&nbsp;dataset=&nbsp;plot&nbsp;.getDataset();<br />
<br />
&nbsp;<br />
<br />
饼状图可以接受一切&nbsp;PieDataset&nbsp;类型的数据源，下面讲解一下常用的&nbsp;PieDataset&nbsp;类型&nbsp;DefaultPieDataset&nbsp;的使用方式<br />
<br />
实例化：<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;DefaultPieDataset&nbsp;dataset&nbsp;=&nbsp;new&nbsp;DefaultPieDataset();<br />
<br />
增加修改操作：<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;dataset.&nbsp;setValue(Comparable&nbsp;key,&nbsp;double&nbsp;value);<br />
<br />
删除操作：<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;dataset.&nbsp;remove(Comparable&nbsp;key);<br />
<br />
查询操作：<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;dataset.&nbsp;getKey(int&nbsp;item);<br />
<br />
或者<br />
<br />
dataset.&nbsp;getValue(int&nbsp;item);<br />
<br />
&nbsp;<br />
<br />
(1)3D&nbsp;饼状图<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;对应的工厂方法为&nbsp;createPieChart3D&nbsp;，参数与平面饼状图相同。与平面饼状图的差别在于&nbsp;Plot&nbsp;对象是PiePlot3D类型&nbsp;，不再详述。<br />
3&nbsp;多重饼状图<br />
<br />
（&nbsp;1&nbsp;）多重平面饼状图<br />
<br />
生成多重平面饼状图：<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JFreeChart&nbsp;chart&nbsp;=&nbsp;ChartFactory.&nbsp;createMultiplePieChart<br />
<br />
(String&nbsp;title,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;图标题<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CategoryDataset&nbsp;dataset,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;数据源<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TableOrder&nbsp;order,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;指定提取数据的方式（按行或者按列）<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;boolean&nbsp;legend,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;是否显示图例<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;boolean&nbsp;tooltips,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;是否显示&nbsp;tooltip<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;boolean&nbsp;urls)&nbsp;&nbsp;&nbsp;；&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;是否指定&nbsp;url<br />
<br />
多重平面饼状图的&nbsp;Plot&nbsp;对象是&nbsp;MultiplePiePlot&nbsp;类型。&nbsp;MultiplePiePlot&nbsp;对象没有&nbsp;x&nbsp;轴对象、&nbsp;y&nbsp;轴对象、绘制单元对象，数据源是&nbsp;CategoryDataset&nbsp;对象。&nbsp;MultiplePiePlot&nbsp;对象中可以含有多个子&nbsp;JFreeChart&nbsp;对象，子&nbsp;JFreeChart&nbsp;对象是上面讲过的饼状图对象。<br />
<br />
&nbsp;<br />
<br />
获取&nbsp;MultiplePiePlot&nbsp;对象操作为：<br />
<br />
MultiplePiePlot&nbsp;plotMain&nbsp;=&nbsp;(MultiplePiePlot)&nbsp;chart.getPlot();<br />
<br />
获取子&nbsp;JFreeChart&nbsp;的操作为：<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JFreeChart&nbsp;childChart=plotMain.getPieChart();<br />
<br />
获取数据源：<br />
<br />
CategoryDataset&nbsp;dataset=&nbsp;plotMain&nbsp;.getDataset();<br />
<br />
（&nbsp;2&nbsp;）多重&nbsp;3D&nbsp;饼状图<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;对应的工厂方法为&nbsp;createMultiplePieChart3D&nbsp;，该方法的参数与&nbsp;多重平面饼状图&nbsp;相同。&nbsp;多重&nbsp;3D&nbsp;饼状图的&nbsp;Plot&nbsp;对象是&nbsp;MultiplePiePlot&nbsp;类型。&nbsp;MultiplePiePlot&nbsp;对象中可以含有多个子&nbsp;JFreeChart&nbsp;对象，子&nbsp;JFreeChart&nbsp;对象是上面讲过的&nbsp;3D&nbsp;饼状图对象。<br />
4&nbsp;线图<br />
<br />
（&nbsp;1&nbsp;）平面线图<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;生成平面线图：<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JFreeChart&nbsp;chart&nbsp;=&nbsp;ChartFactory.&nbsp;createLineChart(String&nbsp;title,&nbsp;&nbsp;//&nbsp;图标题<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;categoryAxisLabel,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//x&nbsp;轴标题<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;valueAxisLabel,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//y&nbsp;轴标题<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CategoryDataset&nbsp;dataset,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;数据源<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PlotOrientation&nbsp;orientation,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;显示方向<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;boolean&nbsp;legend,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;是否显示图例<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;boolean&nbsp;tooltips,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;是否显示&nbsp;tooltip<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;boolean&nbsp;urls);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;是否指定&nbsp;url<br />
<br />
平面线图除了的&nbsp;Plot&nbsp;对象中绘制单元对象是&nbsp;LineAndShapeRenderer&nbsp;对象，其他一切组成对象与平面柱状图相同。<br />
<br />
获取&nbsp;Renderer&nbsp;操作：<br />
<br />
LineAndShapeRenderer&nbsp;renderer=(LineAndShapeRenderer)&nbsp;plot.getRenderer();<br />
<br />
其他参考平面柱状图。<br />
<br />
（&nbsp;2&nbsp;）&nbsp;3D&nbsp;线图<br />
<br />
对应工厂方法为&nbsp;createLineChart3D&nbsp;，参数与&nbsp;createLineChart&nbsp;相同。&nbsp;3D&nbsp;线图的组成对象除了绘制单元对象是&nbsp;LineAndShapeRenderer3D&nbsp;对象，其他一切组成对象与&nbsp;3D&nbsp;柱状图相同。<br />
5&nbsp;时序图<br />
<br />
生成时序图：<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JFreeChart&nbsp;chart&nbsp;=&nbsp;ChartFactory.createTimeSeriesChart(<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;title,&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;图标题<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;timeAxisLabel,&nbsp;&nbsp;&nbsp;//x&nbsp;轴标题<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;valueAxisLabel,&nbsp;&nbsp;//y&nbsp;轴标题<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XYDataset&nbsp;dataset,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;数据源<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;boolean&nbsp;legend,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;是否显示图例<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;boolean&nbsp;tooltips,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;是否显示&nbsp;tooltip<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;boolean&nbsp;urls);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;是否指定&nbsp;url<br />
<br />
时序图的&nbsp;Plot&nbsp;对象是&nbsp;XYPlot&nbsp;类型。&nbsp;XYPlot&nbsp;对象的&nbsp;x&nbsp;轴是&nbsp;DateAxis&nbsp;对象，&nbsp;y&nbsp;轴是&nbsp;NumberAxis&nbsp;对象，绘制单元是&nbsp;XYLineAndShapeRenderer&nbsp;对象，数据源是&nbsp;XYDataset&nbsp;对象。<br />
<br />
Plot&nbsp;对象的获取操作：<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XYPlot&nbsp;plot&nbsp;=&nbsp;(XYPlot)&nbsp;chart.getPlot();<br />
<br />
X&nbsp;轴对象的获取操作：<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DateAxis&nbsp;xAxis&nbsp;=&nbsp;(DateAxis)&nbsp;plot.getDomainAxis();<br />
<br />
Y&nbsp;轴对象的获取操作：<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NumberAxis&nbsp;yAxis&nbsp;=(NumberAxis)&nbsp;plot.getRangeAxis();<br />
<br />
Renderer&nbsp;对象的获取操作：<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XYItemRenderer&nbsp;renderer=&nbsp;plot.getRenderer();<br />
<br />
&nbsp;<br />
<br />
时序图可以接受一切&nbsp;XYDataset&nbsp;类型的数据源，下面讲解一下常用的&nbsp;XYDataset&nbsp;类型&nbsp;TimeSeriesCollection&nbsp;的使用方式。<br />
<br />
实例化：<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TimeSeriesCollection&nbsp;dataset=new&nbsp;TimeSeriesCollection();<br />
<br />
添加数据操作：<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dataset.&nbsp;addSeries(TimeSeries);&nbsp;//&nbsp;后面讲解&nbsp;TimeSeries&nbsp;对象<br />
<br />
删除数据操作：<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dataset.&nbsp;removeSeries(int&nbsp;index);<br />
<br />
查询数据操作&nbsp;:<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dataset.&nbsp;getSeries(int&nbsp;series);<br />
<br />
&nbsp;<br />
<br />
TimeSeries&nbsp;对象操作<br />
<br />
实例化：<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TimeSeries&nbsp;ts=TimeSeries(String&nbsp;name,&nbsp;Class&nbsp;timePeriodClass);<br />
<br />
增加数据操作：<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ts.&nbsp;add(RegularTimePeriod&nbsp;period,&nbsp;double&nbsp;value);&nbsp;<br />
<br />
删除数据操作：<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ts.&nbsp;delete(RegularTimePeriod&nbsp;period);&nbsp;&nbsp;&nbsp;<br />
<br />
修改数据操作：<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ts.&nbsp;update(RegularTimePeriod&nbsp;period,&nbsp;Number&nbsp;value);<br />
<br />
查询数据操作：<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ts.&nbsp;getValue(RegularTimePeriod&nbsp;period);<br />
<br />
类&nbsp;RegularTimePeriod&nbsp;是&nbsp;JFreeChart&nbsp;提供的时间模板类，它有很多具体的时间类，比如：&nbsp;Minute&nbsp;、&nbsp;Second&nbsp;、&nbsp;Hour&nbsp;、&nbsp;Day&hellip;&hellip;&nbsp;等，不再详述。<br />
</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://pfwang.javaeye.com/blog/83939#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 28 May 2007 17:32:13 +0800</pubDate>
        <link>http://pfwang.javaeye.com/blog/83939</link>
        <guid>http://pfwang.javaeye.com/blog/83939</guid>
      </item>
          <item>
        <title> 深入探究JFreeChart（1）</title>
        <author>pfwang</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://pfwang.javaeye.com">pfwang</a>&nbsp;
                    链接：<a href="http://pfwang.javaeye.com/blog/83938" style="color:red;">http://pfwang.javaeye.com/blog/83938</a>&nbsp;
          发表时间: 2007年05月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1&nbsp;&nbsp;简介<br />
<br />
JFreeChart&nbsp;是&nbsp;SourceForge.net&nbsp;上的一个开源项目，它的源码和&nbsp;API&nbsp;都可以免费获得。&nbsp;JFreeChart&nbsp;的功能非常强大，可以实现饼图&nbsp;(&nbsp;二维和三维&nbsp;)&nbsp;,&nbsp;&nbsp;柱状图&nbsp;&nbsp;(&nbsp;水平&nbsp;,&nbsp;垂直&nbsp;),&nbsp;线图&nbsp;,&nbsp;点图&nbsp;,&nbsp;时序图&nbsp;,&nbsp;甘特图&nbsp;,&nbsp;&nbsp;股票行情图&nbsp;,&nbsp;混和图&nbsp;,&nbsp;&nbsp;温度计图&nbsp;,&nbsp;&nbsp;刻度图等常用商用图表，&nbsp;&nbsp;&nbsp;图形可以导出成&nbsp;PNG&nbsp;和&nbsp;JPEG&nbsp;格式，同时还可以与&nbsp;PDF&nbsp;和&nbsp;EXCEL&nbsp;关联，支持对图形的放大、缩小，支持常见图形的&nbsp;3D&nbsp;显示。<br />
2&nbsp;图形&nbsp;对象的处理<br />
2&nbsp;．1&nbsp;JFreeChart对象<br />
<br />
JFreeChart&nbsp;可以生成很多图形对象，它的工厂类提供了&nbsp;33&nbsp;个工厂方法用于生成不同的图形对象（具体的工厂方法可以参见&nbsp;JFreeChart&nbsp;的&nbsp;API&nbsp;手册或者源码中的&nbsp;ChartFactory&nbsp;类&nbsp;）。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JFreechart&nbsp;对图形对象的抽象具体化。图形对象（&nbsp;JFreeChart&nbsp;），由&nbsp;Title(&nbsp;主标题&nbsp;)&nbsp;，&nbsp;SubTitle&nbsp;（子标题&nbsp;)&nbsp;，&nbsp;Plot&nbsp;（图形的绘制结构）等几个主要对象组成。各个组成部分如下图所示：<br />
<br />
这是一个&nbsp;JFreeChart&nbsp;对象，上面的&ldquo;&nbsp;chart&nbsp;标题&rdquo;是&nbsp;Title&nbsp;对象，中间区域是&nbsp;Plot&nbsp;对象（包括绘图区域和坐标轴区域），下面的区域是&nbsp;LegendTitle&nbsp;对象，是一种&nbsp;SubTitle&nbsp;对象。<br />
<br />
每个&nbsp;JFreeChart&nbsp;对象只能有&nbsp;1&nbsp;个&nbsp;Title&nbsp;对象，&nbsp;1&nbsp;个&nbsp;Plot&nbsp;对象，可以有多个&nbsp;SubTitle&nbsp;对象。&nbsp;JFreeChart&nbsp;对象可以进行的操作有：背景的设置（背景颜色、背景图片、透明度等）、边框的设置（是否可见、笔画、&nbsp;Paint&nbsp;等）、渲染方式的设置、标题对象的设置、子标题对象的增删查操作。（本文中的所有操作都不提供代码级的介绍，可参见&nbsp;API&nbsp;手册或者源码）<br />
2&nbsp;．2&nbsp;主标题对象<br />
<br />
主标题对象是&nbsp;TextTitle&nbsp;类型，可以进行的操作有：背景设置、字体设置（字体类型、颜色、内容、对齐方式等操作）、&nbsp;tooltip&nbsp;设置、&nbsp;URL&nbsp;设置。<br />
2&nbsp;．3&nbsp;Plot&nbsp;对象<br />
<br />
Plot&nbsp;对象是图形的绘制结构对象。&nbsp;JFreeChart&nbsp;中含有很多不同的&nbsp;Plot&nbsp;对象，每一种图形对象中的&nbsp;Plot&nbsp;对象都在实例化的时候创建。所有的&nbsp;Plot&nbsp;共有的操作有：背景设置（背景颜色、背景图片、透明度等）、前景透明度设置、无数据存在情况的设置（显示的字符内容、显示的字体、显示的&nbsp;Paint&nbsp;）、放大缩小比例的设置，大部分&nbsp;Plot&nbsp;对象还有设置&nbsp;Datset&nbsp;、设置&nbsp;Renderer&nbsp;对象操作。<br />
<br />
JFreeChart&nbsp;中有&nbsp;18&nbsp;种&nbsp;Plot&nbsp;抽象类的具体实现类。&nbsp;Plot&nbsp;的具体实现类主要由以下重要对象组成：&nbsp;Renderer&nbsp;对象（图形的绘制单元&mdash;&mdash;绘图域）&nbsp;Datset&nbsp;（图形的数据源），&nbsp;DomainAxis&nbsp;（区域轴，相当于&nbsp;x&nbsp;轴），&nbsp;RangeAxis&nbsp;（范围轴，相当于&nbsp;y&nbsp;轴）。不同的&nbsp;Plot&nbsp;对象组成方式不尽相同，有的不含有&nbsp;Renderer&nbsp;对象，比如&nbsp;CompassPlot&nbsp;、&nbsp;ContourPlot&nbsp;、&nbsp;MultiplePiePlot&nbsp;、&nbsp;PiePlot&nbsp;等，有的不含有&nbsp;DomainAxis&nbsp;、&nbsp;RangeAxis&nbsp;对象，另外除了&nbsp;FastScatterPlot&nbsp;类都含有&nbsp;Datset&nbsp;对象，&nbsp;FastScatterPlot&nbsp;使用&nbsp;float&nbsp;的二维数组充当数据源。尤其说明一点，饼状图相关的&nbsp;Plot&nbsp;对象（&nbsp;MultiplePiePlot&nbsp;、&nbsp;PiePlot&nbsp;、&nbsp;PiePlot3D&nbsp;、&nbsp;RingPlot&nbsp;）中都不含有&nbsp;Renderer&nbsp;对象、&nbsp;DomainAxis&nbsp;对象、&nbsp;RangeAxis&nbsp;对象。<br />
<br />
一般来说，&nbsp;Datset&nbsp;对象存储数据模型，&nbsp;Renderer&nbsp;对象存储显示模型，&nbsp;Plot&nbsp;对象根据&nbsp;Datset&nbsp;对象、&nbsp;Renderer&nbsp;对象完成画图操作。<br />
<br />
仍以上面的图形讲解&nbsp;Plot&nbsp;对象的组成。<br />
<br />
&nbsp;&nbsp;&nbsp;上图的中间区域是是一个&nbsp;XYPlot&nbsp;对象。其中的折线部分即是图形的绘制单元&nbsp;Renderer&nbsp;对象。&nbsp;X&nbsp;轴是&nbsp;DomainAxis&nbsp;，&nbsp;y&nbsp;轴是&nbsp;RangeAxis&nbsp;，其中&nbsp;Datset&nbsp;对象属于数据模型范畴，是&nbsp;UI&nbsp;不可见对象。该图中的&nbsp;plot&nbsp;背景色、网格线的各种设置可以通过&nbsp;XYPlot&nbsp;对象本身完成。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;下面讲解&nbsp;Renderer&nbsp;对象、&nbsp;Axis&nbsp;对象（&nbsp;X&nbsp;轴、&nbsp;y&nbsp;轴都属于&nbsp;Axis&nbsp;对象），&nbsp;Datset&nbsp;对象在后续章节中专门讲解。<br />
2&nbsp;．3．1&nbsp;Renderer对象<br />
<br />
Renderer&nbsp;对象是图形的绘制单元。&nbsp;JFreeChart&nbsp;提供了两个接口&nbsp;CategoryItemRenderer&nbsp;和&nbsp;XYItemRenderer&nbsp;、&nbsp;1&nbsp;个抽象类&nbsp;AbstractRenderer&nbsp;供具体的&nbsp;Renderer&nbsp;类实现，给出了将近&nbsp;50&nbsp;种具体实现类。<br />
<br />
一般来说&nbsp;Renderer&nbsp;对象可进行的操作有：对&nbsp;item&nbsp;label&nbsp;（下图中的柱状图上的红色数字即为&nbsp;item&nbsp;label&nbsp;的示例）的默认设置（&nbsp;item&nbsp;label&nbsp;的产生方式、是否可见、字体、&nbsp;Paint&nbsp;、正反向&nbsp;item&nbsp;label&nbsp;的位置设置等）、绘制图形的边框默认设置（&nbsp;Paint&nbsp;、笔画、是否可见等）、绘制图形的默认设置（形状、笔画、是否可见、对应的图例中是否可见等，折线图还有线条是否可见、折点图形是否可见、折点图形是否填充、折点图形的形状、对应的图例中线条是否可见、图形是否可见、整体是否可见等）、以及对指定&nbsp;item&nbsp;label&nbsp;的设置、指定绘制图形的设置。可以说和具体绘制的图形相关的属性都可以通过&nbsp;Renderer&nbsp;对象设置。<br />
<br />
不同的&nbsp;Renderer&nbsp;的实现类实现了不同的显示方式，在含有&nbsp;Renderer&nbsp;对象的&nbsp;JFreeChart&nbsp;对象中，&nbsp;R&nbsp;enderer&nbsp;对象决定了JFreeChart对象的显示方式。例如：柱状图的Plot对象中默认的Renderer对象是&nbsp;CategoryItemRenderer&nbsp;对象，通过设置&nbsp;Plot&nbsp;对象的Renderer对象&nbsp;为&nbsp;LineAndShapeRenderer&nbsp;，则柱状图变为线图。使用中一般不需要显式的实例化一个&nbsp;R&nbsp;enderer&nbsp;对象，一般通过&nbsp;JFreeChart&nbsp;对象的&nbsp;Plot&nbsp;对象调用现有的&nbsp;R&nbsp;enderer&nbsp;对象进行重新设置等操作。<br />
2&nbsp;．3．2&nbsp;Axis对象<br />
<br />
JFreeChart&nbsp;提供了两种类型的坐标轴：&nbsp;CategoryAxis&nbsp;（等级轴）和&nbsp;ValueAxis&nbsp;（值轴），&nbsp;ValueAxis&nbsp;又有&nbsp;3&nbsp;个子类：&nbsp;DateAxis&nbsp;（时间轴）、&nbsp;NumberAxis&nbsp;（数字轴）、&nbsp;PeriodAxis&nbsp;（时期轴）。这些坐标轴还有更详细的子类，不再一一列举<br />
<br />
Axis&nbsp;对象可进行的操作有：标题的设置（内容、字体、Paint、显示角度等）、坐标线的设置（笔画、Paint、是否可见等）、刻度线的设置（是否可见、笔画、Paint、位于绘图区域的长度、位于绘图区域外的长度等）、刻度标示的设置（笔画、Paint、字体、与轴的距离等）、坐标轴范围设置等。<br />
<br />
CategoryAxis&nbsp;对象还可以进行的操作有：&nbsp;刻度标示间距&nbsp;设置（&nbsp;最小间距、最大间距、指定间距）等。<br />
<br />
ValueAxis&nbsp;对象可进行的操作有：轴端设置（显示的图形形状）、范围设置（是否自动产生范围、自动产生的最小范围、最大范围、指定确定范围、指定范围大小等）、间隔设置（是否自动产生间隔、指定间隔）等。<br />
<br />
DateAxis&nbsp;对象还有对时间刻度显示格式的设置操作。<br />
2&nbsp;．&nbsp;4&nbsp;子标题对象<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;子标题对象是&nbsp;Title&nbsp;类型的对象，一个JFreeChart可以有多个子标题对象。JFreeChart提供了5种Title的实现，可以是图片、文本、图例等的形式。<br />
原文地址：<a href="http://www.blogjava.net/JavaExplore/archive/2006/09/01/67217.html" target="_blank">http://www.blogjava.net/JavaExplore/archive/2006/09/01/67217.html</a>
          <br/><br/>
          <span style="color:red;">
            <a href="http://pfwang.javaeye.com/blog/83938#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/>