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

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

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

    如何學好java

    如何學好java,其實很簡單,只要用心體會,慢慢積累!
    posts - 106, comments - 7, trackbacks - 0, articles - 3
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    二叉樹


    posted @ 2011-04-29 12:04 哈希 閱讀(138) | 評論 (0)編輯 收藏

    一、oop唯一關心的是接口是什么,就像就像汽車銷售商不需要管他是怎么制造的,只要關心他能不能燃燒燃料開動起來,只要知道(can or not)不要關心(how and      why):
    1、多態性:(java對象多態,java中不支持多重繼承)
         允許不同類的對象最統一消息做出響應。多態性包括參數化多態和包含性多態性,多態性語言具有靈活抽象,行為共享的優勢,很好解決了應用函數同名問題.
    2、封裝:(隱藏細節)
         就是把把數據和行為結合在一起,并對對象使用者隱藏隱藏數據的實現過程,一個對象中的數據稱為它的實例字段(instance);
    3、繼承:(擴展一個類)
        允許在已經存在的類上構建新的類,當你繼承一個已經存在的類時候那么你就 復用了這個類的方法和字段,同時你可以在新類中添加心得方法和字段;
    ?4、class(oop最重要的思想,類中構建一個對象,即創建這個類的一個實例)
        為編寫可動態操縱java代碼的程序提供了強大的功能反射,這項功能為javaBeans特別所有,能夠分析類能力的程序角反射器,java中提供的功能包叫java.lang.reflect反射機制十分強大。
    5、接口:(不是一個類,對符合接口要求的類的一套規范)
        實現接口兩個步驟:1、聲明類需要實現的指定接口;
                          2、提供接口中所有接口的定義;
        接口是一個收集方法和常數的契約,當類執行一個接口,他就許諾在那個接口中聲明的所有方法。接口是一個設備或者一個系統,它是用于交互的無關實體。根據這個定義,遠程控制是一個你和電視的接口,而英語是兩個人之間的接口。在java語言中接口是一種設備,它是用來與其他對象交互的設備。一個接口可能對一個協議是類似的,實際上其他語言也有接口,但是它們調用它的接口協議。
    6、動態綁定調用對象方法的機制
        (1)編譯器檢查對象聲明的類型和方法名;(2)編譯器檢查方法調用的參數類型;(3)靜態綁定:若方法類型為private static final編譯器會準確知道調用哪個方法;(4)程序需要調動一個方法時,那么虛擬機必須調用參數所指向的對象的實際類型相匹配的方法。
    7、構造器(特殊的方法,構造對象并將其初始化)
       構造器可以有0個,一個或多個,構造器和類有相同的名字,一個類可以右多個構造器,構造器沒有返回值,構造器總是和new字符一起運行的。
    8、final類(系統級的類,不可擴展)
       防止派生新類
    9、equal(判斷兩個對象是否相等)
    10、toString()返回一個代表該對象的字符串,幾乎每一個類都會重載該方法,返回當前狀態的正確表示;
    11、通用編程:
          任何類型的所有值都可以都可以用Object類型的變量來代替;
    12、內部類:(定義在一個類的內部的類)
           1、一個內部類的對象能夠訪問創建它的對象的實現,包括私有數據;
           2、對于同一個包中的類,呢不累可以隱藏起來;
           3、匿名內部類可以很方便的進行回調;
           4、使用內部類可以很方便的編寫事件驅動程序;
    13、代理類:(proxy)
         A、指定接口要求所有代碼;
         B、Object類定義的所有方法(equals,toString());

      


    posted @ 2011-04-29 11:32 哈希 閱讀(305) | 評論 (0)編輯 收藏

    Java基礎面試題系列一

    dev.firnow.com    時間 : 2008-02-19  作者:佚名   編輯:本站 點擊:  1796 [ 評論 ]

    1、作用域public,private,protected,以及不寫時的區別
    答:區別如下:
    作用域    當前類       同一package    子孫類       其他package
    public     √          √             √             √
    protected  √          √             √             ×
    friendly   √          √             ×             ×
    private    √          ×             ×             ×
    不寫時默認為friendly


    2Anonymous Inner Class (匿名內部類) 是否可以extends(繼承)其它類,是否可以implements(實現)interface(接口)
    答:匿名的內部類是沒有名字的內部類。不能extends(繼承) 其它類,但一個內部類可以作為一個接口,由另一個內部類實現



    3Static Nested Class Inner Class的不同
    答:Nested Class (一般是C++的說法),Inner Class (一般是JAVA的說法)。Java內部類與C++嵌套類最大的不同就在于是否有指向外部的引用上。注: 靜態內部類(Inner Class)意味著1創建一個static內部類的對象,不需要一個外部類對象,2不能從一個static內部類的一個對象訪問一個外部類對象


    4&&&的區別
    答:&是位運算符,表示按位與運算,&&是邏輯運算符,表示邏輯與(and)


    5Collection Collections的區別
    答:Collection是集合類的上級接口,繼承與他的接口主要有Set 和List.
    Collections是針對集合類的一個幫助類,他提供一系列靜態方法實現對各種集合的搜索、排序、線程安全化等操作


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



    7String s = new String("xyz");創建了幾個String Object
    答:兩個,一個字符對象,一個字符對象引用對象



    8Math.round(11.5)等於多少? Math.round(-11.5)等於多少
    :  Math.round(11.5)==12;Math.round(-11.5)==-11;round方法返回與參數最接近的長整數,參數加1/2后求其floor


    9short s1 = 1; s1 = s1 + 1;有什么錯? short s1 = 1; s1 += 1;有什么錯
    答:short s1 = 1; s1 = s1 + 1; (s1+1運算結果是int型,需要強制轉換類型)short s1 = 1; s1 += 1;(可以正確編譯)


    10Java有沒有goto
    答:java中的保留字,現在沒有在java中使用



    11、數組有沒有length()這個方法? String有沒有length()這個方法
    答:數組沒有length()這個方法,有length的屬性。String有有length()這個方法


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


    13Set里的元素是不能重復的,那么用什么方法來區分重復與否呢? 是用==還是equals()? 它們有何區別
    答:Set里的元素是不能重復的,那么用iterator()方法來區分重復與否。equals()是判讀兩個Set是否相等
        equals()和==方法決定引用值是否指向同一對象equals()在類中被覆蓋,為的是當兩個分離的對象的內容和類型相配的話,返回真值



    14、給我一個你最常見到的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



    15errorexception有什么區別
    答:error 表示恢復不是不可能但很困難的情況下的一種嚴重問題。比如說內存溢出。不可能指望程序能處理這樣的情況
        exception 表示一種設計或實現問題。也就是說,它表示如果程序運行正常,從不會發生的情況



    16List, Set, Map是否繼承自Collection接口
    答: List,Set是,Map不是


    17abstract classinterface有什么區別
    答:聲 明方法的存在而不去實現它的類被叫做抽象類(abstract class),它用于要創建一個體現某些基本行為的類,并為該類聲明方法,但不能在該類中 實現該類的情況。不能創建abstract 類的實例。然而可以創建一個變量,其類型是一個抽象類,并讓它指向具體子類的一個實例。不能有抽象構造函數或 抽象靜態方法。Abstract 類的子類為它們父類中的所有抽象方法提供實現,否則它們也是抽象類為。取而代之,在子類中實現該方法。知道其行為的其它 類可以在類中實現這些方法
    接口(interface)是抽象類的變體。在接口中,所有方法都是抽象的。多繼承性可通過實現這樣的接口而獲得。接口 中的所有方法都是抽象的,沒有一個有程序體。接口只可以定義static final成員變量。接口的實現與子類相似,除了該實現類不能從接口定義中繼承 行為。當類實現特殊接口時,它定義(即將程序體給予)所有這種接口的方法。然后,它可以在實現了該接口的類的任何對象上調用接口的方法。由于有抽象類,它 允許使用接口名作為引用變量的類型。通常的動態聯編將生效。引用可以轉換到接口類型或從接口類型轉換,instanceof 運算符可以用來決定某對象的 類是否實現了接口



    18abstractmethod是否可同時是static,是否可同時是native,是否可同時是synchronized
    都不能

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


    20、構造器Constructor是否可被override
    答:構造器Constructor不能被繼承,因此不能重寫Overriding,但可以被重載Overloading


    21、是否可以繼承String
    答:String類是final類故不可以繼承


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


    23、用最有效率的方法算出2乘以8等於幾
    答:2 << 3


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


    25、當一個對象被當作參數傳遞到一個方法后,此方法可改變這個對象的屬性,并可返回變化后的結果,那么這里到底是值傳遞還是引用傳遞
    答:是值傳遞。Java 編程語言只有值傳遞參數。當一個對象實例作為一個參數被傳遞到方法中時,參數的值就是對該對象的引用。對象的內容可以在被調用的方法中改變,但對象的引用是永遠不會改變的


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


    27ArrayListVector的區別,HashMapHashtable的區別
    答:就ArrayList與Vector主要從二方面來說.
    一.同步性:Vector是線程安全的,也就是說是同步的,而ArrayList是線程序不安全的,不是同步的
    二.數據增長:當需要增長時,Vector默認增長為原來一培,而ArrayList卻是原來的一半
    就HashMap與HashTable主要從三方面來說。
    一.歷史原因:Hashtable是基于陳舊的Dictionary類的,HashMap是Java 1.2引進的Map接口的一個實現
    二.同步性:Hashtable是線程安全的,也就是說是同步的,而HashMap是線程序不安全的,不是同步的
    三.值:只有HashMap可以讓你將空值作為一個表的條目的key或value

    28char型變量中能不能存貯一個中文漢字?為什么?
    答:是能夠定義成為一個中文的,因為java中以unicode編碼,一個char占16個字節,所以放一個中文是沒問題的


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


    30floatfloat f=3.4是否正確?
    :不正確。精度不準確,應該用強制類型轉換,如下所示:float f=(float)3.4
     

    posted @ 2011-04-28 18:02 哈希 閱讀(171) | 評論 (0)編輯 收藏

    3.求子數組的最大和
    題目:
    輸入一個整形數組,數組里有正數也有負數。
    數組中連續的一個或多個整數組成一個子數組,每個子數組都有一個和。
    求所有子數組的和的最大值。要求時間復雜度為O(n)。

    例如輸入的數組為1, -2, 3, 10, -4, 7, 2, -5,和最大的子數組為3, 10, -4, 7, 2,
    因此輸出為該子數組的和18。


    第10題
    翻轉句子中單詞的順序。
    題目:輸入一個英文句子,翻轉句子中單詞的順序,但單詞內字符的順序不變。

    句子中單詞以空格符隔開。為簡單起見,標點符號和普通字母一樣處理。
    例如輸入“I am a student.”,則輸出“student. a am I”。


    第14題:
    題目:輸入一個已經按升序排序過的數組和一個數字,
    在數組中查找兩個數,使得它們的和正好是輸入的那個數字。
    要求時間復雜度是O(n)。如果有多對數字的和等于輸入的數字,輸出任意一對即可。
    例如輸入數組1、2、4、7、11、15和數字15。由于4+11=15,因此輸出4和11。

     

    第17題:
    題目:在一個字符串中找到第一個只出現一次的字符。如輸入abaccdeff,則輸出b。 
    分析:這道題是2006年google的一道筆試題。

     

    第20題:
    題目:輸入一個表示整數的字符串,把該字符串轉換成整數并輸出。
    例如輸入字符串"345",則輸出整數345。

     

    第25題:
    寫一個函數,它的原形是int continumax(char *outputstr,char *intputstr)
    功能:
    在字符串中找出連續最長的數字串,并把這個串的長度返回,
    并把這個最長數字串付給其中一個函數參數outputstr所指內存。
    例如:"abcd12345ed125ss123456789"的首地址傳給intputstr后,函數將返回9,
    outputstr所指的值為123456789


    26.左旋轉字符串

    題目:
    定義字符串的左旋轉操作:把字符串前面的若干個字符移動到字符串的尾部。

    如把字符串abcdef左旋轉2位得到字符串cdefab。請實現字符串左旋轉的函數。
    要求時間對長度為n的字符串操作的復雜度為O(n),輔助內存為O(1)。


    37.
    有n個長為m+1的字符串,
    如果某個字符串的最后m個字符與某個字符串的前m個字符匹配,則兩個字符串可以聯接,
    問這n個字符串最多可以連成一個多長的字符串,如果出現循環,則返回錯誤。

     

    45.雅虎:
    1.對于一個整數矩陣,存在一種運算,對矩陣中任意元素加一時,需要其相鄰(上下左右)
    某一個元素也加一,現給出一正數矩陣,判斷其是否能夠由一個全零矩陣經過上述運算得到。

    2.一個整數數組,長度為n,將其分為m份,使各份的和相等,求m的最大值
      比如{3,2,4,3,6} 可以分成{3,2,4,3,6} m=1;
      {3,6}{2,4,3} m=2
      {3,3}{2,4}{6} m=3 所以m的最大值為3


    48.微軟:
    一個數組是由一個遞減數列左移若干位形成的,比如{4,3,2,1,6,5}
    是由{6,5,4,3,2,1}左移兩位形成的,在這種數組中查找某一個數。


    51.和為n連續正數序列。
    題目:輸入一個正數n,輸出所有和為n連續正數序列。

    例如輸入15,由于1+2+3+4+5=4+5+6=7+8=15,所以輸出3個連續序列1-5、4-6和7-8。
    分析:這是網易的一道面試題。


    53.字符串的排列。
    題目:輸入一個字符串,打印出該字符串中字符的所有排列。
    例如輸入字符串abc,則輸出由字符a、b、c所能排列出來的所有字符串
    abc、acb、bac、bca、cab和cba。

    分析:這是一道很好的考查對遞歸理解的編程題,
    因此在過去一年中頻繁出現在各大公司的面試、筆試題中。

     

    54.調整數組順序使奇數位于偶數前面。

    題目:輸入一個整數數組,調整數組中數字的順序,使得所有奇數位于數組的前半部分,
    所有偶數位于數組的后半部分。要求時間復雜度為O(n)。


    56.最長公共字串。
    題目:如果字符串一的所有字符按其在字符串中的順序出現在另外一個字符串二中,

    則字符串一稱之為字符串二的子串。

    注意,并不要求子串(字符串一)的字符必須連續出現在字符串二中。
    請編寫一個函數,輸入兩個字符串,求它們的最長公共子串,并打印出最長公共子串。

    例如:輸入兩個字符串BDCABA和ABCBDAB,字符串BCBA和BDAB都是是它們的最長公共子串,
    則輸出它們的長度4,并打印任意一個子串。

    分析:求最長公共子串(Longest Common Subsequence, LCS)是一道非常經典的動態規劃題,
    因此一些重視算法的公司像MicroStrategy都把它當作面試題。


    63.在字符串中刪除特定的字符。
    題目:輸入兩個字符串,從第一字符串中刪除第二個字符串中所有的字符。

    例如,輸入”They are students.”和”aeiou”,

    則刪除之后的第一個字符串變成”Thy r stdnts.”。

    分析:這是一道微軟面試題。在微軟的常見面試題中,與字符串相關的題目占了很大的一部分,
    因為寫程序操作字符串能很好的反映我們的編程基本功。

     

    69.旋轉數組中的最小元素。
    題目:把一個數組最開始的若干個元素搬到數組的末尾,我們稱之為數組的旋轉。輸入一個排好序的數組的一個旋轉,

    輸出旋轉數組的最小元素。例如數組{3, 4, 5, 1, 2}為{1, 2, 3, 4, 5}的一個旋轉,該數組的最小值為1。

        分析:這道題最直觀的解法并不難。從頭到尾遍歷數組一次,就能找出最小的元素,
    時間復雜度顯然是O(N)。但這個思路沒有利用輸入數組的特性,我們應該能找到更好的解法。

     

    73.對策字符串的最大長度。
    題目:輸入一個字符串,輸出該字符串中對稱的子字符串的最大長度。
    比如輸入字符串“google”,由于該字符串里最長的對稱子字符串是“goog”,因此輸出4。

    分析:可能很多人都寫過判斷一個字符串是不是對稱的函數,這個題目可以看成是該函數的加強版。

     

    85.又見字符串的問題
    1.給出一個函數來復制兩個字符串A和B。
    字符串A的后幾個字節和字符串B的前幾個字節重疊。
    分析:記住,這種題目往往就是考你對邊界的考慮情況。
    2.已知一個字符串,比如asderwsde,尋找其中的一個子字符串比如sde的個數,
    如果沒有返回0,有的話返回子字符串的個數。


    88.2005年11月金山筆試題。編碼完成下面的處理函數。
    函數將字符串中的字符'*'移到串的前部分,

    前面的非'*'字符后移,但不能改變非'*'字符的先后順序,函數返回串中字符'*'的數量。
    如原始串為:ab**cd**e*12,
    處理后為*****abcde12,函數并返回值為5。(要求使用盡量少的時間和輔助空間)

     

    93.在一個int數組里查找這樣的數,它大于等于左側所有數,小于等于右側所有數。
    直觀想法是用兩個數組a、b。a[i]、b[i]分別保存從前到i的最大的數和從后到i的最小的數,

    一個解答:這需要兩次遍歷,然后再遍歷一次原數組,
    將所有data[i]>=a[i-1]&&data[i]<=b[i]的data[i]找出即可。

    給出這個解答后,面試官有要求只能用一個輔助數組,且要求少遍歷一次。


    94.微軟筆試題
    求隨機數構成的數組中找到長度大于=3的最長的等差數列9 d- x' W) w9 ?" o3 b0 R
    輸出等差數列由小到大:
    如果沒有符合條件的就輸出
    格式:
    輸入[1,3,0,5,-1,6]
    輸出[-1,1,3,5]
    要求時間復雜度,空間復雜度盡量小


    96.08年中興校園招聘筆試題
    1.編寫strcpy 函數
    已知strcpy 函數的原型是
    char *strcpy(char *strDest, const char *strSrc);
    其中strDest 是目的字符串,strSrc 是源字符串。
    不調用C++/C 的字符串庫函數,請編寫函數 strcpy。

     

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

    1.關于本微軟等公司數據結構+算法面試100題系列V0.1版的鄭重聲明
    http://blog.csdn.net/v_JULY_v/archive/2010/12/02/6050133.aspx
    2.完整100題,請參見,
    [珍藏版]微軟等數據結構+算法面試100題全部出爐[100題首次完整亮相]
    http://blog.csdn.net/v_JULY_v/archive/2010/12/06/6057286.aspx
    3.更多詳情,請參見,本人博客:
    My Blog:
    http://blog.csdn.net/v_JULY_v
    4.所有的資源(題目+答案)下載地址:
    http://v_july_v.download.csdn.net/
    5.本微軟等100題系列V0.1版,永久維護(網友,思路回復)地址:
    http://topic.csdn.net/u/20101126/10/b4f12a00-6280-492f-b785-cb6835a63dc9.html

    posted @ 2011-04-28 17:56 哈希 閱讀(1319) | 評論 (0)編輯 收藏

    目: 編寫一個截取字符串的函數,輸入為一個字符串和字節數,輸出為按字節截取的字符串。   但是要保證漢字不被截半個,如“我ABC”4,應該截為“我AB”,輸入“我ABC漢DEF”,6,應該輸出為“我ABC”而不是“我ABC+漢的半個”。
    1. package com.sw.suanfa.first.ten;  
    2. /** 
    3.  * 編寫一個截取字符串的函數,輸入為一個字符串和字節數,輸出為按字節截取的字符串。   
    4.  *  但是要保證漢字不被截半個, 
    5.  *  如“我ABC”4,應該截為“我AB”, 
    6.  *  輸入“我ABC漢DEF”,6,應該輸出為“我ABC”而不是“我ABC+漢的半個”。  
    7.  * @author songwei 
    8.  * 
    9.  *我的處理方式:截取字符串的一個字符,加入StringBuffer中,并取其字節數,并入當前獲取字符的總長度中, 
    10.  *如果總長度大于等于輸入的長度,則返回StringBuffer的toString值。 
    11.  *getSubString方法傳入encoding值。UTF-8中文占3個字節,GBK占2個。結果有所不同,所以還是傳入較好。 
    12.  *沒有通過判斷charAt的值來判定是否為中文等特殊字符。 
    13.  *不知道我這種方式是否正確。【未經過詳細測試】 
    14.  */ 
       public class SubStringWithChina {  
              
      public static void main(String[] args) throws Exception{  
                    
                  String a 
      = "我ABC漢DEF" ;  
                  
      int len = 6 ;  
                  String encoding 
      = "UTF-8" ;  
                    
                  System.out.println( getSubString(a, len,encoding) );  
                  a 
      = "我ABC";  
                  len 
      = 4 ;  
                  encoding 
      = "gbk" ;  
                  System.out.println( getSubString(a, len,encoding) );  
              }  
                
              
      /** 
               *  
               * 
      @param str 傳入字符串 
               * 
      @param len 截取字節數 
               * 
      @param encoding 編碼方式 
               * 
      @return 返回截取后的字符串 
               * 
      @throws Exception 
               
      */  
              
      public static String getSubString(String str,int len,String encoding) throws Exception{  
                  
      if(str == null || str.length()<1return null ;  
                  
      if(len<1return null ;  
                  StringBuffer sb 
      = new StringBuffer();  
                  
      int all = 0 ;  
                  
      for(int i=0;i<str.length();i++){  
                      String tmp 
      = str.substring(i,i+1);  
                      sb.append(tmp);  
                      
      byte[] tmpB = tmp.getBytes(encoding);  
                      all 
      +=tmpB.length ;  
                      
      if(all>=len){  
                          
      break ;  
                      }  
                  }  
                  
      return sb.toString() ;  
              }  
          }
    15. 判斷字符串中是否含有漢字:

       String str = "test中文漢字";
      String regEx = "[\\u4e00-\\u9fa5]";

      /**
      * 判斷有沒有中文
      */
      if (str.getBytes().length == str.length()) {
       System.out.println("無漢字");
      } else {
       System.out.println("有漢字");
      }

      /**
      * 如果有則打印出來
      */
      Pattern p = Pattern.compile(regEx);
      Matcher m = p.matcher(str);
      while (m.find()) {
       System.out.print(m.group(0) + "");
      }

      如題

    posted @ 2011-04-28 16:31 哈希 閱讀(372) | 評論 (0)編輯 收藏

         摘要: 以前的收藏,估計很少有這么全的面試題集了 ^_^ 基礎知識: 1.C++或Java中的異常處理機制的簡單原理和應用。   當JAVA程序違反了JAVA的語義規則時,JAVA虛擬機就會將發生的錯誤表示為一個異常。違反語義規則包括2種情況。一種是JAVA類庫內 置的語義檢查。例如數組下標越界,會引發IndexOutOfBoundsException;訪問null的對象時會引發 ...  閱讀全文

    posted @ 2011-04-28 15:20 哈希 閱讀(86) | 評論 (0)編輯 收藏

    如下分成5個步驟
    1,建立xml文件
    2,建立bean的接口
    3,建立bean
    4,寫測試程序
    5,測試

    準備工作
    環境配置如下,需要spring.jar和common-logging.jar兩個jar文件

    開始
    1,建立xml文件
    文件名:beans.xml
    文件位置:src目錄下
    文件內容:
    <?xml version="1.0" encoding="UTF-8"?>

    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

      <!-- the application context definition for the springapp DispatcherServlet -->

      <bean id="sayhello" class="test.service.impl.HelloBean"/>
       
    </beans>

    2,建立bean的接口
    文件名:Hello.java
    文件內容:
    package test.service;

    public interface Hello {

        public void sayHello();

    }

    3,建立bean
    文件名:HelloBean.java
    文件內容:
    package test.service.impl;

    import test.service.Hello;

    public class HelloBean implements Hello {
       
        /* (non-Javadoc)
         * @see test.service.impl.Hello#sayHello()
         */
        public void sayHello() {
            System.out.println("這是一個測試程序");
        }

    }

    4,寫測試程序
    文件名:FirstSpring.java
    文件內容:
    package test.spring;

    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;

    import test.service.Hello;

    public class FirstSpring {
       
        public static void main(String[] args) {
            testHello();
        }
       
        public static void testHello() {
            ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
            Hello hello =(Hello) applicationContext.getBean("sayhello");
            hello.sayHello();
           
        }
    }

    5,測試
    運行FirstSpring.java文件,得到輸出結果如下:
    2009-6-30 3:33:58 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
    信息: Loading XML bean definitions from class path resource [beans.xml]
    2009-6-30 3:33:59 org.springframework.context.support.AbstractApplicationContext obtainFreshBeanFactory
    信 息: Bean factory for application context [org.springframework.context.support.ClassPathXmlApplicationContext@7259da]: org.springframework.beans.factory.support.DefaultListableBeanFactory@2e7820
    2009-6-30 3:33:59 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
    信 息: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@2e7820: defining beans [sayhello]; root of factory hierarchy
    這是一個測試程序

    上面紅字是spring輸出的調試信息,藍字是hellobean實際輸入的內容。

    簡單總結:
    1,環境配置中不要忘記了common-logging.jar文件,我最開始忘記了,還是用junit測試的,結果就是不通過。出錯的原因也不明白。后來直接改成普通的main方法測試,才明白原因。

    2,bean的接口和實現的分離在spring中被貫徹執行。同時理解一下IOC(控制反轉)的概念。
    3,spring中的bean,應該指的是執行各種業務的業務bean才是。不同于strut的formbean和對應db表對象的valuebean。

    posted @ 2011-04-28 12:19 哈希 閱讀(180) | 評論 (0)編輯 收藏


    MyEclipse 怎樣手動編譯整個項目

    作者 Neot 寫于 2008-12-31 | 3,737 次瀏覽

    MyEclipse 菜單 Project->Build Automatically 選中后,項目的文件會被自動編輯。要想手動編譯整個項目,可使用菜單 Project->Build All 或 Project->Build Project。還有個比較笨的方法,就是運行整個項目。運行項目時,MyEclipse 會先對項目進行編譯。

    但是有個問題,Build All、Build Project 菜單項常常是恢掉的,不可執行。其實,這是因為我們勾選了 Project->Build Automatically 項。取消掉 Project->Build Automatically 后,Build All 和 Build Project 菜單項就可以用了。

    [ 標簽: myeclipse, 編譯 ]
    [ 固定鏈接:http://blog.tanggaowei.com/2008/12/myeclipse-2.html ]

    為什么取消 MyEclipse 驗證后還是有許多紅叉叉

    作者 Neot 寫于 2008-12-31 | 2,610 次瀏覽

    在 MyEclipse 的 windows–>perferences–>myeclipse–>validation 下,把除了manual 下面的全部點掉,build下只留 classpath dependency Validator,這樣設置后,MyEclipse就不會老是驗證 xml、jsp、html 等文件了。參考如下文章:

    Eclipse+MyEclipse的優化

    但是,我設置好了,在 Package Explorer 窗口卻還是有許多的紅叉叉。翻來覆去弄了好幾次,情況都一樣。最后,終于發現,在 Package Explorer 窗口 對項目點擊右鍵,在出現的菜單中執行“MyEclipse->Remove All Validation Markers”,所有的紅叉叉就都不見了。

    [ 標簽: myeclipse, 優化, 驗證 ]
    [ 固定鏈接:http://blog.tanggaowei.com/2008/12/myeclipse.html ]

    Eclipse 中怎樣添加 Subversion 插件

    作者 Neot 寫于 2008-10-30 | 3,280 次瀏覽

    Eclipse 中可以從菜單添加插件:[菜單]Help / Software Updates / Find and Install。在出現的 Install 窗口,選擇“Search for new features to install”項,點擊“Next”進入下一頁。然后點擊右側的“New Remote Site”按鈕,在出現的窗口中,設置“Name”項為“Subversion”,“URL”項為“http://subclipse.tigris.org/update/”,點擊“OK”按鈕。再點擊“Finish”按鈕,Ecplise 就會開始自動下載 Subversion 插件,并安裝了。

    像 MyEclipse、Carbide 這些基于 Eclipse 的開發工具,同樣適用這個方法。

    [ 標簽: Carbide, eclipse, myeclipse, subversion ]
    [ 固定鏈接:http://blog.tanggaowei.com/2008/10/eclipse-subversion.html ]

    MyEclipse開發SSH(Struts+Spring+Hibernate)入門

    作者 Neot 寫于 2007-12-13 | 16,744 次瀏覽

    (本文參考自 oksonic 的“Struts+Spring+Hibernate練習(完整)”)

    源碼下載:http://ishare.iask.sina.com.cn/cgi-bin/fileid.cgi?fileid=2857703

    1. 準備

    工具:MyEclipse 6.0.1 GAmysql-connector-java-5.0.4-bin.jarMySql GUI Tools 5.0(便于管理MySql數據庫,不是必須)

    環境:Tomcat 5.5MySql 5.0

    1.1. 新建工程

    操作:[Menu] File/New/Web Project

    工程名:login

    2. Struts 部分


    2.1. 添加 Struts 功能支持

    操作:[Menu] MyEclipse/Project Capabilities/Add Struts Capabilities

    將 “yourcompany” 替換成 “login”。

    2.2. 創建 ActionForm 類

    操作:[Ctrl+N] MyEclipse/Web-Struts/Struts 1.2 Form

    類名:LoginForm

    在 “Use case” 里輸入 “Login” 后,Name、Form type 等會自動填充。

    在 “Form Properties” 選項卡為 loginForm 新增兩個屬性:username、password,”Type” 和 “JSP input type” 分別保持默認的 “java.lang.String” 和 “text”;

    在 “JSP” 選項卡鉤選 “Create JSP form” 選項,將新建路徑改為 “/login.jsp”(login.jsp文件將被自動創建)。

    2.3. 創建 Action 類

    操作:[Ctrl+N] MyEclipse/Web-Struts/Struts 1.2 Action

    類名:LoginAction

    在 “Form” 選項卡的 “Name” 項選擇 “loginForm”,”Input Source” 項輸入 “/login.jsp”。

    2.4. 創建 index.jsp 文件

    如果沒有,創建 index.jsp 文件,并添加一個指向 login.jsp 的鏈接:<a href = “login.jsp”>Login</a>

    2.5. 創建Forword類

    操作:[Ctrl+N] MyEclipse/Web-Struts/Struts 1.2 Forword

    類名:indexForword

    “Name” 項輸入 “indexForword” ,”Path” 項選擇 “/index.jsp” 。

    2.6. 修改 LoginAction.java 文件

    修改 LoginAction 類的 execute 方法:

    public class LoginAction extends Action {

    public ActionForward execute ( ActionMapping mapping, ActionForm form,
    HttpServletRequest request, HttpServletResponse response ) {
    LoginForm loginForm = ( LoginForm ) form;

    String username = loginForm.getUsername();
    String password = loginForm.getPassword();

    if ( username.equals ( “test” ) && password.equals ( “test” ) ) {
    return mapping.findForward ( “indexForword” );
    } else {
    return mapping.getInputForward();
    }
    }
    }

    2.7. 修改 login.jsp 文件

    修改 <html:form> 標簽:<html:form action=”/login”>

    2.8. 測試

    操作:[Menu] Run/Run,選擇 MyEclipse Server Application 方式運行

    要正常執行Run操作,需先安裝 Tomcat5.5 。

    點擊 index.jsp 頁面的 “Login” 鏈接,跳轉到 login.jsp 頁面。在 login.jsp 頁面輸入 “test/test”,應該會登錄成功,然后跳轉到 index.jsp 頁面;輸入 “test/123″ ,應該保持在 login.jsp 頁面。

    如果測試成功,證明 Structs 運行正常。

    如果運行出錯,請參考文章最后的“5. 問題集”。

    3. Spring 部分


    3.1. 添加 Spring 功能支持

    操作:[Menu] MyEclipse/Project Capabilities/Add Spring Capabilities

    Spring 版本( Spring version )選擇 “Spring 1″;

    開發包(libraries)選擇 “Spring 1.2 AOP Libraries、Spring 1.2 Core Libraries、Spring 1.2 Persistence Core Libraries、Spring 1.2 Persistence JDBC Libraries” 四項;

    JAR Library Installation 選擇 “copy checked…” ,”Library Folder” 項選擇 “/WebRoot/WEB-INF/lib”(這樣的話所需的類庫都將拷貝到項目目錄,方便以后的布署)。

    點擊 “下一步(Next)” 創建配置文件,修改文件路徑(Folder)到 “WebRoot/WEB-INF” 目錄(以便和Struts配置文件一起管理),文件名稱為默認的”applicationContext.xml”。

    點擊 “完成(Finish)” 。

    3.2. 配置 struts-config.xml 文件

    添加 Spring 插件(在 <message-resources> 標簽后面添加):

    <plug-in className=”org.springframework.web.struts.ContextLoaderPlugIn”>
    <set-property property=”contextConfigLocation” value=”/WEB-INF/applicationContext.xml” />
    </plug-in>

    修改 LoginAction 的配置(只需修改 type 屬性):

    <action-mappings >
    <action
    attribute=”loginForm”
    input=”/login.jsp”
    name=”loginForm”
    path=”/login”
    scope=”request”
    type=”org.springframework.web.struts.DelegatingActionProxy” />

    </action-mappings>

    綠色字體部份為被修改過的內容,這里將使用 spring 的代理器 DelegatingActionProxy 來對 Action 進行控制。

    3.3. 修改 Spring 配置文件 applicationContext.xml

    <?xml version=”1.0″ encoding=”UTF-8″?>
    <!DOCTYPE beans PUBLIC “-//SPRING//DTD BEAN//EN” “http://www.springframework.org/dtd/spring-beans.dtd”>

    <beans>
    <bean name=”/login” class=”com.login.struts.action.LoginAction” singleton=”false”></bean>
    </beans>

    綠色字體是關于接受和處理 Action 控制權的配置內容,”com.login.struts.action.LoginAction” 即為原 struts 里的配置。

    3.4. 測試

    同上一次測試。測試成功證明 Spring 運行正常。

    如果運行出錯,請參考文章最后的“5. 問題集”。

    4. Hibernate 部分

    下面開始 Hibernate 部分,將原例修改為使用數據庫進行用戶名/密碼驗證。

    4.1. 創建 mysql 數據庫和表

    添加表的代碼如下:

    CREATE TABLE user_table(
    ID int NOT NULL auto_increment,
    USERNAME varchar(45) NOT NULL default ”,
    PASSWORD varchar(45) NOT NULL default ”,
    PRIMARY KEY (ID)
    )

    再添加一條記錄:

    insert into user_table (USERNAME,PASSWORD) values (‘test’,'test’)

    4.2. 創建 MyEclipse 數據庫驅動(DB Driver)

    操作:[Menu] MyEclipse/Prefrences/MyEclipse/Database Explorer/Database Driver/DB Brower

    在 DB Brower 的菜單中選擇 “New” ,”Driver Name” 項輸入 “login-conn” ,”Connection URL” 項輸入 “jdbc:mysql://localhost:3306/test” ,然后輸入 MySql 的用戶名(User Name)和密碼(Password),按實際情況輸入;

    在 “Driver JARs” 項添加 “mysql-connector-java-5.0.4-bin.jar” (可從網上下載),在 “Driver classname” 里選擇 “com.mysql.jdbc.Driver” ,其它自選。

    點擊 “完成(Finish)”。

    4.3. 添加 Hibernate 功能支持

    操作:[Menu] MyEclipse/Project Capabilities/Add Hibernate Capabilities

    Hibernate 版本(Hibernate Specification)選擇 “Hibernate 3.1″ ,開發包(libraries)選擇 Hibernate 3.1 Core Libraries 一項;

    JAR Library Installation 選擇 “copy checked…” ,”Library Folder” 選擇 “/WebRoot/WEB-INF/lib” 。

    點擊 “下一步(Next)” 設置配置文件:

    選擇 “Spring configuration file (applicationContext.xml)” 。

    “下一步(Next)” 設置 Spring-Hibernate:

    選擇 “Existing Spring configuration file” ,”SessionFactory ID” 項輸入 “sessionFactory” 。

    “下一步(Next)” 創建數據源對象:

    在 Bean Id 中輸入 dataSource,”DataSource” 項選擇 “Use JDBC Dirver” ,DB Driver 項選擇 “login-conn” ,其余項會自動填充。

    記得選中 “Copy DB driver jar(s) to project and add to buidpath” 項,以便將數據連接的庫文件復制到項目,方便以后的布署。

    “下一步(Next)” 創建 SessionFactory 類:

    “Java package” 項設置為 “com.login.Hibernate” (如果沒有,點擊 “New” 按鈕添加),”Class name” 項修改為 “SessionFactory” ,Java Compliance Level 選擇和創建項目時選擇的 Java 版本。(本例中并沒有用到 SessionFactory 類,留作今后擴展)

    點擊 “完成(Finish)”。

    4.4. 創建對象關系映射(ORM)的相關文件

    操作:[Menu] Window/Open Perspective/MyEclipse Database Explorer

    選中 user_table 表,點擊右鍵,在出現的菜單中選擇 “Hibernate Reverse Engnieering” 。

    在彈出的窗口中保持 “Java package” 項為 “com.login” ;

    選中 “Hibernate mapping file (*.hbm.xml) for each databases table” ,并保持 “Update hibernate…” 項選中;

    選中 “Java Data Object” 項,并保持 “Create abstract class” 選中;

    “Base persistent class” 項留空;

    取消 “Java Data Access Object…” 項和 “Use custom templates” 項。

    點擊 “下一步(Next)” ,再點擊 “下一步(Next)” ,在 “Configure reverse engineering details” 頁選中 “user_table” 表,在右邊出現的 “Class Name” 項中輸入 “com.login.User”,其它不變。

    點擊 “完成(Finish)”。

    完成此操作,會在 “com.login” 包下創建三個文件:AbstractUser.java、User.java、User.hbm.xml。

    4.5. 創建 UserDAO.java 接口

    操作:[Ctrl+N] Interface,點擊 “下一步( Next )”

    在出現的 “New Java Interface” 窗口中,將 “Source Folder” 設置為 “login/src”,將 “Package” 設置為 “com.login”, 將 “Name”  項設為 “UserDAO”,然后點擊 “完成( Finish )” 按鈕。

    UserDAO.java 內容如下:

    package com.login;

    public interface UserDAO {
    public abstract boolean isValidUser( String username, String password );
    }

    4.6. 創建 UserDAOImpl.java 類

    操作:[Ctrl+N] Class,點擊 “下一步( Next )”

    在出現的 “New Java Class” 窗口中,將 “Source Folder” 設置為 “login/src”,將 “Package” 設置為 “com.login”, 將 “Name”  項設為 “UserDAOImpl”,在 “Supperclass” 項輸入 “org.springframework.orm.hibernate3.support.HibernateDaoSupport”,在 “Interface” 項中添加 “com.login.UserDAO” 接口,然后點擊 “完成( Finish )” 按鈕。

    UserDAOImpl 通過 Hibernate 訪問數據庫,做用戶驗證。

    UserDAOImpl.java 內容如下:

    package com.login;

    import java.util.List;
    import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

    public class UserDAOImpl extends HibernateDaoSupport implements UserDAO {
    private static String hql = “from User u where u.username=? “;

    public boolean isValidUser( String username, String password ) {
    // 驗證用戶
    List userList = this.getHibernateTemplate().find( hql, username );
    if ( userList.size() > 0 ) {
    return true;
    }
    return false;
    }
    }

    4.7. 修改 LoginAction.java 文件

    使用 UseDAO 對象來驗證:

    package com.login.struts.action;

    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import org.apache.struts.action.Action;
    import org.apache.struts.action.ActionForm;
    import org.apache.struts.action.ActionForward;
    import org.apache.struts.action.ActionMapping;
    import com.login.struts.form.LoginForm;
    import com.login.UserDAO;

    public class LoginAction extends Action {
    private UserDAO userDAO;

    public UserDAO getUserDAO() {
    return userDAO;
    }

    public void setUserDAO(UserDAO userDAO) {
    this.userDAO = userDAO;
    }

    public ActionForward execute(ActionMapping mapping, ActionForm form,
    HttpServletRequest request, HttpServletResponse response) {

    LoginForm loginForm = (LoginForm) form;
    String username=loginForm.getUsername();
    String password=loginForm.getPassword();

    if( userDAO.isValidUser( username, password ) ){
    return mapping.findForward( “indexForword” );
    }else{
    return mapping.getInputForward();
    }
    }
    }

    綠色字體為修改部分。

    4.8. Spring 的最終配制文件 applicationContext.xml

    <?xml version=”1.0″ encoding=”UTF-8″?>
    <!DOCTYPE beans PUBLIC “-//SPRING//DTD BEAN//EN” “
    http://www.springframework.org/dtd/spring-beans.dtd”>

    <beans>

    <bean id=”dataSource” class=”org.apache.commons.dbcp.BasicDataSource”>
    <property name=”driverClassName” value=”com.mysql.jdbc.Driver”></property>
    <property name=”url” value=”jdbc:mysql://localhost:3306/test”></property>
    <property name=”username” value=”root”></property>
    <property name=”password” value=”root”></property>
    </bean>

    <!– 配置sessionFactory, 注意這里引入的包的不同 –>
    <bean id=”sessionFactory” class=”org.springframework.orm.hibernate3.LocalSessionFactoryBean”>
    <property name=”dataSource”>
    <ref local=”dataSource” />
    </property>
    <property name=”mappingResources”>
    <list>
    <value>com/login/User.hbm.xml</value>
    </list>
    </property>
    <property name=”hibernateProperties”>
    <props>
    <prop key=”hibernate.dialect”>org.hibernate.dialect.MySQLDialect</prop>
    <prop key=”hibernate.show_sql”>true</prop>
    </props>
    </property>
    </bean>

    <bean id=”transactionManager” class=”org.springframework.orm.hibernate3.HibernateTransactionManager”>
    <property name=”sessionFactory”>
    <ref local=”sessionFactory” />
    </property>
    </bean>

    <bean id=”userDAO” class=”com.login.UserDAOImpl”>
    <property name=”sessionFactory”>
    <ref local=”sessionFactory” />
    </property>
    </bean>

    <bean id=”userDAOProxy” class=”org.springframework.transaction.interceptor.TransactionProxyFactoryBean”>
    <property name=”transactionManager”>
    <ref bean=”transactionManager” />
    </property>
    <property name=”target”>
    <ref local=”userDAO” />
    </property>
    <property name=”transactionAttributes”>
    <props>
    <prop key=”insert*”>PROPAGATION_REQUIRED</prop>
    <prop key=”get*”>PROPAGATION_REQUIRED,readOnly</prop>
    <prop key=”is*”>PROPAGATION_REQUIRED,readOnly</prop>
    </props>
    </property>
    </bean>

    <bean name=”/login” class=”com.login.struts.action.LoginAction” singleton=”false”>
    <property name=”userDAO”>
    <ref bean=”userDAOProxy” />
    </property>
    </bean>

    </beans>

    4.9. 測試

    同第一次測試。

    如果運行出錯,請參考文章最后的“5. 問題集”。

    5. 問題集

    5.1. Console 錯誤信息: java.net.BindException: Address already in use: JVM_Bind:8080

    • 原因:有其它進程占用了 8080 端口,導致綁定失敗。
    • 解決:如果是有 Tomcat 啟動了,將其關閉,MyEclipse 會自己啟動 Tomcat。

    5.2. HTTP 錯誤信息:message Servlet action is not available

    • 原因:找不到相關類。可能配置文件中的某些類或文件的路徑填寫錯誤,或是缺少 jar 包。
    • 解決:如果是在添加 Spring 特性后產生的,可能是 /WEB-INF/lib/ 中缺少 spring.jar 包。從 MyEclipse 目錄搜索出 1.2 版的 spring.jar,并將其復制到項目的 /WEB-INF/lib/ 目錄下。

    5.3. Console 錯誤信息:java.sql.SQLException: Access denied for user: ‘root@localhost’ (Using password: YES)

    • 原因:數據庫訪問被拒絕。可能由于 MySQL 密碼被設置成空,而 MyEclipse 又不支持空密碼。
    • 解決:將 MySQL 的 root 用戶密碼設置成非空,如 “root”,然后修改 MyEclipse 中剛才添加的 login-conn 數據源信息的密碼項。
    [ 標簽: hibernate, j2ee, myeclipse, spring, struts ]
    [ 固定鏈接:http://blog.tanggaowei.com/2007/12/myeclipsesshstrutsspringhibernate.html ]

    訂閱

     

    手機訪問

    http://blog.tanggaowei.com/wap/
    ?
    Google
     

    posted @ 2011-04-28 09:39 哈希 閱讀(207) | 評論 (0)編輯 收藏

    public class TestClass {

        
    public TestClass() {
            System.out.println(
    "wll");
        }
         
         
        
        
    public static void main(String[] args) {
            TestClass tc
    =new TestClass();
        }
        
        
        
    }

    繼承



    排序




    posted @ 2011-04-27 14:48 哈希 閱讀(163) | 評論 (0)編輯 收藏


    區別一:

      重定向時瀏覽器上的網址改變

      轉發是瀏覽器上的網址不變

    區別二:

      重定向實際上產生了兩次請求

    轉發只有一次請求 

    重定向: 

      發送請求 -->服務器運行-->響應請求,返回給瀏覽器一個新的地址與響應碼-->瀏覽器根據響應碼,判定該響應為重定向,自動發送一個新的請求給服務器,請求地址為之前返回的地址-->服務器運行-->響應請求給瀏覽器 

    轉發: 

      發送請求 -->服務器運行-->進行請求的重新設置,例如通過request.setAttribute(name,value)-->根據轉發的地址,獲取該地址的網頁-->響應請求給瀏覽器 

    區別三:

      重定向時的網址可以是任何網址

      轉發的網址必須是本站點的網址

    詳解:

      重定向:以前的request中存放的變量全部失效,并進入一個新的request作用域。
    轉發:以前的request中存放的變量不會失效,就像把兩個頁面拼到了一起。

    正文開始: 

      先是看上去不同,他們的調用分別如下:
    request.getRequestDispatcher("apage.jsp").forward(request, response);//轉發到apage.jsp
    response.sendRedirect("apage.jsp");//重定向到apage.jsp
    在jsp頁面中你也會看到通過下面的方式實現轉發:
    <jsp:forward page="apage.jsp" />
    我在初學jsp的時候,對這兩個概念非常模糊,看別人的例子的時候,也是一頭霧水,不知道什么時候該用哪個。希望下面的解說能對你有所幫助。
    提到轉發和重定向就不得不提到request作用域。很多初學者都知道當我們提交一個表單時,就創建了一個新的請求。實際上,當我們點擊一個鏈接時,也創建了一個新的請求。那么一個請求的作用于到底有多大呢?例如:
    在頁面a.jsp中有一個鏈接<a href="b.jsp?id=1">這是指向b的一個鏈接,而且還帶了一個參數</a>。當我們點擊這個連接的時候,就產生了一個請求,為了明確起見,我們把它叫做requestA->B。現在,在b.jsp頁面中我們就可以從這個請求中獲取信息了。在b.jsp中你可以寫入out.println(request.getParameter("id"))進行測試。下面更復雜一點,我們在b.jsp頁面中增加下面的語句:
    request.setAttribute("name","funcreal");
    out.println(request.getAttriblute("name"));//成功顯示了name變量的值。
    現在在b.jsp中再增加一個鏈接:<a href="c.jsp?age=23">這是指向c的一個鏈接,而且還帶了一個參數</a>,當我們點擊這個連接的時候,將產生一個新的請求,這時requestA-B也就安息了,新的請求叫做requestB-C。同樣的道理,在c.jsp中,我們可以訪問到的變量只有age,因為id,name這兩個變量都屬于requestA-B,此時他已經不存在了。下面是源代碼:
    a.jsp
    <%@ page contentType="text/html; charset=GBK" %>
    <html>
    <body bgcolor="#ffffff">
    <a href="b.jsp?id=1">指向b.jsp,而且還帶了一個參數id=1。requestA-B現在誕生了</a>
    </body>
    </html> 

    b.jsp
    <%@ page contentType="text/html; charset=GBK" %>
    <html>
    <body bgcolor="#ffffff">
    <%
    out.println("id=" + request.getParameter("id"));
    request.setAttribute("name","Func Real");
    out.println("name=" + request.getAttribute("name"));
    %>
    <a href="c.jsp?age=23">requestA-B已經結束了。指向c.jsp,而且還帶了一個參數age=23</a>
    </body>
    </html> 

    c.jsp
    <%@ page contentType="text/html; charset=GBK" %>
    <html>
    <body bgcolor="#ffffff">
    <%
    out.println("id=" + request.getParameter("id"));
    out.println("name=" + request.getAttribute("name"));
    out.println("age=" + request.getParameter("age"));
    %>
    </body>
    </html> 

      那么轉發又是怎么回事呢?現在增加一個頁面叫做d.jsp,并且在c.jsp中</body>前面增加一句<jsp:forward page="d.jsp"/>
    d.jsp
    <%@ page contentType="text/html; charset=GBK" %>
    <html>
    <body bgcolor="#ffffff">
    requestB-C的魔爪已經伸到了d.jsp頁面
    <%
    out.println("age=" + request.getParameter("age"));
    %>
    </body>
    </html>
    運行程序,你會發現c頁面中的內容沒有顯示出來,因為forward是自動執行的,地址欄中雖然是c.jsp但實際上,但瀏覽器中顯示的已經是d.jsp的內容了,而且看到了從b.jsp傳過來的參數。你可以簡單得這樣理解:轉發,就是延長了requestB-C的作用域,<jsp:forward page="d.jsp"/>,這一句話實際上是把c.jsp和d.jsp粘到了一起,他們就像是在一個頁面中。
    如果你用過struts,那么你就知道為什么在Action中,最后一句幾乎總是mapping.findForward("xxx");了。因為我們在這個Action中設置的請求作用域的變量都將會在下一個頁面(也許是另一個Action)中用到,所以要用轉發。 

    總結:
    用重定向和轉發不是一個習慣問題。而是什么情況下必須用什么的問題。

    posted @ 2011-04-26 23:13 哈希 閱讀(184) | 評論 (0)編輯 收藏

    僅列出標題
    共11頁: First 上一頁 3 4 5 6 7 8 9 10 11 下一頁 
    主站蜘蛛池模板: xxxx日本免费| 亚洲AV一区二区三区四区| 美女隐私免费视频看| 1000部拍拍拍18勿入免费视频软件 | 四虎成人精品在永久免费| 91成人免费观看| 国产免费69成人精品视频| 亚洲国产精品无码观看久久| 特级做A爰片毛片免费69 | 亚洲AV综合永久无码精品天堂 | 91视频国产免费| 亚洲乱码一区二区三区国产精品| 91成年人免费视频| 国产性爱在线观看亚洲黄色一级片| 一级毛片a免费播放王色电影| 亚洲免费日韩无码系列| 久久久久久久国产免费看| 亚洲中文字幕久久精品无码喷水 | 午夜免费啪视频在线观看 | 亚洲天堂在线视频| 麻豆精品不卡国产免费看| 国产午夜无码视频免费网站 | 国产AⅤ无码专区亚洲AV| 亚洲A∨精品一区二区三区| 久久亚洲精品无码AV红樱桃| 亚洲小说图区综合在线| 蜜桃视频在线观看免费视频网站WWW| 亚洲av无码一区二区三区不卡 | 亚洲熟女少妇一区二区| 8090在线观看免费观看| 在线观看日本亚洲一区| 亚洲AV无码不卡在线观看下载| 中文字幕不卡免费高清视频| 日韩亚洲Av人人夜夜澡人人爽| 在线观看免费为成年视频| WWW免费视频在线观看播放| 亚洲无砖砖区免费| 亚洲精品国产精品国自产观看| 国产福利免费视频 | 免费无码AV一区二区| 亚洲码国产精品高潮在线|