springmvc机制(拦截器、aop、异常)_第1页
springmvc机制(拦截器、aop、异常)_第2页
springmvc机制(拦截器、aop、异常)_第3页
springmvc机制(拦截器、aop、异常)_第4页
springmvc机制(拦截器、aop、异常)_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Springmv知识A概念SpringWebMVC是一种基于Java的实现了WebMVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发,SpringWebMVC也是要简化我们日常Web开发的。理解这张图之前我们得先知道以下的几个名词:前端控制器(DispatcherServlet)、请求到处理器映射(HandlerMapping)、处理器适配器(HandlerAdapter)、视图解析器(ViewResolver)、处理器或页面控制器(Controller)、验证器(Vali

2、dator)、命令对象(Command请求参数绑定到的对象就叫命令对象)、表单对象(FormObject提供给表单展示和提交到的对象就叫表单对象)步骤解析:核心架构的具体流程步骤如下:1、首先用户发送请求DispatcherServlet,前端控制器收到请求后自己不进行处理,而是委托给其他的解析器进行处理,作为统一访问点,进行全局的流程控制;2、DispatcherServletHandlerMapping,HandlerMapping将会把请求映射为HandlerExecutionChain对象(包含一个Handler处理器(页面控制器)对象、多个HandlerInterceptor拦截器)

3、对象,通过这种策略模式,很容易添加新的映射策略;3、DispatcherServletHandlerAdapter,HandlerAdapter将会把处理器包装为适配器,从而支持多种类型的处理器,即适配器设计模式的应用,从而很容易支持很多类型的处理器;4、HandlerAdapter处理器功能处理方法的调用,HandlerAdapter将会根据适配的结果调用真正的处理器的功能处理方法,完成功能处理;并返回一个ModelAndView对象(包含模型数据、逻辑视图名);5、ModelAndView的逻辑视图名ViewResolver,ViewResolver将把逻辑视图名解析为具体的View,通过

4、这种策略模式,很容易更换其他视图技术;6、View渲染,View会根据传进来的Model模型数据进行渲染,此处的Model实际是一个Map数据结构,因此很容易支持其他视图技术;7、返回控制权给DispatcherServlet,由DispatcherServlet返回响应给用户,到此一个流程结束。当然以上步骤中并没有去说明拦截器、事务、安全性,其描述的是具体的对象的流程,前者所说的是框架对象,所以使用的技术和原理则不一样。Handlerinterceptor拦截器A概念SpringMVC中的Interceptor拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理,其他

5、的作用比如通过它来进行权限验证,或者是来判断用户是否登陆,日志记录,或者限制时间点访问。Interceptor实现类及其方法SpringMVC中的Interceptor拦截请求是通过HandlerInterceptor来实现的。在SpringMVC中定义一个Interceptor非常简单,主要有两种方式,第一种方式是要定义的Interceptor类要实现了Spring的HandlerInterceptor接口,或者是这个类继承实现了HandlerInterceptor接口的类,比如Spring已经提供的实现了HandlerInterceptor接口的抽象类HandlerInterceptorA

6、dapter;第二种方式是实现Spring的WebRequestInterceptor接口,或者是继承实现了WebRequestInterceptor的类。HandlerInterceptor接口中定义了三个方法,我们就是通过这三个方法来对用户的请求进行拦截处理的。(1)preHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandle)方法。该方法将在请求处理之前进行调用。SpringMVC中的Interceptor是链式的调用的,在一个应用中或者说是在一个请求中可以同时存在多个Interceptor。每个

7、Interceptor的调用会依据它的声明顺序依次执行,而且最先执行的都是Interceptor中的preHandle方法,所以可以在这个方法中进行一些前置初始化操作或者是对当前请求的一个预处理,也可以在这个方法中进行一些判断来决定请求是否要继续进行下去。该方法的返回值是布尔值Boolean类型的,当它返回为false时,表示请求结束,后续的Interceptor和Controller都不会再执行;当返回值为true时就会继续调用下一个Interceptor的preHandle方法,如果已经是最后一个Interceptor的时候就会是调用当前请求的Controller方法。(2)postHan

8、dle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandle,ModelAndViewmodelAndView)方法,由preHandle方法的解释我们知道这个方法包括后面要说到的afterCompletion方法都只能是在当前所属的Interceptor的preHandle方法的返回值为true时才能被调用。postHandle方法,顾名思义就是在当前请求进行处理之后,也就是Controller方法调用之后执行,但是它会在DispatcherServlet进行视图返回渲染之前被调用,所以我们可以在这个方法中对Co

9、ntroller处理之后的ModelAndView对象进行操作。postHandle方法被调用的方向跟preHandle是相反的,也就是说先声明的Interceptor的postHandle方法反而会后执行,这和Struts2里面的Interceptor的执行过程有点类型。Struts2里面的Interceptor的执行过程也是链式的,只是在Struts2里面需要手动调用ActionInvocation的invoke方法来触发对下一个Interceptor或者是Action的调用,然后每一个Interceptor中在invoke方法调用之前的内容都是按照声明顺序执行的,而invoke方法之后的

10、内容就是反向的。(3)afterCompletion(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandle,Exceptionex)方法,该方法也是需要当前对应的Interceptor的preHandle方法的返回值为true时才会执行。顾名思义,该方法将在整个请求结束之后,也就是在DispatcherServlet渲染了对应的视图之后执行。这个方法的主要作用是用于进行资源清理工作的。我们的系统日志的拦截在这个方法中,可以记录日志的相关的参数,检测方法的执行。拦截器的配置-日志拦帚七图2系统springmvc拦截器

11、这三个方法的代码可以参考拦截器日志模块运用1.获取MAC地址获取用户请求的参数获取异常获取其所操作的所有的类可以访问Loglnterceptor.javaAOP的原理与实现A概念AOP是OOP的延续,是AspectOrientedProgramming的缩写,意思是面向切面编程。可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP可以说也是这种目标的一种实现。我们现在做的一些非业务,如:日志、事务、安全等都会写在业务代码中(也即是说,这些非业务类横切于业务类),

12、但这些代码往往是重复,复制粘贴式的代码会给程序的维护带来不便,AOP就实现了把这些业务需求与系统需求分开来做。这种解决的方式也称代理机制。先来了解一下AOP的相关概念,Spring参考手册中定义了以下几个AOP的重要概念,结合以上代码分析如下:切面(Aspect):官方的抽象定义为一个关注点的模块化,这个关注点可能会横切多个对象”,在本例中,“切面”就是类TestAspect所关注的具体行为,例如,AServiceImpl.barA()的调用就是切面TestAspect所关注的行为之一。切面在Applicationcontext中来配置。连接点(Joinpoint):程序执行过程中的某一行为,

13、例如,UserService.get的调用或者UserService.delete抛出异常等行为。通知(Advice):切面对于某个连接点所产生的动作,例如,TestAspect中对com.spring.service包下所有类的方法进行日志记录的动作就是一个Advice。其中,一个“切面可以包含多个Advice,例如ServiceAspect。切入点(Pointcut):匹配连接点的断言,在AOP中通知和一个切入点表达式关联。例如,TestAspect中的所有通知所关注的连接点,都由切入点表达式execution(*com.spring.service.*.*(.)来决定。目标对象(Targ

14、etObject):被一个或者多个切面所通知的对象。例如,AServcielmpI和BServicelmpI,当然在实际运行时,SpringAOP采用代理实现,实际AOP操作的是TargetObject的代理对象。AOP代理(AOPProxy):在SpringAOP中有两种代理方式,JDK动态代理和CGLIB代理。默认情况下,TargetObject实现了接口时,则采用JDK动态代理,例如,AServicelmpI;反之,采用CGLIB代理,例如,BServiceImpl。强制使用CGLIB代理需要将aop:config的proxy-target-class属性设为true。通知(Advice

15、)类型:前置通知(Beforeadvice):在某连接点(JoinPoint)之前执行的通知,但这个通知不能阻止连接点前的执行。Applicationcontext中在aop:aspect里面使用aop:before元素进行声明。例如,TestAspect中的doBefore方法。后置通知(Afteradvice):当某连接点退出的时候执行的通知(不论是正常返回还是异常退出)。ApplicationContext中在aop:aspect里面使用aop:after元素进行声明。例如,ServiceAspect中的returnAfter方法,所以Teser中调用UserService.delete

16、抛出异常时,returnAfter方法仍然执行。返回后通知(Afterreturnadvice):在某连接点正常完成后执行的通知,不包括抛出异常的情况。ApplicationContext中在aop:aspect里面使用after-returning元素进行声明。环绕通知(Aroundadvice):包围一个连接点的通知,类似Web中Servlet规范中的Filter的doFilter方法。可以在方法的调用前后完成自定义的行为,也可以选择不执行。ApplicationContext中在aop:aspect里面使用aop:around元素进行声明。例女口,ServiceAspect中的aroun

17、d方法。抛出异常后通知(Afterthrowingadvice):在方法抛出异常退出时执行的通知。ApplicationContext中在aop:aspect里面使用aop:after-throwing元素进行声明。例如,ServiceAspect中的returnThrow方法。AOP的配置和运用Aop的配置文件:aop的配置.xml。使用注意:1、tomact使用注意:在.XML文件支持aop的情况下,需要的配置文件中加入以下的代过注辖配畫诗组件一码:!-激活绘件担隘功能.:在包cmywh.studio.,spring.aop_其孑包下盂自动更益這con.text:o-nipon.en.t-

18、scaiibase-packaEe=,rcn*ysh!激活自动代產功能一aop:aspectjautQproxyproxy-1arge1:一匚_s5三=匸rue/Aop的bean文件2.注意aop切入点的表达式dop:pointcutid=(tionfoMcutj1*eKpressionVxecutioDbis.niodHes.tservice.J)orexecutionIns.module5,sys.servicetJ丿/环绕诡拥publicGbjectcontroller(ProceedingJoinPointpjp)throwsThrowable/获职当亘mi行的controller&i

19、类Stringclasswaine=pjpgetTmrqEt)getclass().getName();if(classNatne!=null)conC1955tan?e=className;l/荻取当前执行的方法容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提供的异常处理主要有两种方式,一种是直接实现自己的HandlerExceptionResolver,另一种是使用注解的方式实现

21、一个专门用于处理异常的ControllerExceptionHandler。前者当发生异常时,页面会跳到指定的错误页面,后者同样,只是后者会在每个controller中都需要加入重复的代码。如何进行简单地统一配置异常,使得发生普通错误指定到固定的页面,ajax发生错直接通过js获取,展现给用户,变得非常重要。下面先介绍下2种异常处理方式,同时,结合现有的代码,让其支持ajax方式,实现springMVCweb系统的异常统一处理。1实现自己的。HandlerExceptionResolver是一个接口,springMVC本身已经对其有了一个自身的实现DefaultExceptionResolve

22、r,该解析器只是对其中的一些比较典型的异常进行了拦截处理。靈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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论