posts - 3, comments - 1, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          2007年10月10日

           

          JFreeChart是一個開源的JAVA項目,它主要用來開發各種各樣的圖表,這些圖表包括:餅圖、柱狀圖(普通柱狀圖以及堆棧柱狀圖)、線圖、區域圖、分布圖、混合圖、甘特圖以及一些儀表盤等等。在這些不同式樣的圖表上可以滿足目前商業系統的要求。JFreeChart是一種基于JAVA語言的圖表開發技術。JFreeChart可用于ServletJSPAppletJava Appication環境中,通過JDBC可動態顯示任何數據庫數據,結合Itext可以輸出至PDF文件。

          JFreeChart主要是由三個類構成:

          Aorg.jfree.chart.servlet.ChartDeleter繼承自HttpSessionBindingListener,用于實現當Session 關閉時,刪除臨時目中的圖象文件。

          Borg.jfree.chart.servlet.DisplayChart繼承自Httpservlet 用于處理顯示圖象。

          Corg.jfree.chart.servlet.ServletUtilities有一系列方法,例如,saveChartAs*;saveChartAs*是把圖表按照不同的形式存儲為圖象;sendTempFile方法被重載了很多次,用于把文件流發送response

          下面以柱狀圖和餅圖為例,介紹圖形創建方法。

          1 柱狀圖

          org.jfree.chart.ChartFactory這個工廠類有createBarChartcreateStackedBarChartcreateBarChart3DcreateStackedBarChart3D,這幾個工廠方法創建不同類型的柱狀圖,比較重要的是 PlotOrientation.VERTICAL 讓平行柱垂直顯示,而 PlotOrientation.HORIZONTAL 則讓平行柱水平顯示。對柱狀圖影響較大的幾個類包括:org.jfree.chart.axis.CategoryAxisorg.jfree.chart.axis.ValueAxisorg.jfree.chart.renderer.BarRendererorg.jfree.chart.renderer. BarRenderer3D

          具體實現步驟:

          1)創建用于圖形生成所要的數據集對象。

          CategoryDataset dataset = DatasetUtilities.createCategoryDataset(rowKeys, columnKeys, data)

          其中:rowKeys表示X軸數據,columnKeys表示Y軸數據,data表示填充柱狀圖所要的實際數據(來自于數據庫)。

          2)創建圖形對象。

          JFreeChart chart = ChartFactory.createBarChart3D("標題", nullnulldatasetPlotOrientation.VERTICAL,truefalsefalse)

          createBarChart3D方法是ChartFactory工廠類里的一個方法,用于3D柱狀圖的生成,該類繼承自JFreeChart。其中的八個參數分別代表:圖形的標題、X軸標題、Y軸標題、dataset就是CategoryDataset類的實例對象、顯示標題、啟用熱鍵、啟用超鍵接。

          3)設置圖形顯示的屬性。

          a ) ValueAxis類,設置柱到圖上下邊的距離。實現方法是:

          ValueAxis rangeAxis = plot.getRangeAxis();

          設置最高的一個柱與圖片頂端的距離:

          rangeAxis.setUpperMargin(0.15)

          設置最低的一個柱與圖片底端的距離:

          rangeAxis.setLowerMargin(0.15)

          borg.jfree.chart.renderer.BarRenderer3D類,設置圖形上顯示的數值。實現方法如下:

          BarRenderer3D renderer = new BarRenderer3D();

          renderer.setBaseOutlinePaint(Color.BLACK);

          設置 Wall 的顏色:

          renderer.setWallPaint(Color.gray);

          設置每個柱的顏色:

          renderer.setSeriesPaint(0, new Color(0, 0, 255));

          renderer.setSeriesPaint(1, new Color(0, 100, 255));

          renderer.setSeriesPaint(2, Color.GREEN);

          設置每個柱的 Outline 顏色
          renderer.setSeriesOutlinePaint(0, Color.BLACK);

          renderer.setSeriesOutlinePaint(1, Color.BLACK);

          renderer.setSeriesOutlinePaint(2, Color.BLACK);

          設置每個地區所包含的平行柱之間的距離
          renderer.setItemMargin(0.1);

          顯示每個柱的數值,并修改該數值的字體屬性

          renderer.setItemLabelGenerator(new StandardCategoryItemLabelGenerator());

          renderer.setItemLabelFont(new Font("黑體",Font.PLAIN,12));

          renderer.setItemLabelsVisible(true);

          為圖形加入超連接

          renderer.setItemURLGenerator(new StandardCategoryURLGenerator());

          renderer.setToolTipGenerator(new StandardCategoryToolTipGenerator());

          2 餅圖

          org.jfree.chart.plot包,包含創建餅形圖的所有方法和屬性。

          筆者根據業務需求創建了setURLGenerator(PieURLGenerator generator)方法,在圖片上建立連接,就是圖片不同部分連接不同的資源。

          setSectionLabelType(int type)方法:

          指定 section 標簽的類型,共有 7 種類型。如果不指定,默認是 NAME_LABELS,其中類型分別是:

          PiePlot.NO_LABELS

          PiePlot.NAME_LABELS

          PiePlot.VALUE_LABELS

          PiePlot.PERCENT_LABELS PiePlot.NAME_AND_VALUE_LABELSPiePlot. NAME_AND_PERCENT_LABELSPiePlot.VALUE_AND_PERCENT_LABELS

          setDefaultOutlinePaint(java.awt.Paint paint)方法,指定 section 輪廓線的顏色,如果不指定,默認值為NULL

          setDefaultOutlineStroke(java.awt.Stroke stroke)方法,指定 section 輪廓線的厚度。

          setRadius(double percent) setExplodePercent(int section, double percent)方法,抽離 section,就是把某一section從餅形圖剝離出來,需要兩個方法一起使用。

          setStartAngle(double angle)方法,設置第一個section開始位置,默認從12點鐘方向開始。

          setPaint(int section, java.awt.Paint paint)方法指定section的顏色。

          setDirection(int direction)方法指定section順序,默認是順時針方向。順時針:PiePlot.CLOCKWISE;逆時針:PiePlot.ANTICLOCKWISE

          具體實現步驟:

          1)創建用于圖形生成所要的數據集對象。

          首先實例化類DefaultPieDataset dataset = new DefaultPieDataset()。然后利用DefaultPieDataset類提供的setValuevalue1,value2)方法,把從數據庫里提取的數據存入DefaultPieDataset對象。其中value1是數據名稱、value2是數據值。

          2)創建圖形對象。

          首先實例化JFreeChart chart = ChartFactory.createPieChart3D(title, dataset, true, true, false)createPieChart3D方法是用于餅圖生成的主要方法。其中title代表圖形的標題、dataset就是DefaultPieDataset對象的實例。

          3)設置圖形顯示的屬性。

          String filename = ServletUtilities.saveChartAsPNG(jFreeChart, 700, 450, info, session);

          ChartUtilities.writeImageMap(pw, filename, info);

          pw.flush()

          saveChartAsPNG方法在ServletUtilities工廠類定義完成。主要用于把圖形對象JFreeChart以圖片的形式保存。其中的jFreeChart就是JFreeChart對象的實例。該方法返回一個文件名。

          writeImageMappw, filename, info)方法用于把保存的圖片文件以字節流的形式寫入用戶界面。

          其中pwjava.io包的PrintWriter類的實例對象,該對象創建一個圖形輸出流。Filename是輸出圖片的文件名。該文件名來自ServletUtilities.saveChartAsPNG方法創建。

          參數info用于圖形信息的顯示。

          ChartRenderingInfo info=new ChartRenderingInfo(new StandardEntityCollection())創建。

          最后輸出完成圖形,調用pw.flush()方法關閉IO流。

          ------------------------------------------------------------------------------------------

          使用JFreeChart生成各種樣式的圖表

          限于篇幅的問題我們在這里只實現兩種常用的圖表,其他類型圖表讀者可以觸類旁通。我們先給出柱狀圖的實現,餅圖的實現再來跟柱狀圖進行比較。

          1 柱狀圖


          package lius.chart.demo;

          import java.io.*;

          import org.jfree.data.*;
          import org.jfree.chart.*;
          import org.jfree.chart.plot.*;
          /**
          * 該類用于演示最簡單的柱狀圖生成
          * @author Winter Lau
          */
          public class BarChartDemo {

          public static void main(String[] args) throws IOException{

          CategoryDataset dataset = getDataSet2();
          JFreeChart chart = ChartFactory.createBarChart3D(
          "水果產量圖", // 圖表標題
          "水果", // 目錄軸的顯示標簽
          "產量", // 數值軸的顯示標簽
          dataset, // 數據集
          PlotOrientation.VERTICAL, // 圖表方向:水平、垂直
          true, // 是否顯示圖例(對于簡單的柱狀圖必須是false)
          false, // 是否生成工具
          false // 是否生成URL鏈接
          );

          FileOutputStream fos_jpg = null;
          try {
          fos_jpg = new FileOutputStream("D:""fruit.jpg");
          ChartUtilities.writeChartAsJPEG(fos_jpg,100,chart,400,300,null);
          } finally {
          try {
          fos_jpg.close();
          } catch (Exception e) {}
          }
          }
          /**
          * 獲取一個演示用的簡單數據集對象
          * @return
          */
          private static CategoryDataset getDataSet() {
          DefaultCategoryDataset dataset = new DefaultCategoryDataset();
          dataset.addValue(100, null, "蘋果");
          dataset.addValue(200, null, "梨子");
          dataset.addValue(300, null, "葡萄");
          dataset.addValue(400, null, "香蕉");
          dataset.addValue(500, null, "荔枝");
          return dataset;
          }
          /**
          * 獲取一個演示用的組合數據集對象
          * @return
          */
          private static CategoryDataset getDataSet2() {
          DefaultCategoryDataset dataset = new DefaultCategoryDataset();
          dataset.addValue(100, "北京", "蘋果");
          dataset.addValue(100, "上海", "蘋果");
          dataset.addValue(100, "廣州", "蘋果");
          dataset.addValue(200, "北京", "梨子");
          dataset.addValue(200, "上海", "梨子");
          dataset.addValue(200, "廣州", "梨子");
          dataset.addValue(300, "北京", "葡萄");
          dataset.addValue(300, "上海", "葡萄");
          dataset.addValue(300, "廣州", "葡萄");
          dataset.addValue(400, "北京", "香蕉");
          dataset.addValue(400, "上海", "香蕉");
          dataset.addValue(400, "廣州", "香蕉");
          dataset.addValue(500, "北京", "荔枝");
          dataset.addValue(500, "上海", "荔枝");
          dataset.addValue(500, "廣州", "荔枝");
          return dataset;
          }
          }

          程序運行結束后生成的圖片文件效果如下圖所示:


          圖4

          如果是使用簡單的數據即使用getDataSet方法獲取數據集時產生的圖片文件如下:


          圖5

          2 餅圖

          對于餅圖而言,數據集的獲取用的不是同一個數據集類,另外餅圖不支持同一個類別的項目中還有子項目這樣的數據。我們只給出創建餅圖的代碼,至于寫圖表到一個文件則與柱狀圖一致,無需重復。


          package lius.chart.demo;

          import java.io.*;

          import org.jfree.data.*;
          import org.jfree.chart.*;
          /**
          * 用于演示餅圖的生成
          * @author Winter Lau
          */
          public class PieChartDemo {

          public static void main(String[] args) throws IOException{
          DefaultPieDataset data = getDataSet();
          JFreeChart chart = ChartFactory.createPie3DChart("水果產量圖", // 圖表標題
          data,
          true, // 是否顯示圖例
          false,
          false
          );
          //寫圖表對象到文件,參照柱狀圖生成源碼
          }
          /**
          * 獲取一個演示用的簡單數據集對象
          * @return
          */
          private static DefaultPieDataset getDataSet() {
          DefaultPieDataset dataset = new DefaultPieDataset();
          dataset.setValue("蘋果",100);
          dataset.setValue("梨子",200);
          dataset.setValue("葡萄",300);
          dataset.setValue("香蕉",400);
          dataset.setValue("荔枝",500);
          return dataset;
          }
          }

          生成的餅圖文件效果如下:


          圖6





          回頁首


          將生成的圖表移到瀏覽器上

          為了將生成的圖表直接傳給客戶端瀏覽器,只需要將前面兩個例子中的文件流換成是通過HttpServletResponse對象獲取到的輸出流,詳細代碼清單如下:


          package lius.chart.demo;

          import java.io.IOException;
          import javax.servlet.*;
          import javax.servlet.http.HttpServlet;

          import org.jfree.data.*;
          import org.jfree.chart.*;
          /**
          * 演示通過servlet直接輸出圖表
          * @author Winter Lau
          */
          public class ChartDemoServlet extends HttpServlet {

          public void service(ServletRequest req, ServletResponse res)
          throws ServletException, IOException
          {
          res.setContentType("image/jpeg");
          DefaultPieDataset data = getDataSet();
          JFreeChart chart = ChartFactory.createPie3DChart("水果產量圖",
          data,
          true,
          false,
          false
          );

          ChartUtilities.writeChartAsJPEG(res.getOutputStream(),
          100,chart,400,300,null);
          }
          /**
          * 獲取一個演示用的簡單數據集對象
          * @return
          */
          private static DefaultPieDataset getDataSet() {
          DefaultPieDataset dataset = new DefaultPieDataset();
          dataset.setValue("蘋果",100);
          dataset.setValue("梨子",200);
          dataset.setValue("葡萄",300);
          dataset.setValue("香蕉",400);
          dataset.setValue("荔枝",500);
          return dataset;
          }
          }




          高級主題

          很多情況我們不僅僅要求可以在瀏覽器上顯示一個圖表,我們更需要客戶可以直接在圖表上做一下交互的操作,例如獲取信息提示,點擊圖表某個部分進行更詳細信 息的展示等等。例如前面生成的簡單柱狀圖,用戶需要在看到柱狀圖后點擊某種水果例如是蘋果即可看到各個地區蘋果產量的情況。為此就要求該圖形具有交互操作 的功能。在HTML中為了讓一個圖像具有可交互的功能就必須給該圖像定義一個Map對象。下表節選一段具有該功能的HTML代碼


          <MAP NAME="chartMap">
          <AREA SHAPE="RECT" COORDS="81,15,126,254" href="?series=0&category=100" title="100 = 7,048"
          onclick="javascript:clickChart('100');return false;">
          <AREA SHAPE="RECT" COORDS="143,27,188,255" href="?series=0&category=200" title="200 = 6,721"
          onclick="javascript: clickChart ('200');return false;">
          <AREA SHAPE="RECT" COORDS="205,54,250,255" href="?series=0&category=300" title="300 = 5,929"
          onclick="javascript: clickChart ('300');return false;">
          <AREA SHAPE="RECT" COORDS="267,85,312,255" href="?series=0&category=400" title="400 = 5,005"
          onclick="javascript: clickChart ('400');return false;">
          <AREA SHAPE="RECT" COORDS="329,17,374,255" href="?series=0&category=Diet" title="Diet = 7,017" onclick="javascript:
          clickChart ('Diet');return false;">
          </MAP>

          由此就產生了一個問題:如果 根據一個圖像來生成對應的MAP對象。我們回頭看看剛才的代碼,在創建一個圖表對象時候有兩個參數,我們舉柱狀圖的例子來講這兩個參數就是 ChartFactory. createBarChart3D方法中的最后兩個參數,這兩個參數的類型都是布爾值。這兩個參數意思分別是:是否創建工具提示(tooltip)以及是 否生成URL。這兩個參數分別對應著MAP中一個AREA的title屬性以及href屬性。

          可是我想知道的是怎么來產生這個MAP啊!哈哈,不要著急,JFreeChart已經幫我們做好生成MAP對象的功 能。為了生成MAP對象就要引入另外一個對象:ChartRenderingInfo。因為JFreeChart沒有直接的方法利用一個圖表對象直接生成 MAP數據,它需要一個中間對象來過渡,這個對象就是ChartRenderingInfo。下圖是生成MAP數據的流程圖:


          圖7

          如 上圖所示,ChartUtilities類是整個流程的核心,它周圍的對象都是一些例如數據對象或者是文件等。這個流程簡單描述如下:首先創建一個 ChartRenderingInfo對象并在調用ChartUtilities的writeChartAsJPEG時作為最后一個參數傳遞進去。調用該 方法結束后將產生一個圖像文件以及一個填充好MAP數據的ChartRenderingInfo對象,有了這個對象我們還是沒有辦法獲取具體的MAP數 據,我們還必須借助于ChartUtilities的writeImageMap方法來將ChartRenderingInfo對象讀取出來,獲取MAP 數據的代碼片斷如下:


          PrintWriter w = null;
          FileOutputStream fos_jpg = null;
          FileOutputStream fos_cri = null;
          try{
          //根據不同類型的圖表使用不同類,以下是針對餅圖的操作
          PiePlot plot = (PiePlot) chart.getPlot();
          plot.setURLGenerator(new StandardPieURLGenerator(url));
          //設置工具提示
          plot.setToolTipGenerator(new StandardPieToolTipGenerator());
          fos_jpg = new FileOutputStream(“d:""fruit.jpg”);
          ChartUtilities.writeChartAsJPEG(
          fos_jpg,
          100,
          chart,
          400,
          300,
          info);
          fos_cri = new FileOutputStream(__d:""fruit.map__);
          w = new PrintWriter(fos_cri);
          ChartUtilities.writeImageMap(w, __mapname__, info);
          w.flush();
          }finally{
          try{
          w.close();
          }catch(Exception e){}
          try{
          fos_cri.close();
          }catch(Exception e){}
          try{
          fos_jpg.close();
          }catch(Exception e){}
          }

          打開文件D:" fruit.map,文件的內容就是要寫到頁面上的MAP數據。把生成的圖像文件以及MAP數據文件寫到頁面上即可完成熱點圖表的功能。至于怎么結合兩者 之間的關系例如圖像的useMap屬性值必須與MAP對象的名稱結合起來,必須根據實際的應用情況進行相應的處理。筆者建議把二者通過標簽庫封裝起來,圖 像文件的名稱以及MAP對象的名稱由標簽庫統一進行控制,這樣可以保證二者的一致性。



          原文出處:http://dev.csdn.net/author/lyj_china/a5cda7cefe074c6b84f0ec944041921f.html

          posted @ 2007-10-31 17:09 小眼睛大智慧 閱讀(214) | 評論 (0)編輯 收藏

          一、page 對象
              page對象代表JSP本身,更準確地說它代表JSP被轉譯后的Servlet,它可以調用Servlet類所定義的方法。
                  
          二、config 對象
              config 對象里存放著一些Servlet 初始的數據結構。
              config 對象實現于javax.servlet.ServletConfig 接口,它共有下列四種方法:
                  public String getInitParameter(name)
                  public java.util.Enumeration getInitParameterNames( )
                  public ServletContext getServletContext( )
                  public Sring getServletName( )

          三、request 對象
              request 對象包含所有請求的信息,如:請求的來源、標頭、cookies和請求相關的參數值等等。
              request 對象實現javax.servlet.http.HttpServletRequest接口的,所提供的方法可以將它分為四大類:
              1.儲存和取得屬性方法;
                  void setAttribute(String name, Object value)       設定name屬性的值為value
                  Enumeration getAttributeNamesInScope(int scope)    取得所有scope 范圍的屬性
                  Object getAttribute(String name)                   取得name 屬性的值
                  void removeAttribute(String name)                  移除name 屬性的值
              2.取得請求參數的方法
                  String getParameter(String name)                   取得name 的參數值
                  Enumeration getParameterNames( )                   取得所有的參數名稱
                  String [] getParameterValues(String name)          取得所有name 的參數值
                  Map getParameterMap( )                             取得一個要求參數的Map
              3.能夠取得請求HTTP 標頭的方法
                  String getHeader(String name)                      取得name 的標頭
                  Enumeration getHeaderNames()                       取得所有的標頭名稱
                  Enumeration getHeaders(String name)                取得所有name 的標頭
                  int getIntHeader(String name)                      取得整數類型name 的標頭
                  long getDateHeader(String name)                    取得日期類型name 的標頭
                  Cookie [] getCookies( )                            取得與請求有關的cookies
              4.其他的方法
                  String getContextPath( )                           取得Context 路徑(即站臺名稱)
                  String getMethod( )                                取得HTTP 的方法(GET、POST)
                  String getProtocol( )                              取得使用的協議 (HTTP/1.1、HTTP/1.0 )
                  String getQueryString( )                           取得請求的參數字符串,不過,HTTP的方法必須為GET
                  String getRequestedSessionId( )                    取得用戶端的Session ID
                  String getRequestURI( )                            取得請求的URL,但是不包括請求的參數字符串
                  String getRemoteAddr( )                            取得用戶的IP 地址
                  String getRemoteHost( )                            取得用戶的主機名稱
                  int getRemotePort( )                               取得用戶的主機端口
                  String getRemoteUser( )                            取得用戶的名稱
                  void etCharacterEncoding(String    encoding)       設定編碼格式,用來解決窗體傳遞中文的問題

          四、response 對象
              response 對象主要將JSP 處理數據后的結果傳回到客戶端。
              response 對象是實現javax.servlet.http.HttpServletResponse 接口。response對象所提供的方法。
              1.設定表頭的方法
                  void addCookie(Cookie cookie)                      新增cookie
                  void addDateHeader(String name, long date)         新增long類型的值到name標頭
                  void addHeader(String name, String value)          新增String類型的值到name標頭
                  void addIntHeader(String name, int value)          新增int類型的值到name標頭
                  void setDateHeader(String name, long date)         指定long類型的值到name標頭
                  void setHeader(String name, String value)          指定String類型的值到name標頭
                  void setIntHeader(String name, int value)          指定int類型的值到name標頭
              2.設定響應狀態碼的方法
                  void sendError(int sc)                             傳送狀態碼(status code)
                  void sendError(int sc, String msg)                 傳送狀態碼和錯誤信息
                  void setStatus(int sc)                             設定狀態碼
              3.用來URL 重寫(rewriting)的方法    
                  String encodeRedirectURL(String    url)            對使用sendRedirect( )方法的URL予以編碼

          五、out 對象
              out 對象能把結果輸出到網頁上。
              out主要是用來控制管理輸出的緩沖區(buffer)和輸出流(output stream)。
                  void clear( )                                      清除輸出緩沖區的內容
                  void clearBuffer( )                                清除輸出緩沖區的內容
                  void close( )                                      關閉輸出流,清除所有的內容
                  int getBufferSize( )                               取得目前緩沖區的大小(KB)
                  int getRemaining( )                                取得目前使用后還剩下的緩沖區大小(KB)
                  boolean isAutoFlush( )                             回傳true表示緩沖區滿時會自動清除;false表示不會自動清除并且產生異常處理
                  
          六、session 對象
              session對象表示目前個別用戶的會話(session)狀況。
              session對象實現javax.servlet.http.HttpSession接口,HttpSession接口所提供的方法
                  long getCreationTime()                             取得session產生的時間,單位是毫秒
                  String getId()                                     取得session 的ID
                  long getLastAccessedTime()                         取得用戶最后通過這個session送出請求的時間
                  long getMaxInactiveInterval()                      取得最大session不活動的時間,若超過這時間,session 將會失效
                  void invalidate()                                  取消session 對象,并將對象存放的內容完全拋棄
                  boolean isNew()                                    判斷session 是否為"新"的
                  void setMaxInactiveInterval(int    interval)       設定最大session不活動的時間,若超過這時間,session 將會失效

          七、application對象
              application對象最常被使用在存取環境的信息。
              因為環境的信息通常都儲存在ServletContext中,所以常利用application對象來存取ServletContext中的信息。
              application 對象實現javax.servlet.ServletContext 接口,ServletContext接口容器所提供的方法
                  int getMajorVersion( )                             取得Container主要的Servlet API版本
                  int getMinorVersion( )                             取得Container次要的Servlet API 版本
                  String getServerInfo( )                            取得Container的名稱和版本
                  String getMimeType(String file)                    取得指定文件的MIME 類型
                  ServletContext getContext(String uripath)          取得指定Local URL的Application context
                  String getRealPath(String path)                    取得本地端path的絕對路徑
                  void log(String message)                           將信息寫入log文件中
                  void log(String message, Throwable throwable)      將stack trace 所產生的異常信息寫入log文件中

          八、pageContext對象
              pageContext對象能夠存取其他隱含對象。
              1.pageContext對象存取其他隱含對象屬性的方法,此時需要指定范圍的參數。
                  Object getAttribute(String name, int scope)
                  Enumeration getAttributeNamesInScope(int scope)
                  void removeAttribute(String name, int scope)
                  void setAttribute(String name, Object value, int scope)
              范圍參數有四個,分別代表四種范圍:PAGE_SCOPE、REQUEST_SCOPE、SESSION_SCOPE、APPLICATION_SCOPE
              2.PageContext對象取得其他隱含對象的方法
                  Exception getException( )                          回傳目前網頁的異常,不過此網頁要為error page,
                  JspWriter getOut( )                                回傳目前網頁的輸出流,例如:out 
                  Object getPage( )                                  回傳目前網頁的Servlet 實體(instance),例如:page
                  ServletRequest getRequest( )                       回傳目前網頁的請求,例如:request
                  ServletResponse getResponse( )                     回傳目前網頁的響應,例如:response
                  ServletConfig getServletConfig( )                  回傳目前此網頁的ServletConfig 對象,例如:config
                  ServletContext getServletContext( )                回傳目前此網頁的執行環境(context),例如:application
                  HttpSession getSession( )                          回傳和目前網頁有聯系的會話(session),例如:session
              3.PageContext對象提供取得屬性的方法
                  Object getAttribute(String name, int scope)        回傳name 屬性,范圍為scope的屬性對象,回傳類型為Object
                  Enumeration getAttributeNamesInScope(int scope)    回傳所有屬性范圍為scope 的屬性名稱,回傳類型為Enumeration
                  int getAttributesScope(String name)                回傳屬性名稱為name 的屬性范圍
                  void removeAttribute(String name)                  移除屬性名稱為name 的屬性對象
                  void removeAttribute(String name, int scope)       移除屬性名稱為name,范圍為scope 的屬性對象
                  void setAttribute(String name, Object value, int scope)        指定屬性對象的名稱為name、值為value、范圍為scope
                  Object findAttribute(String name)                  尋找在所有范圍中屬性名稱為name 的屬性對象

          九、exception對象
              若要使用exception 對象時,必須在page 指令中設定。<%@ page isErrorPage="true" %>才能使用。
              exception提供的三個方法:
                  getMessage( )
                  getLocalizedMessage( )、
                  printStackTrace(new java.io.PrintWriter(out)) 

          原文出處:http://www.javaresearch.org/article/68164.htm

          posted @ 2007-10-31 17:07 小眼睛大智慧 閱讀(160) | 評論 (0)編輯 收藏

          一、規范存在的意義

          應用編碼規范對于軟件本身和軟件開發人員而言尤為重要,有以下幾個原因:

          1、好的編碼規范可以盡可能的減少一個軟件的維護成本 , 并且幾乎沒有任何一個軟件,在其整個生命周期中,均由最初的開發人員來維護;

          2、好的編碼規范可以改善軟件的可讀性,可以讓開發人員盡快而徹底地理解新的代碼;

          3、好的編碼規范可以最大限度的提高團隊開發的合作效率;

          4、長期的規范性編碼還可以讓開發人員養成好的編碼習慣,甚至鍛煉出更加嚴謹的思維;

          二、命名規范

          1、一般概念

          1、盡量使用完整的英文描述符

          2、采用適用于相關領域的術語

          3、采用大小寫混合使名字可讀

          4、盡量少用縮寫,但如果用了,必須符合整個工程中的統一定義

          5、避免使用長的名字(小于 15 個字母為正常選擇)

          6、避免使用類似的名字,或者僅僅是大小寫不同的名字

          7、避免使用下劃線(除靜態常量等)

          2、標識符類型說明

          1、包( Package )的命名

          Package 的名字應該采用完整的英文描述符,都是由一個小寫單詞組成。并且包名的前綴總是一個頂級域名,

          通常是 com、edu、gov、mil、net、org 等;
          如: com.yjhmily.test

          2、類( Class )的命名

          類名應該是個一名詞,采用大小寫混合的方式,每個單詞的首字母大寫。盡量保證類名簡潔而富于描述。

          使用完整單詞,避免縮寫詞 ( 除非工程內有統一縮寫規范或該縮寫詞被更廣泛使用,像 URL , HTML)

          如: FileDescription

          3、接口( Interface )的命名

          基本與 Class 的命名規范類似。在滿足 Classd 命名規則的基礎之上,保證開頭第一個字母為 ”I”,

          便于與普通的 Class區別開。其實現類名稱取接口名的第二個字母到最后,且滿足類名的命名規范;

          如: IMenuEngine

          4、枚舉( Enum )的命名

          基本與 Class 的命名規范類似。在滿足 Classd 命名規則的基礎之上,保證開頭第一個字母為 ”E” ,

          便于與普通的 Class區別開。
          如: EUserRole

          5、異常( Exception )的命名

          異常( Exception ) 通常采用字母 e 表示異常,對于自定義的異常類,其后綴必須為 Exception

          如: BusinessException

          6、方法( Method )的命名

          方法名是一個動詞,采用大小寫混合的方式,第一個單詞的首字母小寫,其后單詞的首字母大寫。

          方法名盡可能的描述出該方法的動作行為。返回類型為 Boolean 值的方法一般由“ is ”或“ has ”來開頭

          如: getCurrentUser() 、 addUser() 、 hasAuthority()

          7、參數( Param )的命名

          第一個單詞的首字母小寫,其后單詞的首字母大寫。參數量名不允許以下劃線或美元符號開頭,

          雖然這在語法上是允許的。參數名應簡短且富于描述。

          如: public UserContext getLoginUser(String loginName);

          8、常量字段 ( Constants )的命名

          靜態常量字段( static final ) 全部采用大寫字母,單詞之間用下劃線分隔;

          如: public static final Long FEEDBACK;
          public static Long USER_STATUS;

          三、注釋規范

          一個很好的可遵循的有關注釋的經驗法則是:

          問問你自己,你如果從未見過這段代碼,要在合理的時間內有效地明白這段代碼,你需要一些什么信息???

          1、一般概念

          1、注釋應該增加代碼的清晰度

          2、保持注釋的簡潔

          3、在寫代碼之前或同時寫注釋

          4、注釋出為什么做了一些事,而不僅僅是做了什么

          2、注釋哪些部分

          1、Java 文件:必須寫明版權信息以及該文件的創建時間和作者;

          2、類:類的目的、即類所完成的功能,以及該類創建的時間和作者名稱;多人一次編輯或修改同一個類時,

          應在作者名稱處出現多人的名稱;

          3、接口: 在滿足類注釋的基礎之上,接口注釋應該包含設置接口的目的、它應如何被使用以及如何不被使用。

          在接口注釋清楚的前提下對應的實現類可以不加注釋;

          4、方法注釋: 對于設置 (Set 方法 ) 與獲取 (Get 方法 ) 成員的方法,在成員變量已有說明的情況下,

          可以不加注釋;普通成員方法要求說明完成什么功能,參數含義是什么且返回值什么;另外方法的創建

          時間必須注釋清楚,為將來的維護和閱讀提供寶貴線索;

          5、方法內部注釋: 控制結構,代碼做了些什么以及為什么這樣做,處理順序等,特別是復雜的邏輯處理部分,

          要盡可能的給出詳細的注釋;

          6、參數: 參數含義、及其它任何約束或前提條件;

          7、屬性: 字段描述;

          8、局部 ( 中間 ) 變量: 無特別意義的情況下不加注釋;

          3、注釋格式

          遵循工程規定的統一注釋格式,一般情況下會以 codetemplates.xml 格式的文件導入 IDE(Eclipse)

          或者用Eclipse默認的;

          四、代碼格式規范

          遵循工程規定的統一代碼格式,一般情況下直接使用 IDE(Eclipse) 自帶的默認代碼格式對代碼進行格式化;

          五、其他規范

          JSP 文件命名

          采用完整的英文描述說明 JSP 所完成的功能,盡可能包括一個生動的動詞,第一個字母小寫,

          如: viewMessage.jsp 、editUser.jsp 等。

          六、工程特有命名規范

          1、持久層

          1、 Hibernate 映射文件及實體

          與數據庫表名稱完全對應;
          如: Advertisement.hbm.xml 、 Advertisement.java

          2、數據訪問 DAO

          DAO 接口和實現類名稱必須完全符合正常接口和實現類的命名規則,且最后以 ”DAO” 結尾

          DAO 內的數據訪問方法必須足夠抽象的描述出對數據庫的基本 CRUD 操作;
          如: ICrossAdDAO( 接口 ) 、 CrossAdDAO( 實現類 )

          3、各種操作數據庫的 HQL 配置文件

          HQL 文件的個數原則上與系統的 Services 層的服務個數相等,且以服務名稱命名 HQL 文件;

          如: resource.hbm.xml

          2、服務層

          1、服務接口和實現

          服務接口和實現類必須完全符合正常接口和實現類的命名規則;以工程定義的服務名為主體,

          并統一以 ”Serv” 結尾
          如: IResourceServ( 服務接口 ) 、 ResourceServ( 接口實現類 )

          2、服務接口方法

          方法名是一個動詞,采用大小寫混合的方式,第一個單詞的首字母小寫,其后單詞的首字母大寫。

          方法名盡可能的描述出該方法的動作行為。

          返回類型為 Boolean 值:用“ is ”或“ has ”來開頭
          得到某數據: get+ 數據描述名詞復數 + 數據類型;
          得到所有數據: get+All+ 數據描述名詞復數 + 數據類型;
          通過 XXX 得到 / 查詢某數據: get/query+ 數據描述名詞復數 + 數據類型 +By+ 條件;
          添加某數據: save/add+ 數據描述名詞 ()
          更新某數據: save/update+ 數據描述名詞;
          刪除某數據: delete/remove+ 數據描述名詞;

          3、業務對象

          業務名稱 +BO

          4、查詢參數對象

          凡是繼承 Abst***QuerySpec 的查詢參數類全部滿足以下規則:
          Query+ 所要查詢的數據描述名詞 +Spec
          作為參數傳入時,參數名必須為:所要查詢的數據描述名詞 +Spec
          如: QueryProgramSpec

          3、MVC 層

          1、Action 控制層

          Action 類名:功能模塊名稱 +Action ;
          Actoin 方法名稱盡可能的描述出頁面遷移的去向
          如: LoginAction( 登錄用 action) , toWelcome( 轉向歡迎頁的 action 方法 )

          2、資源文件

          系統全局資源文件: globalMessages_+ 字符編碼類型 +.properties
          功能模塊內部的資源文件: package.properties

          4、Spring 配置文件

          1、Action 相關配置文件
          文件目錄: WebRoot/WEB-INF/spring/action/ 功能模塊名稱 +_ApplicationContext.xml

          2、Services 相關配置文件

          文件目錄: WebRoot/WEB-INF/spring/services/Services_ApplicationContext.xml

          3、全局性配置文件

          文件目錄: WebRoot/WEB-INF/spring/工程名+_ApplicationContext.xml

          5、JSP 文件

          采用完整的英文描述說明 JSP 所完成的功能,盡可能包括一個生動的動詞,第一個字母小寫,
          如: viewMessage.jsp 、editUser.jsp 等。

          原文出處:http://www.aygfsteel.com/yjhmily/

          posted @ 2007-10-10 16:35 小眼睛大智慧 閱讀(258) | 評論 (1)編輯 收藏

          主站蜘蛛池模板: 琼中| 邛崃市| 汾西县| 洪泽县| 潼关县| 鹤山市| 南投县| 瑞金市| 沈丘县| 湘潭市| 宾阳县| 钦州市| 溆浦县| 惠州市| 富宁县| 吴川市| 含山县| 梨树县| 兴和县| 赤水市| 东阿县| 黄骅市| 澎湖县| 汉寿县| 西平县| 嘉定区| 康乐县| 富顺县| 临汾市| 长垣县| 双辽市| 汝州市| 茂名市| 丰台区| 乐陵市| 长丰县| 临邑县| 扬中市| 罗田县| 东山县| 漳浦县|