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

这篇具有很好参考价值的文章主要介绍了关于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";
}

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

关于SpringMVC的异常处理,这些细节你知道吗?,Java,java,开发语言

所以我们需要对出现的这种异常信息进行处理,如何处理呢?我们在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>

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

关于SpringMVC的异常处理,这些细节你知道吗?,Java,java,开发语言

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

关于SpringMVC的异常处理,这些细节你知道吗?,Java,java,开发语言

以上就是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>

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

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

关于SpringMVC的异常处理,这些细节你知道吗?,Java,java,开发语言

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>

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

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

关于SpringMVC的异常处理,这些细节你知道吗?,Java,java,开发语言

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中如何使用拦截器,敬请大家期待!文章来源地址https://www.toymoban.com/news/detail-718731.html

到了这里,关于关于SpringMVC的异常处理,这些细节你知道吗?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数字藏品是不是NFT?关于数字藏品,这些硬核知识你需要知道

    数字藏品是不是NFT?关于数字藏品,这些硬核知识你需要知道 区块链海森堡 《 BTC海外水电0.38,3天上机》 区块链海森堡 创作声明:内容包含虚构创作 数字藏品是不是NFT?关于数字藏品,这些硬核知识你需要知道 2022-05-09 18:49 最近一段时间,Web3.0不断“刷屏”,而作为Web3

    2024年02月01日
    浏览(53)
  • SpringMVC之异常处理 SpringMVC之异常处理

    异常分为编译时异常和运行时异常,编译时异常我们trycatch捕获,捕获后自行处理,而运行时异常是不可预期的,就需要规范编码来避免,在SpringMVC中,不管是编译异常还是运行时异常,都可以最终由SpringMVC提供的异常处理器进行统一管理,这样就可以避免随时随地捕获异常

    2024年02月12日
    浏览(43)
  • 【Java】关于你不知道的Java大整数运算之BigInteger类超级好用!!!

    目录 一、BigInteger类简单介绍 二、BigInteger构造方式 (1)构造方式 (2)输入方式 三、BigInteger常见的成员方法 (1)方法介绍 (2)方法使用演示 1.加减乘除余 2.比较 3.绝对值和幂 4.转换成对应进制字符串  四、BigInteger不常见的成员方法         起因是做了一道牛客oj题,

    2023年04月14日
    浏览(31)
  • Python中的安全密码处理,非常重要!知道这些黑客也奈何不了你!

    现在我们已经向用户询问了密码,或者为他们生成了密码,我们该如何处理它呢?我们可能希望将其存储在数据库中的某个地方,但您可能(希望)知道,您不应该以明文格式存储密码。那是为什么? 那么,密码不应该以可恢复的格式存储,无论是纯文本还是加密的。它们应该

    2024年04月24日
    浏览(36)
  • 关于java.lang.reflect.InaccessibleObjectException异常

    在使用javassist插件的时候,jdk版本大于8的时候没有对应的包会导致出现以下异常 java.lang.reflect.InaccessibleObjectException   点击后选择Edit Configurations...  修改如下信息即可 --add-opens java.base/java.lang=ALL-UNNAMED --add-opens java.base/sun.net.util=ALL-UNNAMED  修改后记得将构造选择为对应的内容

    2024年02月13日
    浏览(76)
  • 12. Java异常及异常处理

    1. 异常 异常 :在程序执行过程中发生的意外状况,可能导致程序中断或产生错误结果 异常对象 :java(面向对象)将错误用类来描述,一旦程序执行错误,将会创建对应的错误对象(用以向程序员或用户展示错误原因等) 异常处理的意义 :提高代码的健壮性和可靠性,使程

    2024年02月07日
    浏览(40)
  • java异常处理机制(二)之异常处理与捕获

    1 Error(错误): 是指程序无法处理的错误,表示运行应用程序时比较严重的问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时JVM(Java 虚拟机)出现的问题。 2 异常(Exception): 是指在程序执行时由于程序处理逻辑上的错误而导致程序中断的一种指令流。通俗的

    2024年02月05日
    浏览(108)
  • Java 异常处理以及如何捕获和处理多个异常

    在Java中,我们使用异常处理程序组件try,catch和finally块来处理异常。 为了捕获和处理异常,我们将try...catch...finally代码块放置在可能产生异常的代码周围。finally块是可选的。 try...catch...finally的语法为: 可能会生成异常的代码放在try块中。 每个try块后面应紧跟着catch 或 fi

    2024年02月14日
    浏览(44)
  • springMVC--异常处理

    Spring MVC 通过HandlerExceptionResolver 处理程序的异常,包括Handler 映射、数据绑定以及目标方法执行时发生的异常。 主要处理Handler 中用@ExceptionHandler 注解定义的方法。 ExceptionHandlerMethodResolver 内部若找不到@ExceptionHandler 注解的话, 会找@ControllerAdvice 类的@ExceptionHandler 注解方法,

    2024年02月15日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包