1.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.it</groupId>
- <artifactId>springMVC7-exception</artifactId>
- <version>1.0-SNAPSHOT</version>
- <packaging>war</packaging>
-
- <name>springMVCHello Maven Webapp</name>
- <!-- FIXME change it to the project's website -->
- <url>http://www.example.com</url>
-
- <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>
2.自定义异常类
定义三个异常类:NameException、AgeException、MyUserException。其中MyUserException是另外两个异常的父类。
MyUserException
- package com.it.exception;
-
- public class MyUserException extends Exception{
- public MyUserException() {
- super();
- }
-
- public MyUserException(String s) {
- super(s);
- }
- }
NameException
- package com.it.exception;
-
- //自定义,表示当用户的姓名有异常,抛出NameException
- public class NameException extends MyUserException{
- public NameException() {
- super();
- }
-
- public NameException(String s) {
- super(s);
- }
- }
AgeException
- package com.it.exception;
-
- //当年龄有问题时,抛出异常AgeException
- public class AgeException extends MyUserException {
- public AgeException() {
- super();
- }
-
- public AgeException(String s) {
- super(s);
- }
- }
3.MyController类
- package com.it.controller;
-
- import com.it.exception.AgeException;
- import com.it.exception.MyUserException;
- import com.it.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;
-
- //当RequestMapping放在类的上面时,value:表示所有请求地址的公共部分,叫做模块名称
- @Controller
- public class MyController {
-
- @RequestMapping(value = "/some.do")
- public ModelAndView dosome(String name,Integer age) throws MyUserException {
- //处理some.do请求了,相当于service调用处理完成了
- ModelAndView mv=new ModelAndView();
- //根据请求参数抛出异常
- if (!"张山".equals(name)){
- throw new NameException("姓名不正确");
- }
- if (age==null || age>80){
- throw new AgeException("年龄比较大了");
- }
-
- mv.addObject("myname",name);
- mv.addObject("myage",age);
- mv.setViewName("show");
- return mv;
- }
-
- }
4.定义三个异常响应页面
nameError.js
-
- <%@ 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>
ageError.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>
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>
5.定义主页面和不抛出异常时的界面
index.jsp
-
- <%@ page contentType="text/html;charset=UTF-8" language="java" %>
- <html>
- <head>
- <title>Title</title>
- </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>
- <br>
- </body>
- </html>
show.jsp
-
- <%@ page contentType="text/html;charset=UTF-8" language="java" %>
- <html>
- <head>
- <title>Title</title>
- </head>
- <body>
- <p>show.jsp</p>
- <p>/WEB-INF/view/show.jsp从request作用域获取数据</p>
- <p>myname数据:${myname}</p>
- <p>myage数据:${myage}</p>
-
- </body>
- </html>

6.定义全局异常处理类
GlobalExceptionHandler类
- package com.it.handler;
-
- import com.it.exception.AgeException;
- import com.it.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
- public class GlobalExceptionHandler {
- /**
- *定义方法,处理发生的异常
- *
- * 处理异常的方法和控制器方法的定义一样,可以有多个参数,可以有多种对象类型的返回值
- *
- * 形参:Exception,表示Controller中抛出的异常对象。通过形参可以获取发生的异常信息
- *
- * @ExceptionHandler(异常的class):表示异常的类型,当发生此类型异常时,由当前方法来处理,
- */
- @ExceptionHandler(value = NameException.class)
- public ModelAndView doNameException(Exception ex){
- //处理NameException的异常
- /*
- 异常发生处理逻辑:
- 1.需要把异常记录下来,记录到数据库,日志文件。记录日志发生的是时间,那个方法发生的,异常错误类型
- 2.发送通知,把异常的信息通过邮件,短信,微信发送给相关人员。
- 3.给用户友好提示
- */
- ModelAndView mv=new ModelAndView();
- mv.addObject("msg","姓名必须为张山,其他用户不能访问!");
- mv.addObject("ex",ex);
- mv.setViewName("nameError");
- return mv;
- }
-
- //处理AgeException
- @ExceptionHandler(value = AgeException.class)
- public ModelAndView doAgeException(Exception ex){
- ModelAndView mv=new ModelAndView();
- mv.addObject("msg","姓名必须为张山,其他用户不能访问!");
- mv.addObject("ex",ex);
- mv.setViewName("ageError");
- return mv;
- }
-
- //处理其他异常,NameException,AgeException以外,不知类型的异常
- @ExceptionHandler
- public ModelAndView doOtherException(Exception ex){
- ModelAndView mv=new ModelAndView();
- mv.addObject("msg","你的年龄不能大于80");
- mv.addObject("ex",ex);
- mv.setViewName("defaultError");
- return mv;
- }
- }
7.定义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/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">
-
- <!-- 声明组件扫描器-->
- <context:component-scan base-package="com.it.controller"/>
-
-
- <!--声明springmvc框架中的视图解析器,帮助开发人员设置视图文件的路径-->
- <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
- <!-- 前缀:视图文件的路径-->
- <property name="prefix" value="/WEB-INF/view/"/>
- <!-- 后缀:视图文件的扩展名-->
- <property name="suffix" value=".jsp"/>
- </bean>
-
- <!-- 声明的组件扫描器需要指定@ControllerAdvice所在的包名 -->
- <context:component-scan base-package="com.it.handler"/>
- <!-- 注解驱动-->
- <mvc:annotation-driven/>
-
- </beans>
8.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>springmvc</servlet-name>
- <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
- <init-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>classpath:springmvc.xml</param-value>
- </init-param>
- <load-on-startup>1</load-on-startup>
- </servlet>
- <servlet-mapping>
- <servlet-name>springmvc</servlet-name>
- <url-pattern>*.do</url-pattern>
- </servlet-mapping>
-
- <filter>
- <filter-name>characterEncodingFilter</filter-name>
- <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
- <init-param>
- <param-name>encoding</param-name>
- <param-value>utf-8</param-value>
- </init-param>
- <init-param>
- <param-name>forceRequestEncoding</param-name>
- <param-value>true</param-value>
- </init-param>
- <init-param>
- <param-name>forceResponseEncoding</param-name>
- <param-value>true</param-value>
- </init-param>
- </filter>
- <filter-mapping>
- <filter-name>characterEncodingFilter</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
-
-
-
- </web-app>
项目结果
当姓名和年龄都正确时

当姓名不正确时

当年龄不正确时

当发生其他类型异常时
