初窥struts2(二)OGNL表达式
Struts2总结
Struts2完整的处理流程:
1 客户端发送请求,交给struts2控制器(StrutsPrepareAndExecuteFilter)。
2 Filter控制器进行请求过滤,如果是/actionName.action,/actionName(默认)两种格式请求,执行后给Action处理。
3 Filter控制器创建一个ValueStack对象,讲Action对象压入栈顶,将request,session,application等对象装入Context区域。
4 Filter控制器执行拦截器的前期处理(默认调用defaultStack拦截器栈)。
5 Filter控制执行Action对象的业务处理方法(默认执行execute方法)。
6 Filter控制器执行Result对象的处理方法execute,调用视图组件生成响应信息。
7 如果是JSP视图,讲JSP中的标签和EL元素解析成原始HTML响应信息。
8 Filter控制器执行拦截器的后续处理。
9 将响应的信息输出客户端浏览器。
以上是struts2的处理流程,在整个处理过程中ValueStack(值栈)里面存储着一次Action请求响应的所有数据,ValueStack贯穿着着整个处理流程。所以理解StackValue整个数据结构非常重要,要理解ValueStack这个数据结构就要先理解OGNL表达式。
OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言(Expression Language,简称为EL),通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。它使用相同的表达式去存取对象的属性。
  OGNL可以让我们用非常简单的表达式访问对象层,例如,当前环境的根对象为user1,则表达式person.address[0].province可以访问到user1的person属性的第一个address的province属性。
  这种功能是模板语言的一个重要补充,象jsp2.0,velocity,jelly等等,都有类似的功能,但是ognl比它们完善得多,而且以一个独立的lib出现,方便我们构建自己的框架。
  webwork2和现在的Struts2.x中使用OGNL取代原来的EL来做界面数据绑定,所谓界面数据绑定,也就是把界面元素(例如一个textfield,hidden)和对象层某个类的某个属性绑定在一起,修改和显示自动同步。
  和struts1.x的formbean相比,这样做的好处非常明显:在webwork中不需要为每个页面专门写formbean,可以直接利用对象层的对象。例如在对象设计中,我们的User和Person是分开的,而一个注册用户界面需要填写两者的内容,在webwork中,就可以保持后台的对象结构,把属于用户属性的界面元素用user.person.xxx绑定,把属于账号属性的界面元素用user.xxx绑定。
OGNL - Struts 2中的OGNL
OGNL(Object-Graph Navigation Language),可以方便地操作对象属性的开源表达式语言,使页面更简洁; 
支持运算符(如+-*/),比普通的标志具有更高的自由度和更强的功能; 
Struts 2默认的表达式语言是OGNL,原因是它相对其它表达式语言具有下面几大优势:
支持对象方法调用,如xxx.doSomeSpecial(); 
支持类静态的方法调用和值访问,表达式的格式为@[类全名(包括包路径)]@[方法名 | 值名],例如:@java.lang.String@format('foo
%s', 'bar')或@tutorial.MyConstant@APP_NAME; 
支持赋值操作和表达式串联,如price=100, discount=0.8, calculatePrice(),这个表达式会返回80; 
访问OGNL上下文(OGNL context)和ActionContext; 
操作集合对象。
OGNL表达式的常用用法
输出基本类型的属性(包括String)的属性如id,name
输出数组的元素array[0]
输出List集合的元素:List[0]
输出Map集合的元素:map.key
或者map[‘key’]
创建List集合:{1,2,3}
创建Map集合 #{1:’one’,2:’two’}
调用方法 list.size()
调用静态方法
@java.util.Arrays@toString(list)
投影操作:list.{name}返回的是集合类型
过滤操作:list.{?#this.id>5}
下面通过几个实例代码来演示:事例较多打包在ognltest中
在学OGNL表达式时
根对象 与 上下文对象 之间的关系 身边有些同学搞不明白之间的关系,我现在一个简单的例子来说明 根对象与上下文对象之间的关系:
上下文是用来描述根对象的相关联信息的,也可以说context对象是为root对象服务的。根对象可以不需要上下文对象单独存在,但有些时候离开了上下文对象根对象就有点不完整。
我们把根对象比作一个人,他的年龄,身高,肤色等这些是他的属性,而他的收入,背景,学历,等这些都是上下文对象。一个人可以不需要背景,学历,但没有这些他在这个社会就有点不完整。
理解OGNL引擎的基本结构
OGNL涉及几个基本概念:
1
OGNL引擎—负责计算OGNL表达式得到的相应的结果。
2 root对象—OGNL引擎所操作的对象。
3 context对象—将OGNL相关联的数据封装在Context对象,context对象实际是一个Map集合。
使用或读取root对象中的属性:
Ognl.getValue(“ognl表达式”,root对象);
Ognl.getValue(“ognl表达式”,context对象,root对象);
使用或读取context对象的数据
Ognl.getValue(“#名称”,context对象,root对象)
使用 #名称 获取上下文对象中的值

XWork对OGNL的扩展:
1 OGNL引擎。
2 context对象
3compoundRoot对象,OGNL引擎所操作的对象;复合根对象,可以包含多个root对象,多个root对象存储在复合根的堆栈结构中,OGNL引擎获取属性从栈的顶部开始寻找对应的属性。

后续介绍结合struts2源代码介绍Action请求
初窥struts2(二)OGNL表达式的更多相关文章
- Struts2的OGNL表达式语言
		
一.OGNL的概念 OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者 ...
 - struts2(四) ognl表达式、值栈、actionContext之间的关系
		
今天来说说ognl表达式在struts2中的运用. --wh 一.什么是Ognl? 通过百度百科查询到的解释,其中详细的说明了OGNL的作用. 下面我们就对OGNL这5个作用进行讲解 1.存取对象的任 ...
 - Struts2之 OGNL表达式和值栈
		
技术分析之OGNL表达式概述(了解) 1. OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写 * 所谓对象图,即以任意 ...
 - struts2:OGNL表达式之#、%、$符号运用
		
1. OGNL表达达符号"#" 1.1 #用于访问OGNL上下文和Action上下文,#相当于ActionContext.getContext() 注意:当系统创建了Action实 ...
 - Struts2中OGNL表达式的用法
		
今天分享的是Struts2框架中的一种ognl表达式语言,主要分两个目标去学习 1.理解struts2传值的优先级 2.ognl与el的区别 一:ognl表达式语言简介 OGNL的全称是O ...
 - struts2  与 OGNL 表达式,jsp中 利用ognl 在valuestack中取值
		
在Struts2中,一个请求在终于到达Action的方法之前,Action对象本身会被压入ValueStack(实际上就是放到ValueStack的CompoundRoot中),所以Action对象是 ...
 - Struts2之OGNL表达式
		
OGNL(Object-Graph Navigation Language的简称),对象图导航语言,它是一门表达式语言,除了用来设置和获取Java对象的属性之外,另外提供诸如集合的投影和过滤以及lam ...
 - struts2:OGNL表达式,遍历List、Map集合;投影的使用
		
OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言(Expression Language,简称为EL),通过它简单一致的表达式语法,可以存 ...
 - java之struts2之OGNL表达式
		
struts2推荐使用ognl表达式 ognl: object graph navigation language 对象导航图语言 如:school.teacher.address="北京& ...
 
随机推荐
- Solr使用solr4J操作索引库
			
Solrj是Solr搜索服务器的一个比较基础的客户端工具,可以非常方便地与Solr搜索服务器进行交互.最基本的功能就是管理Solr索引,包括添加.更新.删除和查询等.对于一些比较基础的应用,用Solj ...
 - Json序列化、反序列化互换
			
// 序列化 using (MemoryStream stream = new MemoryStream()) { serializer.WriteObject(stream, hdm); jsonT ...
 - Error parsing XML: not well-formed (invalid token) 报错+R文件消失解决的方法
			
xml报错: 这个xml文件上右键source ->format 注意:res下的文件名称不能大写 R文件消失: 在攻克了其它问题的情况下(或者其它问题还没解决先凝视掉) 手动删除gen pro ...
 - 谈论C++当然结果
			
C++编程课程的考试已经结束.这是第一次OJCBT.摸着石头过河,考试没有给学生理解的说法.现在尘埃落定.一些交代. 先说大的成就的治疗原则.事实上,有很多的纠结. 按理说,合格的太,无法挂.但实际情 ...
 - Meth | phpstorm 2016.2 的最新破解方法(截止2016-8-1)
			
今天刚更新了phpstorm 2016.2版本,发现网上提供的破解地址都有问题,即*.lanyus.com及*.qinxi1992.cn下的全部授权服务器已遭JetBrains封杀. 最后网上找到一个 ...
 - Android AppWidget(转)
			
AppWidget不知道大家使用这个多不多,这个在手机上也叫做挂件,挂件也就是放在桌面方便用户进行使用的,从android1.6开始挂件支持一些简单的lauout和view,到了android4.0之 ...
 - 【分享】w32service table XPsp2
			
Ord Address fnAddr Symbols-------------------------------- [ 0] BF999280: BF93569A (win32k!Nt ...
 - sql server 各种函数
			
SQL2008 表达式:是常量.变量.列或函数等与运算符的任意组合. 1. 字符串函数 函数 名称 参数 示例 说明 ascii(字符串表达式) select ascii('abc') 返回 97 返 ...
 - Android开发手记(16) 数据存储一 SharedPreferences
			
Android为数据存储提供了五种方式: 1.SharedPreferences 2.文件存储 3.SQLite数据库 4.ContentProvider 5.网络存储 SharedPreferenc ...
 - 安装php时,make步骤报错make: *** [sapi/fpm/php-fpm] Error 1
			
安装PHP过程中,make步骤报错:(集中网络上各种解决方法) (1)-liconv -o sapi/fpm/php-fpm /usr/bin/ld: cannot find -liconv coll ...