使用OGNL访问对象方法和静态方法

< 上一页OGNL表达式 值栈下一页 >
除了在 JSP 页面中可以使用 OGNL 表达式以外,OGNL 还支持在 Java 代码中访问对象方法和静态方法,接下来本节中将讲解 OGNL 是如何调用方法的。

1. OGNL访问对象方法

OGNL 表达式通过“对象名.方法名()”的形式调用对象方法表达式,如果是调用根对象的方法,则可以直接使用方法的名称调用,其调用语法如下所示:

Ognl.getValue("方法名",对象名);

其实无论 OGNL 表达式以哪种方式取值或者调用方法,最终都是调用其本身的 getValue() 方法。接下来通过一个案例演示 OGNL 如何在 Java 代码中调用对象方法。

在 StrutsDemo05 项目的 com.mengma.ognl 包中创建一个名为 TestOgnl01 的类,编辑后如下所示。
package com.mengma.ognl;

import ognl.OgnlException;

public class TestOgnl01 {
    public static void main(String[] args) {
        Person person = new Person();
        person.setName("admin");
        try {
            System.out.println(ognl.Ognl.getValue("name", person));
        } catch (OgnlException e) {
            e.printStackTrace();
        }
    }
}
上述代码的输出语句中,使用了 OGNL 表达式的方式获取 Person 对象中的 name 属性值,运行 main() 方法后,控制台的输出结果如图 1 所示。

使用OGNL调用对象的输出结果
图 1  使用OGNL调用对象的输出结果

从图 1 的输出结果中可以看出,Person 对象的 name 属性值已经被成功取出。那么,根对象在关联其他对象的方法时要如何调用呢?下面通过修改 TestOgnl01 类演示根对象关联其他对象方法的调用。

首先在 com.mengma.ognl 包中创建一个名为 Group 的类,类中包含一个 name 属性及其 getter 和 setter 方法,然后在 Person 类中增加 Group 属性及其 getter 和 setter 方法,接下来在 TestOgnl01 的 main() 方法中添加如下代码:
Group group = new Group();  //创建Group对象
group.setName("第一小组");  //设置Group对象的name值
person.setGroup(group);     // 将group对象添加到person中
System.out.println(ognl.Ognl.getValue("group", person));
System.out.println(ognl.Ognl.getValue("name", group));
在上述代码的输出语句中,首先调用了 Person 根对象的 getGroup() 方法得到 group 对象,然后调用 group 对象的 getName() 方法,获取 Person 对象中 group 对象的 name 属性值。运行 TestOgnl01 的 main() 方法后,控制台的输出结果如图 2 所示。

根对象关联其他对象方法时的输出结果
图 2  根对象关联其他对象方法时的输出结果

2. OGNL 访问静态方法和静态属性

OGNL 同时支持静态方法和静态属性的调用,其语法格式如下所示:

@类的全路径名@属性名称
@类的全路径名@方法名称(参数列表)

需要注意的是,在低版本的 Struts2 中,已经默认开启了对访问类静态方法的支持,但是高版本的 Struts2 默认是关闭这项支持的,也就是说,要想访问类的静态方法,需要手动开启设置。开启设置的方法十分简单,只需要在 struts.xml 中进行如下配置即可。

<constant name="struts.ognl.allowStaticMethodAccess" value="true"/>

在上述代码配置了一个名称为 struts.ognl.allowStaticMethodAccess 的常量,并将其值设置为 true,这就表示开启了访问静态方法的支持。接下来通过一个案例演示如何使用 OGNL 访问静态方法和静态属性。

1)创建测试类 TestOgnl02

在 struts2Demo05 项目的 com.mengma.ognl 包中,创建一个名称为 TestOgnl02 的类,编辑后如下所示。
package com.mengma.ognl;

public class TestOgnl02 {
    public static String staticValue="这是静态属性值";
    public static void testMethod(){
        System.out.println("这是静态方法");
    }
}
上述代码中,首先创建了一个 String 类型的静态属性 staticValue,并将其属性值设为“这是静态属性值”,然后创建了一个静态方法,并在方法中使用输出语句打印信息。

2)修改配置文件

在配置文件 struts.xml 中,添加用于开启对静态方法访问的支持代码。

3)创建 index.jsp 页面

在项目的 WebContent 目录下,创建一个名称为 index.jsp 的页面,编辑后如下所示。
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>OGNL访问静态属性和静态方法</title>
</head>
<body>
    获取的静态属性值为:
    <s:property value="@com.mengma.ognl.index.jsp@staticValue"/><br/>
    <hr/>
    调用静态方法的结果请查看控制台
    <s:property value="@com.mengma.ognl.TestOgnl02@testMethod()"/>
</body>
</html>
上述代码中,首先引入了 Struts2 的标签库,然后在其 <body> 元素内,分别使用 OGNL 获取了 TestOgnl02 中定义的静态属性值和静态方法。

4)启动项目并查看结果

启动 Tomcat 服务器,在浏览器的地址栏中输入地址 http://localhost:8080/strutsDemo05/index.jsp 访问 index.jsp,浏览器的输出结果如图 3 所示。
使用OGNL访问静态属性和静态方法的浏览器输出
图 3  使用OGNL访问静态属性和静态方法的浏览器输出

MyEclipse 控制台的输出结果如图 4 所示。

使用OGNL访问静态属性和静态方法的控制台输出
图 4  使用OGNL访问静态属性和静态方法的控制台输出

从图 3 和图 4 的显示结果中可以看出,已经成功在页面中使用 OGNL 访问 Java 类中的静态属性和静态方法。
< 上一页OGNL表达式 值栈下一页 >