springmvc機(jī)制(攔截器、aop、異常)_第1頁
springmvc機(jī)制(攔截器、aop、異常)_第2頁
springmvc機(jī)制(攔截器、aop、異常)_第3頁
springmvc機(jī)制(攔截器、aop、異常)_第4頁
springmvc機(jī)制(攔截器、aop、異常)_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、Springmv知識(shí)A概念SpringWebMVC是一種基于Java的實(shí)現(xiàn)了WebMVC設(shè)計(jì)模式的請求驅(qū)動(dòng)類型的輕量級Web框架,即使用了MVC架構(gòu)模式的思想,將web層進(jìn)行職責(zé)解耦,基于請求驅(qū)動(dòng)指的就是使用請求-響應(yīng)模型,框架的目的就是幫助我們簡化開發(fā),SpringWebMVC也是要簡化我們?nèi)粘eb開發(fā)的。理解這張圖之前我們得先知道以下的幾個(gè)名詞:前端控制器(DispatcherServlet)、請求到處理器映射(HandlerMapping)、處理器適配器(HandlerAdapter)、視圖解析器(ViewResolver)、處理器或頁面控制器(Controller)、驗(yàn)證器(Vali

2、dator)、命令對象(Command請求參數(shù)綁定到的對象就叫命令對象)、表單對象(FormObject提供給表單展示和提交到的對象就叫表單對象)步驟解析:核心架構(gòu)的具體流程步驟如下:1、首先用戶發(fā)送請求DispatcherServlet,前端控制器收到請求后自己不進(jìn)行處理,而是委托給其他的解析器進(jìn)行處理,作為統(tǒng)一訪問點(diǎn),進(jìn)行全局的流程控制;2、DispatcherServletHandlerMapping,HandlerMapping將會(huì)把請求映射為HandlerExecutionChain對象(包含一個(gè)Handler處理器(頁面控制器)對象、多個(gè)HandlerInterceptor攔截器)

3、對象,通過這種策略模式,很容易添加新的映射策略;3、DispatcherServletHandlerAdapter,HandlerAdapter將會(huì)把處理器包裝為適配器,從而支持多種類型的處理器,即適配器設(shè)計(jì)模式的應(yīng)用,從而很容易支持很多類型的處理器;4、HandlerAdapter處理器功能處理方法的調(diào)用,HandlerAdapter將會(huì)根據(jù)適配的結(jié)果調(diào)用真正的處理器的功能處理方法,完成功能處理;并返回一個(gè)ModelAndView對象(包含模型數(shù)據(jù)、邏輯視圖名);5、ModelAndView的邏輯視圖名ViewResolver,ViewResolver將把邏輯視圖名解析為具體的View,通過

4、這種策略模式,很容易更換其他視圖技術(shù);6、View渲染,View會(huì)根據(jù)傳進(jìn)來的Model模型數(shù)據(jù)進(jìn)行渲染,此處的Model實(shí)際是一個(gè)Map數(shù)據(jù)結(jié)構(gòu),因此很容易支持其他視圖技術(shù);7、返回控制權(quán)給DispatcherServlet,由DispatcherServlet返回響應(yīng)給用戶,到此一個(gè)流程結(jié)束。當(dāng)然以上步驟中并沒有去說明攔截器、事務(wù)、安全性,其描述的是具體的對象的流程,前者所說的是框架對象,所以使用的技術(shù)和原理則不一樣。Handlerinterceptor攔截器A概念SpringMVC中的Interceptor攔截器也是相當(dāng)重要和相當(dāng)有用的,它的主要作用是攔截用戶的請求并進(jìn)行相應(yīng)的處理,其他

5、的作用比如通過它來進(jìn)行權(quán)限驗(yàn)證,或者是來判斷用戶是否登陸,日志記錄,或者限制時(shí)間點(diǎn)訪問。Interceptor實(shí)現(xiàn)類及其方法SpringMVC中的Interceptor攔截請求是通過HandlerInterceptor來實(shí)現(xiàn)的。在SpringMVC中定義一個(gè)Interceptor非常簡單,主要有兩種方式,第一種方式是要定義的Interceptor類要實(shí)現(xiàn)了Spring的HandlerInterceptor接口,或者是這個(gè)類繼承實(shí)現(xiàn)了HandlerInterceptor接口的類,比如Spring已經(jīng)提供的實(shí)現(xiàn)了HandlerInterceptor接口的抽象類HandlerInterceptorA

6、dapter;第二種方式是實(shí)現(xiàn)Spring的WebRequestInterceptor接口,或者是繼承實(shí)現(xiàn)了WebRequestInterceptor的類。HandlerInterceptor接口中定義了三個(gè)方法,我們就是通過這三個(gè)方法來對用戶的請求進(jìn)行攔截處理的。(1)preHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandle)方法。該方法將在請求處理之前進(jìn)行調(diào)用。SpringMVC中的Interceptor是鏈?zhǔn)降恼{(diào)用的,在一個(gè)應(yīng)用中或者說是在一個(gè)請求中可以同時(shí)存在多個(gè)Interceptor。每個(gè)

7、Interceptor的調(diào)用會(huì)依據(jù)它的聲明順序依次執(zhí)行,而且最先執(zhí)行的都是Interceptor中的preHandle方法,所以可以在這個(gè)方法中進(jìn)行一些前置初始化操作或者是對當(dāng)前請求的一個(gè)預(yù)處理,也可以在這個(gè)方法中進(jìn)行一些判斷來決定請求是否要繼續(xù)進(jìn)行下去。該方法的返回值是布爾值Boolean類型的,當(dāng)它返回為false時(shí),表示請求結(jié)束,后續(xù)的Interceptor和Controller都不會(huì)再執(zhí)行;當(dāng)返回值為true時(shí)就會(huì)繼續(xù)調(diào)用下一個(gè)Interceptor的preHandle方法,如果已經(jīng)是最后一個(gè)Interceptor的時(shí)候就會(huì)是調(diào)用當(dāng)前請求的Controller方法。(2)postHan

8、dle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandle,ModelAndViewmodelAndView)方法,由preHandle方法的解釋我們知道這個(gè)方法包括后面要說到的afterCompletion方法都只能是在當(dāng)前所屬的Interceptor的preHandle方法的返回值為true時(shí)才能被調(diào)用。postHandle方法,顧名思義就是在當(dāng)前請求進(jìn)行處理之后,也就是Controller方法調(diào)用之后執(zhí)行,但是它會(huì)在DispatcherServlet進(jìn)行視圖返回渲染之前被調(diào)用,所以我們可以在這個(gè)方法中對Co

9、ntroller處理之后的ModelAndView對象進(jìn)行操作。postHandle方法被調(diào)用的方向跟preHandle是相反的,也就是說先聲明的Interceptor的postHandle方法反而會(huì)后執(zhí)行,這和Struts2里面的Interceptor的執(zhí)行過程有點(diǎn)類型。Struts2里面的Interceptor的執(zhí)行過程也是鏈?zhǔn)降?,只是在Struts2里面需要手動(dòng)調(diào)用ActionInvocation的invoke方法來觸發(fā)對下一個(gè)Interceptor或者是Action的調(diào)用,然后每一個(gè)Interceptor中在invoke方法調(diào)用之前的內(nèi)容都是按照聲明順序執(zhí)行的,而invoke方法之后的

10、內(nèi)容就是反向的。(3)afterCompletion(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandle,Exceptionex)方法,該方法也是需要當(dāng)前對應(yīng)的Interceptor的preHandle方法的返回值為true時(shí)才會(huì)執(zhí)行。顧名思義,該方法將在整個(gè)請求結(jié)束之后,也就是在DispatcherServlet渲染了對應(yīng)的視圖之后執(zhí)行。這個(gè)方法的主要作用是用于進(jìn)行資源清理工作的。我們的系統(tǒng)日志的攔截在這個(gè)方法中,可以記錄日志的相關(guān)的參數(shù),檢測方法的執(zhí)行。攔截器的配置-日志攔帚七圖2系統(tǒng)springmvc攔截器

11、這三個(gè)方法的代碼可以參考攔截器日志模塊運(yùn)用1.獲取MAC地址獲取用戶請求的參數(shù)獲取異常獲取其所操作的所有的類可以訪問Loglnterceptor.javaAOP的原理與實(shí)現(xiàn)A概念A(yù)OP是OOP的延續(xù),是AspectOrientedProgramming的縮寫,意思是面向切面編程??梢酝ㄟ^預(yù)編譯方式和運(yùn)行期動(dòng)態(tài)代理實(shí)現(xiàn)在不修改源代碼的情況下給程序動(dòng)態(tài)統(tǒng)一添加功能的一種技術(shù)。AOP實(shí)際是GoF設(shè)計(jì)模式的延續(xù),設(shè)計(jì)模式孜孜不倦追求的是調(diào)用者和被調(diào)用者之間的解耦,AOP可以說也是這種目標(biāo)的一種實(shí)現(xiàn)。我們現(xiàn)在做的一些非業(yè)務(wù),如:日志、事務(wù)、安全等都會(huì)寫在業(yè)務(wù)代碼中(也即是說,這些非業(yè)務(wù)類橫切于業(yè)務(wù)類),

12、但這些代碼往往是重復(fù),復(fù)制粘貼式的代碼會(huì)給程序的維護(hù)帶來不便,AOP就實(shí)現(xiàn)了把這些業(yè)務(wù)需求與系統(tǒng)需求分開來做。這種解決的方式也稱代理機(jī)制。先來了解一下AOP的相關(guān)概念,Spring參考手冊中定義了以下幾個(gè)AOP的重要概念,結(jié)合以上代碼分析如下:切面(Aspect):官方的抽象定義為一個(gè)關(guān)注點(diǎn)的模塊化,這個(gè)關(guān)注點(diǎn)可能會(huì)橫切多個(gè)對象”,在本例中,“切面”就是類TestAspect所關(guān)注的具體行為,例如,AServiceImpl.barA()的調(diào)用就是切面TestAspect所關(guān)注的行為之一。切面在Applicationcontext中來配置。連接點(diǎn)(Joinpoint):程序執(zhí)行過程中的某一行為,

13、例如,UserService.get的調(diào)用或者UserService.delete拋出異常等行為。通知(Advice):切面對于某個(gè)連接點(diǎn)所產(chǎn)生的動(dòng)作,例如,TestAspect中對com.spring.service包下所有類的方法進(jìn)行日志記錄的動(dòng)作就是一個(gè)Advice。其中,一個(gè)“切面可以包含多個(gè)Advice,例如ServiceAspect。切入點(diǎn)(Pointcut):匹配連接點(diǎn)的斷言,在AOP中通知和一個(gè)切入點(diǎn)表達(dá)式關(guān)聯(lián)。例如,TestAspect中的所有通知所關(guān)注的連接點(diǎn),都由切入點(diǎn)表達(dá)式execution(*com.spring.service.*.*(.)來決定。目標(biāo)對象(Targ

14、etObject):被一個(gè)或者多個(gè)切面所通知的對象。例如,AServcielmpI和BServicelmpI,當(dāng)然在實(shí)際運(yùn)行時(shí),SpringAOP采用代理實(shí)現(xiàn),實(shí)際AOP操作的是TargetObject的代理對象。AOP代理(AOPProxy):在SpringAOP中有兩種代理方式,JDK動(dòng)態(tài)代理和CGLIB代理。默認(rèn)情況下,TargetObject實(shí)現(xiàn)了接口時(shí),則采用JDK動(dòng)態(tài)代理,例如,AServicelmpI;反之,采用CGLIB代理,例如,BServiceImpl。強(qiáng)制使用CGLIB代理需要將aop:config的proxy-target-class屬性設(shè)為true。通知(Advice

15、)類型:前置通知(Beforeadvice):在某連接點(diǎn)(JoinPoint)之前執(zhí)行的通知,但這個(gè)通知不能阻止連接點(diǎn)前的執(zhí)行。Applicationcontext中在aop:aspect里面使用aop:before元素進(jìn)行聲明。例如,TestAspect中的doBefore方法。后置通知(Afteradvice):當(dāng)某連接點(diǎn)退出的時(shí)候執(zhí)行的通知(不論是正常返回還是異常退出)。ApplicationContext中在aop:aspect里面使用aop:after元素進(jìn)行聲明。例如,ServiceAspect中的returnAfter方法,所以Teser中調(diào)用UserService.delete

16、拋出異常時(shí),returnAfter方法仍然執(zhí)行。返回后通知(Afterreturnadvice):在某連接點(diǎn)正常完成后執(zhí)行的通知,不包括拋出異常的情況。ApplicationContext中在aop:aspect里面使用after-returning元素進(jìn)行聲明。環(huán)繞通知(Aroundadvice):包圍一個(gè)連接點(diǎn)的通知,類似Web中Servlet規(guī)范中的Filter的doFilter方法。可以在方法的調(diào)用前后完成自定義的行為,也可以選擇不執(zhí)行。ApplicationContext中在aop:aspect里面使用aop:around元素進(jìn)行聲明。例女口,ServiceAspect中的aroun

17、d方法。拋出異常后通知(Afterthrowingadvice):在方法拋出異常退出時(shí)執(zhí)行的通知。ApplicationContext中在aop:aspect里面使用aop:after-throwing元素進(jìn)行聲明。例如,ServiceAspect中的returnThrow方法。AOP的配置和運(yùn)用Aop的配置文件:aop的配置.xml。使用注意:1、tomact使用注意:在.XML文件支持aop的情況下,需要的配置文件中加入以下的代過注轄配畫詩組件一碼:!-激活繪件擔(dān)隘功能.:在包c(diǎn)mywh.studio.,spring.aop_其孑包下盂自動(dòng)更益這con.text:o-nipon.en.t-

18、scaiibase-packaEe=,rcn*ysh!激活自動(dòng)代產(chǎn)功能一aop:aspectjautQproxyproxy-1arge1:一匚_s5三=匸rue/Aop的bean文件2.注意aop切入點(diǎn)的表達(dá)式dop:pointcutid=(tionfoMcutj1*eKpressionVxecutioDbis.niodHes.tservice.J)orexecutionIns.module5,sys.servicetJ丿/環(huán)繞詭擁publicGbjectcontroller(ProceedingJoinPointpjp)throwsThrowable/獲職當(dāng)亙mi行的controller&i

19、類Stringclasswaine=pjpgetTmrqEt)getclass().getName();if(classNatne!=null)conC1955tan?e=className;l/荻取當(dāng)前執(zhí)行的方法容StringmethodNaine=pjp.getsignature(J.getUame();/方法容If(metliodName1=null)tJiodJJahie=methoduame;Objectstt=pjpg巳t總rgs();If(strlength1=0)entity=str0.getClass().getSimplElfame();7/classNamem.etrio

20、dNam.eioptproperties/文件茯取操作茗Stringkey=clas3Uame+1T-,r+meth0dNaniE;Objectobj=pjp丁冃拆方,去returnobj;/F繞迪知publicCLjectservice(ProceedingJoinpointpjp)throwsThrowblsserviced的類StringclassName-pjp.gEtTarg巴t仃gEtC!丄門g已tName);Exception的處理A概念SpringMVC提供的異常處理主要有兩種方式,一種是直接實(shí)現(xiàn)自己的HandlerExceptionResolver,另一種是使用注解的方式實(shí)現(xiàn)

21、一個(gè)專門用于處理異常的ControllerExceptionHandler。前者當(dāng)發(fā)生異常時(shí),頁面會(huì)跳到指定的錯(cuò)誤頁面,后者同樣,只是后者會(huì)在每個(gè)controller中都需要加入重復(fù)的代碼。如何進(jìn)行簡單地統(tǒng)一配置異常,使得發(fā)生普通錯(cuò)誤指定到固定的頁面,ajax發(fā)生錯(cuò)直接通過js獲取,展現(xiàn)給用戶,變得非常重要。下面先介紹下2種異常處理方式,同時(shí),結(jié)合現(xiàn)有的代碼,讓其支持ajax方式,實(shí)現(xiàn)springMVCweb系統(tǒng)的異常統(tǒng)一處理。1實(shí)現(xiàn)自己的。HandlerExceptionResolver是一個(gè)接口,springMVC本身已經(jīng)對其有了一個(gè)自身的實(shí)現(xiàn)DefaultExceptionResolve

22、r,該解析器只是對其中的一些比較典型的異常進(jìn)行了攔截處理。靈Li,r.14.importjswajirSerwl&t.htt口.HttpSerletR.equestsimportjavax.servlet.http-HttpServletResponsejimportorg.pring-Fi?amewDrk.web.serwlet.HandLerEscepticinREEOlvEr;importorg.springframework.web.servlet.odeLAndView;publicclassExceptionHandlerimplementsHandlerExceptionREcL忻Er園w亡rid亡publicModelAndViewresdlveExce口1:|215已*丄已tR皀quEMl:equestHttpServletRes口onm已responseObjecthandlerExceptio

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(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

提交評論