`

关于struts2拦截器《一》

阅读更多

最近做日志功能模块,用到拦截器,所以对拦截器的用法稍微了解和总结了一点
关于拦截器及其原理,在这里就不详细讲了。在这里通过代码测试了解几个平时对于拦截器的模糊的地方。
  其一:自定义拦截器里面invocation.invoke()返回值到底是什么?
  其二:拦截器都是inter1-inter2-inter3-action-inter3-inter2-inter1 模式吗?也就是说,不管怎么样拦截器都会执行action里面的execute方法吗?
  其三:调用action里面set方法设值是在哪个环节?
  其四:核心调度器ActionInvocation 的作用?
  其五:拦截器中可以得到前台的数据吗?[size=x-large]


测试配置文件:
[size]
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>

    <constant name="struts.enable.DynamicMethodInvocation" value="false" />
    <constant name="struts.devMode" value="true" />

    <package name="default" namespace="/" extends="struts-default">
    
   <interceptors>
   <interceptor name = "in1" class = "com.xxg.intercepter.Inter1"></interceptor>
    <interceptor name = "in2" class = "com.xxg.intercepter.Inter2"></interceptor>
  
  <interceptor-stack name = "myinter">
     <interceptor-ref name = "in1"></interceptor-ref>
     <interceptor-ref name = "in2"></interceptor-ref>
     <interceptor-ref name="defaultStack"></interceptor-ref>
   </interceptor-stack>
   </interceptors>
       
        <action name="index" class = "com.xxg.action.LoginAction">
            <result name= "dd">
                /Test.jsp
            </result>
           <result name = "input" >
                /xxg.jsp
            </result>
            <interceptor-ref name = "myinter"></interceptor-ref>
        </action>
    </package>
</struts>


拦截器类
   //第一个拦截器
public class Inter1 extends AbstractInterceptor{

	@Override
	public String intercept(ActionInvocation arg0) throws Exception {


		System.out.println("--------before inter1 ------------");
		System.out.println("要拦截的Action为------"+arg0.getAction().toString());
		System.out.println("在第一个拦截器执行在aciton前,通过值栈得到action中name属性值----"+arg0.getStack().findString("name"));
		String result = arg0.invoke();
		System.out.println("inter1 resutlt其返回的值-------------"+result);
		System.out.println("--------after inter1 ------------");

		System.out.println("在第一个拦截器执行在aciton后,通过值栈得到action中name属性值"+arg0.getStack().findString("name"));
		return result;
	}

}

//第二个拦截器
public class Inter2 extends AbstractInterceptor{

	@Override
	public String intercept(ActionInvocation arg0) throws Exception {
		System.out.println("--------before inter2 ------------");
		System.out.println("要拦截的Action为------"+arg0.getAction().toString());
		System.out.println("在第一个拦截器执行在aciton前,通过值栈得到action中name属性值----"+arg0.getStack().findString("name"));
		String result = arg0.invoke();
		System.out.println("inter2 resutlt其返回的值-------------"+result);
		System.out.println("--------after inter2 ------------");

		System.out.println("在第一个拦截器执行在aciton后,通过值栈得到action中name属性值"+arg0.getStack().findString("name"));
		return result;
	}

}
//action 类
public class LoginAction extends ActionSupport{

	   private int id;
	   private String name;
	   
	public int getId() {
		return id;
	}
	public void setId(int id) {
		System.out.println("--------action set方法 ------------"+id);
		
		this.id = id;
	}
	public String getName() {
		
		return name;
	}
	public void setName(String name) {
		System.out.println("--------action set方法 ------------"+name);
		this.name = name;
	}
	   
	 public String execute(){
		 
		 System.out.println("execute invoked!!!");
		 
		 
		 return "dd";
	 }
	   
	
}
------------------------------------------------------
                   测试结果
--------before inter1 ------------
要拦截的Action为------com.xxg.action.LoginAction@81018b
在第一个拦截器执行在aciton前,通过值栈得到action中name属性值----null
--------before inter2 ------------
要拦截的Action为------com.xxg.action.LoginAction@81018b
在第一个拦截器执行在aciton前,通过值栈得到action中name属性值----null
--------action set方法 ------------22
--------action set方法 ------------erewr
execute invoked!!!
inter2 resutlt其返回的值-------------dd
--------after inter2 ------------
在第一个拦截器执行在aciton后,通过值栈得到action中name属性值----erewr
inter1 resutlt其返回的值-------------dd
--------after inter1 ------------
在第一个拦截器执行在aciton后,通过值栈得到action中name属性值----erewr
[size=medium][/size]



根据以上结论回答上面提到的问题:
1.拦截器里面的invocation.invoke()方法返回的是一个字符串,该字符串就是你要拦截的action 的execute()方法返回的字符串。

2.拦截器的2种类型:一种是通过调用invoke方法来指定对执行栈的进一步调度执行
另外一种:直接返回一个String类型的ResultCode来终止执行栈的调度执行;例如数据校验的validat拦截器,如果类型发数据校验错误直接不会执行action里面的execute()方法了,而是直接返回input字符串,所以要在配置文件配置结果类型名为input

3.在最后一个拦截器的之后,action执行execute()方法之前。
也就是inter1-inter2-inter3(调用action的set方法开始往里面设值)-action-inter3-inter2-inter1

4:Actioninvocation的操作接口中,有对action/actionProxy,ActionContext/ValueStake 的访问接口,这样当intercepter使用这样一个元素作为参数时,这样interceptor就可以随时与控制流和数据流的元素进行沟通。方便自己对interceptor和action对象构成的执行栈进行逻辑执行调度。

5:可以。当拦截器经过action返回后,在拦截器类中可以通过arg0.getStack().findString("name"))得到前台传来的参数。在经过action之前则得不到。

2
0
分享到:
评论

相关推荐

    Struts2拦截器(Interceptor)

    Struts2拦截器(Interceptor) Struts2拦截器(Interceptor)

    Struts2拦截器及其用法详细说明

    **一、什么是Struts2拦截器** 拦截器是基于AOP(面向切面编程)思想的组件,它可以理解为在Action调用前后插入的逻辑处理。在Struts2中,这些处理逻辑被封装在独立的类中,当请求到达Action之前,拦截器会按照预...

    struts2 拦截器

    2. **拦截器链**:在Struts2中,多个拦截器可以形成一个拦截器链,每个拦截器按照定义的顺序依次执行。如果所有拦截器都允许Action执行,那么Action的结果将被传递到下一个拦截器,直到整个链执行完毕。 ### 二、...

    struts2 拦截器实例

    2. **拦截器栈**:在Struts2中,拦截器可以组成一个栈,按照栈的顺序执行。当请求到达Action时,会先执行栈中的所有拦截器,然后执行Action,最后再按相反的顺序返回。 3. **配置拦截器**:拦截器可以通过Struts2...

    详解Struts2拦截器

    #### 一、Struts2拦截器概述 Struts2框架作为Java Web开发中的一种流行框架,其核心组件之一便是**拦截器**。拦截器不仅在Struts2中扮演着重要角色,更是整个框架灵活性与扩展性的基石。本文将深入探讨Struts2拦截...

    struts2拦截器

    标题“struts2拦截器”指的是Struts2框架中的拦截器机制,这是一个关键的组件,可以让我们在不修改实际业务代码的情况下,实现对请求处理流程的扩展和定制。 描述中提到的“基于struts2的拦截器测试,实现了页面的...

    Struts2 拦截器

    拦截器是Struts2框架的核心特性之一,它们扮演着处理请求、增强功能和实现业务逻辑的角色。在Struts2中,拦截器就像过滤器一样工作,通过链式调用在动作执行前后进行预处理和后处理。 首先,我们来理解一下拦截器的...

    Struts2拦截器.ppt

    Struts2拦截器.ppt Struts2拦截器.ppt Struts2拦截器.ppt

    Struts2拦截器实现权限控制demo

    这个demo对于初学者来说,是一个很好的起点,可以帮助他们理解如何在实际项目中结合Struts2的拦截器和权限控制来增强应用的安全性。在实际开发中,拦截器还可以用于日志记录、性能监控、事务管理等其他场景,极大地...

    struts2拦截器的使用方法

    Struts2框架中的拦截器(Interceptor)是一种重要的机制,用于在Action执行前后进行一系列处理,比如参数验证、数据预处理等。它能够帮助开发者更加灵活地控制程序流程,提高代码的复用性。 #### 二、Struts2拦截器...

    struts2拦截器应用小例子

    当请求到达控制器时,Struts2会依次调用这个栈中的拦截器,每个拦截器都有机会处理请求,然后决定是否将请求传递给下一个拦截器或直接返回响应。 创建一个简单的Struts2拦截器,你需要遵循以下步骤: 1. 创建拦截...

    Struts2拦截器源程序

    在Struts2中,拦截器扮演着至关重要的角色,它们是实现MVC(Model-View-Controller)架构的关键组件之一。拦截器允许开发者在动作执行前后插入自定义逻辑,比如日志记录、权限检查、数据验证等,而无需修改核心业务...

    Struts2拦截器原理分析

    2. **拦截**:当一个请求到达Action时,Struts2会根据配置的拦截器栈顺序,先调用每个拦截器的`intercept()`方法,然后才执行Action的业务逻辑。 3. **后处理**:Action执行完毕后,Struts2会逆序遍历拦截器栈,调用...

    Struts2拦截器源码

    首先,理解拦截器的定义:拦截器是AOP(面向切面编程)的一个概念,在Struts2中,拦截器是基于Java的动态代理机制实现的。它们是一系列实现了`Interceptor`接口的类,可以在Action执行前后插入额外的行为。这些行为...

    struts2拦截器实现拦截不文明字迹

    拦截器是Struts2框架的一个重要组成部分,能够帮助开发者实现一些在请求处理前后执行的通用逻辑,如日志记录、权限验证、数据校验等。在本场景中,我们将探讨如何使用Struts2拦截器来实现对不文明字迹或者敏感词汇的...

    Struts2学习案例(拦截器)

    在本学习案例中,重点在于Struts2的拦截器(Interceptor)功能,这是Struts2的核心特性之一,它允许开发者在Action执行前后进行自定义处理,实现了灵活的业务逻辑控制和增强的功能。 首先,我们来理解一下什么是...

    使用struts2拦截器对登陆权限验证

    在Struts2中,拦截器(Interceptor)扮演着至关重要的角色,它允许开发者在动作执行前后插入自定义逻辑,如日志记录、权限验证等。在本案例中,我们将深入探讨如何使用Struts2拦截器实现登录权限验证,同时结合...

    创建自己struts2拦截器

    Struts2是一个强大的MVC框架,它通过使用拦截器(Interceptor)来实现业务逻辑与表现层的解耦,提供了一种灵活的扩展机制。在Struts2中,拦截器是AOP(面向切面编程)的一种实现,它可以监控、修改或增强方法调用的...

    struts2拦截器国际化

    Struts2的拦截器是一种AOP(面向切面编程)的概念,它在Action调用前后执行特定的逻辑,如日志记录、权限验证、数据校验等。拦截器通过配置在struts.xml或struts-plugin.xml文件中,按照定义的顺序进行调用。每个...

    struts2拦截器实现权限控制

    2. 注册拦截器:在`struts.xml`配置文件中声明拦截器,并为它指定一个唯一的名称,以便在Action配置中引用。 3. 配置拦截器栈:Struts2使用拦截器栈的概念,即将多个拦截器组织成一个栈,按照栈的顺序依次执行。在`...

Global site tag (gtag.js) - Google Analytics