• 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字段是不可见的

  • 相关阅读:
    TypeScript Handbook 2——接口1(翻译)
    TypeScript Handbook 1——基本类型(翻译)
    [转]AJAX 跨源 HTTP 请求
    [转] Delphi Socket Architecture
    handsontable的一种js继承方式
    test11
    test
    javascript代码风格
    maven创建web项目
    Oracle 11g R2 for Win10(64位)的安装注意点
  • 原文地址:https://www.cnblogs.com/onlywujun/p/2936593.html
Copyright © 2020-2023  润新知