框架 ---Struts2 no 03.
OGNL
1.1.1OGNL概述
1.1.1.1什么是OGNL ##
OGNL
**OGNL:**对象图导航语言,比EL表达式强大很多倍的语言。
** EL:**从域中对象中获取数据,从EL的11个对象中获取。{pageContext.request.contextPath}
** OGNL:**调用对象的方法,获取Struts2的值栈的数据。OGNL其实是第三方的表达式语言。
Img(访问OGNL上下文)
1.2.1OGNL使用的要素
表达式:
根对象
Context对象:
/*
* OGNL调用对象的方法
* */
1.2.2OGNL在Java环境入门(了解)
/*
* 访问对象的静态方法
* /
/
* 访问Root中的数据
* */
/*
* 访问context中的数据 需要加#
* */
1.2.3OGNL在Struts2环境下的入门
调用对象的方法
调用对象的静态方法
(需要在defualt.properties中找到对应的开启属性方法)
1.3ValueStack(值栈)
1.3.1值栈的概述
1.3.1.1什么是值栈
Img
ValueStack其实类似于一个数据中转站(Struts2的框架当中的数据就都保存到了ValueStack中)。
ValueStack接口,实现类OnglValueStack对象。
ValueStack贯穿整个Action的生命周期。(Action一旦创建了,框架就会创建一个ValueStack对象)。
1.3.1.2值栈的内部结构
Valuestack中有两个主要的区域:
Root区域:其实就是一个ArrayList。里面一般放置对象。获取root的数据不需要加#。
Context区域:其实就是一个Map。里面放置是web开发的常用的对象数据的引用。获取context数据需要加#。
Reques
Session
Application
Parameter
Attr
所说的操作值栈,通常指的是操作的ValueStack中的root区域。
1.3.1.3值栈与ActionContext的关系
ServletContext:Servlet的上下文。
ActionContext:Action的上下文。
通过源代码可以看到:当请求过来的时候,执行过滤器中doFilter方法,在这个方法中创建ActionContext,在创建ActionContext过程中,创建ValueStack对象,讲ValueStack对象传递给ActionContext对象。所有可以通过ActionContext互殴去值栈对象。
ActionContext对象之所以能够访问Servlet的API(访问是域对象的数据)。因为在内部有值栈的引用
1.3.1.4获得值栈
通过ActionContext对象获取值栈。
在Struts2的内部,将值栈存入reqeust中一份。
1.3.1.5操作值栈—向值栈中存入数据
一种:在Action中提供属性的get方法的方式
默认的情况下,将Action对象压入到值栈。Action的属性?(也会在值栈中)
二种:使用ValueStack中本身的方法的方式。
1.3.1.6获取值栈数据
获取值栈中的数据就是在页面中使用OGNL表达式即可。
获取对象的数据
获取context数据,加上#号
1.3.1.7EL为何访问值栈数据
因为Struts2的框架的底层对request.getAttribute(String name).
1.4OGNL中特殊字符
1.4.1#号
获取context的数据
构建map集合
1.4.2%号
强制解析OGNL
1.4.3$号
在配置文件中使用OGNL