详细代码: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框架自动...
这篇博客文章将探讨如何模拟Struts2的AOP实现。 AOP的核心概念是切面(Aspect)、连接点(Join Point)、通知(Advice)和切入点(Pointcut)。在Struts2中,这些概念通过拦截器(Interceptor)来实现。拦截器是...
总的来说,Struts2拦截器是实现业务逻辑复用和控制流管理的强大工具。它们提高了代码的可维护性和可扩展性,使得开发者能够专注于业务逻辑,而不必关心底层的流程控制细节。通过这个2013年的模拟示例,你将有机会...
通过以上知识点的学习和实践,你将掌握如何使用Struts2和Spring构建一个简单的登录系统,理解这两个框架如何协同工作,以及如何在实际项目中应用这些技术。记得在实践中不断探索和学习,以便更好地应对复杂的Web开发...
通过这个项目,开发者可以学习到如何在Java Web环境中集成多种框架,理解MVC模式的工作原理,以及如何利用jQuery进行前端交互和处理JSON数据。同时,了解Spring如何管理Bean和事务,以及iBatis如何执行SQL查询,都是...
这个例子对于初学者来说是一个很好的实践,它涵盖了MVC模式、依赖注入、以及Java Web开发中的常见技术,有助于理解Struts2和Spring的整合工作原理。通过分析和运行这个例子,开发者可以深入学习这两款框架的协作方式...
- **Interceptor(拦截器)**:拦截器是Struts2的一大特色,它们在Action调用前后执行,实现AOP(面向切面编程)的概念,如日志、事务管理、权限检查等。 3. **配置与约定优于配置**:Struts2支持XML配置和注解...
Spring还提供了AOP(面向切面编程)支持,用于实现如日志、事务管理等功能。在Web开发中,Spring MVC是其Web层的一个模块,可以与Struts2协同工作,提供更灵活的控制层选择。 Hibernate是Java世界中流行的ORM框架,...
原理探索:模拟 Action 代理类实现 Spring+Struts (11.10) 这一节深入探讨了 Spring 如何通过代理机制实现对 Struts Action 类的支持,帮助开发者理解 Spring 整合 Struts 的底层原理。 #### 12. 开发增删改查的...
例如,用户认证和授权可能通过Spring Security实现,工作流则可能使用Activiti或Flowable等开源工作流引擎。这些功能的实现都需要对SSH框架有深入理解,并且需要配合数据库设计和SQL优化。 总结起来,"简易OA办公...
这个"struts整合spring开发实例(二)"将继续上一部分的讲解,旨在帮助开发者理解这两个流行框架协同工作的机制。 Struts是一个强大的MVC(模型-视图-控制器)框架,用于构建可维护性高、结构清晰的Java Web应用。而...
Struts2、Spring3和Hibernate3(简称s2hh)是Java开发中的三大神器,它们各自在MVC模式、依赖注入和持久化层提供了强大的支持。本文将深入探讨这三者的整合应用及其核心知识点。 一、Struts2:MVC框架新秀 Struts2...
插入指定数量的随机测试数据是为了便于测试和调试,模拟真实环境下的数据流。这样的数据集可以帮助开发者检查业务逻辑是否正确,以及查询和分页功能是否正常运行。 总的来说,SSH项目整合是一项复杂但标准的Java ...
这个"ssh_简单的ATM模拟取款demo"是一个基于这些框架构建的简单ATM机模拟程序,用于演示如何在实际应用中整合这三个组件。 **Struts2** 是一个强大的MVC(Model-View-Controller)框架,它简化了Web应用程序的开发...
这个"基于struts-spring-hibernate的轻量级登陆J2EE开发"项目着重于实现一个用户登录系统,以下是关于这个项目的关键知识点: 1. **Struts框架**:Struts是Apache组织的一个开源MVC框架,它为Java Web应用提供了一...
在 SSH 结构中,Spring 用于管理对象的生命周期和依赖关系,可以整合其他框架,如 Struts 和 Hibernate,提供事务管理,以及实现服务层和数据访问层的解耦。 3. **Hibernate**:Hibernate 是一个对象关系映射(ORM...
这是一个基于JAVA技术栈开发的内容管理...以上就是基于Hibernate3、Struts2、Spring2的JAVA内容管理系统的主要技术特点和工作原理。这个系统展示了Java Web开发的成熟技术栈,对于理解当时流行的开发实践具有参考价值。
【描述】中的“一个简单的工作流框架案例”意味着这个项目是为了演示如何在实际应用中实现工作流管理。工作流是指业务过程中的任务分配、审批、流转等自动化处理,它可以帮助企业更有效地管理日常运营。在这个...
它可能包含相关的Java类,用于模拟用户登录和注册的流程,检验Struts 2的动作(Action)配置、Hibernate的数据持久化以及Spring的事务管理是否正常工作。通过这个测试,开发者可以确保系统的关键功能——用户身份...