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

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. 开源(免费)三维 GIS(地形,游戏)

    先写想法: 想做个简单的地形漫游,于是考虑在ww直接开发,或找个控件形式的开发组件. 最大的期望有: 1. 支持google的sketchup,快速智能三维建模 2. 设计模式做好点,最好先做成组件形 ...

  2. OAF 中对文字实现html效果及对超级长文本实现默认换行,对只读的messageTextInput中的内容自动换行

    今天遇到一个需求,客户注册页面客户化了一个超级长的注册须知,内容很多.但是样式相对又要做起来好看点. 注册须知的内容使用多个message拼接而成. 老大说rawText支持html样式,于是我想到了 ...

  3. .NET获取不到js写的cookie解决方法

    今晚使用javascript设置一个来路的cookie,之后使用ASP.NET获取这个cookie值,发现ASP.NET获取不到JS设置的cookie值,真郁闷中,以下是JS写Cookie的代码: C ...

  4. Caffe学习系列(6):Blob,Layer and Net以及对应配置文件的编写

    深度网络(net)是一个组合模型,它由许多相互连接的层(layers)组合而成.Caffe就是组建深度网络的这样一种工具,它按照一定的策略,一层一层的搭建出自己的模型.它将所有的信息数据定义为blob ...

  5. 学习Shell脚本编程(第1期)_Shell命令行书写规则

    Shell命令行的书写规则 对Shell命令行基本功能的理解有助于编写更好的Shell程序,在执行Shell命令时多个命令可以在一个命令行上运行,但此时要使用分号(:)分隔命令,例如: [root@l ...

  6. [CareerCup] 13.5 Volatile Keyword 关键字volatile

    13.5 What is the significance of the keyword "volatile" in C 这道题考察我们对于关键字volatile的理解,顾名思义, ...

  7. MSSQL 分组后取每组第一条(group by order by)

    查询中经常遇到这种查询,分组后取每组第一条.分享下一个SQL语句: --根据 x 分组后.根据 y 排序后取第一条 select * from ( select ROW_NUMBER() over(p ...

  8. DLL中调用约定和名称修饰(一)

    DLL中调用约定和名称修饰(一) 调用约定(Calling Convention)是指在程序设计语言中为了实现函数调用而建立的一种协议.这种协议规定了该语言的函数中的参数传送方式.参数是否可变和由谁来 ...

  9. 人家为撩妹就鼓捣个网页,我做了个约炮APP(已开源)

    每年初夏第一场雷雨刚过,漫步河边的草坪,总是能闻到伴随着泥土的清新,这不是coco的前香,让人神魂颠倒:也不是gucci的后香,让人痴迷如梦.如24节气一样,它提醒人们,夏天到了.昨晚成都下了第一场雷 ...

  10. Moqui学习Day3

    添加一个新建表单 添加一个按钮来弹出新建表单,并创建一个转换来处理输入数据操作. 在FindTutorial.xml文件中添加一个转换. <!--新增 列表 --> <transit ...