tory320

  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  10 随笔 :: 0 文章 :: 1 评论 :: 0 Trackbacks

2006年12月29日 #

Design Principle
Identify the aspects of your application that vary and separate them from what stays the same.
Here's another way to think about this principle: take the parts that vary and encapsulate them, so that later you can alter or extends the parts that vary without affecting those that don't.
As simple as this concept is, it forms the basis for almost every design pattern. All patterns provide a way to let some part of a system vary independently of all other parts.

Each set of class will hold all the implementations of their respective behavior. For instance, we might have one clss that implements quarking, another implements squaking, and another that implements silence.

To separate thest behaviors from the Duck class, we'll pull both methods out of the duck class and create a new set of class to represent each behavior.

This is in contrast to the way we were doing things before, where a behavior either came from a concrete implementation in the suprerclass Duck, or by providing a specialized implementation in the sub class itself. In both cases we were relying on an implementation. We were locked into using that specific implemetation and there was no room for changing out the behavior.

And the same is true for the duck's flying behavior.

Okay, now that we've done the deep dive on the duck simulator design, it's time to come back up for air and take a look at the big picture.

Below is the entire reworked class structure. We have everything you'd expect: ducks extending Duck. fly behavior implementing FlyBehavior and quack behavior implementing QuackBehavior.

Notice also that we've started to describe things a little differntly. Instead of thinking of the duck behaviors as a set of behaviors, we'll start thinking of them ad a family of algorithms. Think about it: in the SimUDuck design, the algorithms represent things a duck would do , but we could just as easily use the same techniques for a set of classes that implement the ways to compute state sales tax by different states.

posted @ 2008-03-07 17:58 tory 阅读(112) | 评论 (0)编辑 收藏

/**
 * //FileOperate.java
 * 文件的各种操作
 * 杨彩 http://blog.sina.com.cn/m/yangcai
 * 文件操作 1.0
 */
 
//package common;
 
import java.io.*;
 
public class FileOperate
{
 static boolean exitnow=false;
 static String aa,bb;
  public FileOperate() {
  }
 
  /**
   * 新建目录
   */
  public void newFolder(String folderPath) {
    try
    {
      String filePath = folderPath;
      filePath = filePath.toString();
      File myFilePath = new File(filePath);
      if(!myFilePath.exists())
      {
        myFilePath.mkdir();
      }
      System.out.println("新建目录操作 成功执行");
    }
    catch(Exception e)
    {
      System.out.println("新建目录操作出错");
      e.printStackTrace();
    }
  }
 
  /**
   * 新建文件
   */
  public void newFile(String filePathAndName, String fileContent)
  {
 
    try
    {
      String filePath = filePathAndName;
      filePath = filePath.toString();
      File myFilePath = new File(filePath);
      if (!myFilePath.exists())
      {
        myFilePath.createNewFile();
      }
      FileWriter resultFile = new FileWriter(myFilePath);
      PrintWriter myFile = new PrintWriter(resultFile);
      String strContent = fileContent;
      myFile.println(strContent);
      resultFile.close();
      System.out.println("新建文件操作 成功执行");
    }
    catch (Exception e) {
      System.out.println("新建目录操作出错");
      e.printStackTrace();
 
    }
 
  }
 
  /**
   * 删除文件
   */
  public void delFile(String filePathAndName) {
    try {
      String filePath = filePathAndName;
      filePath = filePath.toString();
      File myDelFile = new File(filePath);
      myDelFile.delete();
      System.out.println("删除文件操作 成功执行");
    }
    catch (Exception e) {
      System.out.println("删除文件操作出错");
      e.printStackTrace();
 
    }
 
  }
 
  /**
   * 删除文件夹
   */
  public void delFolder(String folderPath)
  {
    try
    {
      delAllFile(folderPath); //删除完里面所有内容
      String filePath = folderPath;
      filePath = filePath.toString();
      File myFilePath = new File(filePath);
      myFilePath.delete(); //删除空文件夹
      System.out.println("删除文件夹操作 成功执行");
    }
    catch (Exception e)
    {
      System.out.println("删除文件夹操作出错");
      e.printStackTrace();
 
    }
 
  }
 
  /**
   * 删除文件夹里面的所有文件
   * @param path String 文件夹路径 如 c:/fqf
   */
  public void delAllFile(String path)
  {
    File file = new File(path);
    if(!file.exists())
    {
      return;
    }
    if(!file.isDirectory())
    {
      return;
    }
    String[] tempList = file.list();
    File temp = null;
    for (int i = 0; i < tempList.length; i++)
    {
      if(path.endsWith(File.separator))
      {
        temp = new File(path + tempList[i]);
      }
      else
      {
        temp = new File(path + File.separator + tempList[i]);
      }
      if (temp.isFile())
      {
        temp.delete();
      }
      if (temp.isDirectory())
      {
        delAllFile(path+"/"+ tempList[i]);//先删除文件夹里面的文件
        delFolder(path+"/"+ tempList[i]);//再删除空文件夹
      }
    }
          System.out.println("删除文件操作 成功执行"); 
  }
 
  /**
   * 复制单个文件
   * @param oldPath String 原文件路径 如:c:/fqf.txt
   * @param newPath String 复制后路径 如:f:/fqf.txt
   */
  public void copyFile(String oldPath, String newPath) {
    try {
      int bytesum = 0;
      int byteread = 0;
      File oldfile = new File(oldPath);
      if (oldfile.exists())
      { //文件存在时
        InputStream inStream = new FileInputStream(oldPath); //读入原文件
        FileOutputStream fs = new FileOutputStream(newPath);
        byte[] buffer = new byte[1444];
        int length;
        while ( (byteread = inStream.read(buffer)) != -1) {
          bytesum += byteread; //字节数 文件大小
          System.out.println(bytesum);
          fs.write(buffer, 0, byteread);
        }
        inStream.close();
      }
            System.out.println("删除文件夹操作 成功执行"); 
    }
    catch (Exception e) {
      System.out.println("复制单个文件操作出错");
      e.printStackTrace();
 
    }
 
  }
 
  /**
   * 复制整个文件夹内容
   * @param oldPath String 原文件路径 如:c:/fqf
   * @param newPath String 复制后路径 如:f:/fqf/ff
   */
  public void copyFolder(String oldPath, String newPath) {
 
    try
    {
      (new File(newPath)).mkdirs(); //如果文件夹不存在 则建立新文件夹
      File a=new File(oldPath);
      String[] file=a.list();
      File temp=null;
      for (int i = 0; i < file.length; i++)
      {
        if(oldPath.endsWith(File.separator))
        {
          temp=new File(oldPath+file[i]);
        }
        else{
          temp=new File(oldPath+File.separator+file[i]);
        }
 
        if(temp.isFile())
        {
          FileInputStream input = new FileInputStream(temp);
          FileOutputStream output = new FileOutputStream(newPath + "/" +
              (temp.getName()).toString());
          byte[] b = new byte[1024 * 5];
          int len;
          while ( (len = input.read(b)) != -1)
          {
            output.write(b, 0, len);
          }
          output.flush();
          output.close();
          input.close();
        }
        if(temp.isDirectory())
        {//如果是子文件夹
          copyFolder(oldPath+"/"+file[i],newPath+"/"+file[i]);
        }
      }
            System.out.println("复制文件夹操作 成功执行"); 
    }
    catch (Exception e) {
      System.out.println("复制整个文件夹内容操作出错");
      e.printStackTrace();
 
    }
 
  }
 
  /**
   * 移动文件到指定目录
   * @param oldPath String 如:c:/fqf.txt
   * @param newPath String 如:d:/fqf.txt
   */
  public void moveFile(String oldPath, String newPath) {
    copyFile(oldPath, newPath);
    delFile(oldPath);
 
  }
 
  /**
   * 移动文件到指定目录
   * @param oldPath String 如:c:/fqf.txt
   * @param newPath String 如:d:/fqf.txt
   */
  public void moveFolder(String oldPath, String newPath) {
    copyFolder(oldPath, newPath);
    delFolder(oldPath);
 
  }
 
  public static void main(String args[])
  {
   System.out.println("使用此功能请按[1]  功能一:新建目录");
   System.out.println("使用此功能请按[2]  功能二:新建文件");
   System.out.println("使用此功能请按[3]  功能三:删除文件");
   System.out.println("使用此功能请按[4]  功能四:删除文件夹");
   System.out.println("使用此功能请按[5]  功能五:删除文件夹里面的所有文件");
   System.out.println("使用此功能请按[6]  功能六:复制文件");
   System.out.println("使用此功能请按[7]  功能七:复制文件夹的所有内容");
   System.out.println("使用此功能请按[8]  功能八:移动文件到指定目录");
   System.out.println("使用此功能请按[9]  功能九:移动文件夹到指定目录");
   System.out.println("使用此功能请按[10] 退出程序");
   
 while(!exitnow)
 {
    FileOperate fo=new FileOperate();
    try
    {
    BufferedReader Bin=new BufferedReader(new InputStreamReader(System.in));
    String a=Bin.readLine();
    int b=Integer.parseInt(a);
    
    switch(b)
    {
     case 1:System.out.println("你选择了功能一  请输入目录名");  
        aa=Bin.readLine();
        fo.newFolder(aa);
        break;
     case 2:System.out.println("你选择了功能二  请输入文件名");  
        aa=Bin.readLine();
        System.out.println("请输入在"+aa+"中的内容");
        bb=Bin.readLine();
        fo.newFile(aa,bb);
        break;
     case 3:System.out.println("你选择了功能三  请输入文件名");  
        aa=Bin.readLine();
        fo.delFile(aa);
        break;
     case 4:System.out.println("你选择了功能四  请输入文件名");  
        aa=Bin.readLine();
        fo.delFolder(aa);
        break;
     case 5:System.out.println("你选择了功能五  请输入文件名");  
        aa=Bin.readLine();
        fo.delAllFile(aa);
        break;  
     case 6:System.out.println("你选择了功能六  请输入文件名");  
        aa=Bin.readLine();
        System.out.println("请输入目标文件名"); 
        bb=Bin.readLine();
        fo.copyFile(aa,bb);
        break;
     case 7:System.out.println("你选择了功能七  请输入源文件名");  
        aa=Bin.readLine();
        System.out.println("请输入目标文件名"); 
        bb=Bin.readLine();
        fo.copyFolder(aa,bb);
        break;       
     case 8:System.out.println("你选择了功能八  请输入源文件名");  
        aa=Bin.readLine();
        System.out.println("请输入目标文件名"); 
        bb=Bin.readLine();
        fo.moveFile(aa,bb);
        break;
       case 9:System.out.println("你选择了功能九  请输入源文件名");  
        aa=Bin.readLine();
        System.out.println("请输入目标文件名"); 
        bb=Bin.readLine();
        fo.moveFolder(aa,bb);
        break;       
     case 10:exitnow=true;
         System.out.println("程序结束,请退出");
        break;
     default:System.out.println("输入错误.请输入1-10之间的数");               
     }
    
    
    System.out.println("请重新选择功能");
    
    
    }
    catch(Exception e)
    {
    System.out.println("输入错误字符或程序出错");
    }
    
 }   
 }
}
posted @ 2007-01-30 13:03 tory 阅读(155) | 评论 (0)编辑 收藏

本文是在参阅了http://ivanl.javaeye.com/blog/24739基础上完成的
在看JPetStore的代码时,发现它的分页处理主要是通过返回PaginatedList对象来完成的。如:在CatalogService类中
public PaginatedList getProductListByCategory(String categoryId) 
    
return productDao.getProductListByCategory(categoryId); 
  }
 

分页是操作数据库型系统常遇到的问题。分页实现方法很多,但效率的差异就很大了。iBatis是通过什么方式来实现这个分页的了。查看它的实现部分:
 
返回的PaginatedList实际上是个接口,实现这个接口的是PaginatedDataList类的对象,查看PaginatedDataList类发现,每次翻页的时候最后都会调用下面这段函数
private List getList(int idx, int localPageSize) throws SQLException 
    
return sqlMapExecutor.queryForList(statementName, parameterObject, (idx) * pageSize, localPageSize); 
  }
 
由于
public interface SqlMapClient extends SqlMapExecutor, SqlMapTransactionManager {……} 

所以实际的调用次序如下:
SqlMapClientImpl.queryForPaginatedList->SqlMapSessionImpl.queryForPaginatedList 
->SqlMapExecutorDelegate.queryForPaginatedList->GeneralStatement.executeQueryForList 
->GeneralStatment.executeQueryWithCallback->GeneralStatment.executeQueryWithCallback 
->SqlExecutor.executeQuery->SqlExecutor.handleMultipleResults()->SqlExecutor.executeQuery-> handleResults 
分页处理的函数如下
private void handleResults(RequestScope request, ResultSet rs, int skipResults, int maxResults, RowHandlerCallback callback) throws SQLException 
    
try 
      request.setResultSet(rs); 
      ResultMap resultMap 
= request.getResultMap(); 
      
if (resultMap != null
        
// Skip Results 
        if (rs.getType() != ResultSet.TYPE_FORWARD_ONLY) 
          
if (skipResults > 0
            rs.absolute(skipResults); 
          }
 
        }
 else 
          
for (int i = 0; i < skipResults; i++
            
if (!rs.next()) 
              
return
            }
 
          }
 
        }
 
  
        
// Get Results 
        int resultsFetched = 0
        
while ((maxResults == SqlExecutor.NO_MAXIMUM_RESULTS || resultsFetched < maxResults) && rs.next()) 
          Object[] columnValues 
= resultMap.resolveSubMap(request, rs).getResults(request, rs); 
          callback.handleResultObject(request, columnValues, rs); 
          resultsFetched
++
        }
 
      }
 
    }
 finally 
      request.setResultSet(
null); 
    }
 
  }
 

由此可见,iBatis的分页主要依赖于jdbcdriver的如何实现以及是否支持rs.absolute(skipResults)。它并不是一个好的分页方式。它先要取出所有的符合条件的记录存入ResultSet对象,然后用absolute方法进行定位,来实现分页。当记录数较大(比如十万条)时,整体的查询速度将会变得很慢。
所以分页还是要考虑采用直接操作sql语句来完成。当然小批量的可以采用iBatis的分页模式。一般分页的sql语句与数据库的具体实现有关
mysql: 
select * from A limit startRow,endRow 
oracle: 
select b.* from (select a.*,rownum as linenum from (select * from A) a where rownum <= endRow) b where linenum >= startRow 

Hibernate的Oracle分页采用的就是是拼凑RowNum的Sql语句来完成的。参考代码如下: 
 
        public String createOraclePagingSql(String sql, int pageIndex, int pageSize)
            
int m = pageIndex * pageSize; 
            
int n = m + pageSize; 
            
return "select * from ( select row_.*, rownum rownum_ from ( " + sql 
                    
+ " ) row_ where rownum <= " + n  
                    
+ ") where rownum_ > " + m; 
        }
 
综上,小批量(<2w)可以采用ibatis自带的分页类,大批量的还是直接操纵sql,当然也可以将这些sql自己进行封装,或在包中封装都可以。包封装的示例代码如下:
一个封装了分页功能的Oracle Package
create or replace package body FMW_FY_HELPER is
PROCEDURE GET_DATA(pi_sql in varchar,pi_whichpage in integer,pi_rownum in integer,
po_cur_data out cur_DATA,po_allrownum out 
integer,pio_succeed in out integer)
as 
v_cur_data cur_DATA;
v_cur_temp cur_TEMP;
v_temp 
integer;
v_sql 
varchar(5000);
v_temp1 
integer;
v_temp2 
integer;
begin
pio_succeed :
= 1;
v_sql :
= 'select count(''a'') from ( ' || pi_sql || ')';
execute immediate v_sql into v_temp;

po_allrownum:
=ceil(v_temp/pi_rownum);

v_sql :
= '';
v_temp :
=pi_whichpage*pi_rownum + 1;
v_temp1:
=(pi_whichpage-1)*pi_rownum + 1;
v_temp2:
=pi_whichpage*pi_rownum;
v_sql:
= 'select * from (select rownum as rn,t.* from (' || pi_sql ||') t where rownum<' || to_char(v_temp) || ')  where rn between ' || to_char(v_temp1) || ' and ' || to_char(v_temp2);
open v_cur_data for v_sql;
if v_cur_data %notfound
then
pio_succeed:
=-1;
return;
end if;
po_cur_DATA :
= v_cur_data;
end;
posted @ 2007-01-19 13:02 tory 阅读(807) | 评论 (0)编辑 收藏

使用JFreeChart生成热点图表
2006-12-14 11:54
<一>前言:

  JFreeChart是开放源代码站点SourceForge.net上的一个JAVA项目。它的功能十分强大,能创建饼图、柱状图(普通柱状图以及堆栈柱状图)、线图、区域图、分布图、混合图、甘特图以及一些仪表盘等等,并可生成PNG或JPG图片格式文件。
  本人在学习过程中发现,网上很多文章都是讲一些JFreeChart的基本应用,而对JFreeChart生成热点图表这样常用的功能虽有所提及却没有一个完整的例子,所以我就写一个简单示例供大家参考,希望对大家的学习有所帮助。 

  <二>示例说明:

  假设有一个关于程序员北京,上海,广洲三地程序员学历,开发语言,薪金情况的调查。首先要以饼图显示程序员学历的分布情况(index.jsp)。点击饼图的每一部分会以柱状图显示该层次程序员所用开发语言和薪金的情况(barview.jsp)。重点演示怎样在饼图上添加链接。 

  <三>准备工作:

  1.下载最新版本的JFreeChart,当前为jfreechart-1.0.0-rc1
下载地址:http://www.jfree.org/jfreechart/index.html

  2.解压文件,将jfreechart-1.0.0-rc1/lib下的jcommon-1.0.0-rc1.jar,jfreechart-1.0.0-rc1.jar复制到WEB应用的lib目录下。

  3.在web.xml文件中增加以下内容:

<servlet> 
<servlet-name>DisplayChart</servlet-name> 
<servlet-class>org.jfree.chart.servlet.DisplayChart</servlet-class> 
</servlet> 
<servlet-mapping> 
<servlet-name>DisplayChart</servlet-name> 
<url-pattern>/servletDisplayChart</url-pattern> 
</servlet-mapping> 

  <四>饼图页面代码(index.jsp) 


<%@ page contentType="text/html;charset=GBK"%> 
<%@ page import="org.jfree.data.general.DefaultPieDataset"%> 
<%@ page import="org.jfree.chart.*"%> 
<%@ page import="org.jfree.chart.plot.*"%> 
<%@ page import="org.jfree.chart.servlet.ServletUtilities"%> 
<%@ page import="org.jfree.chart.labels.StandardPieItemLabelGenerator"%> 
<%@ page import="org.jfree.chart.urls.StandardPieURLGenerator"%> 
<%@ page import="org.jfree.chart.entity.StandardEntityCollection"%> 
<%@ page import="java.io.*"%> 
<HTML> 
<HEAD> 
<META http-equiv=Content-Type content="text/html; charset=GBK"> 
<TITLE>nacl_zhuang@hotmail.com</TITLE> 
</HEAD> 
<BODY> 
<% 

DefaultPieDataset data = new DefaultPieDataset(); 
data.setValue("高中以下",370); 
data.setValue("高中",1530); 
data.setValue("大专",5700); 
data.setValue("本科",8280); 
data.setValue("硕士",4420); 
data.setValue("博士",80); 

PiePlot3D plot = new PiePlot3D(data);//3D饼图 
plot.setURLGenerator(new StandardPieURLGenerator("barview.jsp"));//设定链接 
JFreeChart chart = new JFreeChart("",JFreeChart.DEFAULT_TITLE_FONT, plot, true); 
chart.setBackgroundPaint(java.awt.Color.white);//可选,设置图片背景色 
chart.setTitle("程序员学历情况调查表");//可选,设置图片标题 
plot.setToolTipGenerator(new StandardPieItemLabelGenerator()); 
StandardEntityCollection sec = new StandardEntityCollection(); 
ChartRenderingInfo info = new ChartRenderingInfo(sec); 
PrintWriter w = new PrintWriter(out);//输出MAP信息 
//500是图片长度,300是图片高度 
String filename = ServletUtilities.saveChartAsPNG(chart, 500, 300, info, session); 
ChartUtilities.writeImageMap(w, "map0", info, false); 

String graphURL = request.getContextPath() + "/servlet/DisplayChart?filename=" + filename; 

%> 

<P ALIGN="CENTER"> 
<img src="<%= graphURL %>" width=500 height=300 border=0 usemap="#map0"> 
</P> 
</BODY> 
</HTML> 

  生成的图片如下


  在浏览器中点右键->查看源文件会发现有以下一段HTML代码: 

<map id="map0" name="map0"> 
<area shape="poly" coords="247,61,250,61,250,123,250,123" title="博士 = 80" alt="" href="barview.jsp?category=博士&pieIndex=0"/> 
<area shape="poly" coords="148,112,153,102,160,92,170,83,182,76,196,70,212,65,229,62,247,61,250,123,250,123" title="硕士 = 4,420" alt="" href="barview.jsp?category=硕士&pieIndex=0"/> 
<area shape="poly" coords="324,167,311,173,297,179,282,182,266,185,250,186,234,185,217,183,202,179,188,173,175,167,
  165,159,157,151,151,142,147,132,146,122,148,112,250,123,250,123" title="本科 = 8,280" alt="" 
 href="barview.jsp?category=本科&pieIndex=0"/> 
<area shape="poly" coords="307,72,324,80,338,91,347,103,352,117,352,131,347,144,338,156,324,167,250,123,250,123" title="大专 = 5,700" alt="" href="barview.jsp?category=大专&pieIndex=0"/> 
<area shape="poly" coords="261,62,285,65,307,72,250,123,250,123" title="高中 
 = 1,530" alt="" href="barview.jsp?category=高中&pieIndex=0"/> 
<area shape="poly" coords="250,61,261,62,250,123,250,123" title="高中以下 = 370" alt="" href="barview.jsp?category=高中以下&pieIndex=0"/> 
</map> 


  这就是MAP信息,我们在IMG标签中加入usemap="#map0"就可以为饼图的每一部分加入链接。

  <五>柱状图页面代码:(barview.jsp)

<HTML> 
<HEAD> 
<META http-equiv=Content-Type content="text/html; charset=GBK"> 
<TITLE>nacl_zhuang@hotmail.com</TITLE> 
</HEAD> 

<body> 

<%@ page contentType="text/html;charset=GBK"%> 
<%@ page import="org.jfree.chart.ChartFactory, 
org.jfree.chart.JFreeChart, 
org.jfree.chart.plot.PlotOrientation, 
org.jfree.chart.servlet.ServletUtilities, 
org.jfree.data.category.*"%> 
<% 
CategoryDataset dataset; 
String category=request.getParameter("category"); 
category= new String(category.getBytes("ISO8859_1"), "GBK"); 
if(category.equals("本科")||category.equals("高中")||category.equals("大专")) 

 dataset=getDataSet(); 

else if(category.equals("硕士")||category.equals("博士")) 

 dataset=getDataSet2(); 
}else 

 dataset=getDataSet3(); 

String title=category+"程序员在各城市薪金情况统计"; 
JFreeChart chart = ChartFactory.createBarChart3D(title, 
"城市", 
"薪金", 
dataset, 
PlotOrientation.VERTICAL, 
true, 
false, 
false); 

String filename = ServletUtilities.saveChartAsPNG(chart, 500, 300, null, session); 
String graphURL = request.getContextPath() + "/servlet/DisplayChart?filename=" + filename; 
%> 
<P ALIGN="CENTER"> 
<img src="<%= graphURL %>" width=500 height=300 border=0 usemap="#<%= filename %>"> 
</P> 
<%! 
private static CategoryDataset getDataSet() { 
 DefaultCategoryDataset dataset = new DefaultCategoryDataset(); 
 dataset.addValue(2000, "北京", "VB"); 
 dataset.addValue(1800, "上海", "VB"); 
 dataset.addValue(2200, "广州", "VB"); 
 dataset.addValue(3200, "北京", "JAVA"); 
 dataset.addValue(3500, "上海", "JAVA"); 
 dataset.addValue(3600, "广州", "JAVA"); 
 dataset.addValue(3300, "北京", "DOT NET"); 
 dataset.addValue(3400, "上海", "DOT NET"); 
 dataset.addValue(3700, "广州", "DOT NET"); 
 dataset.addValue(2500, "北京", "DELPHI"); 
 dataset.addValue(2800, "上海", "DELPHI"); 
 dataset.addValue(3200, "广州", "DELPHI"); 
 dataset.addValue(5000, "北京", "VC"); 
 dataset.addValue(3500, "上海", "VC"); 
 dataset.addValue(4600, "广州", "VC"); 
 return dataset; 

private static CategoryDataset getDataSet2() { 
 DefaultCategoryDataset dataset = new DefaultCategoryDataset(); 
 dataset.addValue(2000, "上海", "VB"); 
 dataset.addValue(3000, "北京", "JAVA"); 
 dataset.addValue(3330, "上海", "JAVA"); 
 dataset.addValue(3500, "广州", "JAVA"); 
 dataset.addValue(3500, "北京", "DOT NET"); 
 dataset.addValue(4000, "上海", "DOT NET"); 
 dataset.addValue(4800, "广州", "DOT NET"); 
 dataset.addValue(2600, "北京", "DELPHI"); 
 dataset.addValue(2200, "上海", "DELPHI"); 
 dataset.addValue(4000, "北京", "VC"); 
 dataset.addValue(4000, "上海", "VC"); 
 dataset.addValue(4200, "广州", "VC"); 
 return dataset; 

private static CategoryDataset getDataSet3() { 
 DefaultCategoryDataset dataset = new DefaultCategoryDataset(); 
 dataset.addValue(2100, "北京", "VB"); 
 dataset.addValue(2200, "上海", "VB"); 
 dataset.addValue(2100, "广州", "VB"); 
 dataset.addValue(3000, "北京", "JAVA"); 
 dataset.addValue(3200, "上海", "JAVA"); 
 dataset.addValue(3600, "广州", "JAVA"); 
 dataset.addValue(4100, "北京", "DOT NET"); 
 dataset.addValue(4200, "上海", "DOT NET"); 
 dataset.addValue(4160, "广州", "DOT NET"); 
 dataset.addValue(2400, "北京", "DELPHI"); 
 dataset.addValue(2600, "上海", "DELPHI"); 
 dataset.addValue(2500, "广州", "DELPHI"); 
 dataset.addValue(5400, "北京", "VC"); 
 dataset.addValue(5000, "上海", "VC"); 
 dataset.addValue(5500, "广州", "VC"); 
 return dataset; 

%> 
</body> 
</html> 

  生成图片如下: 


posted @ 2006-12-29 23:36 tory 阅读(372) | 评论 (0)编辑 收藏