`
rmeebh
  • 浏览: 50109 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

struts的异常处理(参照网上相关内容整理)

阅读更多
    异常是当JVM(JAVA虚拟机)在执行应用程序的某个方法的时候遇到的非正常现象,JVM就会生成一个异常对象,抛给客户以便客户进行异常处理.Struts框架的异常处理机制建立在java异常处理的基础之上.在研究Struts异常处理之前,先回顾一下java异常处理原理,理解java虚拟机JVM的异常处理过程有助于应用设计正确的异常处理方法.处理异常需要JVM付出不小的开销,所以用于必须慎重使用.
    JAVA异常是在java程序运行的时候遇到非正常的情况而创建的对象,它封装了异常信息,java异常的根类为java.lang.Throwable,整个类有两个直接子类java.lang.Error和java.lang.Exception.Error是程序本身无法恢复的严重错误.Exception则表示可以被程序捕获并处理的异常错误.JVM用方法调用栈来跟踪每个线程中一系列的方法调用过程,该栈保存了每个调用方法的本地信息.对于独立的JAVA程序,可以一直到该程序的main方法.当一个新方法被调用的时候,JVM把描述该方法的栈结构置入栈顶,位于栈顶的方法为正确执行的方法.当一个JAVA方法正常执行完毕,JVM回从调用栈中弹处该方法的栈结构,然后继续处理前一个方法.如果java方法在执行代码的过程中抛出异常,JVM必须找到能捕获异常的catch块代码.它首先查看当前方法是否贼这样的catch代码块,如果存在就执行该catch代码块,否则JVM回调用栈中弹处该方法的栈结构,继续到前一个方法中查找合适的catch代码块.最后如果JVM向上追到了main()方法,也就是一直把异常抛给了main()方法,仍然没有找到该异常处理的代码块,该线程就会异常终止,如果该线程是主线程,应用程序也随之终止,此时JVM将把异常直接抛给用户,在用户终端上会看到原始的异常信息。

一、编程式异常处理:
    Struts框架在视图层和控制层提供了对异常处理的支持.Struts的控制器负责捕获各种异常,包括控制器运行中本身抛出的异常,以及调用模型的业务方法的异常.当异常被控制器捕获的时候,在异常处理代码块中,创建描述异常信息的ActionMessage对象把它保存在ActionMessages或者它的子类ActionErrors对象中,然后把它保存在特定的范围内,比如request或session.接下来在视图层<html:error>标签检索特定范围的ActionMessages对象,把本地化错误消息输出到页面上.这种异常处理机制可以避免用户看到原始的java异常信息.可以更友好的把错误信息展示给用户.
    捕获异常-->创建相应的异常信息-->传递异常信息-->到相应的页面处理异常
....catch(Exception e){
    ActionMessages messages = new ActionMessages();
    ActionMessage message = new ActionMessage("errors.detail",username);
    messages.add("error",message);
    this.saveErrors(request, messages);
    return mapping.findforward("exception");
}

在相应异常处理页面采用<html:messages/>标签或<html:errors/>标签
二、声明式异常处理
    Struts框架也允许以配置的方式来处理异常,配置方法可以避免在Action类中通过硬编码来处理异常,提高应用的灵活性,可重用性和可维护性.对于Action类的execute()方法抛出的异常会先查找异常处理元素<exception>,如果是被嵌套在<global-exception>元素中就表示是全局异常处理元素,对所有的Action都适用.如果是嵌套在<action>元素中,就表示局部的异常处理元素,仅对当前的Action适用.阐述一下<exception>元素的属性:

1)  type:指定待处理的异常类(Exception的类绝对路径,这里是自己定义的异常类SystemException,继承RuntimeException )

2)  handler:指定异常处理类.默认是ExceptionHandler.这里是自己定义异常处理类SystemExceptionHandler,继承ExceptionHandler

3)  path:指定转发路径(如果不定义path,默认情况下将使用<action>标签中input属性对应的页面,因为默认异常处理类ExceptionHandler会先判断getPath是否有值,非空就new一个该getPath的ActionForward,为空就设置为mapping.getInputForward的值)

4)  key:指定错误消息key.根据这个key到ResourceBundle中寻找匹配的消息文本

5)  scope:指定ActionMessages对象的存放范围,默认request,也可以设置session

1、构建统一异常类(也可以在不构建此类,只要在配置文件中指定type="java.lang.RuntimeException")
public class SystemException extends RuntimeException {
	
    private String key;
	
	private Object[] values;

	public String getKey() {
		return key;
	}

	public Object[] getValues() {
		return values;
	}

	public SystemException() {
		super();
	}

	public SystemException(String message, Throwable throwable) {
		super(message, throwable);
	}

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

	public SystemException(Throwable throwable) {
		super(throwable);
	}
	
	public SystemException(String key, String message){
		super(message);
		this.key = key;
	}
}

2、构建异常处理类(也可不创建此类,只要在配置文件中指定handler="org.apache.struts.action.ExceptionHandler")
public class SystemExceptionHandler extends ExceptionHandler {

		public ActionForward execute(
				Exception ex, 
				ExceptionConfig ae,
				ActionMapping mapping, 
				ActionForm formInstance,
				HttpServletRequest request,
				HttpServletResponse response)
			throws ServletException {
		ActionForward forward = null;
		ActionMessage error = null;
		if(ae.getPath() != null){
			forward = new ActionForward(ae.getPath());
		}else{
			forward = mapping.getInputForward();
		}
		if(ex instanceof SystemException ){
			SystemException se = (SystemException)ex;
			String key = se.getKey();
			if(key == null){
				error = new ActionMessage(ae.getKey(), se.getMessage());
			}else{
				if(se.getValues() != null){
					error = new ActionMessage(key, se.getValues());
				}else{
					error = new ActionMessage(key);
				}
			}
			this.storeException(request, key, error, forward, ae.getScope());
			return forward;
		}
		return super.execute(ex, ae, mapping, formInstance, request, response);
	}	
}

3、配置struts-config.xml文件
  *  可配置在产生异常的action配置文件中
<action path="/login" 
        type="cn.huan.struts.LoginAction"
        name="loginForm"
        scope="request"
        input="/error.jsp"
>
    <exception 
        type="*.*.SystemException"
        key="errors.detail" 
        path="/exception.jsp"
        handler="*.*.SystemExceptionHandler"/>
    <forward name="exception" path="/exception.jsp"/>
</action>

  *  若把资源文件中配的异常信息都用一个异常来处理,就可自定义异常,并在struts-config.xml中配一处就行,这里采用这种配置.
<global-exceptions>
    <exception 
        path="/exception.jsp" 
        handler="*.*.SystemExceptionHandler" 
        scope="request" 
        key="errors.detail" 
        type="*.*.SystemException"
    >
    </exception>
</global-exceptions>

4、页面显示和编码方式一样用<html:messages/>标签或<html:errors/>标签
分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    struts手动异常处理

    1. **异常拦截器**:在Struts 2中,我们可以通过编写自定义的拦截器来处理异常。拦截器是Struts框架的核心组件,它们在Action执行前后进行拦截,可以捕获并处理可能出现的异常。通过实现`Interceptor`接口并覆盖`...

    Struts2异常处理机制

    当Struts2与Spring集成时,可以在Spring的配置文件中定义AOP切面来处理异常,这可以进一步增强异常管理的灵活性。 通过以上这些方式,Struts2的异常处理机制为开发者提供了丰富的选项,能够确保程序在遇到异常时能...

    Struts2之异常处理案例struts003

    Struts2是一个非常流行...通过理解并熟练运用以上知识点,开发者能够在Struts2应用中有效地管理和处理异常,提高程序的稳定性和用户体验。结合给出的博客链接,可以深入学习更多关于Struts2异常处理的实践案例和技巧。

    Struts1异常处理

    5. **结合Log4j等日志框架**:在处理异常时,通常会配合Log4j等日志框架记录异常信息,以便于调试和问题追踪。 6. **错误页面设计**:为了提供良好的用户体验,错误页面应当清晰地向用户展示错误信息,同时避免暴露...

    struts2中异常处理(demo)

    在`&lt;action&gt;`元素内使用`&lt;exception-mapping&gt;`标签,可以为特定的Action捕获并处理异常。 ```xml &lt;!-- ... --&gt; ``` 3. **自定义异常类和结果**:开发者还可以创建自定义的异常类,以便更好地封装和分类错误。...

    struts1.x 异常处理机制

    另外,你还可以通过继承`org.apache.struts.action.ExceptionHandler`接口来自定义异常处理器,这允许你在整个应用程序范围内统一处理异常,而不仅仅是单个Action。 此外,对于Struts1.x中与Action相关的异常,如`...

    基于Struts的异常处理

    在给定的文件中,我们看到了一个基于Struts的异常处理方案,主要涉及两个关键点:自定义异常类和自定义异常处理器。 首先,我们来看自定义异常类`AppException`,它是对Java内置的`RuntimeException`的扩展。这个类...

    Struts2 异常处理的四种获取属性方法

    Struts2提供了多种方式来捕获和处理异常,帮助开发者优雅地处理程序中的错误情况。以下是Struts2异常处理的四种主要方法,以及相关的知识点详解: 1. **全局异常映射(Global Exception Mapping)** 全局异常映射...

    struts异常处理

    7. **日志记录**:在处理异常时,记录异常信息是至关重要的。Struts2提供了内置的日志支持,也可以集成第三方日志框架如Log4j或SLF4J,以便于跟踪和调试。 总的来说,Struts2的异常处理机制提供了灵活且强大的方式...

    struts2的异常处理机制

    Struts2的拦截器(Interceptor)也可以参与到异常处理中,通过实现`ExceptionMappingInterceptor`接口,可以在拦截器中捕获并处理异常,提供更灵活的异常处理策略。 通过以上机制,Struts2允许开发者在处理业务...

    Struts 声明式异常处理和个性化异常处理

    这种方式允许在Action类的execute方法中捕获和处理异常,但可能导致代码混乱且不易维护。 在实际应用中,我们可能会遇到一些特定的异常情况,比如业务逻辑错误。这时,我们可以通过创建自定义异常类来封装这些错误...

    struts错误处理机制小例子

    通过这个简单的Struts错误处理小例子,我们可以了解到Struts是如何将错误信息从控制器层传递到视图层,并提供了多种方法来优雅地处理异常。这有助于提高应用程序的健壮性,同时确保用户在遇到问题时能得到清晰的反馈...

    struts2处理项目全局异常

    项目中出现的异常通常要用一个友好的异常页面来显示,通过对struts2.xml的配置能拦截全局异常,只要出现异常就会转向异常页面。

    struts2的异常处理

    在处理异常方面,Struts2提供了一套完善的机制,能够有效地管理和展示异常信息,尤其是在处理异步请求时。本篇文章将深入探讨Struts2的异常处理策略,以及如何在DAO层进行单元测试配置。 在传统的Web应用中,当一个...

    struts常见异常及处理

    ### Struts 常见异常及处理 #### 1. javax.servlet.ServletException: Must specify type attribute if name is specified - **异常描述**:当在 JSP 页面中使用自定义标签时,如果标签中定义了 `name` 属性,则...

    Struts2内容整理

    Struts2 框架的核心是 Action,Action 是一个包含了业务逻辑的 Java 类,它负责处理用户的请求并返回响应结果。 Struts2 配置 Struts2 框架的配置主要包括两个方面:web.xml 和 struts.xml。 * 在 web.xml 文件中...

    Struts2的异常处理

    这篇博客主要探讨了在Struts2中如何有效地管理和处理异常,从而提高应用的稳定性和用户体验。 在Struts2中,异常处理主要通过两种方式实现:全局异常处理和动作级别的异常处理。全局异常处理适用于整个应用,而动作...

Global site tag (gtag.js) - Google Analytics