2023年Java框架面試題總結(jié)_第1頁
2023年Java框架面試題總結(jié)_第2頁
2023年Java框架面試題總結(jié)_第3頁
2023年Java框架面試題總結(jié)_第4頁
2023年Java框架面試題總結(jié)_第5頁
已閱讀5頁,還剩46頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

目錄 Struts篇 41.Struts的工作流程 42.Struts的工作流程分解 43.Struts控制器組件的組成.和控制器的重要功能 44.Struts中的幾個(gè)關(guān)鍵對象的作用(說說幾個(gè)關(guān)鍵對象的作用) 45.Struts工作流程圖(用例圖) 56.說說MVC設(shè)計(jì)模式和它的優(yōu)點(diǎn) 57.說說struts是如何實(shí)現(xiàn)MVC的? 68.Struts優(yōu)點(diǎn)與缺陷 69.strust的Action是不是線程安全的?假如不是有什么方式可以保證Action的線程安 610.Tiles框架是什么? 611.struts1.x和struts2的區(qū)別 612.Struts的常用標(biāo)簽庫及用法 8Strutshtml標(biāo)簽庫 8Strutsbean標(biāo)簽庫 12StrutsLogic標(biāo)簽庫 1313、JSP中動態(tài)INCLUDE與靜態(tài)INCLUDE的區(qū)別? 15 Ajax篇 151. ajax是什么 152. ajax實(shí)現(xiàn)的原理 163. ajax框架的基本流程 164. dwr的實(shí)現(xiàn)原理. 165. ajax開發(fā)環(huán)節(jié). 16 Spring篇 16一. 基礎(chǔ)知識 161. 對IOC的理解. 162. 依賴注入的三種實(shí)現(xiàn)形式? 173. Setter注入和構(gòu)造方法注入比較 184. 對AOP的理解,以及AOP在項(xiàng)目中是如何使用的? 185. AOP的概念和術(shù)語 196. Spring中有五中不同的告知: 197. Springbean的生命周期: 198. Bean的作用域 199. Spring自動代理 2010. Spring事務(wù)特點(diǎn) 2011. 談?wù)凷pring事務(wù)的理解 2012. 編程式事務(wù)和聲明式事務(wù)如何選擇? 21二. Spring應(yīng)用 2113. spring中的BeanFactory與ApplicationContext的作用和區(qū)別? 2114. Spring里面applicationContext.xml文獻(xiàn)能不能改成其他文獻(xiàn)名? 2215. spring中commons-logging.jar的作用 2216. spring中讀取xml配置文獻(xiàn)、獲取bean的幾種方式 2217. Spring啟動參數(shù)contextConfigLocation和ContextLoaderListener理解 2318. Spring框架在web容器是如何啟動的? 25 Hibernate篇 251. Hibernate優(yōu)缺陷? 252. Hibernate工作原理及為什么要用? 263. Hibernate是如何延遲加載? 264. Hibernate中如何實(shí)現(xiàn)類之間的關(guān)系?(如:一對多、多對多的關(guān)系) 275. 說下Hibernate的緩存機(jī)制 276. 什么樣的數(shù)據(jù)適合放到二級緩存中? 277. Hibernate的查詢方式 288. 如何優(yōu)化Hibernate? 289. 說說Hibernate中的update()和saveOrUpdate()的區(qū)別 2810. 說說Hibernate中的session的load()和get()的區(qū)別。 2811. 談?wù)凥ibernate中inverse的作用 2812. hibernate中對象的三種狀態(tài) 2913. 在數(shù)據(jù)庫中條件查詢速度很慢的時(shí)候,如何優(yōu)化? 2914. 在hibernate中進(jìn)行多表查詢,每個(gè)表中各取幾個(gè)字段,也就是說查詢出來的結(jié)果集并沒有一個(gè)實(shí)體類與之相應(yīng),如何解決這個(gè)問題? 29 iBatis篇 301. iBatis的優(yōu)缺陷? 302. iBatis與Hibernate區(qū)別(比較)? 303. iBatis與傳統(tǒng)JDBC比較 314. Hibernate和iBatis的映射關(guān)系 315. iBatis動態(tài)標(biāo)簽有哪些? 316. iBatis中使用like‘%#filedName#%’時(shí),有什么問題? 327. iBatis中#與$的區(qū)別? 32 框架問題 321.SSH框架的配置文獻(xiàn)加載順序. 322.Spring框架在web容器是如何啟動的? 333.Webservice+spring2.0+iBatis項(xiàng)目的加載順序. 334. appfuse框架機(jī)制. 335. iBatis與Hibernate如何選擇? 33參考:iBatis與Hibernate比較。 33Struts篇1.Struts的工作流程當(dāng)客戶端向?yàn)g覽器發(fā)送HTTP請求時(shí),所有瀏覽器請求都被提交給ActionServlet解決。假如用戶提交表單,則會將表單中的數(shù)據(jù)放入到ActionForm中。ActionServlet根據(jù)struts_config.xml文獻(xiàn)中預(yù)先配置好的設(shè)立選擇將請求轉(zhuǎn)發(fā)到哪個(gè)action對象,action對象從actionForm對象中獲取數(shù)據(jù),但后調(diào)用業(yè)務(wù)邏輯組件,完畢業(yè)務(wù)功能。2.Struts的工作流程分解Web應(yīng)用假如采用struts框架,在web應(yīng)用啟動時(shí)就會加載并初始化ActionServlet,ActionServlet從struts_config.xml文獻(xiàn)中讀取配置信息,基本執(zhí)行環(huán)節(jié)如下:所有瀏覽器請求都被提交給ActionServlet解決ActionServlet根據(jù)struts_config.xml文獻(xiàn)中預(yù)先配置好的設(shè)立,選擇應(yīng)當(dāng)將請求轉(zhuǎn)發(fā)到哪個(gè)action對象.當(dāng)用戶提交表單時(shí),一個(gè)配置好的ActionForm對象將被創(chuàng)建,并被填入表單中的相稱數(shù)據(jù).Action對象從ActionForm對象中獲取數(shù)據(jù).Action對象調(diào)用業(yè)務(wù)邏輯組件完畢業(yè)務(wù)功能.3.Struts控制器組件的組成.和控制器的重要功能 Struts控制器組件重要涉及:ActionServlet組件:充當(dāng)Struts框架的中央控制器.RequestRrocessor組件:充當(dāng)每個(gè)子應(yīng)用模塊的請求解決器.Action組件:負(fù)責(zé)解決一項(xiàng)具體的業(yè)務(wù).Struts控制器組件重要完畢以下任務(wù):接受用戶請求.根據(jù)用戶請求,調(diào)用合適的模型組件來執(zhí)行相應(yīng)的業(yè)務(wù)邏輯.獲取業(yè)務(wù)邏輯執(zhí)行結(jié)果.根據(jù)當(dāng)前狀態(tài)以及業(yè)務(wù)邏輯執(zhí)行結(jié)果,選擇合適的視圖組件返回給用戶.4.Struts中的幾個(gè)關(guān)鍵對象的作用(說說幾個(gè)關(guān)鍵對象的作用)ActionServlet類控制導(dǎo)航流.ActionServlet根據(jù)URI來決定哪個(gè)Action類被用于解決請求,Action可以校驗(yàn)輸入,并訪問業(yè)務(wù)層以便從數(shù)據(jù)庫檢索信息.Action需要知道頁面提交了哪些內(nèi)容,所以由ActionServlet根據(jù)請求URI來決定將請求參數(shù)綁定到哪個(gè)ActionForm中并傳入Action.Action在完畢業(yè)務(wù)邏輯后,返回一個(gè)ActionForward對象,ActionServlet根據(jù)ActionForward對象中的途徑來調(diào)用頁面完畢響應(yīng).Struts將這些信息綁定在一個(gè)ActionMapping對象中,一個(gè)ActionMapping相應(yīng)一個(gè)請求URI,當(dāng)請求途徑到達(dá)的時(shí)候,ActionServlet就會查詢ActionMapping對象,ActionMapping對象將告訴ActionServlet哪個(gè)Action類會被調(diào)用,哪個(gè)ActionForm類被用于傳遞頁面數(shù)據(jù)以及哪些ActionForward將被用于轉(zhuǎn)向.有關(guān)Action,ActionForm,ActionForward等信息,通過struts-config.xml配置文獻(xiàn)來定義.5.Struts工作流程圖(用例圖)注:Servlet容器在啟動時(shí),或者用戶初次請求ActionServlet時(shí)加載ActionServlet類.6.說說MVC設(shè)計(jì)模式和它的優(yōu)點(diǎn)MVC是一種設(shè)計(jì)模式,.它強(qiáng)制性的把應(yīng)用程序的輸入,解決和輸出分開.MVC把應(yīng)用程序提成三個(gè)核心模塊:模型(Model),視圖(View)和控制器(Controller).他們分別解決不同的任務(wù).視圖是用戶看到并與之交互的界面.視圖向用戶顯示相關(guān)的數(shù)據(jù),并能接受用戶的輸入數(shù)據(jù),但是它不進(jìn)行任何實(shí)際的業(yè)務(wù)解決.模型是應(yīng)用程序的主體部分.模型表達(dá)業(yè)務(wù)數(shù)據(jù)和業(yè)務(wù)邏輯.一個(gè)模型能為多個(gè)視圖提供數(shù)據(jù).由于同一個(gè)模型可以被多個(gè)視圖重用,所以提高了應(yīng)用的重用性.控制器接受用戶的輸入并調(diào)用模型和視圖去完畢任務(wù).MVC的解決邏輯如下:一方面控制器接受用戶請求,并決定應(yīng)當(dāng)調(diào)用哪個(gè)模型來進(jìn)行解決,然后模型根據(jù)用戶請求進(jìn)行相應(yīng)的業(yè)務(wù)邏輯解決,并返回?cái)?shù)據(jù).最后控制器調(diào)用相應(yīng)的視圖來格式化模型返回的詩句,并通過視圖呈現(xiàn)給用戶.MVC的優(yōu)點(diǎn):在MVC設(shè)計(jì)模式中,模型響應(yīng)用戶請求并返回響應(yīng)數(shù)據(jù),視圖負(fù)責(zé)格式化數(shù)據(jù)并把它們呈現(xiàn)給用戶,業(yè)務(wù)邏輯和表達(dá)層分離,同一個(gè)模型可以被不同的視圖重用,所以大大提高了代碼的可重用性.MVC的三個(gè)模塊互相獨(dú)立,改變其中的一個(gè)不會影響其他兩個(gè),所以根據(jù)這種設(shè)計(jì)思想能構(gòu)造良好的松耦合的構(gòu)件.控制器可以用來連接不同的模型和視圖去完畢用戶的需求,也可認(rèn)為構(gòu)造應(yīng)用程序提供強(qiáng)有力的手段.給定一些可重用的模型和視圖,控制器可以根據(jù)用戶的需求選擇適當(dāng)?shù)哪P瓦M(jìn)行解決,然后選擇適當(dāng)?shù)囊晥D將結(jié)果顯示給用戶.7.說說struts是如何實(shí)現(xiàn)MVC的?Struts采用JSP作為MVC的視圖,控制器由ActionServlet和Action類來實(shí)現(xiàn).控制器負(fù)責(zé)視圖和模型之間的交互.模型由實(shí)現(xiàn)業(yè)務(wù)邏輯的JavaBean或EJB組件構(gòu)成,然后說說Struts的工作流程.8.Struts優(yōu)點(diǎn)與缺陷

Struts是開源軟件,使開發(fā)者能更進(jìn)一步的了解其內(nèi)部實(shí)現(xiàn)機(jī)制。

Struts優(yōu)點(diǎn):業(yè)界"標(biāo)準(zhǔn)"(很多成功案例),學(xué)習(xí)資源豐富。

Struts的優(yōu)點(diǎn)重要集中體現(xiàn)在兩個(gè)方面:Taglib和頁面導(dǎo)航。

a、運(yùn)用Struts提供的taglib可以大大節(jié)約開發(fā)時(shí)間。

b、維護(hù)擴(kuò)展比較方便。通過一個(gè)配置文獻(xiàn),即可把握整個(gè)系統(tǒng)各部分之間的聯(lián)系,這對于后期的維護(hù)有著莫大的好處。

c、表現(xiàn)與邏輯分離

d、表單驗(yàn)證解決了請求數(shù)據(jù)的驗(yàn)證問題,增強(qiáng)了系統(tǒng)健壯性。

e、便于團(tuán)隊(duì)開發(fā)

Struts缺陷:a、大量的使用標(biāo)簽,對于初學(xué)者難度較大。

b、ActionForms使用不便、無法進(jìn)行單元測試(StrutsTestCase只能用于集成)9.strust的Action是不是線程安全的?假如不是有什么方式可以保證Action的線程安全?假如是,說明因素不是.為了保證action的線程安全,最佳的辦法就是不要在action里定義實(shí)列變量.10.Tiles框架是什么?Tiles框架為創(chuàng)建Web頁面提供了一種模板機(jī)制,它能將網(wǎng)頁的布局和內(nèi)容分離。11.struts1.x和struts2的區(qū)別本文將從Struts1和Struts2的各個(gè)方面進(jìn)行比較特性Struts1Struts2Action類Struts1的action需要去繼承一個(gè)抽象基類。一個(gè)普遍問題就是Struts1是面向抽象類編程來代替接口編程Struts2的action可以實(shí)現(xiàn)一個(gè)Action接口,也可以同時(shí)實(shí)現(xiàn)一些其他的接口來添置一些附加的,常用的服務(wù)。Struts2提供一個(gè)基類ActionSupport實(shí)現(xiàn)了一些常用的接口。雖然Action接口不是必須的。任何附帶execute方法的POJO對象都可以作為Struts2的action對象。線程模型Struts1的action是單例的并且必須是線程安全的,由于該類會只有唯一一個(gè)引用來為action解決所有的請求。單例策略會限制Struts1的action的功能以及需要擴(kuò)展的額外的功能(ThesingletonstrategyplacesrestrictionsonwhatcanbedonewithStruts1Actionsandrequiresextracaretodevelop)。Struts1的action必須是線程安全的并且是同步的。Struts2的Action對象是針對每一個(gè)請求的,所以自然也就不存在線程安全問題了。(事實(shí)上,)Servlet的依賴Struts1的Action依賴于ServletAPI,由于當(dāng)Action被調(diào)用的時(shí)候HttpServletRequest和HttpServletResponse對象是通過execute方法進(jìn)行解決的。Struts2的Action和容器的連接并不緊密。通常servlet上下文被描繪成簡樸的Map映射,允許Action被單獨(dú)測試。當(dāng)然,假如需要的話Struts2的Action也可以通過訪問初始的request和response來完畢一些功能。然而,其他的一些架構(gòu)元素導(dǎo)致減少或者刪除了直接訪問request和response的需求。易測試性測試Struts1的Action有一個(gè)大障礙就是execute方法是直接暴露于servletAPI的。Struts2的Action可以很容易的通過設(shè)立屬性調(diào)用方法來進(jìn)行測試。當(dāng)然依賴注入的支持也使得測試變得簡樸。輸入解決Struts1使用一個(gè)ActionForm對象來獲取用戶的輸入。和action同樣,所有的ActionForm都必須繼承自一個(gè)基類。由于其他的javaBean不能被用作ActionForm,開發(fā)者通常要寫一些多余的類來獲取用戶輸入。DynaBean可以被用做生成ActionForm類的一個(gè)選擇,但是開發(fā)者需要對現(xiàn)有的javaBean進(jìn)行重寫。Struts2使用Action屬性作為輸入屬性,除掉了對于輸入對象的需求。輸入屬性可以是一個(gè)擁有他自己的屬性的對象。Action屬性是通過標(biāo)簽和web頁面交互。Struts2也支持ActionForm模型,就是POJO的Form對象和POJO的Action。多數(shù)的對象類型,涉及商業(yè)邏輯對象和領(lǐng)域?qū)ο蠖伎梢宰鳛檩斎?輸入對象。模式驅(qū)動特性簡化了標(biāo)簽和POJO輸入對象的關(guān)系。表達(dá)式語言Struts1和JSTL結(jié)合,所以他可以使用JSTL的EL。Struts2也支持JSTL,但是這個(gè)框架也支持更加強(qiáng)大的表達(dá)式語言O(shè)GNL表現(xiàn)層和類型值的綁定Struts1使用標(biāo)準(zhǔn)的JSP機(jī)制將對象綁定到pagecontext來進(jìn)行訪問。Struts2使用”ValueStack”技術(shù),所以標(biāo)簽不用將視圖和表現(xiàn)的對象結(jié)合就可以得到值.ValueStack策略允許通過一系列也許具有相同屬性名字但是不同屬性類型的的類型來完畢視圖的重用,類型轉(zhuǎn)換Struts1的ActionForm通常都是String類型。Struts1通過Commons-Beanutils實(shí)現(xiàn)類型轉(zhuǎn)換。Struts2使用OGNL實(shí)現(xiàn)類型轉(zhuǎn)換,框架包含了對基礎(chǔ)和公共類型的轉(zhuǎn)換器。驗(yàn)證Struts1支持通過ActionForm中的validate方法實(shí)現(xiàn)手工驗(yàn)證。也可以通過擴(kuò)展通用的驗(yàn)證框架進(jìn)行驗(yàn)證。對于同一個(gè)類可以有不同的驗(yàn)證,但是不能關(guān)聯(lián)到子對象的驗(yàn)證。Struts2也支持通過validate方法進(jìn)行手工驗(yàn)證以及Xwork驗(yàn)證框架進(jìn)行驗(yàn)證。Xwork驗(yàn)證框架支持將驗(yàn)證鏈接到子屬性,子屬性使用了為屬性類型和驗(yàn)證上下文定義的驗(yàn)證。Action執(zhí)行的控制Struts1支持為每一個(gè)模塊分派請求解決(生命周期),但是一個(gè)模塊中的所有Action必須分享相同的生命周期。Struts2支持通過攔截器棧為每個(gè)Action創(chuàng)建不同的生命周期。通常對于不同的Action根據(jù)需要都要有相應(yīng)的棧被創(chuàng)建和使用。12.Struts的常用標(biāo)簽庫及用法 常見的struts標(biāo)簽庫有strutshtml標(biāo)簽庫,strutsbean標(biāo)簽庫,strutsLogic標(biāo)簽庫,StrutsTemplate標(biāo)簽庫,StrutsNested標(biāo)簽庫.HTML標(biāo)簽

用來創(chuàng)建可以和Struts框架和其他相應(yīng)的HTML標(biāo)簽交互的HTML輸入表單

Bean標(biāo)簽

在訪問JavaBeans及其屬性,以及定義一個(gè)新的bean時(shí)使用

Logic標(biāo)簽

管理?xiàng)l件產(chǎn)生的輸出和對象集產(chǎn)生的循環(huán)

Template標(biāo)簽

隨著Tiles框架包的出現(xiàn),此標(biāo)記已開始減少使用

Nested標(biāo)簽

增強(qiáng)對其他的Struts標(biāo)簽的嵌套使用的能力以下分別講解struts標(biāo)簽庫的用法.Strutshtml標(biāo)簽庫<html:form>:生成html<form>標(biāo)簽 用法:<html:formaction=”checkAction.do”></html:form> <html:form>標(biāo)簽的action屬性用來指定當(dāng)前用戶提交表單后,解決用戶請求的組件.<html:text>生成html<inputtype=”text”>標(biāo)簽 該標(biāo)簽在表單上創(chuàng)建HTML文本框字段. 用法:<html:textproperty=”userName”> property:指定字段的名字<html:hidden>生成html<inputtype=”hidden”>標(biāo)簽 這個(gè)標(biāo)簽在表單上生成隱藏字段.隱藏字段用于在表單上存放不希望讓用戶看到或不允許修改的信息.<html:submit>生成html<inputtype=”submit”>標(biāo)簽 <html:submit>標(biāo)簽生成表單的提交按鈕用法:<html:submit>submit<html:submit><html:reset>生成html<formtype=”reset”>標(biāo)簽 <html:reset>標(biāo)簽生成表單復(fù)位按鈕用法:<html:reset>reset</html:reset><html:cancel>在表單上生成取消按鈕 <html:cancel>標(biāo)簽用于生成表單取消按鈕 用法:<html:cancel>cancel</html:cancel><html:radio>:生成html<inputtype=”radio”>元素 <html:radio>用于生成單選按鈕 用法:<html:radioproperty=”sex”value=”1”>男</html:radio> <html:radioproperty=”sex”value=”0”>女</html:radio> 單選按鈕需要保證property同樣,只是value值不同樣就可以了.<html:multibox>:生成復(fù)選框<inputtype=”checkBox”> 用法:<html:multiboxproperty="fav"value="1"></html:multibox>籃球 <html:multiboxproperty="fav"value="2"></html:multibox>足球 <html:multiboxproperty="fav"value="3"></html:multibox>乒乓球 復(fù)選框按鈕需要保證property同樣,value的值不同就可以了.還需要注意的是復(fù)選框的值需要寫在標(biāo)簽按鈕的最后面的. 假如應(yīng)用中有多個(gè)Checkbox,并且希望ActionFromBean中用單個(gè)數(shù)組表達(dá),都可以采用<html:multibox>.<html:multibox>的使用方法如下:在ActionForm中定義一個(gè)數(shù)組,用來存放checkBox的值,privateStringstrArray[]=newString[0];publicStringgetStrArray(){ returnthis.strArray;}publicvoidSetStrArray(StringstrArray){ this.StrArray=strArray;}在表單中加入<html:multibox>元素,通過設(shè)立property=”strArray”來把它和ActionFromBean關(guān)聯(lián).對于每個(gè)<html:multibox>元素,設(shè)立它的初始值.<html:multiboxproperty="strArray"value="1"></html:multibox>value1<html:select>下拉列表用于生成html<select>元素它可以在表單上創(chuàng)建下拉列表和多選列表用法:<html:selectproperty=”colors”size=”7”multibox=”false”> <html:optionvalue=”1”>value1</html:option> <html:optionvalue=”2”>value2</html:option> <html:optionvalue=”3”>value3</html:option> </html:select>屬性說明:size:指定每次在網(wǎng)頁上顯示的可選項(xiàng)的數(shù)目.Multibox:指定是否支持多項(xiàng)選擇,假如設(shè)立為true,就表達(dá)多選列表.支持多項(xiàng)選擇;否則表達(dá)下拉列表.只支持單項(xiàng)選擇,默認(rèn)為falseProperty屬性:與actionFrom中的某個(gè)屬性相相應(yīng).這個(gè)屬性用來存放用戶在列表上選中的選項(xiàng)的值.<html:file>標(biāo)簽生成html<inputtype=”file”>元素,提供從html表單中上傳文獻(xiàn)的功能.<html:file>標(biāo)簽可以方便的實(shí)現(xiàn)文獻(xiàn)上傳的功能.樣列代碼如下:<html:formaction="/upload.do"method=”post”enctype="multipart/form-data"> <html:fileproperty="file"/></br> <html:submit>提交</html:submit></html:form>使用<html:file>標(biāo)簽要注意以下幾點(diǎn):<html:file>標(biāo)簽必須嵌套在<html:form>標(biāo)簽中<html:form>標(biāo)簽的method屬性必須設(shè)立為post<html:form>標(biāo)簽的編碼類型emctype屬性必須設(shè)立為”multipart/form-data”<html:file>標(biāo)簽必須設(shè)立property屬性,這個(gè)屬性和ActionFromBean中的FormFile類型的屬性相應(yīng).在ActiomForm中設(shè)立FormFile屬性:在actionForm中設(shè)立一個(gè)名為file的屬性,這個(gè)屬性必須為org.apache.struts.upload.FormFile類型.代碼如下:privateFormFilefile;publicFormFilegetFile(){ returnthis.file;}publicvoidsetFile(FormFilefile){ this.file=file}上傳下載的例子具體參見(My_Java\E實(shí)例\小例子\upDownFile)<html:errors>標(biāo)簽:用于輸犯錯(cuò)誤消息. <html:errors>標(biāo)簽可以放在網(wǎng)頁的任何地方,既可以位于HTML標(biāo)簽內(nèi),也可以位于HTML標(biāo)簽外,<html:errors>標(biāo)簽輸出的錯(cuò)誤消息和它在網(wǎng)頁上的位置有關(guān).<html:errors>標(biāo)簽具有以下重要的屬性:name:指定ActionMessage對象存放在request或sessios范圍內(nèi)的屬性key.標(biāo)簽解決類將根據(jù)這一屬性的key來檢索request或session范圍的ActionMessage對象.默認(rèn)值為Globals.ERROR_KEY.Property:指定消息的屬性.假如此項(xiàng)沒有設(shè)立,將顯示ActionMessages對象中的所有的ActionMessage.Bundle:指定ResourceBundle(資源包),假如此項(xiàng)沒有設(shè)立.將從應(yīng)用默認(rèn)的ResourceBundle中獲取消息文本.[關(guān)于<html:errors>標(biāo)簽的用法詳見:精通strutsp326_p328].錯(cuò)誤消息的來源<html:errors>標(biāo)簽在request或session范圍內(nèi)尋找ActionMessages(或其子類ActionErrors)集合對象.在從ActionMessages集合對象讀取ActionMessage對象,把ActionMessage包含的消息文本顯示到網(wǎng)頁上..在ActionFormBean和Action類中都可以生成ActionMessages對象.ActionFormBean的validate()方法執(zhí)行表單驗(yàn)證,返回ActionErrors對象,Struts控制器組件RequestProcessor(請求解決器)然后把ActionErrors對象存放在request范圍內(nèi),存放時(shí)的屬性key為Globals.ERROR_KEY.以下是HtmlErrorForm的validate()方法:publicActionErrorsvalidate(ActionMappingmapping,HttpServletRequestrequest){ ActionErrorserrors=newActionErrors(); //假如復(fù)選筐被選中了,顯示錯(cuò)誤消息 If(this,getCheckBox1()){Errors.add(ActionMessages.Global_MESSAGE,.newActionMessage(“error.global.fromform”));Errors.add(“checkbox1”,newActionMessage(“error.checkbox”));}retrunerrors;}在action類的execute()方法中可以進(jìn)行數(shù)據(jù)邏輯驗(yàn)證,假如驗(yàn)證失敗,將生成ActionMessages對象.以下是helloapp應(yīng)用的LogonAction的execute()方法;publicActionForwardexecute( ActionMappingmapping, ActionFormform, HttpServletRequestrequest, HttpServletResponseresponse){ ActionMessageserrors=newActionMessages(); StringuserName=(String)((HelloForm)form).getUserName(); StringbadUserName=”Monster”; If(userName.equalsIgnoreCase(badUserName)){ Errors.add(“userName”,newActionMessage(“hello.don’t.talk.to.monster”,badUserName)); SaveErrors(request,errors); Return(newActionForward(mapping.getInput()));} }以上代碼先創(chuàng)建了一個(gè)ActionMessages對象,它用來存放ActionMessage對象,最后調(diào)用Action基類的saveErrors()方法,saveErrors()方法把ActionMessages對象保存在request范圍內(nèi).<html:message>標(biāo)簽:用于顯示正常消息的代碼如下:<html:messagesid=”message”message=”true”> <td><bean:writename=”message”/></td></html:messages><html:messages>標(biāo)簽有以下一些重要屬性:name:指定actionMessages對象存放在request或session范圍內(nèi)的key.,標(biāo)簽解決類將根據(jù)這一屬性key來檢索request或session范圍的ActionMessages對象.Message屬性:指定消息的來源.Id屬性:用來命名從消息集合中檢索出的每個(gè)ActionMessage對象.它和<bean:write>標(biāo)簽的name屬性匹配.Strutsbean標(biāo)簽庫<bean:message>標(biāo)簽用于輸出ResourceBundle種的一條消息.<bean:message>標(biāo)簽的bundle屬性指定ResourceBundle它和struts配置文獻(xiàn)的<message-resource>元素的key屬性匹配.假如沒有設(shè)立bundle屬性,就采用默認(rèn)的ResourceBundle.<bean:message>標(biāo)簽的key屬性直接指定消息key.Bundle屬性指明資源文獻(xiàn)的struts-config.xml文獻(xiàn)種的配置的key值.例如:<bean:messagebundle=”special”key=”hello”>(具體參照:精通strutsp339)<bean:write>標(biāo)簽<bean:write>標(biāo)簽用于在網(wǎng)頁上輸出某個(gè)Bean或它的屬性的內(nèi)容.<bean:write>標(biāo)簽可以輸出單個(gè)字符串,或責(zé)一個(gè)對象的某個(gè)屬性,或責(zé)通過迭代器遍歷集合的所有值<bean:write>標(biāo)簽的name屬性指定已經(jīng)存在的變量.例如:在action中得到一個(gè)字符串的值,然后在頁面上顯示出來 //得到定單狀態(tài)(action中) StringorderState=orderService.getOrderState(userOrderId); request.setAttribute("orderState",orderState); //在界面上顯示為(界面中) <bean:writename="orderState"/>假如希望輸出Bean的某個(gè)屬性值,應(yīng)當(dāng)同時(shí)設(shè)立<bean:write>標(biāo)簽的name屬性和property屬性.Property屬性指定Bean的屬性.例如: //得到當(dāng)前定單的購貨人信息 UserVOuVO=orderService.getUserbyOrderId(userOrderId); request.setAttribute("userVO",uVO); //在頁面上顯示購貨人的信息 <tablewidth="96%"height="80"cellpadding="0"cellspacing="0"><tr><tdalign="right"width="20%">購貨人姓名:</td><td><bean:writename="userVO"property="userName"/></td><tdwidth="20%"> </td><tdalign="right"width="20%">聯(lián)系電話:</td><td><bean:writename="userVO"property="userTelephone"/></td></tr></table>根據(jù)迭代器標(biāo)簽顯示集合的所有內(nèi)容 //得到當(dāng)前定單的所有商品的信息 Listlist=orderService.getWareByOrderId(userOrderId); request.setAttribute("wareList",list); //根據(jù)迭代器標(biāo)簽顯示所有內(nèi)容(界面層)<logic:iterateid="ware"name="wareList"><tr><tdwidth="14%"><bean:writename="ware"property="userOrderId"/></td><tdwidth="14%"><bean:writename="ware"property="wareId"/></td><tdwidth="15%"><bean:writename="ware"property="name"/></td><tdwidth="14%"><bean:writename="ware"property="typeName"/></td></tr></logic:iterate>StrutsLogic標(biāo)簽庫<logic:match>:判斷變量中是否包含指定的常量字符串<logic:notMatch>:判斷變量中是否不包含指定變量的類<logic:empty>和<logic:notEmpty>標(biāo)簽<logic:empty>和<logic:notEmpty>標(biāo)簽判斷指定變量是否為空字符串.例子:以下代碼先定義一個(gè)字符串變量emptyString,它是空字符串.接下來<logic:empty>標(biāo)簽判斷emptyString變量是否為空字符串.其判斷結(jié)果為true..因此將執(zhí)行標(biāo)簽主體的內(nèi)容.<% request.setAttribute(“emptyString”,””);%><logic:emptyname=”emptyString”> thevariablenamedemptyStringisempty!</logic:empty><logic:iterate>標(biāo)簽是Logic標(biāo)簽中最復(fù)雜的標(biāo)簽.也是用途最廣的一個(gè)標(biāo)簽.它可以在一個(gè)循環(huán)中遍歷數(shù)組,Collection,Enumeration,Iterator或Map中的所有元素.一:遍歷集合 <logic:iterate>的name屬性指定需要進(jìn)行遍歷的集合對象.它每次從集合中檢索出一個(gè)元素,然后把它存放在page范圍內(nèi).并以id屬性指定的字符串來命名這個(gè)元素.例如:<% Vectoranimals=newVertor(); animals.addElement(“Dog”); animals.addElement(“Cat”); animals.addElement(“Bird”); animals.addElement(“Chick”); Request.setAttibute(“Animals”,animals);%> <logic:iterateid=”element”name=”Animals”> <bean:writename=”element”></logic:iterate><logic:iterate>標(biāo)簽的length屬性指定需要遍歷的元素的數(shù)目,假如沒有設(shè)立length屬性,就遍歷集合中的所有元素.offset屬性指定開始遍歷的起始位置,默認(rèn)值為”0”<logic:iterateid=”ilement”indexId=”index”name=”Animals”offset=”1”length=”2 <bean:writename=”index”>.<bean:writename=”element”></br></logic:iterate>以上代碼輸出的內(nèi)容為:CatBird設(shè)立被遍歷的變量設(shè)立name屬性,name屬性指定需要遍歷的集合或map.例如:<logic:iteratename=”Animals”id=”element”> <bean:writename=”element”/><br/></logic>設(shè)立name屬性和property屬性,name屬性指定一個(gè)javaBean,property屬性指定javaBean的一個(gè)屬性.這個(gè)屬性為需要遍歷的集合或map.例如:<logic:iterateid=”element”name=”Aninals”indexId=”ind”> <bean:writename=”ind”>.<bean:writename=”element”property=”key”><br/> <logic:iterateid=”elementValue”name=”element”property=”value”length=”3”offset=”1 <bean:writename=”elementValue”> </logic:iterate></logic:iterate>設(shè)立collection屬性,collection屬性指定一個(gè)運(yùn)營時(shí)表達(dá)式,表達(dá)式的運(yùn)算結(jié)果為需要遍歷的集合或map.例如:<logic:iterateid=”header”collection=”<%=request.getHeaderNames%>”> <bean:writename=”header”/><br/></logic:iterate>13、JSP中動態(tài)INCLUDE與靜態(tài)INCLUDE的區(qū)別?動態(tài)INCLUDE用jsp:include動作實(shí)現(xiàn)<jsp:includepage="included.jsp"flush="true"/>它總是會檢查所含文獻(xiàn)中的變化,適合用于包含動態(tài)頁面,并且可以帶參數(shù)。靜態(tài)INCLUDE用include偽碼實(shí)現(xiàn),定不會檢查所含文獻(xiàn)的變化,合用于包含靜態(tài)頁面<%@includefile="included.htm"%>Ajax篇ajax是什么Ajax是AsynchronousJavaScriptandXML(以及DHTML等)的縮寫。ajax不是一項(xiàng)新技術(shù),只是多種技術(shù)的綜合,或者是設(shè)計(jì)方式.涉及javascript,xhtml和css,dom,xml和XSTL,xmlHttpRequest等技術(shù).ajax實(shí)現(xiàn)的原理 ajax采用異步傳輸方式,用戶觸發(fā)事件和向服務(wù)器發(fā)起請求是在一個(gè)線程上.Ajax重要是通過XMLHTTPRequest對象調(diào)用服務(wù)端方法,然后將服務(wù)端返回的數(shù)據(jù)顯示在客戶端.ajax框架的基本流程對象初始化發(fā)送請求服務(wù)器接受服務(wù)器返回--.>客戶端接受修改客戶端頁面內(nèi)容。dwr的實(shí)現(xiàn)原理.Dwr是ajax的開源框架。dwr包含兩個(gè)重要部分:其一是運(yùn)營在瀏覽器客戶端的javascript,這部分被用來與服務(wù)端通信,并更新頁面內(nèi)容;其二是運(yùn)營在服務(wù)器端的javaservlet,這部分用來解決請求將響應(yīng)結(jié)構(gòu)發(fā)送給瀏覽器.ajax開發(fā)環(huán)節(jié).初始化xmlHttpRequest對象.設(shè)立xmlHttpRequest對象的onreadystatechange屬性,指定服務(wù)器返回響應(yīng)數(shù)據(jù)時(shí)要調(diào)用的回調(diào)函數(shù).即指定相應(yīng)解決函數(shù).調(diào)用xmlHttpRequest對象的open方法創(chuàng)建http請求.調(diào)用xmlHttpRequest對象的setResourceHeader等方法,設(shè)立必要的http請求頭信息.調(diào)用xmlHttpRequest對象的send方法,發(fā)送之前創(chuàng)建的http請求.根據(jù)xmlHttpRequest對象的open方法參數(shù),決定等待或者不等到服務(wù)器返回響應(yīng)數(shù)據(jù),假如服務(wù)器返回響應(yīng)數(shù)據(jù),則將控制權(quán)交給之前設(shè)立的回調(diào)函數(shù).Spring篇基礎(chǔ)知識對IOC的理解.IOC的全稱是:InversionofControl(即:控制反轉(zhuǎn)).理解:在傳統(tǒng)的應(yīng)用程序中,控制權(quán)在應(yīng)用程序自身,程序的控制流程完全由開發(fā)者控制。在IOC容器中,控制權(quán)發(fā)生了反轉(zhuǎn):從應(yīng)用程序轉(zhuǎn)移到了IOC容器。組件不再由應(yīng)用程序負(fù)責(zé)創(chuàng)建和配置,而是由IOC容器負(fù)責(zé),應(yīng)用程序只需要直接使用已經(jīng)創(chuàng)建并配置好的組件。為了讓組件能在IOC容器中被“裝配”出來,需要某種“注入”的機(jī)制,才干將一種組件“注入”到另一種組件中。簡樸來說,依賴注入解決了最重要的問題:將組件的配置與使用相分離,并且由IoC容器負(fù)責(zé)管理組件的生命周期。簡樸來說:控制反轉(zhuǎn)就是由容器控制程序之間的(依賴)關(guān)系.依賴注入的三種實(shí)現(xiàn)形式?接口注入(InterfaceInjection)說明:通過實(shí)現(xiàn)一個(gè)接口來實(shí)現(xiàn)對依賴對象的注入.設(shè)值方法注入(Setter注入).說明:對象創(chuàng)建之后,將被依賴對象通過set方法設(shè)立進(jìn)去.構(gòu)造方法注入(Constructorinjection).說明:對象創(chuàng)建時(shí),被依賴對象以構(gòu)造方法參數(shù)的方式注入.說明:Spring兩種依賴注入的類型分別是setter注入和構(gòu)造方法注入。setter注入:一般情況下所有的javabean,我們都會使用setter方法和getter方法去設(shè)立和獲取屬性的值,示例如下:publicclassnamebean{Stringname;publicvoidsetName(Stringa){name=a;}publicStringgetName(){returnname;}}我們會創(chuàng)建一個(gè)bean的實(shí)例然后設(shè)立屬性的值,spring的配置文獻(xiàn)如下:<beanid=”bean1″><propertyname=”name”><value>tom</value></property></bean>Spring會調(diào)用setName方法來只是name熟悉為tom構(gòu)造方法注入:構(gòu)造方法注入中,我們使用帶參數(shù)的構(gòu)造方法如下:publicclassnamebean{Stringname;publicnamebean(Stringa){name=a;}}我們會在創(chuàng)建bean實(shí)例的時(shí)候以newnamebean(“tom”)的方式來設(shè)立name屬性,Spring配置文獻(xiàn)如下:<beanid=”bean1″><constructor-arg><value>MyBeanValue</value></constructor-arg></bean>使用constructor-arg標(biāo)簽來設(shè)立構(gòu)造方法的參數(shù)。Setter注入和構(gòu)造方法注入比較Setter注入的優(yōu)點(diǎn):(1)與傳統(tǒng)的JavaBean的寫法更相似,程序員更容易理解、接受,通過setter方式設(shè)定依賴關(guān)系顯得更加直觀、明顯;(2)對于復(fù)雜的依賴關(guān)系,假如采用構(gòu)造注入,會導(dǎo)致構(gòu)造器過于臃腫,難以閱讀。Spring在創(chuàng)建Bean實(shí)例時(shí),需要同時(shí)實(shí)例化其依賴的所有實(shí)例,因而導(dǎo)致死你功能下降。而使用設(shè)立注入,則避免這下問題;特別在某些屬性可選的情況下,多參數(shù)的構(gòu)造器更加笨拙。構(gòu)造注入的優(yōu)點(diǎn):(1)構(gòu)造注入可以再構(gòu)造器中決定依賴關(guān)系的注入順序,優(yōu)先依賴的優(yōu)先注入。(2)對于依賴關(guān)系無須變化的Bean,構(gòu)造注入更有用處;由于沒有setter方法,所有的依賴關(guān)系所有在構(gòu)造器內(nèi)設(shè)定,因此,不用緊張后續(xù)代碼對依賴關(guān)系的破壞。(3)依賴關(guān)系只能在構(gòu)造器中設(shè)定,則只有組件的創(chuàng)建者才干改變組件的依賴關(guān)系。對組件的調(diào)用者而言,組件內(nèi)部的依賴關(guān)系完全透明,更符合高內(nèi)聚的原則;建議采用以設(shè)立注入為主,構(gòu)造注入為輔的注入策略。對于依賴關(guān)系無須變化的注入,盡量采用構(gòu)造注入;而其他的依賴關(guān)系的注入,則考慮采用設(shè)立注入。對AOP的理解,以及AOP在項(xiàng)目中是如何使用的?AOP(AspectOrientedProgramming),也就是面向切面編程,也有譯作面向方面編程。AOP是一種編程思想.在傳統(tǒng)的面向?qū)ο螅∣bject-OrientedProgramming,OOP)編程中,對垂直切面關(guān)注度很高,橫切面關(guān)注卻很少,也很難關(guān)注。也就是說,我們運(yùn)用OOP思想可以很好的解決業(yè)務(wù)流程,卻不能把系統(tǒng)中的某些特定的反復(fù)性行為封裝在某個(gè)模塊中。比如在很多的業(yè)務(wù)中都需要記錄操作日記,結(jié)果我們不得不在業(yè)務(wù)流程種嵌入大量的日記記錄代碼。無論是對業(yè)務(wù)代碼還是對日記記錄代碼來說,此后的維護(hù)都是非常復(fù)雜的。由于系統(tǒng)種嵌入了這種大量的與業(yè)務(wù)無關(guān)的其它反復(fù)性代碼,系統(tǒng)的復(fù)雜性、代碼的反復(fù)性增長了,從而使bug的發(fā)生率也大大的增長。IOC使軟件組件松散連接成為也許,AOP讓你可以捕獲系統(tǒng)中經(jīng)常使用的功能,把他轉(zhuǎn)化為組件.簡樸的說:面向切面編程通過提供此外一種思考程序結(jié)構(gòu)的途徑來填補(bǔ)面向?qū)ο缶幊?OOP)的局限性.在OOP中模塊化的關(guān)鍵單元是類(classes),而在AOP中模塊化的單元則是切面。切面能對關(guān)注點(diǎn)進(jìn)行模塊化。AOP將應(yīng)用系統(tǒng)分為兩部分,核心業(yè)務(wù)邏輯(Corebusinessconcerns)及橫向的通用邏輯,也就是所謂的方面Crosscuttingenterpriseconcerns。AOP的應(yīng)用:例如,所有大中型應(yīng)用都要涉及到的持久化管理(Persistent)、事務(wù)管理(TransactionManagement)、安全管理(Security)、日記管理(Logging)和調(diào)試管理(Debugging)等。AOP的概念和術(shù)語方面(Aspect):一個(gè)關(guān)注點(diǎn)的模塊化,這個(gè)關(guān)注點(diǎn)實(shí)現(xiàn)也許此外橫切多個(gè)對象。事務(wù)管理是J2EE應(yīng)用中一個(gè)很好的橫切關(guān)注點(diǎn)例子。方面用Spring的Advisor或攔截器實(shí)現(xiàn)。連接點(diǎn)(Joinpoint):程序執(zhí)行過程中明確的點(diǎn),如方法的調(diào)用或特定的異常被拋出。告知(Advice):在特定的連接點(diǎn),AOP框架執(zhí)行的動作。各種類型的告知涉及“around”、“before”和“throws”告知。告知類型將在下面討論。許多AOP框架涉及Spring都是以攔截器做告知模型,維護(hù)一個(gè)“圍繞”連接點(diǎn)的攔截器鏈。切入點(diǎn)(Pointcut):指定一個(gè)告知將被引發(fā)的一系列連接點(diǎn)的集合。AOP框架必須允許開發(fā)者指定切入點(diǎn),例如,使用正則表達(dá)式。引入(Introduction):添加方法或字段到被告知的類。Spring允許引入新的接口到任何被告知的對象。例如,你可以使用一個(gè)引入使任何對象實(shí)現(xiàn)IsModified接口,來簡化緩存。目的對象(TargetObject):包含連接點(diǎn)的對象,也被稱作被告知或被代理對象。AOP代理(AOPProxy):AOP框架創(chuàng)建的對象,包含告知。在Spring中,AOP代理可以是JDK動態(tài)代理或CGLIB代理。編織(Weaving):組裝方面來創(chuàng)建一個(gè)被告知對象。這可以在編譯時(shí)完畢(例如使用AspectJ編譯器),也可以在運(yùn)營時(shí)完畢。Spring和其他純JavaAOP框架同樣,在運(yùn)營時(shí)完畢織入。說明:Target和advice的概念:target(目的):假如一個(gè)對象的執(zhí)行過程受到某個(gè)AOP的修改,那么它就叫一個(gè)目的對象.目的對象也常稱為被告知對象.advice(告知):在某一個(gè)特定的聯(lián)接點(diǎn)處運(yùn)營的代碼稱為”告知”.告知有很多種,比如在聯(lián)接點(diǎn)之前執(zhí)行的前置告知(beforeadvice)和在聯(lián)接點(diǎn)之后執(zhí)行的后置告知(afteradvice).Spring中有五中不同的告知:前置告知(Beforeadvise):在某連接點(diǎn)之前執(zhí)行的告知,但這個(gè)告知不能阻止連接點(diǎn)之前的執(zhí)行流程。(除非它拋出一個(gè)異常)后置告知(Afterreturningadvise):在某連接點(diǎn)正常完畢后執(zhí)行的告知:例如,一個(gè)方法沒有拋出任何異常,正常返回。異常告知(Afterthrowingadvise):在方法拋出異常退出時(shí)執(zhí)行的告知。最終告知(After(finally)advise):當(dāng)某連接點(diǎn)退出的時(shí)候執(zhí)行的告知(無論是正常返回還是異常退出)圍繞告知(AroundAdvise):包圍一個(gè)連接點(diǎn)的告知,如方法調(diào)用。這是最強(qiáng)大的一種告知類型。圍繞告知可以在方法調(diào)用前后完畢自定義的行為。它也會選擇是否繼續(xù)執(zhí)行連接點(diǎn)或直接返回它自己的返回值或拋出異常來結(jié)束執(zhí)行。圍繞告知是最常用的告知類型。Springbean的生命周期:定義->初始化->使用->銷毀Bean的作用域singleton在每個(gè)SpringIoC容器中一個(gè)bean定義相應(yīng)一個(gè)對象實(shí)例。prototype一個(gè)bean定義相應(yīng)多個(gè)對象實(shí)例。request在一次HTTP請求中,一個(gè)bean定義相應(yīng)一個(gè)實(shí)例;即每次HTTP請求將會有各自的bean實(shí)例,它們依據(jù)某個(gè)bean定義創(chuàng)建而成。該作用域僅在基于web的SpringApplicationContext情形下有效。session在一個(gè)HTTPSession中,一個(gè)bean定義相應(yīng)一個(gè)實(shí)例。該作用域僅在基于web的SpringApplicationContext情形下有效。globalsession在一個(gè)全局的HTTPSession中,一個(gè)bean定義相應(yīng)一個(gè)實(shí)例。典型情況下,僅在使用portletcontext的時(shí)候有效。該作用域僅在基于web的SpringApplicationContext情形下有效。Spring自動代理Spring自動代理重要有三個(gè)選擇:使用BeanNameAutoProxyCreator(bean名稱自動代理生成器)類:該類允許我們指明一組bean名稱以及實(shí)行在他們上的一組告知和告知者.Spring會自動用指定的告知代理這些Bean.使用DefaultAdvisorAutoProxyCreator(默認(rèn)告知者自動代理生成器)類:這個(gè)自動代理類非常強(qiáng)大,他自動用所有可行的告知者代理ApplicaitonContext中的所有Bean.該類只接受告知者,不接受告知,由于它依賴告知者的切入點(diǎn)來決定該告知者可以告知給定的bean.使用元數(shù)據(jù)驅(qū)動的自動代理Spring事務(wù)特點(diǎn)事務(wù)是用戶定義的一個(gè)數(shù)據(jù)庫操作序列。這些操作要么都做,要么都不做,是一個(gè)不可分割的工作單位。事務(wù)具有四個(gè)特性:1.原子性:一個(gè)事務(wù)中所有對數(shù)據(jù)庫的操作是一個(gè)不可分割的操作序列。這些操作要么完整的被所有執(zhí)行,要么一步也不做。是一個(gè)邏輯工作單位。2.一致性:一個(gè)事務(wù)獨(dú)立執(zhí)行的結(jié)果將保持一致性,即數(shù)據(jù)不會由于事務(wù)的執(zhí)行而遭受破壞。3.隔離性:一個(gè)事務(wù)的執(zhí)行不能被其他事務(wù)干擾。即一個(gè)事務(wù)內(nèi)部的操作及使用的數(shù)據(jù)對其他并發(fā)事務(wù)是隔離的,并發(fā)執(zhí)行的各個(gè)事務(wù)之間不能互相干擾。4.持久性:一個(gè)事務(wù)一旦提交,它對數(shù)據(jù)庫中數(shù)據(jù)的改變就應(yīng)當(dāng)是永久性的。接下來的其他操作或故障不應(yīng)當(dāng)對其執(zhí)行結(jié)果有任何影響。談?wù)凷pring事務(wù)的理解事務(wù)就是對一系列的數(shù)據(jù)庫操作(比如插入多條數(shù)據(jù))進(jìn)行統(tǒng)一的提交或回滾操作,假如插入成功,那么一起成功,假如中間有一條出現(xiàn)異常,那么回滾之前的所有操作。這樣可以防止出現(xiàn)臟數(shù)據(jù),防止數(shù)據(jù)庫數(shù)據(jù)出現(xiàn)問題。開發(fā)中為了避免這種情況一般都會進(jìn)行事務(wù)管理。Spring中也有自己的事務(wù)管理機(jī)制,一般是使用TransactionMananger進(jìn)行管理,可以通過Spring的注入來完畢此功能。spring提供了兩中方式來實(shí)現(xiàn)事務(wù)管理:聲明式事務(wù)和編程式事務(wù)。編程式事務(wù):比較靈活,但是代碼量大,存在反復(fù)的代碼比較多;聲明式的比編程式的更靈活。11.1編程式事務(wù)Spring提供兩種方式的編程式事務(wù)管理,分別是:使用TransactionTemplate和直接使用PlatformTransactionManager。a.TransactionTempale采用和其他Spring模板,如JdbcTempalte和HibernateTemplate同樣的方法。它使用回調(diào)方法,把應(yīng)用程序從解決取得和釋放資源中解脫出來。如同其他模板,TransactionTemplate是線程安全的。b.也可以使用PlatformTransactionManager直接管理事務(wù)。簡樸地通過一個(gè)bean引用給你的bean傳遞一個(gè)你使用的PlatformTransaction對象。然后,使用TransactionDefinition和TransactionStatus對象就可以發(fā)起、回滾、提交事務(wù)。如下片段:DefaultTransactionDefinitiondef=newDefaultTransactionDefinition();//new一個(gè)事務(wù)//初始化事務(wù),參數(shù)定義事務(wù)的傳播類型;def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);//獲得事務(wù)狀態(tài)TransactionStatusstatus=transactionManager.getTransaction(def);try{…………….transactionMmit(status);//提交事務(wù);}catch(…..)...{transactionManager.rollback(status);//回滾事務(wù);}11.2聲明式事務(wù)聲明式事務(wù)是通過AOP實(shí)現(xiàn)的。大多數(shù)Spring用戶選擇聲明式事務(wù)管理,這是最少影響應(yīng)用代碼的選擇,因而這是和非侵入性的輕量級容器的觀念是一致的。聲明式事務(wù)通常通過TransactionProxyFactoryBean設(shè)立Spring事務(wù)代理。編程式事務(wù)和聲明式事務(wù)如何選擇?當(dāng)你只有很少的事務(wù)操作時(shí),編程式事務(wù)管理通常比較合適。例如:假如你只有一個(gè)Web應(yīng)用,其中只有特定的更新操作有事務(wù)規(guī)定,你也許不樂意使用Spring或其他即使設(shè)立事務(wù)代理。這種情況下,使用TransactionTemplate也許是個(gè)好方法。只有編程式事務(wù)管理才干顯示的設(shè)立事務(wù)名稱。假如你的應(yīng)用中存在大量事務(wù)操作,那么聲明式事務(wù)管理通常是值得的。它將事務(wù)管理與業(yè)務(wù)邏輯分離,并且在Spring中配置也不難。使用Spring,而不是EJBCMT,聲明式事務(wù)管理在配置上的成本極大的減少了。 Spring應(yīng)用spring中的BeanFactory與ApplicationContext的作用和區(qū)別?答:BeanFactory負(fù)責(zé)讀取bean配置文檔,管理bean的加載,實(shí)例化,維護(hù)bean之間的依賴關(guān)系,負(fù)責(zé)bean的聲明周期。ApplicationContext是BeanFactory的擴(kuò)展,除了提供上述BeanFactory所能提供的功能之外,功能得到了進(jìn)一步的增強(qiáng),比如容易與SpringAOP集成,資源解決(國際化解決),事件傳遞及各種不同應(yīng)用層的context實(shí)現(xiàn)0.Spring里面applicationContext.xml文獻(xiàn)能不能改成其他文獻(xiàn)名?答:ContextLoaderListener是一個(gè)ServletContextListener,它在你的web應(yīng)用啟動的時(shí)候初始化。缺省情況下,它會在WEB-INF/applicationContext.xml文獻(xiàn)找Spring的配置。你可以通過定義一個(gè)<context-param>元素名字為”contextConfigLocation”來改變Spring配置文獻(xiàn)的位置。示例如下:<listener>

<listener-class>org.springframework.web.context.ContextLoaderListener

<context-param>

<param-name>contextConfigLocation</param-name>

<param-value>/WEB-INF/xyz.xml</param-value>

</context-param></listener-class></listener>spring中commons-logging.jar的作用commons-logging.jar包是使用spring的必備包。(位置在spring-framework-2.5.6.SEC01\lib\jakarta-commons)用來記錄程序運(yùn)營時(shí)的活動的日記記錄。spring中讀取xml配置文獻(xiàn)、獲取bean的幾種方式獲取Spring框架管理的類實(shí)例的方法有多種,如下:方法一:在初始化時(shí)保存ApplicationContext對象代碼:ApplicationContextac=newFileSystemXmlApplicationContext("applicationContext.xml");ac.getBean("beanId");說明:這種方式合用于采用Spring框架的獨(dú)立應(yīng)用程序,需要程序通過配置文獻(xiàn)手工初始化Spring的情況。方法二:通過Spring提供的工具類獲取ApplicationContext對象代碼:importorg.springframework.web.context.support.WebApplicationContextUtils;ApplicationContextac1=WebApplicationContextUtils.getRequiredWebApplicationContext(ServletContextsc)ApplicationContextac2=WebApplicationContextUtils.getWebApplicationContext(ServletContextsc)ac1.getBean("beanId");ac2.getBean("beanId");說明:這種方式適合于采用Spring框架的B/S系統(tǒng),通過ServletContext對象獲取ApplicationContext對象,然后在通過它獲取需要的類實(shí)例。

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論