一、OGNL概述
1.1OGNL是对象图导航语言(Object-Graph Navigation Languaged)的缩写,他是一种功能强大的表达式语言,通过简单一致的表达式语法,可以存取Java对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型的转化功能。他使用相同的表达式去存取对象的属性。如果吧表达式看作一个带有语义的字符串,那么OGNL无疑成为了这个语义字符串与java对象之间沟通的桥梁。
1.2OGNL的要素
表达式:表达式是整个OGNL的核心,OGNL会根据表达式去对象中取值,所有的OGNL操作都是指对表达式解析后进行的。它表明了此次OGNL操作要做什么。表达式就是一个带有语法含义的字符串,这个字符串规定了操作的类型和操作的内容。OGNL支持大量的表达式语法,不仅支持这种“链式”对象访问路径,还支持在表达式中进行简单的计算。
根对象(ROOT):Root对象可以理解为OGNL的操作对象,表达式规定了“做什么”,而Root对象则规定了“对谁操作"。OGNL称为对象图导航语言,所谓对象图,就是以任意对象为根,通过OGNL可以访问这个对象关联的其他。
Context对象:实际上OGNL的取值还需一个上下文环境,设置了Root对象,OGNL可以对root对象进行取值或者写值等操作,root对象所在环境就是OGNL的上下文环境(Context)。上下文环境规定了OGNL的操作”在哪里进行“。上下文环境COntext是一个map类型的对象,在表达式中访问Context中的对象,需要使用”#”号加上对象名称,即“#对象名称”的形式。
二值栈的概述
在struts2里面提供本身一种存储机制,类似于域对象,是值栈,可以存值和取值 在action里面把数据放到值栈里面,在页面中获取到值栈数据 servlet和action区别 Servlet:默认在第一次访问时候创建,创建一次,单实例对象 Action:访问时候创建,每次访问action时候,都会创建action对象,创建多次 值栈存储位置 每次访问action时候,都会创建action对象 在每个action对象里面都会有一个值栈对象(只有一个)
注:每个action对象总只有一个值栈对象
2.1ValueStack是Struts的一个借口,字面意义为值栈,OgnlValueStack是ValueStack的一个实现类,客户端发起一个请求struts2架构会创建一个action‘对象实例,同时也创建一个OgnlValueStack值栈实例,OgnlValueStack会贯穿真个Action的生命周期,struts2中使用OGNL将请求Action的参数封装为对象存储到值栈中,并通过OGNL表达式读取值栈中的对象属性值。
2.2值栈的内部结构
在OgnlValueStack中包括两部分:
第一部分 root,结构是list集合一般操作都是root里面数据
第二部分 context,结构为map集合
注:可以在页面中使用<s:debug/>这个标签产看值栈结构和存储值。
三、对值栈的存取操作
3.1获取值栈对象
1.通过ActionContext对象获取值栈
ValueStack stack1 = ActionContext.getContext().getValueStack();
2.通过request获取值栈
ValueStack stack2 = (ValueStack) ServletActionContext.getRequest().getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY);
3.2对值栈的操作
1.向值栈中放数据:可以通过值栈的set,push方法或者在action中提供成员变量然后提供get方法即可。
2.从值栈中取数据:使用struts2的标签+ognl表达式获取值栈数据 <s:property value=”ognl表达式”/>
获取对象:
向值栈中放数据
在页面中获取
获取list集合:
第二种实现方式:
获取set方法向值栈中放入的数据:
获取push方法向值栈中放入的数据:
使用push方法设置值,没有名称,只有设置的值
向值栈放数据,把向值栈放数据存到数组里面,数组名称 top,根据数组获取值
EL表达式获取值栈数据:
底层增强request对象里面的方法getAttribute方法
(1)首先从request域获取值,如果获取到,直接返回
(2)如果从request域获取不到值,到值栈中把值获取出来,把值放到域对象里面
四、 OGNL的#,%的使用
4.11.使用#获取context里面的数据
4.12.演示向request域中放值,在页面用ognl获取
4.2%号的使用
在struts2标签里面使用ognl表达式,如果直接在struts2表单标签里面使用ognl表达式不识别,只有%之后才会识别。