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

struts1异常的处理分析

    博客分类:
  • SSH
阅读更多

1 异常链

  当不需要用户来处理和关心原始的异常时,常见的做法是捕获原始的异常,把他们包装成一个新的不同类型的异常,然后再抛出异常。

   所谓异常链就是把原始异常包装成新的异常类时,在新的异常类中封装了原始异常类

2 多样化异常

   在实际应用中,有时需要一个方法同时抛出多个异常。

   如果应用不支持在一个方法中抛出多个异常,用户每次将只能看到针对一个字段域的验证错误,当改正了一个错误后,重新提交表单,又会收到针对另一个字段域的验证错误,这会使得用户体验非常多差劲。

   有效的做法是每次当用户提交表单后,都验证所有的字段,然后向用户显示所有的验证信息。不幸的是,在java中一次只能抛出一个异常。因此需要开发者自行设计支持多样化异常的异常类。

3 struts异常分析

   在struts的控制层中,将java的异常类包装成ActionMessage。在struts中定义异常有两种方式:

         扩展ModuleException和创建自定义的异常类体系。

   扩展ModuleException

   优点,可以很好的和sturts的Resouce Bundle绑定。

   ModuleException(String key)和ModuleException(String key,Object[] values)

   key为错误消息key,values为对象数组类型的values参数。

  自定义异常类:

   如:

import java.io.PrintStream;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;

public class BaseException extends Exception {
	protected Throwable rootCause = null;
	private List exception = new ArrayList<Throwable>();
	private String messageKey = null;
	private Object[] messageArgs = null;
	
	public Throwable getRootCause() {
		return rootCause;
	}
	public void setRootCause(Throwable rootCause) {
		this.rootCause = rootCause;
	}
	public List getException() {
		return exception;
	}
	public void addException(Throwable exception) {
		this.exception.add(exception);
	}
	public String getMessageKey() {
		return messageKey;
	}
	public void setMessageKey(String messageKey) {
		this.messageKey = messageKey;
	}
	public Object[] getMessageArgs() {
		return messageArgs;
	}
	public void setMessageArgs(Object[] messageArgs) {
		this.messageArgs = messageArgs;
	}
	@Override
	public void printStackTrace() {
		printStackTrace(System.err);
	}
	@Override
	public void printStackTrace(PrintStream s) {
		printStackTrace(new PrintWriter(s));
	}
	@Override
	public void printStackTrace(PrintWriter s) {
		super.printStackTrace(s);
		
		if(getRootCause() != null){
			getRootCause().printStackTrace(s);
		}
		
		s.flush();
	}
}

 因为有了rootCause exceptions messageKey 和messageArgs 这四个属性使得这个自定义异常类有了以下功能:

   支持异常的级联,rootCause属性制定原始异常(异常链)

   支持多样化异常,exceptions属性存放所有嵌套的异常

   支持和struts的Resouce Bundle的绑定,messageKey属性指定消息key

   支持复合式消息,messageArgs属性指定复合式消息中的参数。

 

处理异常的方法

NO。1

   自己手动编写。   

   个人抛出异常方法:

     if(满足一定条件){

                throw new RuntionException(“错误提示信息”);

     }

 

    由自己try {}catch(){}进行捕获然后,用mapping.forwoard(“”)跳转到处理页面中来。

   xxAction.java

public ActionForward delete(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) {
		String id = request.getParameter("id");
		try {
			getOrgnizationService().delete(id);
		} catch (RuntimeException e) {
			/**
			 * 返回一个错误信息。
			 */
			ActionMessages mesgs = new ActionMessages();
			ActionMessage mesg = new ActionMessage("error.detail",e.getMessage());//error.detail为资源文件,e.getMessage()为得到的错误信息。他所处的地方为error.detail的参数所在地。
			mesgs.add("error",mesg);
			this.saveErrors(request, mesgs); //错误信息存入到页面中去。

			
			return mapping.findForward("exception");
			
		}
		return mapping.findForward("OK");
	}

 

   struts-config.xml文件:

<action-mappings >
    <action
      attribute="orgnizationForm"
      name="orgnizationForm"
      parameter="method"
      path="/orgnization"
      scope="request"
      type="org.springframework.web.struts.DelegatingActionProxy"
      validate="false">
      <forward name="exception" path="/error.jsp"></forward>
      <forward name="OK" path="/main/orgnization.jsp" />
    </action>

  </action-mappings> 


   在页面调用这个时应该用<html:errors>即可把资源文件里面的错误信息显示出来。

NO。2    

    在项目中通常需要统一的错误处理。将异常throws出去,交给sturts来处理。

    有两个缺点

            不能处理带参数的异常!去给资源文件的参数赋值;

            异常的类型在配置文件中是固定的,不能动态改变。

    struts可以有两种方法对异常进行处理。

    一种 是在struts配置文件里面的action下面(局部异常处理 ),用exception来处理

 

<action-mappings >
    <action
      attribute="orgnizationForm"
      name="orgnizationForm"
      parameter="method"
      path="/orgnization"
      scope="request"
      type="org.springframework.web.struts.DelegatingActionProxy">
      <exception key="error.detail" type="java.lang.RuntimeException
"  scope="request" path="/error.jsp"></exception>

      <forward name="OK" path="/main/orgnization.jsp" />
    </action>

  </action-mappings>

 

 

 

 

 

   另一种 方法是在struts的配置文件中的global-exception为全局的异常

<global-exceptions>
  	<exception key="error.detail" type="java.lang.RuntimeException" scope="request" path="/error.jsp"></exception>
  </global-exceptions>

 NO。3 (推荐)

    使用自定义的异常类来继承原始的异常。用自定义的异常类来处理整个工程的异常。在一个异常类中使用多种异常。用一个异常类来代表不同的异常消息。

    首先,定义自己的异常类:他要继承RuntimeException

    

package edu.hust.util;

import java.io.PrintStream;
import java.io.PrintWriter;

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 cause) {
		super(message, cause);
	}

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

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

 	  public SystemException(String message,String key){
    		super(message);
    		this.key = key;
 	   }
	  public SystemException(String message,String key,Object values){
    		 super(message);
   		  this.key = key;
   		  this.values = new Object[]{values};
   	 }
 
  	  public SystemException(String message,String key,Object[] values){
		     super(message);
		     this.key = key;
		     this.values = values;
	    }	
}

  在抛出异常的地方:

public ActionForward delete(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response) {
		String id = request.getParameter("id");
		try {
			getOrgnizationService().delete(id);
		} catch (RuntimeException e) {
			throw new SystemException("有子机构,不能删除!","error.detail2");//去对应上面的构造函数,知道error.detail2为key。
		}
		return mapping.findForward("OK");
	}

  在配置文件中:

<global-exceptions>
  	<exception 
  		key="error.detail"         

  		type="edu.hust.SystemException" 
  		scope="request" 
  		path="/error.jsp"         
  		handler="edu.hust.util.SystemExceptionHandler">   
  		</exception>
  </global-exceptions>

 异常处理类:

 

package edu.hust.util;

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

import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ExceptionHandler;
import org.apache.struts.config.ExceptionConfig;
/**
 * 统一异常处理类,继承的是org.apache.struts.action下的ExceptionHandler。
 * 实现execute方法即可

 * @author sunqitang
 *
 */
public class SystemExceptionHandler extends ExceptionHandler {
	@Override
	public ActionForward execute(Exception ex, ExceptionConfig ae,
			ActionMapping mapping, ActionForm formInstance,
			HttpServletRequest request, HttpServletResponse response)
			throws ServletException {
		ActionForward forward = null;
		if( null != ae.getPath()){
			forward = new ActionForward(ae.getPath());//获得默认的path
		}else{
			forward = mapping.getInputForward();
		}
		if(ex instanceof SystemException){
			ActionMessage error = null;
			SystemException sysExce = (SystemException) ex;
			String key = sysExce.getKey();   //获得key
			if( null == key){  //如果可以为空
				error = new ActionMessage(ae.getKey(),sysExce.getMessage());
			}else{
				if(null != sysExce.getValues()){ // 可以不为空,且有参数
					error = new ActionMessage(key,sysExce.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); //异常不属于自定义异常类
	}
}

 

 

 

 

 

分享到:
评论

相关推荐

    struts手动异常处理

    Struts是Apache软件基金会(ASF)赞助的一个开源项目,它是...同时,结合`源码`和`工具`这两个标签,我们可以进一步研究Struts框架的内部工作原理,以及利用各种工具(如IDE、调试器等)来辅助分析和调试异常处理代码。

    Struts1异常处理

    在Struts1中,异常处理是至关重要的一个环节,它确保了在遇到错误或异常时,应用能够优雅地进行恢复,提供用户友好的反馈,而不是直接崩溃。 在Struts1中,异常处理主要通过以下几种方式实现: 1. **全局异常处理*...

    struts常见异常及处理

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

    struts2.0整合Struts 1

    4. **Interceptor配置**:根据需求添加Struts 2特有的拦截器,以实现Struts 1中类似的功能,如Session管理、异常处理等。 5. **配置合并**:合并Struts 1和Struts 2的配置文件,确保请求能正确路由到相应的Action。...

    struts 1 源码分析

    下面我们将深入探讨Struts 1的源码分析,特别是针对Struts 1.2版本。 1. **架构概述** - **DispatcherServlet**:作为Struts的核心,DispatcherServlet负责接收HTTP请求并分发到相应的Action。 - **ActionMapping...

    Struts2源码分析

    `org.apache.struts2.interceptor`包定义了内置的拦截器,例如身份验证、异常处理等,开发者可以根据需要自定义拦截器。 最后,`org.apache.struts2.util`和`org.apache.struts2.validators`包提供了实用工具类和...

    struts2框架源码分析及问题汇总

    要确保Interceptor的异常处理得当,或者配置全局异常处理。 3. 动态方法访问:Struts2支持动态方法调用,但如果不正确配置,可能导致找不到方法的错误。检查Action类的方法命名和配置文件中的配置是否匹配。 4. ...

    struts1小项目

    8. **异常处理(Exception Handling)**:Struts1提供了全局异常处理机制,当Action执行过程中抛出异常时,可以统一捕获并显示错误页面。 学习和分析这个小项目,可以帮助我们深入理解Struts1的工作原理,以及如何...

    struts1和struts2项目实例

    然而,Struts1的配置文件较多,且对异常处理和国际化支持相对较弱。 Struts2在Struts1的基础上进行了许多改进,引入了拦截器(Interceptor)的概念,使得处理流程更加灵活。Struts2的配置通常更为简洁,可以通过...

    一个Struts1多文件上传实例(附Form中传List示例)

    通过分析和学习这些代码,你可以更好地理解和掌握Struts1中多文件上传和表单中传递List的实践方法。 总之,这个实例提供了关于Struts1中文件上传和复杂表单数据处理的实战经验,对于学习Java Web开发和Struts1框架...

    对struts1.x与struts2.x的区别的总结

    - **Struts1.x** 异常处理需要在配置文件中指定错误页面,处理相对复杂。 - **Struts2.x** 提供了全局异常处理机制,通过拦截器链处理异常,更易管理和扩展。 6. **国际化与本地化**: - **Struts1.x** 需要在...

    Struts2中异常处理机制分析

    在Struts2中,异常处理机制是关键组成部分,确保程序在遇到错误时能够优雅地处理并提供反馈给用户。本文将深入探讨Struts2的异常处理机制,特别是声明式异常捕捉和异常映射。 首先,Struts2的异常处理机制允许...

    struts1实现文件上传

    下面将详细解析文件上传的实现过程,包括关键类的使用、文件处理逻辑以及异常处理等方面。 #### Struts1框架简介 Struts1是Apache Struts的一个版本,它是一个用于构建基于Java的Web应用程序的开源框架。Struts1...

    仅使用了struts1框架

    5. **错误和异常处理**:虽然这个例子可能没有包含,但了解如何处理登录失败或其他异常情况也是很重要的。 通过这个简单的项目,初学者可以逐步掌握Struts1框架的基本使用,为后续的复杂应用开发打下基础。同时,这...

    exception---struts1

    标签中的"源码"提示我们,这篇博客可能涉及到了Struts1的内部实现,包括其异常处理机制的源代码分析。理解源码可以帮助开发者更好地了解框架的工作原理,从而更有效地解决异常问题。 "工具"标签则暗示博主可能介绍...

    刚写的Struts1客户管理系统

    Struts1提供了一套全局的异常处理机制,允许开发者定义特定的错误页面来处理程序运行时抛出的异常。这样可以提供友好的用户体验,并且简化错误处理代码。 以上是对这个基于Struts1的客户管理系统的简要分析,涉及...

    struts利用工具1.2

    1. **CVE-2017-5638**:这是Struts2最臭名昭著的一个漏洞,被称为"Struts Shatter",它允许攻击者通过HTTP头中的Content-Type字段注入恶意OGNL表达式,导致远程代码执行。 2. **漏洞原理**:Struts2框架在处理动态...

    [尚硅谷]_佟刚_Struts2面试题分析.zip

    7. **Struts2的异常处理**:通过全局异常映射(Global Exception Mapping)和Action级别的异常映射,可以统一处理应用程序中的异常,提供友好的错误提示。 8. **Struts2的国际化(Internationalization, i18n)**:...

    Comparing the Struts 1 and Struts 2 Web Application Frameworks

    文章“Comparing the Struts 1 and Struts 2 Web Application Frameworks”可能详细分析了这两个框架的各个方面,包括但不限于配置方式、开发效率、错误处理、性能测试等。通过阅读文档,开发者可以获取更多实用的...

    Struts2之拦截器原理分析及使用-上案例struts007

    Struts2还提供了一些内置的拦截器,如params(处理请求参数)、i18n(国际化支持)、exception(异常处理)等。这些拦截器极大地丰富了框架的功能,减少了开发者的工作量。 总的来说,Struts2的拦截器机制是其强大...

Global site tag (gtag.js) - Google Analytics