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

下载本文档

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

文档简介

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

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

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

4、iew 的逻辑视图名 - ViewResolver, ViewResolver将把逻辑视图名解 析为具体的View,通过这种策略模式,很容易更换其他视图技术; 6、 View渲染,View会根据传进来的 Model模型数据进行渲染,此处的 Model 实际是一个Map数据结构,因此很容易支持其他视图技术; 7、 返回控制权给 DispatcherServlet,由DispatcherServlet返回响应给用户,到此一个流 程结束。 当然以上步骤中并没有去说明拦截器、事务、安全性,其描述的是具体的对象的流程, 前者所说的是框架对象,所以使用的技术和原理则不一样。 Handlerintercep

5、tor 拦截器 概念 SpringMVC中的Interceptor拦截器也是相当重要和相当有用的, 它的主要作用是拦截 用户的请求并进行相应的处理, 其他的作用比如通过它来进行权限验证, 或者是来判断用户 是否登陆,日志记录,或者限制时间点访问。 Interceptor实现类及其方法SpringMVC中的Interceptor拦截请求是通过 Handlerinterceptor 来实现的。在 SpringMVC中定义一个Interceptor非常简单,主要有两种方式,第一种方式是要定义的 Interceptor类要实现了 Spring的Handlerinterceptor 接口,或者是这个类继

6、承实现了 Handlerinterceptor 接口 的类,比如 Spring 已经提供的实现了 Handlerinterceptor 接口的抽 象类 HandlerinterceptorAdapter ;第二种方式是实现 Spring 的 WebRequestinterceptor 接口, 或者是继承实现了 WebRequestinterceptor的类。 Handlerinterceptor接口中定义了三个方法,我们就是通过这三个方法来对用户的请求 进行拦截处理的。 (1 ) preHandle (HttpServletRequest request, HttpServletRespons

7、e response, Object handle)方法。该方法将在请求处理之前进行调用。 SpringMVC中的interceptor是链式的调 用的,在一个应用中或者说是在一个请求中可以同时存在多个 interceptor。每个interceptor 的调用会依据它的声明顺序依次执行,而且最先执行的都是 interceptor中的preHandle方 法,所以可以在这个方法中进行一些前置初始化操作或者是对当前请求的一个预处理, 也可 以在这个方法中进行一些判断来决定请求是否要继续进行下去。该方法的返回值是布尔值 Boolean类型的,当它返回为 false时,表示请求结束,后续的 inte

8、rceptor和Controller都 不会再执行;当返回值为 true时就会继续调用下一个 interceptor的preHandle方法,如果 已经是最后一个interceptor的时候就会是调用当前请求的 Controller方法。 (2 ) postHandle (HttpServletRequest request, HttpServletResponse response, Object handle, ModelAndView modelAndView) 方法,由preHandle方法的解释我们知道这个方法包 括后面要说到的 afterCompletion方法都只能是在当前所属的

9、 interceptor的preHandle方法 的返回值为true时才能被调用。postHandle方法,顾名思义就是在当前请求进行处理之后, 也就是Controller方法调用之后执行, 但是它会在 DispatcherServlet进行视图返回渲染之前 被调用,所以我们可以在这个方法中对 Controller处理之后的ModelAndView对象进行操作。 postHandle方法被调用的方向跟 preHandle是相反的,也就是说先声明的 interceptor的 postHandle方法反而会后执行,这和 Struts2里面的interceptor的执行过程有点类型。 Struts2

10、里面的interceptor的执行过程也是链式的,只是在 Struts2里面需要手动调用 Actioninvocation 的invoke方法来触发对下一个 interceptor或者是 Action的调用,然后每 一个Interceptor中在invoke方法调用之前的内容都是按照声明顺序执行的,而 invoke方 法之后的内容就是反向的。 (3 ) afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handle, Exception ex)方法,该方法也是需要当前对应的 Inte

11、rceptor的preHandle方法的返 回值为true时才会执行。顾名思义,该方法将在整个请求结束之后,也就是在 DispatcherServlet渲染了对应的视图之后执行。这个方法的主要作用是用于进行资源清理工 作的。 我们的系统日志的拦截在这个方法中,可以记录日志的相关的参数,检测方法的执 行。 拦截器的配置 !-槌融胃一 : Intel ceil 伽 an ?rg 沽函 igframe work * c m, jf a. support. Gpenfn ti tyMa 2(a ge rln Vleyln terceptorrj 图2系统springmvc拦截器 这三个方法的代码可以参

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

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

14、在ApplicationContext中 来配置。 连接点(Joinpoint):程序执行过程中的某一行为,例如, UserService.get的调用或者 UserService.delete抛出异常等行为。 通知(Advice):切面对于某个 连接点所产生的动作,例如, TestAspect中对 com.spring.service包下所有类的方法进行日志记录的动作就是一个 Advice。其中,一个 切 面可以包含多个 Advice,例如ServiceAspect。 切入点(Pointcut):匹配连接点的断言,在 AOP中通知和一个切入点表达式关联。例 如,TestAspect中的所有通

15、知所关注的连接点,都由切入点表达式 com.spring.service.*.*(.)来决定。 目标对象(Target Object):被一个或者多个切面所通知的对象。例如, execution(* AServcielmpl 和BServicelmpl,当然在实际运行时,Spring AOP采用代理实现,实际 AOP操作的是 Targetobject的代理对象。 AOP代理(AOP Proxy :在Spring AOP中有两种代理方式, JDK动态代理和 CGLIB代 理。默认情况下,TargetObject实现了接口时,则采用JDK动态代理,例 如,AServiceImpl; 反之,采用 C

16、GLIB代理,例如,BServiceImpl。强制使用 CGLIB代理需要将 aop:config的 proxy-target-class 属性设为 true。 通知(Advice)类型: 前置通知(Before advice):在某连接点(JoinPoint)之前执行的通知,但这个通知不 能阻止连接点前的执行。 ApplicationContext中在aop:aspect里面使用aop:before元素进 行声明。例如,TestAspect中的doBefore方法。 后置通知(After advice ):当 某连接点退出的时候执行的通知(不论是正常返回还是异 常退出)。Applicatio

17、nContext中在aop:aspect里面使 用aop:after元素进行声明。例如, ServiceAspect 中的 returnAfter 方法,所以 Teser 中调用 UserService.delete 抛出异常时, returnAfter方法仍然执行。 返回后通知(After return advice ):在某连接点正常完成后执行的通知,不包括抛出异 常的情况。ApplicationContext 中在 aop:aspect里面使用after-returning 元素进行声明。 环绕通知(Around advice ):包 围一个连接点的通知, 类似 Web中Servlet规

18、范中的Filter 的doFilter方法。可以在方法的调用前后完成自定义的行为,也可以选择不执 行。 ApplicationContext 中在 aop:aspect里面使用 aop:around 元素进行声明。例 如, ServiceAspect 中的 around 方法。 抛出异常后通知(After throwing advice ):在方法抛出异常退出时执行的通知。 ApplicationContext 中在 aop:aspect里面使用 aop:after-throwing 元素进行声明。例如, ServiceAspect 中的 returnThrow 方法。AOP的配置和运用 Ao

19、p的配置文件:aop的配置.xml。 使用注意: 1、tomact使用注意:在.XML文件支持aop的情况下,需要的配置文件中加入以下的代 码: 1. cn. ysh. studio, spring, aop 其子瓷七百自寺扫描透 之注解竟置的场件一 O-激活自切代理功能- 2.注意aop切入点的表达式 r-* I Aop的bean文件public Object controller (PrOcedinaJoinPoiriL: cjp) throws Throwable 漆驱当前拘行的口 ont工0】:1巳丁由粪 string className = pjp.getTarget () .get

20、ciass () .getNaiue (); if (classNaiiie J -null J m二已住=classliane; /茹职当前执行的方法名 String mthodNane 一 pjp.getSignature () -getNamef) If (methodName!nullI corjtLhodNne = tnethodNaitie; ObjectLJ str = pipgetArgs(); if str.length!=0) ( Entity 二 stz 01 .getClass () , getSiiLpieiJame (; ) /粮押 sasswame i retur

21、n obj; 环慢通M public CbjGat service(ProcfeedinqJoinPc._nL pjp) throws Throwjble 获得gtvice层的垫 String clossNamc - pjp getTarget ) .gctdass () *getNamc (); Exception的处理 概念 SpringMVC提供的异常处理主要有两种方式,一种是直接实现自己的 HandlerExceptionResolver,另一种是使用注解的方式实现一个专门用于处理异 常的 Controller - ExceptionHandler。前者当发生异常时,页面会跳到指定的错

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

23、一些比较典型的异常 进行了拦截处理 图4全局异常控制 2、使用 ExceptionHandler 进行处理 使用ExceptionHandler进行处理有一个不好的地方是进行异常处理的方法必须与出 错的方法在同一个 Controller 里面。 orgB epr 1 ngfraineworw siireotype .c_ontro-l eri ore stsrlnet r. web . bind . anncitat ion - fexcets-TieriHarialer 1 are - 3|or-iriig+ ramcb-rork . web . birnd annotation Heque

24、 3 JMiBppiHe ; e&mB tisntlon Jblot; - ireb . servlet My Except Ion 5, fC ont rol 1 ? r (jubJlc. I,暮,GlobA 1 Control 1 r L c. 51tfJLnf. exceptQn (MvExc&pt ion e) Sy stem . OUT . printLn ( e .etMes s ae C ); e.p r ntsta c kTrace(i re urtni *exc ep t ion-: uq LI e & f-a a pp x n g ( ,p t E s fc J publi c void t.e & t ( 5 C t ti roifli ner My Exc, 5!土口n,出t昔7 ! 图4局部异常控制 异常的配置 1. 4. 5. 8, import 吕x.苴直

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论