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 閱讀(137) | 評論 (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 閱讀(188) | 評論 (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 閱讀(832) | 評論 (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 閱讀(389) | 評論 (0)編輯 收藏

          主站蜘蛛池模板: 华阴市| 深圳市| 工布江达县| 扎囊县| 桦南县| 信宜市| 奇台县| 白城市| 余庆县| 大悟县| 清流县| 北京市| 商南县| 常州市| 广宗县| 巴青县| 左云县| 个旧市| 东港市| 偏关县| 邵阳市| 云林县| 临邑县| 麻江县| 环江| 临西县| 包头市| 铁力市| 恩平市| 会东县| 尼木县| 昌吉市| 大港区| 怀来县| 台北市| 高碑店市| 承德县| 达孜县| 顺昌县| 和林格尔县| 新田县|