关于SpringMVC的异常处理,这些细节你知道吗?

前言

大家好,我是千锋文哥。今天文哥给大家讲解在SpringMVC中如何进行异常处理。在WEB应用中,如果程序内部出现了异常,我们不加处理的话,异常信息会直接抛到浏览器页面上,导致用户的体验感非常差。对用户来说,这样是非常不友好的,所以我们必须对应用抛出的异常信息进行处理,今天文哥就给大家讲解SpringMVC处理异常的方式有哪些。对于异常的处理方式,文哥给大家分两种,一种是SpringMVC默认的异常处理方式,还有一种是SpringMVC支持的其他异常处理方式。

SpringMVC默认的异常处理方式

SpringMVC默认的异常处理方式和Servlet处理异常的方式是一样的。我们只需要在web.xml里面定义处理异常的配置就可以了。现在文哥给大家演示在SpringMVC中默认的异常处理如何实现。

1. 创建web工程,搭建SpringMVC环境

现在我们使用maven创建一个web项目,然后引入依赖并配置SpringMVC的环境。这部分操作相信小伙伴们都非常熟练了,所以文哥不再赘述。当我们搭建好SpringMVC的基本环境以后,我们开始进行如下操作。

第一步:编写一个跳转成功的目标页面,我们定义为success.jsp。

在理想的情况下,如果我们的程序没有出现异常,那么跳转的目标页面就是success.jsp。

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
  <h4>这是一个成功页面.....</h4>
</body>
</html>

第二步:编写控制器代码

接下来我们编写Controller代码,在控制器方法内部我们定义模拟程序出现异常的代码,具体代码定义如下:

@Controller
@RequestMapping("hello")
public class HelloController {
    @RequestMapping("demo1")
    public String demo1(String username){
              int i = 10 / 0; //模拟异常出现的代码
        System.out.println("demo1方法执行了......");
        return "success";
}

当我们启动项目,发送请求,我们发现异常信息抛到了浏览器页面上,这样非常不友好。

图片

所以我们需要对出现的这种异常信息进行处理,如何处理呢?我们在web.xml里面定义处理错误的配置信息。

2. 配置异常处理规则

在web.xml里面,我们对异常的处理规则定义如下:

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

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

我们在error-page标签里面定义处理异常的异常状态码和页面。如果我们的服务器内部出现了500错误,我们就会跳转到500.jsp页面进行异常处理;如果我们请求资源找不到,那么我们就会跳转到404.jsp进行异常处理。这样异常信息就不再直接抛出到浏览器页面上。现在我们分别定义这两种错误处理的jsp页面。

3. 定义错误处理页面

首先我们在webapps目录下面定义404.jsp页面,页面定义如下:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
  <h4>服务器资源不存在.....</h4>
</body>
</html>

接下来我们在webapps目录下面定义500.jsp页面,页面定义如下:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
   <h4>这是一个500错误,请稍后再试.....</h4>
</body>
</html>

现在我们重启项目,重新发送请求,查看异常信息是否被处理成功:

图片

接下来我们再模拟一个400的异常处理请求,我们看看400类型异常能否被处理成功:

图片

以上就是Servlet默认处理异常的规则。在SpringMVC中,这种处理异常的方式同样适用。小伙伴们有没有觉得非常简单!

SpringMVC其他的异常处理方式

除了默认的异常处理方式以外,SpringMVC还支持其他的异常处理方式。接下来文哥给大家演示SpringMVC支持的其他的异常处理方式有哪些。

1. @ControllerAdvice + @ExceptionHandler注解进行异常处理

现在文哥给大家演示使用@ControllerAdvice + @ExceptionHandler注解进行异常处理的具体步骤。

第一步:编写控制器方法

我们编写几个控制器方法,在控制器方法内部模拟不同类型的异常,具体定义方法如下所示:

@Controller
@RequestMapping("exception")
public class ExceptionController {

    //模拟出现空指针异常
    @RequestMapping("testException")
    public String testException(){
        int[] arr = null;
        arr[100] = 101;
        return "success";
    }

    //模拟数组下标越界异常
    @RequestMapping("testException1")
    public String testException1(){
        int[] arr = new int[3];
        arr[5] = 100;
        return "success";
    }

    //模拟除0异常
    @RequestMapping("testException2")
    public String testException2(){
        int i = 10 / 0;
        System.out.println(i);
        return "success";
    }
}

第二步:编写异常处理类

现在我们编写一个类,这个类使用@ControllerAdvice注解修饰。在这个类里面,我们定义不同异常类型的错误处理方法,这些方法使用@ExceptionHandler注解修饰。

/**
 * 标识当前类是一个异常处理类
 */
@ControllerAdvice
public class MVCExceptionHandler {

    /**
     * 处理空指针异常
     * @param e
     * @return
     */
    @ExceptionHandler(value = {NullPointerException.class})
    public ModelAndView nullPointerExceptionHandler(Exception e){
        ModelAndView modelAndView = new ModelAndView();
        //描述异常信息
        modelAndView.addObject("msg",e.toString());
        //设置异常处理视图
        modelAndView.setViewName("error");
        return modelAndView;
    }

    /**
     * 处理算术异常
     * @param e
     * @return
     */
    @ExceptionHandler(value = ArithmeticException.class)
    public ModelAndView arithmeticExceptionHandler(Exception e){
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("msg",e.toString());
        modelAndView.setViewName("error");
        return modelAndView;
    }

    /**
     * 处理下标越界异常
     * @param ex
     * @return
     */
    @ExceptionHandler(value = ArrayIndexOutOfBoundsException.class)
    public ModelAndView arrayIndexOutOfBoundsExceptionHandler(Exception ex){
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("msg",ex.toString());
        modelAndView.setViewName("error");
        return modelAndView;
    }

}

我们发现,在当前的异常处理类里面,我们定义处理异常的逻辑是返回ModelAndView对象。通过ModelAndView对象,我们设置了处理异常的页面是error.jsp页面。接下来我们定义错误处理页面。

第三步:编写异常处理页面

在webapps目录下面,我们定义一个错误处理页面,页面名称是error.jsp,定义如下:

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h4>这是一个错误处理页面......</h4>
    <span>${msg}</span>
</body>
</html>

第四步:启动项目,测试效果

接下来我们启动项目,发送请求,查看测试效果。

图片

2. 使用SimpleMappingExceptionResolver处理全局异常

我们也可以使用SimpleMappingExceptionResolver组件来帮助我们进行异常的全局处理,前提是我们需要将SimpleMappingExceptionResolver组件注入到Spring容器里面来。接下来文哥给大家演示SimpleMappingExceptionResolver是如何处理异常的。

第一步:定义一个配置类,将SimpleMappingExceptionResolver交给Spring容器管理

现在我们定义一个Java配置类,然后定义一个方法。我们使用@Bean注解修饰这个方法,方法的返回值类型就是SimpleMappingExceptionResolver类型。通过配置类的方式将该组件交给Spring容器进行管理。

/**
 * 全局异常处理器
 */
@Configuration
public class GlobalExceptionHandler {

    @Bean
    public SimpleMappingExceptionResolver getExceptionResolver(){
        SimpleMappingExceptionResolver resolver = new SimpleMappingExceptionResolver();
        Properties properties = new Properties();
        /**
         * 参数1:处理的具体的异常的类型
         * 参数2:处理异常需要跳转到的视图
         */
        properties.put("java.lang.NullPointerException","error");
        properties.put("java.lang.ArithmeticException","error");
        properties.put("java.lang.ArrayIndexOutOfBoundsException","error");
        resolver.setExceptionMappings(properties);
        return resolver;
    }
}

第二步:定义处理异常的jsp页面

在webapps目录下面,我们定义一个错误处理页面,页面名称是error.jsp,定义如下:

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h4>这是一个错误处理页面......</h4>
</body>
</html>

第三步:启动项目,测试效果

接下来我们启动项目,发送请求,查看测试效果。

图片

3. 自定义异常处理器

在SpringMVC中,还支持我们自定义组件。在SpringMVC底层,Spring官方为我们定制了很多异常处理器。如果这些异常处理器都不满足我们的需求,我们还可以自定义异常处理器,来帮助我们进行异常处理。接下来文哥就给大家演示自定义异常处理器如何实现:

第一步: 定义一个类,实现HandlerExceptionResolver接口

现在我们定义一个全局异常处理类,这个类我们需要实现HandlerExceptionResolver接口,这个接口里面有一个方法resolveException。这个方法就是提供给我们定义异常处理信息的方法。

/**
 * 异常处理器  必须实现HandlerExceptionResolver接口
 */
@Component
public class ExceptionResolver implements HandlerExceptionResolver {

    public ModelAndView resolveException(HttpServletRequest httpServletRequest,
                                         HttpServletResponse httpServletResponse, 
                                         Object o, Exception e) {
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("msg",e.toString());
        modelAndView.setViewName("error");
        return modelAndView;
    }
}

第二步:定义处理异常的jsp页面

在webapps目录下面,我们定义一个错误处理页面,页面名称是error.jsp,定义如下:

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h4>这是一个错误处理页面......</h4>
</body>
</html>

第三步:启动项目,测试效果

接下来我们启动项目,发送请求,查看测试效果。

总结

通过本篇文章,文哥给大家演示了在SpringMVC中如何进行异常处理。通过本篇文章的学习,小伙伴们应该发现了在SpringMVC中,SpringMVC给我们提供了很多种异常处理的方式,每一种异常处理方式在SpringMVC底层都有对应的异常处理器做支撑的,对于0基础的小伙伴来说,我们首先做到学会运用即可。在下一期文章中,文哥会给大家讲解在SpringMVC中如何使用拦截器,敬请大家期待!

猜你喜欢

转载自blog.csdn.net/GUDUzhongliang/article/details/132359737