OGNL语法

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>

运行结果入下:



原文地址:https://www.cnblogs.com/gaojiang/p/3059481.html