Struts2框架(3)
1.OGNL表达式
(1)OGNL的概述
1)OGNL:对象图导航语言,是一门功能强大的表达式语言。
2.OGNL的功能
(1)调用对象的方法
(2)调用对象的静态方法
(3)表达式串联
(4)访问ActionContext和OgnlContext数据
3.OGNL独立的表达式:
(1)Java环境下入门
(2)Struts2环境下入门
4.值栈
(1)值栈的概述
1)ValueStack:是一个接口,实现类OgnlValueStack。是数据的中转站,
贯穿了整个Action,有一个Action的实例,就会创建一个ValueStack对象。
(2)值栈的内部结构
1)Root :CompoundRoot,就是一个ArrayList。
2)Context :OgnlContext,就是一个Map。
(3)ActionContext和值栈关系
1)ActionContext获得值栈的引用。
(4)获得值栈
1)通过ActionContext获取
2)通过request获取
(5)操作值栈
1)利用Action本身在栈中的特点,Action中的属性。
2)手动操作值栈:
(6)获取值栈的数据
1)OGNL获取:<s:property value=”…”/>
(7)EL获取值栈的数据
1)底层增强request.getAttribute(“”);
5.ONGL特殊字符
(1)#号
1)获取context数据
2)构建map集合
(2)%号
1)强制解析OGNL
(3)$号
1)在配置文件中使用OGNL
1.OGNL表达式
(1)OGNL的概述
- OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,
- 它是一个单独的开源项目。 Struts2框架使用OGNL作为默认的表达式语言。
- OGNL是struts2整合的一个开源项目,所以在struts2中,要想使用OGNL表达式,必须使用Struts2标签库
- OGNL相当 于EL表示式,从作用域取数据
1)OGNL:对象图导航语言,是一门功能强大的表达式语言。
2.OGNL的功能(这是在java环境下的使用)
(1)调用对象的方法
(2)调用对象的静态方法
(3)表达式串联
(4)访问ActionContext和OgnlContext数据
3.OGNL独立的表达式
(1)Java环境下入门(第二部分的代码)
(2)Struts2环境下入门
- 默认OGNL是禁止静态方法访问的,在default.properties中有个struts.ognl.allowStaticMethodAccess=false,如想使用,需要在struts.xml文件中配置允许访问静态方法
4.值栈
(1)值栈的概述
ognl表达式存放数据的地方
1)ValueStack:是一个接口,实现类OgnlValueStack。是数据的中转站,贯穿了整个Action,有一个Action的实例,就会创建一个ValueStack对象。
(2)值栈的内部结构
root根:List
|
||||||||||
contextMap:Map
|
1)Root :CompoundRoot,就是一个ArrayList。
2)Context :OgnlContext,就是一个Map。
(3)ActionContext和值栈关系
1)ActionContext获得值栈的引用。
(4)获得值栈(3种)
1)通过ActionContext获取
2)通过request获取
3)通过struts.valueStack获得
(5)操作值栈--向值栈中存数据
1)利用Action本身在栈中的特点,Action中的属性。
这里是存在了root区域
2)手动操作值栈:使用ValueStack中本身的方法
setValue方法
set方法:掌握压栈的顺序问题
这里的[0]和[1]表示的是push放进去同样名称username的先后顺序
findValue方法
在jsp页面上的调用的都是findValue方法
(6)获取值栈的数据
获取值栈中的数据就是在页面使用OGNL表达式即可
1)OGNL获取:<s:property value=”…”/>
获取root的数据,不需要加#,如果是获取context数据就需要加
(7)EL获取值栈的数据
因为Struts2的框架的底层增强request.getAttribute(“”);
5.ONGL特殊字符
(1)#号
1)获取context数据
取contextMap中key时使用,例如<s:property value="#name" />
2)构建map集合
OGNL中创建Map对象时使用,例如:<s:radio list="#{'male':'男','female':'女'}" />
这里如果使用了var = “ ”的话,这份数据除了在root中有,也会在context中备份,如果没有var的话就只会在root中
在页面中得到的结果:
这两种的区别就是第一个的list的值是一个集合,而下面的list的值是一个map的集合,这是看value的值和外面的值是否相同决定的。使用list集合的时候使不用加#的,使用map集合的话就需要加一个#
(2)%号
1)强制解析OGNL
在struts2中,有些标签的value属性取值就是一个OGNL表达式,例如<s:property value="OGNL Expression" />
还有一部分标签,value属性的取值就是普通字符串,例如<s:textfield value="username"/>,如果想把一个普通的字符串强制看成时OGNL,就需要使用%{}把字符串套起来。
例如<s:textfield value="%{username}"/>。
当然在<s:property value="%{OGNL Expression}" />也可以使用,但不会这么用。
(3)$号
1)在配置文件中使用OGNL
a、在JSP中使用EL表达式时使用,例如${name}
b、在xml配置文件中,编写OGNL表达式时使用,例如文件下载时,文件名编码。
struts.xml——>${@java.net.URLEncoder.encode(filename)},如果没有加上${}的话就相当于一个普通的字符