zoukankan      html  css  js  c++  java
  • Struts2 和 OGNL

    1、ActionContext
     struts2 在每次执行Action之前都会创建新的ActionContext,ActionContext是线程安全

    的,也就是说在同一个线程里ActionContext里的属性是唯一的,这样我的Action就可以在多线程

    中使用。ActionContext中有个静态的ThreadLocal变量,用来存放每个Action的actionContext。
     ActionContext里有6个对象,分别是valueStack、parameters、request、session、

    application、attr。
    ActionContext:
    context map
    ------------
    |
    |--application
    |
    |--session
    |
    |--value stack(root) 
    |
    |--request
    |
    |--parameters
    |
    |--attr (searches page, request, session, then application scopes)
    |

     OGNL是一个对象,属性的查询语言。在OGNL中有一个类型为Map的Context(称为上下文)

    ,在这个上下文中有一个根元素 (root),对根元素的属性的访问可以直接使用属性名字,但是

    对于其他非根元素属性的访问必须加上特殊符号#。

      一个OGNL表达式,必须选择ActionContext中的一个对象作为根对象(root),默认情况

    下,是选择valueStack作为根对象,如果需要使用另外5个对象作为根对象,需要加上#前缀

     如<s:property value="#session.xxx" />如果不加#前缀,则默认使用valueStack作为根

    对象,这也是最常见的情况,即xxx,相当于 #valueStack.xxx。

    2、ValueStack(值栈)

     ValueStack中可以存储很多对象,它的一个特性是,它是一个虚拟对象,它可以将自己持

    有的对象的属性,当成是自己的属性

     比如说,ValueStack中有一个Action对象,而Action对象有一个name字段。那么当用OGNL

    表达式取name的值的时候,不需要${action.name},而是可以直接${name}
     ValueStack是一个栈的数据结构(FILO),最后进入值栈的对象,总是在ValueStack的栈

    顶,这个结论很重要,因为栈顶的元素的值,会覆盖栈底的同名元素的值。

     比如说,ValueStack的栈底是一个Action对象,持有一个name字段;栈顶是一个Model对

    象,也持有一个name字段,那么用${name},取出来的永远是Model对象的name字段,Action对象的

    name字段是不可见的

  • 相关阅读:
    Push&Pop压栈出栈(你知道栈里存了什么东西吗?)
    为啥不管什么错误系统总会进HardFault_Handler(),看完这篇文章你就明白!
    MLX90620红外矩阵传感器驱动(基于传感器管理组件)
    APDS-9960手势检测、接近检测、数字环境光感(ALS)和色感(RGBC)传感器驱动(基于传感器管理组件)
    DHT11数字温度湿度传感器驱动(基于传感器管理组件)
    es6的一些新特性(1)
    js let var const区别
    vue的双向数据绑定原理
    BFC的概念及作用
    JS多重判断 / ES6 includes
  • 原文地址:https://www.cnblogs.com/onlywujun/p/2936593.html
Copyright © 2011-2022 走看看