struts2之ModelDriven的使用问题

定义

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初始值都是空的,所以返回的都是空。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值