Struts+Hibernate+Spring面試題合集及答案

Struts+Hibernate+Spring面試題合集及答案

Struts+Hibernate+Spring面試題合集 1html

1. Hibernate部分 2前端

1.1. Hibernate工做原理 2java

1.2. 什麼是Hibernate的併發機制?怎麼處理併發問題? 2web

1.3. Hibernate自帶的分頁機制是什麼?若是不使用Hibernate自帶的分頁,則採用什麼方式分頁? 3面試

1.4. hibernate的對象的三種持久化狀態,並給出解釋? 3spring

1.5. hibernate的三種狀態之間如何轉換 3sql

1.6. hibernate中一對多配置文件返回的是什麼? 4數據庫

1.7. update()和saveOrUpdate()的區別? 4express

1.8. hibernate拒絕鏈接、服務器崩潰的緣由?最少寫5 4apache

1.9. hibernate如何管理緩存 4

1.10. 使用Hibernate的優勢: 6

1.11. Hibernate是如何延遲加載? 6

1.12. Hibernate中怎樣實現類之間的關係?(如:一對多、多對多的關係) 6

1.13. Hibernate的查詢方式 7

1.14. 如何優化Hibernate 7

2 Struts部分 7

4.1. Struts1.x工做機制? 7

4.2. 爲何要用Struts1.x 8

4.3. Struts1.xvalidate框架是如何驗證的? 8

4.4. 說下Struts的設計模式 8

4.5. 談談你mvc的理解 8

4.6. struts1.2struts2.0的區別?如何控制兩種框架中的單例模式? 9

4.7. struts如何實現國際化 9

4.8. struts2.0的經常使用標籤有哪些 10

4.9. struts中怎麼配置form-beanactiontiles 10

4.10. logic標籤有哪幾個? 12

4.11. action是單實例仍是多實例,爲何? 13

4.12. dispatchAction是用什麼技術實現的? 13

4.13. struts2.0mvc模式?與struts1.0的區別? 13

4.14. struts的處理流程。 13

4.15. Struts/webwork 的工做機制,它有哪些標籤 18

3 Spring部分 18

4.1. spring工做機制 18

4.2. 使用Spring的好處 19

4.3. spring是什麼?根據你的理解詳細談談你的看法。 19

4.4. 項目中如何體現Spring中的切面編程,具體說明。 20

4.5. spring在項目中如何充當粘合劑 20

4.6. spring的事務如何配置 20

4.7. transaction有那幾種實現 21

4 綜合部分 21

4.1. Hibernatespring中常出現的幾個異常 21

4.2. Hibernatejdbc的聯繫 22

4.3. Hibernatespring的聯繫 22

4.4. 項目中爲何使用SSH 23

 

1. Hibernate部分

1.1. Hibernate工做原理 

1.讀取並解析配置文件

2.讀取並解析映射信息,建立SessionFactory

3.打開Sesssion

4.建立事務Transation

5.持久化操做

6.提交事務

7.關閉Session

8.關閉SesstionFactory

1.2. 什麼是Hibernate的併發機制?怎麼處理併發問題?

  • Hibernate併發機制:

   a、Hibernate的Session對象是非線程安全的,對於單個請求,單個會話,單個的工做單元(即單個事務,單個線程),它一般只使用一次,

      而後就丟棄。

      若是一個Session 實例容許共享的話,那些支持併發運行的,例如Http request,session beans將會致使出現資源爭用。

      若是在Http Session中有hibernate的Session的話,就可能會出現同步訪問Http Session。只要用戶足夠快的點擊瀏覽器的「刷新」,

      就會致使兩個併發運行的線程使用同一個Session。

   b、多個事務併發訪問同一塊資源,可能會引起第一類丟失更新,髒讀,幻讀,不可重複讀,第二類丟失更新一系列的問題。

 

  • 解決方案:設置事務隔離級別。

     Serializable:串行化。隔離級別最高

             Repeatable Read:可重複讀

             Read Committed:已提交數據讀

             Read Uncommitted:未提交數據讀。隔離級別最差

             設置鎖:樂觀鎖和悲觀鎖。

             樂觀鎖:使用版本號或時間戳來檢測更新丟失,在<class>的映射中設置 optimistic-lock="all"能夠在沒有版本或者時間戳屬性映射的狀況下實現 版本檢查,此時Hibernate將比較一行記錄的每一個字段的狀態 行級悲觀鎖:Hibernate老是使用數據庫的鎖定機制,從不在內存中鎖定對象!只要爲JDBC鏈接指定一下隔 離級別,而後讓數據庫去搞定一切就夠了。類LockMode 定義了Hibernate所需的不一樣的鎖定級別:LockMode.UPGRADE,LockMode.UPGRADE_NOWAIT,LockMode.READ;

 

 

1.3. Hibernate自帶的分頁機制是什麼?若是不使用Hibernate自帶的分頁,則採用什麼方式分頁?

    一、hibernate自帶的分頁機制:得到Session對象後,從Session中得到Query對象。用Query.setFirstResult():設置要顯示的第一行數據,

       Query.setMaxResults():設置要顯示的最後一行數據。

    二、不使用hibernate自帶的分頁,可採用sql語句分頁,

       如:5:爲每頁顯示的記錄,2爲當前頁: select * top 5 from table where tabId not in (select tabId top (2-1)*5 from table);

   

1.4. hibernate的對象的三種持久化狀態,並給出解釋?

    不清楚hibernate的對象的三種持久化狀態,只知道hibernate對象的三種狀態,下面有介紹。

 

1.5. hibernate的三種狀態之間如何轉換

    當對象由瞬時狀態(Transient)一save()時,就變成了持久化狀態。

    當咱們在Session裏存儲對象的時候,實際是在Session的Map裏存了一份,

    也就是它的緩存裏放了一份,而後,又到數據庫裏存了一份,在緩存裏這一份叫持久對象(Persistent)。

    Session 一 Close()了,它的緩存也都關閉了,整個Session也就失效了,

    這個時候,這個對象變成了遊離狀態(Detached),但數據庫中仍是存在的。

    當遊離狀態(Detached)update()時,又變爲了持久狀態(Persistent)。

    當持久狀態(Persistent)delete()時,又變爲了瞬時狀態(Transient),

    此時,數據庫中沒有與之對應的記錄。

 

1.6. hibernate中一對多配置文件返回的是什麼?

    hibernate中一對多配置文件會相應的映射爲兩張表,而且它們之間的關係是一對多的。

例如:一個student和classes表的關係 。一個學生只能是一個班的,一個班能夠有多個學生。

 

1.7. update()和saveOrUpdate()的區別?

    update()和saveOrUpdate()是用來對跨Session的PO進行狀態管理的。

    update()方法操做的對象必須是持久化了的對象。也就是說,若是此對象在數據庫中不存在的話,就不能使用update()方法。

    saveOrUpdate()方法操做的對象既可使持久化了的,也可使沒有持久化的對象。若是是持久化了的對象調用saveOrUpdate()則會

    更新數據庫中的對象;若是是未持久化的對象使用此方法,則save到數據庫中。

 

 

1.8. hibernate拒絕鏈接、服務器崩潰的緣由?最少寫5個

1. db沒有打開  

2. 網絡鏈接可能出了問題

3. 鏈接配置錯了

4. 驅動的driver,url是否都寫對了

5. LIB下加入相應驅動,數據鏈接代碼是否有誤

6. 數據庫配置可能有問題

7. 當前聯接太多了,服務器都有訪問人數限制的

8. 服務器的相應端口沒有開,即它不提供相應的服務

9  hibernate有哪些緩存,分別怎麼使用?

10  你對hibernate的瞭解到了一個什麼樣的程度?

11 寫出一個sql語句體現hibernate中一對多的關係

 

1.9. hibernate如何管理緩存

  Hibernate 中提供了兩級Cache,第一級別的緩存是Session級別的緩存,它是屬於事務範圍的緩存。這一級別的緩存由hibernate管理的,通常狀況下無需進行干預;第二級別的緩存是SessionFactory級別的緩存,它是屬於進程範圍或羣集範圍的緩存。這一級別的緩存能夠進行配置和更改,而且能夠動態加載和卸載。 Hibernate還爲查詢結果提供了一個查詢緩存,它依賴於第二級緩存。

  1. 一級緩存和二級緩存的比較:第一級緩存 第二級緩存 存放數據的形式 相互關聯的持久化對象 對象的散裝數據 緩存的範圍 事務範圍,每一個事務都有單獨的第一級緩存進程範圍或集羣範圍,緩存被同一個進程或集羣範圍內的全部事務共享 併發訪問策略因爲每一個事務都擁有單獨的第一級緩存,不會出現併發問題,無需提供併發訪問策略因爲多個事務會同時訪問第二級緩存中相同數據,所以必須提供適當的併發訪問策略,來保證特定的事務隔離級別 數據過時策略沒有提供數據過時策略。處於一級緩存中的對象永遠不會過時,除非應用程序顯式清空緩存或者清除特定的對象必須提供數據過時策略,如基於內存的緩存中的對象的最大數目,容許對象處於緩存中的最長時間,以及容許對象處於緩存中的最長空閒時間 物理存儲介質內存內存和硬盤。對象的散裝數據首先存放在基於內在的緩存中,當內存中對象的數目達到數據過時策略中指定上限時,就會把其他的對象寫入基於硬盤的緩存中。緩存的軟件實現 在Hibernate的Session的實現中包含了緩存的實現由第三方提供,Hibernate僅提供了緩存適配器(CacheProvider)。用於把特定的緩存插件集成到Hibernate中。啓用緩存的方式只要應用程序經過Session接口來執行保存、更新、刪除、加載和查詢數據庫數據的操做,Hibernate就會啓用第一級緩存,把數據庫中的數據以對象的形式拷貝到緩存中,對於批量更新和批量刪除操做,若是不但願啓用第一級緩存,能夠繞過Hibernate API,直接經過JDBC API來執行指操做。用戶能夠在單個類或類的單個集合的粒度上配置第二級緩存。若是類的實例被常常讀但不多被修改,就能夠考慮使用第二級緩存。只有爲某個類或集合配置了第二級緩存,Hibernate在運行時纔會把它的實例加入到第二級緩存中。 用戶管理緩存的方式第一級緩存的物理介質爲內存,因爲內存容量有限,必須經過恰當的檢索策略和檢索方式來限制加載對象的數目。Session的evit()方法能夠顯式清空緩存中特定對象,但這種方法不值得推薦。 第二級緩存的物理介質能夠是內存和硬盤,所以第二級緩存能夠存放大量的數據,數據過時策略的maxElementsInMemory屬性值能夠控制內存中的對象數目。管理第二級緩存主要包括兩個方面:選擇須要使用第二級緩存的持久類,設置合適的併發訪問策略:選擇緩存適配器,設置合適的數據過時策略。

  2. 一級緩存的管理: 當應用程序調用Session的save()、update()、savaeOrUpdate()、get()或load(),以及調用查詢接口的 list()、iterate()或filter()方法時,若是在Session緩存中還不存在相應的對象,Hibernate就會把該對象加入到第一級緩存中。當清理緩存時,Hibernate會根據緩存中對象的狀態變化來同步更新數據庫。 Session爲應用程序提供了兩個管理緩存的方法: evict(Object obj):從緩存中清除參數指定的持久化對象。 clear():清空緩存中全部持久化對象。

  3. 二級緩存的管理:

  3.1. Hibernate的二級緩存策略的通常過程以下:

  1) 條件查詢的時候,老是發出一條select * from table_name where …. (選擇全部字段)這樣的SQL語句查詢數據庫,一次得到全部的數據對象。

  2) 把得到的全部數據對象根據ID放入到第二級緩存中。

  3) 當Hibernate根據ID訪問數據對象的時候,首先從Session一級緩存中查;查不到,若是配置了二級緩存,那麼從二級緩存中查;查不到,再查詢數據庫,把結果按照ID放入到緩存。

  4) 刪除、更新、增長數據的時候,同時更新緩存。

  Hibernate的二級緩存策略,是針對於ID查詢的緩存策略,對於條件查詢則毫無做用。爲此,Hibernate提供了針對條件查詢的Query Cache。

  3.2. 什麼樣的數據適合存放到第二級緩存中? 1 不多被修改的數據 2 不是很重要的數據,容許出現偶爾併發的數據 3 不會被併發訪問的數據 4 參考數據,指的是供應用參考的常量數據,它的實例數目有限,它的實例會被許多其餘類的實例引用,實例極少或者歷來不會被修改。

  3.3. 不適合存放到第二級緩存的數據? 1 常常被修改的數據 2 財務數據,絕對不容許出現併發 3 與其餘應用共享的數據。

  3.4. 經常使用的緩存插件 Hibernater 的二級緩存是一個插件,下面是幾種經常使用的緩存插件:

  EhCache:可做爲進程範圍的緩存,存放數據的物理介質能夠是內存或硬盤,對Hibernate的查詢緩存提供了支持。

  OSCache:可做爲進程範圍的緩存,存放數據的物理介質能夠是內存或硬盤,提供了豐富的緩存數據過時策略,對Hibernate的查詢緩存提供了支持。

  SwarmCache:可做爲羣集範圍內的緩存,但不支持Hibernate的查詢緩存。

  JBossCache:可做爲羣集範圍內的緩存,支持事務型併發訪問策略,對Hibernate的查詢緩存提供了支持。

  3.5. 配置二級緩存的主要步驟:

  1) 選擇須要使用二級緩存的持久化類,設置它的命名緩存的併發訪問策略。這是最值得認真考慮的步驟。

  2) 選擇合適的緩存插件,而後編輯該插件的配置文件。

 

 

1.10. 使用Hibernate的優勢: 

1. 對JDBC訪問數據庫的代碼作了封裝,大大簡化了數據訪問層繁瑣的重複性代碼。

2. Hibernate是一個基於JDBC的主流持久化框架,是一個優秀的ORM實現。他很大程度的簡化DAO層的編碼工做

3. hibernate使用Java反射機制,而不是字節碼加強程序來實現透明性。

4. hibernate的性能很是好,由於它是個輕量級框架。映射的靈活性很出色。它支持各類關係數據庫,從一對一到多對多的各類複雜關係。

 

1.11. Hibernate是如何延遲加載? 

1. Hibernate2延遲加載實現:a)實體對象 b)集合(Collection)

2. Hibernate3 提供了屬性的延遲加載功能

Hibernate在查詢數據的時候,數據並無存在與內存中,當程序真正對數據的操做時,對象才存在與內存中,就實現了延遲加載,他節省了服務器的內存開銷,從而提升了服務器的性能。

 

1.12. Hibernate中怎樣實現類之間的關係?(如:一對多、多對多的關係) 

類與類之間的關係主要體如今表與表之間的關係進行操做,它們都是對對象進行操做,咱們程序中把全部的表與類都映射在一塊兒,它們通 過配置文件中的many-to-one、one-to-many、many-to-many、

 

1.13. Hibernate的查詢方式 

Sql、Criteria,object comptosition

Hql:

一、 屬性查詢

二、 參數查詢、命名參數查詢

三、 關聯查詢

四、 分頁查詢

五、 統計函數

 

1.14. 如何優化Hibernate? 

1.使用雙向一對多關聯,不使用單向一對多

2.靈活使用單向一對多關聯

3.不用一對一,用多對一取代

4.配置對象緩存,不使用集合緩存

5.一對多集合使用Bag,多對多集合使用Set

6. 繼承類使用顯式多態

7. 表字段要少,表關聯不要怕多,有二級緩存撐腰

 

Struts部分

4.1. Struts1.x工做機制? 

工做機制:

Struts的工做流程:

web應用啓動時就會加載初始化ActionServlet,ActionServlet從

struts-config.xml文件中讀取配置信息,把它們存放到各類配置對象

ActionServlet接收到一個客戶請求時,將執行以下流程.

-(1)檢索和用戶請求匹配的ActionMapping實例,若是不存在,就返回請求路徑無效信息;

-(2)若是ActionForm實例不存在,就建立一個ActionForm對象,把客戶提交的表單數據保存到ActionForm對象中;

-(3)根據配置信息決定是否須要表單驗證.若是須要驗證,就調用ActionForm的validate()方法;

-(4)若是ActionForm的validate()方法返回null或返回一個不包含ActionMessage的ActuibErrors對象, 就表示表單驗證成功;

-(5)ActionServlet根據ActionMapping所包含的映射信息決定將請求轉發給哪一個Action,若是相應的 Action實例不存在,就先建立這個實例,而後調用Action的execute()方法;

-(6)Action的execute()方法返回一個ActionForward對象,ActionServlet在把客戶請求轉發給 ActionForward對象指向的JSP組件;

-(7)ActionForward對象指向JSP組件生成動態網頁,返回給客戶;

 

4.2. 爲何要用Struts1.x

JSP、Servlet、JavaBean技術的出現給咱們構建強大的企業應用系統提供了可能。但用這些技術構建的系統很是的繁亂,因此在此之上,咱們須要一個規則、一個把這些技術組織起來的規則,這就是框架,Struts便應運而生。

 

基於Struts開發的應用由3類組件構成:控制器組件、模型組件、視圖組件

 

4.3. Struts1.x的validate框架是如何驗證的? 

struts配置文件中配置具體的錯誤提示,再在FormBean中的validate()方法具體調用。

 

4.4. 說下Struts的設計模式 

MVC模式: web應用程序啓動時就會加載並初始化ActionServler。用戶提交表單時,一個配置好的ActionForm對象被建立,並被填入表單相應的數據,ActionServler根據Struts-config.xml文件配置好的設置決定是否須要表單驗證,若是須要就調用ActionForm的Validate()驗證後選擇將請求發送到哪一個Action,若是Action不存在,ActionServlet會先建立這個對象,而後調用Action的execute()方法。Execute()從ActionForm對象中獲取數據,完成業務邏輯,返回一個ActionForward對象,ActionServlet再把客戶請求轉發給ActionForward對象指定的jsp組件,ActionForward對象指定的jsp生成動態的網頁,返回給客戶。

 

4.5. 談談你mvc的理解

    MVC是Model—View—Controler的簡稱。即模型—視圖—控制器。MVC是一種設計模式,它強制性的把應用程序的輸入、處理和輸出分開。

    MVC中的模型、視圖、控制器它們分別擔負着不一樣的任務。

    視圖: 視圖是用戶看到並與之交互的界面。視圖向用戶顯示相關的數據,並接受用戶的輸入。視圖不進行任何業務邏輯處理。

    模型: 模型表示業務數據和業務處理。至關於JavaBean。一個模型能爲多個視圖提供數據。這提升了應用程序的重用性

    控制器: 當用戶單擊Web頁面中的提交按鈕時,控制器接受請求並調用相應的模型去處理請求。

            而後根據處理的結果調用相應的視圖來顯示處理的結果。

    MVC的處理過程:首先控制器接受用戶的請求,調用相應的模型來進行業務處理,並返回數據給控制器。控制器調用相應的視圖來顯示處理的結果。並經過視圖呈現給用戶。

4.6. struts1.2和struts2.0的區別?如何控制兩種框架中的單例模式?

   struts1.2和struts2.0的對比

   a、Action類:

      struts1.2要求Action類繼承一個基類。struts2.0 Action要求繼承ActionSupport基類

   b、線程模式

      struts1.2 Action是單例模式的而且必須是線程安全的,由於僅有一個Action的實例來處理全部的請求。

      單例策略限制了Struts1.2 Action能作的事情,而且開發時特別當心。Action資源必須是線程安全的或同步的。

      struts2.0 Action爲每個請求產生一個實例,所以沒有線程安全問題。

   c、Servlet依賴

      struts1.2 Action依賴於Servlet API,由於當一個Action被調用時HttpServletRequest和HttpServletResponse被傳遞給execut方法。

      struts2.0 Action不依賴於容器,容許Action脫離容器單獨測試。若是須要,Struts2 Action仍然能夠訪問初始的Request和Response。

      可是,其餘的元素減小或者消除了直接訪問HttpServletRequest和HttpServletResponse的必要性。

   d、可測性

      測試struts1.2 Action的一個主要問題是execute方法暴露了Servlet API(這使得測試要依賴於容器)。一個第三方擴展:struts TestCase

      提供了一套struts1.2的模擬對象來進行測試。

      Struts2.0 Action能夠經過初始化、設置屬性、調用方法來測試,「依賴注入」也使得測試更容易。

4.7. struts如何實現國際化

    如下以兩國語言(中文,英文)爲例:

    1. 在工程中加入Struts支持

    2. 編輯ApplicationResource.properties文件,在其中加入要使用國際化的信息, 例如: lable.welcome.china=Welcome!!!

    3. 建立英文資源文件ApplicationResource_en.properites

    4. 建立臨時中文資源文件ApplicationResource_temp.properites 例如:lable.welcom.china=中國歡迎您!

    5. 對臨時中文資源文件進行編碼轉換。可使用myeclipse的插件,也能夠在dos下執行:

       native2ascii -encoding gb2312 ApplicationResource_temp.properties ApplicationResource_zh_CN.properties

    6. 在jsp中加入struts的bean標記庫 <%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean"%>

       顯示信息: <bean:message key="label.welcome.china">

能夠在struts-config.xml文件中定義多個資源包,而每一個資源包可以使用key屬性指定包的名稱。

4.8. struts2.0的經常使用標籤有哪些

    1. 往action裏傳值:<input name="userName" type="text" class="input6" size="15">

    2. 顯示標籤 property 用於輸出指定值:<s:property value="userName "/>

  3. 用於從頁面往action中(user)的對象內傳值:<s:text name="user.userName " id="username"/>

    4. 判斷<s:if> </s:if> 用於在頁面中判斷指定數據 <s:if test="userName == admin">…. </s:if> <s:else>…. </s:else>

    5. 迭代<s:iterator>用於將List、Map、ArrayList等集合進行循環遍歷

       <s:iterator value="userList" id="user" status="u">

          <s:property value="userName"/></a>

       </s:iterator>

    6. URL地址標籤,<s:url>用於生成一個URL地址,能夠經過URL標籤指定的<s:param>子元素向URL地址發送請求參數

       <s:url action=" ">

          <s:param name=" " value=""></s:param>

       </s:url>

    7. 超連接 <a href >通常和<s:url>標籤一塊兒使用,用於帶多個參數。

       <a href="

          <s:url action=" ">

             <s:param name=" " value=""></s:param>

             <s:param name=" " value=""></s:param>

             <s:param name=" " value=""></s:param>

          </s:url>

       ">超連接</a>

    8. set標籤,用於將某個值放入指定的範圍內。例如application,session等。

       <s:set name="user" value="userName" scope=」request」/>

 

4.9. struts中怎麼配置form-bean、action、tiles

    此處配置的是struts1.2的

    form-bean配置:(在配置文件struts-config.xml中):

    <form-beans >

   <form-bean name="" type=""></form-bean>

   </form-beans>

    name: 指定form的名字; type指定form的類型:包名+類名;

   action配置:(在配置文件struts-config.xml中)

   <action-mappings >

   <action path=""

           attribute=""

           input=""

           name=""

           parameter=""

           scope="request"

           type=""

           ></action>

   </action-mappings>

   path:請求Action的名字;   attribute:form的名字,與form-bean中的name對應;   input:輸入頁的路徑;

   name:若是配置了attribute,name不起做用,與attribute同樣;   parameter:使用分發Action時,指定調用分發Action中的方法名;

   scope:Action的範圍;    type:Action的類型:包名+類名;

   

   tites配置:

   1. 新建一個 tiles-defs.xml文件,並在其中作以下配置:

      <?xml version="1.0" encoding="UTF-8"?>

      <!DOCTYPE tiles-definitions PUBLIC "-//Apache Software Foundation//DTD Tiles Configuration 1.1//EN" "http://jakarta.apache.org/struts/dtds/tiles-config_1_1.dtd">

      <tiles-definitions>

        <definition name="member-definition" path="/Jsp/layout.jsp">  

          <put name="top" value="/mTop.do"/>  

          <put name="left" value="/mLeft.do"/>

          <put name="main" value="/defaultMmain.do"/>

        </definition>

     </tiles-definitions>

   2. 在web.xml和struts-config.xml和web.xml中作相應配置:

      struts-config.xml中配置以下:

      ************

      <plug-in className="org.apache.struts.tiles.TilesPlugin">

         <set-property property="definitions-config" value="/WEB-INF/tiles-defs.xml"/>   

         <set-property property="definitions-parser-validate" value="true"/>

      </plug-in>

      ************

      web.xml中配置以下:

      ************

      <init-param>    

         <param-name>definitions-config</param-name>    

         <param-value>/WEB-INF/tiles-defs.xml</param-value>

      </init-param>

      *************

   3. 調用Tiles組件

      Tiles組件是經過Struts Action來調用的,在struts-config.xml中作以下action配置:

      *************

      <action

        path="/member"

        parameter="member-definition"

        type="org.apache.struts.actions.ForwardAction"/>

     **************

4.10. logic標籤有哪幾個?

    此標籤庫能夠分爲三種類型:條件、循環、轉發/重定向。

    1. 條件類型 (沒標註的都比較簡單)

       logic:empty, logic:notEmpty;

       logic:equal, logic:notEqual, logic:lessThan, logic:greaterThan,logic:lessEqual, logic:greaterEqual;

       logic:present, logic:notPresent;

       logic:match, logic:notMatch; 比較兩字符串是否相等,能夠比較字符串的開始的、結尾的或其中的某個部分。location屬性:指定從某個位置開始進行比較。

    

    2. 循環類型

       logic:iterate

    

    3. 轉發/重定向類型

       logic:forward和logic:redirect

       logic:forward標籤和jsp:forward標籤類似,但它可使用global forward中的一個ActionForward

       例如:<logic:forward name="login" />

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

       與上面相關的global forward中的代碼:

       <global-forwards>

          <forward name="login" path="/loginForm.jsp"/>

       </global-forwards>

       logic:redirect標籤和上面的標籤相似,但它默認調用的方法是response.sendRedirect(),

       取代了上面的requestDispatcher.forward()。最大的不一樣是它支持全部html:link標籤的屬性,因此你可以指定request參數:

       <logic:redirect name="login" paramId="employeeId" paramName="employee" property="id" />

       MVC框架下,不推薦使用這兩個標籤,你應該是從controller中選擇下一個view,而不是從view中選擇.在Jsp頁面中不要過多的使用logic標籤。

 

4.11. action是單實例仍是多實例,爲何?

    action是單實例的。當多個用戶訪問一個請求的時候,服務器內存中只有一個與之對應的action類對象。

    由於當服務器第一次加載struts的配置文件的時候,建立了一個Action後,每發送一個請求,服務器都會先去檢索相應的範圍內(request,session)是否存在

    這樣一個action實例,若是存在,則使用這個實例,若是不存在,則建立一個action實例。

 

4.12. dispatchAction是用什麼技術實現的?

    DispatchAction 是Aciton的一個子類,主要解決了一個請求處理多個功能的問題

    普通的Action你只能寫execute方法來處理業務,而想用這一個Action處理多個任務,你必需要請求參數進行解析,用if語句塊來處理

    舉一個小例子:

    有以下一個url:  http://localhost:8080/myApp/addUserAction.do

    若是你處理這個url的是一個普通的Action,那麼就只能在execute裏面執行插入的相關操做,若是換成一下url:

    http://localhost:8080/myApp/UserAction.do?method=add

    你就應該根據method對象的值來執行相應的操做,如再有一個路徑http://localhost:8080/myApp/UserAction.do?method=delete

    這個還可使用那個Action來處理的,只是多判斷一下而已.

若是你用DispatchAction,就簡單多了,因此dispatchAction仍是用的Action的這麼一個技術。

 

4.13. struts2.0的mvc模式?與struts1.0的區別?

    struts2的mvc模式:當用戶在頁面提交用戶請求時,該請求須要提交給struts2的控制器處理。struts2的控制器根據處理結果,

    決定將哪一個頁面呈現給客戶端。

    struts1最大的不一樣是:struts2的控制器。struts2的控制器再也不像struts1的控制器,須要繼承一個Action父類,甚至能夠無需實現

    任何接口,struts2的Action就是一個普通的POJO。實際上,Struts2 的Action就是一個包含execute方法的普通Java類

    該類裏包含的多個屬性用於封裝用戶的請求參數。

 

4.14. struts的處理流程。

1、ActionServlet的初始化
ActionServlet做爲Struts組件的前端控制器,因爲web.xml的相應配置:

<load-on-startup>0</load-on-startup>
在應用一加載時即會被實例化並調用其init方法,init方法所作的主要工做有二:

1. 加載struts配置文件,並建立用於封裝配置信息的ModuleConfig對象
2. 加載資源文件,並建立用於封裝資源文件的MessageResources對象
須要注意兩點:若是web.xml有多模塊配置,將建立多個ModuleConfig對象和MessageResources對象分別

用於封裝各個模塊的struts配置文件和資源文件。
針對各個模塊所建立的ModuleConfig對象和MessageResources對象將存儲在ServletContext中,對應的屬

性名中有該模塊名稱的相應標識。
另外,若是有相應配置的話,init方法還將初始化數據源和PlugIn

2、ActionServlet的process
全部形如*.do的請求(根據web.xml中的相關配置)將提交給ActionServlet,最終將調用其process方法

process方法的主要工做有三:

1.  根據請求信息獲知所請求的模塊名稱,從ServletContext中得到與請求模塊對應的的ModuleConfig對

象,並存儲到request中。
2.  根據模塊信息得到相應的RequestProcessor對象,一個模塊對應一個RequestProcessor對象,

RequestProcessor對象將關聯與所屬模塊對應的ModuleConfig對象。
3.  調用RequestProcessor對象的process方法,將request和response做爲參數傳遞給它。

3、RequestProcessor的process
RequestProcessor對象的process方法的主要工做有五步:
1.  調用本身的 processPreprocess(request, response)方法,該方法不進行任何操做,用於子類重寫

擴展其功能。
2.  得到與請求地址所匹配的ActionMapping對象,AcionMapping對象用於封裝一個特定acion的配置信息


3.  根據ActionMapping中的配置信息得到ActionForm對象(該對象將緩存到request或session中),並

將表單數據填充到ActionForm中,而後根據ActionMapping的配置決定是否驗證ActionForm,若是驗證,

將調用ActionForm的 validate方法,若其返回的ActionErros對象中包含ActionMessage對象則表示驗證

失敗,將轉向action配置信息 input屬性所指示的地址。
4.  若是ActionForm無需驗證或驗證經過將建立並緩存與請求地址匹配的Action對象,將ActionMapping

對象、ActionForm對象、request和response做爲參數調用其execute方法。
5.  根據Action對象的execute方法返回的ActionForward對象,將請求轉發或重定向到該ActionForward

所封裝的地址。

Struts2.0與Struts1.x有何區別。

Feature特徵

Struts 1 Struts的一

Struts 2 Struts的2

Action classes行動班

Struts 1 requires Action classes to extend an abstract base class. Struts的一要求採起行動班,以延長一個抽象的基類。 A common problem in Struts 1 is programming to abstract classes instead of interfaces.一個共同的問題在Struts的一,是編程抽象類而不是接口。

An Struts 2 Action may implement an Action interface, along with other interfaces to enable optional and custom services. 1 2 Struts的行動, 可能實施一項行動的界面,隨着其餘接口,使可選和定製服務。 Struts 2 provides a base ActionSupport class to implement commonly used interfaces. Struts的2提供了相應的actionsupport一流的執行經常使用的接口。 Albeit, the Action interface is not required.雖然,這項行動的界面是否是必需的 。 Any POJO object with a execute signature can be used as an Struts 2 Action object.任何波霍對象與執行的簽名能夠被用來做爲一個Struts的二行動的對象。

Threading Model線程模型

Struts 1 Actions are singletons and must be thread-safe since there will only be one instance of a class to handle all requests for that Action. Struts的一行動是單身,必須線程安全的,由於將只有一個實例一類來處理全部的請求採起行動。 The singleton strategy places restrictions on what can be done with Struts 1 Actions and requires extra care to develop.單身人士策略地方的限制,能夠作些什麼與Struts的一行動,並要求加倍當心發展。 Action resources must be thread-safe or synchronized.行動的資源,必須線程安全的或同步。

Struts 2 Action objects are instantiated for each request, so there are no thread-safety issues. 2 Struts的行動對象是實例對於每一個請求,所以沒有線程安全問題。 (In practice, servlet containers generate many throw-away objects per request, and one more object does not impose a performance penalty or impact garbage collection.) (在實踐中, Servlet的容器,產生許多扔離家出走的對象,每次請求,並多一個對象不施加表現罰款,或影響垃圾收集) 。

Servlet Dependency Servlet的依賴

Struts 1 Actions have dependencies on the servlet API since the HttpServletRequest and HttpServletResponse is passed to the execute method when an Action is invoked. Struts的一行動,依賴於該Servlet的空氣污染指數以來, httpservletrequest和httpservletresponse傳遞給Execute方法,當一個行動是引用。

Struts 2 Actions are not coupled to a container. Struts的行動,二是不耦合的一個貨櫃。 Most often the servlet contexts are represented as simple Maps, allowing Actions to be tested in isolation.最常常的Servlet的背景是派表明做爲簡單的地圖,讓行動,以測試陷入孤立的境地。 Struts 2 Actions can still access the original request and response, if required. 2 Struts的行動仍然可使用原來的請求和響應,若是須要。 However, other architectural elements reduce or eliminate the need to access the HttpServetRequest or HttpServletResponse directly.不過,其餘建築元素,減小或消除須要訪問httpservetrequest或httpservletresponse直接。

Testability測試

A major hurdle to testing Struts 1 Actions is that the execute method exposes the Servlet API.一個主要障礙,以測試Struts的一行動是Execute方法暴露了Servlet的空氣污染指數。 A third-party extension, Struts TestCase, offers a set of mock object for Struts 1.第三黨的擴展, Struts的testcase ,提供了一套模擬對象的Struts 1 。

Struts 2 Actions can be tested by instantiating the Action, setting properties, and invoking methods. 2 Struts的行動能夠測試實例化的行動,設置屬性,引用的方法。 Dependency Injection support also makes testing simpler.依賴注入的支持也使測試更簡單。

Harvesting Input收穫的投入

Struts 1 uses an ActionForm object to capture input. Struts的一使用actionform對象捕獲輸入。 Like Actions, all ActionForms must extend a base class.同樣的行動,全部actionforms必須擴大基地,一流的。 Since  other JavaBeans cannot be used as ActionForms, developers often create redundant classes to capture input.因爲其餘的JavaBeans不能被用來做爲actionforms ,開發商經常形成多餘的班,以捕捉的投入。 DynaBeans can used as an alternative to creating conventional ActionForm classes, but, here too, developers may be redescribing existing JavaBeans. dynabeans能夠用來做爲一種替代創造常規actionform班,但這裏太,發展商可能會redescribing現有的JavaBeans 。

Struts 2 uses Action properties as input properties, eliminating the need for a second input object. Struts的2使用性能的行動做爲輸入屬性,再也不須要第二個輸入對象。 Input properties may be rich object types which may have their own properties.輸入屬性多是豐富的對象類型可能有本身的屬性。 The Action properties can be accessed from the web page via the taglibs.行動性質能夠從網頁上經過taglibs 。 Struts 2 also supports the ActionForm pattern, as well as POJO form objects and POJO Actions. Struts的2還支持actionform模式,以及波霍形式,對象和波霍行動。 Rich object types, including business or domain objects, can be used as input/output objects.豐富的對象類型,其中包括商業利益或域對象,能夠被用來做爲輸入/輸出對象。 The ModelDriven feature simplifies taglb references to POJO input objects.該modeldriven功能簡化taglb的提述,波霍投入對象。

Expression Language語言表達

Struts 1 integrates with JSTL, so it uses the JSTL EL. Struts的一整合與jstl ,因此它使用jstl下午。 The EL has basic object graph traversal, but relatively weak collection and indexed property support.的El已基本對象圖遍歷,但相對薄弱的收集和索引財產的支持。

Struts 2 can use JSTL, but the framework also supports a more powerful and flexible expression language called "Object Graph Notation Language" (OGNL). Struts的二可使用jstl ,但框架也支持一個更強大和靈活的語言表達所謂的「對象圖形符號語言」 ( ognl ) 。

Binding values into views有約束力的價值觀歸入意見

Struts 1 uses the standard JSP mechanism for binding objects into the page context for access. Struts的一使用標準的JSP機制,有約束力的物體進入該網頁的背景下訪問。

Struts 2 uses a "ValueStack" technology so that the taglibs can access values without coupling your view to the object type it is rendering. Struts的2使用「 valuestack 」技術,使該taglibs能夠訪問的價值觀沒有耦合您的見解,以對象類型,這是渲染。 The ValueStack strategy allows reuse of views across a range of types which may have the same property name but different property types.該valuestack策略容許重用的意見覆蓋的類型可能有相同的屬性名稱,但不一樣的屬性類型。

Type Conversion類型轉換

Struts 1 ActionForm properties are usually all Strings. Struts的一actionform屬性一般是全部字符串。 Struts 1 uses Commons-Beanutils for type conversion. Struts的一用途的商品- beanutils爲類型轉換。 Converters are per-class, and not configurable per instance.轉換器每級的,而不是配置的每一個實例。

Struts 2 uses OGNL for type conversion. Struts的2使用ognl爲類型轉換。 The framework includes converters for basic and common object types and primitives.該框架包括轉換爲基本和共同的對象類型和原始。

Validation驗證

Struts 1 supports manual validation via a validate method on the ActionForm, or through an extension to the Commons Validator. Struts的一支持手冊審定經過驗證方法對actionform ,或經過一個擴展到商品校驗。 Classes can have different validation contexts for the same class, but cannot chain to validations on sub-objects.班級能夠有不一樣的驗證背景爲同一階層,但不能鏈,以驗證就分對象。

Struts 2 supports manual validation via the validate method and the XWork Validation framework. Struts的2支持手冊審定經過驗證的方法和xwork的驗證框架。 The Xwork Validation Framework supports chaining validation into sub-properties using the validations defined for the properties class type and the validation context.該xwork的驗證框架支持連接驗證分爲分性能的使用驗證的定義爲性能一流的類型和驗證。

Control Of Action Execution控制行動的執行

Struts 1 supports separate Request Processors (lifecycles) for each module, but all the Actions in the module must share the same lifecycle. Struts的一支持獨立的請求處理器(生命週期)爲每一個單元,但全部的行動,在該模塊必須共用相同的生命週期。

Struts 2 supports creating different lifecycles on a per Action basis via Interceptor Stacks. 2 Struts的支持,創造不一樣的生命週期對每行動的基礎上經過攔截堆疊。 Custom stacks can be created and used with different Actions, as needed.自定義棧,才能創造和使用不一樣的行動,視須要。

 

4.15. Struts/webwork 的工做機制,它有哪些標籤

Struts 2框架的大體處理流程以下:

 瀏覽器發送請求,例如請求/mypage.action、/reports/myreport.pdf等。

 核心控制器FilterDispatcher根據請求決定調用合適的Action。

 WebWork的攔截器鏈自動對請求應用通用功能,例如workflow、validation或文件上傳等功能。

 回調Action的execute方法,該execute方法先獲取用戶請求參數,而後執行某種數據庫操做,既能夠是將數據保存到數據庫,也能夠從數據庫中檢索信息。實際上,由於Action只是一個控制器,它會調用業務邏輯組件來處理用戶的請求。

 Action的execute方法處理結果信息將被輸出到瀏覽器中,能夠是HTML頁面、圖像,也能夠是PDF文檔或者其餘文檔。此時支持的視圖技術很是多,既支持JSP,也支持Velocity、FreeMarker等模板技術。

Spring部分

4.1. spring工做機制 

1.spring mvc請全部的請求都提交給DispatcherServlet,它會委託應用系統的其餘模塊負責負責對請求進行真正的處理工做。

2.DispatcherServlet查詢一個或多個HandlerMapping,找處處理請求的Controller.

3.DispatcherServlet請請求提交到目標Controller

4.Controller進行業務邏輯處理後,會返回一個ModelAndView

5.Dispathcher查詢一個或多個ViewResolver視圖解析器,找到ModelAndView對象指定的視圖對象

6.視圖對象負責渲染返回給客戶端。

4.2. 使用Spring的好處

{AOP 讓開發人員能夠建立非行爲性的關注點,稱爲橫切關注點,並將它們插入到應用程序代碼中。使用 AOP 後,公共服務 (比 如日誌、持久性、事務等)就能夠分解成方面並應用到域對象上,同時不會增長域對象的對象模型的複雜性。

IOC 容許建立一個能夠構造對象的應用環境,而後向這些對象傳遞它們的協做對象。正如單詞 倒置 所代表的,IOC 就像反 過來的 JNDI。沒有使用一堆抽象工廠、服務定位器、單元素(singleton)和直接構造(straight construction),每個對象都是用其協做對象構造的。所以是由容器管理協做對象(collaborator)。

Spring即便一個AOP框架,也是一IOC容器。 Spring 最好的地方是它有助於您替換對象。有了 Spring,只要用 JavaBean 屬性和配置文件加入依賴性(協做對象)。而後能夠很容易地在須要時替換具備相似接口的協做對象。}

 

 

4.3. spring是什麼?根據你的理解詳細談談你的看法。

目的:解決企業應用開發的複雜性

  功能:使用基本的JavaBean代替EJB,並提供了更多的企業應用功能

  範圍:任何Java應用

  簡單來講,Spring是一個輕量級的控制反轉(IoC)和麪向切面(AOP)的容器框架。

  輕量——從大小與開銷兩方面而言Spring都是輕量的。完整的Spring框架能夠在一個大小隻有1MB多的JAR文件裏發佈。而且Spring所需的處理開銷也是微不足道的。此外,Spring是非侵入式的:典型地,Spring應用中的對象不依賴於Spring的特定類。

  控制反轉——Spring經過一種稱做控制反轉(IoC)的技術促進了鬆耦合。當應用了IoC,一個對象依賴的其它對象會經過被動的方式傳遞進來,而不是這個對象本身建立或者查找依賴對象。你能夠認爲IoC與JNDI相反——不是對象從容器中查找依賴,而是容器在對象初始化時不等對象請求就主動將依賴傳遞給它。

  面向切面——Spring提供了面向切面編程的豐富支持,容許經過分離應用的業務邏輯與系統級服務(例如審計(auditing)和事務()管理)進行內聚性的開發。應用對象只實現它們應該作的——完成業務邏輯——僅此而已。它們並不負責(甚至是意識)其它的系統級關注點,例如日誌或事務支持。

  容器——Spring包含並管理應用對象的配置和生命週期,在這個意義上它是一種容器,你能夠配置你的每一個bean如何被建立——基於一個可配置原型(prototype),你的bean能夠建立一個單獨的實例或者每次須要時都生成一個新的實例——以及它們是如何相互關聯的。然而,Spring不該該被混同於傳統的重量級的EJB容器,它們常常是龐大與笨重的,難以使用。

  框架——Spring能夠將簡單的組件配置、組合成爲複雜的應用。在Spring中,應用對象被聲明式地組合,典型地是在一個XML文件裏。Spring也提供了不少基礎功能(事務管理、持久化框架集成等等),將應用邏輯的開發留給了你。

  全部Spring的這些特徵使你可以編寫更乾淨、更可管理、而且更易於測試的代碼。它們也爲Spring中的各類模塊提供了基礎支持。

 

4.4. 項目中如何體現Spring中的切面編程,具體說明。

   面向切面編程:主要是橫切一個關注點,將一個關注點模塊化成一個切面。在切面上聲明一個通知(Advice)和切入點(Pointcut); 通知: 是指在切面的某個特定的鏈接點(表明一個方法的執行。經過聲明一個org.aspectj.lang.JoinPoint類型的參數可使通知(Advice)的主體部分得到鏈接點信息。)上執行的動做。通知中定義了要插入的方法。切入點:切入點的內容是一個表達式,以描述須要在哪些對象的哪些方法上插入通知中定義的方法。

   項目中用到的Spring中的切面編程最多的地方:聲明式事務管理。

   a、定義一個事務管理器

   b、配置事務特性(至關於聲明通知。通常在業務層的類的一些方法上定義事務)

   c、配置哪些類的哪些方法須要配置事務(至關於切入點。通常是業務類的方法上)

   

 

4.5. spring在項目中如何充當粘合劑

    一、在項目中利用spring的IOC(控制反轉或依賴注入),明確地定義組件接口(如UserDAO),開發者能夠獨立開發各個組件, 而後根據組件間的依賴關係組裝(UserAction依賴於UserBiz,UserBiz依賴於UserDAO)運行,很好的把Struts(Action)和hibernate(DAO的實現)結合起來了。

    二、spring的事務管理把hibernate對數據庫的操做進行了事務配置。

 

4.6. spring的事務如何配置

    spring的聲明式事務配置:

    1. <!-- 配置sessionFactory -->

<bean id="sessionFactory"

class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

<property name="configLocation">

<value>/WEB-INF/classes/hibernate.cfg.xml</value>

</property>

</bean>  

    2. 配置事務管理器

       <!-- 配置事務管理器 -->

<bean id="transactionManager"

class="org.springframework.orm.hibernate3.HibernateTransactionManager">

<property name="sessionFactory">

<ref local="sessionFactory" />

</property>

</bean>

    3. 配置事務特性

       <tx:advice id="txAdvice"  transaction-manager="transactionManager">

<tx:attributes>

             <tx:method name="add*" propagation="REQUIRED"/>

                    <tx:method name="update*" propagation="REQUIRED"/>

                    <tx:method name="del*" propagation="REQUIRED"/>

                    <tx:method name="*" read-only="true"/>

                </tx:attributes>

       </tx:advice>

    4. 配置哪些類的哪些方法配置事務

       <aop:config>

           <aop:pointcut id="allManagerMethod" ession="execution(* com.yyaccp.service.impl.*.*(..))"/>

           <aop:advisor advice-ref="txAdvice" pointcut-ref="allManagerMethod">

       </aop:config>

 

 

4.7. transaction有那幾種實現

   Spring中,事務處理主要有兩種方式

(1) 代碼控制事務  

在程序中引入新的模版類,這個類封裝了事務管理的功能

(2) 參數配置控制事務,在Application-Context.xml增長一個事務代理(UserDAOProxy)配置

 

IBATIS中的事物屬性怎麼配置

SQL MAP XML配置文件中的transactionManager

 

綜合部分

4.1. Hibernate和spring中常出現的幾個異常

   org.springframework.beans.factory.BeanCreationException:

       Error creating bean with name 'sessionFactory' defined in ServletContext resource [/WEB-INF/applicationContext.xml]:

       Initialization of bean failed; nested exception is org.hibernate.MappingException: Repeated column in mapping for entity: com.xindeco.myregister.pojo.MyRegisterInfo column:

       password (should be mapped with insert="false" update="false")

       出錯緣由:password 和repassword同時對應數據庫表中的password一列,同時update和insert都設爲true。xml文件以下:

      <property name="password"

                          type="java.lang.String"

                          update="true"

                          insert="true"

                          access="property"

                          column="password"

                          length = "32"

                          />

 

                         <property name="repassword"

                          type="java.lang.String"

                          update="false"

                          insert="false"

                          access="property"

                          column="password"

                          length = "32"

                          />

       解決方法:將repassword的insert和update設爲false。

 

   org.springframework.beans.factory.BeanCreationException:

       Error creating bean with name 'sessionFactory' defined in ServletContext resource [/WEB-INF/applicationContext.xml]:

       Initialization of bean failed;nested exception is org.hibernate.PropertyNotFoundException: Could not find a getter for ID in class

      錯誤緣由:hibernate的映射文件中ID是大寫的,而pojo的類中id是小寫的

      解決方法:要麼將pojo類中的id改稱大寫,要麼把hibernate的映射文件中的ID改稱小寫。

 

4.2. Hibernate與jdbc的聯繫

    hibernate是jdbc的輕量級封裝,包括jdbc的與數據庫的鏈接(用hibernate.property的配置文件實現固然本質是封裝了jdbc的forname),

    和查詢,刪除等代碼,都用面向對象的思想用代碼聯繫起來,hibernate經過hbm 配置文件把po類的字段和數據庫的字段關聯起來好比數據庫的id,

    po類中就是pravite Long id; public Long getId() ;public setId(Long id);

    而後hql語句也是面向對象的,它的查詢語句不是查詢數據庫而是查詢類的,這些實現的魔法就是xml文件,其實hibernate=封裝的jdbc+xml文件

4.3. Hibernate與spring的聯繫

    hibernate中的一些對象能夠給Spring來管理,讓Spring容器來建立hibernate中一些對象實例化。例如:SessionFactory,HibernateTemplate等。

    Hibernate原本是對數據庫的一些操做,放在DAO層,而Spring給業務層的方法定義了事務,業務層調用DAO層的方法,很好的將Hibernate的操做也加入到事務中來了。

 

4.4. 項目中爲何使用SSH

    1. 使用Struts是由於struts是基於MVC模式的,很好的將應用程序進行了分層,使開發者更關注於業務邏輯的實現;第二,struts有着豐富的taglib,如能靈活運用,則能大大提升開發效率。

    2. 使用Hibernate:由於hibernate爲Java應用提供了一個易用的、高效率的對象關係映射框架。hibernate是個輕量級的持久性框架,功能豐富。

    3. 使用Spring:由於spring基於IoC(Inversion of Control,反向控制)和AOP構架多層j2ee系統的框架,但它不強迫你必須在每一層中必須使用Spring,由於它模塊化的很好,容許你根據本身的須要選擇使用它的某一個模塊;

       採用IoC使得能夠很容易的實現bean的裝配,提供了簡潔的AOP並據此實現事務管理(Transcation Managment),等等

相關文章
相關標籤/搜索