zoukankan      html  css  js  c++  java
  • Strus2中关于ValueStack详解

    什么是ValueStack

    它是一个接口com.opensymphony.xwork2.util.ValueStack。我们使用它是将其做为一个容器,用于携带action数据到页面。在页面上通过ognl表达式获取数据。 
    valueStack主要是将action数据携带到页面上,通过ognl获取数据

    1.ValueStack有一个实现类叫OgnlValueStack. 
    2.每一个action都有一个ValueStack.(一个请求,一个request,一个action,一个valueStack) valueStack生命周期就是request生命周期。 
    3.valueStack中存储了当前action对象以及其它常用web对象(request,session,application.parameters) 
    4.struts2框架将valueStack以“struts.valueStack”为名存储到request域中。

    valueStack结构

    这里写图片描述 
    ValueStack中 存在root属性 (CompoundRoot) 、 context 属性 (OgnlContext )!并且context中含有root 
    * CompoundRoot 就是ArrayList 
    * OgnlContext 就是 Map

    list集合中存储的是action相关信息 
    map集合中存储的是相关映射信息,包含 paramters,request,session,application attr等。

    我们想要从list中获取数据,可以不使用#号.(它就是ognl的root) 
    如果从map中获取数据,需要使用#. (其实在struts2中的map–context其实就是ognlContext)

    结论: 
    ValueStack它有两部分 List Map 
    在struts2中List就是root Map就是ognlContext. 
    默认情况下,在struts2中从valueStack获取数据从root中获取。

    值栈对象的创建 ,ValueStack 和 ActionContext 是什么关系 ?

    valueStack是每一次请求时,都会创建.

    ActionContext ctx = ActionContext.getContext();
    if (ctx != null) {
        stack = ctx.getValueStack();
    }
    • 1
    • 2
    • 3
    • 4
    • 1
    • 2
    • 3
    • 4

    如何获得值栈对象?

    对于valueStack获取有两种方式:

    1.通过 request获取

    ValueStack vs=(ValueStack) ServletActionContext.getRequest().getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY);
    

    2.通过ActionContext获取.

    ValueStack vs=ActionContext.getContext().getValueStack();
    

    向值栈保存数据 (主要针对 root)

    主要有两个方法 
    push(Object obj)——->底层就是 root.add(0,obj) 将数据存储到栈顶。 
    set(String name,Object obj);—–>底层是将数据封装到HashMap中,在将这个HashMap通过push存储。

    在jsp中 通过 <s:debug /> 查看值栈的内容

    在JSP中获取值栈的数据

    root中数据不需要#,而context中数据需要#

    1.如果栈顶是一个Map集合,获取时,可以直接通过Map集合的key来获取value.

    <s:property  value="username"/>
    

    2.如果栈顶数据不是一个Map,没有key值,可以使用序号来获取。

    <s:property value="[0]">  从0的位置向下查找所有。
    
    <s:property value="[0].top"> 只查找0位置上数据。
    

    如何获取OgnlContext中数据: 
    request: <s:property value="#request.username"/> 
    session: <s:property value="#session.username"/> 
    application:<s:property value="#application.username"/> 
    attr: <s:property value="#attr.username"/> 
    parameters:<s:property value="#parameters.cid[0]"/>

  • 相关阅读:
    判断一个字符串是否为回文串
    读<大道至简>软件工程实践者的思想有感
    Java学习10.23(设置页面的编码方式1)
    Java学习10.25(javaweb在界面输出2)
    【搜索】C000_LG_奶酪(bfs)
    【并查集】B001_AW_自动程序分析(不要求顺序时的离散化)
    b_aw_信息传递 & 银河英雄传说(并查集暴力求环 / 记忆化 | 带权并查集)
    b_pat_团伙头目(并查集/dfs+字符串整形互相映射)
    【堆】C003_AW_接水问题(暴力 / 堆)
    【并查集】C002_AW_樱桃网 & 打击犯罪(最下生成树 / dfs / 并查集求连通块)
  • 原文地址:https://www.cnblogs.com/xtdxs/p/6527380.html
Copyright © 2011-2022 走看看