Struts-ModelDriven拦截器

来源:互联网 发布:数据融合关键技术 编辑:程序博客网 时间:2024/06/09 18:19

  我们知道Action类的主要作用是定义action方法来请求,所以我们不希望Action也充当Model的作用,那样会显得代码特别的臃肿,不利于管理。所以将Action和Model分开是很有必要的。

  将Action和Model分开之后,我们需要将请求参数注入的肯定还是Model对象,但是我们知道请求参数是被ParamInterceptor拦截器放入值栈栈顶的对象当中的(从栈顶对象开始),所以我们需要在值栈栈顶放入一个Model的对象来存储数据。我们知道,当请求过来时,会先创建一个Action对象放入值栈栈顶,然后经过一系列的拦截器,将请求参数的值放入值栈栈顶的对象中,再走action方法,再到响应页面。在经过的拦截器中,有一个ModelDrivenInterceptor,这个拦截器会调用Action的getModel()方法(这个Action必须实现ModelDriven接口并重写getModel()方法),返回一个Model对象放入值栈栈顶。这样就将Model对象放在了Action对象的头上,就是栈顶。再调用paramInterceptor拦截器将请求参数放于这个栈顶对象Model的属性上即可。

  需要注意的是,getModel()方法只可以返回一个Model对象的引用变量,而不可以直接返回一个new Model(),这样即使在值栈栈顶放入了一个Model对象并且将请求参数的值放入了这个Model对象中,但是在Action类中并没有将这个对象注入到它的属性变量中,所以Action方法中也就无法使用了。

  下边我们来研究一下ModelDrivenInterceptor拦截器的源码:

  ① Interceptor方法:

  public String intercept(ActionInvocation invocation)
        throws Exception
    {

        获取Action对象

        Object action = invocation.getAction();

        判断这个Action对象是否是和ModelDriven同类型

        if(action instanceof ModelDriven)
        {

            如果是ModelDriven同类型的就将这个对象强转为ModelDriven类型的对象。

            ModelDriven modelDriven = (ModelDriven)action;

            通过传入的ActionInvocation对象获取值栈

            ValueStack stack = invocation.getStack();

            调用Action对象的getModel()方法,返回对象

            Object model = modelDriven.getModel();

            如果这个对象不为空

            if(model != null)

                将这个对象放到值栈的栈顶

                stack.push(model);

            ?????????????暂时不懂

            if(refreshModelBeforeResult)
                invocation.addPreResultListener(new RefreshModelBeforeResult(modelDriven, model));
        }

        再回调ActionInvocation对象的invoke()方法

        return invocation.invoke();
    }





























原创粉丝点击