拦截器

拦截器需要实现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扫描