OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言(Expression Language,简称为EL),通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。它使用相同的表达式去存取对象的属性。
webwork2和现在的Struts2.x中使用OGNL取代原来的EL来做界面数据绑定,所谓界面数据绑定,也就是把界面元素(例如一个textfield,hidden)和对象层某个类的某个属性绑定在一起,修改和显示自动同步。
Struts 2默认的表达式语言是OGNL,原因是它相对其它表达式语言具有下面几大优势:
1、 支持对象方法调用,如xxx.doSomeSpecial();
2、支持类静态的方法调用和值访问,表达式的格式为@[类全名(包括包路径)]@[方法名 | 值名],例如:@java.lang.String@format('foo %s', 'bar')或@tutorial.MyConstant@APP_NAME;
3、支持赋值操作和表达式串联
4、访问OGNL上下文(OGNL context)和ActionContext
5、操作集合对象
用法:OGNL是通常要结合Struts 2的标志一起使用。主要是#、%和$这三个符号的使用;
下面为关键代码,实体类未提供,测试通过,算是学习一阶段的总结吧,贴出来互相学习:
package struts_ognl;
import java.util.List;
import org.junit.Test;
import ognl.Ognl;
import ognl.OgnlException;
import entity.Action;
import entity.Person;
/***
* Ognl表达式:访问对象的属性的属性、集合过滤(访问对象的集合<对象>)、定义List和Map类型的常量
* @author admin
*
*/
public class TestAction {
@Test
public void test1(){
Action action = new Action();
action.setPerson(
new Person(1,"孔子",100));
action.getPersons().add(
new Person(2,"tom",200));
action.getPersons().add(
new Person(3,"jack",28));
action.getPersons().add(
new Person(4,"jime",15));
try {
//----------访问对象的属性的属性:属性.属性
//Ognl.getValue(String expression,Object root);
Object name = Ognl.getValue("person.name", action);//孔子
System.out.println(name);
//----------集合过滤(访问对象的集合<对象>):集合名.{?#this.对象属性}
List<Person> pers = (List<Person>)Ognl.getValue("persons.{?#this.age > 15}", action);
for(Person p : pers){
System.out.println(p.getId() + " "
+ p.getName() + " "
+ p.getAge());
}
List<Person> pers1 = (List<Person>)Ognl.getValue("persons", action);
for(Person p : pers1){
System.out.println(p.getId() + " "
+ p.getName() + " "
+ p.getAge());
}
//----------定义List、Map类型常量:list:{},map:#{}
Object list = Ognl.getValue("{1,2,4}", null);
System.out.println(list.getClass().getName());//java.util.ArrayList
Object map = Ognl.getValue("#{'age':20,'name':\"TOM\"}",null);
System.out.println(map.getClass().getName());//java.util.LinkedHashMap
} catch (OgnlException e) {
e.printStackTrace();
}
}
}
//---------------------------------------------------------------------------------------------------------------------------------------
package struts_ognl;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.junit.Test;
import ognl.Ognl;
import ognl.OgnlException;
import entity.Foo;
/***
* Ognl表达式:访问对象属性、访问对象方法、常量的访问、运算符的使用
* 对象涉及:常量、List、Map、Integer、String
* @author admin
*
*/
public class TestOgnl {
@Test
public void test(){
Foo foo = new Foo();
foo.setId(100);
foo.setSex("M");
foo.setName("tom");
foo.setLoves(new String[]{"孟子","孙子","老子"});
List<String> city = new ArrayList<String>();
city.add("北京");
city.add("上海");
city.add("广州");
foo.setCity(city);
Map<String,String> books = new HashMap<String, String>();
books.put("ISBN0001", "Java入门宝典");
books.put("ISBN0002", "精通Struts2");
books.put("ISBN0003", "JavaWeb开发");
foo.setBooks(books);
try {
//-----------访问对象属性:属性
//Ognl.getValue(String expression,Object root)
Object id = Ognl.getValue("id", foo);
System.out.println(id);//100
//Ognl.setValue(String expression, Object root, Object value)
Ognl.setValue("loves[0]", foo, "I LOVE JIJI");
System.out.println(Ognl.getValue("loves[1]", foo));//孙子
Object book = Ognl.getValue("books['ISBN0001']",foo);//Java入门宝典;等同于Ognl.getValue("#ISBN0001",books,foo)
System.out.println(book);
//-----------访问对象方法:属性.方法名()
Object name = Ognl.getValue("name.toUpperCase()", foo);//TOM
System.out.println(name);
Object loves = Ognl.getValue("loves.length", foo);//3
System.out.println(loves);
//-----------常量的访问: @包.类@常量名
Object pi = Ognl.getValue("@java.lang.Math@PI", null);//提供了完整的包.类,root对象可以为null;3.141592653589793
System.out.println(pi);
Object hello = Ognl.getValue("@entity.Foo@HELLO", null);//hello ognl
System.out.println(hello);
//-----------运算符的使用:
Object name1 = Ognl.getValue("\"name: \"+name", foo);
System.out.println(name1);//name: tom
Object sex = Ognl.getValue("sex.equals(\"M\")?'男':'女'", foo);//男,原理:调用属性.方法,进行比较
System.out.println(sex);
Object id1 = Ognl.getValue("id+30>100", foo);//true
System.out.println(id1);
} catch (OgnlException e) {
e.printStackTrace();
}
}
}
//---------------------------------------------------------------------------------------------------------------------------------------
package struts_ognl;
import java.util.HashMap;
import java.util.Map;
import org.junit.Test;
import ognl.Ognl;
import ognl.OgnlException;
import entity.Person;
/***
* 测试实体类+Map内采用ognl取值:
* Ognl.getValue(String expression,Map context,Object root):
* 访问context数据需要使用"#key"格式,而访问对象的数据,则可以直接写属性便可
* @author admin
*
*/
public class TestOgnlContext {
@Test
public void test1(){
Person p = new Person(1,"tom",20);
Map<String,Object> context = new HashMap<String,Object>();
context.put("number", 10);
context.put("person", new Person(1,"tom",21));
try {
//Ognl.getValue(String expression,Map context,Object root)
String name = (String)Ognl.getValue("#person.name", context, p);
System.out.println(name);//tom
//访问context数据需要使用"#key"格式,而访问对象的数据,则可以直接写属性便可
Integer num = (Integer)Ognl.getValue("#number + age", context,p);//30
System.out.println(num);
} catch (OgnlException e) {
e.printStackTrace();
}
}
}
相关推荐
OGNL表达式在执行时需要一个上下文环境(Context),这个上下文环境通常是一个Map结构。在Struts2中,具体的上下文环境是`ActionContext`。`ActionContext`中的结构如下: - **request**:当前的HTTP请求。 - **...
struts2 中 OGNL表达式的使用struts2 中 OGNL表达式的使用
#### 一、OGNL表达式概述 OGNL (Object-Graph Navigation Language) 是一种强大的表达式语言,用于获取和设置 Java 对象的属性。它最初是由 John Rose 和 Luke Blanshard 开发,并被广泛应用于多种框架中,尤其是在 ...
本案例提供ognl使用详解,测试通过,只需解压放入自己WEB项目中,执行struts_ognl包内java文件即可(未提供jia包,若需要可以联系留言发至邮箱),若测试不好可以联系本人提供指导. Struts 2默认的表达式语言是OGNL...
为了更好地理解OGNL表达式的使用,我们来看一个具体的示例。假设我们在开发一个简单的Web应用,其中包含一个名为`Struts2_OGNL`的项目。 1. **配置开发环境**:首先,需要配置项目的编码方式为`utf-8`,并在`web....
5. **上下文访问**:Struts2 ActionContext提供了一个全局上下文,可以在OGNL表达式中访问请求、session、application等范围的变量。 6. **值栈**:Struts2中的值栈是OGNL的主要工作区域,它存储了Action对象和其他...
因此,开发者应使用Struts2的安全配置选项,如禁用不安全的OGNL表达式,或者使用`@SkipValidation`注解来限制某些Action方法的OGNL表达式执行。 总结来说,Struts2中的OGNL表达式是连接模型和视图的关键工具,它...
这篇深入学习的文章主要探讨了OGNL表达式的原理和使用。 首先,我们来理解一下OGNL是什么。OGNL是一种强大的表达式语言,允许开发者通过简单的字符串表达式来访问和修改对象图。在Struts2中,OGNL用于在Action和...
struts2 OGNL表达式使用 OGNL(Object-Graph Navigation Language)是对象图导航语言,允许开发者在Struts2应用程序中访问和操作对象及其属性。下面是OGNL表达式的使用方法: 访问基本属性 1. 访问值栈中action的...
描述中提到的"ognl标签"是指Struts2提供的与OGNL相关的标签库,它们使得在JSP页面上更加方便地使用OGNL表达式。例如,`<s:property>`标签可以用来输出对象的属性值,其value属性可以是OGNL表达式,如`...
2. **上下文(Context)**:OGNL表达式执行时,会使用一个上下文对象来查找和设置值。这个上下文通常包含了当前作用域内的所有变量和对象。 3. **值栈(Value Stack)**:在Struts 2框架中,OGNL默认使用值栈来处理...
本篇文章将详细探讨Struts2中的OGNL表达式语言以及标签库。 **OGNL(对象图导航语言)** OGNL是一种强大的表达式语言,它允许开发者通过简洁的语法来访问和操作对象的属性。在Struts2框架中,OGNL扮演着至关重要的...
在本资源“OGNL表达式2讲”中,我们将深入探讨OGNL的使用,特别是针对各种常用的标签和实际应用案例。这个压缩包包含一个名为“OGNL”的文件,可能是一个文档或代码示例,用于辅助理解讲解内容。 1. **OGNL基础** ...
1. **表达式语法**:OGNL表达式通常由对象名、点号和属性名组成,例如`user.name`,表示获取`user`对象的`name`属性。也可以通过索引访问集合元素,如`list[0]`。 2. **上下文(Context)**:在OGNL中,上下文包含...
NULL 博文链接:https://huguifuture.iteye.com/blog/761843
Struts2 OGNL表达式是Java Web开发中一个重要的概念,它是一种强大的对象图形导航语言(Object-Graph Navigation Language)。在Struts2框架中,OGNL被广泛用于视图层,作为数据绑定的主要手段,使得开发者能够方便...
例如,当定义一个Action的返回结果时,你可以指定一个JSP页面并使用OGNL表达式来决定页面上显示哪些数据: ```xml <result name="success">/pages/myPage.jsp ``` 在myPage.jsp中,可以使用OGNL来访问Action...
// 使用OGNL表达式设置对象属性 valueStack.setValue("user.username", "Moxie"); // 通过OGNL表达式获取并打印对象属性 System.out.println("username = " + valueStack.findValue("user.username")); ``` 在这个...
这个“struts2-OGNL表达式测试”可能是一个测试项目或代码示例,旨在演示如何在Struts2应用中使用OGNL表达式。 OGNL是Struts2的核心组件之一,它允许开发者通过简单的字符串表达式来获取或设置对象的属性。这使得视...
这段代码是一个基于JSP的Struts2应用,展示了如何使用OGNL表达式来访问不同范围内的属性(request、session、application),以及创建并遍历列表和映射。 1. **访问属性范围中的值**: - 在第29行、31行和33行,`...