zoukankan      html  css  js  c++  java
  • struts2重点——ValueStack和OGNL

    一、值栈(ValueStack)

    1.实现类:OGNLValueStack

    2.对象栈:CompoundRoot(针对的是类级别的)

    (1)继承自 ArrayList —— 先进后出

    (2)提供了栈的几个操作:peek() 返回栈顶对象,pop() 弹出栈顶对象,push() 将对象压入栈顶

    (3)默认情况下,会将当前 Action 对象压入栈顶。通过这个 Action 对象,可以访问到该 Action 的所有属性以及错误信息。

    (4)获取方式

    可以通过 ValueStack 对象的 getRoot() 方法来获取到。

    (5)页面中获取对象栈中的内容:

    结合 struts2 标签和 OGNL,不需要指定根,默认为值栈。唯一需要注意的一点是:会从指定下标开始向下查找第一个 属性,若不指定,则从栈顶开始向下找。

    如:<s:property value="[1].userName"/>

    3.Map栈(针对的是 action 级别的,方法级别的)(相当于一个容器,存放了所有的东西,所有东西的获取都可以从它里拿)

    (1)ActionContext 中的 context 就是 Map栈,和从 ValueStack 中获取的 context 是一个东西

    (2)内容:
    原生的 Web 资源,
    Web资源对应的 Map 对象(通过 ActionContext 获取 sessionMap 等,其实也是从 Map 栈中获取的)
    ValueStack 对象
    Action 类运行相关的环境信息

    (3)获取方式:
    后台:Map<String, Object> context = ActionContext.getContext().getValueStack().getContext();

    (4)页面中获取 Map 栈中的数据:

    结合 Struts2 标签和 OGNL 来取值,指定 #。

    如:<s:property value="#request.requestAttrKey"/>

    (5)Map 栈结构如图:

    4.ValueStack 对象的获取方式:

    (1)通过 ActionContext 对象获得

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

    (2)通过读取请求域获取

    ValueStack valueStack = (ValueStack) request.get("struts.valueStack");

    (3)通过 ServletActionContext 获取

    ValueStack valueStack = ServletActionContext.getValueStack(ServletActionContext.getRequest());

    5.Struts2会为每一个请求创建一个 ValueStack 对象,保证了线程安全。

    对象栈是针对 Action 类或者手动压入栈顶的对象,而 map 栈针对的是一个 action 请求,针对的是方法,在方法中我们可以得到的东西或者可以设置的东西,在map栈中就能够体现。

    二、OGNL(对象图导航语言)

    1.本身不属于 Struts2 ,是属于 Apache Common 下的一个子项目。ognl-3.0.6.jar,依赖 javassist-3.11.0.GA.jar

    2.未指定上下文,从根对象中读取数据:

    (1)从 root 对象中读取 rootProperty 属性:

    Object value = Ognl.getValue("rootProperty", root);

    (2)从 rootList 或是 rootArray 中读取 第一个 root 的 rootProperty 属性:

    Object value = Ognl.getValue("[0].rootProperty", rootList);

    (3)从 rootMap 中读取属性  rootMapKey01 对应的值:

    e1:

    Object depart02 = Ognl.getValue("rootMapKey01", rootMap);

    e2:

    HashMap<String, String> map = new HashMap<>();
    map.put("attr.name", "attr.value");
    Object value = Ognl.getValue("['attr.name']", map);

    3.同时指定了上下文(必须为一个Map对象)和根(为一个 List)

    (1)若指定了 #,则表示从 Map 中查找

    Object value = Ognl.getValue("#mapKey02.propertyName", map, rootList);

    (2)若没有指定 #,则表示从根中查找

    Object value = Ognl.getValue("[1].propertyName", map, rootList);

    4.调用非静态方法:

    Object value = Ognl.getValue("size()", list);

    5.调用静态方法:

    e1:

    Object value = Ognl.getValue("@java.lang.Math@PI", null);

    e2:

    Object value1 = Ognl.getValue("@java.lang.Math@floor('3.14')", null);
  • 相关阅读:
    MS CRM 2011的自定义和开发(10)——CRM web服务介绍(第一部分)——IDiscoveryService
    MS CRM 2011的自定义和开发(7)——视图编辑器(第二部分)
    MS CRM 2011 SDK 5.06版本已经发布
    MS CRM 2011的自定义和开发(11)——插件(plugin)开发(一)
    近来遇到的MS CRM 2011方面的几个问题
    MS CRM 2011的自定义与开发(6)——表单编辑器(第二部分)
    Microsoft Dynamics CRM 2011中,Lookup字段的赋值
    MS CRM 2011的自定义和开发(6)——表单编辑器(第三部分)
    Visual Studio 目标框架造成 命名空间“Microsoft”中不存在类型或命名空间名称“Crm”。是否缺少程序集引用中错误的处理
    一步步学习Reporting Services(二) 在报表中使用简单的参数作为查询条件
  • 原文地址:https://www.cnblogs.com/solverpeng/p/5646225.html
Copyright © 2011-2022 走看看