OGNL是Object-Graph Navigation Language(对象图导航语言)的缩写,它是一种功能强大的表达式语言。Struts2的标签库以OGNL为基础,大大简化了数据的输出,同时还提供了大量的标签来生产页面效果。
一、ActionContext、StackContext和ValueStack的关系。
(1)、ActionContext是Action执行时的上下文。上下文可以看做是一种容器,用于存放Action在执行时用到的对象。ActionContext是线程安全的,在同一个线程中,ActionContext的属性是唯一的。
(2)、StackContext对象是上下文中的一个java.util.Stack实例。包括Session、Requeset、Application、Parameters、Attr等对象。
(3)、ValueStack对象。Struts2会为每一次Action的请求创建与之对应的ValueSack,并将所有Action属性数据存储到ValueStack中,再将ValueStack暴露给视图页面。
二、OGNL语法基础
1、访问OGNL上下文中的数据
(1)、<s:property value="uid"/>:运行该标签时,Struts2会再ValueStack中(即在Action类的属性中)查找名为uid的项,并输出其值。
(2)、<s:property value="#uid"/>:Struts2会再StackContext中查找名为uid的项。
(3)、<s:property value="#session.uid"/>:Struts2会在StackContext的Session作用域中查找名为uid的项,并输出。
(4)、<s:property value="#attr.uid"/>:Struts2会在StackContext的Page、Request、Session、Application范围内查找名为uid的项。
2、访问javabean的方法。
(1)、访问非静态方法:<s:property value="对象名.方法名(参数值)"/>
(2)、访问静态方法:<s:property value="@类的全限名@方法名(参数)"/>,示例如下:
<body> <% OgnlInfo ognl = new OgnlInfo(); //将ognl对象放入request作用域中 request.setAttribute("ognl",ognl); %> <!-- 执行ognl的非静态方法 --> <s:property value="#request.ognl.sayHello('过省')"/> <!-- 执行OgnlInfo类的静态方法 --> <s:property value="@com.model.OgnlInfo@sayBye('小陈')"/> </body>
运行结果如下:
3、%符号:"%"符号用于在标志的属性为字符串类型时计算OGNL表达式的值。
<body> <% String title="提交"; pageContext.setAttribute("title",title); %> 不使用%符号,会按原样显示 <s:submit value="#attr.title"/><br> 使用%符号,会计算OGNL表达式的值 <s:submit value="%{#attr.title}"/> </body>
运行结果入下: