【SSH项目实战】国税协同平台-9.全局异常映射

简介:
上次我们的校验工作已经完成,下面我们谈谈系统异常的处理。

假设我们在UserAction的listUI方法中加入一句错误代码:
//列表页面
public String listUI(){
	int i=1/0;
	userList=userService.findObjects();
	return "listUI";
}
然后我们来访问我们的我用户列http://localhost/HpuTax/tax/user_listUI.action,那么便会看到这种错误界面:


为了让用户不看到这种错误界面,转化为友好界面,我们就要对系统的异常进行包装处理。

系统可能出现的异常:(异常分类)
dao: 比较致命的操作异常,是会有很大可能影响整次的请求
service: 业务层的异常信息需要自定义
action: 控制层的异常信息需要自定义

我们在核心代码包中创建我们的全局异常以及各层异常处理类:
SysException.java:
package cn.edu.hpu.tax.core.exception;

public abstract class SysException extends Exception{

	//错误信息
	private String errorMsg;
	
	public String getErrorMsg() {
		return errorMsg;
	}


	public void setErrorMsg(String errorMsg) {
		this.errorMsg = errorMsg;
	}
	
	//下面几个全是不同的构造方法
	public SysException() {
		super();
		// TODO Auto-generated constructor stub
	}


	public SysException(String message, Throwable cause,
			boolean enableSuppression, boolean writableStackTrace) {
		super(message, cause, enableSuppression, writableStackTrace);
		// TODO Auto-generated constructor stub
	}


	public SysException(String message, Throwable cause) {
		super(message, cause);
		errorMsg=message;
	}


	public SysException(String message) {
		super(message);
		errorMsg=message;
	}


	public SysException(Throwable cause) {
		super(cause);
	}
	
}

ServiceException.java:
package cn.edu.hpu.tax.core.exception;

public class ServiceException extends SysException{


	public ServiceException() {
		//业务层的默认错误信息
		super("业务操作错误!");
	}


	public ServiceException(String message) {
		super(message);
	}
	
}

ActionException.java:
package cn.edu.hpu.tax.core.exception;

public class ActionException extends SysException{

	public ActionException() {
		super("请求发生错误!");
	}

	public ActionException(String message) {
		super(message);
	}
	
}

我们下面来使用一下这些异常类,我们在UserServiceImpl中故意出一个错误:
@Override
public List<User> findObjects() throws ServiceException{
	try {
		int i = 1 / 0;
	} catch (Exception e) {
		throw new ServiceException("service 出错!"+e.getMessage());
	}
	return userDao.findObjects();
}

然后在Action层捕获异常:
//列表页面
public String listUI() throws SysException{
	try {
		userList=userService.findObjects();
	} catch (ServiceException e) {
		throw new ActionException("action 出现异常!"+e.getMessage());
	}
	return "listUI";
}

接下来我们配置总的全局异常处理配置,我们在struts的配置文件struts.xml中加入以下代码:
<!-- 配置全局结果集异常映射 -->
<package name="base-default" extends="struts-default">
	<!-- 全局返回结果 -->
	<global-results>
		<result name="sysError">/WEB-INF/jsp/error.jsp</result>
		<result name="input">/WEB-INF/jsp/error.jsp</result>
	</global-results>
	
	<!-- 全局异常映射 -->
	<global-exception-mappings>
		<exception-mapping result="sysError" exception="cn.edu.hpu.tax.core.exception.SysException"/>
		<exception-mapping result="input" exception="java.lang.Exception"/>
	</global-exception-mappings>
</package>

然后编写error.jsp界面:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>系统异常信息</title>
  </head>
  
  <body>
  	<img src="<%=request.getContextPath() %>/images/common/error.jpg">
    <br>
    <s:if test="exception.errorMsg != '' && exception.errorMsg != null">
    	<s:property value="exception.errorMsg"/>
    </s:if>
    <s:else>
    	操作失败!<s:property value="exception.message"/>
    </s:else>
  </body>
</html>

然后让我们的user的struts配置中使用我们的异常处理(把extends从struts-default改为base-default):
<package name="user-action" namespace="/tax" extends="base-default">

然后我们查看用户列表来测试一下:


发现弹出了我们自定义的错误界面,并且阐述了哪几层出现错误,最终错误的原因。

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

相关文章
在使用SSH+Spring开发webservice ,报的一些异常及处理方法
在使用SSH+Spring开发webservice ,报的一些异常及处理方法
201 0
在使用SSH+Spring开发webservice ,报的一些异常及处理方法
|
5月前
|
网络安全
SNETCracker.exe 2022/1/26 31:13:29----检查12.26.20.1:SSH登录发生异常!未能加载文件或程序集“ChilkatDotNet4.dll”或它的某一个依赖项
SNETCracker.exe 2022/1/26 31:13:29----检查12.26.20.1:SSH登录发生异常!未能加载文件或程序集“ChilkatDotNet4.dll”或它的某一个依赖项
141 0
|
关系型数据库 MySQL Java
|
存储 Java 数据库连接
【SSH快速进阶】——Hibernate继承映射:每个具体类映射一张表
  上篇文章说的是每个类映射一张表,不管是父类还是子类。与上篇文章不同的是,这里是每个“具体类”映射一张表,什么意思呢?就是让每个子类(具体的、有意义的类)映射一张表。
【SSH快速进阶】——Hibernate继承映射:每个具体类映射一张表
|
存储 Java 数据库连接
【SSH快速进阶】——Hibernate继承映射:每个类映射一张表
上文说了每棵继承树映射一张表,本文继续描述让每个类都映射一张表的配置。
【SSH快速进阶】——Hibernate继承映射:每个类映射一张表
|
存储 Java 数据库连接
【SSH快速进阶】——Hibernate继承映射:每棵继承树映射一张表
  我们都知道,Hibernate最大的一个优点就是使开发更加“面向对象”,类与类之间有继承关系,Hibernate中也对这种继承关系提供了映射的封装。
【SSH快速进阶】——Hibernate继承映射:每棵继承树映射一张表
|
Java 数据库连接 网络安全
【SSH快速进阶】——Hibernate 多对多映射
说到多对多关系,印象最深刻的就是大学的选修课。**一个学生可以选修多门课程,一门课程可以有多个学生选修,学生所选的每一门课程还有成绩**。这个场景的E-R图如下:
【SSH快速进阶】——Hibernate 多对多映射
|
Java 数据库连接 网络安全
【SSH快速进阶】——Hibernate 多对一映射 和 一对多映射
上两篇文章说了一对一映射,这里说一下多对一 和 一对多的映射情况。
【SSH快速进阶】——Hibernate 多对一映射 和 一对多映射
|
SQL Java 数据库连接
【SSH快速进阶】——Hibernate一对一映射(one-to-one)——唯一外键关联
  接着上篇文章,唯一外键关联,就是给一对一关联关系中某个对象加一个外键。比如这里给t_person表添加一个外键,指向t_idcard的主键,并且规定t_person中的外键idCard唯一,也可以达到一对一映射的效果。
【SSH快速进阶】——Hibernate一对一映射(one-to-one)——唯一外键关联
|
SQL Java 数据库连接
【SSH快速进阶】——Hibernate一对一映射(one-to-one)——主键关联映射
 现实生活中,有很多场景需要用到一对一映射,比如每个学生只有一个学生证,每个公民只有一张身份证等。这里用公民-身份证来举例说明。
【SSH快速进阶】——Hibernate一对一映射(one-to-one)——主键关联映射