`
txidol
  • 浏览: 54802 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

【责任链模式】模拟Struts责任链工作流及简单AOP实现

 
阅读更多

详细代码:http://download.csdn.net/detail/tanxiang21/5402599

模拟Struts2的工作责任链过程,接口调用invoke方法执行

public interface ActionInvocation{

    Object getAction();
    boolean isExecuted();
    Result getResult() throws Exception;
    String getResultCode();
    void setResultCode(String resultCode);
    String invoke() throws Exception;
    String invokeActionOnly() throws Exception;
}
接口实现类,这里具体的流程执行内容,由外部传入,不同于Struts2才有容器注入方式
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Iterator;
import java.util.List;

public class DefaultActionInvocation implements ActionInvocation {
	protected Iterator<InterceptorMapping> interceptors;
	protected Action action = new SelfAction();

	@SuppressWarnings("rawtypes")
	private static final Class[] EMPTY_CLASS_ARRAY = new Class[0];
	private static final Object[] EMPTY_OBJECT_ARRAY = new Object[0];

	protected Result result;
	protected String resultCode;

	protected boolean executed = false;

	//这里我们外部传入内容,Struts采用inject注入以及调用init方法初始化内容
	public DefaultActionInvocation(List<InterceptorMapping> interceptorsTree,
			Action action) {
		this.interceptors = interceptorsTree.iterator();
		this.action = action;
	}

	public String invoke() throws Exception {

		if (executed) {
			throw new IllegalStateException("Action has already executed");
		}

		//遍历拦截器
		if (interceptors.hasNext()) {
			final InterceptorMapping interceptor = interceptors.next();
			resultCode = interceptor.getInterceptor().intercept(
					DefaultActionInvocation.this);
		} 
		//执行Action
		else{
			resultCode = invokeActionOnly();
		}
		
		//这里打个假设,在Struts实际会根据resultCode,判断创建哪类Result以及执行chian转发等
		//这里只是一个demo,我们模拟执行的流程		
		if(Action.SUCCESS.equals(resultCode)){  
			executeResult();
		}
		

		executed = true;
		return resultCode;

	}

	public String invokeActionOnly() throws Exception {
		return invokeAction(getAction());
	}

	protected String invokeAction(Object action) throws Exception {
		
		boolean methodCalled = false;
		Object methodResult = null;
		Method method = null;
		try {		
			try{
				String methodName = "execute";//这里我们直接设定反射执行execute方法
				method = getAction().getClass().getMethod(methodName,
					EMPTY_CLASS_ARRAY);
			} catch (NoSuchMethodException e) {
				System.out.println("没有此方法");
				methodCalled = true;
			}
			if (!methodCalled) {
				methodResult = method.invoke(action, EMPTY_OBJECT_ARRAY);
			}			
		}catch (InvocationTargetException e) {
			// We try to return the source exception.
			Throwable t = e.getTargetException();
			if (t instanceof Exception) {
				throw (Exception) t;
			} else {
				throw e;
			}
		}
		//返回值直接返回,这里稍微改写了
		return (String) methodResult;
	}

	private void executeResult() throws Exception {
		result = createResult();
		//假设就只执行成功的结果   注意 这里改写了!!!!
		if (result != null && Action.SUCCESS.equals(resultCode)) {
			result.execute(this);
		}
	}

	public Result createResult() throws Exception {
		return new SelfResult();
	}

	public Object getAction() {
		return action;
	}

	public boolean isExecuted() {
		return executed;
	}

	public Result getResult() throws Exception {
		return result;
	}

	public String getResultCode() {
		return resultCode;
	}

	public void setResultCode(String resultCode) {
		if (isExecuted())
			throw new IllegalStateException("Result has already been executed.");
		this.resultCode = resultCode;
	}
}
测试类
public class ResponsibilityChainTest {

	private List<InterceptorMapping> interceptorsTree;
	private Action action;
	private ActionInvocation actionInvocation;
	
	//初始化拦截器,Action,ActionInvocation,相当于容器工作
	@Before	
	public void setUp(){
		
		interceptorsTree = new ArrayList<InterceptorMapping>();
		Interceptor one = new SelfOneInterceptor();
		Interceptor two = new SelfTwoInterceptor();
		InterceptorMapping oneIntercepror = new InterceptorMapping("one", one);
		InterceptorMapping twoIntercepror = new InterceptorMapping("two", two);
		interceptorsTree.add(oneIntercepror);
		interceptorsTree.add(twoIntercepror);
		
		action = new SelfAction();
		
		actionInvocation = new DefaultActionInvocation(interceptorsTree, action);
	}
	
	@Test
	public void test() throws Exception{
		actionInvocation.invoke();		
		assertEquals(Action.SUCCESS,actionInvocation.getResultCode());
	}
}

测试结果:

intercept SelfOneInterceptor before aop
intercept SelfTwoInterceptor before aop
execute SelfAction
------------------------------------Result is success do nothing or other
intercept SelfTwoInterceptor after aop
------------------------------------Result is success do nothing or other
intercept SelfOneInterceptor after aop
------------------------------------Result is success do nothing or other

拦截器类

public interface Interceptor{
 
    void destroy();

    void init();

    String intercept(ActionInvocation invocation) throws Exception;

}

拦截器抽象实现

public abstract class AbstractInterceptor implements Interceptor {
	
    //在初始化时,执行的钩子,实现类可以不实现,这里我们不做模拟
	public void init() {}    
    public void destroy() {}

    /**
     * 拦截器一定需要覆写的方法
     */
    public abstract String intercept(ActionInvocation invocation) throws Exception;
}
拦截器具体实现类1
public class SelfOneInterceptor extends AbstractInterceptor {
    
    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
		String result = null ;  	
    	System.out.println("intercept SelfOneInterceptor before aop");		
		result = invocation.invoke(); 		
		System.out.println("intercept SelfOneInterceptor after aop");
		return result; 
    }  
}

拦截器具体实现类2

public class SelfTwoInterceptor extends AbstractInterceptor {
    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
    	String result = null ;   	
    	System.out.println("intercept SelfTwoInterceptor before aop");
		result = invocation.invoke(); 
		System.out.println("intercept SelfTwoInterceptor after aop");				
		return result; 
    }  
}
主执行类接口
public interface Action {

    public static final String SUCCESS = "success";
    public static final String NONE = "none";
    public static final String ERROR = "error";
    public static final String INPUT = "input";
    public static final String LOGIN = "login";

    public String execute() throws Exception;

}

执行实现类

public class SelfAction implements Action{

	@Override
	public String execute() throws Exception {
		System.out.println("execute SelfAction");
		return SUCCESS;
	}
}
结果处理接口
public interface Result {
  
    public void execute(ActionInvocation invocation) throws Exception;

}

结果处理实现类

public class SelfResult implements Result {
	@Override
	public void execute(ActionInvocation invocation) throws Exception {

		System.out.println("------------------------------------Result is "
				+ invocation.getResultCode() + " do nothing or other");
	}
}
拦截器mapping,对应于xml中的名字
public class InterceptorMapping implements Serializable {

    private static final long serialVersionUID = 130216399397955317L;
    private String name;
    private Interceptor interceptor;

    public InterceptorMapping(String name, Interceptor interceptor) {
        this.name = name;
        this.interceptor = interceptor;
    }

    public String getName() {
        return name;
    }

    public Interceptor getInterceptor() {
        return interceptor;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        final InterceptorMapping that = (InterceptorMapping) o;

        if (name != null ? !name.equals(that.name) : that.name != null) return false;

        return true;
    }

    @Override
    public int hashCode() {
        int result;
        result = (name != null ? name.hashCode() : 0);
        return result;
    }
}

分享到:
评论

相关推荐

    模拟Struts责任链工作流及简单AOP实现

    通过以上步骤,我们成功地模拟了Struts责任链的工作流程,并实现了一个简单的AOP机制。这种设计不仅使得代码结构清晰,而且便于维护和扩展,因为每个拦截器都专注于自己的职责,而整个系统的流程则由Struts框架自动...

    \\(^_^)/ 模拟Struts2的AOP实现 (转)

    这篇博客文章将探讨如何模拟Struts2的AOP实现。 AOP的核心概念是切面(Aspect)、连接点(Join Point)、通知(Advice)和切入点(Pointcut)。在Struts2中,这些概念通过拦截器(Interceptor)来实现。拦截器是...

    struts2拦截器实现原理模拟 2013-8-8

    总的来说,Struts2拦截器是实现业务逻辑复用和控制流管理的强大工具。它们提高了代码的可维护性和可扩展性,使得开发者能够专注于业务逻辑,而不必关心底层的流程控制细节。通过这个2013年的模拟示例,你将有机会...

    struts2与spring实现简单登陆

    通过以上知识点的学习和实践,你将掌握如何使用Struts2和Spring构建一个简单的登录系统,理解这两个框架如何协同工作,以及如何在实际项目中应用这些技术。记得在实践中不断探索和学习,以便更好地应对复杂的Web开发...

    struts2+ibatis+Spring+Json+jquery

    通过这个项目,开发者可以学习到如何在Java Web环境中集成多种框架,理解MVC模式的工作原理,以及如何利用jQuery进行前端交互和处理JSON数据。同时,了解Spring如何管理Bean和事务,以及iBatis如何执行SQL查询,都是...

    struts2+spring整合的一个例子

    这个例子对于初学者来说是一个很好的实践,它涵盖了MVC模式、依赖注入、以及Java Web开发中的常见技术,有助于理解Struts2和Spring的整合工作原理。通过分析和运行这个例子,开发者可以深入学习这两款框架的协作方式...

    struts2.0中文帮助手册

    - **Interceptor(拦截器)**:拦截器是Struts2的一大特色,它们在Action调用前后执行,实现AOP(面向切面编程)的概念,如日志、事务管理、权限检查等。 3. **配置与约定优于配置**:Struts2支持XML配置和注解...

    struts2+spring+hibernate Demo

    Spring还提供了AOP(面向切面编程)支持,用于实现如日志、事务管理等功能。在Web开发中,Spring MVC是其Web层的一个模块,可以与Struts2协同工作,提供更灵活的控制层选择。 Hibernate是Java世界中流行的ORM框架,...

    Spring+Struts+Hibernate应用

    原理探索:模拟 Action 代理类实现 Spring+Struts (11.10) 这一节深入探讨了 Spring 如何通过代理机制实现对 Struts Action 类的支持,帮助开发者理解 Spring 整合 Struts 的底层原理。 #### 12. 开发增删改查的...

    简易OA办公系统源代码

    例如,用户认证和授权可能通过Spring Security实现,工作流则可能使用Activiti或Flowable等开源工作流引擎。这些功能的实现都需要对SSH框架有深入理解,并且需要配合数据库设计和SQL优化。 总结起来,"简易OA办公...

    struts整合spring开发实例(二)

    这个"struts整合spring开发实例(二)"将继续上一部分的讲解,旨在帮助开发者理解这两个流行框架协同工作的机制。 Struts是一个强大的MVC(模型-视图-控制器)框架,用于构建可维护性高、结构清晰的Java Web应用。而...

    Struts2_Spring3_hibernate3_s2hh

    Struts2、Spring3和Hibernate3(简称s2hh)是Java开发中的三大神器,它们各自在MVC模式、依赖注入和持久化层提供了强大的支持。本文将深入探讨这三者的整合应用及其核心知识点。 一、Struts2:MVC框架新秀 Struts2...

    Struts2.1.8+Spring2.5.6+Hibernate3.3.2项目整合

    插入指定数量的随机测试数据是为了便于测试和调试,模拟真实环境下的数据流。这样的数据集可以帮助开发者检查业务逻辑是否正确,以及查询和分页功能是否正常运行。 总的来说,SSH项目整合是一项复杂但标准的Java ...

    ssh_简单的ATM模拟取款demo

    这个"ssh_简单的ATM模拟取款demo"是一个基于这些框架构建的简单ATM机模拟程序,用于演示如何在实际应用中整合这三个组件。 **Struts2** 是一个强大的MVC(Model-View-Controller)框架,它简化了Web应用程序的开发...

    基于struts-spring-hibernate的轻量级登陆J2EE开发

    这个"基于struts-spring-hibernate的轻量级登陆J2EE开发"项目着重于实现一个用户登录系统,以下是关于这个项目的关键知识点: 1. **Struts框架**:Struts是Apache组织的一个开源MVC框架,它为Java Web应用提供了一...

    模拟当当网 - SSH

    在 SSH 结构中,Spring 用于管理对象的生命周期和依赖关系,可以整合其他框架,如 Struts 和 Hibernate,提供事务管理,以及实现服务层和数据访问层的解耦。 3. **Hibernate**:Hibernate 是一个对象关系映射(ORM...

    JAVA 开发内容管理系统(hibernate3+struts2+spring2)130224.zip

    这是一个基于JAVA技术栈开发的内容管理...以上就是基于Hibernate3、Struts2、Spring2的JAVA内容管理系统的主要技术特点和工作原理。这个系统展示了Java Web开发的成熟技术栈,对于理解当时流行的开发实践具有参考价值。

    HRSystem_Eclipse.zip_HRSystem_HRSystem_Eclipse_ssh 审核

    【描述】中的“一个简单的工作流框架案例”意味着这个项目是为了演示如何在实际应用中实现工作流管理。工作流是指业务过程中的任务分配、审批、流转等自动化处理,它可以帮助企业更有效地管理日常运营。在这个...

    jqueryvalidate(猫冬)+spring3.0+struts2.18+hibernate3整合资源包

    它可能包含相关的Java类,用于模拟用户登录和注册的流程,检验Struts 2的动作(Action)配置、Hibernate的数据持久化以及Spring的事务管理是否正常工作。通过这个测试,开发者可以确保系统的关键功能——用户身份...

Global site tag (gtag.js) - Google Analytics