Struts2的标签库——OGNL表达式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Struts2的标签库——OGNL表达式相关的知识,希望对你有一定的参考价值。

Struts2的标签库(二)

      ——OGNL表达式

1.Struts2中的OGNL表达式增加了ValueStack的支持。

注:ValueStack——实际上是一个容器对象,该对象在启动Struts2框架时被创建,当前端的JSP页面向Action发送请求时,Struts2框架会将请求的数据封装并存放在栈顶,当请求结束后,此栈顶的数据被清除。Struts2的标签访问数据就是通过访问ValueStack来实现的。

2.Struts2可以直接从对象中获取属性,可以自动搜索Stack Context的所有实例(从上到下),直到找到与求值表达式匹配的属性。

注:Stack Context——一个Map类型的容器,ValueStack是它的根对象。

例如Stack Context中有两个根实例:teacher和student,两个实例都有name属性和say属性,teacher实例中有teach属性,而student中有study属性。teacher实例在栈顶而student在其之后,获取其属性的示例如下:

//这两个属性都是teacher实例和student实例各自特有的属性

//返回teacher的teach属性值(即teacher.getTeach()方法的返回值)

teach

//返回student的study属性值(即student.getStudy()方法的返回值)

study

//当要获取两个实例都有的属性如name或say时

//因为teacher实例位于栈顶所以可以直接获取其属性

//获取teacher实例的name属性(即teacher.getName()方法的返回值)

name

//获取teacher实例的say属性(即teacher.getSay()方法的返回值)

say

//但如果要获取student的name和say属性时,必须要用如下方式

//获取student的name属性(即student.getName()方法的返回值)

#student.name

//获取student的say属性(即student.getSay()方法的返回值)

#student.say

除此之外,也可以通过索引访问Stack Context中的对象:

//访问teacher的name属性

[0].name

//访问teacher的say属性

[0].say

//访问student的name属性

[1].name

//访问student的say属性

[1].say

值得注意的是,使用索引获取元素时并不是从指定索引处直接获取,而是从指定索引处开始向下搜索。

3.Stack Context和ValueStack

  Stack Context中包含ValueStack,ValueStack是Stack Context的根对象;在Stack Context中出了有ValueStack这个根对象以外,还有一些命名对象如parameters、request、session、application、attr对象等。

  访问命名对象时,需要使用"#",访问根对象时可以省略"#"和对象名。

注:在系统创建了Action实例之后,该Action被存放到了ValueStack中,ValueStack是Stack Context的根对象所以不需要用#来访问。

4.几个常用的命名对象

对象 作用 获取方式一 获取方式二
parameters对象 访问HTTP请求参数,返回调用HttpServletRequest实例的getParameter("xxx")方法的返回值。 #parameters[‘xxx‘] #parameters.xxx
request对象 访问HttpServletRequest的属性,返回调用HttpServletRequest实例的getAttribute("xxx")方法的返回值 #request[‘xxx‘] #request.xxx
session对象 访问HttpSession的属性,返回调用HttpSession实例的getAttribute("xxx")方法的返回值 #session[‘xxx‘] #session.xxx
application对象 访问ServletContext的属性,返回ServletContext实例的getAttribute("xxx")方法的返回值 #application[‘xxx‘] #application.xxx

5.操作集合

(1)创建集合

//使用OGNL表达式创建一个List类型的集合

{value1,value2,value3,...}

//使用OGNL表达式创建一个Map类型的集合

{key1:value1,key2:value2,key3:value3,...}

(2)有关集合的运算

in:判断某个元素是否在指定集合中。

not in:判断某个元素是否不在指定集合中。

取得子集的运算:

?——取出所有符合选择逻辑的元素。

^——取出符合逻辑的第一个元素。

$——取出符合逻辑的最后一个元素。

6.访问静态成员(静态方法和静态成员变量)

(1)Struts2默认关闭访问静态方法的功能,只提供访问静态变量的功能,如果要访问静态方法需要在struts.xml中作如下修改:

<struts>
    <constant name="struts.enable.DynamicMethodInvocation" value="false" />
    <constant name="struts.devMode" value="true" />
    <!-- 设置OGNL表达式可以访问静态方法 -->
    <constant name="struts.ognl.allowStaticMethodAccess" value="true"/>
</struts>

 

(2)访问静态成员的格式:

访问静态成员变量:@类名@静态变量名

访问静态方法:@类名@静态方法名(参数)

 


以上是关于Struts2的标签库——OGNL表达式的主要内容,如果未能解决你的问题,请参考以下文章

Struts标签Ognl表达式el表达式jstl标签库这四者之间的关系和各自作用

基于初学者的SSHstruts2 值栈的详解与struts2标签库+ognl表达式

Struts2 OGNL

Struts2 进阶

struts2值栈存取数据小结(使用ognl表达式)

struts2学习笔记--OGNL表达式1