13.SpringMVC核心技术-异常处理
常用的SpringMVC异常处理方式主要是三种:
1.使用系统定义好的异常处理器 SimpleMappingExceptionResolver
2.使用自定义异常处理器
3.使用异常处理注解
SimpleMappingExecptionResolver 异常处理器
该方式只需要在SpringMVC配置文件中注册该异常处理器Bean即可。该Bean比较特殊,没有id属性
无需显示调用或被注入给其他<bean/>,当异常发生时 会自动执行该类
1.自定义异常类
public class NameException extends Exception {
public NameException() {
super();
}
public NameException(String message) {
super(message);
}
}
2.修改Controller
@Controller
@RequestMapping("/test")
public class MyController { @RequestMapping(value = "/exception.do")
public ModelAndView method(String name,int age) throws NameException, AgeException {
//int i = 3 / 0; if(!"beijing".equals(name)){
//当异常抛出时,会自动执行异常处理器类
throw new NameException("用户名不准确!");
} if(age > 65){
throw new AgeException("年龄过大!");
} ModelAndView mv = new ModelAndView();
mv.addObject("name", name);
mv.addObject("age",age);
//需在setViewName() 指定的视图前添加 redirect,(默认添加的 forword)才能重定向到 指定资源
//重定向 后,是一个新的request,当把数据添加到Model中 时,会自动往路径后面添加上参数(a.jsp?name=&age=)
mv.setViewName("redirect:/a.jsp"); return mv;
} }
3.注册异常处理器
<!-- 注册 SimpleMappingExceptionResolver 这个异常处理器(系统定义好的), 当异常发生时自动执行该类 -->
<bean
class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <!-- 默认的错误页面 -->
<property name="defaultErrorView" value="/WEB-INF/errors/defaultErrorPage.jsp"></property> <!-- 用于指定不同类型的异常对应的 处理页面 -->
<property name="exceptionMappings">
<props>
<prop key="com.springmvc.exceptions.NameException">/WEB-INF/errors/nameErrorPage.jsp</prop>
<prop key="com.springmvc.exceptions.AgeException">/WEB-INF/errors/ageErrorPage.jsp</prop>
</props>
</property> <!-- 得到exceptionAttribute属性 , 得到捕获到的异常对象ex ,可以用ex得到一些异常信息 -->
<!-- 应该是将ex对象放到 request 域中了,前台页面可以取出显示 -->
<property name="exceptionAttribute" value="ex"></property>
</bean>
exceptionMappings:Properties 类型属性,用于指定具体的不同类型的异常所对应的异 常响应页面。Key 为异常类的全限定性类名,value 则为响应页面路径
defaultErrorView:指定默认的异常响应页面。若发生的异常不是 exceptionMappings 中 指定的异常,则使用默认异常响应页面。
exceptionAttribute:捕获到的异常对象。一般异常响应页面中使用。
4.定义异常响应页面
<body>
<!--
param.name 的 底层执行的 是 request.getParameter("name");
requestScope.name 的底层执行的 是 request.getAttribute();
-->
Age Error Page
${ex.message }
</body>
自定义异常处理器
使用SpringMVC 定义好的SimpleMappingExeceptionResolver异常处理器,可以发生指定异常后的跳转
但若要实现 在捕获指定异常时,执行一些操作的目的,它是完成不了的。此时,就需要自定义异常处理器
自定义异常处理器,需要实现HandlerExeceptionResolver接口,并且该类需要在SpringMVC配置文件中配置
a)定义异常处理器
当一个类实现了HandlerExeceptionResolver接口后,只要有异常发生,
无论什么异常,都会自动执行接口方法 resolveExeception()
//设置自定义 异常处理器的好处:在捕获到指定异常后,可以完成一些操作,SimpleMappingExceptionResolver 只能完成页面的跳转,无法执行更多
public class MyExceptionResolver implements HandlerExceptionResolver { //当一个类实现了 HandlerExceptionResolver 接口后,只要有异常发生,无论什么异常,都会执行resolveException方法 (在该异常处理器 注册了的前提下)
@Override
public ModelAndView resolveException(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex) {
ModelAndView mv = new ModelAndView();
//将异常对象加入 数据模型中
mv.addObject("ex",ex); //设置默认的错误处理页面 (需要放在自定义异常的前面,不然自定义异常的页面路径可能会被覆盖)
mv.setViewName("/WEB-INF/errors/defaultErrorPage.jsp"); //设置 NameException的 错误处理页面
if(ex instanceof NameException) {
System.out.println("执行一些操作 NameException");
mv.setViewName("/WEB-INF/errors/nameErrorPage.jsp");
}
//设置 AgeException的 错误处理页面
if(ex instanceof AgeException) {
System.out.println("执行一些操作 AgeException");
mv.setViewName("/WEB-INF/errors/ageErrorPage.jsp");
} return mv;
} }
b)注册异常处理器
<!-- 注册 MyExceptionResolver 自定义异常处理器, 当异常发生时自动执行该类 (只需要注册就好,其他都已经到 该处理器里面设置好了)-->
<bean class="com.springmvc.ExceptionResolver.MyExceptionResolver"/>
异常处理注解
使用注解 @ExceptionHandler 可以将一个方法指定为异常处理方法。该注解只有一个可选属性 value,
是一个Class<?> 数组,用于指定该注解的方法所要处理的异常类,即所要匹配的异常
而被注解的方法,其返回值可以是ModelAndView、String或void,方法名随意,方法参数可以是Exeception及其子类对象
HttpServletRequest、HttpServletResponse等。系统会自动为这些方法参数赋值
a) 定义异常处理的Controller
//构造这样一个 父类,让需要用到 这些 异常处理 的 Controller 继承这个父类即可
//如果不抽取出来,只写在某个 Controller 中,那么这些 异常处理方法 只会在该处理器生效时生效
//注意,这里加上 @Controller ,不然里面 方法是不会加载的
@Controller
public class BaseController { // 使用 ExceptionHandler ,将一个方法声明为 异常处理方法,可以使用 value 属性,指定该异常处理方法用于处理哪个异常
// 指明 用于处理 NameException
@ExceptionHandler(value = AgeException.class)
public ModelAndView handlerAgeException(Exception ex) {
ModelAndView mv = new ModelAndView();
mv.addObject("ex", ex);
System.out.println("执行一些操作 AgeException");
mv.setViewName("/WEB-INF/errors/ageErrorPage.jsp"); return mv;
} // 指明 用于处理 AgeException
@ExceptionHandler(value = NameException.class)
public ModelAndView handlerNameException(Exception ex) {
ModelAndView mv = new ModelAndView();
mv.addObject("ex", ex);
System.out.println("执行一些操作 NameException");
mv.setViewName("/WEB-INF/errors/nameErrorPage.jsp"); return mv;
} // 默认异常处理
@ExceptionHandler
public ModelAndView handlerdefaultException(Exception ex) {
ModelAndView mv = new ModelAndView();
mv.addObject("ex", ex);
mv.setViewName("/WEB-INF/errors/defaultErrorPage.jsp");
return mv;
} }
b) 修改Controller,让普通Controller继承自定义好的异常处理 Controller
//当MyController 出现异常时,会去找BaseController 是否定义了这个异常
public class MyController extends BaseController {
13.SpringMVC核心技术-异常处理的更多相关文章
- Spring框架系列(13) - SpringMVC实现原理之DispatcherServlet的初始化过程
前文我们有了IOC的源码基础以及SpringMVC的基础,我们便可以进一步深入理解SpringMVC主要实现原理,包含DispatcherServlet的初始化过程和DispatcherServlet ...
- JavaEE的13种核心技术
Java的大方向就是JavaEE,JavaEE不仅仅是socket编程,具体包括13中核心技术. JavaEE平台由一整套服务(Services).应用程序接口(APIs)和协议构成,它对开发基于We ...
- SpringMVC 全局异常处理
在 JavaEE 项目的开发中,不管是对底层的数据库操作过程,还是业务层的处理过程,还是控制层的处理过程,都不可避免会遇到各种可预知的.不可预知的异常需要处理.每个过程都单独处理异常,系统的代码耦合度 ...
- springmvc学习笔记(13)-springmvc注解开发之集合类型參数绑定
springmvc学习笔记(13)-springmvc注解开发之集合类型參数绑定 标签: springmvc springmvc学习笔记13-springmvc注解开发之集合类型參数绑定 数组绑定 需 ...
- springmvc 中异常处理
springmvc 中异常处理常见三种处理方式: 1:SimpleMappingExceptionResolver处理的是处理器方法里面出现的异常 2 3.自定义异常处理器:处理的是处理器方法里面出现 ...
- Java匹马行天下之JavaSE核心技术——异常处理
Java匹马行天下之JavaSE核心技术——异常处理 异常的简介 在Java中,异常就是Java在编译.运行或运行过程中出现的错误. 程序错误分为三种:编译错误.运行时错误和逻辑错误 编译错误是因为程 ...
- springMvc全局异常处理
本文中只测试了:实现Spring的异常处理接口HandlerExceptionResolver 自定义自己的异常处理器 对已有代码没有入侵性等优点,同时,在异常处理时能获取导致出现异常的对象,有利于提 ...
- 012医疗项目-模块一:统一异常处理器的设计思路及其实现(涉及到了Springmvc的异常处理流程)
我们上一篇文章是建立了一个自定义的异常类,来代替了原始的Exception类.在Serice层抛出异常,然后要在Action层捕获这个异常,这样的话在每个Action中都要有try{}catch{}代 ...
- springMVC对异常处理的支持
无论做什么项目,进行异常处理都是非常有必要的,而且你不能把一些只有程序员才能看懂的错误代码抛给用户去看,所以这时候进行统一的异常处理,展现一个比较友好的错误页面就显得很有必要了.跟其他MVC框架一样, ...
随机推荐
- [ML] Linear Discriminant Analysis
虽然名字里有discriminat这个字,但却是生成模型,有点意思. 判别式 pk 生成式 阅读:生成方法 vs 判别方法 + 生成模型 vs 判别模型 举例: 判别式模型举例:要确定一个羊是山羊还是 ...
- windows10 企业版 安装应用商店
安装windows10企业版后,提示 没有nvdia control panel 在其他位置下载均不成功 必须在win10自带的应用商店中安装,但win10企业版没有应用商店, 使用下方的网盘安装应用 ...
- k8s学习之资料参考网址(持续更新)
此文章持续更新关于学习k8s生态的参考网址: 二进制方式搭建 (此部署方式是一步一步的部署,过程清晰) https://github.com/opsnull/follow-me ...
- mysql报错解决
1044, "Access denied for user 'root'@'192.168.0.%' to database 'test'" 是因为创建这个test数据库时候没有给 ...
- ubuntu默认root密码问题,第一次使用ubuntu需要设置root密码
http://www.voidcn.com/article/p-yvnoogkc-ng.html 新接触ubuntu(baseondebian)的人,大多会因为安装中没有提示root密码而不太清楚为什 ...
- 常用的linux命令选项
-a 显示所有对象 -c 生成一个计数 -d 制定一个目录 -e 扩展一个对象 -f 指定读入数据的文件 -h 显示命令的帮助信息 -i 忽略文本大小写 -l 产生输出的成格式版本 -n 使用非交互模 ...
- Python_小林的爬取QQ空间相册图片链接程序
前言 昨天看见某人的空间有上传了XXXX个头像,然后我就想着下载回来[所以本质上这是一个头像下载程序],但是一个个另存为太浪费时间了,上网搜索有没有现成的工具,居然要注册码,还卖45一套.你们的良心也 ...
- 【FFMPEG】【ARM-Linux开发】fmpeg安装第三方编码器(encoder)库,ffmpeg编码h264(完)
fmpeg安装第三方编码器(encoder)库,ffmpeg编码h264(完) ffmpeg安装第三方编码器(encoder)库 关键词:ffmpeg.编码h264.第三方encoder 安装好了ff ...
- Mysql性能优化之---(二)
建立适当的索引 说起提高数据库性能,索引是最物美价廉的东西了.不用加内存,不用改程序,不用调sql,只要执行个正确的'create index',查询速度就可能提高百倍千倍,这可真有诱惑力.可是天下没 ...
- 洛谷 题解 P4158 【[SCOI2009]粉刷匠】
状态: dp[i][j][k][0/1]: 到达第i行时, 到达第j列时, 刷到第k次时, 这一格有没有刷对 转移 换一块木板时肯定要多刷一次 dp[i][j][k][0]=max(dp[i-1][m ...