使用OGNL访问对象方法和静态方法 图片看不了?点击切换HTTP 返回上层
除了在 JSP 页面中可以使用 OGNL 表达式以外,OGNL 还支持在 Java 代码中访问对象方法和静态方法,接下来本节中将讲解 OGNL 是如何调用方法的。
在 StrutsDemo05 项目的 com.mengma.ognl 包中创建一个名为 TestOgnl01 的类,编辑后如下所示。
图 1 使用OGNL调用对象的输出结果
从图 1 的输出结果中可以看出,Person 对象的 name 属性值已经被成功取出。那么,根对象在关联其他对象的方法时要如何调用呢?下面通过修改 TestOgnl01 类演示根对象关联其他对象方法的调用。
首先在 com.mengma.ognl 包中创建一个名为 Group 的类,类中包含一个 name 属性及其 getter 和 setter 方法,然后在 Person 类中增加 Group 属性及其 getter 和 setter 方法,接下来在 TestOgnl01 的 main() 方法中添加如下代码:
图 2 根对象关联其他对象方法时的输出结果
图 3 使用OGNL访问静态属性和静态方法的浏览器输出
MyEclipse 控制台的输出结果如图 4 所示。
图 4 使用OGNL访问静态属性和静态方法的控制台输出
从图 3 和图 4 的显示结果中可以看出,已经成功在页面中使用 OGNL 访问 Java 类中的静态属性和静态方法。
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 所示。
图 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 同时支持静态方法和静态属性的调用,其语法格式如下所示:
@类的全路径名@属性名称
@类的全路径名@方法名称(参数列表)
<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 所示。图 3 使用OGNL访问静态属性和静态方法的浏览器输出
MyEclipse 控制台的输出结果如图 4 所示。
图 4 使用OGNL访问静态属性和静态方法的控制台输出
从图 3 和图 4 的显示结果中可以看出,已经成功在页面中使用 OGNL 访问 Java 类中的静态属性和静态方法。