<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    JavaExplore

    一切像霧像雨又像風
    posts - 19, comments - 45, trackbacks - 0, articles - 0

    2005年9月1日

         摘要: 3 數據源處理 JFreeChart 中的數據源是DataSet接口類型。該接口有三個主要的子類接口:CategoryDataset、PieDataset、SeriesDataset CategoryDataset 接口的實現類基本上都維護了一...  閱讀全文

    posted @ 2006-09-12 23:36 JavaExplore 閱讀(6545) | 評論 (15)編輯 收藏

    1、策略:常用于算法族,將算法從依賴的環境中抽象出來形成
    2、狀態:和策略非常接近,使用于有明顯狀態變化的時候
    3、命令:命令的發起與執行解藕,命令類可以獨立演化,有助于做redo undo操作以及記錄所執行的命令
    4、解釋:用于文法的解析
    5、迭代子:java中有現成的實現,iterator
    6、觀察者:常見,類似與模型視圖的關系,java中提供了oberver類和observable接口
    7、調停者:處理混亂的類交互,抽象出中間類,將類間的交互都通過這個類完成
    8、模版:將擁有同一父類的多個具體子類的共同操作提取出來形成抽象模版類
    ???????? 原則:具體的私有屬性應該放到具體類中,抽象類中調用屬性通過屬性方法而不是直接調用屬性
    ?????????????? 將私有屬性放到具體的類中,才能方便對父類進行多個實現。
    ???????? 將行為看作劃分類的標準,以前我都是將數據模型看作劃分類的思想,以后應該重新審視行為在類中的重要作用,特別是在的繼承等級中。

    posted @ 2006-09-12 23:33 JavaExplore 閱讀(378) | 評論 (0)編輯 收藏

    1 簡介

    JFreeChart SourceForge.net 上的一個開源項目,它的源碼和 API 都可以免費獲得。 JFreeChart 的功能非常強大,可以實現餅圖 ( 二維和三維 ) ,  柱狀圖  ( 水平 , 垂直 ), 線圖 , 點圖 , 時序圖 , 甘特圖 股票行情圖 , 混和圖 溫度計圖 刻度圖等常用商用圖表,   圖形可以導出成 PNG JPEG 格式,同時還可以與 PDF EXCEL 關聯,支持對圖形的放大、縮小,支持常見圖形的 3D 顯示。

    2 圖形 對象的處理

    2 1 JFreeChart對象

    JFreeChart 可以生成很多圖形對象,它的工廠類提供了 33 個工廠方法用于生成不同的圖形對象(具體的工廠方法可以參見 JFreeChart API 手冊或者源碼中的 ChartFactory )。              JFreechart 對圖形對象的抽象具體化。圖形對象( JFreeChart ),由 Title( 主標題 ) SubTitle (子標題 ) Plot (圖形的繪制結構)等幾個主要對象組成。各個組成部分如下圖所示:

    這是一個 JFreeChart 對象,上面的“ chart 標題”是 Title 對象,中間區域是 Plot 對象(包括繪圖區域和坐標軸區域),下面的區域是 LegendTitle 對象,是一種 SubTitle 對象。

    每個 JFreeChart 對象只能有 1 Title 對象, 1 Plot 對象,可以有多個 SubTitle 對象。 JFreeChart 對象可以進行的操作有:背景的設置(背景顏色、背景圖片、透明度等)、邊框的設置(是否可見、筆畫、 Paint 等)、渲染方式的設置、標題對象的設置、子標題對象的增刪查操作。(本文中的所有操作都不提供代碼級的介紹,可參見 API 手冊或者源碼)

    2 2 主標題對象

    主標題對象是 TextTitle 類型,可以進行的操作有:背景設置、字體設置(字體類型、顏色、內容、對齊方式等操作)、 tooltip 設置、 URL 設置。

    2 3 Plot 對象

    Plot 對象是圖形的繪制結構對象。 JFreeChart 中含有很多不同的 Plot 對象,每一種圖形對象中的 Plot 對象都在實例化的時候創建。所有的 Plot 共有的操作有:背景設置(背景顏色、背景圖片、透明度等)、前景透明度設置、無數據存在情況的設置(顯示的字符內容、顯示的字體、顯示的 Paint )、放大縮小比例的設置,大部分 Plot 對象還有設置 Datset 、設置 Renderer 對象操作。

    JFreeChart 中有 18 Plot 抽象類的具體實現類。 Plot 的具體實現類主要由以下重要對象組成: Renderer 對象(圖形的繪制單元——繪圖域) Datset (圖形的數據源), DomainAxis (區域軸,相當于 x 軸), RangeAxis (范圍軸,相當于 y 軸)。不同的 Plot 對象組成方式不盡相同,有的不含有 Renderer 對象,比如 CompassPlot ContourPlot MultiplePiePlot PiePlot 等,有的不含有 DomainAxis RangeAxis 對象,另外除了 FastScatterPlot 類都含有 Datset 對象, FastScatterPlot 使用 float 的二維數組充當數據源。尤其說明一點,餅狀圖相關的 Plot 對象( MultiplePiePlot PiePlot PiePlot3D RingPlot )中都不含有 Renderer 對象、 DomainAxis 對象、 RangeAxis 對象。

    一般來說, Datset 對象存儲數據模型, Renderer 對象存儲顯示模型, Plot 對象根據 Datset 對象、 Renderer 對象完成畫圖操作。

    仍以上面的圖形講解 Plot 對象的組成。

       上圖的中間區域是是一個 XYPlot 對象。其中的折線部分即是圖形的繪制單元 Renderer 對象。 X 軸是 DomainAxis y 軸是 RangeAxis ,其中 Datset 對象屬于數據模型范疇,是 UI 不可見對象。該圖中的 plot 背景色、網格線的各種設置可以通過 XYPlot 對象本身完成。

           下面講解 Renderer 對象、 Axis 對象( X 軸、 y 軸都屬于 Axis 對象), Datset 對象在后續章節中專門講解。

    2 31 Renderer對象

    Renderer 對象是圖形的繪制單元。 JFreeChart 提供了兩個接口 CategoryItemRenderer XYItemRenderer 1 個抽象類 AbstractRenderer 供具體的 Renderer 類實現,給出了將近 50 種具體實現類。

    一般來說 Renderer 對象可進行的操作有:對 item label (下圖中的柱狀圖上的紅色數字即為 item label 的示例)的默認設置( item label 的產生方式、是否可見、字體、 Paint 、正反向 item label 的位置設置等)、繪制圖形的邊框默認設置( Paint 、筆畫、是否可見等)、繪制圖形的默認設置(形狀、筆畫、是否可見、對應的圖例中是否可見等,折線圖還有線條是否可見、折點圖形是否可見、折點圖形是否填充、折點圖形的形狀、對應的圖例中線條是否可見、圖形是否可見、整體是否可見等)、以及對指定 item label 的設置、指定繪制圖形的設置。可以說和具體繪制的圖形相關的屬性都可以通過 Renderer 對象設置。

    不同的 Renderer 的實現類實現了不同的顯示方式,在含有 Renderer 對象的 JFreeChart 對象中, R enderer 對象決定了JFreeChart對象的顯示方式。例如:柱狀圖的Plot對象中默認的Renderer對象是 CategoryItemRenderer 對象,通過設置 Plot 對象的Renderer對象 LineAndShapeRenderer ,則柱狀圖變為線圖。使用中一般不需要顯式的實例化一個 R enderer 對象,一般通過 JFreeChart 對象的 Plot 對象調用現有的 R enderer 對象進行重新設置等操作。

    2 32 Axis對象

    JFreeChart 提供了兩種類型的坐標軸: CategoryAxis (等級軸)和 ValueAxis (值軸), ValueAxis 又有 3 個子類: DateAxis (時間軸)、 NumberAxis (數字軸)、 PeriodAxis (時期軸)。這些坐標軸還有更詳細的子類,不再一一列舉

    Axis 對象可進行的操作有:標題的設置(內容、字體、Paint、顯示角度等)、坐標線的設置(筆畫、Paint、是否可見等)、刻度線的設置(是否可見、筆畫、Paint、位于繪圖區域的長度、位于繪圖區域外的長度等)、刻度標示的設置(筆畫、Paint、字體、與軸的距離等)、坐標軸范圍設置等。

    CategoryAxis 對象還可以進行的操作有: 刻度標示間距 設置( 最小間距、最大間距、指定間距)等。

    ValueAxis 對象可進行的操作有:軸端設置(顯示的圖形形狀)、范圍設置(是否自動產生范圍、自動產生的最小范圍、最大范圍、指定確定范圍、指定范圍大小等)、間隔設置(是否自動產生間隔、指定間隔)等。

    DateAxis 對象還有對時間刻度顯示格式的設置操作。

    2 4 子標題對象

        子標題對象是 Title 類型的對象,一個JFreeChart可以有多個子標題對象。JFreeChart提供了5Title的實現,可以是圖片、文本、圖例等的形式。

    (數據源以及常用圖形的處理以及進一步的討論在后續文章中介紹)
     

    posted @ 2006-09-01 23:21 JavaExplore 閱讀(9947) | 評論 (1)編輯 收藏

    1、代理模式:參與角色:代理與真實實體共同的抽象角色、代理角色、真實實體角色
    ?????? 遠程代理:封裝對與遠程對象復雜的調用通訊過程,象調用本地對象一樣
    ?????? 虛擬代理:真實實體加載時間過長的,使用虛擬代理提供友好的顯示方式,一邊加載實際的對象
    ?????? 安全代理:調用真實的對象之前插入權限驗證模塊
    ?????? 智能引用代理:調用真實的對象之后調用統計等相關操作模塊

    2、享元模式:參與對象:建造工廠、抽象享元、具體享元
    ?????? 分析對象的內蘊與外蘊狀態,即不變的私有屬性與變化的私有屬性。建造工廠使用備忘錄模式存儲已經建造的對象,建造對象的時候,以參數的形式傳遞享元對象的內蘊屬性。實際調用中,使用傳遞外部參數的方法使用外蘊變量。

    ?? 復合的享元對象組成的對象,不可以整體使用享元模式,但可以單個的享元對象屬性使用該模式
    ?? 優點:降低內存中的對象? 缺點:設計復雜性
    ???????

    3、門面模式:結構模式。為包含有很多對象的子系統提供統一的操作接口類,所有對該子系統的調用都通過這個類,降低子系統之間調用的復雜度,也符合笛比特法則(一個對象的朋友盡量少,只與朋友說話)

    4、橋梁模式:參與角色:抽象化角色、抽象化的具體角色、實現化角色、實現化的具體角色
    ?兩個有繼承等級的對象群,一個對象群對另一個對象群有調用關系的時候使用
    ??????? 目的:使抽象化與實現化解藕

    posted @ 2006-09-01 23:08 JavaExplore 閱讀(728) | 評論 (0)編輯 收藏

    ???????? 今天去jdon,看了它的設計研究欄目,bang有幾篇評論單例模式的文章,聲稱“Singleton is evil”(見http://www.jdon.com/jive/article.jsp?forum=91&thread=17578),并且引用幾篇外文頁面佐證自己的觀點,其中有一篇文章更是說,單例不僅不是一種模式,而是一種反模式。
    ??????? 下面我談談我對單例模式的看法。逐一分析單例模式的陷阱,幫助大家正確使用單例模式。
    (1)?陷阱一:調用函數的性能瓶頸
    ??????? 在c++中,單例只有一種實現方式——LazySingleton, 實現如下(本文全部使用java代碼):

    public ? class ?LazySingleton {
    ????
    private ? static ?LazySingleton?m_instance = null ;
    ???? private?LazySingleton(){};
    ?????synchronized?public?static?LazySingleton?getInstance(){
    ????????
    if(m_instance==null)
    ????????????m_instance
    =new?LazySingleton();
    ????????
    return?m_instance;
    ????}

    }

    LazySingleton將對象的初始化推遲到調用的時候。并且為了防止多線程環境下產生多個實例,使用synchronized關鍵字保證函數getInstance調用的線程安全。synchronized關鍵字的存在保證了只會產生一個對象,但也成了多線程環境下的性能瓶頸。一個多線程的程序,到了這里卻要排隊等候成了一個單線程式的執行流程,這在高并發環境下是不可容忍的。而c++中可以使用雙重檢查機制將這種性能問題僅僅限制在第一次構造對象的時候,而java中不可以使用雙重檢查機制。
    ????????但是java可以實現EagerSingleton,實現如下:

    public ? class ?EagerSingleton {
    ????
    private ? static ?EagerSingleton?m_instance = new ?EagerSingleton();
    ???? private?EagerSingleton(){};
    ???? public?static?agerSingleton?getInstance(){
    ????????
    return?m_instance;
    ????}

    }
    與LazySingleton相比,EagerSingleton將對象的初始化放到了類加載的時候。這樣就避免了synchronized關鍵字的性能瓶頸。
    (2)陷阱二:訪問互斥共享資源
    ?????????EagerSingleton中訪問互斥資源也要考慮線程安全問題。下面看一個例子:
    public?class?EagerSingleton{
    ????
    private?static?EagerSingleton?m_instance=new?EagerSingleton();
    ????
    private?HashMap?map=new?HashMap();
    ???
    private?EagerSingleton(){};
    ???
    public?static?agerSingleton?getInstance(){
    ????????
    return?m_instance;
    ????}

    ???????
    public?void?refreshMap(Object key){
    ????????
    synchronized(map){
    ????????????
    if(!map.contains(key))
    ????????????????map.put(key,value);
    //value為此時的實時數據
    ????????}
    ?
    ????}

    }
    因為該類是單例,可能多線程并發訪問map,map非線程安全,需要加線程安全關鍵字,否則就掉入了訪問互斥資源的陷阱。
    (3)陷阱三:非法邏輯陷阱
    ??????? 這種情況一般是濫用單例模式造成的,下面考慮一種濫用單例的情況。下面的代碼的作用是getValueByName后,馬上printValue即完成操作流程。
    public?class?EagerSingleton{
    ????
    private?static?EagerSingleton?m_instance=new?EagerSingleton();
    ????
    private?String?value=null;
    ???
    private?EagerSingleton(){};
    ???
    public?static?agerSingleton?getInstance(){
    ????????
    return?m_instance;
    ????}

    ????
    synchronized?public?void?getValueByName(String?name){
    ????????value
    =getByNameFromDateBase(name);
    ????????
    ????}

    ????
    public?viod?printValue(){
    ????????System.out.println(
    this.vaue);
    ????}

    }

    該類含有一私有屬性value,在多線程環境下不能保證value值的合理邏輯,一線程getValueByName后,馬上printValue,也有可能value的值已經被其他線程修改。這種情況就屬于單例模式的濫用,該類根本不適合做成單例。
    ??????? 消除非法邏輯的陷阱,可以通過將該類重構為純粹的行為類完成。重構后的代碼如下:

    public?class?EagerSingleton{
    ????
    private?static?EagerSingleton?m_instance=new?EagerSingleton();
    ???
    private?EagerSingleton(){};
    ???
    public?static?agerSingleton?getInstance(){
    ????????
    return?m_instance;
    ????}

    ????
    private?String?getValueByName(String?name){
    ????????
    return?getByNameFromDateBase(name);
    ????????
    ????}

    ????
    public?viod?printName(String?name){
    ????????String?value
    =getValueByName(String?name);
    ????????System.out.println(value);
    ????}

    }

    通過調用printName(String name)直接完成操作流程,將其中的私有屬性處理成過程式的參數傳遞,將該類修改成純粹的行為類。

    ??????? 含有私有屬性并且含有對它賦值操作的類并非都會調入該陷阱,構造函數里進行對私有屬性賦值不會引起非法邏輯,如下代碼

    public?class?EagerSingleton{
    ????
    private?static?EagerSingleton?m_instance=new?EagerSingleton();
    ????
    private?HashMap?map==new?HashMap();
    ????
    ??? private
    ?EagerSingleton(){
    ????????map.put(key,value);
    //value為此時的實時數據
    ????}

    ???
    public?static?agerSingleton?getInstance(){
    ????????
    return?m_instance;
    ????}

    }

    構造函數里不必要加線程安全關鍵字也可以保證線程安全,因為類加載器是線程安全的,EagerSingleton只會在類加載的時候實例化一次,這樣不會出現單例模式的線程不安全,也不會造成非法邏輯。
    (4)陷阱四:單例陷阱的傳遞
    ??????? 當含有對象作為單例類的私有屬性時,陷阱不僅會出現在該類本身,還會傳遞到私有對象所在的類中。看如下代碼:

    public?class?EagerSingleton{
    ????
    private?static?EagerSingleton?m_instance=new?EagerSingleton();
    ????
    private?NewClass?newClass=nll;
    ???
    private?EagerSingleton(){
    ????????newClass
    =new?NewClass();
    ????}
    ;
    ???
    public?static?agerSingleton?getInstance(){
    ????????
    return?m_instance;
    ????}

    ???
    public?viod?printName(String?name){
    ????????String?value
    =newClass.operationByNameAndReturnValue(String?name);
    ????????System.out.println(value);
    ????}

    }
    乍一看,代碼中除了構造函數對私有屬性進行了初始化操作,其他地方沒有對私有屬性的賦值,不會引起非法邏輯陷阱。其實這個賦值操作可能隱含在newClass.operationByNameAndReturnValue(String name)操作,只有保證了NewClass的operationByNameAndReturnValue操作不會對它的私有屬性賦值操作,才能保證真正的合理邏輯。同樣,只有保證NewClass的operationByNameAndReturnValue操作沒有掉入訪問互斥資源陷阱,才能真正保證EagerSingleton沒有掉入該陷阱。
    ??????? 消除該陷阱的方法:(1)類方法的名稱要合理,比如純粹的行為方法名:interprete,excute,operation之類的方法中就不該含有對私有屬性直接或者間接的賦值操作,每個方法的責任要明確。(2)單例類中盡量不要含有非單例類的實例作為私有屬性(容器類除外),一定要有類的實例作為私有屬性的時候,重新審視這個作為私有屬性的類,是不是也應該設計成單例類;或者保證對它的初始化賦值限制在構造函數內。

    posted @ 2006-08-26 11:26 JavaExplore 閱讀(4900) | 評論 (13)編輯 收藏

    最近發現一本<java與模式>,正好再溫故一下當年的專業課內容,下面是這幾天記的筆記.(并不是系統的講解書中的內容)
    一  綜述:
    1、不要使用接口定義常量
    2、自己少用標志接口
    3、不要繼承具體類
    4、類層次的中間節點應該是接口或者抽象類,葉子是具體類
    5、子類應當擴展父類的責任,而不是覆寫父類的責任
    6、面向接口編程
    7、不要濫用繼承,組合優先于繼承

    java中設計不當的類:calendar:作為接口,含有與具體的歷法(羅馬歷法)相關的常量,不能擴展到中國的陰歷歷法(不符合開閉原則)
                        properies類:濫用繼承,繼承至hashtable,應當使用聚合

    8、笛比特法則:只與自己的直接朋友通信,不與陌生人通信(1)狹義笛比特法則:只與朋友通訊,通過自己的朋友傳遞間接的調用(2)結合依賴倒轉原則修改:不必通過朋友傳遞間接的調用,通過陌生人的抽象接口調用陌生人的行為(依舊不能與具體的陌生人發生通信)
    9、盡量降低類中成員的訪問權限,不要設計退化類(類似c中struct)。
            java中的point2D以及Dinmension2D類有這種設計缺陷(不過這種情況問題不大)
    10、如果多個具體的產品類沒有共同的商業邏輯,就可以把它們抽象到一個接口中,如果有共同的商業邏輯,就把共同的部分抽象到抽象類中,共同的部分盡量向類繼承層次的上層移動,以達到復用的目的
    二   工廠模式
    1、簡單工廠模式:參與角色:工廠/抽象產品類/具體產品類

       缺點:添加新產品的時候,雖然產品相關代碼符合開閉原則,但對工廠類本身并不符合,需要修改其中的產生產品方法或者添加新的產生方法(工廠里實現的不同造成的修改不同)來支持新的產品類
       退化方式:省略掉工廠角色,抽象產品類擔任具體產品類的工廠角色:提供靜態的getInstance方法,比如java類庫中的DateFormat類,(本人認為這樣很不符合開閉原則,父類中出現與具體子類相關的代碼,不方便擴展,添加新產品的時候,修改的時候缺點與原簡單工廠的工廠角色類似)

    2、工廠方法模式:參與角色:抽象工廠類/具體工廠類/抽象產品類/具體產品類
         消除了簡單工廠的缺點


    3、抽象工廠模式:簡單工廠模式與工廠方法模式的結合

    4、單例模式:餓漢和懶漢兩種,前者將本身對象作為靜態私有屬性事先生成,后者推遲到調用的時候,后者需要考慮多線程的時候,前面需要加線程安全關鍵字(注意),java中還是前者為優。
       不要濫用單例,只有系統要求只有一個類的實例的時候才調用
       有的單例可能有狀態屬性,這就為多例模式提供了可能
       含有私有屬性的類作成單例的時候尤其要注意:一是私有屬性的線程安全,確實需要的時候可以加線程安全關鍵字,比如系統中的log類,二是確認這些屬性是不是可以所有線程共享的,類似普通類的static
    三   各種具體模式(1)
    1、建造模式:參與角色4個:指導者、抽象建造對象、具體建造對象、產品
          一個復雜的產品有很多的零部件,就可以使用具體的建造對象來一一構造
    2、原始模式:深拷貝、淺拷貝
    3、適配器模式:將adaptee類適配成目標接口
    4、合成模式:參與角色:composite接口、樹枝節點類、樹葉節點類
          分成透明式和安全式兩種,各有優缺點
          (1)前者將管理子對象的方法放到接口中,這樣樹型結構中的所有對象都是透明的,都可以統一調用,但是葉節點并沒有管理子對象的能力,因此透明但不安全
          (2)后者將管理子對象的方法下放到樹枝節點類中,這樣安全但不透明
    5、裝飾模式:繼承已有類的接口,提供和已有類相同的方法,并對已有類的功能提供擴展(通過組合已有對象,調用已有對象方法的時候加入新的代碼)
          (1)透明的裝飾模式(純粹的裝飾模式):裝飾類、被裝飾類繼承于同一接口,而且裝飾類只實現接口的方法,不提供額外方法的實現,調用該類的時候使用接口聲明調用(實例化當然還是自己的構造函數),即該類的所有方法都是透明的
          (2)半透明的裝飾模式(退化的裝飾模式):裝飾類、被裝飾類繼承于同一接口,裝飾類不僅實現接口的方法,還提供額外方法的實現,這樣要調用它獨特的方法的時候就必須使用它本身來調用,退化到一半裝飾模式、一半適配器模式。

    posted @ 2006-08-24 21:25 JavaExplore 閱讀(2114) | 評論 (6)編輯 收藏

    花了很長時間,終于在Jboss部署成功了第一個EJB。
    Eclipse:3.1
    EJB:2.0
    JBoss:4.0.2
    關于如何部署EJB,網上有不少詳細介紹的文章。在這里我不在重復ejb的細枝末節。大體說一下,一個簡單的EJB包括:一個繼承SessionBean的類、一個繼承EJBObject接口的Remote接口、一個繼承EJBHome的Home接口、調用該EJB的一個類(網上的教程一般起名為XXXClient)。
    組織好這些類的目錄結構,寫好ejb-jar.xml,基本上就完成了。
    說明幾點:
    1、編譯類的時候,引入jboss-j2ee.jar與jbossall-client.jar包;
    2、ejb-jar.xml的DOCTYPE處一定要如此(針對EJB2.0,我部署的時候時間都浪費在這兒了):
    <!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" "3、繼承SessionBean的那個類至少要有一個ejbCreate()方法;
    4、應該拋出的異常一定不能漏掉,特別是那兩個接口里面的方法應該拋出的異常(都應該有java.rmi.RemoteException);
    5、部署后以dos方式重啟jboss,若部署失敗,可以在dos窗口中看到出錯的原因。

    posted @ 2005-09-20 21:29 JavaExplore 閱讀(1317) | 評論 (0)編輯 收藏

    代碼中經常會出現枚舉性的變量,比如血型、性別之類。
    以血型為例:

    class?Blood {
    public?final?static?
    int ?o = 0 ;
    public?final?static?
    int ?A = 1 ;
    public?final?static?
    int ?B = 2 ;
    public?final?static?
    int ?AB = 3 ;

    private?Blood();
    }



    class?person
    {
    private?
    int ?_blood;
    public?
    void ?setBlood( int ?b) {
    ???_blood
    = b;
    }

    如果要給一個person的實例設置血型,代碼如此:person.setBlood(Blood.A);
    這個寫法的代碼中,setBlood的參數為整型,如果如此調用person.setBlood(9);
    編譯器無法發現錯誤,只能靠人為控制,如果在方法setBlood中檢測參數的有效性,又超越了該方法的職責。

    重構后的代碼如下:

    final class?Blood{
    public?final?static?Blood?O
    =new?Blood(0);
    public?final?static?Blood?A
    =new?Blood(1);
    public?final?static?Blood?B
    =new?Blood(2);
    public?final?static?Blood?AB
    =new?Blood(3);
    private?
    int?_bloodCode;
    private?Blood(
    int?b){
    ????_bloodCode
    =b;
    ??}

    public?
    int?getCode(){
    ????
    return?_bloodCode;
    ??}

    }


    class?person
    {
    private?Blood?_blood;
    public?setBlood(Blood?b)
    {
    ????_blood
    =b;
    ??}

    }

    如此,(1)隱藏了血型的編碼細節
    ????????????(2)方便編譯期間發現錯誤
    ??????????? (3)避免使用超越數據范圍的參數

    posted @ 2005-09-17 21:24 JavaExplore 閱讀(1469) | 評論 (7)編輯 收藏

    1、變量、對象聲明語法<%!.....%>
    2、嵌入java語句語法<%......%>
    3、調用javabean語法<jsp:useBean id="zong" scope="page" class="test.Hello"/>
         文件Hello.class位于目錄web-inf\classes\test下,該jsp頁面與文件夾web-inf位于同一目錄下。
    4、調用javabean的屬性語法<jsp:getProperty id="zong" property="A"/>
       類Hello中要有方法getA();
    5、javabean 的一般語法,構造函數為public,所有屬性為private,每個屬性對應get,set方法,boolean類型屬性的對應get方法可以用is替換。

    posted @ 2005-09-17 20:47 JavaExplore 閱讀(1887) | 評論 (3)編輯 收藏

    這是我以前在http://bbs.chinajavaworld.com上發的一個帖子

    初來論壇,見大家一些基礎問題反復的問,很是浪費時間與精力,下面將常見問題逐一解答,并歡迎各位同道跟帖寫出常見問題以及解答方法。
    (1)、何處下載jdk?網址:java.sun.com/downloads
    何處下載tomcat?網址:http://jakarta.apache.org/site/binindex.cgi這個頁面很長,往下拉找到tomcat,有很多版本,現在最新的是 5.5.5-alpha exe PGP MD5
    (2)、為何安裝tomcat的時候停在using jvm?關掉瑞星,然后打開 控制面板-》管理工具-》服務,找到瑞星對應的全部服務都停止。然后重新安裝即可成功。
    (3)、安裝后需要如何配置環境變量?右鍵單擊"我的電腦",在彈出菜單中選擇"屬性"→"系統特性" →"高級" →"環境變量", 彈出環境變量對話框,就可以編輯系統的環境變量了。添加PATH、JAVA_HOME、CLASSPATH、TOMCAT_HOME四個變量。PATH=你的jdk目錄\bin;JAVA_HOME=你的jdk安裝目錄;CLASSPATH=你的jdk安裝目錄\lib\tools.jar;TOMCAT_HOME=你的tomcat安裝目錄。開啟tomcat服務,然后使用:http://localhost:8080/就可以測試是不是配置成功。
    (4)、tomcat的目錄結構是什么樣子的?下面說一下我們會經常接觸到的目錄與文件。bin目錄下的tomcat5.exe是tomcat服務的啟動文件;logs目錄是一些日志文件,其中stdout.log是你的System.out.println打印的目的地(當你打開tomcat服務地dos界面時,向該dos界面打印);webapps目錄是我們的網站文件放置的地方,webapps\ROOT是tomcat的默認主頁目錄,可以使用http://localhost:8080來訪問該目錄。webapps下其他目錄下的文件,我們可以使用http://localhost:8080/目錄名來訪問。
    (5)、為何我得jsp不能正確顯示中文?這個不是配置的問題,大家都知道我們可以在html文件里通過設置<meta http-equiv="Content-Type" content="text/html; charset=gb2312">讓html顯示中文,jsp也是一樣,你設置<%@page contentType="text/html; charset=gb2312" %>就可以顯示中文。
    (6)、如何新建虛擬目錄?
    修改 Tomcat安裝目錄\conf\server.xml ,在下列行前
    </Host>
    </Engine>
    添加下列行:
    <Context path="/my" docBase="c:\myjsp\test" debug="0" reloadable="true">
    </Context>
    表示增加虛擬目錄 my,對應物理目錄位置c:\myjsp\test,若存在c:\myjsp\test\hello.jsp,則下列地址可訪問:
    htpp://localhost:8080/my/hello.jsp
    修改server.xml后,需要重新啟動tomcat. (轉mouseLee回帖,測試正確)
    (7)、如何配置servlet?
    以(6)建立的虛擬目錄為例。假如你有一個servlet:MyFirstServlet。該servlet第一行代碼為:package com.myservlet;
    將MyFirstServlet.class復制到c:\myjsp\test\WEB-INF\classes\com\myservlet下面,無目錄的自己新建。然后打開c:\myjsp\test\WEB-INF\web.xml(該文件可以從tomcat的安裝目錄\webapps\ROOT\WEB-INF下面復制),在<!-- JSPC servlet mappings end -->前面加入<servlet>
    <servlet-name>newServlet</servlet-name>
    <servlet-class>com.myservlet.MyFirstServlet</servlet-class>
    </servlet>

    <servlet-mapping>
    <servlet-name>newServlet</servlet-name>
    <url-pattern>/ceshi</url-pattern>
    </servlet-mapping>
    然后你就可以通過htpp://localhost:8080/my/ceshi來訪問你的servlet了。

    posted @ 2005-09-17 20:14 JavaExplore 閱讀(1218) | 評論 (0)編輯 收藏

    java 開始版本的IO有兩個基本的面向byte類:InputStream、OutputStream
    為了擴展輸入輸出的功能并且避免類的爆炸性增長,java語言使用修飾模式擴展這兩個類的功能。
    常用的類有:DataInputStream、BufferedInputStream、FileInputStream、StringBufferInputString
                DataOutputStream、BufferedOutputStream、FileOutputStream、PrintStream
         StringBufferInputString主要用于讀去內存中的字符串
         FileInputStream主要用于讀取文件
         BufferedInputStream用于修飾上兩中InputStream
    如果要讀取文件并且要原樣復原文件,要用DataInputStream/DataOutputStream用字節讀寫

    java 后來的版本加入了很多面向Unicode的類:Reader、Writer
    仍舊使用模式擴展這兩個類的功能。
    常用的類有:FileReader、StringReader、BufferedReader
                FileWriter、StringWriter、PrintWriter、BufferedWriter

    一般使用中都是多個類同時使用的,一般都使用緩存類用以提高io性能
    比如(1)讀文件,根據文件名先生成FileInputStream,在用BufferedInputStream、DataInputStream修飾
    (2)讀取內存中的文件,先生成StringBufferInputString,在用BufferedInputStream、DataInputStream修飾
    (3)寫文件,根據文件名生成FileWriter,再用BufferedWriter、PrintWriter修飾

    posted @ 2005-09-06 21:06 JavaExplore 閱讀(698) | 評論 (0)編輯 收藏

    以前寫程序沒有處理異常的習慣。即便是一個大的系統,除了少數情況(比如發送郵件方法)之外,基本上看不見捕捉異常的代碼。現在學習java,保留了這個壞習慣。今天學習使用類FileInputStream和FileOutputStream,eclipse總是提示“Unhandled exception type FileNotFoundException”,浪費了很多時間找不到問題所在,后來發現是因為這兩個類的構造函數定義中有“throws FileNotFoundException”,而我的程序中沒有捕捉也沒有繼續向外拋出異常。

    posted @ 2005-09-06 16:41 JavaExplore 閱讀(1142) | 評論 (0)編輯 收藏

    Java Learning Path (一)、工具篇

    一、 JDK (Java Development Kit)

    JDK 是整個Java的核心,包括了Java運行環境(Java Runtime Envirnment),一堆Java工具和Java基礎的類庫 (rt.jar)。不論什么Java應用服務器實質都是內置了某個版本的JDK。因此掌握JDK是學好Java的第一步。最主流的JDK是Sun公司發布的JDK,除了Sun之外,還有很多公司和組織都開發了自己的JDK,例如IBM公司開發的JDK,BEA公司的Jrocket,還有GNU組織開發的 JDK等等。其中IBM的JDK包含的JVM(Java Virtual Machine)運行效率要比Sun JDK包含的JVM高出許多。而專門運行在x86平臺的Jrocket在服務端運行效率也要比Sun JDK好很多。但不管怎么說,我們還是需要先把Sun JDK掌握好。


    1、 JDK的下載和安裝
    JDK又叫做J2SE(Java2 SDK Standard Edition),可以從Sun的Java網站上下載到,http://java.sun.com/j2se/downloads.html ;,JDK當前最新的版本是J2SDK1.4.2,建議下載該版本的JDK,下載頁面在這里:http://java.sun.com/j2se/1.4.2/download.html

    下載好的JDK是一個可執行安裝程序,默認安裝完畢后會在C:\Program Files\Java\目錄下安裝一套JRE(供瀏覽器來使用),在C:\ j2sdk1.4.2下安裝一套JDK(也包括一套JRE)。然后我們需要在環境變量PATH的最前面增加java的路徑C:\j2sdk1.4.2\ bin。這樣JDK就安裝好了。

    2、 JDK的命令工具
    JDK的最重要命令行工具:
    java: 啟動JVM執行class
    javac: Java編譯器
    jar: Java打包工具
    javadoc: Java文檔生成器
    這些命令行必須要非常非常熟悉,對于每個參數都要很精通才行。對于這些命令的學習,JDK Documentation上有詳細的文檔。

    二、 JDK Documentation

    Documentation 在JDK的下載頁面也有下載連接,建議同時下載Documentation。Documentation是最最重要的編程手冊,涵蓋了整個Java所有方面的內容的描述。可以這樣說,學習Java編程,大部分時間都是花在看這個Documentation上面的。我是隨身攜帶的,寫Java代碼的時候,隨時查看,須臾不離手。

    三、 應用服務器(App Server)

    App Server是運行Java企業組件的平臺,構成了應用軟件的主要運行環境。當前主流的App Server是BEA公司的Weblogic Server和IBM公司的Websphere以及免費的 Jboss,選擇其中一個進行學習就可以了,個人推薦Weblogic,因為它的體系結構更加干凈,開發和部署更加方便,是Java企業軟件開發人員首選的開發平臺。下面簡要介紹幾種常用的App Server:

    1、 Tomcat
    Tomcat嚴格意義上并不是一個真正的 App Server,它只是一個可以支持運行Serlvet/JSP的Web容器,不過Tomcat也擴展了一些App Server的功能,如 JNDI,數據庫連接池,用戶事務處理等等。Tomcat被非常廣泛的應用在中小規模的Java Web應用中,因此本文做一點下載、安裝和配置 Tomcat的介紹:

    Tomcat是Apache組織下Jakarta項目下的一個子項目,它的主網站是:http://jakarta.apache.org/tomcat/ ;,Tomcat最新版本是Tomcat4.1.27,軟件下載的連接是:http://www.apache.org/dist/jakarta/tomcat-4/binaries/ ;。

    下載Tomcat既可以直接下載zip包,也可以下載exe安裝包(個人建議zip更干凈些),不管哪種情況,下載完畢安裝好以后(zip直接解壓縮就可以了)。需要設置兩個環境變量:

    JAVA_HOME=C:\j2sdk1.4.2
    CATALINA_HOME=D:\tomcat4 (你的Tomcat安裝目錄

    這樣就安裝好了,啟動Tomcat運行CATALINA_HOME\bin\startup.bat,關閉Tomcat運行shutdown.bat腳本。Tomcat啟動以后,默認使用8080端口,因此可以用瀏覽器訪問http://localhost:8080來測試Tomcat是否正常啟動。

    Tomcat提供了兩個Web界面的管理工具,URL分別是:
    http://localhost:8080/admin/index.jsp ;
    http://localhost:8080/manager/html ;
    在啟用這兩個管理工具之前,先需要手工配置一下管理員用戶和口令。用一個文本工具打開CATALINA_HOME\conf\tomcat-users.xml這個文件,加入如下幾行:

    <role rolename="manager"/>
    <role rolename="admin"/>
    <user username="robbin" password="12345678" roles="admin,manager,tomcat"/>

    這樣用戶"robbin"就具備了超級管理員權限。重新啟動Tomcat以后,你就可以使用該用戶來登陸如上的兩個管理工具,通過Web方式進行Tomcat的配置和管理了。

    2、 BEA Weblogic
    Weblogic可以到BEA的網站上免費注冊之后下載到最新的Weblogic8.1企業版,License可以免費使用1年時間,其實這已經完全足夠了。Weblogic的下載連接:http://commerce.bea.com/index.jsp,Weblogic的在線文檔:http://edocs.bea.com/ ;。

    3、 IBM Webshpere
    Websphere同樣可以下載到免費的試用版本,到IBM的developerWorks網站可以看到Websphere試用產品的下載和相關的Websphere的資料,developerWorks中文網站的連接是:http://www-900.ibm.com/developerWorks/cn/wsdd/ ;,Websphere的下載連接:http://www7b.software.ibm.com/wsdd/downloads/WASsupport.html ;。

    4、 Jboss
    Jboss是免費開源的App Server,可以免費的從Jboss網站下載:http://www.jboss.org/index.html,然而Jboss的文檔是不免費,需要花錢購買,所以為我們學習Jboss設置了一定的障礙。在Jdon上有幾篇不錯的Jboss配置文檔,可以用來參考:http://www.jdon.com/idea.html ;

    四、 Java應用的運行環境

    Java的應用可以簡單分為以下幾個方面:

    1、 Java的桌面應用
    桌面應用一般僅僅需要JRE的支持就足夠了。

    2、 Java Web應用
    Java的Web應用至少需要安裝JDK和一個web容器(例如Tomcat),以及一個多用戶數據庫,Web應用至少分為三層:
    Browser層:瀏覽器顯示用戶頁面
    Web層:運行Servlet/JSP
    DB層:后端數據庫,向Java程序提供數據訪問服務

    3、 Java企業級應用
    企業級應用比較復雜,可以擴展到n層,最簡單情況會分為4層:
    Browser層:瀏覽器顯示用戶頁面
    Client層:Java客戶端圖形程序(或者嵌入式設備的程序)直接和Web層或者EJB層交互
    Web層:運行Servlet/JSP
    EJB層:運行EJB,完成業務邏輯運算
    DB層:后端數據庫,向Java程序提供數據訪問服務

    4、 Java嵌入式應用
    Java嵌入式應用是一個方興未艾的領域,從事嵌入式開發,需要從Sun下載J2ME開發包,J2ME包含了嵌入式設備專用虛擬機KVM,和普通的JDK中包含的JVM有所不同。另外還需要到特定的嵌入式廠商那里下載模擬器。

    Java Learning Path(二)、書籍篇

    學習一門新的知識,不可能指望只看一本,或者兩本書就能夠完全掌握。需要有一個循序漸進的閱讀過程。我推薦Oreilly出版的Java系列書籍。

    在這里我只想補充一點看法,很多人學習Java是從《Thinking in Java》這本書入手的,但是我認為這本書是不適合初學者的。我認為正確的使用這本書的方法應該是作為輔助的讀物。《Thinking in Java》并不是在完整的介紹Java的整個體系,而是一種跳躍式的寫作方法,是一種類似tips的方法來對Java很多知識點進行了深入的分析和解釋。

    對于初學者來說,最好是找一本Java入門的書籍,但是比較完整的循序的介紹Java的語法,面向對象的特性,核心類庫等等,在看這本書的同時,可以同步來看《Thinking in Java》,來加深對Java的理解和原理的運用,同時又可以完整的了解Java的整個體系。

    對于Java的入門書籍,蔡學鏞推薦的是Oreilly的《Exploring Java, 2nd Edition》 或者《Java in a Nutshell,2nd Edition(針對C++背景)》,我并沒有看過這兩本書。其實我覺得電子工業出版社的《Java 2編程詳解》或者《Java 2從入門到精通》就很不錯。

    在所有的Java書籍當中,其實最最有用的,并不是O'reilly的 Java Serials,真正最最有用處是JDK的Documentation!幾乎你想獲得的所有的知識在Documentation里面全部都有,其中最主要的部分當然是Java基礎類庫的API文檔,是按照package來組織的,對于每一個class都有詳細的解釋,它的繼承關系,是否實現了某個接口,通常用在哪些場合,還可以查到它所有的public的屬性和方法,每個屬性的解釋,意義,每個方法的用途,調用的參數,參數的意義,返回值的類型,以及方法可能拋出的異常等等。可以這樣來說,所有關于Java編程方面的書籍其實都不過是在用比較通俗易懂的語言,和良好的組織方式來介紹Documentation里面的某個package里面包含的一些類的用法而已。所以萬變不離其宗,如果你有足夠的能力來直接通過Documentation來學習Java的類庫,那么基本上就不需要看其他的書籍了。除此之外, Documentation也是編程必備的手冊,我的桌面上有三個Documentation的快捷方式,分別是J2SDK1.4.1的 Documentation,Servlet2.3的Documentation和J2SDKEE1.3.1的Documentation。有了這個三個 Documentation,什么其他的書籍都不需要了。

    對于Java Web 編程來說,最核心的是要熟悉和掌握HTTP協議,這個就和Java無關了,在熟悉HTTP協議之后,就需要熟悉Java的實現HTTP協議的類庫,也就是Servlet API,所以最重要的東西就是 Servlet API。當然對于初學者而言,直接通過Servlet API來學習Web編程有很大的難度,我推薦O'reilly的《Java Server Pages 》這本書來學習Web 編程。

    EJB的書籍當中,《Enterprise JavaBeans,  2nd Edition》是一本很不錯的書, EJB的學習門檻是比較高,入門很難,但是這本書完全降低了學習的難度,特別重要的一點是,EJB的學習需要結合一種App Server的具體實現,所以在學習EJB的同時,必須同步的學習某種App Server,而這本書相關的出了三本書,分別是 Weblogic6.1,Websphere4.0和JBoss3.0上面部署書中例子的實做。真是既有理論,又有實踐。在學習EJB的同時,可以邊看邊做,EJB的學習會變得很輕松。

    但是這本書也有一個問題,就是版本比較舊,主要講EJB1.1規范和部分EJB2.0的規范。而 Ed Roman寫的《Mastering EJB 2.0》這本書完全是根據EJB2.0規范寫的,深入淺出,覆蓋了EJB編程的各個方面,并且還有很多編程經驗tips,也是學習EJB非常推薦的書籍之一。

    如果是結合Weblogic來學習J2EE的話,《J2EE應用與 BEA Weblogic Server》絕對是首選讀物,雖然是講述的Weblogic6.0,仍然值得購買,這本書是BEA官方推薦的教材,作者也是 BEA公司的工程師。現在中文版已經隨處可見了。這本書結合Weblogic介紹了J2EE各個方面的技術在Weblogic平臺上的開發和部署,實踐指導意義非常強。

    在掌握了Java平臺基礎知識和J2EE方面的知識以后,更進一步的是學習如何運用OO的方法進行軟件的設計,那么就一定要學習"設計模式"。Sun公司出版了一本《J2EE核心模式》,是每個開發Java企業平臺軟件的架構師必備的書籍。這本書全面的介紹了J2EE體系架構的各種設計模式,是設計師的必讀書籍。

    Java Learning Path(三)過程篇

    每個人的學習方法是不同的,一個人的方法不見得適合另一個人,我只能是談自己的學習方法。因為我學習Java是完全自學的,從來沒有問過別人,所以學習的過程基本上完全是自己摸索出來的。我也不知道這種方法是否是比較好的方法,只能給大家提供一點參考了。

    學習Java的第一步是安裝好JDK,寫一個Hello World,? 其實JDK的學習沒有那么簡單,關于JDK有兩個問題是很容易一直困擾Java程序員的地方:一個是CLASSPATH的問題,其實從原理上來說,是要搞清楚JRE的ClassLoader是如何加載Class的;另一個問題是 package和import問題,如何來尋找類的路徑問題。把這兩個問題摸索清楚了,就掃除了學習Java和使用JDK的最大障礙。推薦看一下王森的《Java深度歷險》,對這兩個問題進行了深入的探討。

    第二步是學習Java的語法。Java的語法是類C++的,基本上主流的編程語言不是類C,就是類C++的,沒有什么新東西,所以語法的學習,大概就是半天的時間足夠了。唯一需要注意的是有幾個不容易搞清楚的關鍵字的用法, public,protected,private,static,什么時候用,為什么要用,怎么用,這可能需要有人來指點一下,我當初是完全自己琢磨出來的,花了很久的時間。不過后來我看到《Thinking in Java》這本書上面是講了這些概念的。

    第三步是學習Java的面向對象的編程語言的特性的地方。比如繼承,構造器,抽象類,接口,方法的多態,重載,覆蓋,Java的異常處理機制。對于一個沒有面向對象語言背景的人來說,我覺得這個過程需要花很長很長時間,因為學習Java之前沒有C++的經驗,只有C的經驗,我是大概花了一個月左右吧,才徹底把這些概念都搞清楚,把書上面的例子反復的揣摩,修改,嘗試,把那幾章內容反復的看過來,看過去,看了不下5遍,才徹底領悟了。不過我想如果有C++經驗的話,應該一兩天時間足夠了。那么在這個過程中,可以多看看《Thinking in Java》這本書,對面向對象的講解非常透徹。可惜的是我學習的時候,并沒有看到這本書,所以自己花了大量的時間,通過自己的嘗試和揣摩來學會的。

    第四步就是開始熟悉Java的類庫。Java的基礎類庫其實就是JDK安裝目錄下面jre\lib\rt.jar這個包。學習基礎類庫就是學習rt.jar。基礎類庫里面的類非常非常多。據說有3000多個,我沒有統計過。但是真正對于我們來說最核心的只有4個,分別是
    java.lang.*;
    java.io.*;
    java.util.*;
    java.sql.*;

    這四個包的學習,每個包的學習都可以寫成一本厚厚的教材,而O'reilly也確實是這樣做的。我覺得如果時間比較緊,是不可能通過讀四本書來學習。我覺得比較好的學習方法是這樣的:
    首先要通讀整個package的框架,了解整個package的class,interface,exception的構成,最好是能夠找到介紹整個包框架的文章。這些專門介紹包的書籍的前幾章應該就是這些總體的框架內容介紹。

    對包整體框架的把握并不是要熟悉每個類的用法,記住它有哪些屬性,方法。想記也記不住的。而是要知道包有哪些方面的類構成的,這些類的用途是什么,最核心的幾個類分別是完成什么功能的。我在給人培訓的時候一般是一次課講一個包,所以不可能詳細的介紹每個類的用法,但是我反復強調,我給你們講這些包的不是要告訴你們類的方法是怎么調用的,也不要求你們記住類的方法調用,而是要你們了解,Java給我們提供了哪些類,每個類是用在什么場合,當我遇到問題的時候,我知道哪個類,或者哪幾個類的組合可以解決我的問題,That'all!,當我們具體寫程序的時候,只要你知道該用哪個類來完成你的工作就足夠了。編碼的時候,具體的方法調用,是邊寫代碼,邊查Documentation,所有的東西都在Documentation里面,不要求你一定記住,實際你也記不住 3000多個類的總共將近10萬個方法調用。所以對每個包的總體框架的把握就變得極為重要。

    第五步,通過上面的學習,如果學的比較扎實的話,就打好了Java的基礎了,剩下要做的工作是掃清Documentation里面除了上面4個包之外的其他一些比較有用處的類。相信進展到這一步, Java的自學能力已經被培養出來了,可以到了直接學習Documentation的水平了。除了要做GUI編程之外,JDK里面其他會有用處的包是這些:
    java.text.*;
    java.net.*;
    javax.naming.*;
    這些包里面真正用的比較多的類其實很少,只有幾個,所以不需要花很多時間。

    第六步,Java Web 編程,Web編程的核心是HTTP協議,HTTP協議和Java無關,如果不熟悉HTTP協議的話,雖然也可以學好 Servlet/JSP編程,但是達不到舉一反三,一通百通的境界。所以HTTP協議的學習是必備的。如果熟悉了HTTP協議的話,又有了Java編程的良好的基礎,學習Servlet/JSP簡直易如反掌,我學習Servlet/JSP就用了不到一周的時間,然后就開始用JSP來做項目了。

    在Servlet/JSP 的學習中,重頭仍然是Servlet Documentation。Servlet API最常用的類很少,花比較少的時間就可以掌握了。把這些類都看一遍,多寫幾個例子試試。Servlet/JSP編程本質就是在反復調用這些類來通過HTTP協議在Web Server和Brower之間交談。另外對 JSP,還需要熟悉幾個常用JSP的標記,具體的寫法記不住的話,臨時查就是了。

    此外Java Web編程學習的重點要放在 Web Application的設計模式上,如何進行業務邏輯的分析,并且進行合理的設計,按照MVC設計模式的要求,運用Servlet和JSP分別完成不同的邏輯層,掌握如何在Servlet和JSP之間進行流程的控制和數據的共享,以及Web Application應該如何配置和部署。

    第七步,J2EE編程
    以上的學習過程如果是比較順利的話,進行到這一步,難度又陡然提高。因為上面的知識內容都是只涉及一個方面,而像EJB,JMS,JTA等核心的J2EE規范往往是幾種Java技術的綜合運用的結晶,所以掌握起來難度比較大。

    首先一定要學習好JNDI,JNDI是App Server定位服務器資源(EJB組件,Datasouce,JMS)查找方法,如果對JNDI不熟悉的話,EJB,JMS這些東西幾乎學不下去。JNDI其實就是javax.naming.*這個包,運用起來很簡單。難點在于服務器資源文件的配置。對于服務器資源文件的配置,就需要看看專門的文檔規范了,比如web.xml的寫法,ejb-jar.xml的寫法等等。針對每種不同的App Server,還有自己的服務資源配置文件,也是需要熟悉的。

    然后可以學習JTA,主要是要理解JTA對于事務的控制的方法,以及該在什么場合使用 JTA。這里可以簡單的舉個例子,我們知道一般情況可以對于一個數據庫連接進行事務控制(conn.setAutoCommit (false),....,conn.commit()),做為一個原子操作,但是假設我的業務需求是要把對兩個不同數據庫的操作做為一個原子操作,你能做的到嗎?這時候只能用JTA了。假設操作過程是先往A數據庫插一條記錄,然后刪除B數據庫另一個記錄,我們自己寫代碼是控制不了把整個操作做為一個原子操作的。用JTA的話,由App Server來完成控制。

    在學習EJB之前要學習對象序列化和RMI,RMI是EJB的基礎。接著學習JMS和EJB,對于EJB來說,最關鍵是要理解EJB是如何通過RMI來實現對遠端對象的調用的,以及在什么情況下要用到EJB。

    在學習完EJB,JMS這些東西之后,你可能會意識到要急不可待學習兩個領域的知識,一個是UML,另一個是Design Pattern。Java企業軟件的設計非常重視框架(Framework)的設計,一個好的軟件框架是軟件開發成功的必要條件。在這個時候,應該開始把學習的重點放在設計模式和框架的學習上,通過學習和實際的編程經驗來掌握EJB的設計模式和J2EE的核心模式。

    J2EE規范里面,除了EJB,JMS,JTA,Servlet/JSP,JDBC之外還有很多很多的企業技術,這里不一一進行介紹了。

    另外還有一個最新領域Web Services。Web Services也完全沒有任何新東西,它像是一種黏合劑,可以把不同的服務統一起來提供一個統一的調用接口,作為使用者來說,我只要獲得服務提供者給我的WSDL(對服務的描述),就夠了,我完全不知道服務器提供者提供的服務究竟是EJB組件,還是.Net組件,還是什么CORBA組件,還是其他的什么實現,我也不需要知道。Web Services最偉大的地方就在于通過統一的服務提供方式和調用方式,實現了整個Internet服務的共享,是一個非常令人激動的技術領域。Web Services好像目前還沒有什么很好的書籍,但是可以通過在網絡上面查資料的方式來學習。

    Java Learning Path(四) 方法篇

    Java作為一門編程語言,最好的學習方法就是寫代碼。當你學習一個類以后,你就可以自己寫個簡單的例子程序來運行一下,看看有什么結果,然后再多調用幾個類的方法,看看運行結果,這樣非常直觀的把類給學會了,而且記憶非常深刻。然后不應該滿足把代碼調通,你應該想想看如果我不這樣寫,換個方式,再試試行不行。記得哪個高人說過學習編程就是個破壞的過程,把書上的例子,自己學習Documentation編寫的例子在運行通過以后,不斷的嘗試著用不同的方法實現,不斷的嘗試破壞代碼的結構,看看它會有什么結果。通過這樣的方式,你會很徹底的很精通的掌握Java。

    舉個例子,我們都編過Hello World


    public class HelloWorld {  public static void main(String[] args) {    System.out.println("Hello World");  }}


    很多初學者不是很理解為什么main方法一定要這樣來定義public static void main(String[] args),能不能不這樣寫?包括我剛學習Java的時候也有這樣的疑問。想知道答案嗎?很簡單,你把main改個名字運行一下,看看報什么錯誤,然后根據出錯信息進行分析;把 main的public取掉,在試試看,報什么錯誤;static去掉還能不能運行;不知道main方法是否一定要傳一個String[]數組的,把 String[]改掉,改成int[],或者String試試看;不知道是否必須寫args參數名稱的,也可以把args改成別的名字,看看運行結果如何。

    我當初學習Java的時候就是這樣做的,把Hello World程序反復改了七八次,不斷運行,分析運行結果,最后就徹底明白為什么了main方法是這樣定義的了。

    此外,我對于staic,public,private,Exception,try{ }catch {}finally{}等等等等一開始都不是很懂,都是把參考書上面的例子運行成功,然后就開始破壞它,不斷的根據自己心里面的疑問來重新改寫程序,看看能不能運行,運行出來是個什么樣子,是否可以得到預期的結果。這樣雖然比較費時間,不過一個例子程序這樣反復破壞幾次之后。我就對這個相關的知識徹底學通了。有時候甚至故意寫一些錯誤的代碼來運行,看看能否得到預期的運行錯誤。這樣對于編程的掌握是及其深刻的。

    其中特別值得一提的是JDK有一個非常棒的調試功能,-verbose
    java ?verbose
    javac ?verbose 以及其它很多JDK工具都有這個選項
    -verbose 可以顯示在命令執行的過程中,JVM都依次加載哪里Class,通過這些寶貴的調試信息,可以幫助我們分析出JVM在執行的過程中都干了些什么。

    另外,自己在學習過程中,寫的很多的這種破壞例程,應該有意識的分門別類的保存下來,在工作中積累的典型例程也應該定期整理,日積月累,自己就有了一個代碼庫了。遇到類似的問題,到代碼庫里面 Copy & Paste ,Search & Replace,就好了,極大提高了開發速度。最理想的情況是把一些通用的例程自己再抽象一層,形成一個通用的類庫,封裝好。那么可復用性就更強了。

    所以我覺得其實不是特別需要例程的,自己寫的破壞例程就是最好的例子,如果你實在對自己寫的代碼不放心的話,我強烈推薦你看看JDK基礎類庫的Java源代碼。在JDK安裝目錄下面會有一個 src.zip,解開來就可以完整的看到整個JDK基礎類庫,也就是rt.jar的Java源代碼,你可以參考一下Sun是怎么寫Java程序的,規范是什么樣子的。我自己在學習Java的類庫的時候,當有些地方理解的不是很清楚的時候,或者想更加清晰的理解運作的細節的時候,往往會打開相應的類的源代碼,通過看源代碼,所有的問題都會一掃而空。

    Java Learning Path(五)資源篇

    1、 http://java.sun.com/ (英文)
    Sun的Java網站,是一個應該經常去看的地方。不用多說。

    2、http://www-900.ibm.com/developerWorks/cn/ ;
    IBM的developerWorks網站,英語好的直接去英文主站點看。這里不但是一個極好的面向對象的分析設計網站,也是Web Services,Java,Linux極好的網站。強烈推薦!!!

    3、http://www.javaworld.com/ (英文)
    關于Java很多新技術的討論和新聞。想多了解Java的方方面面的應用,這里比較好。

    4、http://dev2dev.bea.com.cn/index.jsp ;
    BEA的開發者園地,BEA作為最重要的App Server廠商,有很多獨到的技術,在Weblogic上做開發的朋友不容錯過。

    5、http://www.huihoo.com/ ;
    灰狐動力網站,一個專業的中間件網站,雖然不是專業的Java網站,但是在J2EE企業應用技術方面有深厚的造詣。

    6、http://www.theserverside.com/ (英文)
    TheServerSide是一個著名的專門面向Java Server端應用的網站。

    7、http://www.javaresearch.org/ ;
    Java研究組織,有很多優秀的Java方面的文章和教程,特別是在JDO方面的文章比較豐富。

    8、http://www.cnjsp.org/ ;
    JSP技術網站,有相當多的Java方面的文章和資源。

    9、http://www.jdon.com/ ;
    Jdon論壇,是一個個人性質的中文J2EE專業技術論壇,在眾多的Java的中文論壇中,Jdon一個是技術含量非常高,帖子質量非常好的論壇。

    10、http://sourceforge.net/
    SourgeForge是一個開放源代碼軟件的大本營,其中也有非常非常豐富的Java的開放源代碼的著名的軟件

    posted @ 2005-09-01 20:30 JavaExplore 閱讀(502) | 評論 (0)編輯 收藏

    主站蜘蛛池模板: 亚洲人成网站18禁止久久影院| 男女啪啪免费体验区| 亚洲另类古典武侠| 久久精品国产亚洲av麻豆蜜芽 | 久久亚洲欧美国产精品| 羞羞漫画小舞被黄漫免费| 特a级免费高清黄色片| a级毛片免费网站| 日韩免费的视频在线观看香蕉| 久久久久久国产精品免费无码| 国产大片91精品免费观看不卡| 嫖丰满老熟妇AAAA片免费看| 免费黄色网址入口| 免费一级成人毛片| 久久久青草青青亚洲国产免观 | 四虎影视大全免费入口| 在线观着免费观看国产黄| 亚洲国产成人久久笫一页| 亚洲无线码一区二区三区| 亚洲午夜在线电影| 亚洲xxxx视频| 一级毛片免费视频网站| 久久午夜无码免费| 亚洲a视频在线观看| 67194在线午夜亚洲| 风间由美在线亚洲一区| 国产线视频精品免费观看视频| 中文字幕在线免费观看| 成人无遮挡毛片免费看| 亚洲av手机在线观看| 亚洲国产成人一区二区精品区 | 免费大片在线观看网站| 亚洲AV无码久久精品成人| 亚洲成a人片在线看| 一个人看的在线免费视频| 三年片在线观看免费大全电影 | 国产AV无码专区亚洲AV琪琪| 免费91麻豆精品国产自产在线观看 | 免费a级毛片在线观看| 久久亚洲精品成人综合| 亚洲精品久久久久无码AV片软件|