最近做日志功能模块,用到拦截器,所以对拦截器的用法稍微了解和总结了一点
关于拦截器及其原理,在这里就不详细讲了。在这里通过代码测试了解几个平时对于拦截器的模糊的地方。
其一:自定义拦截器里面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之前则得不到。
分享到:
相关推荐
Struts2拦截器(Interceptor) Struts2拦截器(Interceptor)
**一、什么是Struts2拦截器** 拦截器是基于AOP(面向切面编程)思想的组件,它可以理解为在Action调用前后插入的逻辑处理。在Struts2中,这些处理逻辑被封装在独立的类中,当请求到达Action之前,拦截器会按照预...
2. **拦截器链**:在Struts2中,多个拦截器可以形成一个拦截器链,每个拦截器按照定义的顺序依次执行。如果所有拦截器都允许Action执行,那么Action的结果将被传递到下一个拦截器,直到整个链执行完毕。 ### 二、...
2. **拦截器栈**:在Struts2中,拦截器可以组成一个栈,按照栈的顺序执行。当请求到达Action时,会先执行栈中的所有拦截器,然后执行Action,最后再按相反的顺序返回。 3. **配置拦截器**:拦截器可以通过Struts2...
#### 一、Struts2拦截器概述 Struts2框架作为Java Web开发中的一种流行框架,其核心组件之一便是**拦截器**。拦截器不仅在Struts2中扮演着重要角色,更是整个框架灵活性与扩展性的基石。本文将深入探讨Struts2拦截...
标题“struts2拦截器”指的是Struts2框架中的拦截器机制,这是一个关键的组件,可以让我们在不修改实际业务代码的情况下,实现对请求处理流程的扩展和定制。 描述中提到的“基于struts2的拦截器测试,实现了页面的...
拦截器是Struts2框架的核心特性之一,它们扮演着处理请求、增强功能和实现业务逻辑的角色。在Struts2中,拦截器就像过滤器一样工作,通过链式调用在动作执行前后进行预处理和后处理。 首先,我们来理解一下拦截器的...
Struts2拦截器.ppt Struts2拦截器.ppt Struts2拦截器.ppt
这个demo对于初学者来说,是一个很好的起点,可以帮助他们理解如何在实际项目中结合Struts2的拦截器和权限控制来增强应用的安全性。在实际开发中,拦截器还可以用于日志记录、性能监控、事务管理等其他场景,极大地...
Struts2框架中的拦截器(Interceptor)是一种重要的机制,用于在Action执行前后进行一系列处理,比如参数验证、数据预处理等。它能够帮助开发者更加灵活地控制程序流程,提高代码的复用性。 #### 二、Struts2拦截器...
当请求到达控制器时,Struts2会依次调用这个栈中的拦截器,每个拦截器都有机会处理请求,然后决定是否将请求传递给下一个拦截器或直接返回响应。 创建一个简单的Struts2拦截器,你需要遵循以下步骤: 1. 创建拦截...
在Struts2中,拦截器扮演着至关重要的角色,它们是实现MVC(Model-View-Controller)架构的关键组件之一。拦截器允许开发者在动作执行前后插入自定义逻辑,比如日志记录、权限检查、数据验证等,而无需修改核心业务...
2. **拦截**:当一个请求到达Action时,Struts2会根据配置的拦截器栈顺序,先调用每个拦截器的`intercept()`方法,然后才执行Action的业务逻辑。 3. **后处理**:Action执行完毕后,Struts2会逆序遍历拦截器栈,调用...
首先,理解拦截器的定义:拦截器是AOP(面向切面编程)的一个概念,在Struts2中,拦截器是基于Java的动态代理机制实现的。它们是一系列实现了`Interceptor`接口的类,可以在Action执行前后插入额外的行为。这些行为...
拦截器是Struts2框架的一个重要组成部分,能够帮助开发者实现一些在请求处理前后执行的通用逻辑,如日志记录、权限验证、数据校验等。在本场景中,我们将探讨如何使用Struts2拦截器来实现对不文明字迹或者敏感词汇的...
在本学习案例中,重点在于Struts2的拦截器(Interceptor)功能,这是Struts2的核心特性之一,它允许开发者在Action执行前后进行自定义处理,实现了灵活的业务逻辑控制和增强的功能。 首先,我们来理解一下什么是...
在Struts2中,拦截器(Interceptor)扮演着至关重要的角色,它允许开发者在动作执行前后插入自定义逻辑,如日志记录、权限验证等。在本案例中,我们将深入探讨如何使用Struts2拦截器实现登录权限验证,同时结合...
Struts2是一个强大的MVC框架,它通过使用拦截器(Interceptor)来实现业务逻辑与表现层的解耦,提供了一种灵活的扩展机制。在Struts2中,拦截器是AOP(面向切面编程)的一种实现,它可以监控、修改或增强方法调用的...
Struts2的拦截器是一种AOP(面向切面编程)的概念,它在Action调用前后执行特定的逻辑,如日志记录、权限验证、数据校验等。拦截器通过配置在struts.xml或struts-plugin.xml文件中,按照定义的顺序进行调用。每个...
2. 注册拦截器:在`struts.xml`配置文件中声明拦截器,并为它指定一个唯一的名称,以便在Action配置中引用。 3. 配置拦截器栈:Struts2使用拦截器栈的概念,即将多个拦截器组织成一个栈,按照栈的顺序依次执行。在`...