java面試重點總結(jié)_第1頁
java面試重點總結(jié)_第2頁
java面試重點總結(jié)_第3頁
java面試重點總結(jié)_第4頁
java面試重點總結(jié)_第5頁
已閱讀5頁,還剩16頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

反射

重寫(覆蓋):父子

重載:一個類內(nèi)

equals&&hashCode:為什么要同時覆蓋?

hashCodP覆蓋的主要作用是為了配合基于散列的集合一起正

常運行,這些結(jié)合包括;

hashSet,hasMap,HashTable

對集合的操作?

l.hashSet.addiobjecto);

他會先調(diào)用這個對象的hashcode()方法,定位到他要放的物理位置

如果該位置上沒有元素,則直接把該元素存儲在該位置上。

如果該位置有元素,則會調(diào)用該對象的equals方法,判斷他

們是否相同。

相同,則不存儲不相同,則散列到其他地址。

2.hashSet.contains(objecto);

查找一個元素時:首先調(diào)用該對象的hashCode方法,若該位置有元素則調(diào)用equals方法,否

則不調(diào)用。

默認(rèn)的hashCode是一個本地方法,返回的是一個與地址所對應(yīng)的值(但不是內(nèi)存地址)

如果Student覆蓋了equalsandhashCode方法

hashSet.add(newstudent(l/zs//));〃只調(diào)用hashCode

hashSet.add(newstudent(2/lsMl);〃只調(diào)用hashCode

hashSet.add(newstudent(3,"wv/"));〃只調(diào)用hashCode

hashSet.add(newstudent(l,"zs"));〃調(diào)用hashCode還要調(diào)用ecuals

如果Student覆蓋了equals但hashCode返回值相等

hashSet.add(newstudent(l/zs//));〃只調(diào)用hashCode

hashSet.addfnewstudent(2/,Is"));〃只調(diào)用hashCode,1次equals

hashSet.add(newstudent{3,"ww"));〃只調(diào)用hashCode,2次equals

hashSet.add(newstudent。,"zs"));〃調(diào)用hashCodeX次equas

String:

2.html有瀏覽器解析執(zhí)行,主要:兼容性問題

css數(shù)據(jù)與外觀分離(主要負(fù)責(zé)頁面的外觀)

js:用于與頁面交互的腳本語言,在瀏覽器端執(zhí)行。

作用:

1.前端驗證(驗證不通過,瀏覽器不提交數(shù)據(jù)到服務(wù)器。)

2.ajax核心技術(shù)一,用于異步的向服務(wù)器發(fā)送請求,并動態(tài)更新頁面。

3.與頁而交互,生成一些動態(tài)效果(比如:嵌入動態(tài)文本于HTML頁面)

4.獲取瀏覽器的相關(guān)信息。

3.瀏覽器如何處理URL:http://ip:port/appname/login.do

第一步:服務(wù)器查看有沒有appname對應(yīng)的用戶存在,若沒有返回404,如有則進(jìn)入下

一步。

第二步:在web.xml中(與appname所對應(yīng)的),使用"/login.do”與url-pattern進(jìn)

行匹配

第二步:如果任然沒有匹配到,會查詢靜態(tài)資源。

如果找到返回,找不到返回404.

4.get&&post請求

Get:

什么時候采用:表單的默認(rèn)提交方式,直接在瀏覽器上輸入地址,通過鏈接訪問。

特點:在地址欄會顯示數(shù)據(jù),請求數(shù)據(jù)會放在請求資源路徑后而,一般用于向服務(wù)器獲取資

源。

Post:

設(shè)置表單為post方式:

特點:數(shù)據(jù)不會在地址欄顯示,數(shù)據(jù)會存放在實體內(nèi)容里,一般用于向眼務(wù)器發(fā)送數(shù)據(jù)。

二者對比:get的缺點:提交的數(shù)據(jù)有限制(因為只能存放在請求行之后)

不安全(瀏覽器地址欄能看到數(shù)據(jù))

Post的優(yōu)點:數(shù)據(jù)量大(因為存放到實體內(nèi)容里面)

相對安全(但是實體內(nèi)容的數(shù)據(jù)任然沒有加密,可以借助工具看到)

5.重定向與轉(zhuǎn)發(fā)

重定向:服務(wù)器向瀏覽器發(fā)送一個狀態(tài)碼為302及一個消息頭location,瀏覽器會立即向

location所指向的地址發(fā)送一個新的請求。

編程:response.sendRedirect(重定向地址)

重定向的特點及需要注意的:

重定向的地址是任意的

瀏覽器中地址欄的地址會變成重定向的地址

一件事情已經(jīng)做完了。

由于重定向方式產(chǎn)生了一個新的請求,所以經(jīng)過一次重定向后,request內(nèi)的對

象將無法使用。

轉(zhuǎn)發(fā):在同一個應(yīng)用內(nèi)部,一個組件將未完成的任務(wù)轉(zhuǎn)交給另外一個組件來完成。

編程:request.getRequestDispatcher("另一個組件的地址。.forward(request,response);

特點:一件事情未完成

轉(zhuǎn)發(fā)的目的地,只能是司一個應(yīng)用內(nèi)部

轉(zhuǎn)發(fā)時瀏覽器地址欄的地址沒有任何改變。

轉(zhuǎn)發(fā)涉及組件之間,可以共享同一個request,response對象。

前后兩個頁而有數(shù)據(jù)傳遞用請求轉(zhuǎn)發(fā)(servlet查詢出數(shù)據(jù),轉(zhuǎn)發(fā)到j(luò)sp),沒有則用重定向。

要注意的:重定向/轉(zhuǎn)發(fā)之前不能有任何的輸出(有則報錯)。如果緩存中有數(shù)據(jù),重定向/

轉(zhuǎn)發(fā)之前會清空緩存中的數(shù)據(jù)。

6.servlet:在服務(wù)器上運行的小程序.也是擴(kuò)展web服務(wù)器的一種組件。

組件(程序員寫):組件是符合規(guī)范,完成一一定功能,并可以單獨部署的軟件模塊,組件般

不能單獨運行,需要依賴容器才能運行。

容器(一般由大廠商提供):提供組件的運行環(huán)境,并且管理組件的生命周期。

Servlet容器:提供servlet運行的環(huán)境,并且管理servlet的生命周期,一般常見的web容器:

比如tomcat,除了一個servlet以外,同時也是一個web服務(wù)器。(既是servlet容器,又是

web容器)

servlet是運行于servlet容器中,可以被servlet容器動態(tài)加載,來擴(kuò)展服務(wù)器的功能,并提供

特定的服務(wù)。servlet按照請求/相應(yīng)的方式工作。

主要作用:web服務(wù)器本身沒有計算能力,也就誰說,不能處理動態(tài)資源的請求。servlet

可以處理動態(tài)資源的請求。

Servlet響應(yīng)用戶請求的過程:

瀏覽器輸入一個地址(指向一個servlet)http://ip:port/m/test/login.do

1.瀏覽器依據(jù)ip,端口號連接服務(wù)器

2.瀏覽器將請求數(shù)據(jù)包按http協(xié)議打包成一個http請求數(shù)據(jù)包

3.服務(wù)器“看出來”這個請求要的是一個servlet(web.xml中為url-pattern進(jìn)行匹配),此

時服務(wù)器中的一個負(fù)貨通訊的模塊(一般叫做servlet引擎)會創(chuàng)建

HttpServletRequest實例(HttpServletRequest實際上是一個接口,有服務(wù)器提供者實現(xiàn),該

實例包含了請求數(shù)據(jù)中的數(shù)據(jù))

還創(chuàng)建了HttpServletResponse實例。

4.服務(wù)器依據(jù)port之后的部分mytest/login.do找到web.xml,依據(jù)web.xml中的信息找到對

應(yīng)的servlet類名。

<servlet>

<servlet-name>UserMgmt</servlet-name>

<servlet-class>web.UserMgmt</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>UserMgmt</servlet-name>

<url-pattern>*.do</url-pattern>

</servlet-mapping>

會查看該servlet有沒有對應(yīng)的實例,如果沒有則創(chuàng)建實例,如果有則使用現(xiàn)成實例(此時

可能出現(xiàn)線程安全問題)

//service(HttpServletRequestrequest,HttpServletResponseresponse)

〃對于程序員,就操作這兩個對象。

接下來調(diào)用service()方法。Service方法里面的代碼可以通過HttpServletRequest提供

的方法獲取請求中的數(shù)據(jù)。并且可以將處理之后的結(jié)果通過HttpServletResponse提供的方

法設(shè)置返回的結(jié)果。

5.servlet引擎從HttpServletResponse獲取數(shù)據(jù),生成http響應(yīng)數(shù)據(jù)包,發(fā)送給瀏覽器。

6.servlet生命周期:

核心接口:servlet接口(所有的servlet必須實現(xiàn)該接口)

該接I」主要定義三個方法:

init(ServletConfigconfig):初始化方法ServletConfig:主要用于獲取

servlet配置參數(shù)。

service(req,res):處理請求(判斷get/post請求,調(diào)用響應(yīng)的

doget/dopost)

destroy。:銷毀資源容器根據(jù)自己的算法,在刪除之前調(diào)用destory。釋放資源。

servlet容器默認(rèn)調(diào)用有參的(GenericServlet類中)

publicvoidinit(ServletConfigconfig){

this.config=config;

init();

)

1.實現(xiàn)servlet接口

2.繼承GenericServlet1實現(xiàn)service方法)

3.繼承HttpServlet類(幣寫doGet,doPost方法就行)

默認(rèn)的init()方法由GenericServlet來實現(xiàn),如果想自定義自己的初始化過程,可以重寫

lnit()(直接寫要寫的代碼)方法或重寫init(ServletConfigconfig)(要調(diào)用父類的

super.init(config))

7.Why?jsp:因為直接使用servlet生成動態(tài)頁面過于繁瑣,使用jsp生成動態(tài)頁面更方便。

(jsp不需要編譯,直接打包,就可以運行)

Jsp(javaserverpage):服務(wù)器端動態(tài)頁面生成技術(shù),主要組成部分是html元素,以及少量java

代碼,

Jsp:如何運行

當(dāng)訪問某個Jsp文件時,jsp引擎(servlet容器中的某一個特點的模塊)會將.Jsp文件轉(zhuǎn)換

為.Java文件(Java就是一個servlet)然創(chuàng)建其實例,并調(diào)用其service()方法。

Jsp>java

對于java代碼片段<%%>:把代碼直接放在service。方法中

對于java表達(dá)式<%=%>:放到service。方法中,使用out.prin()輸出

對于html:放到service。方法中,使用out.write()輸出

注:print(null)輸出null,write(null)輸出"

對于<%!Stringline="hellowordl"%>:聲明的變量會作為對應(yīng)的servlet的屬性

力法oooo00OOOOO?ooooooo―1個獨3/1方法

(不建議用,容易導(dǎo)致線程不安全)

8.Session&&cookie

http是無狀態(tài)的,(可以利用有限的資源為多個客戶服務(wù))即:http服務(wù)器不記錄哪一個瀏

覽器訪問了

要記錄狀態(tài)的情況:比如購物系統(tǒng),要記錄客戶端的狀態(tài)。

Cookie:將用戶的狀態(tài)保存在客戶端。

Session將用戶的狀態(tài)保存在服務(wù)器端。

Cookie:瀏覽器訪問某個服務(wù)器時,服務(wù)器會創(chuàng)建一部分?jǐn)?shù)據(jù)。(以消息頭set-cookie的方式)

發(fā)送給瀏覽器,瀏覽器會將這部分?jǐn)?shù)據(jù)保存下來。當(dāng)瀏覽器再次訪問該服務(wù)器時,將會把這

部分?jǐn)?shù)據(jù)發(fā)送給服務(wù)器。

創(chuàng)建:response.addCookie(…)

查詢:request.getCookies()

Cookie限制:

l.cookie只能保存字符串,并且對于中文,需要編碼。

2.cookie大小有限制(4k左右)

3.cookie的個數(shù)也有限制(本地大約三百)

4.cookie不是很安全

5.cookie可能被用戶禁止。

Cookie的時用場合:自動登錄,網(wǎng)頁換膚,。。。。。。

路徑問題:http://ip:port/appname/jsp01/jsp01.jsp

創(chuàng)建cookie時都會有一個默認(rèn)的path此時為:/appname/jspOl

當(dāng)請求這個路徑之下的,都會把cookie帶過去egg:/appname/jspOl/acd/cde.jsp

/appname/jspOl.jsp則不會。

Session:瀏覽器訪問服務(wù)器時,服務(wù)器會創(chuàng)建一個對象(session對象),同時,還會生成一個

標(biāo)識該對象的唯一字符串(sessionlD),服務(wù)器在默認(rèn)的情況下使用cookie機(jī)制將sessionlD

發(fā)送到瀏覽器,瀏覽器下次訪問時,會將sessionlD攜帶到服務(wù)器,服務(wù)器使用sessionlD查

找對應(yīng)的session對象。

用戶禁止cookie:

使用:URL重寫機(jī)制來解決,url+sessionlD

即在訪問某個需要session機(jī)制支持的組件時,不需要在瀏覽器地址欄輸入地址,而是

通過服務(wù)器生成的URL地址來訪問。

response.encodeURL(uH)〃在鏈接,表單提交時使用。

response.encodeRedirectURL(url)//在重定向時,使用

session優(yōu)點:

相對于cookie機(jī)制,安全,存放的數(shù)據(jù)可以是對象,存放的數(shù)據(jù)量也更大。

缺點:

所有的數(shù)據(jù)都存在服務(wù)器端,服務(wù)器端壓力比較大,一般會采取激活,鈍化機(jī)制,將

session當(dāng)中的數(shù)據(jù)臨時保存到文件或者數(shù)據(jù)庫。

Servlet線程安全問題:在饋認(rèn)情況下,容器只會為某個servlet維護(hù)一個實例,當(dāng)多個請求到

達(dá)容器時,有可能多個線程會訪問同一個實例。

如何解決:

1.加鎖。比如可以使用synchronized對方法或者代碼塊加鎖。

2.實現(xiàn)SingleThreadModel接口(servlet容器會為每一個請求創(chuàng)建一個與之對應(yīng)的

實例,不建議使用,因為這樣會創(chuàng)建大量的servlet對象)

3.避免使用全局變量(實例變量),使用局部變量。

4.盡量不對屬性值進(jìn)行修改(即:盡量不要對全局變量值,進(jìn)行修改。)

Ajax:通過瀏覽器內(nèi)置的XMLR^quest異步的向服務(wù)器發(fā)送請求,服務(wù)器在處理完請求后,返

回數(shù)據(jù)給XMLRequest,通過JavaScript可以獲取XMLHttpRequest中的數(shù)據(jù),然后使用該數(shù)據(jù)

更新頁面。

編程:

1.獲耳乂XMLHttpRequest對象

2.使用XMLHttpRequest對象

1)url

2)XMLHttpRequestopen('get/post',url,true)

3)XMLHttpRequestonReadyStateChange=funl;

〃注冊回調(diào)函數(shù),用于處理服務(wù)器請求。

4)XMLHttpRequestSend()

3.在服務(wù)器端編寫相應(yīng)代碼處理請求。再服務(wù)器端,一般不會返I可完整的頁面,只需要返回

部分?jǐn)?shù)據(jù)。

4.在回調(diào)函數(shù)中,通過XMLHttpRequest獲取數(shù)據(jù),然后更新頁面。

El&ajstl自定義

EL即ExpressionLanguage(表達(dá)式語言)

EL的語法:${ELexprission)

${}或${bean['na-ne']}

JSTL(JSPStandardTagLibrary)是JSP標(biāo)準(zhǔn)標(biāo)簽庫

自定義el函數(shù):

L寫一個java類,定義一個或者多個publicstatic方法,在方法中實現(xiàn)函數(shù)邏輯。

2.在.tld文件中描述該函數(shù)。(在jstl庫中,找至Ufn.tld參考其格式)

3.在jsp頁面中,使用taglib指令導(dǎo)入相應(yīng)的函數(shù)。

自定義標(biāo)簽:

<%@tagliburi="/jsp/jstl/core"prefix="c"%>

1.寫一個java類,實現(xiàn)SimpleTag接口,或者繼承SimpleTagSupport。

2.在java類中,重寫doTag()方法,在該方法當(dāng)中,實現(xiàn)標(biāo)簽的業(yè)務(wù)邏輯。

3.在.tld文件當(dāng)中,描述標(biāo)簽

4.在jsp頁面中,使用taglib指令導(dǎo)入相應(yīng)的標(biāo)簽。

OGNL(Object-GraphNavigationLanguage),大概可以理解為:對象圖形化導(dǎo)航語言。是一種

可以方便地操作對象屬性的開源表達(dá)式語言。

過濾器:在servlet規(guī)范中定義的一種特殊的類,可以用來攔截服務(wù)器調(diào)用servlet的過程。

編程:1.寫一個類,實現(xiàn)impl2mentsFilter■接口

2.在doFilter()方法里,實現(xiàn)過濾的邏輯。

3.在web.xml中配置過濾器

<filter>

<filter-name>CommentSizeFilter</filter-name>

<filter-class>web.CommentSizeFilter</filter-class>

</filter>

<filter-mapping>

<filter-name>CommentSizeFilter</filter-name>

<url-pattern>/comment</url-pattern>

</filter-mapping>

過濾器的優(yōu)先級:按配置的先后順序執(zhí)行

SSH內(nèi)容:

Struts2負(fù)責(zé)顯示層和控制層,Spring負(fù)責(zé)業(yè)務(wù)層,hibernate負(fù)責(zé)持久化層。

Struts2:工作流程

瀏覽器1請求過濾器2調(diào)用action3調(diào)用業(yè)務(wù)類

action4轉(zhuǎn)發(fā)Jsp5應(yīng)答瀏覽器

l.Action中獲取jsp的值:

1.頁面中name的屬性和action中的屬性必須保持一致。

2.Action中的屬性必須有g(shù)et和set方法。

3.滿足這兩個條件就實現(xiàn)了屬性驅(qū)動。

實現(xiàn)原理:

struts2會攔截器

publicclassActionMappingParametersInteceptorextendsParameterslnterceptor

根據(jù)反射的機(jī)制,調(diào)用對應(yīng)action的對應(yīng)set方法,獲取頁面表單的值。

模型驅(qū)動:

publicclassModelActionextendsActionsupport

implementsModelDriven<User>{

privateUseruser=newUser();

?Override

publicUsergetModel(){

returnuser;

)

過程為:當(dāng)瀏覽器提交ModelAction.action請求時,先經(jīng)過攔截器。其中有一個攔截器為

ModelDrivenlnterceptor,從這個源代碼可以看出,這個攔截器的作用就是獲取實現(xiàn)了

ModelDriver接口的action的模型驅(qū)動。在這里為user。然后把模型驅(qū)動利用push方法壓入

到棧頂。這樣我們就能直接通過屬性進(jìn)行回顯和賦值了。

通過這個圖也可以看出模型驅(qū)動的攔截器在參數(shù)攔截器前面,也就是先把模型驅(qū)動壓入棧

頂,再進(jìn)行賦值。

模型驅(qū)動過程:當(dāng)用戶觸發(fā)UserAction動作時,ModelDriven攔截器會調(diào)用相關(guān)UserAction對

象的getModel()方法,并將返回值<User實例)壓入到valueStack棧中,接下來parameters

攔截器將把表單中的字段映射到valuestack棧頂對應(yīng)的各個屬性當(dāng)中。因為此時棧頂是剛剛

被壓入的模型,所以模型被填充。

不能轉(zhuǎn)換的怎么辦:比如struts2要求的日期是:yyyy-mm-dd

1、但如果是yyyyMMdd怎么辦?

2、寫一個java類,這個類必須繼承DefaultTypeConverter或者實現(xiàn)

TypeConverter接口。

3、配置自定義的類型轉(zhuǎn)換器:

L基于字段(局部的)

創(chuàng)建一個屬性文件actionName(根據(jù)action類名來寫)

-perties,該文件需要與相對應(yīng)的動作類放在同一目錄下。

Egg:UserActioi—perties中

createTime=com.lyg.converter.DateConverter

2.基于類(全局的)

在根目錄下:創(chuàng)建xwork-perties

Java.util.Date=com.lyg.converter.DateConverter

2.國際化

L定義不同的資源文件

resources_en_US.properties

resources_zh_CN.properties

perties(默認(rèn))

2.在struts.xml中配置(constantname="struts.cuttom.il8.re$ourse"value=w.resources,,>

通過ieinternet選項修改語言來測試。

2.自定義攔截罌:攔截器是ACP的一種實現(xiàn)

所有的攔截器都實現(xiàn)了Interceptor接口,或者繼承了Interceptor接口擴(kuò)展類實現(xiàn)類。

重寫init(),intercept。,destroy。方法

intercept。每次請求就執(zhí)行一次,做相關(guān)的處理工作

在struts.xml中配置,注冊即:把默認(rèn)棧加入到自己寫的攔截器中

<interceptors>

<!--定義自己的攔截器

(interceptorname="accesslnterceptor"

class="erceptor.Privilegelnterceptor">

</interceptor>

<!--聲明攔截器棧-->

<interceptor-stackname="accesslnterceptorStack">

<!-引用自定義的攔截器-->

<interceptor-refname="accesslnterceptor"x/interceptor-ref>

<!-引用struts2內(nèi)部的攔截器棧->

<interceptor-refname="defaultStack"x/interceptor-ref>

</interceptor-stack>

</interceptors>

使用自己寫的攔截器棧:

<default-interceptor-refname="accesslnterceptorStack"x/default-interceptor-ref>

說明:使用攔截器棧。從上面聲明部分可以看出,accessInterceptorStack棧既包括了自定義的

攔截器,又包括了struts2內(nèi)部的攔截器棧。

攔截器與過濾器的區(qū)別;

1)攔截器是基于Java反射機(jī)制的,而過濾器是基于接口回調(diào)的。s

2)過濾器依賴于Servlet容器,而攔截器不依賴于Servlet容器。

3)攔截器只能對Action請求起作用,而過濾器可以對所有請求起作用。

4)攔截器可以訪問Action上下文、值棧里的對象,而過濾器不能。

3.文件上傳

4.struts2手工驗tit&&xml驗證

Get/set獲取數(shù)據(jù)驗證:

publicvoidvalidate。{}這是一個默認(rèn)的實現(xiàn),子類應(yīng)該覆蓋整個方法去完成驗證邏輯,執(zhí)行

后filedError為空,特?執(zhí)行action中的處理方法。

針對所有業(yè)務(wù)方法:validate。

針對某一個業(yè)務(wù)方法:validateLogin()

4.ognl對象導(dǎo)航語言struts2默認(rèn)表達(dá)是語言

#訪問OGNL上下文和action上下文

//request.username等彳介于request.getAttribute(//usernamew)

訪問根元素則不需要

%{}告訴環(huán)境{}里面的是ognl表達(dá)式。

$:用于在國際化資源文件中,引用OGNL

用于在struts.xml配置文件中,引用OGNL表達(dá)式。比如:ab:.jsp?username=${username}

5.回顯

回顯是用棧頂元素值回顯。

方法「要么修改壓入到棧頂元素的屬性值。

方法二:要么刪除棧頂元素,壓入新構(gòu)外的對象。

注意:不能使用賦值因為賦值改變的是引用,不會改變值棧的值。

6.處理表單重復(fù)提交

1.在表單中增加隱藏域:<s:token></s:token>

2.在默認(rèn)攔截器棧中加入,令牌攔截器并配置針對的方法.(修改默認(rèn)攔截器)

3.在struts.xml中增加一個返回結(jié)果類型result

<resultname=,/invalid.token,/>abc.jsp</result>表單重復(fù)攝交后轉(zhuǎn)到的頁面

7.valueStack值棧

6.ValueStack內(nèi)存結(jié)構(gòu)圖

OgnIValueStack包含:

一個root(對象棧)>ArrayList

一個context--0Map(跟確切地說是一個ognlcontext)

Ognlcontext:包含

一個默認(rèn)的頂層對象root(是OgnIValueStack中root對象的一個拷貝)

此處的值:不需要#直接通過元素名訪問。

一個m叩對象

此處的值:需要#訪問。

Valuestack在ActionContext中,ffoActionContext在ThreadLo仕I中,所以可以保證數(shù)

據(jù)的安全性。

Hibernate:

Udbc與hibernate比較:

Jdbc:優(yōu)點效率高,連接池代碼繁瑣,沒有數(shù)據(jù)緩存。

Hibernate:優(yōu)點面向?qū)ο缶幊?,?shù)據(jù)緩存

提出了緩存機(jī)制,這樣可以使訪問數(shù)據(jù)的效率提高很大。

缺點:大量數(shù)據(jù)的條件下不適合,

程序員對hibernate生成的sql語句不可控。對于sql優(yōu)化要求很高的項目中,不適合。

2.對象關(guān)系映射(ObjectRelationalMapping,簡稱ORM)

是一種為了解決面向?qū)ο笈c關(guān)系數(shù)據(jù)庫存在的互不匹配的現(xiàn)象的技術(shù)。

3.理解sessionFactory

1.在sessionFactory中存放著配置文件和所有的映射文件。

2.sessionFactory是一個重量級的類。

3.一個數(shù)據(jù)庫只能有一個sessionFactory。

4.一個配置文件只能連接一個數(shù)據(jù)庫

5.只要創(chuàng)建了sessionFactory,表就創(chuàng)建完了

6.sessionFactory存放的數(shù)據(jù)是共享的,但這個類的數(shù)據(jù)本身是線程安全的。

7.sessionFactory是?個接口,其實現(xiàn)類是:sessionFactorympl

SessionFactory線程安全的

Session線程不安全

采用getCurrentSession。創(chuàng)建的Session會綁定到當(dāng)前的線程中去、而采用OpenSessionO

則不會。

采用getCurrentSession。創(chuàng)建的Session在commit或rollback后會自動關(guān)閉,采用

OpenSessionO必須手動關(guān)閉。

4.對象的狀態(tài)

簡單理解:內(nèi)存中有兩個又域一個區(qū)域與一般內(nèi)存一樣另一個是hibernate內(nèi)存區(qū)域

位于一般內(nèi)存區(qū)域的對象:臨時對象

位于hibernate內(nèi)存區(qū)域的對象:持久化對象

處于hibernate內(nèi)存中的數(shù)據(jù)被清除后,被清除的對象叫做游離對象。

持久化對象有3種狀態(tài):

持久化狀態(tài)(Persist):

Session的save方法把臨時對象轉(zhuǎn)變?yōu)槌志没瘜ο蟆?/p>

Session的load()或get。方法返回的對象總是處于持久化狀態(tài)。

Session的update(),saveOrUpdate()方法使游離對象轉(zhuǎn)變?yōu)槌志没瘜ο蟆?/p>

當(dāng)一個持久化對象關(guān)聯(lián)一個臨時對象,在允許級聯(lián)保存的情況下,session在清理

緩存時會把這個臨時對象也轉(zhuǎn)換為持久化對象。

OID不為null(oid對象標(biāo)識符)

位于Session緩存中

持久化對象和數(shù)據(jù)庫中的相關(guān)記錄對應(yīng)

Session在清理緩存時,會根據(jù)持久化對象的屬性變化,來同步更新數(shù)據(jù)庫

在同一個Session實例的緩存中,數(shù)據(jù)庫表中的每條記錄只對應(yīng)唯一的持久化

對象

臨時狀態(tài)(transient);

當(dāng)通過new語句創(chuàng)建了一個java對象,它處于臨時狀態(tài)。此時不和數(shù)據(jù)庫中的

任何記錄對應(yīng)。

在使用代理主鍵的情況下,OID通常為null

不處于Session的緩存中

在數(shù)據(jù)庫中沒有充應(yīng)的記錄

游離狀態(tài)(Detached)

當(dāng)調(diào)用session的close。方法時,session的緩存被清空,緩存中的數(shù)據(jù)所有持久化數(shù)據(jù)

都變?yōu)橛坞x對象。如果在應(yīng)用程序中沒有引用變量引用這些游離對象,它們就會結(jié)束生

命周期。

Session的evict。方法能夠從緩存中刪除一個持久化對象,使他變成游離狀態(tài)。當(dāng)

session的緩存保存了大量的持久化對象,會消耗許多內(nèi)存空間,為了提高性能,可以

考慮調(diào)用evict()方法,從緩存中刪除一些持久化對象。

OID不為null

不再處于Session的緩存中

一般情況需下,游離對象是由持久化對象轉(zhuǎn)變過來的,因此在數(shù)據(jù)庫中可能還存在

與它對應(yīng)的記錄

Session緩存存在對應(yīng)的數(shù)據(jù)中存在對應(yīng)的記泉

記泉

臨時態(tài)nono

持久態(tài)yes麗力.也可能沒仃

游離態(tài)no可能位數(shù)據(jù)沒仃刪除)也

可能沒仃

Customerc=newCustomer();

session.save(c);//1j久對象,俱數(shù)據(jù)庫中沒(i

saveOrllpdate:

該方法同時包含save和update方法,如果參數(shù)是臨時對象就用save方

法,如果是游離對象就用update方法,如果是持久化對象就直接返回(不執(zhí)行)。

如果參數(shù)是臨時對象就用save方法

5.映射關(guān)系:

主鍵產(chǎn)生機(jī)制:Increment,Identity,Sequence,。。。。。。。

一對多:classesstudent

Student.java中privateClassesclasses;

Classes.java中privateSet<Student>students;

配置文件:

Student.hbm.xml

<many-to-onename=*'classesMclass=Mlyg-coin.Classes">

<columnname=McidM/>〃外鍵描述了,通過student建立與classes之間的關(guān)系

</many-to-one>

Classes.hbm.xml

<setname=,,students,/inverse=wfalsew>

<key>

<columnname="cid”/>

</key>

<one-to-manyclass=vcom.lyg.Studentn/>//指出Classes和那個對象進(jìn)彳亍關(guān)聯(lián)。

</set>

多對多:Coursestudent

Student.hbm.xml

<setname=,,courses,/table=wstudent-courseMinverse="false”>

<key>

<columnname=wsidM/>

</key>

<many-to-manyclass=ncom.lyg.Course,^column』‘cid”/>

</set>

Course.hbm.xml

<setname="students“table=wstudent-coursez,inverse=wfalseM>

<key>

<columnname="cid"/>

</key>

<many-to-manyclass="com.lyg.Student"column=,,sid”/>

</set>

一般一對多的涉及到美系的維護(hù):都通過多的一方來維護(hù),避免發(fā)出叩date語句

Inverse:不維護(hù)關(guān)系false維護(hù)

Cascade:級聯(lián)

6.一級緩存&&二級緩存

一級緩存:?級緩存在session中存放存放私有的session級別的緩

只要一個對象是持久化對象,數(shù)據(jù)就在一級緩存中。

把緩存中的數(shù)據(jù)同步到數(shù)據(jù)庫:session.flushO

把數(shù)據(jù)庫中的數(shù)據(jù)同步到一級緩存:session.reflush。只能同步一個對象

清空一級緩存:session.clear();

二級緩存:二級緩存在sessionFctory中存放存放共享的sessionFctory級別的緩存

存放很少被修改的數(shù)據(jù),數(shù)據(jù)可以公開的

EhCache,OSCache,JBossCache

查詢緩存:依賴于二級緩存,所以必須開啟二級緩存才可用。

查詢數(shù)據(jù)時:如果查詢緩存存在。則直接返回。否則到數(shù)據(jù)庫查詢,然后把查詢結(jié)果放

在查詢緩存。

緩存的作用:

1。減少訪問數(shù)據(jù)庫的頻率。

2。保證緩存中的對象與數(shù)據(jù)庫中的相關(guān)記錄保持同步。

For(inti=0;i<10000;i++){

Session.save(object);

)

Hibernate:

Forfinti=0;i<10000;i++){

lf(i%50==0)

Sessionfush();〃同步

Session.clear();〃清空

)

Session.save(object);

7.抓取策略:必須是一個對象操作其關(guān)聯(lián)對象。

當(dāng)應(yīng)用程序需要在(Hibernate實體對象圖的)關(guān)聯(lián)關(guān)系間進(jìn)行導(dǎo)航的時候,Hibernate

如何獲取關(guān)聯(lián)對象的策略,

抓取策略可以在0/R映射的元數(shù)據(jù)中聲明,也可以在特定的HQL或條件查詢(Criteria

Query)中重載聲明。

連接抓取(Joinfetching)-一次性把兩張表的數(shù)據(jù)查出來

查詢抓取(Selectfetching)-一個一個加載,先加載一個,在加載關(guān)聯(lián)的。

子杳詢抓取(Subselectfetching)-通過需求分析判斷,如果存在子查詢,則選擇。

批量抓取(Batchfetching)-

8.懶加我

針對數(shù)據(jù)庫中的大數(shù)據(jù),不希望特別早的加載到內(nèi)存中,當(dāng)使用到的時候在加載。

類懶加載:默認(rèn)lazy=":rue”只有用session.Ioad()才能懶加我

集合懶加載:

針對一對多或者多對多的情況,加載set集合時決定在什么時候給集合填充數(shù)據(jù)。

當(dāng)指定為懶加載時:只有使用到set集合時,他才會發(fā)出同語句。

Spring:

1.I0C:控制反轉(zhuǎn)",不是什么技術(shù),而是一種設(shè)計思想,在Java開發(fā)中,loc意味著將

你設(shè)計好的對象交給容器控制,而不是傳統(tǒng)的在你的對象內(nèi)部直接控制。

由loC容器幫對象找相應(yīng)的依賴對象并注入,而不是由對象主動去找。

依賴注入(DI):被注入對象依賴loC容器配置依賴對象

所謂loC,對于spring框架來說,就是由spring來負(fù)責(zé)控制對象的生命周期和對象間的關(guān)

系。

所有的類都會在spring容器中登記,告訴spring你是個什么東西,你需要什么東西,然

后spring會在系統(tǒng)運行到適當(dāng)?shù)臅r候,把你要的東西主動給你,同時也把你交給其他需

要你的東西。所有的類的創(chuàng)建、銷毀都由spring來控制,也就是說控制對象生存周期的

不再是引用它的對象,而是springs對于某個具體的對象而言,以前是它控制其他對象,

現(xiàn)在是所有對象都被spring控制,所以這叫控制反轉(zhuǎn)。

loC的?個重點是在系統(tǒng)運行中,動態(tài)的向某個對象提供它所需要的其他對象。這一點

是通過DI(DependencyInjection,依賴注入)來實現(xiàn)的。

控制的什么被反轉(zhuǎn)了?就是:獲得依賴對象的方式反轉(zhuǎn)了。

依賴注入的三種配置方式:

1.通過set方式

2.通過構(gòu)造函數(shù)

3通過注解(只能用于引用類型)

利用springioc和di做到了完全面向接口編程。

比如:客戶端做到完全面向接口編程。

2.Spring容器加我過程:

l.spring容器關(guān)于ioc和di:啟動過程?…》

2.加載配置文件,啟動spring容器》

3.spring容器會

*如果有bean,則直接會為該bean創(chuàng)建對象

*如果有類掃描的注解解析器,則會按照解析器口勺規(guī)則做

4.如果bean中有屬性,則調(diào)用set方法(構(gòu)造函數(shù))給屬性賦值

或者利用@口6$01^6注解給屬性賦值

5.創(chuàng)建對象之后,方法調(diào)用之前,會執(zhí)行init方法,spring容器調(diào)用

6.在客戶端調(diào)用方法

7.執(zhí)行destroy方法,spring容器調(diào)用(針對單例)

8.關(guān)閉容播

3.注解:

必須依賴于類中的某個部分

Resourse(name=/,user,/)narre

PrivateUseruser;

name—user”按照user■與容器中的進(jìn)行匹配。不行報錯

不寫,則先按照user匹配,不成功在按照類型匹配。再不行報錯

4.動態(tài)代理:

AOP(面向切面編程)

通過代理模式:把日志,安全檢查,權(quán)限重用了,做到了代碼塊的重用。而向切面編程。

代理對象的方法:就是攔截器invoke方法體的內(nèi)容。

代理對象的方法把目標(biāo)方法和切面整合在一起了。

Jdk代理:四個條件:目標(biāo)接口目標(biāo)類,攔截器,代理類

目標(biāo)類和代理類實現(xiàn)了共同的接口

攔截器必須實現(xiàn)InvocationHandler接口,而接口中的invoke方法體的內(nèi)容就

是代理對象方法體的內(nèi)容。

客戶端調(diào)用代理對象的方法時,invoke方法執(zhí)行。

代理對象和目標(biāo)類實現(xiàn)了共同的接口,且代理類中有目標(biāo)類的引用。

Cglib代理:

用CGlib生成代理類是目標(biāo)類的子類。

用CGLib生成的代理類重寫了父類的各個方法。

攔截器必須實現(xiàn)Methodinterceptor接口,而接口中的lnte,ceptor方法體的內(nèi)容

如果bean有代理對象,則返回代理對象,沒有則返回原對象。

該目標(biāo)類實現(xiàn)了接口則spring容器會采用jdk代理,否則cglib

原理:

1.加戡配置文件,啟動spring容器。

2.spring容器為bean創(chuàng)建對象

3.解析AOP的配置解析切入點表達(dá)式。

4.看納入spring管理的哪個類和切入點表達(dá)式匹配,如果匹配則創(chuàng)建代理對象。(攔截

器由spring內(nèi)部實現(xiàn))

5.代理對象的方法=目標(biāo)方法+通知

6.客戶端在context.getBean。時,該目標(biāo)類實現(xiàn)了接口則spring容器會采用jdk代理,

否則cglib

切入點表達(dá)式

expression

確定哪個類可以生成代理對象

切入點表達(dá)式:

expression="execution(*com.lyg.aop.xml.PersonDaoImpl.*(..))"

PersonDaoImpI類的所有方法。

代理:通過攔磁器調(diào)用方法。。(個人理解)

切而:日志,安全性的框架,權(quán)限的檢查,總之與業(yè)務(wù)邏輯無關(guān)的都可以是切面。

通知:切面中的方法

Struts2的啟動流程;

1.后動tomcat

2.加載web.xml

3.過濾器:StrutsPrepareAndExecuteFilter

4.init()方法力口載perties,struts-default.xml,struts-plugin.xml,struts.xml

5.靜態(tài)注入配置文件中的bean

當(dāng)請求的url來時:

1.調(diào)用StrutsPrepareAndExecuteFilter的doFilter。方法

2.把actioncontext放入到ThreadLocal中

把ValueStack放入到ActionContext中

這樣保證了值棧中的數(shù)據(jù)的安全性

3.創(chuàng)舛action(因為是務(wù)例所以說現(xiàn)在才創(chuàng)建自己理解)

獲取所有的interceptor

4.(也使用了動態(tài)代理)

執(zhí)行所有的攔截港

執(zhí)行action中的方法

結(jié)果集的執(zhí)行

Spring聲明式事務(wù)處理

<context:component-scanbase-package="com.Lyg.hibernate.transaction.xml.annotation"></context:comp。

<tx:annotation-driventransaction-manager="transaction?a/?<jger7>

<beanid^transactio^nager"

class="org.springframework.onn.hibernate3.HibernateTransactionManagern>

<propertynar?e/5essio*actory”>

<refbean="sessionFactory"/>

〈/property)

</bean>

<beanid^sessionFactory"class-"org.springframeuork.orm.hibernate3.LocalSessionFactoryBeon">

<propertynane="configlocatwn">

<value>classpath:hibernate.cfg.xml</value>

</property>

</bean>

Spring事務(wù)架構(gòu):

接口與抽象類的差別,也可以體現(xiàn)出來。

接口platformTransactionManager

publicinterfacePlatfornTransactionHanager{

TransactionstatusgetTransaction(TransactionDefinitiondefirition)throwsTransactionException;

uoidcoimit(Transactionstatusstatus)throwsTransactionException;

uoidrollback(TransactionStatusstatus)throwsTransactionException;

)

AbstractPlatformTransactionManager這個類對接口中的commit和rollback進(jìn)行了實現(xiàn),而

getTransaction,因為不同的技術(shù)產(chǎn)生事務(wù)的方式不?樣,所以這里有一?個抽象方法

比如:你用hibernate(HibernateTransactionManage)或者jdbc

(DataSourceTransactionManager)啟動事務(wù)

publicabstractclassfibstr

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論