`
yanguz123
  • 浏览: 571240 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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

    博客分类:
  • Code
 
阅读更多

转自:http://rejoy.iteye.com/blog/1881180

 

  在Struts2中有拦截器的概念,通过它的拦截器可以拦截Action。Struts2的拦截器是通过AOP来实现的,在Spring也有类似的概念。下面的我们先来比较一下Struts2和Spring中AOP的东西。

 

AOP概念 Struts2 Spring
JoinPoint Action中方法的执行 符合条件方法的执行
Pointcut Action(不能自己指定) 可以通过正则或AspectJ表达式来指定
Advice Before、After、Around Before、After、Around
Aspect 拦截器 拦截器

 

     从上面的比较中可以看到,Struts2的AOP功能比较单一,只能拦截Action类中的方法。Spring的AOP是通过JDK动态代理或者CGLib来生成目标对象的代理对象,然后将增强功能(Aspect【包括了Advice和Pointcut】)织入到符合条件(Pointcut)的类的方法(JoinPoint)上。

     Struts2的AOP实现跟Filter的实现差不多,它有一系列的拦截器,称为拦截器栈,通过这些拦截器栈通过ActionInvocation的调度可以在Action中方法执行之前或执行做一些操作。原理图如下:

 


 

 

 

 

 

 

下面,用代码来模拟一下它的实现

   1.Action 接口

 

public interface Action {
	String execute();
}

 

 

    2.Interceptor接口

 

public interface Interceptor {
	String intercept(ActionInvocation invocation);
}

 

 

    3.ActionInvocation接口

 

public interface ActionInvocation {
	String invoke();
}

 

 

    4.调度器实现

 

import java.util.ArrayList;
import java.util.List;

public class DefaultActionInvocation implements ActionInvocation {

	private int index;
	private Action action;
	private List<Interceptor> interceptors = new ArrayList<Interceptor>();

	public void addInterceptor(Interceptor interceptor) {
		this.interceptors.add(interceptor);
	}

	public void setAction(Action action) {
		this.action = action;
	}

	@Override
	public String invoke() {
		String result = "";
		if (index == interceptors.size()) {
			result = this.action.execute();
		} else {
			Interceptor interceptor = interceptors.get(index);
			index++;
			System.out.println("拦截前:" + interceptor.getClass().getName());
			result = interceptor.intercept(this);
			System.out.println("拦截后:" + interceptor.getClass().getName());
		}
		return result;
	}
}

 

 

 

   5.拦截器实现

 

1).环绕通知拦截器
public class AroundInterceptor implements Interceptor {
	@Override
	public String intercept(ActionInvocation invocation) {
		System.out.println("AroundInterceptor拦截前通知:" + this.getClass());
		String result = invocation.invoke();
		System.out.println("AroundInterceptor拦截后通知:" + this.getClass());
		return result;
	}
}


2).异常通知拦截器
public class ExceptionInterceptor implements Interceptor {

	@Override
	public String intercept(ActionInvocation invocation) {
		System.out.println("ExceptionInterceptor拦截");
		return invocation.invoke();
	}
}


3).I18N烂机器
public class I18NInterceptor implements Interceptor {
	@Override
	public String intercept(ActionInvocation invocation) {
		System.out.println("I18NInterceptor拦截");
		return invocation.invoke();
	}
}

4).其他......

 

 

    6.Action实现

 

public class MyAction implements Action {
	@Override
	public String execute() {
		System.out.println("execute...");
		return "success:" + getClass();
	}
}

 

 

    7.测试调用

 

public class Test {

	public static void main(String[] args) {
		Interceptor exptionInterceptor = new ExceptionInterceptor();
		Interceptor i18nInterceptor = new I18NInterceptor();
		Interceptor aroundInterceptor = new AroundInterceptor();

		DefaultActionInvocation actionInvocation = new DefaultActionInvocation();
		actionInvocation.addInterceptor(exptionInterceptor);
		actionInvocation.addInterceptor(i18nInterceptor);
		actionInvocation.addInterceptor(aroundInterceptor);

		Action action = new MyAction();
		actionInvocation.setAction(action);

		String result = actionInvocation.invoke();
		System.out.println("Action 结果:" + result);
	}
}

 

 

 

测试结果:

拦截前:ExceptionInterceptor

ExceptionInterceptor拦截

拦截前:I18NInterceptor

I18NInterceptor拦截

拦截前:AroundInterceptor

AroundInterceptor拦截前通知:class AroundInterceptor

execute...

AroundInterceptor拦截后通知:class AroundInterceptor

拦截后:AroundInterceptor

拦截后:I18NInterceptor

拦截后:ExceptionInterceptor

Action 结果:success:class MyAction

 

可以看到添加进去的Interceptor像是一个栈一样,如果放进去的的Interceptor是BeforeAdvice类型的,则会在Action中的方法执行之前,执行增强操作;如果放进去的Interceptor是AroundAdvice类型的,则会在Action中的方法之前按照“进栈”的顺序执行增强操作,在Action方法执行之后,按照“出栈”的顺序执行增强操作

(1)拦截前:ExceptionInterceptor

       ExceptionInterceptor拦截

                     (2)拦截前:I18NInterceptor

                           I18NInterceptor拦截

                                            (3)拦截前:AroundInterceptor

                                                  AroundInterceptor拦截前通知:class AroundInterceptor

                                                                      (4)execute...

                                                  AroundInterceptor拦截后通知:class AroundInterceptor

                                             (3)拦截后:AroundInterceptor

                     (2)拦截后:I18NInterceptor

(1)拦截后:ExceptionInterceptor

Action 结果:success:class MyAction

 

分享到:
评论

相关推荐

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

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

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

    在Java中,Spring框架提供了强大的AOP支持,但Struts2也提供了一种简单的AOP实现,主要用于拦截Action执行前后的操作,比如日志记录、事务管理等。 在Struts2中实现AOP主要通过自定义拦截器来完成。首先,我们需要...

    Servlet简单模拟Struts2

    在本主题"Servlet简单模拟Struts2"中,我们将探讨如何利用Servlet来实现类似Struts2框架的一些关键功能,包括请求拦截、XML配置解析、动态代理以及日志拦截。 首先,让我们了解一下Struts2框架的核心特性。Struts2...

    自己模拟实现struts的dispatcherAction

    2. **模拟实现DispatcherAction**: 要模拟实现DispatcherAction,首先我们需要创建一个类,这个类将负责接收请求、解析配置信息以及调用目标Action。这个类可能包含以下方法: - `init()`: 初始化方法,用于加载...

    轻量级Java_EE企业应用实战_Struts_2+Spring_3+Hibernate整合开发_第3版

    《轻量级Java_EE企业应用实战_Struts_2+Spring_3+Hibernate整合开发_第3版》这本书深入探讨了在Java EE环境下如何利用轻量级框架Struts 2、Spring 3和Hibernate进行高效的企业级应用开发。这三者结合在一起,形成了...

    模拟struts

    在"模拟Struts"这个项目中,你可能已经尝试实现了Struts框架的核心功能,让我们深入探讨一下Struts的关键知识点。 1. **MVC设计模式**:MVC是一种将业务逻辑、数据和用户界面分离的设计模式。在Struts中,模型...

    Struts2SpringUnitDemo单元测试

    这两个框架都是Java Web开发中的关键组件,Struts2负责控制层逻辑,Spring则提供了全面的依赖注入(DI)和面向切面编程(AOP)功能,以及对数据访问层的支持。 1. **Struts2框架**:Struts2是一个开源的MVC框架,...

    利用struts2实现的网上购物模拟系统

    在这个“利用struts2实现的网上购物模拟系统”中,我们可以深入探讨以下几个核心知识点: 1. **Struts2框架**:Struts2作为MVC框架,提供了一种组织应用程序逻辑的方式。它处理HTTP请求,通过Action类将这些请求...

    spring+struts2整合源码

    Spring以其强大的依赖注入(DI)和面向切面编程(AOP)能力,而Struts2则以其优秀的MVC设计模式著称,两者结合可以构建出高效、可维护的Web应用。本文将基于"spring+struts2整合源码"的标题和描述,详细讲解Spring和...

    struts2-spring-plugin-2.3.4.jar

    7. **测试支持**:由于Action 由Spring 管理,我们可以更方便地进行单元测试和集成测试,无需模拟Struts 2 的请求环境。 总之,Struts2-Spring-plugin-2.3.4.jar 文件是实现Struts 2 和Spring 框架高效协同工作的...

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

    在Struts2中,拦截器是基于AOP(面向切面编程)思想的类,它们可以拦截用户的请求,执行预定义的操作,如日志记录、权限检查、事务管理等,然后将控制权传递给下一个拦截器或最终的目标Action。拦截器链的概念使得...

    struts2+spring练习

    Struts2提供了MVC(模型-视图-控制器)架构,帮助开发者更好地组织和管理应用程序逻辑,而Spring则是一个全面的后端框架,提供依赖注入、AOP(面向切面编程)、事务管理等特性。 在"Struts2+Spring练习"项目中,...

    Struts2_Spring3_hibernate3_s2hh

    Struts2提供了Mock Struts2工具,可以模拟请求,方便对Action进行单元测试。Hibernate则可以通过Session的clear()或flush()方法配合断言,对数据操作进行验证。 综上所述,Struts2_Spring3_Hibernate3的整合不仅...

    struts1+EJB3整合(AOP控制权限)

    在这个"struts1+EJB3整合(AOP控制权限)"的项目中,我们看到这两个框架是如何协同工作的,以及如何通过AOP(面向切面编程)来实现权限控制,并使用JUnit进行EJB3的单元测试。 首先,让我们深入理解AOP在权限控制中...

    struts2与spring实现简单登陆

    JUnit和Mockito可以用于测试Action和Service层的逻辑,而Struts2提供的模拟请求工具(MockStruts2)可以帮助我们测试Action的执行流程。 通过以上知识点的学习和实践,你将掌握如何使用Struts2和Spring构建一个简单...

    Struts2 Spring Jpa 配置测试

    Struts2、Spring和JPA是Java开发中常用的三大框架,它们在企业级应用开发中发挥着关键作用。Struts2作为MVC框架,负责控制应用程序的流程;Spring框架则是一个全面的后端解决方案,提供了依赖注入(DI)、面向切面...

    论坛系统(Struts 2+Hibernate+Spring实现)

    4. **搜索模块**:Struts 2可以配合Spring的AOP实现全局搜索功能,而Hibernate则提供对数据库的高效查询。 5. **界面展示**:使用Struts 2的Action和结果类型,结合JSP或FreeMarker模板技术,生成动态的用户界面。...

    Struts2和Struts1的不同

    StrutsTestCase提供了模拟Struts环境的功能,但这种方式仍然比较复杂。 **Struts2:** Struts2支持轻量级测试,通过Mock对象可以轻松地模拟出Action运行所需的环境。此外,Struts2还支持依赖注入,使得单元测试更加...

    ssh_简单的ATM模拟取款demo

    在这个ATM模拟取款系统中,Struts2负责处理用户请求,执行相应的业务逻辑,并将结果返回给用户。它的Action类对应于控制器,通过配置struts.xml文件来定义请求和响应的映射。此外,Struts2还提供了拦截器...

    SSh_Struts2_Test

    在实际的SSH_Struts2_Test项目中,可能包含了这些测试的实现和配置文件,如pom.xml(Maven配置文件),test.properties(测试配置文件),以及相关的Java测试类。通过分析这些文件,我们可以更深入地理解项目的测试...

Global site tag (gtag.js) - Google Analytics