侧边栏壁纸
博主头像
coydone博主等级

记录学习,分享生活的个人站点

  • 累计撰写 306 篇文章
  • 累计创建 51 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

SpringMVC异常处理和拦截器

coydone
2022-03-21 / 0 评论 / 0 点赞 / 447 阅读 / 3,868 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-04-10,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

异常处理

在我们的应用系统运行的过程中,可能由于运行环境、用户操作、资源不足等各方面的原因导致系统出现异常(HTTP状态异常、Exception),如果系统出现了异常,这些异常将会通过浏览器呈现给用户,而这种异常的显示是没有必要,因此我们可以在服务器进行特定的处理。当系统出现异常之后,呈现给用户一个统一的、可读的的异常提示页面。

异常处理思路

Controller调用service,service调用dao,异常都是向上抛出的,最终有DispatcherServlet找异常处理器进行异常的处理。

HTTP异常状态统一处理

HTTP Status 404

1、创建一个用于进行异常提示的页面:404.jsp

2、在web.xml中进行配置

<error-page>
	<error-code>404</error-code>
	<location>/404.jsp</location>
</error-page>

Java代码异常处理

1、基于Servlet API的处理

<error-page>
	<exception-type>java.lang.NumberFormatException</exception-type>
	<location>/err.jsp</ location>
</error-page>

2、SpringMVC的异常处理

package com.coydone.utils;

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

@ControllerAdvice
public class MyExceptionHandler {

    @ExceptionHandler(NullPointerException.class)
    public String nullHandler() {
        return "/err1.jsp";
    }

    @ExceptionHandler(NumberFormatException.class)
    public String formatHandler() {
        return "/err2.jsp";
    }
}

SpringMVC的异常处理

1、自定义异常类

package com.coydone.exception; 
public class SysException extends Exception{
    private static final long serialVersionUID = 4055945147128016300L;
    // 异常提示信息 
    private String message; 
    public String getMessage() { 
        return message; 
    }
    public void setMessage(String message) {
        this.message = message; 
    }
    public SysException(String message) {
        this.message = message;
    }
}

2、自定义异常处理器

public class SysExceptionResolver implements HandlerExceptionResolver{
    //跳转到具体的错误页面的方法
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { 
        ex.printStackTrace();
        SysException e = null; 
        // 获取到异常对象
        if(ex instanceof SysException) { 
            e = (SysException) ex; 
        }else { 
            e = new SysException("请联系管理员");
        }     
        ModelAndView mv = new ModelAndView();
        // 存入错误的提示信息 
        mv.addObject("message", e.getMessage()); 
        // 跳转的Jsp页面
        mv.setViewName("error");
        return mv;
    }
}

3、配置异常处理器

<!-- 配置异常处理器 --> 
<bean id="sysExceptionResolver" class="cn.coydone.exception.SysExceptionResolver"/>

SpringMVC中的拦截器

拦截器概述

SpringMVC中的拦截器用于对处理器进行预处理和后处理的技术。

可以定义拦截器链,连接器链就是将拦截器按着一定的顺序结成一条链,在访问被拦截的方法时,拦截器链中的拦截器会按着定义的顺序执行。

拦截器和过滤器的功能比较类似,有区别:

  • 过滤器是Servlet规范的一部分,任何框架都可以使用过滤器技术。

  • 拦截器是SpringMVC框架独有的。

  • 过滤器配置了/*,可以拦截任何资源。

  • 拦截器只会对控制器中的方法进行拦截。

拦截器也是AOP思想的一种实现方式。想要自定义拦截器,需要实现HandlerInterceptor接口。

自定义拦截器

1、创建类,实现HandlerInterceptor接口,重写需要的方法

public class MyInterceptor1 implements HandlerInterceptor{ 
    /**
    * controller方法执行前,进行拦截的方法 
    * return true放行 
    * return false拦截 
    * 可以使用转发或者重定向直接跳转到指定的页面。 
    */ 
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 
        System.out.println("拦截器执行了..."); 
        return true; 
    }
}

2、在springmvc.xml中配置拦截器类

<!-- 配置拦截器 --> 
<mvc:interceptors> 
    <mvc:interceptor> 
        <!-- 哪些方法进行拦截 -->
        <mvc:mapping path="/user/*"/>
        <!-- 哪些方法不进行拦截 
			<mvc:exclude-mapping path=""/>
		 -->
        <!-- 注册拦截器对象 -->
        <bean class="com.coydone.demo1.MyInterceptor1"/>
    </mvc:interceptor> 
</mvc:interceptors>

HandlerInterceptor接口中的方法

preHandle()方法是Controller中方法执行前拦截的方法

  • 可以使用request或者response跳转到指定的页面

  • return true放行,执行下一个拦截器,如果没有拦截器,执行Controller中的方法。

  • return false不放行,不会执行Controller中的方法。

postHandle()是Controller方法执行后执行的方法,在JSP视图执行前。

  • 可以使用request或者response跳转到指定的页面

  • 如果指定了跳转的页面,那么Controller方法跳转的页面将不会显示。

  • postHandle()方法是在JSP执行后执行。

  • request或者response不能再跳转页面。

配置多个拦截器

1、编写多个拦截器类

2、springmvc配置文件中配置

<!-- 配置拦截器 --> 
<mvc:interceptors> 
    <mvc:interceptor>
        <!-- 哪些方法进行拦截 -->
        <mvc:mapping path="/user/*"/> 
        <!-- 哪些方法不进行拦截
 			<mvc:exclude-mapping path=""/>
 		-->
		<!-- 注册拦截器对象 -->
        <bean class="com.coydone.demo1.MyInterceptor1"/>
    </mvc:interceptor>
    <mvc:interceptor> 
        <!-- 哪些方法进行拦截 -->
        <mvc:mapping path="/**"/> 
        <!-- 注册拦截器对象 -->
        <bean class="com.coydone.demo1.MyInterceptor2"/>
    </mvc:interceptor>
</mvc:interceptors>

拦截器链

将多个拦截器按照—定的顺序构成一个执行链。

0

评论区