.从ActionSupport继承的基类中,获取全部request值:
public abstract class BaseAction extends BaseAction {
//自动注入request的参数,到日志
Map<String,String[]> params = getRequest().getParameterMap();
if(params!=null && params.size()>0) {
for(String key : params.keySet()){
extInfo.put(key,Arrays.toString(params.get(key)));
}
}
2.拦截器,执行后拦截action返回值:
public class DefaultParamInterceptor extends AbstractInterceptor {
@Override
public String intercept(ActionInvocation actioninvocation) throws Exception {
String result = actioninvocation.invoke();
Object a2 = actioninvocation.getStack().findValue("message");
System.out.println(a2);
return result;
}
}
。。这两段用来记日志,当然是比较爽的了,呵呵。
3.拦截器里面获取request
HttpServletRequest request = ServletActionContext.getRequest();
这样就不需要绕来绕去了
4. ActionInvocation.getAction()也是一个比较有趣的方法, 通过这里拿到当前action的类名,那么我们就可以用规则来匹配,使得拦截器只拦截指定action。
5. Filter 在Interceptor 之前执行。 因为Filter是servlet规范,对request做处理;而Interceptor只是struts2Action 代理实例之后的方法拦截器。
6. Interceptor 分Action执行前拦截,执行后拦截。 执行前拦截比较好理解,Interceptor配置越靠前,就越先执行。
执行后拦截呢???? 留作思考把,呵呵。
notice:
7.Interceptors must be stateless and not assume that a new instance will be created for each request or Action. Interceptors may choose to either short-circuit the ActionInvocation
execution and return a return code (such as Action.SUCCESS
), or it may choose to do some processing before and/or after delegating the rest of the procesing using ActionInvocation.invoke()
.
拦截器并不是线程安全的,也不保证每次请求都会实例化新对象,所以一定不要将拦截器做成有状态,简单说,就是不要定义类范围的变量。