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

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

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

    棲息地

    家園

    2010年7月2日 #

    解決Jsp頁面URL中傳遞參數亂碼的方法

    Jsp頁面在URL中傳遞參數會出現亂碼可以采用以下方法解決:一、使用更改Tomcat的方法。二、使用JSP的scriptLet view plaincopy to clipboardprint?三、使用自定義JSTL。

    Jsp頁面在URL中傳遞參數會出現亂碼

    解決方法如下:

    一、使用更改Tomcat的方法。這個方法簡單,但是需要改動的地方是服務器軟件級別的,如果稍微變動系統將無法正確轉碼,移植性不高。

    1、來到tomcat目錄,找到conf目錄下的server.xml問價,打開,找到<Connector>標簽,在最后添加URIEncoding=’GBK’,效果如下:

    view plaincopy to clipboardprint?

    <Connector

    port="8080"maxThreads="150"minSpareThreads="25"maxSpareThreads="75"

    enableLookups="false"redirectPort="8443"acceptCount="100"

    debug="0"connectionTimeout="20000"

    disableUploadTimeout="true"URIEncoding=″GBK″/>

    <Connectorport="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75"enableLookups="false" redirectPort="8443" acceptCount="100"debug="0" connectionTimeout="20000"disableUploadTimeout="true" URIEncoding=″GBK″/>

    這種方法對get這個方法測試成功。

    2、在每個Jsp頁面添加如下代碼

    view plaincopy to clipboardprint?

    <%@pagepageEncoding=”gb2312″%>

    <%@pagecontentType=”text/html;charset=gb2312″%>

    <%request.setCharacterEncoding(”gb2312″);%>

    <%@ page pageEncoding=”gb2312″%><%@ page contentType=”text/html;charset=gb2312″%><%request.setCharacterEncoding(”gb2312″);%>

    編碼方式也可以改成GBK,支持繁體中文。重啟Tomcat,這一步很重要,否則可能看不到效果。

    這種方法對post測試成功。建議兩種同步使用。

    二、使用JSP的scriptLet

    view plaincopy to clipboardprint?

    <%=newString(elValue.getBytes("iso-8859-1"),"GBK")%>

    <%=new String(elValue.getBytes("iso-8859-1"),"GBK")%>

    三、使用自定義JSTL

    這是我們的重點所在,這里要詳細說明.

    第一,編寫自定義標簽

    第二編寫tag文件

    第三部署tag文件

    第四使用吧;)很簡單的.

    posted @ 2010-07-02 10:34 drecry 閱讀(211) | 評論 (0)編輯 收藏

    2010年6月11日 #

    (轉)方法重載與方法覆蓋(重寫)

    方法覆蓋必須滿足下列條件
    (1) 子類的方法的名稱及參數必須和所覆蓋的方法相同
    (2) 子類的方法返回類型必須和所覆蓋的方法相同
    (3) 子類方法不能縮小所覆蓋方法的訪問權限
    (4) 子類方法不能拋出比所覆蓋方法更多的異常
    重載方法必須滿足下列條件
    (1) 方法名必須相同
    (2) 方法的參數簽名必須相同
    (3) 方法的返回類型和方法的修飾符可以不相同
    順便說說方法覆蓋和重載的區別
    初次見到這兩個單詞并沒有什么特別的感覺,但是時間長了,卻發現書上一會兒用override,一會兒又用overload,搞得我的迷迷糊。于是就做了個總結,希望能對和我一樣對這兩個概念模糊不清的網友有一個幫助。
    override可以翻譯為覆蓋,從字面就可以知道,它是覆蓋了一個方法并且對其重寫,以求達到不同的作用。對我們來說最熟悉的覆蓋就是對接口方法的實現,在接口中一般只是對方法進行了聲明,而我們在實現時,就需要實現接口聲明的所有方法。除了這個典型的用法以外,我們在繼承中也可能會在子類覆蓋父類中的方法。在覆蓋要注意以下的幾點:
    1、覆蓋的方法的標志必須要和被覆蓋的方法的標志完全匹配,才能達到覆蓋的效果;
    2、覆蓋的方法的返回值必須和被覆蓋的方法的返回一致;
    3、覆蓋的方法所拋出的異常必須和被覆蓋方法的所拋出的異常一致,或者是其子類;
    4、被覆蓋的方法不能為private,否則在其子類中只是新定義了一個方法,并沒有對其進行覆蓋。
    overload對我們來說可能比較熟悉,可以翻譯為重載,它是指我們可以定義一些名稱相同的方法,通過定義不同的輸入參數來區分這些方法,然后再調用時,VM就會根據不同的參數樣式,來選擇合適的方法執行。在使用重載要注意以下的幾點:
    1、在使用重載時只能通過不同的參數樣式。例如,不同的參數類型,不同的參數個數,不同的參數順序(當然,同一方法內的幾個參數類型必須不一樣,例如可以是fun(int,float),但是不能為fun(int,int));
    2、不能通過訪問權限、返回類型、拋出的異常進行重載;
    3、方法的異常類型和數目不會對重載造成影響;
    4、對于繼承來說,如果某一方法在父類中是訪問權限是priavte,那么就不能在子類對其進行重載,如果定義的話,也只是定義了一個新方法,而不會達到重載的效果。
    下面是對override和overload的測試程序,其中注釋中的內容都是會產生編譯錯誤的代碼,我們將注釋去掉,看看在編譯時會產生什么效果。
    //對overload測試的文件:OverloadTest.java
    publicnewOverrideTest1();
    try{
    test.fun();
    test.fun1();
    }catch(Exceptione){}
    }
    }
    classOverrideTest1extendsOverrideTest{
    //以下正常Override
    publicvoidfun()throwsTestException2{
    System.out.println("funinOverrideTest1");
    }
    //不能Override父類中的方法,因為它定義了不同的異常類型和
    //返回值。
    //publicintfun()throwsTestException1{
    //System.out.println("methodfuninTest");
    //return1;
    //}
    //不能Override父類中的方法,因為它拋出了比父類中非法范圍
    //更大的異常。
    //publicvoidfun()throwsException{
    //System.out.println("funinOverrideTest1");
    //}
    //這個方法并沒有Override父類中的fun1方法,因為這個方法在
    //父類是private類型,所以這里只是相當于定義了一個新方法。
    publicvoidfun1(){
    System.out.println("methodfun1inTest");
    }
    }
    classTestExceptionextendsException{
    publicTestException(Stringmsg){
    super(msg);
    }
    }
    classTestException1extendsTestException{
    publicTestException1(Stringmsg){
    super(msg);
    }
    }
    classTestException2extendsTestException{
    publicTestException2(Stringmsg){
    super(msg);
    }
    } 

    參考資料:http://zhidao.baidu.com/question/1996221.html
     

    posted @ 2010-06-11 21:35 drecry 閱讀(451) | 評論 (0)編輯 收藏

    2010年3月25日 #

    JAVA面試題(五)

    5.1  是否可以繼承String類?

        String類是final類故不可以繼承。

        5.2  swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?

        switch(expr1)中,expr1是一個整數表達式。因此傳遞給 switch 和 case 語句的參數應該是 int、 short、 char 或者 byte.long,string 都不能作用于swtich.

        5.3  try {}里有一個return語句,那么緊跟在這個try后的finally {}里的code會不會被執行,什么時候被執行,在return前還是后?

        會執行,在return前執行。

        5.4  編程題: 用最有效率的方法算出2乘以8等於幾?

        2 << 3

        5.5  兩個對象值相同(x.equals(y) == true),但卻可有不同的hash code,這句話對不對?

        不對,有相同的hash code.

        5.6  當一個對象被當作參數傳遞到一個方法后,此方法可改變這個對象的屬性,并可返回變化后的結果,那么這里到底是值傳遞還是引用傳遞?

        是值傳遞。Java 編程語言只有值傳遞參數。當一個對象實例作為一個參數被傳遞到方法中時,參數的值就是對該對象的引用。對象的內容可以在被調用的方法中改變,但對象的引用是永遠不會改變的。

        5.7  當一個線程進入一個對象的一個synchronized方法后,其它線程是否可進入此對象的其它方法?

        不能,一個對象的一個synchronized方法只能由一個線程訪問。

        (這個有點疑問:問的是這個對象的其他方法,而非synchonized方法。)

        5.8  編程題: 寫一個Singleton出來。

        Singleton模式主要作用是保證在Java應用程序中,一個類Class只有一個實例存在。

        一般Singleton模式通常有幾種種形式:

        第一種形式: 定義一個類,它的構造函數為private的,它有一個static的private的該類變量,在類初始化時實例話,通過一個public的getInstance方法獲取對它的引用,繼而調用其中的方法。

    package test;

    public class Singleton {

             private Singleton() {

             }

             // 在自己內部定義自己一個實例,是不是很奇怪?

             // 注意這是private 只供內部調用

             private static Singleton instance = new Singleton();

             // 這里提供了一個供外部訪問本class的靜態方法,可以直接訪問

             public static Singleton getInstance() {

                       return instance;

             }

    }


        第二種形式:

    package test;

    public class Singleton {

             private static Singleton instance = null;

             public static synchronized Singleton getInstance() {

                       // 這個方法比上面有所改進,不用每次都進行生成對象,只是第一次

                       // 使用時生成實例,提高了效率!

                       if (instance == null)

                                instance = new Singleton();

                       return instance;

             }

    }

        其他形式:

        定義一個類,它的構造函數為private的,所有方法為static的。

        一般認為第一種形式要更加安全

        5.9  Java的接口和C++的虛類的相同和不同處。

        由于Java不支持多繼承,而有可能某個類或對象要使用分別在幾個類或對象里面的方法或屬性,現有的單繼承機制就不能滿足要求。與繼承相比,接口有更高的靈活性,因為接口中沒有任何實現代碼。當一個類實現了接口以后,該類要實現接口里面所有的方法和屬性,并且接口里面的屬性在默認狀態下面都是public static,所有方法默認情況下是public.一個類可以實現多個接口。

        5.10  Java中的異常處理機制的簡單原理和應用。

        當Java程序違反了Java的語義規則時,Java虛擬機就會將發生的錯誤表示為一個異常。違反語義規則包括2種情況。一種是Java類庫內置的語義檢查。例如數組下標越界,會引發IndexOutOfBoundsException;訪問null的對象時會引發NullPointerException.另一種情況就是Java允許程序員擴展這種語義檢查,程序員可以創建自己的異常,并自由選擇在何時用throw關鍵字引發異常。所有的異常都是java.lang.Thowable的子類。

    posted @ 2010-03-25 21:40 drecry 閱讀(190) | 評論 (0)編輯 收藏

    JAVA面試題四(轉)

     4.1  EJB包括(SessionBean,EntityBean)說出他們的生命周期,及如何管理事務的?

        SessionBean:Stateless Session Bean 的生命周期是由容器決定的,當客戶機發出請求要建立一個Bean的實例時,EJB容器不一定要創建一個新的Bean的實例供客戶機調用,而是隨便找一個現有的實例提供給客戶機。當客戶機第一次調用一個Stateful Session Bean 時,容器必須立即在服務器中創建一個新的Bean實例,并關聯到客戶機上,以后此客戶機調用Stateful Session Bean 的方法時容器會把調用分派到與此客戶機相關聯的Bean實例。

        EntityBean:Entity Beans能存活相對較長的時間,并且狀態是持續的。只要數據庫中的數據存在,Entity beans就一直存活。而不是按照應用程序或者服務進程來說的。即使EJB容器崩潰了,Entity beans也是存活的。Entity Beans生命周期能夠被容器或者 Beans自己管理。

        EJB通過以下技術管理事務:對象管理組織(OMG)的對象事務服務(OTS),Sun Microsystems的Transaction Service(JTS)、Java Transaction API(JTA),開發組(X/Open)的XA接口。

        4.2  應用服務器有那些?

        BEA WebLogic Server,IBM WebSphere Application Server,Oracle9i Application Server,jBoss,Tomcat

        4.3  給我一個你最常見到的runtime exception.

        ArithmeticException, ArrayStoreException, BufferOverflowException, BufferUnderflowException, CannotRedoException, CannotUndoException, ClassCastException, CMMException, ConcurrentModificationException, DOMException, EmptyStackException, IllegalArgumentException, IllegalMonitorStateException, IllegalPathStateException, IllegalStateException, ImagingOpException, IndexOutOfBoundsException, MissingResourceException, NegativeArraySizeException, NoSuchElementException, NullPointerException, ProfileDataException, ProviderException, RasterFormatException, SecurityException, SystemException, UndeclaredThrowableException, UnmodifiableSetException, UnsupportedOperationException.

        4.4  接口是否可繼承接口? 抽象類是否可實現(implements)接口? 抽象類是否可繼承實體類(concrete class)?

        接口可以繼承接口。抽象類可以實現(implements)接口,抽象類是否可繼承實體類,但前提是實體類必須有明確的構造函數。

        4.5  List, Set, Map是否繼承自Collection接口?

        List,Set是,Map不是

        4.6  說出數據連接池的工作機制是什么?

        J2EE服務器啟動時會建立一定數量的池連接,并一直維持不少于此數目的池連接。客戶端程序需要連接時,池驅動程序會返回一個未使用的池連接并將其表記為忙。如果當前沒有空閑連接,池驅動程序就新建一定數量的連接,新建連接的數量有配置參數決定。當使用的池連接調用完成后,池驅動程序將此連接表記為空閑,其他調用就可以使用這個連接。

        4.7  abstract的method是否可同時是static,是否可同時是native,是否可同時是synchronized?

        都不能

        4.8  數組有沒有length()這個方法? String有沒有length()這個方法?

        數組沒有length()這個方法,有length的屬性。String有有length()這個方法。

        4.9  Set里的元素是不能重復的,那么用什么方法來區分重復與否呢? 是用==還是equals()? 它們有何區別?

        Set里的元素是不能重復的,那么用iterator()方法來區分重復與否。equals()是判讀兩個Set是否相等。

        equals()和==方法決定引用值是否指向同一對象equals()在類中被覆蓋,為的是當兩個分離的對象的內容和類型相配的話,返回真值。

        4.10  構造器Constructor是否可被override?

        構造器Constructor不能被繼承,因此不能重寫Overriding,但可以被重載Overloading.

    posted @ 2010-03-25 21:39 drecry 閱讀(197) | 評論 (0)編輯 收藏

    java 面試題三(轉)

    3.1  Static Nested Class 和 Inner Class的不同。

        Static Nested Class是被聲明為靜態(static)的內部類,它可以不依賴于外部類實例被實例化。而通常的內部類需要在外部類實例化后才能實例化。

        3.2  JSP中動態INCLUDE與靜態INCLUDE的區別?

        動態INCLUDE用jsp:include動作實現 <jsp:include page="included.jsp" flush="true" />它總是會檢查所含文件中的變化,適合用于包含動態頁面,并且可以帶參數。

        靜態INCLUDE用include偽碼實現,定不會檢查所含文件的變化,適用于包含靜態頁面<%@ include file="included.htm" %>

        3.3  什么時候用assert.

        assertion(斷言)在軟件開發中是一種常用的調試方式,很多開發語言中都支持這種機制。在實現中,assertion就是在程序中的一條語句,它對一個boolean表達式進行檢查,一個正確程序必須保證這個boolean表達式的值為true;如果該值為false,說明程序已經處于不正確的狀態下,系統將給出警告或退出。一般來說,assertion用于保證程序最基本、關鍵的正確性。assertion檢查通常在開發和測試時開啟。為了提高性能,在軟件發布后,assertion檢查通常是關閉的。

        3.4  GC是什么? 為什么要有GC?

        GC是垃圾收集的意思(Gabage Collection),內存處理是編程人員容易出現問題的地方,忘記或者錯誤的內存回收會導致程序或系統的不穩定甚至崩潰,Java提供的GC功能可以自動監測對象是否超過作用域從而達到自動回收內存的目的,Java語言沒有提供釋放已分配內存的顯示操作方法。

        3.5  short s1 = 1; s1 = s1 + 1;有什么錯? short s1 = 1; s1 += 1;有什么錯?

        short s1 = 1; s1 = s1 + 1; (s1+1運算結果是int型,需要強制轉換類型)

        short s1 = 1; s1 += 1;(可以正確編譯)

        3.6  Math.round(11.5)等於多少? Math.round(-11.5)等於多少?

        Math.round(11.5)==12

        Math.round(-11.5)==-11

        round方法返回與參數最接近的長整數,參數加1/2后求其floor.

        3.7  String s = new String("xyz");創建了幾個String Object?

        兩個

        3.8  設計4個線程,其中兩個線程每次對j增加1,另外兩個線程對j每次減少1.寫出程序。

        以下程序使用內部類實現線程,對j增減的時候沒有考慮順序問題。

    package test;

    public class ThreadTest1 {

             private int j;

             public static void main(String args[]) {

                       ThreadTest1 tt = new ThreadTest1();

                       Inc inc = tt.new Inc();

                       Dec dec = tt.new Dec();

                       for (int i = 0; i < 2; i++) {

                                Thread t = new Thread(inc);

                                t.start();

                                t = new Thread(dec);

                                t.start();

                       }

             }

             private synchronized void inc() {

                       j++;

                       System.out.println(Thread.currentThread().getName() + "-inc:" + j);

             }

             private synchronized void dec() {

                       j--;

                       System.out.println(Thread.currentThread().getName() + "-dec:" + j);

             }

             class Inc implements Runnable {

                       public void run() {

                                for (int i = 0; i < 3; i++) {

                                         inc();

                                }

                       }

             }

             class Dec implements Runnable {

                       public void run() {

                                for (int i = 0; i < 3; i++) {

                                         dec();

                                }

                       }

             }

    }

        3.9  Java有沒有goto?

        Java中的保留字,現在沒有在Java中使用。

        3.10  啟動一個線程是用run()還是start()?

        啟動一個線程是調用start()方法,使線程所代表的虛擬處理機處于可運行狀態,這意味著它可以由JVM調度并執行。這并不意味著線程就會立即運行。run()方法可以產生必須退出的標志來停止一個線程。

    posted @ 2010-03-25 21:38 drecry 閱讀(177) | 評論 (0)編輯 收藏

    java 面試題二(轉)

      2.1  HashMap和Hashtable的區別。

        HashMap是Hashtable的輕量級實現(非線程安全的實現),他們都完成了Map接口,主要區別在于HashMap允許空(null)鍵值(key),由于非線程安全,效率上可能高于Hashtable.

        HashMap允許將null作為一個entry的key或者value,而Hashtable不允許。

        HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey.因為contains方法容易讓人引起誤解。

        Hashtable繼承自Dictionary類,而HashMap是Java1.2引進的Map interface的一個實現。

        最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多個線程訪問Hashtable時,不需要自己為它的方法實現同步,而HashMap 就必須為之提供外同步。Hashtable和HashMap采用的hash/rehash算法都大概一樣,所以性能不會有很大的差異。

        2.2  final, finally, finalize的區別。

        final 用于聲明屬性,方法和類,分別表示屬性不可變,方法不可覆蓋,類不可繼承。

        finally是異常處理語句結構的一部分,表示總是執行。

        finalize是Object類的一個方法,在垃圾收集器執行的時候會調用被回收對象的此方法,可以覆蓋此方法提供垃圾收集時的其他資源回收,例如關閉文件等。

        2.3  sleep() 和 wait() 有什么區別?

        sleep是線程類(Thread)的方法,導致此線程暫停執行指定時間,給執行機會給其他線程,但是監控狀態依然保持,到時后會自動恢復。調用sleep不會釋放對象鎖。

        wait是Object類的方法,對此對象調用wait方法導致本線程放棄對象鎖,進入等待此對象的等待鎖定池,只有針對此對象發出notify方法(或notifyAll)后本線程才進入對象鎖定池準備獲得對象鎖進入運行狀態。

        2.4  Overload和Override的區別。Overloaded的方法是否可以改變返回值的類型?

        方法的重寫Overriding和重載Overloading是Java多態性的不同表現。重寫Overriding是父類與子類之間多態性的一種表現,重載Overloading是一個類中多態性的一種表現。如果在子類中定義某方法與其父類有相同的名稱和參數,我們說該方法被重寫 (Overriding)。子類的對象使用這個方法時,將調用子類中的定義,對它而言,父類中的定義如同被"屏蔽"了。如果在一個類中定義了多個同名的方法,它們或有不同的參數個數或有不同的參數類型,則稱為方法的重載(Overloading)。Overloaded的方法是可以改變返回值的類型。

        2.5  error和exception有什么區別?

        error 表示恢復不是不可能但很困難的情況下的一種嚴重問題。比如說內存溢出。不可能指望程序能處理這樣的情況。

        exception 表示一種設計或實現問題。也就是說,它表示如果程序運行正常,從不會發生的情況。

        2.6  同步和異步有何異同,在什么情況下分別使用他們?舉例說明。

        如果數據將在線程間共享。例如正在寫的數據以后可能被另一個線程讀到,或者正在讀的數據可能已經被另一個線程寫過了,那么這些數據就是共享數據,必須進行同步存取。

        當應用程序在對象上調用了一個需要花費很長時間來執行的方法,并且不希望讓程序等待方法的返回時,就應該使用異步編程,在很多情況下采用異步途徑往往更有效率。

        2.7  abstract class和interface有什么區別?

        聲明方法的存在而不去實現它的類被叫做抽象類(abstract class),它用于要創建一個體現某些基本行為的類,并為該類聲明方法,但不能在該類中實現該類的情況。不能創建abstract 類的實例。然而可以創建一個變量,其類型是一個抽象類,并讓它指向具體子類的一個實例。不能有抽象構造函數或抽象靜態方法。Abstract 類的子類為它們父類中的所有抽象方法提供實現,否則它們也是抽象類為。取而代之,在子類中實現該方法。知道其行為的其它類可以在類中實現這些方法。

        接口(interface)是抽象類的變體。在接口中,所有方法都是抽象的。多繼承性可通過實現這樣的接口而獲得。接口中的所有方法都是抽象的,沒有一個有程序體。接口只可以定義static final成員變量。接口的實現與子類相似,除了該實現類不能從接口定義中繼承行為。當類實現特殊接口時,它定義(即將程序體給予)所有這種接口的方法。然后,它可以在實現了該接口的類的任何對象上調用接口的方法。由于有抽象類,它允許使用接口名作為引用變量的類型。通常的動態聯編將生效。引用可以轉換到接口類型或從接口類型轉換,instanceof 運算符可以用來決定某對象的類是否實現了接口。

        2.8  heap和stack有什么區別。

        棧是一種線形集合,其添加和刪除元素的操作應在同一段完成。棧按照后進先出的方式進行處理。

        堆是棧的一個組成元素。

        2.9  forward 和redirect的區別

        forward是服務器請求資源,服務器直接訪問目標地址的URL,把那個URL的響應內容讀取過來,然后把這些內容再發給瀏覽器,瀏覽器根本不知道服務器發送的內容是從哪兒來的,所以它的地址欄中還是原來的地址。

        redirect就是服務端根據邏輯,發送一個狀態碼,告訴瀏覽器重新去請求那個地址,一般來說瀏覽器會用剛才請求的所有參數重新請求,所以session,request參數都可以獲取。

        2.10  EJB與Java Bean的區別?

        Java Bean 是可復用的組件,對Java Bean并沒有嚴格的規范,理論上講,任何一個Java類都可以是一個Bean.但通常情況下,由于Java Bean是被容器所創建(如Tomcat)的,所以Java Bean應具有一個無參的構造器,另外,通常Java Bean還要實現Serializable接口用于實現Bean的持久性。Java Bean實際上相當于微軟COM模型中的本地進程內COM組件,它是不能被跨進程訪問的。Enterprise Java Bean 相當于DCOM,即分布式組件。它是基于Java的遠程方法調用(RMI)技術的,所以EJB可以被遠程訪問(跨進程、跨計算機)。但EJB必須被布署在諸如Webspere、WebLogic這樣的容器中,EJB客戶從不直接訪問真正的EJB組件,而是通過其容器訪問。EJB容器是EJB組件的代理,EJB組件由容器所創建和管理。客戶通過容器來訪問真正的EJB組件。

    posted @ 2010-03-25 21:37 drecry 閱讀(199) | 評論 (0)編輯 收藏

    java 面試題一(轉)

     一、面向對象的特征有哪些方面

        1.抽象:

        抽象就是忽略一個主題中與當前目標無關的那些方面,以便更充分地注意與當前目標有關的方面。抽象并不打算了解全部問題,而只是選擇其中的一部分,暫時不用部分細節。抽象包括兩個方面,一是過程抽象,二是數據抽象。

        2.繼承:

        繼承是一種聯結類的層次模型,并且允許和鼓勵類的重用,它提供了一種明確表述共性的方法。對象的一個新類可以從現有的類中派生,這個過程稱為類繼承。新類繼承了原始類的特性,新類稱為原始類的派生類(子類),而原始類稱為新類的基類(父類)。派生類可以從它的基類那里繼承方法和實例變量,并且類可以修改或增加新的方法使之更適合特殊的需要。

        3.封裝:

        封裝是把過程和數據包圍起來,對數據的訪問只能通過已定義的界面。面向對象計算始于這個基本概念,即現實世界可以被描繪成一系列完全自治、封裝的對象,這些對象通過一個受保護的接口訪問其他對象。

        4.多態性:

        多態性是指允許不同類的對象對同一消息作出響應。多態性包括參數化多態性和包含多態性。多態性語言具有靈活、抽象、行為共享、代碼共享的優勢,很好的解決了應用程序函數同名問題。

        二、String是最基本的數據類型嗎?

        基本數據類型包括byte、int、char、long、float、double、boolean和short.  java.lang.String類是final類型的,因此不可以繼承這個類、不能修改這個類。為了提高效率節省空間,我們應該用StringBuffer類。

        三、int 和 Integer 有什么區別?

        Java 提供兩種不同的類型:引用類型和原始類型(或內置類型)。int是Java的原始數據類型,Integer是Java為int提供的封裝類。Java為每個原始類型提供了封裝類。

        原始類型封裝類

        boolean Boolean

        char Character

        byte Byte

        short Short

        int Integer

        long Long

        float Float

        double Double

        引用類型和原始類型的行為完全不同,并且它們具有不同的語義。引用類型和原始類型具有不同的特征和用法,它們包括:大小和速度問題,這種類型以哪種類型的數據結構存儲,當引用類型和原始類型用作某個類的實例數據時所指定的缺省值。對象引用實例變量的缺省值為 null,而原始類型實例變量的缺省值與它們的類型有關。

        四、String 和StringBuffer的區別?

        Java平臺提供了兩個類:String和StringBuffer,它們可以儲存和操作字符串,即包含多個字符的字符數據。這個String類提供了數值不可改變的字符串。而這個StringBuffer類提供的字符串進行修改。當你知道字符數據要改變的時候你就可以使用StringBuffer.典型地,你可以使用StringBuffer來動態構造字符數據。

        五、運行時異常與一般異常有何異同?

        異常表示程序運行過程中可能出現的非正常狀態,運行時異常表示虛擬機的通常操作中可能遇到的異常,是一種常見運行錯誤。Java編譯器要求方法必須聲明拋出可能發生的非運行時異常,但是并不要求必須聲明拋出未被捕獲的運行時異常。

         六、說出Servlet的生命周期,并說出Servlet和CGI的區別。

        Servlet被服務器實例化后,容器運行其init方法,請求到達時運行其service方法,service方法自動派遣運行與請求對應的doXXX方法(doGet,doPost)等,當服務器決定將實例銷毀的時候調用其destroy方法。

        與CGI的區別在于Servlet處于服務器進程中,它通過多線程方式運行其service方法,一個實例可以服務于多個請求,并且其實例一般不會銷毀,而CGI對每個請求都產生新的進程,服務完成后就銷毀,所以效率上低于CGI.

        七、說出ArrayList,Vector, LinkedList的存儲性能和特性

        ArrayList和Vector都是使用數組方式存儲數據,此數組元素數大于實際存儲的數據以便增加和插入元素,它們都允許直接按序號索引元素,但是插入元素要涉及數組元素移動等內存操作,所以索引數據快而插入數據慢,Vector由于使用了synchronized方法(線程安全),通常性能上較ArrayList差,而LinkedList使用雙向鏈表實現存儲,按序號索引數據需要進行前向或后向遍歷,但是插入數據時只需要記錄本項的前后項即可,所以插入速度較快。

        八、EJB是基于哪些技術實現的?并說出SessionBean和EntityBean的區別,StatefulBean和StatelessBean的區別。

        EJB包括Session Bean、Entity Bean、Message Driven Bean,基于JNDI、RMI、JAT等技術實現。

        SessionBean在J2EE應用程序中被用來完成一些服務器端的業務操作,例如訪問數據庫、調用其他EJB組件。EntityBean被用來代表應用系統中用到的數據。

        對于客戶機,SessionBean是一種非持久性對象,它實現某些在服務器上運行的業務邏輯。

        對于客戶機,EntityBean是一種持久性對象,它代表一個存儲在持久性存儲器中的實體的對象視圖,或是一個由現有企業應用程序實現的實體。

        Session Bean 還可以再細分為 Stateful Session Bean 與 Stateless Session Bean ,這兩種的 Session Bean都可以將系統邏輯放在 method之中執行,不同的是 Stateful Session Bean 可以記錄呼叫者的狀態,因此通常來說,一個使用者會有一個相對應的 Stateful Session Bean 的實體。Stateless Session Bean 雖然也是邏輯組件,但是他卻不負責記錄使用者狀態,也就是說當使用者呼叫 Stateless Session Bean 的時候,EJB Container 并不會找尋特定的 Stateless Session Bean 的實體來執行這個 method.換言之,很可能數個使用者在執行某個 Stateless Session Bean 的 methods 時,會是同一個 Bean 的 Instance 在執行。從內存方面來看, Stateful Session Bean 與 Stateless Session Bean 比較, Stateful Session Bean 會消耗 J2EE Server 較多的內存,然而 Stateful Session Bean 的優勢卻在于他可以維持使用者的狀態。

        九、Collection 和 Collections的區別。

        Collection是集合類的上級接口,繼承與他的接口主要有Set 和List.

        Collections是針對集合類的一個幫助類,他提供一系列靜態方法實現對各種集合的搜索、排序、線程安全化等操作。

        十、&和&&的區別。

        &是位運算符,表示按位與運算,&&是邏輯運算符,表示邏輯與(and)。

    posted @ 2010-03-25 21:35 drecry 閱讀(189) | 評論 (0)編輯 收藏

    JVM,JRE,JDK到底是個什么樣的關系(轉)

    JVM JRE JDK,這些東西到底是什么?

      我們在安裝好JDK后就可以想象成我們已經買了一臺安裝好軟件的新的電腦。

      JVM : Java Virtual Machine(Java虛擬機) 。所謂“虛擬機”顧名思義就是模擬出來的東西。就像是我們在用電腦看電視,但是電腦里并沒有像電視機里面一樣的硬件支持,但是我們仍然可以從電腦里接受電視臺的節目。那是因為我們編寫了一個可以模擬電視機硬件工作的軟件運行在電腦的平臺上面的原因。同樣JVM就是模擬了電腦的硬件,它同樣有著像CPU一樣可以執行代碼的功能。它的實現具體有:指令集 寄存器組 類文件格式 棧 垃圾收集堆 內存區。可以把它理解成是專門用來執行Java程序的一臺機器。也就是說JVM提供了Java執行的硬件平臺。JVM上執行的代碼都存放在 .CLASS 文件中。JVM只執行字節碼文件。

      JRE : Java Runtime Environment(Java運行環境)。就是可以運行Java程序的地方。就像是我們要在電腦上運行一個視頻軟件的時候必須在Windos或者是Linux等操作系統上一樣。那我們就可以把它看做是一個操作系統。也就是說JRE提供了Java執行的軟件平臺。在運行Java的過程中除了需要有JVM執行Java代碼這個動作外,還需要Java API(Application Programming Interface,應用編程接口)說簡單的就是“類庫”。Java程序在運行中沒有這些API是不行的,所以JRE包含JVM。

      JDK : Java Development ToolKit(Java開發工具包)。我們有了硬件和軟件兩個平臺后就可以做我們自己想做的事情了。JDK就是我們用來做事情的工具,它包括JRE還有其他工具。我們所說版本的不同,也就是說它里面的工具有差異。就像是你不同的工具箱里放著不同的工具一樣。舉個例子:最常用的一個就是javac,它是把.java的文件翻譯成.class文件的工具。然后讓JVM來執行.class文件中的字節碼。(就像電腦的CPU只認識0或1的道理)

      如果一臺計算機的需求只是運行Java程序,而不是去編寫Java程序的時候,它只需要安裝JRE就可以了。現在大家知道JVM JRE JDK,這些東西到底是什么了吧。

    posted @ 2010-03-25 21:13 drecry 閱讀(325) | 評論 (0)編輯 收藏

    2010年3月20日 #

    java 異常處理(轉)

        摘要:本文從Java異常最基本的概念、語法開始講述了Java異常處理的基本知識,分析了Java異常體系結構,對比Spring的異常處理框架,闡述了異常處理的基本原則。并且作者提出了自己處理一個大型應用系統異常的思想,并通過設計一個異常處理的框架來論述此思想。

         一、 異常的概念和Java異常體系結構

        異常是程序運行過程中出現的錯誤。本文主要講授的是Java語言的異常處理。Java語言的異常處理框架,是Java語言健壯性的一個重要體現。

        Java把異常當作對象來處理,并定義一個基類java.lang.Throwable作為所有異常的超類。在Java API中已經定義了許多異常類,這些異常類分為兩大類,錯誤Error和異常Exception。Java異常體系結構呈樹狀,其層次結構圖如圖 1所示:

     


     Thorwable類所有異常和錯誤的超類,有兩個子類Error和Exception,分別表示錯誤和異常。其中異常類Exception又分為運行時異常(RuntimeException)和非運行時異常,這兩種異常有很大的區別,也稱之為不檢查異常(Unchecked Exception)和檢查異常(Checked Exception)。下面將詳細講述這些異常之間的區別與聯系:

        1、Error與Exception

        Error是程序無法處理的錯誤,比如OutOfMemoryError、ThreadDeath等。這些異常發生時,Java虛擬機(JVM)一般會選擇線程終止。

        Exception是程序本身可以處理的異常,這種異常分兩大類運行時異常和非運行時異常。程序中應當盡可能去處理這些異常。

        2、運行時異常和非運行時異常

        運行時異常都是RuntimeException類及其子類異常,如NullPointerException、IndexOutOfBoundsException等,這些異常是不檢查異常,程序中可以選擇捕獲處理,也可以不處理。這些異常一般是由程序邏輯錯誤引起的,程序應該從邏輯角度盡可能避免這類異常的發生。

        非運行時異常是RuntimeException以外的異常,類型上都屬于Exception類及其子類。從程序語法角度講是必須進行處理的異常,如果不處理,程序就不能編譯通過。如IOException、SQLException等以及用戶自定義的Exception異常,一般情況下不自定義檢查異常。
     二、 異常的捕獲和處理

        Java異常的捕獲和處理是一個不容易把握的事情,如果處理不當,不但會讓程序代碼的可讀性大大降低,而且導致系統性能低下,甚至引發一些難以發現的錯誤。

        Java異常處理涉及到五個關鍵字,分別是:try、catch、finally、throw、throws。下面將驟一介紹,通過認識這五個關鍵字,掌握基本異常處理知識。

        1、 異常處理的基本語法
        在java中,異常處理的完整語法是:
       
     try{
          //(嘗試運行的)程序代碼
        }catch(異常類型 異常的變量名){
          //異常處理代碼
        }finally{
          //異常發生,方法返回之前,總是要執行的代碼
        }

        以上語法有三個代碼塊:
        try語句塊,表示要嘗試運行代碼,try語句塊中代碼受異常監控,其中代碼發生異常時,會拋出異常對象。

        catch語句塊會捕獲try代碼塊中發生的異常并在其代碼塊中做異常處理,catch語句帶一個Throwable類型的參數,表示可捕獲異常類型。當try中出現異常時,catch會捕獲到發生的異常,并和自己的異常類型匹配,若匹配,則執行catch塊中代碼,并將catch塊參數指向所拋的異常對象。catch語句可以有多個,用來匹配多個中的一個異常,一旦匹配上后,就不再嘗試匹配別的catch塊了。通過異常對象可以獲取異常發生時完整的JVM堆棧信息,以及異常信息和異常發生的原因等。

        finally語句塊是緊跟catch語句后的語句塊,這個語句塊總是會在方法返回前執行,而不管是否try語句塊是否發生異常。并且這個語句塊總是在方法返回前執行。目的是給程序一個補救的機會。這樣做也體現了Java語言的健壯性。

        2、 try、catch、finally三個語句塊應注意的問題
        第一、try、catch、finally三個語句塊均不能單獨使用,三者可以組成 try...catch...finally、try...catch、try...finally三種結構,catch語句可以有一個或多個,finally語句最多一個。
        第二、try、catch、finally三個代碼塊中變量的作用域為代碼塊內部,分別獨立而不能相互訪問。如果要在三個塊中都可以訪問,則需要將變量定義到這些塊的外面。
        第三、多個catch塊時候,只會匹配其中一個異常類并執行catch塊代碼,而不會再執行別的catch塊,并且匹配catch語句的順序是由上到下。

        3、throw、throws關鍵字
        throw關鍵字是用于方法體內部,用來拋出一個Throwable類型的異常。如果拋出了檢查異常,則還應該在方法頭部聲明方法可能拋出的異常類型。該方法的調用者也必須檢查處理拋出的異常。如果所有方法都層層上拋獲取的異常,最終JVM會進行處理,處理也很簡單,就是打印異常消息和堆棧信息。如果拋出的是Error或RuntimeException,則該方法的調用者可選擇處理該異常。有關異常的轉譯會在下面說明。

        throws關鍵字用于方法體外部的方法聲明部分,用來聲明方法可能會拋出某些異常。僅當拋出了檢查異常,該方法的調用者才必須處理或者重新拋出該異常。當方法的調用者無力處理該異常的時候,應該繼續拋出,而不是囫圇吞棗一般在catch塊中打印一下堆棧信息做個勉強處理。下面給出一個簡單例子,看看如何使用這兩個關鍵字:
           
     public static void test3() throws Exception{
          //拋出一個檢查異常
                throw new Exception("方法test3中的Exception");
            }

        3、 Throwable類中的常用方法
        getCause():返回拋出異常的原因。如果 cause 不存在或未知,則返回 null。
        getMessage():返回異常的消息信息。
        printStackTrace():對象的堆棧跟蹤輸出至錯誤輸出流,作為字段 System.err 的值。


     三、 異常處理的一般原則

        1、 能處理就早處理,拋出不去還不能處理的就想法消化掉或者轉換為RuntimeException處理。因為對于一個應用系統來說,拋出大量異常是有問題的,應該從程序開發角度盡可能的控制異常發生的可能。
        2、 對于檢查異常,如果不能行之有效的處理,還不如轉換為RuntimeException拋出。這樣也讓上層的代碼有選擇的余地――可處理也可不處理。
        3、 對于一個應用系統來說,應該有自己的一套異常處理框架,這樣當異常發生時,也能得到統一的處理風格,將優雅的異常信息反饋給用戶。

        四、 異常的轉譯與異常鏈

        1、異常轉譯的原理

        所謂的異常轉譯就是將一種異常轉換另一種新的異常,也許這種新的異常更能準確表達程序發生異常。

        在Java中有個概念就是異常原因,異常原因導致當前拋出異常的那個異常對象,幾乎所有帶異常原因的異常構造方法都使用Throwable類型做參數,這也就為異常的轉譯提供了直接的支持,因為任何形式的異常和錯誤都是Throwable的子類。比如將SQLException轉換為另外一個新的異常DAOException,可以這么寫:

        先自定義一個異常DAOException:

        
     public class DAOException extends RuntimeException {
         //(省略了部分代碼)
            public DAOException(String message, Throwable cause) {
                super(message, cause);
            }
        }
        比如有一個SQLException類型的異常對象e,要轉換為DAOException,可以這么寫:

        DAOException daoEx = new DAOException ( "SQL異常", e);

        異常轉譯是針對所有繼承Throwable超類的類而言的,從編程的語法角度講,其子類之間都可以相互轉換。但是,從合理性和系統設計角度考慮,可將異常分為三類:Error、Exception、RuntimeException,筆者認為,合理的轉譯關系圖應該如圖 2:

       

    2 異常轉譯

        為什么要這么做呢?筆者認為,異常的處理存在著一套哲學思想:對于一個應用系統來說,系統所發生的任何異常或者錯誤對操作用戶來說都是系統"運行時"異常,都是這個應用系統內部的異常。這也是異常轉譯和應用系統異常框架設計的指導原則。在系統中大量處理非檢查異常的負面影響很多,最重要的一個方面就是代碼可讀性降低,程序編寫復雜,異常處理的代碼也很蒼白無力。因此,很有必要將這些檢查異常Exception和錯誤Error轉換為RuntimeException異常,讓程序員根據情況來決定是否捕獲和處理所發生的異常。

        圖中的三條線標識轉換的方向,分三種情況:

        ①:Error到Exception:將錯誤轉換為異常,并繼續拋出。例如Spring WEB框架中,將org.springframework.web.servlet.DispatcherServlet的doDispatch()方法中,將捕獲的錯誤轉譯為一個NestedServletException異常。這樣做的目的是為了最大限度挽回因錯誤發生帶來的負面影響。因為一個Error常常是很嚴重的錯誤,可能會引起系統掛起。

        ②:Exception到RuntimeException:將檢查異常轉換為RuntimeException可以讓程序代碼變得更優雅,讓開發人員集中經理設計更合理的程序代碼,反過來也增加了系統發生異常的可能性。

        ③:Error到RuntimeException:目的還是一樣的。把所有的異常和錯誤轉譯為不檢查異常,這樣可以讓代碼更為簡潔,還有利于對錯誤和異常信息的統一處理。

        1、 異常鏈

        異常鏈顧名思義就是將異常發生的原因一個傳一個串起來,即把底層的異常信息傳給上層,這樣逐層拋出。Java API文檔中給出了一個簡單的模型:

       
     try {
         lowLevelOp();
        } catch (LowLevelException le) {
         throw (HighLevelException)
          new HighLevelException().initCause(le);
        }

        當程序捕獲到了一個底層異常le,在處理部分選擇了繼續拋出一個更高級別的新異常給此方法的調用者。這樣異常的原因就會逐層傳遞。這樣,位于高層的異常遞歸調用getCause()方法,就可以遍歷各層的異常原因。這就是Java異常鏈的原理。異常鏈的實際應用很少,發生異常時候逐層上拋不是個好注意,上層拿到這些異常又能奈之何?而且異常逐層上拋會消耗大量資源,因為要保存一個完整的異常鏈信息


      五、 設計一個高效合理的異常處理框架

        對于一個應用系統來說,發生所有異常在用戶看來都是應用系統內部的異常。因此應該設計一套應用系統的異常框架,以處理系統運行過程中的所有異常。

        基于這種觀點,可以設計一個應用系統的異常比如叫做AppException。并且對用戶來說,這些異常都是運行應用系統運行時發生的,因此AppException應該繼承RuntimeException,這樣系統中所有的其他異常都轉譯為AppException,當異常發生的時候,前端接收到AppExcetpion并做統一的處理。畫出異常處理框架如圖 3 :

       

    3 一個應用系統的異常處理框架

        在這個設計圖中,AppRuntimeException是系統異常的基類,對外只拋出這個異常,這個異常可以由前端(客戶端)接收處理,當異常發生時,客戶端的相關組件捕獲并處理這些異常,將"友好"的信息展示給客戶。

        在AppRuntimeException下層,有各種各樣的異常和錯誤,最終都轉譯為AppRuntimeException,AppRuntimeException下面還可以設計一些別的子類異常,比如AppDAOException、OtherException等,這些都根據實際需要靈活處理。在往下就是如何將捕獲的原始異常比如SQLException、HibernateException轉換為更高級一點AppDAOException。

        有關異常框架設計這方面公認比較好的就是Spring,Spring中的所有異常都可以用org.springframework.core.NestedRuntimeException來表示,并且該基類繼承的是RuntimeException。Spring框架很龐大,因此設計了很多NestedRuntimeException的子類,還有異常轉換的工具,這些都是非常優秀的設計思想。

        六、 Java異常處理總結

        回顧全文,總結一下Java異常處理的要點:

        1、 異常是程序運行過程過程出現的錯誤,在Java中用類來描述,用對象來表示具體的異常。Java將其區分為Error與Exception,Error是程序無力處理的錯誤,Exception是程序可以處理的錯誤。異常處理是為了程序的健壯性。
        2、 Java異常類來自于Java API定義和用戶擴展。通過繼承Java API異常類可以實現異常的轉譯。
        3、 異常能處理就處理,不能處理就拋出,最終沒有處理的異常JVM會進行處理。
        4、 異常可以傳播,也可以相互轉譯,但應該根據需要選擇合理的異常轉譯的方向。
        5、 對于一個應用系統,設計一套良好的異常處理體系很重要。這一點在系統設計的時候就應該考慮到。

    posted @ 2010-03-20 16:12 drecry 閱讀(213) | 評論 (0)編輯 收藏

    2009年6月1日 #

    (轉)java 學習,,從入門到精通

    轉自:http://forum.hibernate.org.cn
    作者:robbin
    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/home/ (英文)
    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 @ 2009-06-01 19:10 drecry 閱讀(246) | 評論 (0)編輯 收藏

    僅列出標題  下一頁
    主站蜘蛛池模板: 免费观看激色视频网站(性色)| 一日本道a高清免费播放| 99热这里有免费国产精品| 国产亚洲精品福利在线无卡一| 一级特黄录像视频免费| 免费a级毛片无码av| 日韩免费高清一级毛片| 亚洲日韩中文字幕日韩在线| 一级毛片免费在线| 久久99亚洲综合精品首页| a毛片全部免费播放| 久久精品国产亚洲AV麻豆不卡| 久久国产精品成人免费| 亚洲视频在线免费观看| 30岁的女人韩剧免费观看| 亚洲乱码一二三四区国产| 成人毛片18女人毛片免费96| 人人狠狠综合久久亚洲| 久久夜色精品国产亚洲av| 免费91麻豆精品国产自产在线观看| 亚洲产国偷V产偷V自拍色戒 | 青青草国产免费久久久91| 无码一区二区三区亚洲人妻| 久久精品国产精品亚洲人人| 久久国产乱子伦精品免费不卡 | 亚洲乱色熟女一区二区三区丝袜| 曰批全过程免费视频在线观看无码 | 最近免费字幕中文大全| 亚洲精品美女在线观看播放| 毛片a级毛片免费观看免下载| 无码的免费不卡毛片视频| 久久久久久久久亚洲| 精品久久久久久久免费加勒比| 一级午夜免费视频| 亚洲视频在线观看视频| 国产精品免费视频一区| 国产白丝无码免费视频| 亚洲精品久久久久无码AV片软件| 亚洲中文字幕无码爆乳av中文| 亚洲成人免费电影| 四虎精品成人免费视频|