• springmvc第十四个练习(异常处理)


    4.2 异常处理
    SpringMVC 框架处理异常的常用方式:使用 @ExceptionHandler 注解处理异常。
    4.2.1 @ExceptionHandler 注解
            使用注解 @ExceptionHandler 可以将一个方法指定为异常处理方法。该注解只有一个可 选属性 value ,为一个 Class<?> 数组,用于指定该注解的方法所要处理的异常类,即所要匹 配的异常。
           而被注解的方法,其返回值可以是 ModelAndView 、 String ,或 void ,方法名随意,方法 参数可以是 Exception 及其子类对象、 HttpServletRequest 、 HttpServletResponse 等。系统会 自动为这些方法参数赋值。
           对于异常处理注解的用法,也可以直接将异常处理方法注解于 Controller 之中。
    项目结构

     

    1.pom.xml文件

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    4. <modelVersion>4.0.0</modelVersion>
    5. <groupId>com.it</groupId>
    6. <artifactId>springMVC7-exception</artifactId>
    7. <version>1.0-SNAPSHOT</version>
    8. <packaging>war</packaging>
    9. <name>springMVCHello Maven Webapp</name>
    10. <!-- FIXME change it to the project's website -->
    11. <url>http://www.example.com</url>
    12. <properties>
    13. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    14. <maven.compiler.source>1.8</maven.compiler.source>
    15. <maven.compiler.target>1.8</maven.compiler.target>
    16. </properties>
    17. <dependencies>
    18. <dependency>
    19. <groupId>junit</groupId>
    20. <artifactId>junit</artifactId>
    21. <version>4.11</version>
    22. <scope>test</scope>
    23. </dependency>
    24. <!--servlet依赖-->
    25. <dependency>
    26. <groupId>javax.servlet</groupId>
    27. <artifactId>javax.servlet-api</artifactId>
    28. <version>3.1.0</version>
    29. <scope>provided</scope>
    30. </dependency>
    31. <!--springMVC依赖-->
    32. <dependency>
    33. <groupId>org.springframework</groupId>
    34. <artifactId>spring-webmvc</artifactId>
    35. <version>5.2.5.RELEASE</version>
    36. </dependency>
    37. </dependencies>
    38. <build>
    39. <plugins>
    40. <!-- 编码和编译和JDK版本 -->
    41. <plugin>
    42. <artifactId>maven-compiler-plugin</artifactId>
    43. <version>3.1</version>
    44. <configuration>
    45. <source>1.8</source>
    46. <target>1.8</target>
    47. </configuration>
    48. </plugin>
    49. </plugins>
    50. </build>
    51. </project>

    2.自定义异常类

           定义三个异常类:NameException、AgeException、MyUserException。其中MyUserException是另外两个异常的父类。

    MyUserException

    1. package com.it.exception;
    2. public class MyUserException extends Exception{
    3. public MyUserException() {
    4. super();
    5. }
    6. public MyUserException(String s) {
    7. super(s);
    8. }
    9. }

    NameException

    1. package com.it.exception;
    2. //自定义,表示当用户的姓名有异常,抛出NameException
    3. public class NameException extends MyUserException{
    4. public NameException() {
    5. super();
    6. }
    7. public NameException(String s) {
    8. super(s);
    9. }
    10. }

    AgeException

    1. package com.it.exception;
    2. //当年龄有问题时,抛出异常AgeException
    3. public class AgeException extends MyUserException {
    4. public AgeException() {
    5. super();
    6. }
    7. public AgeException(String s) {
    8. super(s);
    9. }
    10. }

    3.MyController类

    1. package com.it.controller;
    2. import com.it.exception.AgeException;
    3. import com.it.exception.MyUserException;
    4. import com.it.exception.NameException;
    5. import org.springframework.stereotype.Controller;
    6. import org.springframework.web.bind.annotation.RequestMapping;
    7. import org.springframework.web.bind.annotation.RequestMethod;
    8. import org.springframework.web.servlet.ModelAndView;
    9. //当RequestMapping放在类的上面时,value:表示所有请求地址的公共部分,叫做模块名称
    10. @Controller
    11. public class MyController {
    12. @RequestMapping(value = "/some.do")
    13. public ModelAndView dosome(String name,Integer age) throws MyUserException {
    14. //处理some.do请求了,相当于service调用处理完成了
    15. ModelAndView mv=new ModelAndView();
    16. //根据请求参数抛出异常
    17. if (!"张山".equals(name)){
    18. throw new NameException("姓名不正确");
    19. }
    20. if (age==null || age>80){
    21. throw new AgeException("年龄比较大了");
    22. }
    23. mv.addObject("myname",name);
    24. mv.addObject("myage",age);
    25. mv.setViewName("show");
    26. return mv;
    27. }
    28. }

    4.定义三个异常响应页面

    nameError.js
    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2. <html>
    3. <head>
    4. <title>Title</title>
    5. </head>
    6. <body>
    7. nameError.jsp<br>
    8. 提示信息:${msg}<br>
    9. 系统异常消息:${ex.message}
    10. </body>
    11. </html>
    ageError.jsp
    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2. <html>
    3. <head>
    4. <title>Title</title>
    5. </head>
    6. <body>
    7. ageError.jsp<br>
    8. 提示信息:${msg}<br>
    9. 系统异常消息:${ex.message}
    10. </body>
    11. </html>
    defaultError.jsp
    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2. <html>
    3. <head>
    4. <title>Title</title>
    5. </head>
    6. <body>
    7. defaultError.jsp<br>
    8. 提示信息:${msg}<br>
    9. 系统异常消息:${ex.message}
    10. </body>
    11. </html>

    5.定义主页面和不抛出异常时的界面

    index.jsp

    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2. <html>
    3. <head>
    4. <title>Title</title>
    5. </head>
    6. <body>
    7. <p>处理异常,全局异常处理</p>
    8. <form action="some.do" method="post">
    9. 姓名:<input type="text" name="name"><br>
    10. 年龄:<input type="text" name="age"><br>
    11. <input type="submit" value="提交请求">
    12. </form>
    13. <br>
    14. </body>
    15. </html>

     show.jsp

    1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    2. <html>
    3. <head>
    4. <title>Title</title>
    5. </head>
    6. <body>
    7. <p>show.jsp</p>
    8. <p>/WEB-INF/view/show.jsp从request作用域获取数据</p>
    9. <p>myname数据:${myname}</p>
    10. <p>myage数据:${myage}</p>
    11. </body>
    12. </html>

    6.定义全局异常处理类

           将异常处理方法专门定义在一个类中,作为全局的异常处理类。
           需要使用注解 @ControllerAdvice ,字面理解就是“控制器增强”,是给控制器对象增强 功能的。使用 @ControllerAdvice 修饰的类中可以使用 @ExceptionHandler 。
           当使用 @RequestMapping 注解修饰的方法抛出异常时,会执行 @ControllerAdvice 修饰的 类中的异常处理方法。
           @ControllerAdvice 是使用 @Component 注解修饰的,可以 <context:component-scan> 扫描到 @ControllerAdvice 所在的类路径 ( 包名 ) ,创建对象。
    GlobalExceptionHandler类
    1. package com.it.handler;
    2. import com.it.exception.AgeException;
    3. import com.it.exception.NameException;
    4. import org.springframework.web.bind.annotation.ControllerAdvice;
    5. import org.springframework.web.bind.annotation.ExceptionHandler;
    6. import org.springframework.web.servlet.ModelAndView;
    7. /**
    8. * @ControllerAdvice:控制器增强(也就是说给控制器类增加功能---异常处理功能)
    9. * 位置:在类的上面。
    10. * 特点:必须让框架知道这个注解所在的包名,需要在springmvc配置文件声明组件扫描器。
    11. */
    12. @ControllerAdvice
    13. public class GlobalExceptionHandler {
    14. /**
    15. *定义方法,处理发生的异常
    16. *
    17. * 处理异常的方法和控制器方法的定义一样,可以有多个参数,可以有多种对象类型的返回值
    18. *
    19. * 形参:Exception,表示Controller中抛出的异常对象。通过形参可以获取发生的异常信息
    20. *
    21. * @ExceptionHandler(异常的class):表示异常的类型,当发生此类型异常时,由当前方法来处理,
    22. */
    23. @ExceptionHandler(value = NameException.class)
    24. public ModelAndView doNameException(Exception ex){
    25. //处理NameException的异常
    26. /*
    27. 异常发生处理逻辑:
    28. 1.需要把异常记录下来,记录到数据库,日志文件。记录日志发生的是时间,那个方法发生的,异常错误类型
    29. 2.发送通知,把异常的信息通过邮件,短信,微信发送给相关人员。
    30. 3.给用户友好提示
    31. */
    32. ModelAndView mv=new ModelAndView();
    33. mv.addObject("msg","姓名必须为张山,其他用户不能访问!");
    34. mv.addObject("ex",ex);
    35. mv.setViewName("nameError");
    36. return mv;
    37. }
    38. //处理AgeException
    39. @ExceptionHandler(value = AgeException.class)
    40. public ModelAndView doAgeException(Exception ex){
    41. ModelAndView mv=new ModelAndView();
    42. mv.addObject("msg","姓名必须为张山,其他用户不能访问!");
    43. mv.addObject("ex",ex);
    44. mv.setViewName("ageError");
    45. return mv;
    46. }
    47. //处理其他异常,NameException,AgeException以外,不知类型的异常
    48. @ExceptionHandler
    49. public ModelAndView doOtherException(Exception ex){
    50. ModelAndView mv=new ModelAndView();
    51. mv.addObject("msg","你的年龄不能大于80");
    52. mv.addObject("ex",ex);
    53. mv.setViewName("defaultError");
    54. return mv;
    55. }
    56. }

    7.定义springmvc.xml配置文件

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xmlns:context="http://www.springframework.org/schema/context"
    5. xmlns:mvc="http://www.springframework.org/schema/mvc"
    6. 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">
    7. <!-- 声明组件扫描器-->
    8. <context:component-scan base-package="com.it.controller"/>
    9. <!--声明springmvc框架中的视图解析器,帮助开发人员设置视图文件的路径-->
    10. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    11. <!-- 前缀:视图文件的路径-->
    12. <property name="prefix" value="/WEB-INF/view/"/>
    13. <!-- 后缀:视图文件的扩展名-->
    14. <property name="suffix" value=".jsp"/>
    15. </bean>
    16. <!-- 声明的组件扫描器需要指定@ControllerAdvice所在的包名 -->
    17. <context:component-scan base-package="com.it.handler"/>
    18. <!-- 注解驱动-->
    19. <mvc:annotation-driven/>
    20. </beans>

    8.web.xml配置文件

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
    5. version="4.0">
    6. <servlet>
    7. <servlet-name>springmvc</servlet-name>
    8. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    9. <init-param>
    10. <param-name>contextConfigLocation</param-name>
    11. <param-value>classpath:springmvc.xml</param-value>
    12. </init-param>
    13. <load-on-startup>1</load-on-startup>
    14. </servlet>
    15. <servlet-mapping>
    16. <servlet-name>springmvc</servlet-name>
    17. <url-pattern>*.do</url-pattern>
    18. </servlet-mapping>
    19. <filter>
    20. <filter-name>characterEncodingFilter</filter-name>
    21. <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    22. <init-param>
    23. <param-name>encoding</param-name>
    24. <param-value>utf-8</param-value>
    25. </init-param>
    26. <init-param>
    27. <param-name>forceRequestEncoding</param-name>
    28. <param-value>true</param-value>
    29. </init-param>
    30. <init-param>
    31. <param-name>forceResponseEncoding</param-name>
    32. <param-value>true</param-value>
    33. </init-param>
    34. </filter>
    35. <filter-mapping>
    36. <filter-name>characterEncodingFilter</filter-name>
    37. <url-pattern>/*</url-pattern>
    38. </filter-mapping>
    39. </web-app>

    项目结果

    当姓名和年龄都正确时

     

    当姓名不正确时

     

    当年龄不正确时

     

    当发生其他类型异常时

     

  • 相关阅读:
    Java元注解 @Inherited 解析
    Git基本应用<二>:Git的分支管理
    拉格朗日中值定理习题
    JAVA计算机毕业设计德云社剧场网上售票系统Mybatis+系统+数据库+调试部署
    深入Linux下的GCC编译器:从入门到精通
    (高阶)Redis 7 第10讲 单线程 与 多线程 入门篇
    风格迁移:一文梳理经典方法发展脉络及原理:Gram矩阵、WCT、WCT2
    进入软件行业的几点建议
    redis手动搭建cluster(集群)
    Jmeter性能实战之分布式压测
  • 原文地址:https://blog.csdn.net/weixin_59334478/article/details/125423131