Struts+Hibernate+Spring面試題合集及答案
Struts+Hibernate+Spring面試題合集 1
1. Hibernate部分 2
1.1. Hibernate工作原理 2
1.2. 什么是Hibernate的並發機制?怎么處理並發問題? 2
1.3. Hibernate自帶的分頁機制是什么?如果不使用Hibernate自帶的分頁,則采用什么方式分頁? 3
1.4. hibernate的對象的三種持久化狀態,並給出解釋? 3
1.5. hibernate的三種狀態之間如何轉換 3
1.6. hibernate中一對多配置文件返回的是什么? 4
1.7. update()和saveOrUpdate()的區別? 4
1.8. hibernate拒絕連接、服務器崩潰的原因?最少寫5個 4
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.x的validate框架是如何驗證的? 8
4.4. 說下Struts的設計模式 8
4.5. 談談你mvc的理解 8
4.6. struts1.2和struts2.0的區別?如何控制兩種框架中的單例模式? 9
4.7. struts如何實現國際化 9
4.8. struts2.0的常用標簽有哪些 10
4.9. struts中怎么配置form-bean、action、tiles 10
4.10. logic標簽有哪幾個? 12
4.11. action是單實例還是多實例,為什么? 13
4.12. dispatchAction是用什么技術實現的? 13
4.13. struts2.0的mvc模式?與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. Hibernate和spring中常出現的幾個異常 21
4.2. Hibernate與jdbc的聯系 22
4.3. Hibernate與spring的聯系 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自帶的分頁,則采用什么方式分頁?
1、hibernate自帶的分頁機制:獲得Session對象后,從Session中獲得Query對象。用Query.setFirstResult():設置要顯示的第一行數據,
Query.setMaxResults():設置要顯示的最后一行數據。
2、不使用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、 屬性查詢
2、 參數查詢、命名參數查詢
3、 關聯查詢
4、 分頁查詢
5、 統計函數
1.14. 如何優化Hibernate?
1.使用雙向一對多關聯,不使用單向一對多
2.靈活使用單向一對多關聯
3.不用一對一,用多對一取代
4.配置對象緩存,不使用集合緩存
5.一對多集合使用Bag,多對多集合使用Set
6. 繼承類使用顯式多態
7. 表字段要少,表關聯不要怕多,有二級緩存撐腰
2 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的處理流程。
一、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
二、ActionServlet的process
所有形如*.do的請求(根據web.xml中的相關配置)將提交給ActionServlet,最終將調用其process方法
。process方法的主要工作有三:
1. 根據請求信息獲知所請求的模塊名稱,從ServletContext中獲得與請求模塊對應的的ModuleConfig對
象,並存儲到request中。
2. 根據模塊信息獲得相應的RequestProcessor對象,一個模塊對應一個RequestProcessor對象,
RequestProcessor對象將關聯與所屬模塊對應的ModuleConfig對象。
3. 調用RequestProcessor對象的process方法,將request和response作為參數傳遞給它。
三、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等模板技術。
2 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在項目中如何充當粘合劑
1、在項目中利用spring的IOC(控制反轉或依賴注入),明確地定義組件接口(如UserDAO),開發者可以獨立開發各個組件, 然后根據組件間的依賴關系組裝(UserAction依賴於UserBiz,UserBiz依賴於UserDAO)運行,很好的把Struts(Action)和hibernate(DAO的實現)結合起來了。
2、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
3 綜合部分
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),等等