Struts 2 OGNL 对象访问

  在Struts 2应用中,视图页面可以通过标签直接访问Action的属性(实际上这是一种假象,类似于Web应用保持application、session、request、page这4个范围的“银行”一样,Struts自行维护一个特定范围的“银行”,Action将数据放入其中,而JSP页面可以从其中取出数据,表面上似乎JSP可以直接访问Action数据),当Action属性不是简单值(基本数据类型或String类型)时,而是某个对象甚至是数组,集合时,就需要使用表达式语言来访问这些对象、数组、集合的内部数据了,Struts利用OGNL表达式语言来实现这个功能。 实际上,OGNL不是真正的编程语言,只是一种数据访问语言。

每一个action实例都拥有一个ValueStack对象,其中保存了当前 action对象和其他相关对象.

  在Struts2中,采用标准命名的上下文(Context)来处理OGNL表达式。处理OGNL的顶级对象是一个Map(也叫context map),而OGNL在这个context中就是一个顶级对象(root)。在用法上,顶级对象的属性访问,是不需要任何标记前缀的。而其它非顶级的对象访问,需要使用#标记。
  Struts2框架把OGNL Context设置为我们的ActionContext。并且ValueStack作为OGNL的根对象。除value stack之外,Struts2框架还把代表application、session、request这些对象的Map对象也放到ActionContext中去。(这也就是Struts2建议在Action类中不要直接访问Servlet API的原因,他可以通过ActionContext对象来部分代替这些(Servlet API)功能,以方便对Action类进行测试!)
  Action的实例,总是放到value stack中。因为Action放在stack中,而stack是root(根对象),所以对Action中的属性的访问就可以省略#标记。但是,要访问ActionContext中其它对象的属性,就必须要带上#标记,以便让OGNL知道,不是从根对象,而是从其它对象中去寻找。
那么访问Action中的属性的代码就可以这样写

  <s:property value="postalCode"/>
其它ActionContext中的非根对象属性的访问要像下面这样写:
  <s:property value="#session.mySessionPropKey"/> or
  <s:property value="#session[‘mySessionPropKey‘]"/>

------------------------------------------------------------------------------------------------------------------------------------------------------------

  访问OGNL上下文和Action上下文,#相当于ActionContext.getContext();下表有几个ActionContext中有用的属性: 名称 作用 例子

parameters 包含当前HTTP请求参数的Map #parameters.id[0]作用相当于request.getParameterValues("id").get(0);

request 包含当前HttpServletRequest的属性(attribute)的Map #request.userName相当于request.getAttribute("userName")

session 包含当前HttpSession的属性(attribute)的Map #session.userName相当于session.getAttribute("userName")

application 包含当前应用的ServletContext的属性(attribute)的Map #application.userName相当于application.getAttribute("userName")

attr 用于按request > session > application顺序访问其属性(attribute) #attr.userName相当于按顺序在以上三个范围(scope)内读取userName属性,直到找到为止

时间: 2024-11-05 13:28:38

Struts 2 OGNL 对象访问的相关文章

struts与ognl结合

-----------------------------ognl表达式------------------------ OGNL:对象视图导航语言.  ${user.addr.name} 这种写法就叫对象视图导航.OGNL不仅仅可以视图导航.支持比EL表达式更加丰富的功能. 1.使用OGNL准备工作 1.1 导包 struts2 的包中已经包含了.所以不需要导入额外的jar包 1.2 代码准备 1.3 语法 1.3.1 基本取值 1.3.2 复值 1.3.3 调用方法 1.3.4 调用静态方法

struts2 ognl表达式访问值栈

1:简单的说,值栈是对应每一个请求对象的轻量级的数据存储中心,在这里统一管理着数据,供Action.Result.Interceptor等Struts2的其他部分使用,这样数据被集中管理起来而不凌乱. 简单的说,值栈能够线程安全的为每个请求提供公共的数据存取服务. 当有请求的时候,Struts2会为每个请求创建一个新的值栈,也就是说,栈和请求是一一对应的,不同的请求,值栈也不一样,而值栈封装了一次请求所有需要操作的相关的数据. 正是因为值栈和请求的对应关系,因此值栈能保证线程安全的为每个请求提供

Struts中OGNL的一些基本知识(#,${}等)

OGNL的概念: OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者调用对象的方法,能够遍历整个对象的结构图,实现对象属性类型的转换等功能. OGNL上下文实际上就是一个Map对象,由ognl.OgnlContext类表示.它里面可以存放很多个JavaBean对象. 原文地址:http://www.cnblogs.com/xly1208/archive/2011/11

MSSql Server 索引&#39;uq_f_userName&#39; 依赖于 列&#39;f_userName&#39;。由于一个或多个对象访问此列,ALTER TABLE ALTER COLUMN f_userName 失败

--需求有变,需要往t_login表的f_userName字段添加外国人名,之前设置的varchar(10)不够,商议决定改成varchar(30),执行的时候,提示消息 索引'uq_f_userName' 依赖于 列'f_userName'.由于一个或多个对象访问此列,ALTER TABLE ALTER COLUMN f_userName 失败.--原来,之前为了防止f_userName重复,添加了唯一索引uq_f_userName.--进行如下操作后,问题妥妥解决--表名:t_login(登

对【面向对象的类访问和对象访问的区别【this以及类访问】、静态成员的访问区别、类常量等、继承和重写、访问修饰限定符、冒泡排序】的总结

面向对象的总结1.首先面向对象的编程使用的都是使用对象作为处理对象而言[例如继承等情形,继承的本质来说,依旧针对的是对象]但是只有针对类的访问.静态成员以及访问修饰限定符时,针对的是类的概念 2.类内定义时,只有五种情形:类常量[const关键字定义并且使用类来调用]属性[这些属性和方法是针对该类实例的对象来调用]方法[在这种情形下使用$this进行指代作用环境(调用该方法的对象),只有继承中,子类实例的对象会向下传递到静态调用里]静态属性[用来作为实例该类的所有对象之间共享的数据.保存在类中]

JVM【第四回】:【对象访问】

介绍完Java虚拟机的运行时数据区后,我们就可以探讨在Java语言中,对象访问是如何进行的?如下面这句代码: Object obj = new Object(); 假设这句代码出现在方法体中,那"Object obj"这部分的语义将会反映到Java栈的本地变量表中,作为一个reference类型数据出现.而"new Object()"这部分的语义将会反映到Java堆中,形成一块存储了Object类型所有实例数据值的结构化内存,根据具体类型以及虚拟机实现的对象内存布局

Struts2系列:(5)与Servlet API解耦(Servlet相关对象访问)

在程序里面,讲究"高内聚,低耦合".Struts2采用MVC架构,使用Action来处理http请求并进行响应,而不使用Servlet. 但是,我们知道,Servlet的含义就是"服务器端的小应用程序",它包含了HttpServletRequest.HttpServletResponse.HttpSession和ServletContext等对象.当我们使用Struts2的Action处理Http请求时,虽然不用写Servlet,但是需要获取到Servlet相关的一

面向对象的类访问和对象访问的区别【this以及类访问】、静态成员的访问区别、类常量等、继承和重写、访问修饰限定符、冒泡排序

1.mysql封装类 在构造函数中定义初始化数据库连接的相关参数[因为实例化对象时传入的参数是该对象的唯一参数入口]但是不需要再构造函数中进行冗余定义,而是在构造函数中进行调用类中的其他方法的方式来实现构造函数的设置工作[这样的模块分离使逻辑更加简单] [重点]2.静态成员相当于每次实例化对象之间是有关系的[例如计数功能]因为每次实例化类时创建的对象占用的空间都是新创建的,这一点需要注意,所以同一个类下的对象之间的变量并没有交互的效果.[回想起当初函数中的静态局部变量的使用][延生到静态全局变量

Struts 2 OGNL Expression Tutorial with Examples

OGNL is Object Graph Navigation Language. OGNL is an expression that can set and get the property of java object. In struts 2 OGNL is used to associate Action class and UI components. OGNL uses a standard naming convention to evaluate the Expression.