• 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]"/>

  • 相关阅读:
    activeMQ
    @Autowired与@Resource的区别
    maven工程下get的URI中带中文名称乱码解决
    linux下安装jdk
    Redis集群之Jedis的使用
    格式化Json数据
    拷贝chrome控制台打印的对象
    为什么有的代码容易理解,有的难
    ant design pro总是跨域,proxy也没设置错误,原来是浏览器缓存,清理Chrome缓存就可以了
    VScode:保存格式化问题,ESLint插件和编辑器本身冲突
  • 原文地址:https://www.cnblogs.com/xtdxs/p/6527380.html
Copyright © 2020-2023  润新知