面試題

Struts1與Struts2的區別及struts2的優點有哪些?
struts2 的action是交給那個管理的,怎麼實現


寫一個struts1的迭代標籤
struts1裏面的action的詳細配置也就是action裏面的屬性有那些
struts2的Action有什麼作用?


Struts在MVC設計模式中是怎樣體現的?
strut2的工作流程
----->
客戶發送一個請求 首先會訪問ActionMapping 判斷是否有相對應的action 如果沒有則直接返回jsp 頁面
如果有則訪問actionProxy也就是代理模式 然後進入actionInvocation調度器 在調度器裏面進行循環迭代攔截器 然後範文真正的action

Struts2的核心機制
struts2中的詳細配置,具體到某個屬性
strut2的ValueStack對象的傳送帶機制
Struts2的標籤,至少寫出七個
談談Stuts2的攔截器
Struts2中常用類有那些?ActionSupport的作用?
爲什麼你們用struts2不用webwork,它們有什麼區別,它在他基礎上做了什麼改進

struts1 五大標籤庫
htmL:創建struts頁面表單 比如:<html:form action="reg.do" method="post"> 
bean:訪問javabean及其屬性 以及定義一個新的bean時使用
logic:邏輯判斷,集合迭代,流程控制
nested:具有前三個標籤所有的功能
tiles:創建tiles樣式的頁面

struts2 標籤
struts2中的標籤沒有分類,在jsp文件加上<%@taglib prefix="s" uri="/struts-tags"%>

struts2面試題1
2010年07月10日 15:14
Struts1與Struts2的區別,它們常用到哪幾個類, 以及工作流程?
Struts1: ActionServlet[process()], RequestProcessor[processPreprocess()], PlugIn,
Action, ActionForm, ActionForward,ActionMapping ,struts-config.xml
Struts2: FilterDispatcher, ActionSupport, ServletActionContext[getResponse()],
ModelDriven[getModel()],MethodFilterInterceptor
    struts.xml,它是在 WebWork基礎上發展起來的.
Struts工作流程:
struts1:
發佈Struts Web服務時,根據web.xml初始化ActionServlet,ActionContext等內容.
在接到一個HttpRequest請求後,ActionServlet 根據struts-config.xml中的配置內容,將請求的參數傳到對應的Formbean中,並設置session.然後根據請求中的Action參數,在struts-config.xml中查找指定的Action,並調用此Action來處理請求.根據Action的處理結果,會返回一個forward變量,此時通過mapping.findForward()查找出對應的forward所標示的Action或者JSP頁面,將請求轉到下一個處理.如果是forward指向JSP頁面,則輸出到前臺.
Struts2:
(1)客戶端提交一個HttpServletRequest請求(.action或JSP頁面)
(2)請求被提交到一系列Filter過濾器,如ActionCleanUp和FilterDispatcher等
(3)FilterDispatcher是Struts2控制器的核心,它通常是過濾器鏈中的最後一個過濾器
(4)請求發到FilterDispatcher後,FilterDispatcher詢問ActionMapper是否需要調用某個Action來處理這個Request(一般根據URL後綴是否爲.action來判斷)
(5)如果ActionMapper決定需要調用某個Action,FilterDispatcher則把請求交到ActioProxy,由其進行處理.
(6)ActionProxy通過Configuration Manager(它會訪問struts.xml)詢問框架的配置文件,找到需要調用的Action類.
(7)ActionProxy創建一個ActionInvocation實例,而ActionInvocation通過代理模式調用Action,(在調用之前會根據配置文件加載相關的所有Interceptor攔截器)
(8)Action執行完畢後,返回一個result字符串,此時再按相反的順序通過Interceptor攔截器.
(9) 最後ActionInvocation負責根據struts.xml中配置的result元素,找到與返回值對應的result,決定進行下一步輸出.


?Struts1和Struts2的區別和對比:
Action 類:
? Struts1要求Action類繼承一個抽象基類。Struts1的一個普遍問題是使用抽象類編程而不是接口。
? Struts 2 Action類可以實現一個Action接口,也可實現其他接口,使可選和定製的服務成爲可能。Struts2提供一個ActionSupport基類去 實現 常用的接口。Action接口不是必須的,任何有execute標識的POJO對象都可以用作Struts2的Action對象。
線程模式:
? Struts1 Action是單例模式並且必須是線程安全的,因爲僅有Action的一個實例來處理所有的請求。單例策略限制了Struts1 Action能作的事,並且要在開發時特別小心。Action資源必須是線程安全的或同步的。
? Struts2 Action對象爲每一個請求產生一個實例,因此沒有線程安全問題。(實際上,servlet容器給每個請求產生許多可丟棄的對象,並且不會導致性能和垃圾回收問題)
Servlet 依賴:
? Struts1 Action 依賴於Servlet API ,因爲當一個Action被調用時HttpServletRequest 和 HttpServletResponse 被傳遞給execute方法。
? Struts 2 Action不依賴於容器,允許Action脫離容器單獨被測試。如果需要,Struts2 Action仍然可以訪問初始的request和response。但是,其他的元素減少或者消除了直接訪問HttpServetRequest 和 HttpServletResponse的必要性。
可測性:
? 測試Struts1 Action的一個主要問題是execute方法暴露了servlet API(這使得測試要依賴於容器)。一個第三方擴展--Struts TestCase--提供了一套Struts1的模擬對象(來進行測試)。
? Struts 2 Action可以通過初始化、設置屬性、調用方法來測試,“依賴注入”支持也使測試更容易。
捕獲輸入:
? Struts1 使用ActionForm對象捕獲輸入。所有的ActionForm必須繼承一個基類。因爲其他JavaBean不能用作ActionForm,開發者經 常創建多餘的類捕獲輸入。動態Bean(DynaBeans)可以作爲創建傳統ActionForm的選擇,但是,開發者可能是在重新描述(創建)已經存 在的JavaBean(仍然會導致有冗餘的javabean)。
? Struts 2直接使用Action屬性作爲輸入屬性,消除了對第二個輸入對象的需求。輸入屬性可能是有自己(子)屬性的rich對象類型。Action屬性能夠通過 web頁面上的taglibs訪問。Struts2也支持ActionForm模式。rich對象類型,包括業務對象,能夠用作輸入/輸出對象。這種 ModelDriven 特性簡化了taglib對POJO輸入對象的引用。
表達式語言:
? Struts1 整合了JSTL,因此使用JSTL EL。這種EL有基本對象圖遍歷,但是對集合和索引屬性的支持很弱。
? Struts2可以使用JSTL,但是也支持一個更強大和靈活的表達式語言--"Object Graph Notation Language" (OGNL). 綁定值到頁面(view): ? Struts 1使用標準JSP機制把對象綁定到頁面中來訪問。
? Struts 2 使用 "ValueStack"技術,使taglib能夠訪問值而不需要把你的頁面(view)和對象綁定起來。ValueStack策略允許通過一系列名稱相同但類型不同的屬性重用頁面(view)。
類型轉換:
? Struts 1 ActionForm 屬性通常都是String類型。Struts1使用Commons-Beanutils進行類型轉換。每個類一個轉換器,對每一個實例來說是不可配置的。
? Struts2 使用OGNL進行類型轉換。提供基本和常用對象的轉換器。
校驗:
? Struts 1支持在ActionForm的validate方法中手動校驗,或者通過Commons Validator的擴展來校驗。同一個類可以有不同的校驗內容,但不能校驗子對象。
? Struts2支持通過validate方法和XWork校驗框架來進行校驗。XWork校驗框架使用爲屬性類類型定義的校驗和內容校驗,來支持chain校驗子屬性
Action執行的控制:
? Struts1支持每一個模塊有單獨的Request Processors(生命週期),但是模塊中的所有Action必須共享相同的生命週期。
? Struts2支持通過攔截器堆棧(Interceptor Stacks)爲每一個Action創建不同的生命週期。堆棧能夠根據需要和不同的Action一起使用。

Servlet,Filter和Listener實現的接口.
Servlet繼承HttpServlet類
Filter 實現 Filter接口
Listener 實現HttpSessionListener,HttpSessionAttributeListener接口
------------------------------------------------------------------------------------
Java面試中,最常被人問到的幾個問題:

2. Vector和ArrayList、LinkedList區別? Hashtable 和 HashMap之間的區別

3. String、StringBuffer,StringBuilder之間區別。

2.? LinkedList內部以鏈表形式存儲數據 ? ?
ArrayList內部以數組形式存儲數據。 ?
? Vector同ArrayList,不過它與ArrayList比較起來是thread-safe的。 ?
? Hashtable是繼承了Dictionary,是線程安全的。HashMap實現了Map接口,不是線程安全的。 ? ? ? 如何保證線程安全的?每個修改容器中數據的操作都是同步的(synchronized),因此保證了線程安全。
3. String是長度不可變的,StringBuffer和StringBuilder長度都是可以變化的。 StringBuffer是線程安全的,StringBuilder不是線程安全的。
------------------------------------------------------------------------------====
2、Anonymous Inner Class (匿名內部類) 是否可以extends(繼承)其它類,是否可以implements(實現)interface(接口)
答:匿名的內部類是沒有名字的內部類。不能extends(繼承) 其它類,但一個內部類可以作爲一個接口,由另一個內部類實現
3、Static Nested Class 和 Inner Class的不同
答:Nested Class (一般是C++的說法),Inner Class (一般是JAVA的說法)。Java內部類與C++嵌套類最大的不同就在於是否有指向外部的引用上。注: 靜態內部類(Inner Class)意味着1創建一個static內部類的對象,不需要一個外部類對象,2不能從一個static內部類的一個對象訪問一個外部類對象
4、&和&&的區別
答:&是位運算符,表示按位與運算,&&是邏輯運算符,表示邏輯與(and)
5、Collection 和 Collections的區別
答:Collection是集合類的上級接口,繼承與他的接口主要有Set?和List.Collections是針對集合類的一個幫助類,他提供一系列靜態方法實現對各種集合的搜索、排序、線程安全化等操作6、什麼時候用assert答:assertion(斷言)在軟件開發中是一種常用的調試方式,很多開發語言中都支持這種機制。在實現中,assertion就是在程序中的一條語句,它對一個boolean表達式進行檢查,一個正確程序必須保證這個boolean表達式的值爲true;如果該值爲false,說明程序已經處於不正確的狀態下,系統將給出警告或退出。一般來說,assertion用於保證程序最基本、關鍵的正確性。assertion檢查通常在開發和測試時開啓。爲了提高性能,在軟件發佈後,assertion檢查通常是關閉的
7、String s = new String("xyz");創建了幾個String Object
答:兩個,一個字符對象,一個字符對象引用對象
8、Math.round(11.5)等於多少? Math.round(-11.5)等於多少
答: ?Math.round(11.5)==12;Math.round(-11.5)==-11;round方法返回與參數最接近的長整數,參數加1/2後求其floor
9、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;(可以正確編譯)
10、Java有沒有goto
答:java中的保留字,現在沒有在java中使用
11、數組有沒有length()這個方法? String有沒有length()這個方法
答:數組沒有length()這個方法,有length的屬性。String有有length()這個方法
12、Overload和Override的區別。Overloaded的方法是否可以改變返回值的類型
答:方法的重寫Overriding和重載Overloading是Java多態性的不同表現。重寫Overriding是父類與子類之間多態性的一種表現,重載Overloading是一個類中多態性的一種表現。如果在子類中定義某方法與其父類有相同的名稱和參數,我們說該方法被重寫?(Overriding)。子類的對象使用這個方法時,將調用子類中的定義,對它而言,父類中的定義如同被"屏蔽"了。如果在一個類中定義了多個同名的方法,它們或有不同的參數個數或有不同的參數類型,則稱爲方法的重載(Overloading)。Overloaded的方法是可以改變返回值的類型
13、Set裏的元素是不能重複的,那麼用什麼方法來區分重複與否呢? 是用==還是equals()? 它們有何區別
答:Set裏的元素是不能重複的,那麼用iterator()方法來區分重複與否。equals()是判讀兩個Set是否相等????equals()和==方法決定引用值是否指向同一對象equals()在類中被覆蓋,爲的是當兩個分離的對象的內容和類型相配的話,返回真值
15、error和exception有什麼區別
答:error?表示恢復不是不可能但很困難的情況下的一種嚴重問題。比如說內存溢出。不可能指望程序能處理這樣的情況????exception?表示一種設計或實現問題。也就是說,它表示如果程序運行正常,從不會發生的情況
16、List, Set, Map是否繼承自Collection接口
答:?List,Set是,Map不是
17、abstract class和interface有什麼區別
答:聲明方法的存在而不去實現它的類被叫做抽象類(abstract?class),它用於要創建一個體現某些基本行爲的類,併爲該類聲明方法,但不能在該類中實現該類的情況。不能創建abstract?類的實例。然而可以創建一個變量,其類型是一個抽象類,並讓它指向具體子類的一個實例。不能有抽象構造函數或抽象靜態方法。Abstract?類的子類爲它們父類中的所有抽象方法提供實現,否則它們也是抽象類爲。取而代之,在子類中實現該方法。知道其行爲的其它類可以在類中實現這些方法接口(interface)是抽象類的變體。在接口中,所有方法都是抽象的。多繼承性可通過實現這樣的接口而獲得。接口中的所有方法都是抽象的,沒有一個有程序體。接口只可以定義static?final成員變量。接口的實現與子類相似,除了該實現類不能從接口定義中繼承行爲。當類實現特殊接口時,它定義(即將程序體給予)所有這種接口的方法。然後,它可以在實現了該接口的類的任何對象上調用接口的方法。由於有抽象類,它允許使用接口名作爲引用變量的類型。通常的動態聯編將生效。引用可以轉換到接口類型或從接口類型轉換,instanceof?運算符可以用來決定某對象的類是否實現了接口
18、abstract的method是否可同時是static,是否可同時是native,是否可同時是synchronized
答:都不能
19、接口是否可繼承接口? 抽象類是否可實現(implements)接口? 抽象類是否可繼承實體類(concrete class)
答:接口可以繼承接口。抽象類可以實現(implements)接口,抽象類是否可繼承實體類,但前提是實體類必須有明確的構造函數
20、構造器Constructor是否可被override
答:構造器Constructor不能被繼承,因此不能重寫Overriding,但可以被重載Overloading
21、是否可以繼承String類
答:String類是final類故不可以繼承
22、try {}裏有一個return語句,那麼緊跟在這個try後的finally {}裏的code會不會被執行,什麼時候被執行,在return前還是後
答:會執行,在return前執行

23、用最有效率的方法算出2乘以8等於幾
答:2?<<?3
24、兩個對象值相同(x.equals(y) == true),但卻可有不同的hash code,這句話對不對
答:不對,有相同的hash?code
25、當一個對象被當作參數傳遞到一個方法後,此方法可改變這個對象的屬性,並可返回變化後的結果,那麼這裏到底是值傳遞還是引用傳遞答:是值傳遞。Java?編程語言只有值傳遞參數。當一個對象實例作爲一個參數被傳遞到方法中時,參數的值就是對該對象的引用。對象的內容可以在被調用的方法中改變,但對象的引用是永遠不會改變的
26、swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上答:witch(expr1)中,expr1是一個整數表達式。因此傳遞給?switch?和?case?語句的參數應該是?int、?short、?char?或者?byte。long,string?都不能作用於swtich
27、ArrayList和Vector的區別,HashMap和Hashtable的區別
答:就ArrayList與Vector主要從二方面來說.一.同步性:Vector是線程安全的,也就是說是同步的,而ArrayList是線程序不安全的,不是同步的二.數據增長:當需要增長時,Vector默認增長爲原來一培,而ArrayList卻是原來的一半就HashMap與HashTable主要從三方面來說。一.歷史原因:Hashtable是基於陳舊的Dictionary類的,HashMap是Java 1.2引進的Map接口的一個實現二.同步性:Hashtable是線程安全的,也就是說是同步的,而HashMap是線程序不安全的,不是同步的三.值:只有HashMap可以讓你將空值作爲一個表的條目的key或value
28、char型變量中能不能存貯一箇中文漢字?爲什麼?
答:是能夠定義成爲一箇中文的,因爲java中以unicode編碼,一個char佔16個字節,所以放一箇中文是沒問題的
29、GC是什麼??爲什麼要有GC
答:GC是垃圾收集的意思(Gabage?Collection),內存處理是編程人員容易出現問題的地方,忘記或者錯誤的內存回收會導致程序或系統的不穩定甚至崩潰,Java提供的GC功能可以自動監測對象是否超過作用域從而達到自動回收內存的目的,Java語言沒有提供釋放已分配內存的顯示操作方法。
30、float型float f=3.4是否正確?
答:不正確。精度不準確,應該用強制類型轉換,如下所示:float f=(float)3.4
32、抽象類與接口?
答:抽象類與接口都用於抽象,但是抽象類(JAVA中)可以有自己的部分實現,而接口則完全是一個標識(同時有多重繼承的功能)。 JAVA類實現序例化的方法是實現java.io.Serializable接口Collection框架中實現比較要實現Comparable 接口和 Comparator 接口
33、STRING與STRINGBUFFER的區別。
答:STRING的長度是不可變的,STRINGBUFFER的長度是可變的。如果你對字符串中的內容經常進行操作,特別是內容要修改時,那麼使用StringBuffer,如果最後需要String,那麼使用StringBuffer的toString()方法
34、談談final, finally, finalize的區別
答:final—修飾符(關鍵字)如果一個類被聲明爲final,意味着它不能再派生出新的子類,不能作爲父類被繼承。因此一個類不能既被聲明爲 abstract的,又被聲明爲final的。將變量或方法聲明爲final,可以保證它們在使用中不被改變。被聲明爲final的變量必須在聲明時給定初值,而在以後的引用中只能讀取,不可修改。被聲明爲final的方法也同樣只能使用,不能重載finally—再異常處理時提供 finally 塊來執行任何清除操作。如果拋出一個異常,那麼相匹配的 catch 子句就會執行,然後控制就會進入 finally 塊(如果有的話)finalize—方法名。Java 技術允許使用 finalize() 方法在垃圾收集器將對象從內存中清除出去之前做必要的清理工作。這個方法是由垃圾收集器在確定這個對象沒有被引用時對這個對象調用的。它是在 Object 類中定義的,因此所有的類都繼承了它。子類覆蓋 finalize() 方法以整理系統資源或者執行其他清理工作。finalize() 方法是在垃圾收集器刪除對象之前對這個對象調用的
35、面向對象的特徵有哪些方面?
答:主要有以下四方面:1.抽象:抽象就是忽略一個主題中與當前目標無關的那些方面,以便更充分地注意與當前目標有關的方面。抽象並不打算了解全部問題,而只是選擇其中的一部分,暫時不用部分細節。抽象包括兩個方面,一是過程抽象,二是數據抽象。2.繼承:繼承是一種聯結類的層次模型,並且允許和鼓勵類的重用,它提供了一種明確表述共性的方法。對象的一個新類可以從現有的類中派生,這個過程稱爲類繼承。新類繼承了原始類的特性,新類稱爲原始類的派生類(子類),而原始類稱爲新類的基類(父類)。派生類可以從它的基類那裏繼承方法和實例變量,並且類可以修改或增加新的方法使之更適合特殊的需要。3.封裝:封裝是把過程和數據包圍起來,對數據的訪問只能通過已定義的界面。面向對象計算始於這個基本概念,即現實世界可以被描繪成一系列完全自治、封裝的對象,這些對象通過一個受保護的接口訪問其他對象。4.?多態性:多態性是指允許不同類的對象對同一消息作出響應。多態性包括參數化多態性和包含多態性。多態性語言具有靈活、抽象、行爲共享、代碼共享的優勢,很好的解決了應用程序函數同名問題。
36、String是最基本的數據類型嗎
答:基本數據類型包括byte、int、char、long、float、double、boolean和short。java.lang.String類是final類型的,因此不可以繼承這個類、不能修改這個類。爲了提高效率節省空間,我們應該用StringBuffer類
37、int?和?Integer?有什麼區別
答:Java?提供兩種不同的類型:引用類型和原始類型(或內置類型)。Int是java的原始數據類型,Integer是java爲int提供的封裝類。Java爲每個原始類型提供了封裝類。原始類型封裝類,booleanBoolean,charCharacter,byteByte,shortShort,intInteger,longLong,floatFloat,doubleDouble引用類型和原始類型的行爲完全不同,並且它們具有不同的語義。引用類型和原始類型具有不同的特徵和用法,它們包括:大小和速度問題,這種類型以哪種類型的數據結構存儲,當引用類型和原始類型用作某個類的實例數據時所指定的缺省值。對象引用實例變量的缺省值爲?null,而原始類型實例變量的缺省值與它們的類型有關
38、運行時異常與一般異常有何異同
答:異常表示程序運行過程中可能出現的非正常狀態,運行時異常表示虛擬機的通常操作中可能遇到的異常,是一種常見運行錯誤。java編譯器要求方法必須聲明拋出可能發生的非運行時異常,但是並不要求必須聲明拋出未被捕獲的運行時異常。
39、說出ArrayList,Vector,?LinkedList的存儲性能和特性
答:ArrayList和Vector都是使用數組方式存儲數據,此數組元素數大於實際存儲的數據以便增加和插入元素,它們都允許直接按序號索引元素,但是插入元素要涉及數組元素移動等內存操作,所以索引數據快而插入數據慢,Vector由於使用了synchronized方法(線程安全),通常性能上較ArrayList差,而LinkedList使用雙向鏈表實現存儲,按序號索引數據需要進行前向或後向遍歷,但是插入數據時只需要記錄本項的前後項即可,所以插入速度較快。
40、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算法都大概一樣,所以性能不會有很大的差異。
41、heap和stack有什麼區別
答:棧是一種線形集合,其添加和刪除元素的操作應在同一段完成。棧按照後進先出的方式進行處理。堆是棧的一個組成元素
42、Java的接口和C++的虛類的相同和不同處
答:由於Java不支持多繼承,而有可能某個類或對象要使用分別在幾個類或對象裏面的方法或屬性,現有的單繼承機制就不能滿足要求。與繼承相比,接口有更高的靈活性,因爲接口中沒有任何實現代碼。當一個類實現了接口以後,該類要實現接口裏面所有的方法和屬性,並且接口裏面的屬性在默認狀態下面都是public?static,所有方法默認情況下是public.一個類可以實現多個接口。
43、Java中的異常處理機制的簡單原理和應用
答:當JAVA程序違反了JAVA的語義規則時,JAVA虛擬機就會將發生的錯誤表示爲一個異常。違反語義規則包括2種情況。一種是JAVA類庫內置的語義檢查。例如數組下標越界,會引發IndexOutOfBoundsException;訪問null的對象時會引發NullPointerException。另一種情況就是JAVA允許程序員擴展這種語義檢查,程序員可以創建自己的異常,並自由選擇在何時用throw關鍵字引發異常。所有的異常都是java.lang.Thowable的子類。

 

 


43、垃圾回收的優點和原理。並考慮2種回收機制
答:Java語言中一個顯著的特點就是引入了垃圾回收機制,使c++程序員最頭疼的內存管理的問題迎刃而解,它使得Java程序員在編寫程序的時候不再需要考慮內存管理。由於有個垃圾回收機制,Java中的對象不再有"作用域"的概念,只有對象的引用纔有"作用域"。垃圾回收可以有效的防止內存泄露,有效的使用可以使用的內存。垃圾回收器通常是作爲一個單獨的低級別的線程運行,不可預知的情況下對內存堆中已經死亡的或者長時間沒有使用的對象進行清楚和回收,程序員不能實時的調用垃圾回收器對某個對象或所有對象進行垃圾回收。回收機制有分代複製垃圾回收和標記垃圾回收,增量垃圾回收。
44、你所知道的集合類都有哪些?主要方法?
答:最常用的集合類是?List?和?Map。?List?的具體實現包括?ArrayList?和?Vector,它們是可變大小的列表,比較適合構建、存儲和操作任何類型對象的元素列表。?List?適用於按數值索引訪問元素的情形。?Map?提供了一個更通用的元素存儲方法。?Map?集合類用於存儲元素對(稱作"鍵"和"值"),其中每個鍵映射到一個值。
45、描述一下JVM加載class文件的原理機制?
答:JVM中類的裝載是由ClassLoader和它的子類來實現的,Java?ClassLoader?是一個重要的Java運行時系統組件。它負責在運行時查找和裝入類文件的類。
46、排序都有哪幾種方法?請列舉
答:??排序的方法有:插入排序(直接插入排序、希爾排序),交換排序(冒泡排序、快速排序),選擇排序(直接選擇排序、堆排序),歸併排序,分配排序(箱排序、基數排序)快速排序的僞代碼。/?/使用快速排序方法對a[?0?:n-?1?]排序從a[?0?:n-?1?]中選擇一個元素作爲m?i?d?d?l?e,該元素爲支點把餘下的元素分割爲兩段left?和r?i?g?h?t,使得l?e?f?t中的元素都小於等於支點,而right?中的元素都大於等於支點遞歸地使用快速排序方法對left?進行排序遞歸地使用快速排序方法對right?進行排序所得結果爲l?e?f?t?+?m?i?d?d?l?e?+?r?i?g?h?t
47、JAVA語言如何進行異常處理,關鍵字:throws,throw,try,catch,finally分別代表什麼意義?在try塊中可以拋出異常嗎?
答:Java通過面向對象的方法進行異常處理,把各種不同的異常進行分類,並提供了良好的接口。在Java中,每個異常都是一個對象,它是Throwable類或其它子類的實例。當一個方法出現異常後便拋出一個異常對象,該對象中包含有異常信息,調用這個對象的方法可以捕獲到這個異常並進行處理。Java的異常處理是通過5個關鍵詞來實現的:try、catch、throw、throws和finally。一般情況下是用try來執行一段程序,如果出現異常,系統會拋出(throws)一個異常,這時候你可以通過它的類型來捕捉(catch)它,或最後(finally)由缺省處理器來處理。用try來指定一塊預防所有"異常"的程序。緊跟在try程序後面,應包含一個catch子句來指定你想要捕捉的"異常"的類型。throw語句用來明確地拋出一個"異常"。throws用來標明一個成員函數可能拋出的各種"異常"。Finally爲確保一段代碼不管發生什麼"異常"都被執行一段代碼。可以在一個成員函數調用的外面寫一個try語句,在這個成員函數內部寫另一個try語句保護其他代碼。每當遇到一個try語句,"異常"的框架就放到堆棧上面,直到所有的try語句都完成。如果下一級的try語句沒有對某種"異常"進行處理,堆棧就會展開,直到遇到有處理這種"異常"的try語句。
48、一個".java"源文件中是否可以包括多個類(不是內部類)?有什麼限制?
答:可以。必須只有一個類名與文件名相同。
49、java中有幾種類型的流?JDK爲每種類型的流提供了一些抽象類以供繼承,請說出他們分別是哪些類?
答:字節流,字符流。字節流繼承於InputStream?OutputStream,字符流繼承於InputStreamReader?OutputStreamWriter。在java.io包中還有許多其他的流,主要是爲了提高性能和使用方便。
50、java中會存在內存泄漏嗎,請簡單描述。
答:會。自己實現堆載的數據結構時有可能會出現內存泄露,可參看effective java.
51、java中實現多態的機制是什麼?
答:方法的重寫Overriding和重載Overloading是Java多態性的不同表現。重寫Overriding是父類與子類之間多態性的一種表現,重載Overloading是一個類中多態性的一種表現。
52、垃圾回收器的基本原理是什麼?垃圾回收器可以馬上回收內存嗎?有什麼辦法主動通知虛擬機進行垃圾回收
答:對於GC來說,當程序員創建對象時,GC就開始監控這個對象的地址、大小以及使用情況。通常,GC採用有向圖的方式記錄和管理堆(heap)中的所有對象。通過這種方式確定哪些對象是"可達的",哪些對象是"不可達的"。當GC確定一些對象爲"不可達"時,GC就有責任回收這些內存空間。可以。程序員可以手動執行System.gc(),通知GC運行,但是Java語言規範並不保證GC一定會執行。
53、靜態變量和實例變量的區別?
答:static?i?=?10;?//常量???class?A?a;??a.i?=10;//可變
54、什麼是java序列化,如何實現java序列化?
答:序列化就是一種用來處理對象流的機制,所謂對象流也就是將對象的內容進行流化。可以對流化後的對象進行讀寫操作,也可將流化後的對象傳輸於網絡之間。序列化是爲了解決在對對象流進行讀寫操作時所引發的問題。序列化的實現:將需要被序列化的類實現Serializable接口,該接口沒有需要實現的方法,implements?Serializable只是爲了標註該對象是可被序列化的,然後使用一個輸出流(如:FileOutputStream)來構造一個ObjectOutputStream(對象流)對象,接着,使用ObjectOutputStream對象的writeObject(Object?obj)方法就可以將參數爲obj的對象寫出(即保存其狀態),要恢復的話則用輸入流。
55、是否可以從一個static方法內部發出對非static方法的調用?
答:不可以,如果其中包含對象的method();不能保證對象初始化.
56、寫clone()方法時,通常都有一行代碼,是什麼?
答:Clone?有缺省行爲,super.clone();他負責產生正確大小的空間,並逐位複製。

57、在JAVA中,如何跳出當前的多重嵌套循環?
答:用break;?return?方法。
58、List、Map、Set三個接口,存取元素時,各有什麼特點?
答:List?以特定次序來持有元素,可有重複元素。Set?無法擁有重複元素,內部排序。Map?保存key-value值,value可多值。
59、說出一些常用的類,包,接口,請各舉5個
答:常用的類:BufferedReader??BufferedWriter??FileReader??FileWirter??String??Integer常用的包:java.lang??java.awt??java.io??java.util??java.sql常用的接口:Remote??List??Map??Document??NodeList
------------------------------------------------------------------------------------------------------------------
線程編程方面? ?
60、java中有幾種方法可以實現一個線程?用什麼關鍵字修飾同步方法??stop()和suspend()方法爲何不推薦使用?
答:有兩種實現方法,分別是繼承Thread類與實現Runnable接口用synchronized關鍵字修飾同步方法反對使用stop(),是因爲它不安全。它會解除由線程獲取的所有鎖定,而且如果對象處於一種不連貫狀態,那麼其他線程能在那種狀態下檢查和修改它們。結果很難檢查出真正的問題所在。suspend()方法容易發生死鎖。調用suspend()的時候,目標線程會停下來,但卻仍然持有在這之前獲得的鎖定。此時,其他任何線程都不能訪問鎖定的資源,除非被"掛起"的線程恢復運行。對任何線程來說,如果它們想恢復目標線程,同時又試圖使用任何一個鎖定的資源,就會造成死鎖。所以不應該使用suspend(),而應在自己的Thread類中置入一個標誌,指出線程應該活動還是掛起。若標誌指出線程應該掛起,便用wait()命其進入等待狀態。若標誌指出線程應當恢復,則用一個notify()重新啓動線程。
61、sleep()?和?wait()?有什麼區別??
答:sleep是線程類(Thread)的方法,導致此線程暫停執行指定時間,給執行機會給其他線程,但是監控狀態依然保持,到時後會自動恢復。調用sleep不會釋放對象鎖。wait是Object類的方法,對此對象調用wait方法導致本線程放棄對象鎖,進入等待此對象的等待鎖定池,只有針對此對象發出notify方法(或notifyAll)後本線程才進入對象鎖定池準備獲得對象鎖進入運行狀態。
62、同步和異步有何異同,在什麼情況下分別使用他們?舉例說明。
答:如果數據將在線程間共享。例如正在寫的數據以後可能被另一個線程讀到,或者正在讀的數據可能已經被另一個線程寫過了,那麼這些數據就是共享數據,必須進行同步存取。當應用程序在對象上調用了一個需要花費很長時間來執行的方法,並且不希望讓程序等待方法的返回時,就應該使用異步編程,在很多情況下采用異步途徑往往更有效率。
63、啓動一個線程是用run()還是start()?
答:啓動一個線程是調用start()方法,使線程所代表的虛擬處理機處於可運行狀態,這意味着它可以由JVM調度並執行。這並不意味着線程就會立即運行。run()方法可以產生必須退出的標誌來停止一個線程。?
64、當一個線程進入一個對象的一個synchronized方法後,其它線程是否可進入此對象的其它方法?
答:不能,一個對象的一個synchronized方法只能由一個線程訪問。
65、請說出你所知道的線程同步的方法。
答:wait():使一個線程處於等待狀態,並且釋放所持有的對象的lock。sleep():使一個正在運行的線程處於睡眠狀態,是一個靜態方法,調用此方法要捕捉InterruptedException異常。notify():喚醒一個處於等待狀態的線程,注意的是在調用此方法的時候,並不能確切的喚醒某一個等待狀態的線程,而是由JVM確定喚醒哪個線程,而且不是按優先級。Allnotity():喚醒所有處入等待狀態的線程,注意並不是給所有喚醒線程一個對象的鎖,而是讓它們競爭。
66、多線程有幾種實現方法,都是什麼?同步有幾種實現方法,都是什麼??
答:多線程有兩種實現方法,分別是繼承Thread類與實現Runnable接口?同步的實現方面有兩種,分別是synchronized,wait與notify67、線程的基本概念、線程的基本狀態以及狀態之間的關係答:線程指在程序執行過程中,能夠執行程序代碼的一個執行單位,每個程序至少都有一個線程,也就是程序本身。Java中的線程有四種狀態分別是:運行、就緒、掛起、結束
68、簡述synchronized和java.util.concurrent.locks.Lock的異同??
答:主要相同點:Lock能完成synchronized所實現的所有功能主要不同點:Lock有比synchronized更精確的線程語義和更好的性能。synchronized會自動釋放鎖,而Lock一定要求程序員手工釋放,並且必須在finally從句中釋放。
------------------------------------------------------------------------------------------------------------------
Jsp方面


70、jsp有哪些內置對象?作用分別是什麼?
答:JSP共有以下9種基本內置組件(可與ASP的6種內部組件相對應):  
request 用戶端請求,此請求會包含來自GET/POST請求的參數 ??
response 網頁傳回用戶端的迴應 ??
pageContext 網頁的屬性是在這裏管理 ??
session 與請求有關的會話期 ??
application servlet 正在執行的內容 ??
out 用來傳送回應的輸出??
config servlet的構架部件 ??
page JSP網頁本身 ??
exception 針對錯誤網頁,未捕捉的例外


71、jsp有哪些動作?作用分別是什麼?
答:JSP共有以下6種基本動作??
jsp:include:在頁面被請求的時候引入一個文件。 ??
jsp:useBean:尋找或者實例化一個JavaBean。 ??
jsp:setProperty:設置JavaBean的屬性。 ??
jsp:getProperty:輸出某個JavaBean的屬性。 ??
jsp:forward:把請求轉到一個新的頁面。 ??
jsp:plugin:根據瀏覽器類型爲Java插件生成OBJECT或EMBED標記


73、兩種跳轉方式分別是什麼?有什麼區別?
答:有兩種,分別爲:? <jsp:include page="included.jsp" flush="true">? <jsp:forward page= "nextpage.jsp"/>前者頁面不會轉向include所指的頁面,只是顯示該頁的結果,主頁面還是原來的頁面。執行完後還會回來,相當於函數調用。並且可以帶參數.後者完全轉向新頁面,不會再回來。相當於go to 語句。
74、JSP的內置對象及方法。
答:request表示HttpServletRequest對象。它包含了有關瀏覽器請求的信息,並且提供了幾個用於獲取cookie,?header,?和session數據的有用的方法。?????
response表示HttpServletResponse對象,並提供了幾個用於設置送回?瀏覽器的響應的方法(如cookies,頭信息等)?????
out對象是javax.jsp.JspWriter的一個實例,並提供了幾個方法使你能用於向瀏覽器回送輸出結果。?????
pageContext表示一個javax.servlet.jsp.PageContext對象。它是用於方便存取各種範圍的名字空間、servlet相關的對象的API,並且包裝了通用的servlet相關功能的方法。?????
session表示一個請求的javax.servlet.http.HttpSession對象。Session可以存貯用戶的狀態信息?????
applicaton?表示一個javax.servle.ServletContext對象。這有助於查找有關servlet引擎和servlet環境的信息?????
config表示一個javax.servlet.ServletConfig對象。該對象用於存取servlet實例的初始化參數。?????
page表示從該頁面產生的一個servlet實例
--------------------------------------------------------------------------------------------------------
Servlet方面
75、說一說Servlet的生命週期?
答:servlet有良好的生存期的定義,包括加載和實例化、初始化、處理請求以及服務結束。這個生存期由javax.servlet.Servlet接口的init,service和destroy方法表達。 Servlet被服務器實例化後,容器運行其init方法,請求到達時運行其service方法,service方法自動派遣運行與請求對應的doXXX方法(doGet,doPost)等,當服務器決定將實例銷燬的時候調用其destroy方法。與cgi的區別在於servlet處於服務器進程中,它通過多線程方式運行其service方法,一個實例可以服務於多個請求,並且其實例一般不會銷燬,而CGI對每個請求都產生新的進程,服務完成後就銷燬,所以效率上低於servlet。
76、JAVA SERVLET API中forward() 與redirect()的區別?
答:前者僅是容器中控制權的轉向,在客戶端瀏覽器地址欄中不會顯示出轉向後的地址;後者則是完全的跳轉,瀏覽器將會得到跳轉的地址,並重新發送請求鏈接。這樣,從瀏覽器的地址欄中可以看到跳轉後的鏈接地址。所以,前者更加高效,在前者可以滿足需要時,儘量使用forward()方法,並且,這樣也有助於隱藏實際的鏈接。在有些情況下,比如,需要跳轉到一個其它服務器上的資源,則必須使用sendRedirect()方法。
77、Servlet的基本架構
答:public class ServletName extends HttpServlet
{?
public void doPost(HttpServletRequest request, HttpServletResponse response) throws????? ServletException, IOException?
{????? }?
public void doGet(HttpServletRequest request, HttpServletResponse response) throws????? ServletException, IOException?
{????? }
}
78、什麼情況下調用doGet()和doPost()?
答:Jsp頁面中的form標籤裏的method屬性爲get時調用doGet(),爲post時調用doPost()。
79、servlet的生命週期
答:web容器加載servlet,生命週期開始。通過調用servlet的init()方法進行servlet的初始化。通過調用service()方法實現,根據請求的不同調用不同的do***()方法。結束服務,web容器調用servlet的destroy()方法。
80、如何現實servlet的單線程模式
答:<%@?page?isThreadSafe="false"%>
81、頁面間對象傳遞的方法答:request,session,application,cookie等
82、JSP和Servlet有哪些相同點和不同點,他們之間的聯繫是什麼??
答:JSP是Servlet技術的擴展,本質上是Servlet的簡易方式,更強調應用的外表表達。JSP編譯後是"類servlet"。Servlet和JSP最主要的不同點在於,Servlet的應用邏輯是在Java文件中,並且完全從表示層中的HTML裏分離開來。而JSP的情況是Java和HTML可以組合成一個擴展名爲.jsp的文件。JSP側重於視圖,Servlet主要用於控制邏輯。
83、四種會話跟蹤技術
答:會話作用域ServletsJSP?頁面描述page否是代表與一個頁面相關的對象和屬性。一個頁面由一個編譯好的?Java?servlet?類(可以帶有任何的?include?指令,但是沒有?include?動作)表示。這既包括?servlet?又包括被編譯成?servlet?的?JSP?頁面request是是代表與?Web?客戶機發出的一個請求相關的對象和屬性。一個請求可能跨越多個頁面,涉及多個?Web?組件(由於?forward?指令和?include?動作的關係)session是是代表與用於某個?Web?客戶機的一個用戶體驗相關的對象和屬性。一個?Web?會話可以也經常會跨越多個客戶機請求application是是代表與整個?Web?應用程序相關的對象和屬性。這實質上是跨越整個?Web?應用程序,包括多個頁面、請求和會話的一個全局作用域
84、Request對象的主要方法
答:setAttribute(String?name,Object):設置名字爲name的request的參數值
getAttribute(String?name):返回由name指定的屬性值getAttributeNames():返回request對象所有屬性的名字集合,結果是一個枚舉的實例
getCookies():返回客戶端的所有Cookie對象,結果是一個Cookie數組
getCharacterEncoding():返回請求中的字符編碼方式
getContentLength():返回請求的Body的長度
getHeader(String?name):獲得HTTP協議定義的文件頭信息
getHeaders(String?name):返回指定名字的
request?Header的所有值,結果是一個枚舉的實例
getHeaderNames():返回所以
request?Header的名字,結果是一個枚舉的實例
getInputStream():返回請求的輸入流,用於獲得請求中的數據
getMethod():獲得客戶端向服務器端傳送數據的方法
getParameter(String?name):獲得客戶端傳送給服務器端的有name指定的參數值
getParameterNames():獲得客戶端傳送給服務器端的所有參數的名字,結果是一個枚舉的實例
getParameterValues(String?name):獲得有name指定的參數的所有值
getProtocol():獲取客戶端向服務器端傳送數據所依據的協議名稱
getQueryString():獲得查詢字符串
getRequestURI():獲取發出請求字符串的客戶端地址getRemoteAddr():獲取客戶端的IP地址
getRemoteHost():獲取客戶端的名字
getSession([Boolean?create]):返回和請求相關iongetServerName():獲取服務器的名字
getServletPath():獲取客戶端所請求的腳本文件的路徑
getServerPort():獲取服務器的端口號removeAttribute(String?name):刪除請求中的一個屬性
85、我們在web應用開發過程中經常遇到輸出某種編碼的字符,如iso8859-1等,如何輸出一個某種編碼的字符串?答:??Public?String?translate?(String?str)?{????
String?tempStr?=?"";????
try?{??????
tempStr?=?new?String(str.getBytes("ISO-8859-1"),?"GBK");??????
tempStr?=?tempStr.trim();????
}????
catch?(Exception?e)?{??????
System.err.println(e.getMessage());????
}???
?return?tempStr;??
}
86、Servlet執行時一般實現哪幾個方法?
答:public void init(ServletConfig?config);
public ServletConfig getServletConfig()public?String?getServletInfo();
public void service(ServletRequest?request,ServletResponse?response);
public void destroy();


------------------------------------------------------------------------------------------------------------------------
114、MVC的各個部分都有那些技術來實現?如何實現?
答:MVC是Model-View-Controller的簡寫。"Model" 代表的是應用的業務邏輯(通過JavaBean,EJB組件實現), "View" 是應用的表示面(由JSP頁面產生),"Controller" 是提供應用的處理過程控制(一般是一個Servlet),通過這種設計模型把應用邏輯,處理過程和顯示邏輯分成不同的組件實現。這些組件可以進行交互和重用。
118、STRUTS的應用(如STRUTS架構)
答:Struts是採用Java Servlet/JavaServer Pages技術,開發Web應用程序的開放源碼的framework。 採用Struts能開發出基於MVC(Model-View-Controller)設計模式的應用構架。 Struts有如下的主要功能: 一.包含一個controller servlet,能將用戶的請求發送到相應的Action對象。 二.JSP自由tag庫,並且在controller servlet中提供關聯支持,幫助開發員創建交互式表單應用。 三.提供了一系列實用對象:XML處理、通過Java reflection APIs自動處理JavaBeans屬性、國際化的提示和消息。
127、MVC的各個部分都有那些技術來實現?如何實現??
答:MVC是Model-View-Controller的簡寫。"Model"?代表的是應用的業務邏輯(通過JavaBean,EJB組件實現),?"View"?是應用的表示面(由JSP頁面產生),"Controller"?是提供應用的處理過程控制(一般是一個Servlet),通過這種設計模型把應用邏輯,處理過程和顯示邏輯分成不同的組件實現。這些組件可以進行交互和重用。
128、開發中都用到了那些設計模式?用在什麼場合?
答:每個模式都描述了一個在我們的環境中不斷出現的問題,然後描述了該問題的解決方案的核心。通過這種方式,你可以無數次地使用那些已有的解決方案,無需在重複相同的工作。主要用到了MVC的設計模式。用來開發JSP/Servlet或者J2EE的相關應用。簡單工廠模式等。
130、j2ee常用的設計模式?說明工廠模式。?
答:Java中的23種設計模式:Factory(工廠模式),??????Builder(建造模式),???????Factory?Method(工廠方法模式),Prototype(原始模型模式),Singleton(單例模式),????Facade(門面模式),Adapter(適配器模式),????Bridge(橋樑模式),????????Composite(合成模式),Decorator(裝飾模式),????Flyweight(享元模式),?????Proxy(代理模式),Command(命令模式),??????Interpreter(解釋器模式),?Visitor(訪問者模式),Iterator(迭代子模式),???Mediator(調停者模式),????Memento(備忘錄模式),Observer(觀察者模式),???State(狀態模式),?????????Strategy(策略模式),Template?Method(模板方法模式),?Chain?Of?Responsibleity(責任鏈模式)
工廠模式:工廠模式是一種經常被使用到的模式,根據工廠模式實現的類可以根據提供的數據生成一組類中某一個類的實例,通常這一組類有一個公共的抽象父類並且實現了相同的方法,但是這些方法針對不同的數據進行了不同的操作。首先需要定義一個基類,該類的子類通過不同的方法實現了基類中的方法。然後需要定義一個工廠類,工廠類可以根據條件生成不同的子類實例。當得到子類的實例後,開發人員可以調用基類中的方法而不必考慮到底返回的是哪一個子類的實例。
131、UML方面答:標準建模語言UML。用例圖,靜態圖(包括類圖、對象圖和包圖),行爲圖,交互圖(順序圖,合作圖),實現圖,UML方面?


4. 當我們擴展ActionForm, 通常需要覆蓋ActionForm的哪些方法?這些方法具體的作用是什麼?
通常需要覆蓋reset方法和validate方法。 reset方法用於當一個請求處理完後,清除或重置ActionForm的數據, 因爲Struts會重複使用ActionForm實例。validate方法在HTML表單數據設置到ActionForm對象後, 對錶單數據進行校驗。只有當struts-config.xml文件中相應的action中的屬性validate=”true”設置後validate方法纔會被調用。如果validate方法返回的ActionErrors對象中含有ActionMessage對象,則表示表單驗證失敗,返回到輸入頁面(action中所配置的input參數值)。否則ActionServlet根據ActionMapping實例所包含的映射信息決定將請求轉發給哪個Action。


5. 解釋FormBean的生命週期。
FormBean的生命週期如圖:
(圖就不看了)


FormBean的生命週期說明:
當Struts控制器ActionServlet接受到某個請求的時候, ActionServlet將根據配置信息將請求委託給相應的Action類處理, 如果所委託的Action有關聯的Form Bean, 將根據struts配置文件(struts-config.xml)中該action的配置, 在請求(request)或會話(session)範圍內查找指定的Form Bean。如果在指定範圍內沒有找到Form Bean實例, 則創建一個新的Form Bean實例並保存在指定範圍內。接下來, Struts將調用Form Bean的reset方法,這樣就會執行所有需要在填充Form Bean之前的處理。 此後, Struts將使用接受到的請求中的數據填充Form Bean。接着, 根據action配置決定是否調用validate方法。如果調用validate方法,若validate方法返回的ActionErrors對象爲null或者不包含ActionMessage對象,則調用Action的execute方法。否則直接調用Action的execute方法。 在validate方法返回錯誤信息的情況下,將轉到輸入頁面。


6. 什麼是動態Form Bean, 請解釋動態Form Bean的使用,動態FormBean如何進行表單驗證?應用動態Form Bean有什麼優點?
DynaActionForm是ActionForm的子類, 從DynaActionForm繼承出來的Form Bean或者在struts-config.xml中類型(type)爲DynaActionForm的Form Bean稱爲動態Form Bean。
動態Form Bean的聲明方式與Form Bean類似, 動態Form Bean的屬性通過在struts-config.xml文件中配置來實現, 可以不聲明自己的Form Bean類。如:
<form-bean name=”loginForm” type=”org.apache.struts.action.DynaActionForm”>
<form-property name=”name” type=”java.lang.String” initial=””/>
<form-property name=”password” type=”java.lang.String” initial=””/>
<form-property name=”userType” type=”java.lang.String” initial=”1”/>
</form-bean>
可以使用initial屬性來設置初始值, 代替reset方法。驗證功能可以放到Action類中去做或者使用Validator框架。
如果碰到需要實現reset/validator方法的特殊情況, 則可以從DynaActionForm擴展產生自己的類來覆蓋這兩個方法, 只需要將type=”org.apache.struts.action.DynaActionForm”改成自己寫的類即可。
由於Form Bean的屬性需要跟輸入表單的字段對應, 如果爲每個界面都創建一個自己的ActionForm有時會顯得很麻煩,應用動態Form Bean的優點主要在於可以省去自己寫Form Bean,通過配置即可實現。


7. 如何自定義請求控制器?
當ActionServlet接受到客戶請求後,會調用RequestProcessor類的各個processXXX方法來進行請求的處理,其中processPreprocess()方法在請求處理前調用, 我們可以覆蓋它來自定義操作, 比如登錄驗證等。如:
package com.runwit.util.RequestProcessor;
//import....
public class LoggedRequestProcessor extends RequestProcessor {
public boolean processPreprocess(HttpServletRequest request, HttpServletResponse response) {
//......
}
}
要使用改自定義請求控制器, 需要在struts-config.xml中配置
<controller processorClass=” com.runwit.util.RequestProcessor.LoggedRequestProcessor”/>


8. 常用Struts內置Action的含義與使用
org.apache.struts.actions.DispatchAction
org.apache.struts.actions.MappingDispatchAction
org.apache.struts.actions.LookupDispatchAction
org.apache.struts.actions.ForwardAction


9、Struts中的分頁你是怎麼做的?


10、Struts有哪幾個主要的標記庫?每個標記庫中有哪些標記?


11、Struts中的formBean可以被多個Action類使用嗎?一個Action類是否可以使用不同的formBean, 你在什麼樣的情況下使用到了?


12、Struts中的文件上傳怎麼做?
Struts中提供了FormFile類,上傳後可以從FormFile類中得到byte[]。
//FormFile


13、談談Struts中如何使用Validator插件(框架)的過程。Validator中定義了哪些規則?


14、如果不用客戶端驗證,DynaActionForm中如何來處理服務器端驗證?


15、如何防止表單重複提交


1.Struts 2的基本流程
  Struts 2框架由3個部分組成:核心控制器FilterDispatcher、業務控制器和用戶實現的業務邏輯組件。在這3個部分裏,Struts 2框架提供了核心控制器FilterDispatcher,而用戶需要實現業務控制器和業務邏輯組件。
2.核心控制器:FilterDispatcher
  FilterDispatcher是Struts 2框架的核心控制器,該控制器作爲一個Filter運行在Web應用中,它負責攔截所有的用戶請求,當用戶請求到達時,該Filter會過濾用戶請求。如果用戶請求以action結尾,該請求將被轉入Struts 2框架處理。


Struts 2框架獲得了*.action請求後,將根據*.action請求的前面部分決定調用哪個業務邏輯組件,例如,對於login.action請求,Struts 2調用名爲login的Action來處理該請求。


Struts 2應用中的Action都被定義在struts.xml文件中,在該文件中定義Action時,定義了該Action的name屬性和class屬性,其中name屬性決定了該Action處理哪個用戶請求,而class屬性決定了該Action的實現類。


Struts 2用於處理用戶請求的Action實例,並不是用戶實現的業務控制器,而是Action代理——因爲用戶實現的業務控制器並沒有與Servlet API耦合,顯然無法處理用戶請求。而Struts 2框架提供了系列攔截器,該系列攔截器負責將HttpServletRequest請求中的請求參數解析出來,傳入到Action中,並回調Action 的execute方法來處理用戶請求。


顯然,上面的處理過程是典型的AOP(面向切面編程)處理方式。圖3.19顯示了這種處理模型。

 

圖3.19  Struts 2的攔截器和Action


從圖3.19中可以看出,用戶實現的Action類僅僅是Struts 2的Action代理的代理目標。用戶實現的業務控制器(Action)則包含了對用戶請求的處理。用戶的請求數據包含在 HttpServletRequest對象裏,而用戶的Action類無需訪問HttpServletRequest對象。攔截器負責將 HttpServletRequest裏的請求數據解析出來,並傳給業務邏輯組件Action實例。
3.業務控制器
  正如從圖3.19所看到的,業務控制器組件就是用戶實現Action類的實例,Action類裏通常包含了一個execute方法,該方法返回一個字符串——該字符串就是一個邏輯視圖名,當業務控制器處理完用戶請求後,根據處理結果不同,execute方法返回不同字符串   ——每個字符串對應一個視圖名。


程序員開發出系統所需要的業務控制器後,還需要配置Struts 2的Action,即需要配置Action的如下三個部分定義:


—  Action所處理的URL。


—  Action組件所對應的實現類。


—  Action裏包含的邏輯視圖和物理資源之間的對應關係。


每個Action都要處理一個用戶請求,而用戶請求總是包含了指定URL。當Filter Dispatcher攔截到用戶請求後,根據請求的URL和Action處理URL之間的對應關係來處理轉發。
4.Struts 2的模型組件
  實際上,模型組件已經超出了MVC框架的覆蓋範圍。對於Struts 2框架而言,通常沒有爲模型組件的實現提供太多的幫助。


文本框: 圖3.20 控制器調用模型組件Java EE應用裏的模型組件,通常指系統的業務邏輯組件。而隱藏在系統的業務邏輯組件下面的,可能還包含了DAO、領域對象等組件。


通常,MVC框架裏的業務控制器會調用模型組件的方法來處理用戶請求。也就是說,業務邏輯控制器不會對用戶請求進行任何實際處理,用戶請求最終由模型組件負責處理。業務控制器只是中間負責調度的調度器,這也是稱Action爲控制器的原因。

 

圖3.20顯示了這種處理流程。


提示  在圖3.20中看到Action調用業務邏輯組件的方法。當控制器需要獲得業務邏輯組件實例時,通常並不會直接獲取業務邏輯組件實例,而是通過工廠模式來獲得業務邏輯組件的實例;或者利用其他IoC容器(如Spring容器)來管理業務邏輯組件的實例。
5.Struts 2的視圖組件
  Struts 2已經改變了Struts 1只能使用JSP作爲視圖技術的現狀,Struts 2允許使用其他的模板技術,如FreeMarker、Velocity作爲視圖技術。


當Struts 2的控制器返回邏輯視圖名時,邏輯視圖並未與任何的視圖技術關聯,僅僅是返回一個字符串,該字符串作爲邏輯視圖名。


當我們在struts.xml文件中配置 Action時,不僅需要指定Action的name屬性和class屬性,還要爲Action元素指定系列result子元素,每個result子元素定義一個邏輯視圖和物理視圖之間的映射。前面所介紹的應用都使用了JSP技術作爲視圖,故配置result子元素時沒有指定type屬性,默認使用JSP 作爲視圖資源。


如果需要在Struts 2中使用其他視圖技術,則可以在配置result子元素時,指定相應的type屬性即可。例如,如果需要使用FreeMarker,則爲result指定值爲freemarker的type屬性;如果想使用Velocity模板技術作爲視圖資源,則爲result指定值爲velocity的type屬性……
6.Struts 2的運行流程
  經過上面介紹,我們發現Struts 2框架的運行流程非常類似於WebWork框架的流程。


提示  在Struts 2的官方站點,我們可以找到如下說法:Essentially,Struts 2.0 is the technical equivalent of WebWork 2.3。Aside from the package and property renaming,it isn't much different than,say,migrating from WebWork 2.1 to 2.2——意思是說:Struts 2.0技術等同於WebWork 2.3框架,除了包和屬性被改名外。從WebWork 2.2遷移到Struts 2不會比從WebWork 2.1遷移到WebWork 2.2更復雜。


這裏我們可以看到,Struts 2其實就是WebWork 2.2的升級版,這也就不難理解:爲什麼WebWork和Struts 2如此相似!


Struts Struts只是一個MVC框架(Framework),用於快速開發Java Web應用。Struts實現的重點在C(Controller),包括ActionServlet/RequestProcessor和我們定製的Action,也爲V(View)提供了一系列定製標籤(Custom Tag)。但Struts幾乎沒有涉及M(Model),所以Struts可以採用JAVA實現的任何形式的商業邏輯。 Spring Spring是一個輕型容器(light-weight container),其核心是Bean工廠(Bean Factory),用以構造我們所需要的M(Model)。在此基礎之上,
Spring提供了AOP(Aspect-Oriented Programming, 面向層面的編程)的實現,用它來提供非管理環境下申明方式的事務、安全等服務;對Bean工廠的擴展ApplicationContext更加方便我們實現J2EE的應用;DAO/ORM的實現方便我們進行數據庫的開發;Web MVC和Spring Web提供了Java Web應用的框架或與其他流行的Web框架進行集成。 就是說可將兩者一起使用,達到將兩者自身的特點進行互補。 Hibernate Hibernate是一個免費的開源Java包,它使得與關係數據庫
打交道變得十分輕鬆,就像您的數據庫中包含每天使用的普通Java對象一樣,同時不必考慮如何把它們從神祕的數據庫表中取出(或放回到數據庫表中)。它解放了您,使您可以專注於應用程序的對象和功能,而不必擔心如何保存它們或稍後如何找到它們。 EJB 一個技術規範:EJB 從技術上而言不是一種"產品" EJB 是一種標準描述了構建應用組件要解決的: 可擴展 (Scalable) 分佈式 (Distributed) 事務處理 (Transactional) 數據存儲 (Persistent) 安全性 (Secure) ANT -. Ant簡介
 Ant是一個類似make的工具,用來編譯/運行/測試java程序。 構建、包裝和發佈過程中幾乎每一件事都可以由Ant的任務來處理. 二.Ant的安裝及配置 你可以從Jakata網站下載預編譯的ANT,解壓至任一目錄; 設置自己的環境變量,即ANT_HOME,指向解壓目錄; 設置JAVA_HOME環境變量,指向jdk的根目錄; 三:用ant管理項目 Ant一啓動就會自動地加載一個叫做Build.xml的項目配置文件。如果想給這個項目配置文件取別的名字,你可以使用buildfile標記來運行ant,就像下面這樣: ant -buildfile Project_configuration.xml 主要特點: 使用xml文件作爲配置文件,即build.xml; 可與junit作無縫整合,達到系統測試、編譯到發佈的功能; 強大、詳細的報表功能; 控制靈活,可自定義要執行的任務組合。


1 說說Struts的優點、缺點
Struts是開源軟件,使開發者能更深入的瞭解其內部實現機制。
Struts 優點:
業界”標準”(很多成功案例),學習資源豐富。
Struts的優點主要集中體現在兩個方面:Taglib和頁面導航。
a、利用Struts提供的taglib可以大大節約開發時間。
b、維護擴展比較方便。通過一個配置文件,即可把握整個系統各部分之間的聯繫,這對於後期的維護有着莫大的好處。
c、表現與邏輯分離
d、表單驗證解決了請求數據的驗證問題,增強了系統健壯性。
e、便於團隊開發
Struts缺點:
a、大量的使用標籤,對於初學者難度較大。
b、ActionForms使用不便、無法進行單元測試(StrutsTestCase只能用於集成)
Struts提供了幾個標籤庫?都是什麼標籤庫?
Struts提供了五個標籤庫,即:HTML、Bean、Logic、Template和Nested。
HTML 標籤 用來創建能夠和Struts 框架和其他相應的HTML 標籤交互的HTML 輸入表單
Bean 標籤      在訪問JavaBeans 及其屬性,以及定義一個新的bean 時使用
Logic 標籤      管理條件產生的輸出和對象集產生的循環
Template 標籤      隨着Tiles框架包的出現,此標記已開始減少使用
Nested 標籤      增強對其他的Struts 標籤的嵌套使用的能力
2 分析一下struts是如何實現MVC的。
Struts採用jsp作爲MVC的視圖,由ActionServlet具體指定的action動作類作爲控制器即MVC中的C,負責視圖與模型之間的交互。控制器的每個入口點都由名爲struts-config.xml的配置文件設置。該文件把來自視圖的請求映射爲特定的JAVA類以進行相應的處理,控制器還指定下一個視圖的位置。Struts中的模型主要指的就是javabean,它是模型的代表,主要封裝數據和業務邏輯。
3 說說Struts的處理流程:
控制器進行初始化工作,讀取配置文件,爲不同的Struts模塊初始化相應的ModuleConfig對象。控制器接收Http請求,並從ActionConfig中找出對應於該請求的Action子類,如果沒有對應的Action,控制器直接將請求轉發給JSP或者靜態頁面,否則控制器將請求分發至具體的Action類進行處理。
在控制器調用具體的Action的Execute方法之前,ActionForm對象將利用Http請求中的參數來填充自已。還可以在 ActionForm類中調用Validate方法來檢查請求參數的合法性,並且可以返回一個包含所有錯誤信息的ActionErrors對象。
執行具體的的Execute的方法,它負責執行相應的業務邏輯。執行完後,返回一個ActionForward對象,控制器通過該 ActionForward對象來進行轉發工作。也可以把Action要處理的業務邏輯封裝在JavaBean中,如果系統中還有EJB,那麼通過 JavaBean調用EJB以完成業務處理;如果沒有EJB,那麼就直接在JavaBean中連接數據庫,進行數據庫相關的操作。
4 說說Struts幾個關鍵對象的作用:Action、ActionServlet、ActionForm


Struts 2框架本身大致可以分爲3個部分:核心控制器FilterDispatcher、業務控制器Action和用戶實現的企業業務邏輯組件。核心控制器FilterDispatcher是Struts 2框架的基礎,包含了框架內部的控制流程和處理機制。業務控制器Action和業務邏輯組件是需要用戶來自己實現的。用戶在開發Action和業務邏輯組件的同時,還需要編寫相關的配置文件,供核心控制器FilterDispatcher來使用。 Struts 2的工作流程相對於Struts 1要簡單,與WebWork框架基本相同,所以說Struts 2是WebWork的升級版本。基本簡要流程如下:1、客戶端瀏覽器發出HTTP請求。2、根據web.xml配置,該請求被FilterDispatcher接收。3、根據struts.xml配置,找到需要調用的Action類和方法, 並通過IoC方式,將值注入給Aciton。4、Action調用業務邏輯組件處理業務邏輯,這一步包含表單驗證。5、Action執行完畢,根據struts.xml中的配置找到對應的返回結果result,並跳轉到相應頁面。6、返回HTTP響應到客戶端瀏覽器。


補充:
一、用自己的話簡要闡述struts2的執行流程。


Struts 2框架本身大致可以分爲3個部分:
核心控制器FilterDispatcher、
業務控制器Action
用戶實現的企業業務邏輯組件。

核心控制器FilterDispatcher是Struts 2框架的基礎,包含了框架內部的控制流程和處理機制。業務控制器Action和業務邏輯組件是需要用戶來自己實現的。用戶在開發Action和業務邏輯組件的同時,還需要編寫相關的配置文件,供核心控制器FilterDispatcher來使用。 Struts 2的工作流程相對於Struts 1要簡單,與WebWork框架基本相同,所以說Struts 2是WebWork的升級版本。基本簡要流程如下:1、客戶端瀏覽器發出HTTP請求。2、根據web.xml配置,該請求被FilterDispatcher接收。3、根據struts.xml配置,找到需要調用的Action類和方法, 並通過IoC方式,將值注入給Aciton。4、Action調用業務邏輯組件處理業務邏輯,這一步包含表單驗證。5、Action執行完畢,根據struts.xml中的配置找到對應的返回結果result,並跳轉到相應頁面。6、返回HTTP響應到客戶端瀏覽器

 


struts1是一個基於mvc之上的框架開源框架  可以讓我們更好的把mvc 模式更好的應用到web程序中  是爲了解決mvc模式中 複雜 繁瑣的視圖層jsp 頁面 出現大量的java 代碼 和程序中出現多個servlet 而出現的


優點:使mvc 中複雜的業務邏輯 更加清晰化
模塊化 擴展性好 適合團隊開發
      本身提供了大量的標籤 也更加的靈活 使程序員更加註重程序的業務邏輯
      支持國際化語言
      採用多個控制器 且所有控制器相互獨立工作
      有利於軟件工程化管理
     


缺點:配置文件太過於複雜
      每改變一次配置文件 都要重啓tomcat
      視圖與控制器間過於緊密連結
      aciontForm 不能測試


公司怎麼用的:
在web.xml 文件中配置servlet 和servlet-mapping一些屬性比如*.do/*.lxit 將所用的request 請求統一攔截到ActionServlet 中
然後在struts-config.xml配置文件中跳轉具體的類繼承Action 並重寫execute()方法操作棘突業務邏輯


經驗和教訓:
爲了防止編程過程中出現了亂碼 要寫一個過濾器來過濾字符
在配置文件中儘量的仔細 避免出現更多的錯誤

 


整體結構和源碼的實現:
struts 的核心類 是ActionServlet ModuleConfig requestProcessor
ActionServlet 是struts1 的一箇中央控制器 控制請求和業務邏輯
ModuleConfig 利用digester 對象解析讀取 struts-config.xml文件 並緩存ModuleConfig對象中
RequestProcessor負責處理每一個HTTP請求。


actionServlet 與servlet 一樣 具有生命週期


tomcat 啓動的時候 初始化配置文件 並調用ActionServletlei類裏面的init() 方法中的


initInternal(): 讀取資源文件 比如國際化語言的文件 錯誤 警告信息
initerOther():讀取web.xml 中(actionServlet) 配置路徑
initServlet(): 通過digester對象 解析web.xml文件中的servlet-mapping 信息


然後調用initModeleConfig() 採用digester 解析struts-config.xml中的配置信息 並緩存在ModuleConfig對象中


下面講下源碼:


用戶從頁面以*.do的形式發送url請求---->被ActionServlet類進行攔截 根據請求方式調doGet 或 doPost 方法


---->無論是doGet 還是doPost  都會 調用該類的process 方法進行---->該方法利用工廠模式產生一個RequestProcessor實例並調用


processor方法---->並在該方法中得到 一個path(該path 沒有任何前綴和後綴) 並在session 找到一個 瀏覽器的Locale信息 如果沒有就直接得到瀏覽器的Locale信息 並把Locale實例保存在


ssion範圍內---->然後根據用戶的url也就是 上面得到的path 找到對應 Actionmapping 如果沒有找到 則返回對應的錯誤信息


-->根據ActionMapping裏面的屬性信息利用反射機制填充到ActionForm-->然後進行驗證 如果不通過則把請求轉發到struts-config文件裏面


input屬性指定的 web組件 如果通過 就根據ActionMapping 利用單例模式得到Action對象 因爲是單例模式 所以後面的對象覆蓋前面的對象
這也是struts1中一個不足點


---->然後調用 Action中的execute方法返回ActionForward---->根據struts-config.xml 配置文件進行匹配並跳轉頁面


同類框架比較:
使得web應用程序的業務更加清晰 提取頁面大量的java代碼  提供了大量的標籤使頁面更加靈活


框架中學到的思想:
當開發的web應用程序中的邏輯業務比較複雜的時候 儘量使用框架 它會使你的業務邏輯更加結構化 減少大量的開發時間


寫一段能展現你javascript水平的代碼?
使用ajax 的步驟?
哪些場景下用到了servlet? 


struts 過濾器的使用?
web.xml 文件中配置 filter filter mapping filtername filterpatten 之類的 
實現filter 接口 實現 init doFilter destroy方法


struts1 的標籤庫?
html
logic:logic:empty logic:notEmpty logic:equal  
bean
tiles
nested


頁面怎樣循環迭代?
1.<logic:iterate  id="user" name="userList">
2.<s:iterator>


spring ioc 的優點?
1.因爲把對象生成放在了XML裏定義 需要換一個實現子類將會變的比較簡單
2.自動注入對象,不用手動的創建 管理
3.解藕,交給容器來管理 降低耦合度
缺點:
1.生成一個對象的步驟變複雜了
2.因爲對象的創建是採用的反射機制,所以在效率上有些損耗
3.


hibernate 與ibatis 的區別?
                             IBATIS                                             HIBERNATE
    ORM類型                  半自動                                                      一站式全自動
    映射關係               實體類和SQL語句                                               實體類和數據庫
    學習門檻                 容易                                                         3倍於IBATIS
    SQL 的 優化           方便,進行細粒度的優化                                       1 一般情況下,HIBERNATE 會把所有的字段都SELECT 2 UPDATE一般也是更新所有字段
    開發效率             IBATIS要求開發者編寫具體的SQL 語句                            HIBERNATE會自動生成SQL 語句
    數據庫移植           標準SQL方便移植  如果用到具體的數據庫sql則 不方便移植       移植方便




mysql 中左連結,右連結,全連結的區別?
左連結:SELECT * FROM stua LEFT JOIN stub ON stub.id = stua.`id` 
以stua 爲基準 相當於SELECT * FROM stua(不影響結果集) ON字句控制 stub 的列值符合顯示,還是不符合就用NULL替換
右連結則相反:
以stub 爲基準 相當於SELECT * FROM stub(不影響結果集) ON字句控制 stua 的列值符合顯示,還是不符合就用NULL替換
全連結:
SELECT * FROM stua  JOIN stub ON stub.id = stua.id
左右表中任何記錄都會選出來 只有全部符合的條件的數據纔會被

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章