拦截器 Interceptor
SpringMVC拦截器类似于Servlet开发中的过滤器Fliter, 用于对处理器的预处理和后处理。


开发步骤
-
创建拦截器类实现HandlerInterceptor接口
-
配置拦截器
-
测试拦截器拦截的作用效果
<context:component-scan base-package="com.itheima.Controller"/><mvc:annotation-driven/><mvc:default-servlet-handler/>mvc:interceptors
mvc:interceptor<mvc:mapping path="/**"/> <bean class="com.itheima.interceptor.MyInterceptor"/> </mvc:interceptor></mvc:interceptors>
mvc:interceptors
mvc:interceptor<mvc:mapping path="/**"/> <bean class="com.itheima.interceptor.MyInterceptor2"/> </mvc:interceptor></mvc:interceptors>
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class MyInterceptor implements HandlerInterceptor {
// 在目标方法执行之前执行
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println(" prehandle ");
String param = request.getParameter("param");
if("yes".equals(param)){
return ture;
}else{
request.getRequestDispatcher("/error.jsp");
return false;}//return ture放行 false不放行
}// 在目标方法执行之后,视图返回之前进行执行
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println(" posthandle.. ");
}// 在整个流程执行完毕之后进行执行
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println(" afterCompletion. ");
}
}
对preHandle:即使不放行也可以通过response重定向或者request转发。
对postHandle:视图返回前可以通过modelandview把数据或者视图改成其他的
配置两个拦截器的结果

顺序和在applicationContext.xml文件中配置的顺序有关系

异常处理机制

异常处理的两种方式
• 使用SpringMVC提供的简单异常处理器SimpleExceptionResolver
• 实现Spring的异常处理接口HandlerExceptionResolver自定义自己的异常处理器
简单异常处理器SimpleExceptionResolver

value就是视图的名称,例如,error.jsp。因为INTERNALRESOURCEVIEWRESOLVER中已经配好了prefix suffix(前后缀)。
exceptionMappings优先进行匹配,没有匹配的再去匹配默认错误视图。
自定义异常处理的步骤
-
创建异常处理器实现类 实现 HandlerExceptionResolver接口
-
配置异常处理器
-
编写异常页面
-
测试异常跳转
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"><property name="exceptionMappings"> <map> <entry key="ClassCastExcep tion" value="error1"/> <entry key="ErrorDefineByMe" value="error2"/> </map> </property> </bean><bean class="com.itheima.Resolver.MyExceptionReslover"/>public class MyExceptionReslover implements HandlerExceptionResolver
{
public ModelAndView resolverException(HttpServletRequest request, HttpServletResponse response, HandlerMethod handlerMethod)
{
ModelAndView mv = new ModelAndView();
if (e instanceof MyException){
mv.addObject("info","自定义异常");
}else if(e instanceof ClassCastException){
mv.addObject("info","类转换异常");
}
}@Override public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { return null; }}
最后这段代码仅供参考

异常处理的核心还是解耦合,最初使用的TRY catch方法会和业务代码出现耦合的情况,并且不同位置可能抛出相同的异常不容易查找;此外,如果相比较 出现错误 服务器报500错误,显示好看的出错页面用户体验更好。