---恢复内容开始---

Ognl默认是从“根”中取数据的

下面Demo中用的是

Ognl.getValue(String expression, Map context, Object root)
这个方法。

// 参数1,填写Ognl表达式
// 参数2,Map类=》context上下文
// 参数3,JavaBean,Map,List````等类型,Root 根

Ognl需要的jar包:

先准备两个JavaBean

public class User {
private String name;
private int age;
private Address address; public Address getAddress() {
return address;
} public void setAddress(Address address) {
this.address = address;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
}
}

User

public class Address {
private String city; public String getCity() {
return city;
} public void setCity(String city) {
this.city = city;
}
}

Address

下面列举Demo,方法中使用Ognl

public void func1() throws OgnlException {
User user = new User();
user.setName("Tom");
String name = (String) Ognl.getValue("name", new HashMap(), user);
System.out.println(name);
}

从JavaBean根中取数据

//从List根中取数据
public void func2() throws OgnlException {
List<User> list=new ArrayList<User>();
User user = new User();
user.setName("Tom");
list.add(user);
User user2=new User();
user2.setName("Jerry");
list.add(user2);
//[1]代表list中第二个数据
String name = (String) Ognl.getValue("[1].name", new HashMap(), list);
System.out.println(name);
}

从List根中取数据

//稍复杂的从JavaBean中取数据
public void func4() throws OgnlException{
User user=new User();
Address address=new Address();
address.setCity("北京");
user.setAddress(address);
String city=(String) Ognl.getValue("address.city", new HashMap(),user);
System.out.println(city);
}

稍复杂的从JavaBean中取数据

//从第二个参数Map中取数据
public void func3() throws OgnlException{
Map<String, Object> context=new HashMap<String,Object>();
context.put("name", "Tom");
//为了验证确实是取自Map中,添加一个JavaBean
User user=new User();
user.setName("Jerry");
//如果取自Map,则需要在name前加#,否则默认取自第三个JavaBean中
String name = (String) Ognl.getValue("#name",context, user);
System.out.println(name);
}

从第二个参数Map中取数据

// 用Ognl表达式用getValue方法给对象赋值
public void func5() throws OgnlException {
User user = new User();
Integer age = (Integer) Ognl.getValue("age=23", new HashMap(), user);
System.out.println(user.getAge());
System.out.println(age);
}

用Ognl表达式用getValue方法给对象赋值

// 用Ognl表达式用setValue方法给对象赋值
public void func6() throws OgnlException {
User user = new User();
Ognl.setValue("age", new HashMap(), user,23);
System.out.println(user.getAge());
}

用Ognl表达式用setValue方法给对象赋值

在User类中新增一个非静态方法和一个静态方法

public static String getNowTime1(){
return new SimpleDateFormat("yyyy/MM/dd").format(new Date());
}
public String getNowTime2(){
return new SimpleDateFormat("yyyy-MM-dd").format(new Date());
}

User新增方法

// 调用根中方法
public void func7() throws OgnlException {
// 静态方法和普通方法调用方式一样
User user = new User();
String nowTime1 = (String) Ognl.getValue("getNowTime1()", new HashMap<>(), user);
String nowTime2 = (String) Ognl.getValue("getNowTime2()", new HashMap<>(), user);
System.out.println(nowTime1);
System.out.println(nowTime2);
}

调用根中方法

为了测试调用其他类中方法,新增一个类

import java.text.SimpleDateFormat;
import java.util.Date; public class DateUtils {
public static String getNowTime1(String format) {
return new SimpleDateFormat(format).format(new Date());
} public String getNowTime2(String format) {
return new SimpleDateFormat(format).format(new Date());
}
}

获取时间

// 调用其他类静态方法并传参数
public void func8() throws OgnlException {
// 使用@符号调用其他类中静态方法,不再受必须在根中的限制
User user = new User();
String nowTime = (String) Ognl.getValue("@cn.hjp.utils.DateUtils@getNowTime1('yyyy-MM/dd')", new HashMap<>(),
user);
System.out.println(nowTime);
}

调用其他类静态方法并传参数

在DateUtils类中新增一公共变量 public static Double d=12.34;进行下面测试

//调用其他类中静态变量
public void func9() throws OgnlException{
User user=new User();
Double d=(Double) Ognl.getValue("@cn.hjp.utils.DateUtils@d", new HashMap<>(),
user);
System.out.println(d);
}

调用其他类中静态变量

//进行运算
public void func10() throws OgnlException{
User user=new User();
Integer d=(Integer) Ognl.getValue("1+1", new HashMap<>(),
user);
System.out.println(d);
}

进行运算

// 逗号“,”连接符的使用
public void func11() throws OgnlException {
User user = new User();
// 多表达式,逗号分隔,都参与运算,只是最后一个才会返回结果
String name = (String) Ognl.getValue("name='Tom',name", new HashMap<>(), user);
Integer age = (Integer) Ognl.getValue("name='Tom',age=23", new HashMap<>(), user);
System.out.println(name);
System.out.println(age);
}

逗号“,”连接符的使用

// 创建List集合
public void func12() throws OgnlException {
User user = new User();
List list = (List) Ognl.getValue("{'Tom','Lily','Jerry','Jack'}", new HashMap<>(), user);
System.out.println(list);
}

创建List集合

// 创建Map,要使用#符号,指定为Map类型
public void func13() throws OgnlException {
User user = new User();
Map map = (Map) Ognl.getValue("#{'name':'Tom','age':23}", new HashMap<>(), user);
System.out.println(map);
}

创建Map,要使用#符号,指定为Map类型

方便演示创建对象,重写User类的ToString方法:

public String toString() {
return "User [name=" + name + ", age=" + age + ", address=" + address + "]";
}

// 使用Ognl创建对象
public void func14() throws OgnlException {
User user1=new User();
User user2 = (User) Ognl.getValue("new cn.hjp.bean.User()",new HashMap<>(), user1);
System.out.println(user2);
}

使用Ognl创建对象

//Ognl中的in和 not in 运算符
public void func15() throws OgnlException{
User user=new User();
Boolean exists=(Boolean) Ognl.getValue("'Tom' in {'Tom','Lily','Jerry','Jack'}", new HashMap<>(),
user);
Boolean notexists=(Boolean) Ognl.getValue("'Tom' not in {'Tom','Lily','Jerry','Jack'}", new HashMap<>(),
user);
System.out.println(exists);
System.out.println(notexists);
}

Ognl中的in和 not in 运算符

// 集合投影
public void func16() throws OgnlException {
List<User> list = new ArrayList<User>();
User user1 = new User();
user1.setName("Tom");
user1.setAge(23);
list.add(user1);
User user2 = new User();
user2.setName("Jerry");
user2.setAge(24);
list.add(user2);
//只获取name属性
List l = (List) Ognl.getValue("#this.{name}", new HashMap<>(), list);
System.out.println(l);
}

集合投影

// 集合选择
public void func17() throws OgnlException {
List<User> list = new ArrayList<User>();
User user1 = new User();
user1.setName("Tom");
user1.setAge(17);
list.add(user1);
User user2 = new User();
user2.setName("Jerry");
user2.setAge(24);
list.add(user2);
//只获取name属性
List l = (List) Ognl.getValue("#this.{?age>18}", new HashMap<>(), list);
System.out.println(l);
}

集合选择

Ognl基本使用的更多相关文章

  1. Struts2入门(五)——OGNL和标签库

    一.前言 OGNL和标签库的作用,粗暴一点说,就是减少在JSP页面中出现java代码,利于维护. 1.1.OGNL 1.1.1.什么是OGNL? OGNL(Object-Graph Navigatio ...

  2. Ognl表达式基本原理和使用方法

    Ognl表达式基本原理和使用方法 1.Ognl表达式语言 1.1.概述 OGNL表达式 OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,他是一个 ...

  3. 4. ValueStack 和 OGNL

    1. 属性哪来的 当我们通过Action处理完用户请求以后,可以直接在页面中获取到 action 的属性值. 如果我们在页面中尝试遍历四个域中的属性,会发现域中并没有username之类的Action ...

  4. Struts2中的Ognl

    OGNL(Object-Graph Navigation Language)全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者调用对象的方法,能够遍历整 ...

  5. Struts2(Ognl)

    OGNL(Object-Graph Navigation Language)全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者调用对象的方法,能够遍历整 ...

  6. Strust OGNL详解

    首先了解下OGNL的概念: OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的 ...

  7. Struts2深入学习:OGNL表达式原理

    今天看了ognl表达式,不是很理解,准备以后再回头复习: http://developer.51cto.com/art/201203/322509.htm#case1

  8. OGNL的使用

    访问Action中的普通属性: <s:property value="loginname"/><br/> 访问Action中的对象属性: <s:pro ...

  9. Struts2的OGNL表达式语言

    一.OGNL的概念 OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者 ...

  10. Struts 2的OGNL的根对象

    Struts2中的OGNL表达式语言是对Xwork的OGNL的封装.我们要理解一下几点: 1. Struts2中将ActionContext作为OGNL的上下文环境(ActionContext内部含有 ...

随机推荐

  1. 如何将NTFS格式的移动硬盘挂接到Mac OS上进行读写(Read/Write)操作

    现在硬盘便宜,很多同学都有移动硬盘,如果你同时使用Windows与Mac OS的话,移动硬盘最好不要使用NTFS文件系统,否则在Mac OS上,你只能读你的移动硬盘,不能写. 但是实际上的情况是,移动 ...

  2. C#泛型-模板特化

    class TClass<T, K> { } class SubTClass<T, C, K> : TClass<Char, K> { } class SubTCl ...

  3. HashMap 中的 entrySet()使用方法 2016.12.28

    package map; import java.util.HashMap; import java.util.Iterator; import java.util.Map.Entry; import ...

  4. 从0开始学java——JUnit4 复习,其实基本思想还是那些,不过采用了新的注释格式的语法

    看了深入探索 JUnit 4(http://www.ibm.com/developerworks/cn/education/java/j-junit4/index.html  ) 主要是讲了新的基于注 ...

  5. 如何下载Hibernate

    官网: http://hibernate.org/ 打开hibernate官网,选择Hibernate ORM,点击左侧的Downloads 点击Downloads后,可以看到如下页面,右侧是各个版本 ...

  6. 第一个C语言编译器是怎样编写的?

    首先向C语言之父Dennis MacAlistair Ritchie致敬! 当今几乎所有的实用的编译器/解释器(以下统称编译器)都是用C语言编写的,有一些语言比如Clojure,Jython等是基于J ...

  7. 阿里云OSS NET SDK 引用示范程序

    1.引入SDK bin文件,下载地址:https://docs-aliyun.cn-hangzhou.oss.aliyun-inc.com/internal/oss/0.0.4/assets/sdk/ ...

  8. So... what's up?

    So... testing markdown editor what to learn in May? html5 canvas api codeigniter framework var test ...

  9. 一个简单js select插件

    现在,通过一个select插件,来介绍一下js插件的构建过程. 1.先上效果图 2.目录构建 (1)这个select插件,我给它起名交hongselect,所以呢,首先建个hongselect的文件夹 ...

  10. 在线富文本编辑器FckEditor配置(.Net Framework 3.5)

    进入FCKeditor文件夹,编辑 fckconfig.js 文件.1.上传设置  .  var _FileBrowserLanguage         = 'php' ;         // a ...