定义
struts2有很多默认的拦截器,modelDriven就是其中的一个,这是一个用于模型驱动的拦截器,当某个Action类实现了ModelDriven接口时,它负责把getModel方法的结果堆入ValueStack中。
这个拦截器类的实现源码如下:
public class ModelDrivenInterceptor extends AbstractInterceptor {
protected boolean refreshModelBeforeResult = false;
public void setRefreshModelBeforeResult(boolean val) {
this.refreshModelBeforeResult = val;
}
@Override
public String intercept(ActionInvocation invocation) throws Exception {
Object action = invocation.getAction();
//先判断action是否是ModelDriven类
if (action instanceof ModelDriven) {
//是,进行强转
ModelDriven modelDriven = (ModelDriven) action;
ValueStack stack = invocation.getStack();
//得到ModelDriven的模型
Object model = modelDriven.getModel();
if (model != null) {
//模型不为空,压入值栈
stack.push(model);
}
if (refreshModelBeforeResult) {
invocation.addPreResultListener(new RefreshModelBeforeResult(modelDriven, model));
}
}
return invocation.invoke();
}
//下面部分代码省略
}
从代码中我们可以看出,这个拦截器的作用就是将action类中的模型不为空的值压入值栈(ValueStack)之中。
我遇到的问题
背景
我在写一个项目的时候,用到了ModelDriven,项目中的一个页面,在一开始的时候,需要进行初始化显示一些已经存在的信息,我的方法是采用ajax去访问struts的action,并向数据库查询数据,把查询到的数据,封装在一个对象中,这个对象就是ModelDriven的model,然后js中得到这个对象,转化为json进行处理。
问题
每次第一次初始化页面的时候,获取到的数据总是null,但是刷新页面,再次访问的时候,就能得到数据,我在action的方法中也将对应的对象进行打印输出,也是有值的。
原因
经过查看struts框架的处理逻辑,发现struts在调用action的方法进行处理之前,先需要经过一些拦截器,问题就出在这了,也是我一开始没了解struts的逻辑(尴尬)。在我的请求去调用action中方法进行查询返回之前,需要先经过ModelDriven拦截器,这个时候ModelDriven就已经将model压入了值栈之中,而我的getModel方法自己判断如果是null,那么就new一个model放回,而这个new的model初始值都是空的,所以返回的都是空。