SpringMVC 视图解析器 方法返回值 异常处理器

简介: SpringMVC 视图解析器 方法返回值 异常处理器

异常处理器


什么是异常处理器


在Spring MVC中,提供了一个全局异常处理器,用于对系统中出现的异常进行统一的处理。在一般的系统中,DAO,Service及Controller层都出现的异常都以“throws Exception”的形式向上层抛出,最后都会由Spring MVC的前端控制器DispatcherServlet统一由全局异常处理器进行异常处理。


对于预期的异常,通常要定义一个自定义异常类,该类用于在发生异常后,存储异常信息,最终交给全局异常处理器处理该异常。

异常处理器执行流程


实现方式


SpringMVC提供了异常处理器多种方式

方式一:实现HandlerExceptionResolver

方式二:通知类

       使用@ControllerAdvice对Controller增强


       使用@ExceptionHandler捕获异常


       基本功能


需求  

   

访问 /demo04/item.action?id=1


id =1 系统异常


id =2 自定义异常


id =3 正常


步骤


编写自定义异常

编写Controller 接受一个参数 (系统异常 自定义异常 正常)

编写访问连接

 

实现


  1. 编写自定义异常 继承RuntimeException 重写构造
public class CustomExcption extends RuntimeException {
    public CustomExcption() {
    }
    public CustomExcption(String message) {
        super(message);
    }
    public CustomExcption(String message, Throwable cause) {
        super(message, cause);
    }
    public CustomExcption(Throwable cause) {
        super(cause);
    }
    public CustomExcption(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
        super(message, cause, enableSuppression, writableStackTrace);
    }
}

2.编写Controller 接受参数


@Controller
@RequestMapping("/demo04")
public class Demo04ItemController {
    @RequestMapping("/item")
    public String item(Integer id ) {
        if(id == 1) {
            // 系统异常
            int i = 1 / 0;
        } else if( id == 2 ) {
            // 自定义
            throw new CustomExcption("自定义异常信息");
        }
        //正常
        return "forward:/index.jsp";
    }
}

3.编写访问连接


<a href="${pageContext.request.contextPath}/demo04/item.action?id=1">异常处理 id =1 系统异常</a> <br/>
<a href="${pageContext.request.contextPath}/demo04/item.action?id=2">异常处理 id =2 自定义异常 </a> <br/>
<a href="${pageContext.request.contextPath}/demo04/item.action?id=3">异常处理正常</a> <br/>


方式一:实现接口


编写HandlerExceptionResolver接口的实现类CustomExceptionResolver

实现方法resolverException()

并根据参数Exception e对异常进行处理:自定义异常 系统异常

@Component
public class CustomExceptionResolver  implements HandlerExceptionResolver {
    @Override
    public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
        // 1 统一异常
        CustomExcption customExcption = null;
        if(e instanceof CustomExcption) {
            customExcption = (CustomExcption) e;
        } else {
            customExcption = new CustomExcption("系统繁忙,请稍后重试!");
        }
        // 2 错误信息返回
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("message" ,customExcption.getMessage());
        modelAndView.setViewName("forward:/error.jsp");
        return modelAndView;
    }
}


方式二:通知类


编写GlobalExceptionResolver类 用于处理所有异常

在类上添加@Controller的增强器@ControllerAdvice

在对应的方法上添加@ExceptionHandler来捕获异常

@ControllerAdvice
public class GlobalExceptionResolver {
    /**
     * 自定义异常处理器
     * @param ec
     * @param model
     * @return
     */
    @ExceptionHandler(CustomExcption.class)
    public String custom(CustomExcption ec, Model model) {
        model.addAttribute("message", ec.getMessage() + "Global");
        return "forward:/error.jsp";
    }
    /**
     * 其他异常处理器
     * @param e
     * @param model
     * @return
     */
    @ExceptionHandler(Exception.class)
    public String other(Exception e, Model model) {
        model.addAttribute("message", "系统繁忙,请稍后重试!" + "Global");
        return "forward:/error.jsp";
    }
}

异常信息展示页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>友好页面</title>
</head>
<body>
    ${message}
</body>
</html>


总结


视图解析器:


       可以帮助我们快速修改视图路径 不用一个一个Controller去修改


方法返回值:


       方法返回值默认是ModelAndView Model默认是request作用域 绕过视图解析器 使用请求转发          或者重定向


异常处理器:


       更加友好的提示异常




image.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.pngimage.png

相关文章
|
13天前
|
人工智能
歌词结构的巧妙安排:写歌词的方法与技巧解析,妙笔生词AI智能写歌词软件
歌词创作是一门艺术,关键在于巧妙的结构安排。开头需迅速吸引听众,主体部分要坚实且富有逻辑,结尾则应留下深刻印象。《妙笔生词智能写歌词软件》提供多种 AI 功能,帮助创作者找到灵感,优化歌词结构,写出打动人心的作品。
|
19天前
|
存储 算法 Java
解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用
在Java中,Set接口以其独特的“无重复”特性脱颖而出。本文通过解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用。
38 3
|
14天前
|
人工智能
写歌词的技巧和方法全解析:开启你的音乐创作之旅,妙笔生词智能写歌词软件
怀揣音乐梦想,渴望用歌词抒发情感?掌握关键技巧,你也能踏上创作之旅。灵感来自生活点滴,主题明确,语言简洁,韵律和谐。借助“妙笔生词智能写歌词软件”,AI辅助创作,轻松写出动人歌词,实现音乐梦想。
|
4天前
|
数据库连接 PHP 开发者
PHP中的异常处理深度解析####
【10月更文挑战第29天】 本文深入探讨了PHP中的异常处理机制,通过实例演示如何有效地捕获和处理运行时错误,提升代码的健壮性和可维护性。我们将从基础概念出发,逐步深入到自定义异常类的应用,以及如何在复杂项目中实施最佳实践。 --- ###
19 4
|
5天前
|
机器学习/深度学习 人工智能 安全
TPAMI:安全强化学习方法、理论与应用综述,慕工大、同济、伯克利等深度解析
【10月更文挑战第27天】强化学习(RL)在实际应用中展现出巨大潜力,但其安全性问题日益凸显。为此,安全强化学习(SRL)应运而生。近日,来自慕尼黑工业大学、同济大学和加州大学伯克利分校的研究人员在《IEEE模式分析与机器智能汇刊》上发表了一篇综述论文,系统介绍了SRL的方法、理论和应用。SRL主要面临安全性定义模糊、探索与利用平衡以及鲁棒性与可靠性等挑战。研究人员提出了基于约束、基于风险和基于监督学习等多种方法来应对这些挑战。
15 2
|
10天前
|
前端开发 Java Spring
Spring MVC源码分析之DispatcherServlet#getHandlerAdapter方法
`DispatcherServlet`的 `getHandlerAdapter`方法是Spring MVC处理请求的核心部分之一。它通过遍历预定义的 `HandlerAdapter`列表,找到适用于当前处理器的适配器,并调用适配器执行具体的处理逻辑。理解这个方法有助于深入了解Spring MVC的工作机制和扩展点。
13 1
|
11天前
|
前端开发 Java Spring
Spring MVC源码分析之DispatcherServlet#getHandlerAdapter方法
`DispatcherServlet`的 `getHandlerAdapter`方法是Spring MVC处理请求的核心部分之一。它通过遍历预定义的 `HandlerAdapter`列表,找到适用于当前处理器的适配器,并调用适配器执行具体的处理逻辑。理解这个方法有助于深入了解Spring MVC的工作机制和扩展点。
19 1
|
13天前
|
Java 开发者 UED
Java编程中的异常处理机制解析
在Java的世界里,异常处理是确保程序稳定性和可靠性的关键。本文将深入探讨Java的异常处理机制,包括异常的类型、如何捕获和处理异常以及自定义异常的创建和使用。通过理解这些概念,开发者可以编写更加健壮和易于维护的代码。
|
13天前
|
安全 Java
Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧
【10月更文挑战第20天】Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧,包括避免在循环外调用wait()、优先使用notifyAll()、确保线程安全及处理InterruptedException等,帮助读者更好地掌握这些方法的应用。
12 1
|
15天前
|
PHP 开发者 UED
PHP中的异常处理深度解析####
本文深入探讨了PHP中的异常处理机制,旨在帮助开发者更好地理解和运用try-catch结构来提升代码的健壮性和可维护性。通过实例讲解与最佳实践分享,读者将学会如何有效地捕捉、处理并记录异常,从而避免程序因未预见的错误而崩溃,确保应用的稳定性和用户体验。 ####

推荐镜像

更多