【SpringMVC整合MyBatis】springmvc异常处理-全局异常处理器开发

异常处理
1.异常处理思路

系统中异常包括两类:预期异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试通过手段减少运行时异常的发生。
系统的dao、service、controller出现都通过throws Exception向上抛出,最后由springmvc前端控制器交由异常处理器进行异常处理,如下图:

springmvc提供全局异常处理器(一个系统只有一个异常处理器)进行统一异常处理。

2.自定义异常类

对不同的异常类型定义异常类,继承Exception。

package cn.edu.hpu.ssm.exception;

//系统自定义异常处理类,针对预期的异常,需要在程序中抛出此类的异常
public class CustomException extends Exception{

	//异常信息
	private String message;

	public CustomException(String message){
		super(message);
		this.message=message;
	}

	public String getMessage() {
		return message;
	}

	public void setMessage(String message) {
		this.message = message;
	}
}

3.全局异常处理器

思路:
系统遇到异常,在程序中手动抛出,dao抛给service、service给controller、controller抛给前端控制器,前端控制器调用全局异常处理器。

全局异常处理器处理思路:
    解析出异常类型。
    如果该 异常类型是系统 自定义的异常,直接取出异常信息,在错误页面展示。
    如果该 异常类型不是系统 自定义的异常,构造一个自定义的异常类型(信息为“未知错误”)。

springmvc提供一个HandlerExceptionResolver接口

package cn.edu.hpu.ssm.exception;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;

//全局异常处理器
public class CustomExceptionResolver implements HandlerExceptionResolver{

	//系统抛出的异常
	@Override
	public ModelAndView resolveException(HttpServletRequest request,
			HttpServletResponse response, Object handler, Exception ex) {
		//handler就是处理器适配器要执行的Handler对象(只有method)
		//解析出异常类型。

	    //如果该 异常类型是系统 自定义的异常,直接取出异常信息,在错误页面展示。
		CustomException customException=null;
		if(ex instanceof CustomException){
			customException=(CustomException)ex;

	    }else{
	    	//如果该 异常类型不是系统 自定义的异常,构造一个自定义的异常类型(信息为“未知错误”)。
	    	customException=new CustomException("未知错误");
	    }

		//错误信息
		String message=customException.getMessage();

		ModelAndView modelAndView=new ModelAndView();

		//将错误信息传到页面
		modelAndView.addObject("message",message);

		//指向到错误界面
		modelAndView.setViewName("error");

		return modelAndView;
	}

}

4.错误页面
在WEB-INF/jsp文件夹下创建error.jsp页面,内容为:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">

    <title>错误提示</title>

  </head>

  <body>
    <h1><font color="red">${message }</font></h1><br>
  </body>
</html>

5.在springmvc.xml配置全局异常处理器

<!-- 全局异常处理器
	只要你实现了HandlerExceptionResolver接口,这个
	类就是一个全局异常处理器-->
	<bean class="cn.edu.hpu.ssm.exception.CustomExceptionResolver"></bean>

6.异常测试
在controller、service、dao中任意一处需要手动抛出异常。
如果是程序中手动抛出的异常,在错误页面中显示自定义的异常信息,如果不是手动抛出异常说明是一个运行时异常,在错误页面只显示“未知错误”。

在商品修改的controller方法中抛出异常。

@RequestMapping(value="/editItems",method={RequestMethod.POST,RequestMethod.GET})
//@RequestParam里面指定reuqest传入参数和形参进行绑定。
//通过required属性指定参数是否必须要传入
//通过defaultValue可以设置默认值,如果id参数没有传入,将默认值和形参绑定
	public String editItems(Model model,@RequestParam(value="id",required=true,defaultValue="") Integer items_id)throws Exception{

		//调用service根据商品id查询商品信息
		ItemsCustom itemsCustom=itemsService.findItemsById(items_id);
		//判断商品是否为空,根据id没有查到商品,提示用户商品信息并不存在
		if(itemsCustom==null){
			throw new CustomException("商品的修改信息不存在!");
		}

		//通过形参中的model将model数据传到页面
		//相当于modelAndView.addObject方法
		model.addAttribute("items22",itemsCustom);

		return "items/editItems";
	}

其中上面用到的service方法:

@Override
public ItemsCustom findItemsById(Integer id) throws Exception {

	Items items=itemsMapper.selectByPrimaryKey(id);
	//中间对商品信息进行业务处理
	//...
	//最终返回ItemsCustom
	ItemsCustom itemsCustom=null;
	//将item的内容拷贝到itemsCustom
	if(items!=null){
		itemsCustom=new ItemsCustom();
		BeanUtils.copyProperties(items, itemsCustom);
	}

	return itemsCustom;
}

我们让id指定一个没有的数(如4444),则会抛出我们自定义的异常信息:

同样在Service中也可以抛出异常

如果与业务功能相关的异常,建议在service中抛出异常。
与业务功能没有关系的异常,建议在controller中抛出。

上边的功能,建议在service中抛出异常。

转载请注明出处:http://blog.csdn.net/acmman/article/details/47604099

时间: 2024-09-06 00:13:25

【SpringMVC整合MyBatis】springmvc异常处理-全局异常处理器开发的相关文章

SpringMVC整合mybatis实例代码_java

MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis . 一.逆向工程生成基础信息 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis G

【SpringMVC整合MyBatis】商品查询工程框架配置

mybatis和spring进行整合,来编写一个商品查询的工程. 一.整合dao 1.sqlMapConfig.xml mybatis自己的配置文件---sqlMapConfig.xml: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://m

【SpringMVC整合MyBatis】整合思路与工程结构

springmvc和mybatis整合 1.需求 使用springmvc和mybatis完成商品列表查询. 2.整合思路 springmvc+mybaits的系统架构: 如图 第一步:整合dao层mybatis和spring整合,通过spring管理mapper接口.使用mapper的扫描器自动扫描mapper接口在spring中进行注册. 第二步:整合service层通过spring管理 service接口.使用配置方式将service接口配置在spring配置文件中.实现事务控制. 第三步:

【SpringMVC整合MyBatis】提供学习参考的项目源码

最近很多博友私信向我索要此开发专栏的源代码,为了发挥开源精神,我决定将<MyBatis+SpringMVC>专栏所有源代码工程公布给大家,供大家学习参考! 共享的源代码分别是,MyBatis单独的工程,SpringMVC单独的工程,Spring与MyBatis整合的工程,SpringMVC与MyBatis整合的工程.另外感谢光临博客,祝大家学习愉快 源代码链接地址:http://download.csdn.net/detail/u013517797/9031455

【SpringMVC整合MyBatis】validation校验-商品修改校验

springmvc校验 1.校验理解 项目中,通常使用较多是前端的校验,比如页面中js校验.对于安全要求较高点建议在服务端进行校验. 服务端校验:控制层controller:校验页面请求的参数的合法性.在服务端控制层controller校验,不区分客户端类型(浏览器.手机客户端.远程调用)业务层service(使用较多):主要校验关键业务参数,仅限于service接口中使用的参数.持久层dao:一般是不校验的. 2.springmvc校验需求 springmvc使用hibernate的校验框架v

【SpringMVC整合MyBatis】springmvc拦截器-定义和配置

拦截器 1.拦截定义 定义拦截器,实现HandlerInterceptor接口.接口中提供三个方法. package cn.edu.hpu.ssm.interceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerInterceptor; import org.

【SpringMVC整合MyBatis】springmvc和struts2的区别

springmvc和struts2的区别  1.springmvc基于方法开发的,struts2基于类开发的. springmvc将url和controller方法映射.映射成功后springmvc生成一个Handler对象,对象中只包括了一个method.方法执行结束,形参数据销毁. struts2的action类中的所有方法用的都是action类中的成员变量,一旦方法变得很多的时候,我们就会不知道action类中那么多成员变量是给那个方法去使用的.十分混乱. 但是springmvc的所有参数

【SpringMVC整合MyBatis】spring参数绑定

参数绑定 1.spring参数绑定过程 从客户端请求key/value数据,经过参数绑定,将key/value数据绑定到controller方法的形参上. springmvc中,接收页面提交的数据是通过方法形参来接收.而不是在controller类定义成员变更接收!!!! 2.默认支持的类型 直接在controller方法形参上定义下边类型的对象,就可以使用这些对象.在参数绑定过程中,如果遇到下边类型直接进行绑定. (1)HttpServletRequest 通过request对象获取请求信息

【SpringMVC整合MyBatis】springmvc实现json交互-requestBody和responseBody

json数据交互 1.为什么要进行json数据交互 json数据格式在接口调用中.html页面中较常用,json格式比较简单,解析还比较方便. 比如:webservice接口,传输json数据. 2.springmvc进行json交互 (1)请求json.输出json,要求请求的是json串,所以在前端页面中需要将请求的内容转成json,不太方便. (2)请求key/value.输出json.此方法比较常用. 3.环境准备 3.1加载json转的jar包 springmvc中使用jackson的