Struts2框架与页面的数据交互(2)--OGNL表达式&ValueStack
3、Struts2框架与页面的数据交互(2)--OGNL表达式&ValueStack
上接Struts2矿街与页面的数据交互(1)--数据封装:https://blog.****.net/biggerchong/article/details/84564912
目录
3、Struts2框架与页面的数据交互(2)--OGNL表达式&ValueStack
3.6 ValueStack和ActionContext的关系
3.1 什么是OGNL
OGNL的全称是对象图导航语言(Object-Graph Navigation Language),它是一种功能强大的表达式语言,通过它简单一致的表达式语法可以存取Java对象的任意属性,调用Java对象的方法,同时能够自动实现必要的类型转换。如果表达式看作是一个带语义的字符串,那么OGNL无疑成为了语义字符串与Java对象之间沟通的桥梁。
3.2 OGNL的作用
Struts2默认的表达式语言就是OGNL,它具有以下特点:
- 支持对象方法调用
- 支持类静态方法调用和值访问
- 支持赋值操作和表达式串联
- 访问ONGL上下文(OGNLContext)和ActionContext
- 操作集合对象
ONGL的操作实际上就是围绕着OGNL结构的三要素而进行的:表达式(Expression)、跟对象(Root)、上下文环境(Context),下面分别讲解这三要素。
1、表达式(Expression)
表达式是整个OGNL的核心,OGNL会根据表达式取对象中的值,所有ONGL操作都是针对表达式解析后进行的。它表明了此次OGNL操作要“做什么”。表达式就是一个带有语法含义的字符串,这个字符串规定了操作的类型和操作的内容。OGNL支持大量的表达式语法,不仅支持这种“链式”对象访问路径,还支持在表达式中进行简单的计算。
2、根对象(Root)
Root对象可以理解为OGNL的操作对象,表达式规定了“做什么”,而Root对象规定了“对谁操作”。ONGL称为对象如导航语言,即以任意一个对象为根,通过OGNL可以访问与这个关联的其他对象。
3、上下文环境(Context)
实际上OGNL的取值还需要一个上下文环境,设置Root对象,OGNL可以对Root对象进行取值或写值等操作,Root对象所在环境是OGNL的上下文环境。上下文环境规定了OGNL的操作“在哪里进行”。上下文环境是一个Map类型的对象,在表达式中访问Context中的杜希昂,需要使用#号加上对象名称,即“#对象名称”的形式。
3.3 如何使用OGNL
OGNL如何访问对象的方法:
OGNL如何访问对象的静态方法:
3.4 什么是ValueStack
ValueStack是Struts2的一个接口,字面意思为值栈,OgnlValueStack实现了ValueStack的接口,客户端发起一个请求struts2架构就会创建一个OgnlValueStack值栈实例,OgnlValueStack贯穿整个Action生命周期,struts2中使用OGNL将请求Action的参数封装为对象存储到值栈中,并通过OGNL表达式读取值栈中的对象属性值。
3.5 ValueStack内部结构
ValueStack中有两个主要的区域:
1、root区域:就是一个ArrayList,里面一般放置对象,获取root的数据不需要加#
2、Context区域:就是一个Map,里面放置web开发的常用的杜希昂数据的引用,获取数据需要加#
- request
- session
- application
- parameter
- attr :最近查找,先从request再session依次查找数据
通常说的操作值栈,一般指的操作ValueStack中root区域
3.6 ValueStack和ActionContext的关系
ServletContext:servlet上下文
ActionContext:Action的上下文
当请求发送后,首先执行核心过滤器中doFilter方法,在方法内创建ActionContext,在创建ActionContext的方法内又创建了ValueStack对象,将ValueStack对象传递给ActionContext对象(值栈的引用);所以可以通过ActionContext获得ValueStack。
3.6.1 获取ValueStack
3.6.2 向ValueStack中存入数据
第一种:在Action中提供属性的get方法
默认情况下,会将Action对象压入到值栈中,Action的属性也会在值栈中。但是值栈中压入的对象都是在栈顶,如果在压入后又有其他操作压栈就无法读取到想要的值栈了(默认情况下读取栈顶对象)
第二种:使用ValueStack中本身的方法(重点)
3.6.3 页面中获得值栈数据
获取Root中数据(不用加#)
获取Context中数据(要加#)
3.6.4 EL为何能访问值栈数据?
在Struts2框架中对request.getAttribute(String name);进行了加强,使其可以支持EL访问。
3.7 OGNL中的特殊符号的作用
3.7.1 #号的作用
获取context中的数据
使用#号构建map集合(使用var就将对象放入context中了,所以要用#)
3.7.2 %号的作用
强制解析OGNL
<s:textfield name=”name” value=”%{#request.name}”/>
强制不解析OGNL(使用较少)
<s:property value=”%{‘#request.name’}”/>
3.7.3 $号的作用
在属性文件中使用$
在配置文件中使用$
下接Struts2框架:
-----谢谢阅读! -------知飞翀