关于struts2拦截器《一》

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

测试配置文件:
[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之前则得不到。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值