本文共 4427 字,大约阅读时间需要 14 分钟。
OGNL的概述
什么是OGNL?
什么是OGNL呢?你可从度娘上看到如下文字:
OGNL的全称是对象图导航语言(ject-Graph Navigation Language),它是一种功能强大的开源表达式语言(比EL表达式强大很多倍),使用这种表达式语言,可以通过某种表达式语法,存取Java对象的任意属性,调用Java对象的方法,同时能够自动实现必要的类型转换。如果把表达式看作是一个带有语义的字符串,那么OGNL无疑成为了这个语义字符串与Java对象之间沟通的桥梁。 咱上面也是说了,OGNL是比EL表达式强大很多倍的语言。它俩之间,我也做个对比。- EL表达式语言只能从域对象中获取数据,或者从EL内置的11个对象中获取数据;
- OGNL表达式语言既能调用对象的方法,又能获取Struts2中值栈的数据,我们使用OGNL表达式主要做的事情就是在Struts2里面获取值栈中的数据(OGNL在Struts2里面经常和Struts2标签一起使用)。我们还需要注意一点:OGNL本身不是Struts2框架的一部分,它其实是独立的第三方的表达式语言(也即是一个单独的项目),只不过它经常和Struts2框架一起使用而已。要想使用OGNL表达式,首先要导入jar包,在Struts2框架里面提供了OGNL表达式的jar包:
OGNL的作用
Struts2默认的表达式语言就是OGNL,它具有以下作用:
OGNL的要素
了解什么是OGNL及其作用后,接下来,我来分析一下OGNL的结构。OGNL的操作实际上就是围绕着OGNL结构的三个要素而进行的,分别是表达式(Expression)、根对象(Root Object)、上下文环境(Context),下面分别一一介绍这三个要素,具体如下:
- 表达式(Expression):表达式是整个OGNL的核心,OGNL会根据表达式去对象中取值。所有OGNL操作都是针对表达式解析后进行的。它表明了此次OGNL操作要"做什么"。表达式就是一个带有语法含义的字符串,这个字符串规定了操作的类型和操作的内容。OGNL支持大量的表达式语法,不仅支持"链式"对象访问路径,还支持在表达式中进行简单的计算;
- 根对象(Root Object):Root对象可以理解为OGNL的操作对象,表达式规定了"做什么",而Root对象则规定了"对谁操作"。OGNL称为对象图导航语言,所谓对象图,即以任意一个对象为根,通过OGNL可以访问与这个对象关联的其他对象;
- Context对象:实际上,OGNL的取值还需要一个上下文环境。设置了Root对象,OGNL可以对Root对象进行取值或写值等操作,Root对象所在环境就是OGNL的上下文环境(Context)。上下文环境规定了OGNL的操作"在哪里进行"。上下文环境(Context)是一个Map类型的对象,在表达式中访问Context中的对象,需要使用"#“号加上对象名称,即”#对象名称"的形式。
我们使用OGNL表达式主要做的事情就是在Struts2里面获取值栈中的数据(OGNL在Struts2里面经常和Struts2标签一起使用),这就是我们接下来要重点讲解的内容,在本讲中咱要入门OGNL,然后在下一讲中咱要将重点放在Struts2里面如何获取值栈中的数据上。
OGNL的入门
Java环境入门
前面已经提到过OGNL支持对象方法调用,比如访问对象方法和访问静态方法,这里结合一些案例来演示OGNL在 Java环境下的入门。
调用对象的方法
首先,在Eclipse中新建一个名为struts2_demo03的web项目,之后快速搭建好Struts2框架的开发环境。然后,在src目录下新建一个名为com.meimeixia.struts2.ognl的包,并在该包下创建一个名为OgnlDemo01的单元测试类,在该单元测试类中编写一个方法使用OGNL表达式来计算字符串"helloworld"的长度。
package com.meimeixia.struts2.ognl;import org.junit.Test;import com.meimeixia.struts2.domain.User;import ognl.Ognl;import ognl.OgnlContext;import ognl.OgnlException;/** * OGNL在Java环境下的使用 * @author liayun * */public class OgnlDemo01 { /* * OGNL如何调用对象的方法 */ @Test public void demo01() throws OgnlException { //获得context OgnlContext context = new OgnlContext(); //通过context对象获得根对象 Object root = context.getRoot(); //执行OGNL表达式('helloworld'.length(),直接调用对象的方法),获取数据 Object obj = Ognl.getValue("'helloworld'.length()", context, root); System.out.println(obj); } }
运行以上方法,就能在控制台看到字符串"helloworld"的长度。
调用对象的静态方法
OGNL表达式支持类静态方法的调用,其格式为@[类全名(包括类路径)]@[方法名 | 值名]
。我们可以在OgnlDemo01单元测试类中编写如下方法进行测试。
/* * OGNL访问对象的静态方法 */@Testpublic void demo02() throws OgnlException { //获得context OgnlContext context = new OgnlContext(); //通过context对象获得根对象 Object root = context.getRoot(); //执行OGNL表达式(@类名@静态方法名,例如@java.lang.Math@random(),可调用类的静态方法),获取数据 Object obj = Ognl.getValue("@java.lang.Math@random()", context, root); System.out.println(obj);}
获取Root对象中的数据
我们一般会向Root对象里面存放一些Java对象,然后再把它取出来用。还有这种操作?是的啦!这里我就举个例子给你看,你就明白了。首先,咱得有一个实体类啊!所以,在src目录下新建一个名为com.meimeixia.struts2.domain的包,并在该包下新建一个User实体类。
package com.meimeixia.struts2.domain;public class User { private String username; private String password; public User() { super(); // TODO Auto-generated constructor stub } public User(String username, String password) { super(); this.username = username; this.password = password; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
然后,在OgnlDemo01单元测试类中编写如下方法进行测试。
/* * 获得Root中的数据,我们一般会向Root里面存放Java对象 * * 获得Root中的数据,这时是不需要加#的 */@Testpublic void demo03() throws OgnlException { //获得context OgnlContext context = new OgnlContext(); User user = new User("aaa", "123"); context.setRoot(user);//向Root里面存放一个User对象 //通过context对象获得根对象 Object root = context.getRoot(); //通过OGNL表达式来获取Root中User对象里面的用户名和密码 Object username = Ognl.getValue("username", context, root); Object password = Ognl.getValue("password", context, root); System.out.println(username + "\t" + password);}
温馨提示:获取Root对象中的数据时,是不需要加#号的。
获取OgnlContext对象中的数据
我们有时也会向OgnlContext对象里面存放一些数据,然后再把它取出来用。这次,咱直接在OgnlDemo01单元测试类中编写如下方法进行测试。
Struts2环境入门
调用对象的方法
首先,在WebContent目录下新建一个demo01目录,并在该目录下新建一个demo01.jsp页面。
然后,使用浏览器访问该页面,可以看到最终的输出结果为6。 通过这个案例,可得出两点结论:- OGNL表达式要和Struts2标签(例如
<s:property>
)一起使用; - 在该Struts2标签里面有一个value属性,在value属性值里面要写上OGNL表达式。
调用对象的静态方法
静态方法的访问在Struts2中默认是关闭的,也就是说在Struts2里面默认是不让你访问静态成员的,如果你非得去访问,那么得去开启一个常量struts.ognl.allowStaticMethodAccess。
然后,修改一下demo01.jsp页面。 最后,使用浏览器访问该页面,效果如下图所示。转载地址:https://liayun.blog.csdn.net/article/details/67709693 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!