Java代碼的基本知識
Java代碼的基本知識
500 Internal Server Error//服務(wù)器內(nèi)部錯誤
32、 描述Web應(yīng)用中用聲明方式來進(jìn)行錯誤處理的兩種方法
使用error-page元素聲明一個給定HTTP狀態(tài)碼的處理器
404
/error/404.html
可以聲明任意數(shù)量的錯誤頁面,但一個給定的狀態(tài)碼只能對應(yīng)一個頁面
使用exception-type元素聲明給定Java異常的處理器
java.lang.ArithmeticException
/error/ExceptionPage
可以聲明任意數(shù)量的錯誤頁面,但一個給定的異常類型只對應(yīng)一個頁面
不能使用父類捕獲多種異常
33、 描述記錄異常日志的方法,都位于那些接口?
GenericServlet:
log(message:String)
log(message:String, Throwable:excp)
ServletContext:
log(message:String)
log(message:String, excp:Throwable)
34、 什么是會話?
Web容器可為每個用戶保存一個"會話對象",用來存儲特定用戶的會話信息。
35、 如何獲得會話?
HttpSession session = request.getSesseion( );
36、 會話Api的基本功能?
getID() :String
isNew() :boolean
getAttribute(name):Object
setAttribute(name,value)
removeAttribute(name)
37、 如何銷毀會話?
1、可使用部署描述符控制所有會話的生命周期
10
2、可使用控制特定會話對象的生命周期HttpSession接口
invalidate()
getCreationTime() :long
getLastAccessedTime() :long
getMaxInactiveInterval() :int
setMaxInactiveInterval(int)
38、 描述會話保持狀態(tài)的基本原理
client server
request
response (sessionid)
request (cookies)
當(dāng)客戶端第一次請求時,服務(wù)器創(chuàng)建一個session與request綁定,用響應(yīng)對象response來返回sessionid 放到客戶端的cookies中存儲下來,下次在發(fā)送請求時,直接根據(jù)sessionid來檢索服務(wù)器的會話(每次請求都會將所有的cookies帶到服務(wù)器端)
39、 請描述session和cookie的異同之處
40、 如何讀寫cookie,代碼示例
寫: Cookie c = new Cookie("yourname", name);
response.addCookie(c);
讀:Cookie[] cookies = request.getCookies();
for ( int i=0; i < cookies.length; i++ ) {
String key =cookies[i].getName();
String value = cookies[i].getValue();
System.out.println("cook"+i+":key="+key+",value="+value);
}
41、 什么是URL重寫,如何實(shí)現(xiàn),代碼示例
Cookie不能使用時,可使用URL重寫 request.encodeURL();
客戶在每個URL的后面追加額外的數(shù)據(jù)
服務(wù)器將此標(biāo)識符與其存儲的有關(guān)會話數(shù)據(jù)相關(guān)聯(lián)
http://host/path/file;jsessionid=123
42、 描述web應(yīng)用的4種認(rèn)證技術(shù)
BASIC – Web瀏覽器接收用戶名和口令,將其以明碼方式發(fā)送給Web服務(wù)器
DIGEST – Web瀏覽器接收用戶名和口令,使用加密算法將此數(shù)據(jù)發(fā)送給Web服務(wù)器
FORM – Web應(yīng)用提供發(fā)送給Web瀏覽器的HTML form
CLIENT-CERT – Web容器使用SSL驗(yàn)證用戶,服務(wù)端和客戶端的鏈路保護(hù)
43、 什么是授權(quán),什么是驗(yàn)證?
授權(quán)是根據(jù)用戶角色劃分web資源的過程,其標(biāo)識web應(yīng)用中的安全域 分配權(quán)限
web容器使用廠商指定的機(jī)制驗(yàn)證用戶的角色 匹配權(quán)限
44、 什么是HTTPS
HTTPS (Secure Hypertext Transfer Protocol) 是使用SSL協(xié)議的HTTP
45、 什么是審計(jì)?
也就是訪問跟蹤,是為web應(yīng)用的每次訪問保留記錄的過程
46、 如何實(shí)現(xiàn)聲明性授權(quán)
1、標(biāo)識web資源集
2、標(biāo)識角色
3、將web資源集影射到角色
4、標(biāo)識每個角色中的用戶
在 web.xml里配
47、 描述servlet并發(fā)問題?
多個同類線程運(yùn)行,可以共享同一個Servlet實(shí)例,共享的數(shù)據(jù)和資源未合理同步,可能會引起數(shù)據(jù)的沖突
48、 描述Web應(yīng)用中的六種屬性范圍
局部變量(頁面范圍)
實(shí)例變量
類變量
請求屬性(請求范圍)
會話屬性(會話范圍)
上下文屬性(應(yīng)用范圍)
49、 指出上述六種哪些是線程安全的
局部變量和請求屬性
50、 什么是STM?如何實(shí)現(xiàn)?
SingleThreadModel接口
可以實(shí)現(xiàn)SingleThreadModel接口保證某一時刻只有一個請求執(zhí)行service方法
51、 如何實(shí)現(xiàn)并發(fā)管理?
盡可能使用局部和請求屬性
使用synchronized語法控制并發(fā)
盡可能減少同步塊和同步方法的使用
使用正確設(shè)置了線程安全的資源類
Jsp
1、 什么是Jsp?
Java Server Page 結(jié)合java和html在服務(wù)端動態(tài)生成web頁面的技術(shù)
2、 描述Jsp頁面的運(yùn)行過程?
第一步:
請求進(jìn)入Web容器,將JSP頁面翻譯成Servlet代碼
第二步:
編譯Servlet代碼,并將編譯過的類文件裝入Web容器(JVM)環(huán)境
第三步:
Web容器為JSP頁面創(chuàng)建一個Servlet類實(shí)例,并執(zhí)行jspInit方法
第四步:
Web容器為該JSP頁面調(diào)用Servlet實(shí)例的_jspService方法;將結(jié)果發(fā)送給用戶
3、 描述Jsp頁面的五類腳本元素的功能、寫法、并示例
注釋
指令標(biāo)記 指令標(biāo)記影響JSP頁面的翻譯階段
聲明標(biāo)記 聲明標(biāo)記允許JSP頁面開發(fā)人員包含類級聲明
腳本標(biāo)記 腳本標(biāo)記允許JSP頁面開發(fā)人員在_jspService方法中包含任意的Java代碼
表達(dá)式標(biāo)記 表達(dá)式標(biāo)記封裝Java運(yùn)行時的表達(dá)式,其值被送至HTTP響應(yīng)流 Ten is
4、 描述Jsp頁面中的注釋種類和寫法
HTML注釋
JSP頁面注釋
Java注釋
5、 描述Jsp頁面的指令標(biāo)記的功能、寫法、并示例
指令標(biāo)記影響JSP頁面的翻譯階段
6、 描述Jsp頁面的聲明標(biāo)記的功能、寫法、并示例
聲明標(biāo)記允許JSP頁面開發(fā)人員包含類級聲明
寫法:
例:
7、 描述Jsp頁面翻譯成Servlet的規(guī)則
jsp中的注釋標(biāo)記被翻譯成Servlet類中的注釋
jsp中的指令標(biāo)記被翻譯成Servlet類中的import語句等
jsp中的聲明標(biāo)記被翻譯成Servlet類中的屬性
jsp中的腳本標(biāo)記被轉(zhuǎn)移到Servlet類中service方法中的代碼
jsp中的表達(dá)式標(biāo)記被翻譯成Serlvet類中的write()或者print()方法括號中的代碼
8、 描述Jsp頁面的九個預(yù)定義變量的功能、用法、并示例
request 與請求相關(guān)的HttpServletRequest對象
response 與送回瀏覽器的響應(yīng)相關(guān)的HttpServletResponse對象
out 與響應(yīng)的輸出流相關(guān)的JspWriter對象
session 與給定用戶請求會話相關(guān)的HttpSession對象,該變量只在JSP頁面參
與一個HTTP會話時有意義
application 用于Web應(yīng)用的ServletContext對象
config 與該JSP頁面的servlet相關(guān)的ServletConfig對象
pageContext 該對象封裝了一個JSP頁面請求的環(huán)境
page 該變量與Java編程語言中的this變量等價(jià)
exception 由其它JSP頁面拋出的Throwable對象,該變量只在"JSP錯誤頁面"中可用
9、 page指令的功能,寫法、并示例,并描述它的如下屬性的功能和用法:import、session、buffer、errorPage、isErrorPage、ContentType、pageEncoding
import import 定義了一組servlet類定義必須導(dǎo)入的類和包,值是一個由
逗號分隔的完全類名或包的列表。
session session 定義JSP頁面是否參與HTTP會話,值可以為true(缺省)
或false。
buffer buffer 定義用于輸出流(JspWriter對象)的緩沖區(qū)大小,值可以為
none或Nkb,缺省為8KB或更大。
errorPage 用來指定由另一個jsp頁面來處理所有該頁面拋出的異常
isErrorPage 定義JSP頁面為其它JSP頁面errorPage屬性的目標(biāo),值為true或
false(缺省)。
ContentType 定義輸出流的MIME類型,缺省為text/html。
pageEncoding 定義輸出流的字符編碼,缺省為ISO-8859-1
10、 描述MVC各部分的功能?MVC的優(yōu)點(diǎn)?MVC的缺點(diǎn)?
MVC各部分的功能:
Model(模型表示企業(yè)數(shù)據(jù)和業(yè)務(wù)邏輯)
封裝應(yīng)用狀態(tài)
響應(yīng)狀態(tài)查詢
暴露應(yīng)用的功能
Controller(控制器接受用戶的輸入并調(diào)用模型和視圖去完成用戶的需求)
驗(yàn)證HTTP請求的數(shù)據(jù)
將用戶數(shù)據(jù)與模型的更新相映射
選擇用于響應(yīng)的視圖
View(視圖是用戶看到并與之交互的界面)
產(chǎn)生HTML響應(yīng)
請求模型的更新
提供HTML form用于用戶請求
MVC的優(yōu)點(diǎn):
低耦合性:視圖層和業(yè)務(wù)層分離
高重用性和可適用性
較低的生命周期成本
快速的部署
可維護(hù)性
有利于軟件工程化管理
提高軟件的健壯性
MVC的缺點(diǎn):
工作量大,增加工作的復(fù)雜性,MVC不適合小型甚至中等規(guī)模的應(yīng)用程序
11、 什么是Model 1結(jié)構(gòu),以及結(jié)構(gòu)中各部分的功能
結(jié)構(gòu):jsp+javabean
Model1中使用jsp來處理web應(yīng)用中的視圖控制部分
Javabean收集參數(shù)
12、 什么是JavaBean?
用戶可以使用JavaBean將功能、處理、值、數(shù)據(jù)庫訪問和其他任何可以用java代碼創(chuàng)造的對象進(jìn)行打包,并且其他的開發(fā)者可以通過內(nèi)部的JSP頁面、Servlet、其他JavaBean、applet程序或者應(yīng)用來使用這些對象。
13、 JavaBean的規(guī)則?
使用get和set方法定義屬性
一個無參構(gòu)造方法
無public實(shí)例變量( 所有屬性私有化)
14、 什么是jsp標(biāo)準(zhǔn)動作?包含那些?分別都是什么功能?如何使用?
JSP頁面中使用類似于XML的標(biāo)記表示運(yùn)行時的動作
jsp:useBean
jsp:setProperty
jsp:getProperty
jsp:param
jsp:include
jsp:forward
15、 用代碼示例如下標(biāo)準(zhǔn)動作的使用:useBean、getProperty、setProperty
id="myForms"
class="com.base.mystruts.forms.MyActionForm" scope="session" />
16、 描述說明Bean的四種scope
page
request
session
application
17、 描述說明頁面上的字段和Bean中屬性的對應(yīng)規(guī)則
id 指javabean的變量名
class指javabean類的全路徑
scope指javabean的應(yīng)用范圍
name指所用到的javabean的變量名
property指javabean中的屬性
18、 描述useBean動作的處理過程
使用id聲明變量
試圖在指定的范圍內(nèi)查找對象
如果沒找到
創(chuàng)建一個類的實(shí)例
執(zhí)行useBean標(biāo)記體初始化對象
如果找到
將對象轉(zhuǎn)換為類指定的類型
19、 描述forward動作的功能
使用腳本代碼處理請求時,可用jsp:forward 動作產(chǎn)生一個不同的視圖,
使用同一個request:
20、 什么是Model 2結(jié)構(gòu),以及結(jié)構(gòu)中各部分的功能
jsp+model+servlet
Model 2架構(gòu)使用MVC模式,JSP頁面充當(dāng)視圖,Servlet充當(dāng)控制器
Servlet控制器:
驗(yàn)證HTML form數(shù)據(jù)
調(diào)用模型中的業(yè)務(wù)服務(wù)
存儲請求(或會話)范圍內(nèi)的域?qū)ο?/p>
選擇下一個用戶的視圖
JSP頁面視圖:
使用用戶界面(在HTML中)
訪問域?qū)ο?/p>
21、 如何獲得分發(fā)器?分發(fā)器的功能?
上下文對象中的分發(fā)器:
ServletContext context = this.getServletContext();
RequestDispatcher servlet = context.getNamedDispatcher("MyServlet");
servlet.forward(request, response);
請求對象中的分發(fā)器:
RequestDispatcher view = request.getRequestDispatcher("tools/nails.jsp");
view.forward(request, response);
可以將請求轉(zhuǎn)發(fā)到另一個jsp頁面,并保持請求的傳遞性
22、 Jsp中頁面跳轉(zhuǎn)的兩種方式?
使用分發(fā)器跳轉(zhuǎn)頁面
RequestDispatcher dispatcher = request.getRequestDispatcher(“url”);
dispatcher.forword(request);
特點(diǎn):保持請求的傳遞(上一次請求中的數(shù)據(jù),在下一個請求中仍然可以得到);
轉(zhuǎn)發(fā)的頁面只能是同一個Web應(yīng)用程序的其他Web組件
使用重定向跳轉(zhuǎn)頁面
response.sendRedirect(“url”);
特點(diǎn):產(chǎn)生全新的請求,(上一次請求中的數(shù)據(jù),在下一個請求中不能得到);
重新定向的頁面可以是任意的URL
23、 描述Jsp中引入另外頁面的兩種方法,并比較兩種方法的特點(diǎn)?
在編譯期間把另一個頁面完全嵌入這個頁面,可以說是一個頁面
在這里可以共享變量
動態(tài)的再運(yùn)行期間把另一個頁面加入這個頁面,可以說是兩個
頁面,不可以共享變量
24、 什么是自定義標(biāo)記
自定義標(biāo)記庫是一個Web組件,
包括:
一個標(biāo)記庫描述符文件(*.tld)
所有相關(guān)的標(biāo)記處理器類(*.jar)
25、 描述使用自定義標(biāo)記的步驟,以及每步詳細(xì)的工作
使用自定義標(biāo)記前,要拿到.tld和.jar兩類文件
1、 把.jar文件放到WEB-INF的lib里面。
2、 把.tld文件放到WEB-INF根目錄下。
3、 在web.xml中配置。
http://java.sun.com/jsp/jstl/core
/WEB-INF/c.tld
4、 在頁面中引用。
uri必須與web.xml中的uri對應(yīng)
prefix是前綴,用來區(qū)分是哪一個taglib
使用標(biāo)記
格式:
在tomcat下配置數(shù)據(jù)源
1、服務(wù)器與數(shù)據(jù)庫的連接
配置server.xml文件
1.oracle
factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory"
url="jdbc:oracle:thin:@127.0.0.1:1521:orcl"
driverClassName="oracle.jdbc.driver.OracleDriver"
username="aa"
password="aa"
maxActive="50"
maxIdle="10"
maxWait="-1"
/>
2.sqlserver
factory="org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory"
url="jdbc:jtds:sqlserver://localhost:1433;SelectMethod=cursor;
DatabaseName=webpagetest"
driverClassName="net.sourceforge.jtds.jdbc.Driver"
username="aa"
password="aa"
maxActive="50"
maxIdle="10"
maxWait="-1"
/>
2、配置自己的web應(yīng)用的xml文件
privileged="true" antiResourceLocking="false" antiJARLocking="false">
3、配置web.xml文件
與服務(wù)器建立連接
jdbc/company
javax.sql.DataSource
Container
4、在應(yīng)用程序中不直接與數(shù)據(jù)庫連接,通過DataSource連接池建立連接
//1.在程序單獨(dú)用時設(shè)置系統(tǒng)的屬性,在tomcat下可以不用配置,
System.setProperty(Context.PROVIDER_URL,"");
System.setProperty(Context.INITIAL_CONTEXT_FACTORY,"");
//2.創(chuàng)建一個上下文對象
InitialContext context = new InitialContext();
//3.通過上下文對象在連接池中查找DataSource
DataSource ds = (DataSource)context.lookUp("java:comp/env/jdbc/company");
//4.通過數(shù)據(jù)源建立連接
ds.getConnection();
Struts2
1、 struts2簡介
struts2是一種基于MVC(Model View Controller )的web應(yīng)用框架。
struts2包括三個部分:struts和xwork,對其他框架或技術(shù)的支持
struts處理web相關(guān)的部分,xwork處理web無關(guān)的部分。
2、 描述基本的struts應(yīng)用的組成部分以及每部分的功能,并指出哪些是需要開發(fā)人員做的
1) struts ActionContext Clear Up :負(fù)責(zé)清空ActionContext,確保不會出現(xiàn)由于內(nèi)存引起的并發(fā)問題。
2) other Filters :其他的過濾器
3) Filter Dispatcher :struts2的總調(diào)度類,通過http請求到ActionMapper詢問請求的Action是否執(zhí)行
4) ActionMapper :決定這個action需要被執(zhí)行
5) ActionProxy:找ConfigurationManager要Action的配置,然后產(chǎn)生Action Invocation對象
6) ConfigurationManager:響應(yīng)ActionProxy的請求找到xwok.xml
7) struts.xml :通過配置讓 Action 調(diào)用器 調(diào)用Action
8) Action Invocation:調(diào)用對應(yīng)的Action
9) Interceptor :攔截在Action和result執(zhí)行前后完成一些功能(比如將request中的數(shù)據(jù)映射到值棧中)
10) Action :處理客戶端請求,調(diào)用邏輯層API,通過Result選擇下一界面
11) Result:常量字符串
12) 頁面:通過Taglib的標(biāo)簽 得到值棧中的數(shù)據(jù)并顯示
13) Taglib: 得到封裝對象中的數(shù)據(jù)
需要開發(fā)的有:Action,頁面(配置上Taglib的前綴,用OGNL得到數(shù)據(jù)),struts.xml,如果要解決中文問題還要配置 struts.properties文件
3、 描述struts開發(fā)的步驟,以及每步具體的工作
見教材第二章
4、 描述從頁面點(diǎn)擊一個按鈕開始,完整的Struts應(yīng)用運(yùn)行過程
1) 用戶點(diǎn)擊頁面的提交按鈕,即客戶端發(fā)送http請求到web容器。
2) web容器通過web.xml找到web容器的Filter;通過url-pattern 找到filter-name,再通過filter-name找到filter-class,即找到FilterDispatcher。
3) Action代理調(diào)用ConfigurationManager讀取xwork.xml文件,根據(jù)提交的xx.action,找到對用的action的全路徑,通過Action調(diào)用器調(diào)用Action類。
4) 在調(diào)用Action類之前,首先被配置攔截到,進(jìn)行相關(guān)的處理,如將request中的數(shù)據(jù)映射到值棧中。
5) 回調(diào)Action中的execute方法,執(zhí)行后返回Result。
6) 得到Reslut后,在xwork.xml中匹配下一個頁面。
7) 執(zhí)行Result調(diào)用下一個頁面。
5、 圖示描述struts的架構(gòu)
6、 為什么推薦使用ActionSupport
因?yàn)锳ctionSupport不僅實(shí)現(xiàn)了Action接口,而且實(shí)現(xiàn)了其他的接口,例如:validate()方法-數(shù)據(jù)檢驗(yàn),getLocal()獲取本地信息等功能
7、 Struts中數(shù)據(jù)檢測的方式有幾種,詳細(xì)寫出分別怎么做
1、在validate()方法中進(jìn)行數(shù)據(jù)檢驗(yàn)
2、在execute()方法中進(jìn)行數(shù)據(jù)檢驗(yàn),但一定要有返回值為INPUT
8、 Struts中如何使用本地信息
1、和Action類同級新建一個與Action同名的.properties文件,并用key,value定義好組件對應(yīng)的信息(國際化信息)
2、在Action類中使用:this.getText("key")
9、 詳細(xì)寫出struts的Action中三種數(shù)據(jù)的對應(yīng)方式,并比較優(yōu)缺點(diǎn)
1、域模型:靈活,封裝數(shù)據(jù), public 或 private+get/set
2、字段驅(qū)動:把字段直接封裝在Action中,適用于字段少的程序
3、模型驅(qū)動:Action類實(shí)現(xiàn)ModelDriver接口,并實(shí)現(xiàn)getModel方法,頁面上直接用返回對象的字段就可以,但一個Action只能對應(yīng)一個Model
10、 什么是Result
result是一個字符串常量,他表示Action執(zhí)行完成的狀態(tài),struts.xml根據(jù)返回的result選擇下一個界面
11、 寫出通用Result中dispatch,redirect和chain的特點(diǎn)
1、dispatch:保持同一請求,保持?jǐn)?shù)據(jù)的傳遞
2、redirect:重定向,一個全新的請求,丟失數(shù)據(jù)
3、chain;保持?jǐn)?shù)據(jù)的傳遞,但不是同一請求(一個全新的請求)
12、 Interceptor的功能和運(yùn)行特點(diǎn)
能在Action和Result執(zhí)行前后完成一些功能;也可以把Action的共性功能分離出來,以便以后發(fā)生變化便于修改,不用動很多的類
13、 配置Interceptor要注意什么,什么是Interceptor棧
注意:以后自定義的Intercepter要追加到defaultStack后——即自己定義一個棧把默認(rèn)棧和自定義的Intercepter追加上
多個Interceptor構(gòu)成Interceptor棧
14、 什么是OGNL
OGNL是Object-Graph Navigation Language的縮寫,它是一種功能強(qiáng)大的表達(dá)式語言(Expression Language,簡稱為EL),通過它簡單一致的表達(dá)式語法,可以存取對象的任意屬性,調(diào)用對象的方法,遍歷整個對象的結(jié)構(gòu)圖,實(shí)現(xiàn)字段類型轉(zhuǎn)化等功能。它使用相同的表達(dá)式去存取對象的屬性。
15、 代碼示例:在struts中向session中取值和賦值
Action向session中取值:
ServletActionContext.getRequest().getSession().getAttribute("nowPage");
賦值:
ServletActionContext.getRequest().getSession().setAttribute("nowPage",nowPage);
頁面向session中取值:
16、 代碼示例:在struts中定義集合,并取值和賦值
17、 簡述值棧的原理
1、值棧與request綁定,而且是線程安全的
2、值棧相當(dāng)于一個小型的數(shù)據(jù)庫
3、struts所有的Action屬性值存取都通過值棧
18、 如何在struts中取得HttpSession的數(shù)據(jù)
(1)取得HttpRequest對象:
HttpServletRequest request = ServletActionContext. getRequest();//這個方法返回了與當(dāng)前線程的ActionContext相關(guān)聯(lián)的request
(2)取得HttpSession對象:
HttpSession session = ServletActionContext. getRequest().getSession();
19、 描述如何使用驗(yàn)證框架的步驟和每步應(yīng)做的工作
使用驗(yàn)證框架的方法特別簡單:
(1)寫validatiors.xml文件,注冊要用到的驗(yàn)證器
(2)寫類名-validation.xml文件,并放到相應(yīng)的地方
(3)開啟Action的驗(yàn)證功能,在xwork.xml文件中指定攔截“validation”或者“validationWorkflowStack”,示例:
注意:不管驗(yàn)證是否通過,我們的Action都會執(zhí)行,但如果驗(yàn)證沒有通過,它不會調(diào)用Action的execute()方法
20、 set標(biāo)簽是用來做什么的,描述set標(biāo)簽支持的作用域
功能:對值棧中的表達(dá)式進(jìn)行求值,并將結(jié)果賦給特定作用域中的某個變量
下面來看個例子:
每次都要重復(fù)#session[‘user’]不僅是麻煩,而且容易出錯,較好的方式是:定義一個臨時變量來代替它。
作用域的說明: Set標(biāo)簽支持5種作用域:default(也是默認(rèn)的,ActionContext),page,request,session,application。通常我們不需要管,除非你要把一個標(biāo)簽或者servlet集成到struts中。
21、 代碼示例:property、set、Iterator、bean、param、if、else標(biāo)簽的用法
偶數(shù)行
奇數(shù)行
ORM對象關(guān)系型數(shù)據(jù)庫映射
(Object Relation Mapping)
一、映射的特點(diǎn)
1.一個對象可以對應(yīng)多個表
2.一個表可以對應(yīng)多個對象
3.對象和表的關(guān)系不用完全對應(yīng)
4.對象的屬性的名稱和表字段的名稱可以不同
5.類型可以不同,但數(shù)據(jù)類型之間可以轉(zhuǎn)換
6.對象中必須有主鍵,數(shù)據(jù)庫的表對主鍵無所謂
7.數(shù)據(jù)庫中有主外鍵關(guān)系時,對象中可以有,也可以沒有
二 、有一個映射的描述文件————>xml
三 、怎樣實(shí)現(xiàn)描述文件————>一段程序
對象 映射(mapping) 數(shù)據(jù)庫
user
id=11
name="張三"———— > (1) —————> tbl_user(id,name,age,tel,address)
age=25 <————(2) <————
(1)從對象映射到數(shù)據(jù)庫
1.JDBC
2.根據(jù)描述文件來動態(tài)拼接sql
3.執(zhí)行,添加到數(shù)據(jù)庫中
(2)從數(shù)據(jù)庫中映射到對象
1.JDBC
2.拼接查詢sql
3.ResultSet
4.Model
hibernate
開發(fā)流程:
1、 是什么?
hibernate是一種基于orm 的輕量級的框架
2、 有什么?
1. session 保持連接狀態(tài)(依賴事務(wù)和連接池)
2. Transaction事務(wù)
3. Connection Provider 連接池
3、 能干什么?
1.orm
2.提供操作數(shù)據(jù)庫的接口,簡化數(shù)據(jù)持久化的編程任務(wù)
4、 怎么做?
1.搭建hibernate的運(yùn)行環(huán)境,將hibernate的包和hibernate所需要的包拷貝到lib 文件夾下
2.O(vo)
3.R (關(guān)系型數(shù)據(jù)庫中的表)
4.配置文件
4.1 cfg.xml 放在classes根目錄下,默認(rèn)名字為hibernate.cfg.xml
a.與數(shù)據(jù)庫的連接
b.可選配置
c.映射資源的注冊
4.2 hbm.xml文件 名字與類名相同 并且與類放在一起
a. 對象與數(shù)據(jù)庫表之間的映射
b. 對象的屬性與數(shù)據(jù)庫表的字段之間的映射
c.組件之間的映射
d.對象與對象之間的關(guān)系映射
5、客戶端
1.得到SessionFactory
2.通過SessionFactory 工廠來創(chuàng)建Session實(shí)例
3.打開事務(wù)
4.操作數(shù)據(jù)庫
5.事務(wù)提交
6.關(guān)閉連接
運(yùn)行流程:
5、 整體流程
1.通過configuration來讀cfg.xml文件
2.得到SessionFactory 工廠(根據(jù)數(shù)據(jù)庫的連接來創(chuàng)建sessionfactory)
3.通過SessionFactory 工廠來創(chuàng)建Session實(shí)例
4.打開事務(wù)
5.通過session的api操作數(shù)據(jù)庫
6.事務(wù)提交
7.關(guān)閉連接
6、 save
1.to--->po
2.根據(jù)model和cfg.xml中映射文件的注冊來找到hbm.xml文件
3.根據(jù)hbm.xml文件和model來動態(tài)的拼sql
4.客戶端提交或者刷新內(nèi)存
5.執(zhí)行sql,值放到數(shù)據(jù)庫
7、 update、
1.根據(jù)model 的id在內(nèi)存hibernate的緩存中查找該對象
如果內(nèi)存中沒有就到數(shù)據(jù)庫中查找來保證對象的存在
2.根據(jù)model和cfg.xml文件中映射文件的注冊來找到hbm.xml文件
3.根據(jù)model和hbm.xml 文件來動態(tài)拼sql
4.客戶端提交或者刷新內(nèi)存
5.執(zhí)行sql
8、 Query
load
1.根據(jù)model的類型來找到hbm.xml文件
2.判斷id對應(yīng)的對象在緩存中是否存在,如果存在,就直接使用,如果不存在就進(jìn)行下一步。
3.用id做為查詢條件來動態(tài)拼sql
4.執(zhí)行sql 查詢(先在內(nèi)存中查找,如果沒有找到(會拋出例外),就去數(shù)據(jù)庫中查找)
5.返回一個model類型的對象
get
1.根據(jù)model的類型來找到hbm.xml文件
2.用id做為查詢條件來動態(tài)拼sql
3.執(zhí)行sql 直接在數(shù)據(jù)庫中查找,如果沒有查到就會返回null
query
1.分析hql語句,得到model的類型
2.根據(jù)moedel和cfg.xml文件中映射文件的注冊找到hbm.xml文件
3.根據(jù)model和hbm.xml文件來動態(tài)拼sql
4.執(zhí)行sql查詢數(shù)據(jù)庫
5.返回一個resultset
6.循環(huán)resultset的值,放到model中在放到集合(List)中
談?wù)刪ibernate緩存機(jī)制
緩存其實(shí)很直觀的理解為放到內(nèi)存或者硬盤上的一塊區(qū)域,緩存就是一個緩沖的作用,有很多時候,我們的數(shù)據(jù)需要經(jīng)常訪問,如果放到數(shù)據(jù)庫中,不是不可,只是效率上低,如果有了中間產(chǎn)物來代替數(shù)據(jù)庫,就省很多事情了。打個比方,去買醬油,不一定一定要去醬油的生產(chǎn)工廠去買。代碼中需要數(shù)據(jù)的時候,可以先到緩存中查找,如果存在,就直接拿數(shù)據(jù),不存在就去數(shù)據(jù)庫中取,也省了很多事。
hibernate使用的是二級緩存,有兩個級別,分別是Session,SessionFactroy級別,一級緩存是Session級別的緩存,Hiberante來管理的,這個我們一般不用管,二級緩存是SessionFactory級別的,可以進(jìn)行配置和更改,加載卸載,就是我們平時用的hibernate配置文件中的配置SessionFactory的屬性。
對一級緩存中的session事務(wù)進(jìn)行數(shù)據(jù)的預(yù)存取,數(shù)據(jù)在各個session的上下文中存在(單例),當(dāng)session關(guān)閉時,就是session.close( ),整個所有session范圍內(nèi)的數(shù)據(jù)全部清空;二級緩存默認(rèn)的情況下是不開啟的,數(shù)據(jù)庫匯總的所有數(shù)據(jù)都先copy到二級緩存中,這里要注意的是,一級緩存是每個線程下創(chuàng)建的session緩存區(qū)域,可以是多個,二級緩存只有一個區(qū)域 ,畫個圖比較容易理解。
| 一級session緩存| | 一級session緩存| |一級session緩存| |一級session緩存|
| | | |
| | | |
---------------------------------------------------------------------------------------------------
sessionFactroy級別的二級緩存
-------------------------------------------------------------------------------------------------------------------
|
|
|
------------------------------------------------------------------------------------------------------------------
DB
-----------------------------------------------------------------------------------------------------------------
Spring
1、 是什么?
Spring是基于JEE的輕量級的應(yīng)用框架
2、 有什么?
每個包的功能:
Spring MVC:spring 本身提供的web 框架
WEB:集成其他的web 應(yīng)用的框架,或者說是對其他web應(yīng)用框架的支持。如struts,struts
JEE :集成一系列的jee的技術(shù)(對JEE技術(shù)的支持)
DAO:封裝了JDBC;(對JDBC的支持)
ORM:提供了對ORM工具的集成(支持)
AOP :面向切面編成
CORE:spring的核心包,提供bean的工廠和IOC容器
3、 能干什么?
把一系列的jee的技術(shù)有效的組合在一起形成以良好的系統(tǒng)
4、 怎么用?
1、 搭建web工程,引入spring的jar包
2、 在web.xml中添加如下配置
contextConfigLocation
classpath*:applicationContext*.xml
struts2
org.apache.struts2.dispatcher.FilterDispatcher
struts2
/*
org.springframework.web.context.ContextLoaderListener
3、 部署
5、 容器和bean
Ioc容器是Bean實(shí)例的容器,類似于一個實(shí)例池,Ioc容器對Bean進(jìn)行實(shí)例化、配置及管理(控制Bean的生命周期及相互的關(guān)系)。
Ioc容器與jee的容器類比:
Jee:提供組件的運(yùn)行環(huán)境和管理組件的生命周期(不能單獨(dú)存在)
Ioc容器:提供bean的運(yùn)行環(huán)境和管理bean的生命周期(可以單獨(dú)存在)
Bean是受Spring Ioc容器管理(控制)的對象,這些對象除了代表類實(shí)例本身,還可以包含各種資源,比如文件、圖片、集合、數(shù)組、數(shù)字、字符串等一切外部資源。
6、 IOC控制反轉(zhuǎn)
Spring的ioc中最重要的兩個類是ApplicationContext和BeanFactory
在使用Ioc容器之前,應(yīng)用程序總是通過工廠,主動索取需要的資源(bean),比如表現(xiàn)層通過調(diào)用邏輯層的工廠得到邏輯層接口的實(shí)例,這樣做層與層之間就會耦合。
當(dāng)使用Ioc容器之后,應(yīng)用程序由主動索取變成被動等待,由Ioc容器控制應(yīng)用程序需要的資源對象,應(yīng)用程序只需要做相應(yīng)的配置聲明,說明需要什么bean資源,Ioc容器就可以給應(yīng)用程序注入相應(yīng)的資源了。
程序的控制權(quán)由應(yīng)用程序轉(zhuǎn)到了Ioc容器,應(yīng)用程序由“主動控制”轉(zhuǎn)換成了被Ioc容器控制,控制權(quán)發(fā)生了轉(zhuǎn)移,所以是控制反轉(zhuǎn);應(yīng)用程序依賴Ioc容器的注入才可以運(yùn)行,所以稱為依賴注入。控制反轉(zhuǎn)、依賴注入,方向不同,但描述的卻是同一件事情。
好處:
使程序模塊化,真正實(shí)現(xiàn)松散耦合
使程序可裝配
使代碼可重用
代碼開發(fā):
容器:
BeanFactory是Spring IoC容器的實(shí)際代表者,通過BeanFactory的對象可以對Ioc容器中的bean進(jìn)行管理。
BeanFactory的創(chuàng)建過程是:先讀取BeanFactory的配置文件(FileSystemResource或ClassPathResource),再創(chuàng)建BeanFactory的實(shí)例(XmlBeanFactory)。
容器實(shí)例化bean的三種方法:
構(gòu)造器實(shí)例化
靜態(tài)工廠實(shí)例化
class="examples.ExampleBean2"
factory-method="createInstance"/>
實(shí)例工廠實(shí)例化
bean id="myFactoryBean" class="...">
...
factory-bean="myFactoryBean"
factory-method="createInstance"/>
BeanFactory有containsBean、getBean、isSingleton、getType、getAliases等方法。
ApplicationContext是BeanFactory的子接口,它增強(qiáng)了BeanFactory的功能,比如:提供國際化的消息訪問、資源訪問(讀文件)、bean相關(guān)的事件控制、在web環(huán)境中可以實(shí)例化。
BeanFactory是延遲加載,ApplicationContext是創(chuàng)建Ioc容器就對bean進(jìn)行初始化。
7、 DI依賴注入
1. 應(yīng)用程序依賴spring注入所需要的對象
IOC和DI是對同一種事情的不同描述
2.setter注入: 在配置文件中將接口的實(shí)現(xiàn)配置為bean在應(yīng)用程序中注入bean
例如:
在配置文件中
在應(yīng)用程序中
Public DBDAO dao ;
Public void setDao(DBDAO dao){
This.dao = dao;
}
3.構(gòu)造器注入
4.lookup方法注入
5.ref 表示參照其它的bean
在參照的過程中一定要注意死循環(huán)
6.自動裝配-----------〉no
自動裝配根據(jù)名字來匹配相應(yīng)的bean 盡量不要去自動裝配
7. bean的作用域:
singleton 單例
prototype 非單例
使用spring的webApplicationContext,則可以使用request,session和globalSession
8.DI的優(yōu)點(diǎn):
1.程序被動等待,強(qiáng)化面向接口編成
2.切斷了對象或組件之間的聯(lián)系,使程序的結(jié)構(gòu)更加松散,運(yùn)行和維護(hù)更加簡單
8、 Aop面向切面編程
Aop中最重要的三個概念是切入點(diǎn)、切面,通知。
1.AOP面向切面編程
切面:代表我們所關(guān)注的一系列的共同的功能點(diǎn)(模塊之間的共同的功能點(diǎn))
面向切面編程提供了另外一種角度來思考程序的結(jié)構(gòu),彌補(bǔ)了面向?qū)ο缶幊痰牟蛔恪?/p>
2.AOP的好處:
靈活的實(shí)現(xiàn)功能
使各個模塊之間不耦合
3.AOP 的概念
1.切面 :我們所關(guān)注的功能點(diǎn)
2.連接點(diǎn) :事件的觸發(fā)點(diǎn)(方法的執(zhí)行)
3.通知 :連接點(diǎn)觸發(fā)時執(zhí)行的動作(方法)
4.切入點(diǎn) :一系列的連接點(diǎn)的集合 (連接點(diǎn)的模塊化)
5.引入 :擴(kuò)展的功能
6.目標(biāo)對象 :包含連接點(diǎn)的對象
7.aop代理 :實(shí)現(xiàn)機(jī)制
8.織入 :把a(bǔ)dvice和目標(biāo)對象連接起來
4.AOP的事件機(jī)制
1.通過切面找出一系列共同的功能點(diǎn)
2.找到目標(biāo)對象(在標(biāo)準(zhǔn)的spring 中 接口的實(shí)現(xiàn)類為target)
3.找到切入點(diǎn)
4.確定連接點(diǎn)
5.通知spring AOP,查詢xml文件,通過代理找到advice。
6.由aop代理來實(shí)現(xiàn)動態(tài)織入
5. AspectJ
5.1.在xml中配置比較煩瑣
所有的入口必須從一個代理(ProxyFactoryBean)開始
expression="execution(* com.javakc.aop.MyTarget.t*())"/>
5.3.使用注解的方法相對簡單
@AspectJ的基本語法
1.@Aspect聲明一個切面,將一系列的共同的功能定義成一個切面
直接在類上定義@Aspect
2.@Pointcut聲明切入點(diǎn)
2.1、用一個專門的類來定義pointcut,類中的方法名就是該pointcut的名字
2.2、可以使用匿名的pointcut
2.3、執(zhí)行切點(diǎn)的幾種方法
2.3.1 execute(public * 包結(jié)構(gòu).*.*.(..)) 可以指定到具體的方法
2.3.2 within 指定到包,不能指定到類
within("com.javakc.spring..*")
2.3.3 this 指定到實(shí)現(xiàn)接口的所有的實(shí)現(xiàn)類
2.3.4 target 指定具體的實(shí)現(xiàn)類
5.4.advice的五種類型的示例
客戶端必須從接口走才能得到監(jiān)控,實(shí)現(xiàn)想要追加的功能
5.4.1.@AfterReturning(pointcut="" returning="retVal")
追加的方法的參數(shù)名字一定要與retrning的名字相同
在注解@AfterReturning中必須加上pointcut和returning兩個參數(shù)
pointcut指所要監(jiān)控的目標(biāo)對象的方法
得到目標(biāo)對象的方法的返回值,來作為參數(shù),進(jìn)行下一步的處理,參數(shù)沒有順序,按參數(shù)的名字進(jìn)行匹配
完成追加的功能
1 定義一個pointcut,通過方法名來作為pointcut的名稱來引用
(1).@AfterReturning("com.javakc.spring.schemaaop.TestPointcut.t4()")
(2).
2.直接引用匿名的pointcut
(1).@AfterReturning("execution(
* com.javakc.spring.schemaaop.Api.test4())")
(2).@AfterReturning(pointcut=
"com.javakc.spring.schemaaop.TestPointcut.t4() &&
args(str)", returning="retVal")
@AfterReturning (pointcut="com.javakc.spring.schemaaop.TestPointcut.t4() && args(str)",returning="retVal")
public void testAfterReturning(String str,Object retVal){
System.out.println("afterReturning1=>"+retVal+"=>"+str);
}
5.4.2.@Aronud
注解@Around環(huán)繞追加功能;
在執(zhí)行目標(biāo)對象的方法的前、后追加功能;
必須有參數(shù);第一個參數(shù)的類型必須為ProceedingJoinPoint;
通過ProceedingJoinPoint的實(shí)例的proceed來調(diào)用所監(jiān)控的
目標(biāo)對象的方法
1 定義一個pointcut,通過方法名來作為pointcut的名稱來引用
(1).@Around("com.javakc.spring.schemaaop.TestPointcut.t1()")
(2).@Around("com.javakc.spring.schemaaop.TestPointcut.t2()
&& args(str)")
2.直接引用匿名的pointcut
(1).@Around("execution(
* com.javakc.spring.schemaaop.Api.test1())")
(2).@Around("execution(
* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)")
// @Around("com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)")
@Around("execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)")
public void testAround(ProceedingJoinPoint prj,String str) throws Throwable{
System.out.println("around1==========before1pointcut==>"+str)
Object obj = prj.proceed();
System.out.println("around1==========after1pointcut==>"+str);
}
5.4.3.@Before
注解@Before在執(zhí)行目標(biāo)對象的方法前追加相應(yīng)的功能
1 定義一個pointcut,通過方法名來作為pointcut的名稱來引用
(1).@Before("com.javakc.spring.schemaaop.TestPointcut.t1()")
(2).@Before("com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)")
注意args后的名稱與參數(shù)名相同
2.直接引用匿名的pointcut
(1).@Before("execution(* com.javakc.spring.schemaaop.Api.test1())")
(2).@Before("execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)")
注意args后的名稱與參數(shù)名相同
// @Before("com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)")
@Before("execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)")
public void testBeforeParam(String str){
System.out.println("before1=param=>"+str);
}
5.4.4.@After
注解@After在執(zhí)行目標(biāo)對象的方法后追加相應(yīng)的功能
1 定義一個pointcut,通過方法名來作為pointcut的名稱來引用
(1).@After("com.javakc.spring.schemaaop.TestPointcut.t1()")
2.直接引用匿名的pointcut
(1).@After("execution(* com.javakc.spring.schemaaop.Api.test1())")
@After("com.javakc.spring.schemaaop.TestPointcut.t1()")
public void testAfter(){
System.out.println("after1== >pointcut");
}
5.4.5.@AfterThorwing
9、 描述一下spring中BeanFactory和ApplicationContext的差別
BeanFactory是一個Interface,這是Spring的核心。它僅僅只是提供的一些基本功能。ApplicaionContext 也是一個interface,這是從BeanFactory繼承過來的所以它具備了BeanFactory的所有功能。但它也從其它的類或interface得到了一些特性。比如提供國際化的消息訪問,資源訪問,事件傳播。
但其主要區(qū)別在于BeanFactory是延遲加載,如果Bean的某一個屬性沒有注入,BeanFactory加載后,直至第一次使用getBean方法調(diào)用此Bean時才會拋出異常;而ApplicationContext則在初始化自身時檢驗(yàn),這樣有利于檢查所依賴屬性是否注入;所以通常情況下我們選擇使用ApplicationContext.
代碼示例:
BeanFactory beanFactory = new XmlBeanFactory(new FileSystemResource("beans.xml"));
ApplicationContext cxt = new ClassPathXmlApplicationContext("beans.xml");
10、 談?wù)剆pring對DAO的支持
Spring提供的DAO(數(shù)據(jù)訪問對象)支持主要的目的是便于以標(biāo)準(zhǔn)的方式使用不同的數(shù)據(jù)訪問技術(shù)。
簡化 DAO 組件的開發(fā)。 Spring提供了一套抽象DAO類供你擴(kuò)展。這些抽象類提供了一些方法,用來簡化代碼開發(fā)。
IoC 容器的使用,提供了 DAO 組件與業(yè)務(wù)邏輯組件之間的解耦。所有的 DAO 組件,都由容器負(fù)責(zé)注入到業(yè)務(wù)邏輯組件中,其業(yè)務(wù)組件無須關(guān)心 DAO 組件的實(shí)現(xiàn)。
面向接口編程及 DAO 模式的使用,提高了系統(tǒng)組件之間的解耦,降低了系統(tǒng)重構(gòu)的成本。
方便的事務(wù)管理: Spring的聲明式事務(wù)管理力度是方法級。
異常包裝:Spring能夠包裝JDBC異常,把它們從CheckedException變?yōu)镽untimeException; 開發(fā)者可選擇在恰當(dāng)?shù)膶犹幚頂?shù)據(jù)中不可恢復(fù)的異常,從而避免煩瑣的 catch/throw 及異常聲明。
11、 談?wù)剆pring對hibernate的支持
在所有的 ORM 框架中, Sping 對 Hibernate 的支持最好。如 SessionFactory 的注入、HibernateTemplate 的簡化操作及 DAO 支持等。另外, Spring 還提供了統(tǒng)一的異常體系及聲明式事務(wù)管理等。
一旦 Hibernate 處于 Spring 的管理下, Hibernate 所需要的基礎(chǔ)資源,都由 Spring 提供注入。 Hibernate 創(chuàng)建 SessionFactory 必需的 DataSource ,執(zhí)行持久化必需的 Session 及持久層訪問必需的事務(wù)控制等,這些原本必須通過代碼控制的邏輯,都將由Spring 接管:DataSource, SessionFactory, TransactionManager等,都將作為 Spring 容器中的 bean。將這些bean 放在配置文件中管理。
1、通用的資源管理: Spring 的 ApplicationContext 能管理 SessionFactory,使得配置值很容易被管理和修改,無須使用Hibernate 的配置文件。詳細(xì)配置如下:
class="org.apache.commons.dbcp.BasicDataSource">
oracle.jdbc.driver.OracleDriver
jdbc:oracle:thin:@localhost:1521:orcl
javakc2
javakc2
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
com/javakc/spring/h2/UserModel.hbm.xml
hibernate.dialect=org.hibernate.dialect.OracleDialect
如果需要使用容器管理的數(shù)據(jù)源,則無須提供數(shù)據(jù)驅(qū)動等信息,只需要提供數(shù)據(jù)源的JNDI 即可。對上文的SessionFactory只需將dataSource的配置替換成 JNDI 數(shù)據(jù)源,并將原有的 myDataSource Bean 替換成如下所示:
class="org.springframework.jndi.JndiObjectFactoryBean">
java:comp/env/jdbc/myds
2、有效的 Session 管理: Dao類繼承HibernateDaoSurport后,Spring 提供了 HibernateTemplate,用于持久層訪問,該模板類無須顯示打開 Session及關(guān)閉 Session。它只要獲得 SessionFactory 的引用,將可以智能打開 Session,并在持久化訪問結(jié)束后關(guān)閉 Session ,程序開發(fā)只需完成持久層邏輯,通用的操作則由HibernateTemplate 完成。
3、統(tǒng)一的事務(wù)管理。無論是編程式事務(wù),還是聲明式事務(wù), Spring 都提供一致的編程模型,無須煩瑣的開始事務(wù)、顯式提交及回滾。
建議使用聲明式事務(wù)管理,Spring 的聲明式事務(wù)以 Spring 的 AOP 為基礎(chǔ)?蓪⑹聞(wù)管理邏輯與代碼分離。代碼中無須實(shí)現(xiàn)任何事務(wù)邏輯,程序開發(fā)者可以更專注于業(yè)務(wù)邏輯的實(shí)現(xiàn)。聲明式事務(wù)不與任何事務(wù)策略藕合,采用聲明式事務(wù)可以方便地在全局事務(wù)和局部事務(wù)之間切換。
Spring聲明性事務(wù)有兩種配置方法,一種是xml配置:
另一種是通過注解,在需要添加事務(wù)的類上注明 @Transactional
Spring2.0之前事務(wù)的寫法
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
abstract="true">
PROPAGATION_REQUIRED,readOnly
PROPAGATION_REQUIRED
12、 談?wù)凷pring對事務(wù)的支持
1、聲明式事務(wù)管理:
1.流程:由客戶端訪問----aop監(jiān)控----調(diào)用advice來追加事務(wù)
2.做法:
2.1 在配置文件的頭中引入xmlns:tx 和schema的文件
2.2
2.3 注入數(shù)據(jù)源
2.4 由spring實(shí)現(xiàn)的事務(wù)管理,但需要注入數(shù)據(jù)源
2.5 事務(wù)監(jiān)控所有的方法(事務(wù)加強(qiáng))
2.6 定義切入點(diǎn)
expression="execution(* com.javakc.spring.schemaaop.api.*.*(..))"/>
2、使用注解實(shí)現(xiàn)事務(wù)管理:
1.注解@Transcational
(可以在類上,也可以在方法上)
2.在配置文件中同樣需要注入dataSource和spring的事務(wù)管理
3.使用注解的方法來追加事務(wù) 注解驅(qū)動
如何在Spring中使用Hibernate的事務(wù):
如何在Spring中使用JTA的事務(wù):
13、
事務(wù)
1、 ACID
(1)原子性(A):一系列的操作具有不可分割性,要么成功,要么失敗
(2)一致性 :操作的前后滿足同樣的規(guī)則,保持平衡。
(3)隔離性 :在事務(wù)運(yùn)行的過程中。事務(wù)內(nèi)的數(shù)據(jù)對外的可見性和可操作性(必需由數(shù)據(jù)庫的支持)
(4)穩(wěn)定性 :保證數(shù)據(jù)在事務(wù)的操作的過程中不會遭到破壞,而且是永久性存儲的
2、 事務(wù)模型
(1)經(jīng)典事務(wù)模型又叫平面事務(wù)模型(JDBC) 事務(wù)不允許嵌套
(2)嵌套事務(wù)模型
3、 事務(wù)的兩種方式
(1)聲明式
在配置文件中設(shè)置以下6項(xiàng)
(1).required
如果客戶端沒有事務(wù) 在bean中新起一個事務(wù)
如果客戶端有事務(wù)bean 中就加進(jìn)去
(2)、 requiresNew
不管客戶端有沒有事務(wù)服務(wù)器段都新起一個事務(wù)
如果客戶端有事務(wù)就將事務(wù)掛起
(3)、supports
如果客戶端沒有事務(wù)服務(wù)端也沒有事務(wù)
如果客戶端有事務(wù)服務(wù)端就加一個事務(wù)
(4)、mandatcry
如果客戶端沒有事務(wù)服務(wù)端就會報(bào)錯
如果客戶端有事務(wù)服務(wù)端就加事務(wù)
(5)、notSupported
不管客戶端有沒有事務(wù)服務(wù)端都沒有事務(wù)
如果客戶端有事務(wù)服務(wù)端就掛起
(6)、never
不管客戶端有沒有事務(wù)服務(wù)端都沒有事務(wù)
如果客戶端有事務(wù)就報(bào)錯
(2)編程式事務(wù)
Javax.transaction.UserTranscation
JTA 事務(wù)可以精確到事務(wù)的開始和結(jié)束
4、 事務(wù)的隔離性
Read-uncommited
讀取未提交的數(shù)據(jù)(基本上沒有鎖)臟讀,存在不當(dāng)讀取的問題。
Read-commited
讀取已提交的數(shù)據(jù)(行級鎖)
無法讀取已經(jīng)寫入,但沒有被提交的數(shù)據(jù)。
Repeatable_read
讀取的數(shù)據(jù)不允許修改或刪除
不可重復(fù)讀(行級鎖+不允許修改/刪除)
Serializable
幻影讀(表級鎖)
struts
開發(fā)流程
1、創(chuàng)建表單
2、從表單中獲得輸入
3、處理輸入(業(yè)務(wù)邏輯)
4、根據(jù)動態(tài)輸入改變輸入流
要完成上述四步,我們需要創(chuàng)建
1、一個ActionForm
2、一個action
3、一個配置文件struts-config.xml
4、創(chuàng)建頁面
創(chuàng)建ActionForm
1、寫一個類繼承ActionForm
2、私有的屬性
3、相應(yīng)的get、set方法
4、重寫tostring、equals、hashcode三個方法
創(chuàng)建action
1、寫一個類繼承Action
2、實(shí)現(xiàn)一個公有的方法(回調(diào)方法)
public ActionForward execute(ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
{
//1.收集參數(shù)
MyActionForm myForm = (MyActionForm)form;
//2.組織參數(shù)
//3.調(diào)用邏輯層
boolean flag = true;
//4.根據(jù)返回值來跳轉(zhuǎn)到相應(yīng)的頁面
ActionForward af = new ActionForward();
if(flag){
af = mapping.findForward("1");
}else{
af = mapping.findForward("2");
}
return af;
}
配置struts-config.xml文件
1.
2.
name="myActionForm"
type="全路徑.MyAction"
scope="session"
input="錯誤返回的頁面">
步驟:
1.創(chuàng)建一個空的web應(yīng)用
2.將struts的包放到lib文件夾下
3.將.tld文件文件和struts-config.xml、web.xml放到WEB-INF的跟目錄下
4.配置struts-config.xml文件和web.xml文件
5.在頁面引入tag文件uri
STRUTS運(yùn)行機(jī)制
1、界面點(diǎn)擊產(chǎn)生請求
2、容器接到請求
3、匹配web.xml文件中的*.do來調(diào)用ActionServlet
4、ActionServlet的處理
4.1 讀struts-congfig.xml文件形成ActionMapping
4.2 通過path 來匹配Action類,通過Action的name屬性來匹配ActionForm類
4.3 通過反射機(jī)制來給Form添數(shù)據(jù)
4.4 由ActionServlet轉(zhuǎn)調(diào)Action的execute方法
4.5 得到execute方法的返回值,跳轉(zhuǎn)頁面
4.5.1 RequestDispatcher
4.5.2 response.sendRedirect("list.jsp");
版權(quán)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn),該文觀點(diǎn)僅代表作者本人。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權(quán)/違法違規(guī)的內(nèi)容, 請發(fā)送郵件至 yyfangchan@163.com (舉報(bào)時請帶上具體的網(wǎng)址) 舉報(bào),一經(jīng)查實(shí),本站將立刻刪除