1.常用的SpringMVC框架处理方法:561.1异常处理:56
Springmvc框架采用统一、全局异常处理。
将controller中的所有异常处理集中在一个地方。采用aop的思想。将业务逻辑与异常处理代码分开。解耦合。
1.2使用两个注释561.@ExceptionHandler
2.@ControllerAdvice
2.@Exceptiondler使用注释@ExceptionHandler可以将一种方法指定为异常处理方法。只有一个注释
选择属性value作为Class数组,用于指定注释方法的异常类别,即匹配
配的异常。
ModelAndViewwew可以是注释方法的返回值、String,或者void,方法名随意,方法
参数可以是Exception及其子类对象HttpServletRequest、Httpservletresponse等。系统会自动赋值这些方法的参数。
Controller还可以直接注解异常处理注解的用法。
3.577自定义异常类别3.1异常处理步骤:1.新建mavenweb项目index.jsp
<%--异常处理 57--%><%@ page contentType="text/html;charset=UTF-8" language="java" %><% String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + request.getContextPath() + "/";%><html><head> <title>Title</title> <base href="<%=basePath%>" /></head><body><p>处理异常,全局异常处理</p><form action="some.do" method="post"> 姓名:<input type="text" name="name"> <br/> 年龄:<input type="text" name="age"> <br/> <input type="submit" value=“提交请求”></form></body></html>
2.加入依赖pom.xml
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.bjpowernode</groupId> <artifactId>course10</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <!--依赖servlet--> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <!--依赖springmvc--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.2.5.RELEASE</version> </dependency> </dependencies> <build> <plugins> <!-- 编码编译和JDK版本 --> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> </build></project>
web.xml
<?xml version="1.0" encoding="UTF-8"?><web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <servlet> <servlet-name>myweb</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!--自定义springmvc读取的配置文件的位置 4--> <init-param> <!--springmvc配置文件的位置属性--> <param-name>contextConfigLocation</param-name> <!--指定自定义文件的位置--> <param-value>classpath:springmvc.xml</param-value> </init-param> <!--tomcat启动后,创建Servlet对象 load-on-startup:表示tomcat启动后创建对象的顺序。--tomcat启动后,创建Servlet对象 load-on-startup:表示tomcat启动后创建对象的顺序。它的值是整数,值越小, tomcat创建对象的时间越早。 大于等于0的整数。 --> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>myweb</servlet-name> <!-- 使用框架时, url-pattern可以使用两个值 5 1. 使用扩展名的方法, 语法 *.xxxx , xxxxx是自定义的扩展名 常用的方式 *.do, *.action, *.mvc等等 http://localhost:8080/myweb/some.do http://localhost:8080/myweb/other.do 不能使用 *.jsp 2.使用斜杠 "/" --> <url-pattern>*.do</url-pattern> </servlet-mapping></web-app>
3.新建57个自定义异常类别
父类Myuserexception,然后定义其子类Nameeexception,AgeException
父类异常Myuserexception
package com.bjpowernode.controller.exception;//演示异常处理 57public class MyUserException extends Exception { public MyUserException() { super(); } public MyUserException(String message) { super(message); }}
Nameexcepintion
package com.bjpowernode.controller.exception;//演示异常处理 57//表示当用户名称异常时,Nameexceptionpublic class NameException extends MyUserException { public NameException() { super(); } public NameException(String message) { super(message); }}
子类异常Ageexception
package com.bjpowernode.controller.exception;//演示异常处理 57//当年龄有问题时,抛出的异常public class AgeException extends MyUserException { public AgeException() { super(); } public AgeException(String message) { super(message); }}
4.在controller中抛出Nameeexception,AgeExceptionMyontroller
package com.bjpowernode.controller;import com.bjpowernode.controller.exception.AgeException;import com.bjpowernode.controller.exception.MyUserException;import com.bjpowernode.controller.exception.NameException;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;/** * 异常处理 57 * @RequestMapping: * value : 所有请求地址的公共部分,称为模块名 * 位置: 把它放在类别上 */@Controllerpublic class MyController { @RequestMapping(value = "/some.do") public ModelAndView doSome(String name,Integer age) throws MyUserException { ///处理some.do请求了。 相当于service调用处理的完成。 相当于service调用处理的完成。 ModelAndView mv = new ModelAndView(); //try { ///根据请求参数抛出异常 57 if (!"zs".equals(name)) { throw new NameException("名字不正确!!!"); } if (age == null || age > 80) { throw new AgeException(年龄较大!!!"); } //}catch(Exception e){ // e.printStackTrace(); //} mv.addObject("myname",name); mv.addObject("myage",age); mv.setViewName("show"); return mv; }}
5.创建一个全局异常处理的普通类别571)加入类别@ControllerAdvice
增强控制器(即增加控制器-异常处理功能)
位置:以上类别。
特点:框架必须知道注释所在的包名,并且需要在springmvc中配置文件来声明组件扫描仪。
指定@ControllerAdvice所在的包名
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;@ControllerAdvicepublic class GlobalExceptionHandler {}
2)在类中定义方法,并添加@ExceptionHandler57定义方法,处理异常57
处理异常的方法和控制器方法的定义一样,可以有多个参数,可以有ModelAndView,String,void,对象类型的返回值
形参:Exception,表示Controller中抛出的异常对象。异常信息可以通过形参获得。
@ExceptionHandler(异常class):表示异常类型,当发生此类异常时,由当前方法处理
处理异常的逻辑:581.需要在数据库和日志文件中记录异常。记录日志发生的时间、方法和异常错误的内容。
2.发送通知,通过电子邮件、短信、微信向相关人员发送异常信息。
3.给用户友好的提示。
GlobalExceptionHandler
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;/** * 异常处理 57 * @ControllerAdvice : 增强控制器(即增加控制器-异常处理功能) * 位置:以上类别。 * 特点:框架必须知道注释所在的包名,并且需要在springmvc中配置文件来声明组件扫描仪。 * 指定@ControllerAdvice所在的包名 */@ControllerAdvicepublic class GlobalExceptionHandler { ///定义方法,处理异常 57 /* 处理异常的方法与控制器方法的定义相同, 可以有多个参数,可以有ModelAndView, String, void,对象类型的返回值 形参:Exception,表示Controller中抛出的异常对象。 异常信息可以通过形参获得。 */ //@ExceptionHandler(异常class):当这种类型出现异常时,表示异常类型,由现行方法处理 @ExceptionHandler(value = NameException.class) public ModelAndView doNameException(Exception exception){ ///处理Nameexception异常。 /* 处理异常的逻辑: 58 1.需要记录异常, 日志文件记录在数据库中。 /* 处理异常的逻辑: 58 1.需要记录异常, 日志文件记录在数据库中。 记录日志发生的时间,哪种方法发生,内容异常错误。 2.发送通知,通过电子邮件、短信、微信向相关人员发送异常信息。 3.给用户友好的提示。 */ ModelAndView mv = new ModelAndView(); mv.addObject("msg“姓名必须是zs,其他用户无法访问”); mv.addObject("ex",exception); mv.setViewName("nameError"); return mv; } //处理Ageeexception 58 @ExceptionHandler(value = AgeException.class) public ModelAndView doAgeException(Exception exception){ //处理Ageeexception的异常。 /* 处理异常的逻辑: 1.需要记录异常, 日志文件记录在数据库中。 /* 处理异常的逻辑: 1.需要记录异常, 日志文件记录在数据库中。 记录日志发生的时间,哪种方法发生,内容异常错误。 2.发送通知,通过电子邮件、短信、微信向相关人员发送异常信息。 3.给用户友好的提示。 */ ModelAndView mv = new ModelAndView(); mv.addObject("msg","你的年龄不能超过80岁"; mv.addObject("ex",exception); mv.setViewName("ageError"); return mv; } //处理其他异常, NameException, 除Ageeexception外,不知类型异常 58 @ExceptionHandler public ModelAndView doOtherException(Exception exception){ //处理其他异常 ModelAndView mv = new ModelAndView(); mv.addObject("msg",“其他异常”); mv.addObject("ex",exception); mv.setViewName("defaultError"); return mv; }}
6.创建处理异常的视图页面58nameError.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head> <title>Title 58</title></head><body> nameError.jsp <br/> 提示用户信息:${msg} <br/> 系统异常消息:${ex.message}</body></html>
ageError.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> Title ageError.jsp 提示用户信息:${msg} 系统异常消息:${ex.message}
defaultError.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head> <title>Title</title></head><body> ageError.jsp <br/> 提示用户信息:${msg} <br/> 系统异常消息:${ex.message}</body></html>
7.创建springmvc配置文件58
1)组件扫描仪扫描@Controller注释
2)组件扫描器,扫描@ControllerAdvice所在的包名
3)声明注释驱动程序
<?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/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!--声明组件扫描仪 8--> <context:component-scan base-package="com.bjpowernode.controller" /> <!--声明 视图解析器在springmvc框架中, 帮助开发人员设置视图文件的路径 40--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!--前缀:视图文件的路径--> <property name="prefix" value="/WEB-INF/view/" /> <!--后缀:视图文件扩展名称--> <property name="suffix" value=".jsp" /> </bean> <!--异常处理 处理所需的两个步骤 58--> <context:component-scan base-package="com.bjpowernode.handler" /> <mvc:annotation-driven /> </beans>
8.测试59正常的数
name异常
age异常
其他异常