版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026陜西寧強(qiáng)縣漢江源景區(qū)招聘考試參考試題及答案解析
- 2026西安經(jīng)開第十四小學(xué)舞蹈教師招聘考試備考試題及答案解析
- 2026四川德陽市第六人民醫(yī)院(東汽醫(yī)院)面向社會招聘編外人員10人考試參考試題及答案解析
- 2026磨憨開發(fā)投資有限責(zé)任公司市場化選聘高級管理人員2人(云南)考試備考題庫及答案解析
- 2026福建莆田市城廂區(qū)考核招聘編內(nèi)新任教師20人考試參考試題及答案解析
- 2026重慶合川區(qū)人民醫(yī)院招聘8人考試備考試題及答案解析
- 2026年甘肅蘭州紅古區(qū)醫(yī)保局招聘公益性崗位人員考試備考題庫及答案解析
- 2026渭南市富平縣和諧幼兒園招聘(4人)考試備考試題及答案解析
- 2026年桂林師范高等??茖W(xué)校單招綜合素質(zhì)考試備考題庫帶答案解析
- 2026海南海口市龍華區(qū)勞動就業(yè)和社會保障管理中心招聘公益性崗位工作人員4人考試參考試題及答案解析
- 肝癌課件簡短
- 業(yè)務(wù)協(xié)同考核管理辦法
- DBJT 61-42-2016 智能建筑工程施工工藝標(biāo)準(zhǔn)
- 操盤手勞動合同附加協(xié)議
- DB37∕T 4269-2020 輸變電工程施工企業(yè)安全生產(chǎn)風(fēng)險分級管控和事故隱患排查治理體系實施指南
- 2025年中學(xué)生守則及中學(xué)生日常行為規(guī)范
- 工地試驗室安全知識培訓(xùn)課件
- 醫(yī)藥展會活動方案
- 口腔前牙即刻種植技術(shù)要點
- 泌尿系CTU增強(qiáng)掃描技術(shù)
- 麻醉術(shù)后健康教育
評論
0/150
提交評論