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();
}
}
}