拦截器
拦截器需要实现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打开的资源
异常处理器
接口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扫描
标签:pre,拦截器,SpringMVC,方法,笔记,学习,执行,异常,IOC From: https://www.cnblogs.com/darkpar/p/16697462.html