集中统一处理异常

spring框架采用的是统一,全局的异常处理。

把controller中把所有的异常处理都集中到一个地方。采用的是aop思想。把业务逻辑和异常处理代码分开,解耦合。

使用两个注解

1.@ExceptionHandler

2.@ControllerAdvice

使用步骤

1.exception下新建一个自定义异常类MyUserException,再定义它的子类NameException,AgeException

2.在conatroller抛出NameException,AgeException

3.handler下创建一个普通类,作用全局异常处理类

1)在类的上面加入@ControllerAdvice

2)在类中定义方法,方法的上面加入@ExceptionHandler

4.创建处理异常的试图的jsp页面

5.创建spring的配置文件

1)组件扫描,扫描Controller注解

2)组件扫描器,扫描@ConatrollerAdvice所在的包名

3)生命注解驱动

<context:component-scan base-package="com.note.handler" />
<mvc:annotation-driven />

拦截器

1)拦截器是spring中的一种,需要事项HandlerInterceptor接口

2)拦截器和过滤器类似,功能方向侧重点不同。过滤器是过来过滤器请求参数

拦截器是拦截用户的请求,做请求做判断处理。

3)拦截器是全局的,可以对多个Controller做拦截。

一个项目可以有0个或多个拦截器,他们在一起拦截用户的请求。

拦截器常用在:用户登录处理,权限检查,记录日志.

拦截器的使用步骤:

1.定义类实现HandlerInterceptor接口。

2,在springmvc配置文件中,声明拦截器,让框架知道拦截器的存在。

<mvc:interceptors>
    <!-- 声明第一个拦截器 -->
    <mvc:interceptor>
        <!-- path="/user/**.do"  /**是指所有 -->
        <mvc:mapping path="/**"/>
        <bean class="com.note.handler.MyInterceptor" />
    </mvc:interceptor>
</mvc:interceptors>
拦截器的执行时间:

1)在请求处理之前,也就是controller类中的方法执行之前先被拦截。

2)在控制器方阿飞执行后也会执行拦截器。

3)在请求处理完成后也会执行拦截器。

实现类中重写三个方法

1.preHandle

参数:Object handler 被拦截器对象

返回值boolean:true,false

特点:

1.方法在控制器方法(MyController的doSome)之前先执行的。

2.在这个方法中饭可以获取请求的信息,验证是否符合要求。

可以验证用户是否登录,验证用户是否有权限访问某个链接(url)。

如果验证失败,可以截断请求,请求不能被处理。

如果验证成功,可以放行请求,此时控制方法才能执行。

2.postHandle

参数:Object handler 被拦截器对象

ModelAndView mv:处理器方法的返回值

特点:

1.在处理器之后执行的(MyController.doSome())

2.能够取到处理器方法的返回值ModelAndView,可以修改其中的值,影响最终结果。

3.主要对原来的执行结果做二次修正

3.afterCompletion

参数:Object handler 被拦截器对象

Exception ex:程序中发生的异常

特点:

1.在请求处理完成后执行的。框架中规定是当你的视图处理后,对视图执行了forward,就认为处理完成。

2.一般做资源回收工作的,程序请求工程中创建了一些对象,在这里释放资源。

拦截器和过滤器的区别

1.过滤器是servlet中的对象,拦截器是框架中的对象。

2.过滤器实现Filter接口的对象,拦截器是实现HandlerInterceptor

3.过滤器是用来设置request,response的参数,属性的,侧重对数据过滤的。

拦截器是用来验证请求的,能截断请求

4.过滤器实在拦截器之前先执行的

5.过滤器是tomcat服务器创建的对象

过滤器是springmvc容器创建的额对象

6.过滤器是一个执行的时间点

拦截器有三个执行时间点

7.过滤器可以处理jsp,js,html等等

过滤器是侧重拦截对Controller的对象。如果你的对象不能被中央调度器接受,这个请求不会执行拦截内容

8.拦截器拦截普通类方法执行,过滤器过滤servlet请求相应

SpringMVC执行流程

![图片1.png](file:///C:/Users/gy/AppData/Local/Packages/microsoft.office.desktop_8wekyb3d8bbwe/AC/%23!oice_16_974fa576_32c1d314_2b5/Temp/msohtmlclip1/01/clip_image002.gif)

执行过程:

1.用户发起请求some.do

2.DispatcherServlet接受请求some.do,把请求转交给处理器映射器

处理器映射器:springmvc框架中的一种对象,框架把实现了HandlerMapping接口的类都叫做映射器(多个)

处理器映射器作用:根据请求,从springmvc容器对象中获取处理对象,框架把找到的处理器对象放到处理器执行链的类保存

处理器执行链(HandlerExceptionChain的类中保存着:1.处理器对象(MyController);2.项目中所有的拦截器

3.中央调度器把2中的处理器执行链中的处理器对象交给处理器适配器

处理器适配器:springmvc框架中的对象,需要实现HandlerAdapter接口。

处理器适配器作用:执行处理器方法(调用MyController.doSome()得到返回值(ModelAndView)

4.中央调度器把3中获取的ModelAndView交给视图解析器对象

视图解析器:springmvc中的对象,需要实现ViewResoler接口(可以有多个)

视图解析器作用:组成视图完整路径,使用前缀,后缀。并创建View对象。

view是一个接口,表示视图的,在框架中jsp,html不是string表示,而是使用view和他的实现类表示视图

5.中央调度器把4步骤中创建的view对象获取到,调用view类自己的方法,把Model数据放入到request作用域

执行对象视图的forward,请求转发。

过滤器和拦截器非常相似,但是它们有很大的区别

最简单明了的区别就是过滤器可以修改request,而拦截器不能过滤器需要在servlet容器中实现,

拦截器可以适用于javaEE,javaSE等各种环境拦截器可以调用IOC容器中的各种依赖,

过滤器只能在请求的前后使用,而拦截器可以详细到每个方法

文章作者: 郭远
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 郭远的博客空间
SpringMVC SpringMVC
喜欢就支持一下吧
打赏
微信 微信
支付宝 支付宝