我是靠谱客的博主 自由牛排,最近开发中收集的这篇文章主要介绍Ognl表达式使用(一),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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表达式使用(一)的全部内容,希望文章能够帮你解决Ognl表达式使用(一)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部