Struts2—OGNL

  ognl:对象图导航语言。Object-Graph Navigation Language的缩写
 作用:可以通过它简单一致的语法,可以存取对象的属性、调用对象的方法、遍历整个对象的结构图、实现字段
 类型转化等功能
  1.ognl基本使用:
   A:常量与操作符
   <s:property value=" 'account' "/>  字符串常量
   <s:property value=" '7+1' "/>  操作符
   B:方法调用
   C:设置数值及表达式列表
   D:ognl访问 ValueStack:在OGNL中没有前缀就表示访问值栈  
   F:ognl访问ActionContext 可通过‘#’来访问除值栈之外的各种值,如:
    a.#parameters:当前请求参数 对应 request.getParameter(name)
    b.#request:请求作用域中的属性 对应request.getAttribute(name)
    c.#session:会话作用域中的属性 对应session.getAttribute(name)
    d.#application:应用程序作用域的属性
    e.#attr:按照页面page、请求request、会话session和应用Application的顺序,返回第一个符合条件的属性
 
  在引用时,需要加上‘#’,并指导范围,然后写出要引用的那个属性名。如:#paramters.username
 
 2.Ognl访问复杂对象
   A.访问域对象:也就是访问domain对象中的属性 。方式为:domain的实例.属性名 
    getter/setter优先是指:优先访问属性的get/set方法,若没有提供相应的get/set方法,才去直接访问属性,
  但此时属性必须定义为公共的(public)
  B.访问List或数组:访问时只需要指明索引即可访问数组或List中指定的元素。
  C.访问Map:通常的格式为 Map的名称['key的名称'].属性名(推荐) 也可以 Map的名称.key的名称.属性名
  D.组合使用:如在session中,有一个List作为session的属性,对应的key为‘users’,在List里面放的全是
              UserModel类型的对象,现在要访问其中的第三个元素的userID属性。
        实现步骤:
    a.要获取session中的key值为‘users’的list: #session['users'] 或 #session.users
    b.要取得第三个元素:#session['users'][2] 或 #session.users[2]
 c.要操作该对象的userid属性:#session['users'][2].userid 或 #session.users[2].userid
 
三、ActionContext 和 ServletActionContext
    ActionContext:它是Action执行时的上下文,Struts2每次执行都会创建新的ActionContext,在同一个线程里
                 ActionContext里面的属性是唯一的,所有ActionContext就可以在多线程中使用。
   1.ActionContext的线程安全性: 源码如下:
       public class ActionContext implements Serializable{
       static ThreadLocal actionContext =  new ThreadLocal();
    .......
    }
      ThreadLocal表示线程局部变量,它为每一个使用该变量的线程都提供一个变量值的副本,使每一个线程都可
 以独立改变自己的副本,而不会和其他线程的副本冲突。
      存放在ActionContext里的数据都是存放在这个ThreadLocal的属性中,而这个属性只会在对应的当前请求线程
 中可见,从而保证数据是线程安全的。

你可能感兴趣的:(Struts2—OGNL)