拦截器
拦截器需要实现HandlerInterceptor接口
然后配置到IOC文件中
在mvc:interceptors标签中配置拦截器bean或ref
这种方式会拦截所有路径
在mvc:interceptors标签中配置mvc:interceptor
这种方式可以配置拦截器拦截的路径范围
注意:拦截器中的拦截路径中的 " /* "不代表所有路径,只代表一层路径," /** "才是全部路径
接口中三个方法的执行时间
preHandle在控制器方法执行前执行
postHandle控制器方法执行后执行
afterCompletion控制器方法执行后,且渲染视图完毕之后
这三个方法都通过
HandlerExecutionChain mappedHandler这个玩意调用
其中pre按正序执行,每次执行给handler里面的索引加一,直到执行完或者返回false
当pre都没进行拦截时会执行全部的post
------然后无论pre有没有返回false都会执行finally中的after,利用索引标记了全部返回true的pre
------所以分析下来,应该在pre里面写打开资源,返回false时不应该打开资源
------post写对响应的处理
------after处理pre打开的资源
上面的分析错了,又看了一下,finally中执行的并不是triggerAfterCompletion,而是applyAfterConcurrentHandlingStarted,这个函数奇奇怪怪的,既然不非得执行after,那为什么要用index记录执行成功了多少个。。。
然后applyAfterConcurrentHandlingStarted把普通的拦截器转化成了子接口类型,没找到实现类是哪个。。。有点奇怪,没看懂
异常处理器
接口HandlerExceptionResolver
IOC默认配置了一个异常处理器:DefaultHandlerExceptionResolver
自己配置异常处理器:
文件方式
先在IOC文件中配置bean org.springframework.web.servlet.handler.SimpleMappingExcetionResolver
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<prop key="异常的全类名">发生异常后应该跳转的页面</prop>
<prop key="java.lang.ArithmeticException">error</prop>
</props> </property> <!--exceptionAttribute属性设置一个属性名,将出现的异常信息在请求域中进行共享 --> <property name="exceptionAttribute" value="ex"> </property> </bean>
注解方式
类前加@ControllerAdvice注解
类中的方法添加@ExceptionHandler注解,注解里的value属性设置为 异常.class
然后在方法里面设置Throwable的形参和Model的形参,就会自动获取到这两个类型的参数,在model里面共享异常参数,就可以在其他地方使用,和之前普通的controller方法共享参数方法一样
//@ControllerAdvice将当前类标识为异常处理的组件 @ControllerAdvice public class ExceptionController { //@ExceptionHandler用于设置所标识方法处理的异常 @ExceptionHandler(ArithmeticException.class) //ex表示当前请求处理中出现的异常对象 public String handleArithmeticException(Exception ex, Model model){ model.addAttribute("ex", ex); return "error"; } }
也需要被IOC扫描
浙公网安备 33010602011771号