分享知识-快乐自己:Spring中的(三种)异常处理机制
案例目录结构:
Web.xml 配置:
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app> <display-name>Archetype Created Web Application</display-name> <!--设置乱码--> <filter> <filter-name>encodingFilter</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>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!--设置核心控制器--> <servlet> <servlet-name>mvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:Spring-*.xml</param-value> </init-param> <!--优先加载--> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>mvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
第一种:使用Spring自带的异常处理机制:
ControllerWelcome:控制层:
package controller; import exception.NameException; import exception.PwdException; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; /** * @author asus */ @Controller @RequestMapping("/user") public class ControllerWelcome{ @RequestMapping("/name") public String nameException() { System.out.println("用户名异常!!!"); if (true) { throw new NameException("用户名异常"); } return "Welcome"; } @RequestMapping("/pwd") public String pwdException() { System.out.println("密码异常!!!"); if (true) { throw new PwdException("密码异常"); } return "Welcome"; } @RequestMapping("/other") public String otherException() { System.out.println(5 / 0); return "Welcome"; } }
定义的异常类:NameException (OtherException、PwdException;结构都一样 都继承 RuntimeException 实现三个方法)这里列举一个
package exception; /** * 密码异常 * @author asus */ public class PwdException extends RuntimeException{ public PwdException() { super(); } public PwdException(String message) { super(message); } public PwdException(String message, Throwable cause) { super(message, cause); } }
定义的 exception下的 jsp 页面同样这里列举一个:(其他两个只是换了一下 h1的内容做了一下区分而已)
NameException.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %> <html> <head> <title>Title</title> </head> <body> <h1>用户名异常</h1> </body> </html>
Spring-Mvc.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:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" 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 http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!--指定Controller扫描器--> <context:component-scan base-package="controller"/> <!--配置试图解析器--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/"></property> <property name="suffix" value=".jsp"></property> </bean> </beans>
Spring-excption.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:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" 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 http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!--系统自带异常机制映射配置--> <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <property name="exceptionMappings"> <props> <prop key="exception.NameException">exception/NameException</prop> <prop key="exception.PwdException">exception/PwdException</prop> </props> </property> <!--默认异常页面--> <property name="defaultErrorView" value="exception/OtherException"/> </bean> </beans>
提示:按住 SimpleMappingExceptionResolver 进来我们的底层查看,发现有个一常量值,就是用来获取我们编写的错误信息的(存放在了request作用域下)。如下所示
Welcome.jsp :
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--获取错误信息--%>
${exception}
</body>
</html>
例如要访问:localhost:8080/user/name:这时页面就会跳转 Welcome.jsp 并且显示 用户名异常
第二种:自定义异常处理机制:
在上述中的 exception 包下添加我们的自定义的类:MyExceptionResolve 并且继承 AbstractHandlerExceptionResolver
MyExceptionResolve :
package exception; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * 自定义异常处理机制 * @author asus */ public class MyExceptionResolve extends AbstractHandlerExceptionResolver { /** * @param request:请求 * @param response:响应 * @param handler:执行的某一Controller 控制器 * @param ex:异常信息 * @return */ @Override protected ModelAndView doResolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { //默认为其他异常页面 ModelAndView modelAndView=new ModelAndView("exception/OtherException"); //判断是什么类型的异常 if(ex instanceof NameException) { modelAndView.setViewName("exception/NameException"); }else if(ex instanceof PwdException) { modelAndView.setViewName("exception/PwdException"); } modelAndView.addObject("exception",ex); return modelAndView; } }
修改我们的配置文件:Spring-excption.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:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" 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 http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!--自定义的异常类:--> <bean class="exception.MyExceptionResolve"/> </beans>
还是按照上述的 方式运行页面即可 查看效果......
第三种:使用注解实现异常处理机制:
为了方便阅读:专门提升了一个编写注解方式的类:BaseControllerEx
package exception; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.servlet.ModelAndView; /** * 使用注解实现异常处理机制 * @author asus */ @Controller public class BaseControllerEx { @ExceptionHandler(NameException.class) public ModelAndView nameEx(NameException ex) { ModelAndView modelAndView=new ModelAndView("exception/NameException"); modelAndView.addObject("exception",ex.getMessage()); return modelAndView; } @ExceptionHandler(PwdException.class) public ModelAndView nameEx(PwdException ex) { ModelAndView modelAndView=new ModelAndView("exception/PwdException"); modelAndView.addObject("exception",ex.getMessage()); return modelAndView; } }
注解的方式就不需要 Spring-excption.xml 配置了,所以直接干掉就可以或者注释掉配置
这时我们只需要稍微改动一下我们的 ControllerWelcome 类去继承我们的注解类:
运行方式同上述一致......