简单了解Struts2中的值栈

  1. 值栈对象
    用户提交Action请求后系统当即创建Action实例和值栈对象,Struts2中的值栈ValueStack是一个接口,其实现类为OgnlValueStack。其中最重要的两个属性是CompoundRoot root(本质是ArrayList,值栈操作时视其为栈)和transient Map<String, Object> context(OgnlValueStack将创建的map的引用传递给context)。

    Tips:transient关键字可以将一个类的指定属性忽略序列化传输。

    注意:root在值栈初始化时一同初始化(root是值栈的根属性),context则在root初始化时一同初始化。

    值栈与ActionContext的关系(互相包括):ActionContext可获取值栈中的valueStack对象
    值栈与值栈的context属性的关系:context通过值栈获取到上下文
    值栈的context属性与ActionContext的关系:context中存储ActionContext的引用

  2. 获取值栈
    值栈与Request的生命周期相同,可以使用Request.setAttribute(“key”, “valueStack”)将值栈存储至Request域中以延长其生命周期,并将该属性的key以常量的形式保存在ServletActionContext域对象(继承自ActionContext)中,经过此操作后在获取值栈对象前需要获取Request对象,再通过获取其key的方式获取到值栈对象
    在这里插入图片描述

    Tips:值栈的实质是Request域对象中的一个属性值,该属性的名称为struts.valueStack,该属性保存在ServletActionContext的STRUTS_VALUESTACK_KEY常量中。

    获取值栈的context属性(域对象中均为对象引用):ActionContext.getContext()
    在这里插入图片描述在这里插入图片描述
    为便捷访问值栈,Struts2将值栈对象置于名为context的Map中,通过OgnlValueStack的root初始化setRoot()可查看。
    在这里插入图片描述
    值栈便捷访问:ValueStack valueStack = ActionContext.getContext().getValueStack();

  3. 值栈的栈操作
    宏观上的值栈即包含根对象root与非根对象context,对于值栈的操作包括两方面,首先是向值栈中放入数据,其次是从值栈中读取数据。
    <s:debug/>:查看值栈和context中的数据
    在这里插入图片描述
    向root中显式放入数据(先获取到值栈对象,再向其中放入数据)
    ① Student stuA = new Student(“李荣浩”, 35);
        valueStack.push(stuA);
    ② Student stuB = new Student(“李荣浩”, 35);
        valueStack.getRoot().push(stuB);
    ③ Student stuC = new Student(“李荣浩”, 35);
        Map<String, Student> map = new HashMap<String, Student>();
        map.put(“stuC”, stuC);
        valueStack.push(map);
    ④ Student stuD = new Student(“李荣浩”, 35);
        valueStack.set(“stuD”, stuD);
    ⑤ Student stuE = new Student(“李荣浩”, 35);
        valueStack.getRoot().add(stuE);

    向root中隐式放入数据(无值栈操作代码,却有数据放入):操作action中的属性

    向context中显式放入数据
    ① ActionContext.getContext().put(“some”, “some_value”);
    ② ActionContext.getContext().getSession().put(“ses”, “ses_value”);
    ③ ActionContext.getContext().getApplication().put(“app”, “app_value”);

    向context中隐式放入数据:提交Action请求时携带的参数会自动存放到context的parameter属性中
    注意:
    ① context map含括application、session、value、stack(root)、action、request、parameters、attr
    ② #request.name底层是request.getAttribute(“name”),而#parameters.name底层是request.getParameter(“name”)

    root中数据的加载顺序:仅使用Action向context中放入某数据后,无论在页面中如何访问(带#访问context,否则访问root),均可获取到放入的值

    request中数据的加载顺序:#request.name经Struts2包装后的加载顺序是request域空间 → root → context

猜你喜欢

转载自blog.csdn.net/qq_44965393/article/details/111933079