13.SpringMVC核心技术-异常处理
常用的SpringMVC异常处理方式主要是三种:
1.使用系统定义好的异常处理器 SimpleMappingExceptionResolver
2.使用自定义异常处理器
3.使用异常处理注解
SimpleMappingExecptionResolver 异常处理器
该方式只需要在SpringMVC配置文件中注册该异常处理器Bean即可。该Bean比较特殊,没有id属性
无需显示调用或被注入给其他<bean/>,当异常发生时 会自动执行该类
1.自定义异常类
1 public class NameException extends Exception { 2 public NameException() { 3 super(); 4 } 5 6 public NameException(String message) { 7 super(message); 8 } 9 }
2.修改Controller
1 @Controller 2 @RequestMapping("/test") 3 public class MyController { 4 5 @RequestMapping(value = "/exception.do") 6 public ModelAndView method(String name,int age) throws NameException, AgeException { 7 //int i = 3 / 0; 8 9 if(!"beijing".equals(name)){ 10 //当异常抛出时,会自动执行异常处理器类 11 throw new NameException("用户名不准确!"); 12 } 13 14 if(age > 65){ 15 throw new AgeException("年龄过大!"); 16 } 17 18 ModelAndView mv = new ModelAndView(); 19 mv.addObject("name", name); 20 mv.addObject("age",age); 21 //需在setViewName() 指定的视图前添加 redirect,(默认添加的 forword)才能重定向到 指定资源 22 //重定向 后,是一个新的request,当把数据添加到Model中 时,会自动往路径后面添加上参数(a.jsp?name=&age=) 23 mv.setViewName("redirect:/a.jsp"); 24 25 return mv; 26 } 27 28 }
3.注册异常处理器
1 <!-- 注册 SimpleMappingExceptionResolver 这个异常处理器(系统定义好的), 当异常发生时自动执行该类 --> 2 <bean 3 class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> 4 5 <!-- 默认的错误页面 --> 6 <property name="defaultErrorView" value="/WEB-INF/errors/defaultErrorPage.jsp"></property> 7 8 <!-- 用于指定不同类型的异常对应的 处理页面 --> 9 <property name="exceptionMappings"> 10 <props> 11 <prop key="com.springmvc.exceptions.NameException">/WEB-INF/errors/nameErrorPage.jsp</prop> 12 <prop key="com.springmvc.exceptions.AgeException">/WEB-INF/errors/ageErrorPage.jsp</prop> 13 </props> 14 </property> 15 16 <!-- 得到exceptionAttribute属性 , 得到捕获到的异常对象ex ,可以用ex得到一些异常信息 --> 17 <!-- 应该是将ex对象放到 request 域中了,前台页面可以取出显示 --> 18 <property name="exceptionAttribute" value="ex"></property> 19 </bean>
exceptionMappings:Properties 类型属性,用于指定具体的不同类型的异常所对应的异 常响应页面。Key 为异常类的全限定性类名,value 则为响应页面路径
defaultErrorView:指定默认的异常响应页面。若发生的异常不是 exceptionMappings 中 指定的异常,则使用默认异常响应页面。
exceptionAttribute:捕获到的异常对象。一般异常响应页面中使用。
4.定义异常响应页面
1 <body> 2 3 <!-- 4 param.name 的 底层执行的 是 request.getParameter("name"); 5 requestScope.name 的底层执行的 是 request.getAttribute(); 6 --> 7 8 Age Error Page 9 ${ex.message } 10 </body>
自定义异常处理器
使用SpringMVC 定义好的SimpleMappingExeceptionResolver异常处理器,可以发生指定异常后的跳转
但若要实现 在捕获指定异常时,执行一些操作的目的,它是完成不了的。此时,就需要自定义异常处理器
自定义异常处理器,需要实现HandlerExeceptionResolver接口,并且该类需要在SpringMVC配置文件中配置
a)定义异常处理器
当一个类实现了HandlerExeceptionResolver接口后,只要有异常发生,
无论什么异常,都会自动执行接口方法 resolveExeception()
1 //设置自定义 异常处理器的好处:在捕获到指定异常后,可以完成一些操作,SimpleMappingExceptionResolver 只能完成页面的跳转,无法执行更多 2 public class MyExceptionResolver implements HandlerExceptionResolver { 3 4 //当一个类实现了 HandlerExceptionResolver 接口后,只要有异常发生,无论什么异常,都会执行resolveException方法 (在该异常处理器 注册了的前提下) 5 @Override 6 public ModelAndView resolveException(HttpServletRequest request, 7 HttpServletResponse response, Object handler, Exception ex) { 8 ModelAndView mv = new ModelAndView(); 9 //将异常对象加入 数据模型中 10 mv.addObject("ex",ex); 11 12 13 //设置默认的错误处理页面 (需要放在自定义异常的前面,不然自定义异常的页面路径可能会被覆盖) 14 mv.setViewName("/WEB-INF/errors/defaultErrorPage.jsp"); 15 16 //设置 NameException的 错误处理页面 17 if(ex instanceof NameException) { 18 System.out.println("执行一些操作 NameException"); 19 mv.setViewName("/WEB-INF/errors/nameErrorPage.jsp"); 20 } 21 //设置 AgeException的 错误处理页面 22 if(ex instanceof AgeException) { 23 System.out.println("执行一些操作 AgeException"); 24 mv.setViewName("/WEB-INF/errors/ageErrorPage.jsp"); 25 } 26 27 28 return mv; 29 } 30 31 }
b)注册异常处理器
1 <!-- 注册 MyExceptionResolver 自定义异常处理器, 当异常发生时自动执行该类 (只需要注册就好,其他都已经到 该处理器里面设置好了)--> 2 <bean class="com.springmvc.ExceptionResolver.MyExceptionResolver"/>
异常处理注解
使用注解 @ExceptionHandler 可以将一个方法指定为异常处理方法。该注解只有一个可选属性 value,
是一个Class<?> 数组,用于指定该注解的方法所要处理的异常类,即所要匹配的异常
而被注解的方法,其返回值可以是ModelAndView、String或void,方法名随意,方法参数可以是Exeception及其子类对象
HttpServletRequest、HttpServletResponse等。系统会自动为这些方法参数赋值
a) 定义异常处理的Controller
1 //构造这样一个 父类,让需要用到 这些 异常处理 的 Controller 继承这个父类即可 2 //如果不抽取出来,只写在某个 Controller 中,那么这些 异常处理方法 只会在该处理器生效时生效 3 //注意,这里加上 @Controller ,不然里面 方法是不会加载的 4 @Controller 5 public class BaseController { 6 7 // 使用 ExceptionHandler ,将一个方法声明为 异常处理方法,可以使用 value 属性,指定该异常处理方法用于处理哪个异常 8 // 指明 用于处理 NameException 9 @ExceptionHandler(value = AgeException.class) 10 public ModelAndView handlerAgeException(Exception ex) { 11 ModelAndView mv = new ModelAndView(); 12 mv.addObject("ex", ex); 13 System.out.println("执行一些操作 AgeException"); 14 mv.setViewName("/WEB-INF/errors/ageErrorPage.jsp"); 15 16 return mv; 17 } 18 19 // 指明 用于处理 AgeException 20 @ExceptionHandler(value = NameException.class) 21 public ModelAndView handlerNameException(Exception ex) { 22 ModelAndView mv = new ModelAndView(); 23 mv.addObject("ex", ex); 24 System.out.println("执行一些操作 NameException"); 25 mv.setViewName("/WEB-INF/errors/nameErrorPage.jsp"); 26 27 return mv; 28 } 29 30 // 默认异常处理 31 @ExceptionHandler 32 public ModelAndView handlerdefaultException(Exception ex) { 33 ModelAndView mv = new ModelAndView(); 34 mv.addObject("ex", ex); 35 mv.setViewName("/WEB-INF/errors/defaultErrorPage.jsp"); 36 return mv; 37 } 38 39 }
b) 修改Controller,让普通Controller继承自定义好的异常处理 Controller
1 //当MyController 出现异常时,会去找BaseController 是否定义了这个异常 2 public class MyController extends BaseController {
转载于:https://www.cnblogs.com/xuzekun/p/7413615.html
13.SpringMVC核心技术-异常处理相关推荐
- springmvc的异常处理对静态的资源的处理
1 springmvc的异常处理方式,暂时我知道的两种 2 1.在controller中捕获 3 /** 4 * 捕获到异常,用于局部处理 5 * @ExceptionHandler (value={ ...
- J2EE的13种核心技术
Java最初是在浏览器和客户端机器中粉墨登场的.当时,很多人质疑它是否适合做服务器端的开发.现在,随着对Java2平台企业版(J2EE)第三方支持的增多,Java被广泛接纳为开发企业级服务器端解决方案 ...
- SpringMVC 学习-异常处理 SimpleMappingExceptionResolver 类
SpringMVC 学习-异常处理 SimpleMappingExceptionResolver 类 参考文章: (1)SpringMVC 学习-异常处理 SimpleMappingException ...
- JavaEE的13种核心技术
java的大方向就是JavaEE,JavaEE不仅仅是socket编程,具体包括13中核心技术. JAVAEE的核心API与组件 JAVAEE平台由一整套服务(Services).应用程序接口(API ...
- java13种技术_JavaEE的13种核心技术
java的大方向就是JavaEE,JavaEE不仅仅是socket编程,具体包括13种核心技术. JAVAEE的核心API与组件 JAVAEE平台由一整套服务(Services).应用程序接口(API ...
- SpringMVC 全局异常处理的简单应用
2019独角兽企业重金招聘Python工程师标准>>> 在SpringMVC框架的项目开发过程中,你还在使用 try{} catch(){} 输出异常吗?,那样你就真的OUT了,Sp ...
- java 13个核心技术3
前端时间由于软考的原因,已经开始了j2se的学习,马士兵老师带我们走进了java的世界.最近在学习j2ee的过程中,了解到java的13个核心技术,于是先来个宏观的了解吧. 其实java的大方向就是j ...
- java 13种技术_JavaEE的13种核心技术
Java的大方向就是JavaEE,JavaEE不仅仅是socket编程,具体包括13中核心技术. JavaEE平台由一整套服务(Services).应用程序接口(APIs)和协议构成,它对开发基于We ...
- J2EE的13种核心技术简介
Java最初是在浏览器和客户端机器中粉墨登场的.当时,很多人质疑它是否适合做服务器端的开发.现在,随着对Java2平台企业版(J2EE)第三方支持的增多,Java被广泛接纳为开发企业级服务器端解决方案 ...
最新文章
- Selenium启动Chrome浏览器提示“请停用以开发者模式运行的扩展程序”的解决办法
- 大厂首发!尚硅谷docker高级
- Android中创建自己的对话框
- SpringMVC拦截器(interceptors)
- JS控制CSS样式语法对照
- 用内存映射在多个应用程序之间共享数据
- 温州大学c语言作业布置的网站,2016年温州大学物理与电子信息工程学院综合卷之C语言程序设计复试笔试仿真模拟题...
- c语言程序设计 朱立华 下载,C语言程序设计 教学课件 朱立华 王立柱 C语言程序设计课件第1章090909.pdf...
- Adobe illustrator如何修改默认字体
- “人肉搜索”名词解释
- android service开启前台通知
- 如何在计算机面试中牵着面试官鼻子走?
- 万年历的Java代码
- [后端 springboot] 打包后html无法访问的问题
- RabbitMQ的相关概念以及RabbitMQ的安装
- fedora 安装与系统升级
- 使用计算机连接bmcc,【供应BMCC EF-摄影机(2.5K,13档动态范围,RAW格式,EF口)】价格_厂家 - 中国供应商...
- 浦东新区人工智能“双会”齐开,闪马智能签约张江高科重点项目
- IPO夭折,喜马拉雅陷入“非战之罪”?
- 为什么说JDK中的Stack设计是失败的
热门文章
- php清空dns缓存文件,怎么清除DNS缓存
- PTA c语言 统计单词的长度
- 使用rust编译linux,在 Ubuntu 上为 CentOS 编译 Rust 程序,
- 不联网redhat5.5安装oracle11g,redhat5.5_64位上安装oracle11gR2_步骤+问题解决
- solr set java opts_關於 Apache Solr 無法啟動的問題
- linux分区没有cde显示,HP unix无法进入CDE的排查步骤
- 训练自己的数据_PyTorch版CenterNet训练自己的数据集
- 战神背光键盘如何关系_谁说轻薄和性能不可兼得?神舟战神Z7助你“清凉”一夏...
- AJAX全套(JSONP、CORS)
- MySQL DATE_ADD() 函数