defaultError.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> defaultError.jsp <br/> 提示信息:${msg} <br/> 系统异常消息:${ex.message} </body> </html>nameError.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> nameError.jsp <br/> 提示信息:${msg} <br/> 系统异常消息:${ex.message} </body> </html> (4) 定义全局异常处理类不过,一般不这样使用。而是将异常处理方法专门定义在一个类中,作为全局的异常处理类。需要使用注解@ControllerAdvice,字面理解就是“控制器增强”,是给控制器对象增强功能的。使用@ControllerAdvice 修饰的类中可以使用@ExceptionHandler。当使用@RequestMapping 注解修饰的方法抛出异常时,会执行@ControllerAdvice 修饰的类中的异常处理方法。@ControllerAdvice 是使用@Component 注解修饰的,可以context:component-scan扫描到@ControllerAdvice 所在的类路径(包名),创建对象。
GlobalExceptionHandler.java
package com.bjpowernode.handler; import com.bjpowernode.exception.AgeException; import com.bjpowernode.exception.NameException; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.servlet.ModelAndView; /** * @ControllerAdvice : 控制器增强(也就是说给控制器类增加功能--异常处理功能) * 位置:在类的上面。 * 特点:必须让框架知道这个注解所在的包名,需要在springmvc配置文件声明组件扫描器。 * 指定@ControllerAdvice所在的包名 */ @ControllerAdvice public class GlobalExceptionHandler { //定义方法,处理发生的异常 /* 处理异常的方法和控制器方法的定义一样, 可以有多个参数,可以有ModelAndView, String, void,对象类型的返回值 形参:Exception,表示Controller中抛出的异常对象。 通过形参可以获取发生的异常信息。 @ExceptionHandler(异常的class):表示异常的类型,当发生此类型异常时, 由当前方法处理 */ @ExceptionHandler(value = NameException.class) public ModelAndView doNameException(Exception exception){ //处理NameException的异常。 /* 异常发生处理逻辑: 1.需要把异常记录下来, 记录到数据库,日志文件。 记录日志发生的时间,哪个方法发生的,异常错误内容。 2.发送通知,把异常的信息通过邮件,短信,微信发送给相关人员。 3.给用户友好的提示。 */ ModelAndView mv = new ModelAndView(); mv.addObject("msg","姓名必须是zs,其它用户不能访问"); mv.addObject("ex",exception); mv.setViewName("nameError"); return mv; } //处理AgeException @ExceptionHandler(value = AgeException.class) public ModelAndView doAgeException(Exception exception){ //处理AgeException的异常。 /* 异常发生处理逻辑: 1.需要把异常记录下来, 记录到数据库,日志文件。 记录日志发生的时间,哪个方法发生的,异常错误内容。 2.发送通知,把异常的信息通过邮件,短信,微信发送给相关人员。 3.给用户友好的提示。 */ ModelAndView mv = new ModelAndView(); mv.addObject("msg","你的年龄不能大于80"); mv.addObject("ex",exception); mv.setViewName("ageError"); return mv; } //处理其它异常, NameException, AgeException以外,不知类型的异常 @ExceptionHandler public ModelAndView doOtherException(Exception exception){ //处理其它异常 ModelAndView mv = new ModelAndView(); mv.addObject("msg","你的年龄不能大于80"); mv.addObject("ex",exception); mv.setViewName("defaultError"); return mv; } }@ControllerAdvice 是使用@Component 注解修饰的
这句话看了源码是这样的,ControllerAdvice类是用@Component 注解的,
@Component 作用:把普通pojo类实例化到spring容器中,相当于配置文件中的 <bean/>
@Component,@Service,@Controller,@Repository注解的类,并把这些类纳入进spring容器中管理。
springmvc.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd https://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!--声明组件扫描器--> <context:component-scan base-package="com.bjpowernode.controller" /> <!--声明 springmvc框架中的视图解析器, 帮助开发人员设置视图文件的路径--> <bean> <!--前缀:视图文件的路径--> <property value="/WEB-INF/view/" /> <!--后缀:视图文件的扩展名--> <property value=".jsp" /> </bean> <!--处理需要的两步--> <context:component-scan base-package="com.bjpowernode.handler" /> <mvc:annotation-driven /> </beans>