Struts1.1的MVC框架中对视图层和控制层提供了对异常处理的支持。
控制层:Struts的控制器捕获到异常之后,在异常处理代码块中通过创建ActionMessage对象保存异常信息,并把它保存在ActionMessages(或其子类ActionErrors)对象中,然后将其存入request范围(或session范围中)。
视图层:通过<html:errors>标签显示控制器保存的的异常信息。
由于Struts1.1中向用于显示的错误信息来自与资源文本,因此在Struts1.1中异常实现了国际化。
Java Web容器
首先介绍下Java Web容器处理异常的机制,因为如果Struts框架会将不能处理的异常抛给Java Web容器。
Java Web容器通过web.xml文件配置<error-page>元素处理Java异常。
<error-page>子元素介绍:1)<error-code>:配置Web容器错误类型,如404,500
2)<exception-type>:指定Java异常类(全名)
3)<location>:Web容器捕获异常后显示的页面。
注:1)HTTP 404错误:页面未找到。2)HTTP 505错误:内部服务器错误。
ActionServlet
Struts1.1的ActionServlet类的process方法仅仅声明IOException和ServletException异常(不捕获任何异常)。
RequestProcessor
Struts1.1的RequestProcessor类的process方法虽然和ActionServlet类的process方法一样,仅仅声明IOException和ServletException异常,但其调用的processActionPreform方法却捕获Action的execute方法抛出的任何异常。因此RequestProcessor类是Struts1.1框架处理异常的核心组件。
ExceptionHandler
虽然RequestProcessor的processActionPreform方法虽然捕获了Action的execute方法抛出的异常,但是真正处理该异常的方法是processException方法。
processException方法首先根据异常类型寻找匹配的ExceptionConfig对象(ExceptionConfig对象对应struts-config.xml文件配的<exception>节点,寻找时根据节点的type属性匹配)。如果寻找到匹配的ExceptionConfig对象,调用getHandler()方法并创建异常处理类(根据struts-config.xml文件配的<exception>节点的handle属性,源代码:RequestUtils.applicationInstance(config.getHandler());)。
在struts1.1中默认的异常处理类是org.apache.struts.action.ExceptionHandler。
它将调用execute方法处理action类抛出的异常。
ModuleException
如果将异常消息与struts的资源文件关联起来,那么可以简化异常信息包装成ActionMessage的步骤。在struts1.1中提供了ModuleException异常类,它可以很好的和Struts的资源消息关联。
构造方法介绍:
1)ModuleException(java.lang.String key)
2)ModuleException(java.lang.String key, java.lang.Object[] values)
在构造方法key值对应资源文件中的key,第二个构造方法用于复合消息,第二个参数设置给复合消息的参数。
ModuleException的缺陷:
由于ModuleException是Struts的控制层组件,用在模型中会导致模型层无法重用的结果(模型层不依赖与控制层想必是由于这个道理吧。)。因此自定义异常体系是一个不错的解决之道。这里我将孙卫琴写的BaseException代码写于下面,供读者参考。
根据BaseException源代码写的StrutsException类代码如下:
/**
* 根据孙卫琴的struts书改写的Struts异常基类<br />
* StrutsException优点:<br />
* 1)实现异常链<br />
* 2)实现异常多样化<br />
* 3)与Struts的资源文件进行绑定<br />
* 4)支持资源文件的复合信息<br />
* 5)将错误信息存放保存与文件中<br />
* @author 王赟
*/
public class StrutsException extends Exception {
/**
* 原始异常
*/
protected Throwable rootCause = null;
/**
* 存储异常对象,用于实现异常的多样化
*/
private List exceptions = new ArrayList();
/**
* 异常日志
*/
protected PrintWriter log = null;
public StrutsException(Throwable rootCause) {
this.rootCause = rootCause;
this.init();
}
/**
* 资源消息的Key值
*/
private String MessageKey = null;
/**
* 复合消息参数
*/
private Object[] messageArgs = null;
public List getExceptions() {
return exceptions;
}
public void setExceptions(List exceptions) {
this.exceptions = exceptions;
}
public PrintWriter getLog() {
return log;
}
public void setLog(PrintWriter log) {
this.log = log;
}
public Object[] getMessageArgs() {
return messageArgs;
}
public void setMessageArgs(Object[] messageArgs) {
this.messageArgs = messageArgs;
}
public String getMessageKey() {
return MessageKey;
}
public void setMessageKey(String messageKey) {
MessageKey = messageKey;
}
public Throwable getRootCause() {
return rootCause;
}
public void setRootCause(Throwable rootCause) {
this.rootCause = rootCause;
}
public void addException(StrutsException ex) {
exceptions.add(ex);
}
/**
* 异常写入
*/
public void printStackTrace() {
this.log.println(new Date().toLocaleString() + ": ");
super.printStackTrace(this.log);
if(null != this.rootCause)
this.rootCause.printStackTrace(this.log);
this.log.flush();
}
/**
* 初始化
*/
private void init() {
try {
String fileName = getClassPath() + this.getClass().getName() + ".log";
System.out.println(fileName);
//PrintWriter构造函数的boolean参数,用于设置是否自动刷新输出缓冲区,
//即true值时,当写入“\n”字符时PrintWriter会自动刷新输出缓存区
//FileWriter构造函数的boolean参数,用于是否保留文件数据,
//为true值时,新增内容添加在文件的末尾
this.log = new PrintWriter(new FileWriter(fileName, true), true);
}catch(FileNotFoundException e) {
e.printStackTrace();
}catch(IOException e) {
e.printStackTrace();
}
}
/**
* 获取类路径
* @return 类路径
*/
private String getClassPath() {
return Thread.currentThread().getContextClassLoader().getResource("").getPath().substring(1);
}
}
分享到:
相关推荐
struts2异常处理实例
NULL 博文链接:https://wlh269.iteye.com/blog/321746
Struts2异常处理机制
NULL 博文链接:https://wjt276.iteye.com/blog/690323
配合博文:http://blog.csdn.net/u011638419/article/details/41343683
Struts简介 什么是Struts Struts基本运作流程 ActionMapping类 Action类 ActionForm类 ActionError与ActionMessage 协同开发 模块化程序 Struts异常处理 Struts国际化支持 PlugIn接口 等等
项目中出现的异常通常要用一个友好的异常页面来显示,通过对struts2.xml的配置能拦截全局异常,只要出现异常就会转向异常页面。
struts常见异常及处理
Struts映射到Model 2设计模式的完整介绍 , 详细论述利用JSP使用Struts的知识,包括Struts标记库 Struts异常处理、验证和登录 Struts应用程序的国际化和本地化 完整论述新StrutsTiles模板库 ...
从网上搜索的一段关于struts1.x自定义异常处理的方法。
struts2的异常处理,解决异步请求时,异常以json格式发送到客户端。以及dao单元测试的配置。
Struts2 异常处理的四种获取属性方法,大家可以借鉴学习
Jakarta+Struts+编程[扫描版][中文] 高效的Model 2编程并不是一项简单的任务,开发人员经常...Struts异常处理、验证和登录 Struts应用程序的国际化和本地化 完整论述新StrutsTiles模板库 Struts应用程序的打包和发布
struts2 单文件,多文件上传及异常处理
Struts映射到Model 2设计模式的完整介绍 , 详细论述利用JSP使用Struts的知识,包括Struts标记库 Struts异常处理、验证和登录 Struts应用程序的国际化和本地化 完整论述新StrutsTiles模板库 ...
NULL 博文链接:https://yuxisanren.iteye.com/blog/1707508
本文档主要介绍了struts2的异常处理机制,希望对你有所帮助。
通过定义继承RuntimeException的异常类及继承ExceptionHandler的异常处理类,手动从dao层捕获异常。非常实用!
Struts2的异常处理实例 博文链接:https://zmx.iteye.com/blog/463996
9.5 Struts异常处理 13 第10章 struts中使用国际化(i18n) 13 10.1 struts国际化程序尝试 13 10.1 Java对i18n的支持 14 10.1 struts框架中对国际化的支持 14 第11章 Validator验证框架 14 11.1 安装和配置Validator...