4.异常和拦截器
集中统一处理异常
spring框架采用的是统一,全局的异常处理。
把controller中把所有的异常处理都集中到一个地方。采用的是aop思想。把业务逻辑和异常处理代码分开,解耦合。
使用两个注解
使用步骤
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执行流程

执行过程:
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容器中的各种依赖,
过滤器只能在请求的前后使用,而拦截器可以详细到每个方法