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

关注“Java架构栈”微信公众号, 回复暗号【Java面试题】即可获取大厂面试题。

 前言

大家好,我是千锋文哥。今天文哥给大家讲解在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中如何使用拦截器,敬请大家期待!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: SpringMVC是基于Spring框架之上的MVC架构模式的Web应用程序开发框架。它提供了丰富的特性,如请求映射,视图解析,数据绑定和校验,异常处理等,使得开发人员能够高效、灵活、简单地开发Web应用程序。 ### 回答2: SpringMVC是基于Spring框架的一种Web框架,它用于开发Web应用程序。它采用了MVC(Model-View-Controller)的设计模式,将Web应用程序分为三个组件:模型、视图和控制器。 模型(Model)是应用程序的数据和业务逻辑,它负责处理数据的读写和处理业务逻辑。模型通过与数据库或其他数据源进行交互,获取和保存数据。 视图(View)是应用程序的用户界面,它负责将模型中的数据以合适的方式展示给用户。视图通常使用HTML、CSS和JavaScript来创建,并且可以根据用户的交互动态变化。 控制器(Controller)是应用程序的中央协调器,它接收用户的请求并根据请求选择合适的业务逻辑来处理。控制器从视图接收用户的输入,并将其委托给相应的模型进行处理。一旦模型处理完毕,控制器将结果返回给视图,再由视图展示给用户。 SpringMVC提供了一套强大的特性和功能,使得开发者可以轻松构建可扩展、灵活和高效的Web应用程序。它具有良好的模块化和可插拔性,可以与其他Spring模块和第三方库很好地集成。同时,SpringMVC还提供了丰富的视图解析器、表单处理器、数据验证和异常处理等功能,以及灵活的URL映射和参数绑定机制。 总之,SpringMVC是一个成熟和流行的Web框架,它简化了Web开发过程,提高了开发效率和代码的可维护性,适用于各种规模的Web应用程序的开发。 ### 回答3: SpringMVC是一种基于Spring框架的Web开发框架。它旨在简化和优化基于Java的Web应用程序的开发过程。SpringMVC采用了Model-View-Controller(MVC)的架构模式,将应用程序的逻辑、数据和用户界面分开。该框架提供了一个灵活和可扩展的方式来构建Web应用程序。 在SpringMVC中,请求从前端提交到Controller层。Controller负责处理用户的请求,从数据库中获取所需的数据,并将其发送到视图层进行展示。视图层则负责显示模型数据给用户,并将用户的输入信息通过Controller传递给后台处理。 SpringMVC提供了很多有用的特性,其中包括请求映射、数据绑定、表单验证、错误处理和国际化支持等。它还支持RESTful风格的Web服务,并具有很好的与其他技术的集成能力,如Hibernate、MyBatis和Thymeleaf等。 使用SpringMVC可以使开发人员更加专注于业务逻辑的实现,而无需过多关注底层的技术细节。它提供了一套清晰的开发模式和规范,有助于提高开发效率和代码的可维护性。 总之,SpringMVC是一个功能强大的Web开发框架,能够简化开发过程,提高效率,并且以其灵活性和可扩展性受到广大开发者的青睐。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值