Java—SSH(MVC)
1. 談談你mvc的理解
MVC是Model—View—Controler的簡稱。即模型—視圖—控制器。MVC是一種設計模式,
它強制性的把應用程序的輸入、處理和輸出分開。
MVC中的模型、視圖、控制器它們分別擔負着不一樣的任務。
視圖: 視圖是用戶看到並與之交互的界面。視圖向用戶顯示相關的數據,並接受用
戶的輸入。視圖不進行任何業務邏輯處理。
模型: 模型表示業務數據和業務處理。至關於JavaBean。一個模型能爲多個視圖提
供數據。這提升了應用程序的重用性
控制器: 當用戶單擊Web頁面中的提交按鈕時,控制器接受請求並調用相應的模型去
處理請求。
而後根據處理的結果調用相應的視圖來顯示處理的結果。
MVC的處理過程:首先控制器接受用戶的請求,調用相應的模型來進行業務處理,
並返回數據給控制器。控制器調用相應的視圖來顯示處理的結果。並經過視圖呈現
給用戶。
Struts
1. 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能夠經過初始化、設置屬性、調用方法來測試,「依賴注入」也使
得測試更容易。
2. 項目中爲何使用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),等等
3. struts與spring是如何繼承的
不懂題目之意:是不是說的struts的action都繼承自
org.apache.struts.action.Action
而Spring中的繼承就不清楚了。
4. 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"%>
顯示信息:
能夠在struts-config.xml文件中定義多個資源包,而每一個資源包可以使用key屬性指
定包的名稱。
5. struts2.0的經常使用標籤
1. 往action裏傳值:
2. 顯示標籤 property 用於輸出指定值:
3. 用於從頁面往action中(user)的對象內傳值:
4. 判斷用於在頁面中判斷指定數據 …. ….
5. 迭代用於將List、Map、ArrayList等集合進行循環遍歷
6. URL地址標籤,用於生成一個URL地址,能夠經過URL標籤指定的子元素向URL地
址發送請求參數
7. 超連接 通常和標籤一塊兒使用,用於帶多個參數。
<<br /> <s:url action=>
「>超連接 <<br /> <s:url action=>
8. set標籤,用於將某個值放入指定的範圍內。例如application,session等。
6. struts中怎麼配置form-bean、action、tiles
此處配置的是struts1.2的
form-bean配置:(在配置文件struts-config.xml中):
name: 指定form的名字; type指定form的類型:包名+類名;
action配置:(在配置文件struts-config.xml中)
attribute=""
input=""
name=""
parameter=""
scope="request"
type=""
>
path:請求Action的名字; attribute:form的名字,與form-bean中的name對應;
input:輸入頁的路徑;
name:若是配置了attribute,name不起做用,與attribute同樣; parameter:使用
分發Action時,指定調用分發Action中的方法名;
scope:Action的範圍; type:Action的類型:包名+類名;
tites配置:
1. 新建一個 tiles-defs.xml文件,並在其中作以下配置:
2. 在web.xml和struts-config.xml和web.xml中作相應配置:
在struts-config.xml中配置以下:
************
************
在web.xml中配置以下:
************
definitions-config /WEB-INF/tiles-defs.xml
*************
3. 調用Tiles組件
Tiles組件是經過Struts Action來調用的,在struts-config.xml中作以下action
配置:
*************
path="/member"
parameter="member-definition"
type="org.apache.struts.actions.ForwardAction"/>
**************
7. 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
例如:
——————————————————————————
與上面相關的global forward中的代碼:
logic:redirect標籤和上面的標籤相似,但它默認調用的方法是
response.sendRedirect(),
取代了上面的requestDispatcher.forward()。最大的不一樣是它支持全部html:link
標籤的屬性,因此你可以指定request參數:
在MVC框架下,不推薦使用這兩個標籤,你應該是從controller中選擇下一個
view,而不是從view中選擇.在Jsp頁面中不要過多的使用logic標籤。
8. action是單實例仍是多實例,爲何?
action是單實例的。當多個用戶訪問一個請求的時候,服務器內存中只有一個與之
對應的action類對象。
由於當服務器第一次加載struts的配置文件的時候,建立了一個Action後,每發送一
個請求,服務器都會先去檢索相應的範圍內(request,session)是否存在
這樣一個action實例,若是存在,則使用這個實例,若是不存在,則建立一個action實例。
9. 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的這麼
一個技術。
10. struts2.0的mvc模式?與struts1.0的區別?
struts2的mvc模式:當用戶在頁面提交用戶請求時,該請求須要提交給struts2的控
制器處理。struts2的控制器根據處理結果,
決定將哪一個頁面呈現給客戶端。
與struts1最大的不一樣是:struts2的控制器。struts2的控制器再也不像struts1的控
制器,須要繼承一個Action父類,甚至能夠無需實現
任何接口,struts2的Action就是一個普通的POJO。實際上,Struts2 的Action就是
一個包含execute方法的普通Java類
該類裏包含的多個屬性用於封裝用戶的請求參數。
11. STRUTS的配置文件是什麼?
struts-config.xml
12. 請寫出Struts的工做原理。
13. struts的處理流程。
1、ActionServlet的初始化
ActionServlet做爲Struts組件的前端控制器,因爲web.xml的相應配置:
0
在應用一加載時即會被實例化並調用其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
所封裝的地址。
14. 用struts +hibernate作一個增刪查改(機試)
15. Struts2.0與Struts1.x有何區別。
特徵
Struts的一
Struts的2
行動班
Struts的一要求採起行動班,以延長一個抽象的基類。 一個共同的問題在Struts
的一,是編程抽象類而不是接口。 1 2 Struts的行動, 可能實施一項行動的界
面,隨着其餘接口,使可選和定製服務。 Struts的2提供了相應的actionsupport
一流的執行經常使用的接口。 雖然,這項行動的界面是否是必需的 。 任何波霍對象
與執行的簽名能夠被用來做爲一個Struts的二行動的對象。
線程模型
Struts的一行動是單身,必須線程安全的,由於將只有一個實例一類來處理全部的
請求採起行動。 單身人士策略地方的限制,能夠作些什麼與Struts的一行動,並
要求加倍當心發展。 行動的資源,必須線程安全的或同步。 2 Struts的行動對象
是實例對於每一個請求,所以沒有線程安全問題。 (在實踐中, Servlet的容器,
產生許多扔離家出走的對象,每次請求,並多一個對象不施加表現罰款,或影響垃
圾收集) 。
Servlet的依賴 Struts的一行動,依賴於該Servlet的空氣污染指數以來,
httpservletrequest和httpservletresponse傳遞給Execute方法,當一個行動是引
用。 Struts的行動,二是不耦合的一個貨櫃。 最常常的Servlet的背景是派表明
做爲簡單的地圖,讓行動,以測試陷入孤立的境地。 2 Struts的行動仍然可使
用原來的請求和響應,若是須要。 不過,其餘建築元素,減小或消除須要訪問
httpservetrequest或httpservletresponse直接。
測試
一個主要障礙,以測試Struts的一行動是Execute方法暴露了Servlet的空氣污染指
數。 第三黨的擴展, Struts的testcase ,提供了一套模擬對象的Struts 1 。 2
Struts的行動能夠測試實例化的行動,設置屬性,引用的方法。 依賴注入的支持
也使測試更簡單。
收穫的投入 Struts的一使用actionform對象捕獲輸入。 同樣的行動,全部
actionforms必須擴大基地,一流的。 因爲其餘的JavaBeans不能被用來做爲
actionforms ,開發商經常形成多餘的班,以捕捉的投入。 dynabeans能夠用來做
爲一種替代創造常規actionform班,但這裏太,發展商可能會redescribing現有的
JavaBeans 。
Struts的2使用性能的行動做爲輸入屬性,再也不須要第二個輸入對象。 輸入屬性可
能是豐富的對象類型可能有本身的屬性。 行動性質能夠從網頁上經過taglibs 。
Struts的2還支持actionform模式,以及波霍形式,對象和波霍行動。 豐富的對象
類型,其中包括商業利益或域對象,能夠被用來做爲輸入/輸出對象。 該
modeldriven功能簡化taglb的提述,波霍投入對象。
語言表達
Struts的一整合與jstl ,因此它使用jstl下午。 的El已基本對象圖遍歷,但相對
薄弱的收集和索引財產的支持。 Struts的二可使用jstl ,但框架也支持一個更
強大和靈活的語言表達所謂的「對象圖形符號語言」 ( ognl ) 。
有約束力的價值觀歸入意見 Struts的一使用標準的JSP機制,有約束力的物體進入
該網頁的背景下訪問。 Struts的2使用「 valuestack 」技術,使該taglibs能夠訪
問的價值觀沒有耦合您的見解,以對象類型,這是渲染。 該valuestack策略容許
重用的意見覆蓋的類型可能有相同的屬性名稱,但不一樣的屬性類型。
類型轉換
Struts的一actionform屬性一般是全部字符串。 Struts的一用途的商品-
beanutils爲類型轉換。 轉換器每級的,而不是配置的每一個實例。 Struts的2使用
ognl爲類型轉換。 該框架包括轉換爲基本和共同的對象類型和原始。
驗證
Struts的一支持手冊審定經過驗證方法對actionform ,或經過一個擴展到商品校
驗。 班級能夠有不一樣的驗證背景爲同一階層,但不能鏈,以驗證就分對象。
Struts的2支持手冊審定經過驗證的方法和xwork的驗證框架。 該xwork的驗證框架
支持連接驗證分爲分性能的使用驗證的定義爲性能一流的類型和驗證。
控制行動的執行 Struts的一支持獨立的請求處理器(生命週期)爲每一個單元,但
全部的行動,在該模塊必須共用相同的生命週期。 2 Struts的支持,創造不一樣的
生命週期對每行動的基礎上經過攔截堆疊。 自定義棧,才能創造和使用不一樣的行
動,視須要。
16. 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等模板技術。
Hibernate
1. 什麼是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:未提交數據讀。隔離級別最差
設置鎖:樂觀鎖和悲觀鎖。
樂觀鎖:使用版本號或時間戳來檢測更新丟失,在的映射中設置 optimistic-
lock=」all」能夠在沒有版本或者時間戳屬性映射的狀況下實現 版本檢查,此時
Hibernate將比較一行記錄的每一個字段的狀態 行級悲觀鎖:Hibernate老是使用數
據庫的鎖定機制,從不在內存中鎖定對象!只要爲JDBC鏈接指定一下隔 離級別,
而後讓數據庫去搞定一切就夠了。類LockMode 定義了Hibernate所需的不一樣的鎖定
級別:LockMode.UPGRADE,LockMode.UPGRADE_NOWAIT,LockMode.READ;
2. 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文件以下:
type="java.lang.String"
update="true"
insert="true"
access="property"
column="password"
length = "32"
/> 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改
稱小寫。
3. 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. Hibernate與spring的聯繫
hibernate中的一些對象能夠給Spring來管理,讓Spring容器來建立hibernate中一
些對象實例化。例如:SessionFactory,HibernateTemplate等。
Hibernate原本是對數據庫的一些操做,放在DAO層,而Spring給業務層的方法定義了
事務,業務層調用DAO層的方法,很好的將Hibernate的操做也加入到事務中來了。
5. 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);
6. hibernate的對象的三種持久化狀態,並給出解釋?
不清楚hibernate的對象的三種持久化狀態,只知道hibernate對象的三種狀態,下面
有介紹。
7. hibernate中一對多配置文件返回的是什麼?
hibernate中一對多配置文件會相應的映射爲兩張表,而且它們之間的關係是一對
多的。
例如:一個student和classes表的關係 。一個學生只能是一個班的,一個班能夠有
多個學生。
8. update()和saveOrUpdate()的區別?
update()和saveOrUpdate()是用來對跨Session的PO進行狀態管理的。
update()方法操做的對象必須是持久化了的對象。也就是說,若是此對象在數據庫
中不存在的話,就不能使用update()方法。
saveOrUpdate()方法操做的對象既可使持久化了的,也可使沒有持久化的對
象。若是是持久化了的對象調用saveOrUpdate()則會
更新數據庫中的對象;若是是未持久化的對象使用此方法,則save到數據庫中。
9. hibernate的三種狀態之間如何轉換
當對象由瞬時狀態(Transient)一save()時,就變成了持久化狀態。
當咱們在Session裏存儲對象的時候,實際是在Session的Map裏存了一份,
也就是它的緩存裏放了一份,而後,又到數據庫裏存了一份,在緩存裏這一份叫持
久對象(Persistent)。
Session 一 Close()了,它的緩存也都關閉了,整個Session也就失效了,
這個時候,這個對象變成了遊離狀態(Detached),但數據庫中仍是存在的。
當遊離狀態(Detached)update()時,又變爲了持久狀態(Persistent)。
當持久狀態(Persistent)delete()時,又變爲了瞬時狀態(Transient),
此時,數據庫中沒有與之對應的記錄。
10. hibernate拒絕鏈接、服務器崩潰的緣由?最少寫5個
1. db沒有打開
2. 網絡鏈接可能出了問題
3. 鏈接配置錯了
4. 驅動的driver,url是否都寫對了
5. LIB下加入相應驅動,數據鏈接代碼是否有誤
6. 數據庫配置可能有問題
7. 當前聯接太多了,服務器都有訪問人數限制的
8. 服務器的相應端口沒有開,即它不提供相應的服務
9 hibernate有哪些緩存,分別怎麼使用?
10 你對hibernate的瞭解到了一個什麼樣的程度?
11 寫出一個sql語句體現hibernate中一對多的關係
11. Hibernate介紹
Hibernate是一個開放源代碼的對象關係映射框架,它對JDBC進行了很是輕量級的
對象封裝,使得Java程序員能夠爲所欲爲的使用對象編程思惟來操縱數據庫。
Hibernate能夠應用在任何使用JDBC的場合,既能夠在Java的客戶端程序使用,也
能夠在Servlet/JSP的Web應用中使用,最具革命意義的是,Hibernate能夠在應用
EJB的J2EE架構中取代CMP,完成數據持久化的重任。
Hibernate的核心接口一共有5個,分別爲:Session、SessionFactory、
Transaction、Query和Configuration。這5個核心接口在任何開發中都會用到。通
過這些接口,不只能夠對持久化對象進行存取,還可以進行事務控制。下面對這五
個核心接口分別加以介紹。
•Session接口:Session接口負責執行被持久化對象的CRUD操做(CRUD的任務是
完成與數據庫的交流,包含了不少常見的SQL語句。)。但須要注意的是Session對
象是非線程安全的。同時,Hibernate的session不一樣於JSP應用中的HttpSession。
這裏當使用session這個術語時,其實指的是Hibernate中的session,而之後會將
HttpSesion對象稱爲用戶session。
•SessionFactory接口:SessionFactroy接口負責初始化Hibernate。它充當數
據存儲源的代理,並負責建立Session對象。這裏用到了工廠模式。須要注意的是
SessionFactory並非輕量級的,由於通常狀況下,一個項目一般只須要一個
SessionFactory就夠,當須要操做多個數據庫時,能夠爲每一個數據庫指定一個
SessionFactory。
•Configuration接口:Configuration接口負責配置並啓動Hibernate,建立
SessionFactory對象。在Hibernate的啓動的過程當中,Configuration類的實例首先
定位映射文檔位置、讀取配置,而後建立SessionFactory對象。
•Transaction接口:Transaction接口負責事務相關的操做。它是可選的,開發
人員也能夠設計編寫本身的底層事務處理代碼。
•Query和Criteria接口:Query和Criteria接口負責執行各類數據庫查詢。它可
以使用HQL語言或SQL語句兩種表達方式。
12. Hibernate主鍵介紹
Assigned
Assigned方式由程序生成主鍵值,而且要在save()以前指定不然會拋出異常
特色:主鍵的生成值徹底由用戶決定,與底層數據庫無關。用戶須要維護主鍵
值,在調用session.save()以前要指定主鍵值。
Hilo
Hilo使用高低位算法生成主鍵,高低位算法使用一個高位值和一個低位值,然
後把算法獲得的兩個值拼接起來做爲數據庫中的惟一主鍵。Hilo方式須要額外的數
據庫表和字段提供高位值來源。默認請況下使用的表是
hibernate_unique_key,默認字段叫做next_hi。next_hi必須有一條記錄不然
會出現錯誤。
特色:須要額外的數據庫表的支持,能保證同一個數據庫中主鍵的惟一性,但
不能保證多個數據庫之間主鍵的惟一性。Hilo主鍵生成方式由Hibernate 維護,所
以Hilo方式與底層數據庫無關,但不該該手動修改hi/lo算法使用的表的值,不然
會引發主鍵重複的異常。
Increment
Increment方式對主鍵值採起自動增加的方式生成新的主鍵值,但要求底層數
據庫的支持Sequence。如Oracle,DB2等。須要在映射文件xxx.hbm.xml中加入
Increment標誌符的設置。
特色:由Hibernate自己維護,適用於全部的數據庫,不適合多進程併發更新
數據庫,適合單一進程訪問數據庫。不能用於羣集環境。
Identity
Identity當時根據底層數據庫,來支持自動增加,不一樣的數據庫用不一樣的主鍵
增加方式。
特色:與底層數據庫有關,要求數據庫支持Identity,如MySQl中是
auto_increment, SQL Server 中是Identity,支持的數據庫有MySql、SQL
Server、DB二、Sybase和HypersonicSQL。 Identity無需Hibernate和用戶的干涉,
使用較爲方便,但不便於在不一樣的數據庫之間移植程序。
Sequence
Sequence須要底層數據庫支持Sequence方式,例如Oracle數據庫等
特色:須要底層數據庫的支持序列,支持序列的數據庫有DB二、PostgreSql、
Qracle、SAPDb等在不一樣數據庫之間移植程序,特別從支持序列的數據庫移植到不
支持序列的數據庫須要修改配置文件
Native
Native主鍵生成方式會根據不一樣的底層數據庫自動選擇Identity、Sequence、
Hilo主鍵生成方式
特色:根據不一樣的底層數據庫採用不一樣的主鍵生成方式。因爲Hibernate會根
據底層數據庫採用不一樣的映射方式,所以便於程序移植,項目中若是用到多個數據
庫時,可使用這種方式。
UUID
UUID使用128位UUID算法生成主鍵,可以保證網絡環境下的主鍵惟一性,也就
可以保證在不一樣數據庫及不一樣服務器下主鍵的惟一性。
特色;可以保證數據庫中的主鍵惟一性,生成的主鍵佔用比較多的存貯空間
Foreign GUID
Foreign用於一對一關係中。GUID主鍵生成方式使用了一種特殊算法,保證生
成主鍵的惟一性,支持SQL Server和MySQL
13. Hibernate源碼中幾個包的做用簡要介紹
net.sf.hibernate.* 該包的類基本上都是接口類和異常類
net.sf.hibernate.cache.* JCS的實現類
net.sf.hibernate.cfg.* 配置文件讀取類
net.sf.hibernate.collection.* Hibernate集合接口實現類,例如
List,Set,Bag等等,Hibernate之因此要自行編寫集合接口實現類是爲了支持
lazy loading
net.sf.hibernate.connection.* 幾個數據庫鏈接池的Provider
net.sf.hibernate.dialect.* 支持多種數據庫特性,每一個Dialect實現類代
表一種數據庫,描述了該數據庫支持的數據類型和其它特色,例如是否有
AutoIncrement,是否有Sequence,是否有分頁sql等等
net.sf.hibernate.eg.* Hibernate文檔中用到的例子
net.sf.hibernate.engine.* 這個包的類做用比較散
net.sf.hibernate.expression.* HQL支持的表達式
net.sf.hibernate.hq.* HQL實現
net.sf.hibernate.id.* ID生成器
net.sf.hibernate.impl.* 最核心的包,一些重要接口的實現類,若是
Session,SessionFactory,Query等
net.sf.hibernate.jca.* JCA支持,把Session包裝爲支持JCA的接口實現類
net.sf.hibernate.jmx.* 我不懂JMX,只知道JMX是用來編寫App Server的
管理程序的,大概是JMX部分接口的實現,使得App Server能夠經過JMX接口管理
Hibernate
net.sf.hibernate.loader.* 也是很核心的包,主要是生成sql語句的
net.sf.hibernate.lob.* Blob和Clob支持
net.sf.hibernate.mapping.* hbm文件的屬性實現
net.sf.hibernate.metadata.* PO的Meta實現
net.sf.hibernate.odmg.* ODMG是一個ORM標準,這個包是ODMG標準的實現類
net.sf.hibernate.persister.* 核心包,實現持久對象和表之間的映射
net.sf.hibernate.proxy.* Proxy和Lazy Loading支持
net.sf.hibernate.ps.* 該包是PreparedStatment Cache
net.sf.hibernate.sql.* 生成JDBC sql語句的包
net.sf.hibernate.test.* 測試類,你能夠用junit來測試Hibernate
net.sf.hibernate.tool.hbm2ddl.* 用hbm配置文件生成DDL
net.sf.hibernate.transaction.* Hibernate Transaction實現類
net.sf.hibernate.type.* Hibernate中定義的持久對象的屬性的數據類型
net.sf.hibernate.util.* 一些工具類,做用比較散
net.sf.hibernate.xml.* XML數據綁定
14. 緩存管理
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) 選擇合適的緩存插件,而後編輯該插件的配置文件。
Spring
1. 你通常用spring作什麼?
控制反轉IOC AOP
2. spring中的哪一個類的哪一個方法可用於獲取bean
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. 項目中如何體現Spring中的切面編程,距離說明。
面向切面編程:主要是橫切一個關注點,將一個關注點模塊化成一個切面。在切面
上聲明一個通知(Advice)和切入點(Pointcut); 通知: 是指在切面的某個特定的連
接點(表明一個方法的執行。經過聲明一個org.aspectj.lang.JoinPoint類型的參
數可使通知(Advice)的主體部分得到鏈接點信息。)上執行的動做。通知中定
義了要插入的方法。切入點:切入點的內容是一個表達式,以描述須要在哪些對象
的哪些方法上插入通知中定義的方法。
項目中用到的Spring中的切面編程最多的地方:聲明式事務管理。
a、定義一個事務管理器
b、配置事務特性(至關於聲明通知。通常在業務層的類的一些方法上定義事務)
c、配置哪些類的哪些方法須要配置事務(至關於切入點。通常是業務類的方法上)
5. spring中能夠用注入得到屬性值,還有其餘的方式嗎?
讀取配置文件
6. spring在項目中如何充當粘合劑
一、在項目中利用spring的IOC(控制反轉或依賴注入),明確地定義組件接口(如
UserDAO),開發者能夠獨立開發各個組件, 而後根據組件間的依賴關係組裝
(UserAction依賴於UserBiz,UserBiz依賴於UserDAO)運行,很好的把
Struts(Action)和hibernate(DAO的實現)結合起來了。
二、spring的事務管理把hibernate對數據庫的操做進行了事務配置。
7. spring的事務如何配置
spring的聲明式事務配置:
1.
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
/WEB-INF/classes/hibernate.cfg.xml
2. 配置事務管理器
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
3. 配置事務特性
4. 配置哪些類的哪些方法配置事務
isolation設定事務的隔離級別,事務管理器根據它來控制另一個事務能夠看到
本事務內的哪些數據。
定義的5個不一樣的事務隔離級別:
DEFAULT:默認的隔離級別,使用數據庫默認的事務隔離級別
READ_COMMITTED:保證一個事務修改的數據提交後才能被另一個事務讀取。另外
一個事務不能讀取該事務未提交的數據。這種事務隔離級別能夠避免髒讀出現,但
是可能會出現不可重複讀和幻像讀。
READ_UNCOMMITTED:這是事務最低的隔離級別,它充許別外一個事務能夠看到這個
事務未提交的數據。這種隔離級別會產生髒讀,不可重複讀和幻像讀。
REPEATABLE_READ:這種事務隔離級別能夠防止髒讀,不可重複讀。可是可能出現
幻像讀。它除了保證一個事務不能讀取另外一個事務未提交的數據外,還保證了避免
不可重複讀。
SERIALIZABLE:這是花費最高代價可是最可靠的事務隔離級別。事務被處理爲順序
執行。除了防止髒讀,不可重複讀外,還避免了幻像讀。
propagation定義了7個事務傳播行爲
REQUIRED: 若是存在一個事務,則支持當前事務。若是沒有事務則開啓一個新的
事務。
SUPPORTS: 若是存在一個事務,支持當前事務。若是沒有事務,則非事務的執
行。可是對於事務同步的事務管理器,SUPPORTS與不使用事務有少量不一樣。
REQUIRES_NEW 老是開啓一個新的事務。若是一個事務已經存在,則將這個存在的
事務掛起。
NOT_SUPPORTED 老是非事務地執行,並掛起任何存在的事務。
NEVER 老是非事務地執行,若是存在一個活動事務,則拋出異常
NESTED:若是一個活動的事務存在,則運行在一個嵌套的事務中. 若是沒有活動事
務, 則按TransactionDefinition.PROPAGATION_REQUIRED 屬性執行。
嵌套事務一個很是重要的概念就是內層事務依賴於外層事務。外層事務失敗時,會
回滾內層事務所作的動做。而內層事務操做失敗並不會引發外層事務的回滾。
REQUIRED應該是咱們首先的事務傳播行爲。它可以知足咱們大多數的事務需求。
8. transaction有那幾種實現(事務處理)(Spring)
在Spring中,事務處理主要有兩種方式
(1) 代碼控制事務
在程序中引入新的模版類,這個類封裝了事務管理的功能
(2) 參數配置控制事務,在Application-Context.xml增長一個事務代理
(UserDAOProxy)配置
2. IBATIS中的事物屬性怎麼配置
SQL MAP XML配置文件中的transactionManagerhtml