SpringMVC学习系列(10) 之 异常处理
2015-06-06 19:26
791 查看
在项目中如何处理出现的异常,在每个可能出现异常的地方都写代码捕捉异常?这显然是不合理的,当项目越来越大是也是不可维护的。那么如何保证我们处理异常的代码精简且便于维护呢?这就是本篇要讲的内容—>异常处理。
在Spring MVC中我们可以通过以下2中途径来对异常进行集中处理:
一.继承HandlerExceptionResolver接口实现自己的处理方法,如:
然后在项目的配置文件中添加:
这样就完成了异常的捕捉和处理。
二.我们介绍了第一种捕捉处理异常方式,但是第一种方式需要在配置文件中进行配置,有的时候我们会觉得配置文件内容太多太乱,那么我们就可以借助@ExceptionHandler注解来实现零配置的异常捕捉和处理。
首先,在我们项目的包com.demo.web.controllers中为controller建立一个父类BaseController,内容如下:
其次,修改项目中HelloWorldController让它继承于BaseController以便进行测试:
然后,修改HelloWorldController 中的index方法,使其抛出异常,看能不能正常捕捉:
最后,在views文件夹中添加testerror.jsp视图来显示错误信息:
运行项目:
可以看到异常已经被捕捉并显示,这样只要把我们的其它的Controller全部继承于BaseController就能实现异常的集中捕捉和处理了。
代码下载:http://pan.baidu.com/s/1c0eTseG
注: 之前没注意前11篇的示例代码,不知道为什么当时打包上传上去的是没有.project项目文件的,导致下载后不能直接导入eclipse运行,虚拟机又 被我删掉了,这些示例代码也没有备份,但是代码文件还在的,所以可以新建一个Dynamic Web Project把对应的配置文件和controller还有view导入就可以了,给大家造成的不便说声抱歉。
分类: Spring MVC
标签: SpringMVC
绿色通道: 好文要顶 关注我 收藏该文与我联系
Miss When...
关注 - 15
粉丝 - 192
+加关注
3
« 上一篇:SpringMVC学习系列(9)
之 实现注解式权限验证
» 下一篇:SpringMVC学习系列(11)
之 表单标签
posted @ 2014-05-26 15:16 Miss When... 阅读(5370) 评论(2) 编辑 收藏
评论列表
#1楼 2014-05-26
22:56 我为程序员自豪
请问现在一般很多都是ajax调用
在方法名上@ResponseBody注解这种这么处理异常比较优雅
支持(0)反对(0)
#2楼[楼主] 2014-05-27
01:48 Miss When...
@我为程序员自豪
差点把ajax请求给忘了,我现在想到的办法是对请求类型做判断:
测试通过,如果你有更好的实现方式也请告诉我。
在Spring MVC中我们可以通过以下2中途径来对异常进行集中处理:
一.继承HandlerExceptionResolver接口实现自己的处理方法,如:
public class MyHandlerExceptionResolver implements HandlerExceptionResolver { @Override public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { //添加自己的异常处理逻辑,如日志记录等 // TODO Auto-generated method stub return new ModelAndView("exception"); } }
然后在项目的配置文件中添加:
<bean id="exceptionResolver" class="所在包名.MyHandlerExceptionResolver"/>
这样就完成了异常的捕捉和处理。
二.我们介绍了第一种捕捉处理异常方式,但是第一种方式需要在配置文件中进行配置,有的时候我们会觉得配置文件内容太多太乱,那么我们就可以借助@ExceptionHandler注解来实现零配置的异常捕捉和处理。
首先,在我们项目的包com.demo.web.controllers中为controller建立一个父类BaseController,内容如下:
package com.demo.web.controllers; import java.sql.SQLException; import javax.servlet.http.HttpServletRequest; import org.springframework.web.bind.annotation.ExceptionHandler; public abstract class BaseController { @ExceptionHandler public String exception(HttpServletRequest request, Exception e) { //添加自己的异常处理逻辑,如日志记录 request.setAttribute("exceptionMessage", e.getMessage()); // 根据不同的异常类型进行不同处理 if(e instanceof SQLException) return "testerror"; else return "error"; } }
其次,修改项目中HelloWorldController让它继承于BaseController以便进行测试:
public class HelloWorldController extends BaseController{ //...内容省略 }
然后,修改HelloWorldController 中的index方法,使其抛出异常,看能不能正常捕捉:
//@AuthPassport @RequestMapping(value={"/index","/hello"}) public ModelAndView index() throws SQLException{ throw new SQLException("数据库异常。"); /*ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject("message", "Hello World!"); modelAndView.setViewName("index"); return modelAndView;*/ }
最后,在views文件夹中添加testerror.jsp视图来显示错误信息:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>error!</title> </head> <body> ${exceptionMessage} </body> </html>
运行项目:
可以看到异常已经被捕捉并显示,这样只要把我们的其它的Controller全部继承于BaseController就能实现异常的集中捕捉和处理了。
代码下载:http://pan.baidu.com/s/1c0eTseG
注: 之前没注意前11篇的示例代码,不知道为什么当时打包上传上去的是没有.project项目文件的,导致下载后不能直接导入eclipse运行,虚拟机又 被我删掉了,这些示例代码也没有备份,但是代码文件还在的,所以可以新建一个Dynamic Web Project把对应的配置文件和controller还有view导入就可以了,给大家造成的不便说声抱歉。
分类: Spring MVC
标签: SpringMVC
绿色通道: 好文要顶 关注我 收藏该文与我联系
Miss When...
关注 - 15
粉丝 - 192
+加关注
3
« 上一篇:SpringMVC学习系列(9)
之 实现注解式权限验证
» 下一篇:SpringMVC学习系列(11)
之 表单标签
posted @ 2014-05-26 15:16 Miss When... 阅读(5370) 评论(2) 编辑 收藏
评论列表
#1楼 2014-05-26
22:56 我为程序员自豪
请问现在一般很多都是ajax调用
在方法名上@ResponseBody注解这种这么处理异常比较优雅
支持(0)反对(0)
#2楼[楼主] 2014-05-27
01:48 Miss When...
@我为程序员自豪
差点把ajax请求给忘了,我现在想到的办法是对请求类型做判断:
相关文章推荐
- springmvc 孔浩
- SpringMVC学习系列(9) 之 实现注解式权限验证
- SpringMVC学习系列(7) 之 格式化显示
- SpringMVC学习系列(8) 之 国际化
- Java类的多态机制
- hadoop2.6.0+eclipse配置
- hadoop2.6.0+eclipse配置
- 第二十一篇 Java 数据类型的定义 ,以及基础类型的自动转换和强制转换
- SpringMVC 学习笔记(九) 自定义拦截器
- 【转】java多态详解
- SpringMVC 学习笔记(八)文件上传
- Struts2学习笔记1
- Java面向对象小记(1)
- java final 与引用类型变量和基本类型区别
- 如何导入hadoop源码到eclipse
- 如何导入hadoop源码到eclipse
- Struts2+Spring+MyBatis环境整合开发案例(MVC架构)
- Java中wait()与sleep()的区别
- 关于java中空指针异常的原因及解决方法
- 请用Java实现列出某个目录下的所有文件