web项目中的执行流程参数传递详解-值栈


还是从这个图开始讲解:

struts2中有一个存放数据的中心:ActionContext(继承Map接口,且Struts2将ActionContext作为OGNLContext),AchtionContext中有值栈(ValueStack)和

ServeletContext,Session,Request,attr,Parameters等对象,其中ValueStack是根对象(Root Object),ValueStack中的每一个属性对象都是根对象。

使用OGNL表达式访问根对象的属性时,可以不加'#',并将对象名称省略。

首先:值栈的作用范围是一个请求:request作用域(一个请求是代表的一个过程,即页面点击到数据返回到页面的一个过程)

这个图的原理是这样子的:

(1)当页面发出请求的时候首先会自动创建一个值栈,然后进行初始化(这里所谓的初始化就是先向值栈中放入一个些东西:什么东西呢?ActionContext中会放入如图所示的jsp的内置对象,对象栈中存放的是action或者其他的,这些东西都是准备来装载数据的)

(2)初始化后的值栈中已经存在了一些东西,但是这些很多都是空的,需要我们继续向里面装载内容。请求发出的前后会经过一系列的拦截器:比如 ModelDriven(用来封装model对象)和Params(用来封装参数)。这个model对象怎么获取呢,这个可以看modelDriven的 源码:当我们创建一个action实例的时候,会实现ModelDriven类,此时会将这个实例对象比如Role (实例对象的数据从页面的参数中获取) 传递给ModelDriven,然后将 这个实例对象会作为model封装到值栈中,model默认放在对象栈的顶层。也就是说这个 role 对象此时已经在对象栈中了,当我们在页面填入一些有关 这个role类的属性内容的时候,这个model就获取到内容存入到对象栈中,也就是说页面填入的内容封装到了model中,我们在代码中可以直接使用。

第二个Params这个拦截器用来封装参数的,当我们的实例需要一些额外的参数的时候,我们可以在action中定义,然后这个参数会由 param拦截器拦截同样放入到对象栈中的action中,也就是说action中定义的参数我们也放入到了栈中。不要忘了:当定义了参数后,不要忘了使 用get和set方法来获取和设置值。

(3)其实这个是一个循环的过程,当经过action执行的时候,我们进行业务逻辑的实现,这个时候是从数据库中获取到一些数据,这些数据会通过 ActionContext存放到值栈中,然后在jsp页面通过某种方式来获取这个值,然后展示在页面,然后当点击页面请求的时候,这些数据都会显示出 来,在jsp页面定义一些访问的url,点击按钮的时候这个时候从数据库中获取的值也默认在此url中,然后又一轮循环开始。

参考文献:【1】http://www.cnblogs.com/fengli9998/p/6523930.html

【2】http://www.cnblogs.com/bdpsc/p/5859118.html

【3】http://blog.csdn.net/yu102655/article/details/52182801

【4】http://blog.csdn.net/yu102655/article/details/52179695

可参考如下代码理解值栈进行参数传递的方式:

public class BaseAction<T> extends ActionSupport implements ModelDriven<T> {
//必须实例化
    private T entity;
    
    public BaseAction(){
        //泛型转换
        Class entityClass = GenericTypeUtils.getGenericSuperClass(this.getClass());//通过工具类获取泛型的Class类
        try {
            entity = (T) entityClass.newInstance();//实例化
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    public T getModel() {
        return entity;
    }
   
}

优质内容筛选与推荐>>
1、随笔记录生活(一)沉默
2、part1:9-windows与Linux文件共享
3、leetcode 141 Linked List Cycle Hash fast and slow pointer
4、电子商务模式B2B/B2C/C2C
5、mysql调优参考笔记


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号