`
wangyun
  • 浏览: 120738 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Struts异常处理

阅读更多
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);
}
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics