Ognl基本使用
---恢复内容开始---
Ognl默认是从“根”中取数据的
下面Demo中用的是
// 参数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基本使用的更多相关文章
- Struts2入门(五)——OGNL和标签库
一.前言 OGNL和标签库的作用,粗暴一点说,就是减少在JSP页面中出现java代码,利于维护. 1.1.OGNL 1.1.1.什么是OGNL? OGNL(Object-Graph Navigatio ...
- Ognl表达式基本原理和使用方法
Ognl表达式基本原理和使用方法 1.Ognl表达式语言 1.1.概述 OGNL表达式 OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,他是一个 ...
- 4. ValueStack 和 OGNL
1. 属性哪来的 当我们通过Action处理完用户请求以后,可以直接在页面中获取到 action 的属性值. 如果我们在页面中尝试遍历四个域中的属性,会发现域中并没有username之类的Action ...
- Struts2中的Ognl
OGNL(Object-Graph Navigation Language)全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者调用对象的方法,能够遍历整 ...
- Struts2(Ognl)
OGNL(Object-Graph Navigation Language)全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者调用对象的方法,能够遍历整 ...
- Strust OGNL详解
首先了解下OGNL的概念: OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的 ...
- Struts2深入学习:OGNL表达式原理
今天看了ognl表达式,不是很理解,准备以后再回头复习: http://developer.51cto.com/art/201203/322509.htm#case1
- OGNL的使用
访问Action中的普通属性: <s:property value="loginname"/><br/> 访问Action中的对象属性: <s:pro ...
- Struts2的OGNL表达式语言
一.OGNL的概念 OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者 ...
- Struts 2的OGNL的根对象
Struts2中的OGNL表达式语言是对Xwork的OGNL的封装.我们要理解一下几点: 1. Struts2中将ActionContext作为OGNL的上下文环境(ActionContext内部含有 ...
随机推荐
- 携手K2 BPM,华住酒店完美实现“互联网+”转型
华住酒店集团,旗下6大品牌酒店,包括商旅品牌—禧玥酒店.全季酒店.星程酒店.汉庭酒店.海友酒店,以及度假品牌—漫心度假酒店.高端大气上档次一气呵成,2013年签约K2,携手成就美好生活. 演讲人:宋洪 ...
- QT QT程序初练
//界面编程#include "widget.h" #include "ui_widget.h" Widget::Widget(QWidget *parent) ...
- Response.Redirect("x.aspx);跳转后session为null的解决方法
通常我们做登陆的时候都是登录成功后为管理员保存一些信息,一般都会写类似下面的代码 if(登录成功) { Session["xx"] = "user"; Resp ...
- GEOS库的学习之一:介绍和编译
对GEOS库的学习,源于一个项目:要在c++中判断二维平面中两个多边形的关系(无论凹凸).也就是判断两个多边形是否相交.相容等.听起来很简单,可实现起来却比较难,而项目又催得紧.于是我去搜索了一下,看 ...
- 从0开始学Java——JSP&Servlet——Tomcat和Apache的区别
从<JSP & Servlet 学习笔记>的第一章,了解到web容器:“Web容器是Servlet/jsp唯一认得的http服务器”. 在Java中,容器的类型有多种,这里要说的是 ...
- 路由器 NorFlash与NandFlash区别
在淘宝上买修改openwrt的路由器,基本上都是改的16MB flash,那么为什么不改到1GB呢? 现在U盘的价格也很便宜啊. 于是我调查了一下,发现flash分为两种,NorFlash与NandF ...
- Linux下线程池的理解与简单实现
首先,线程池是什么?顾名思义,就是把一堆开辟好的线程放在一个池子里统一管理,就是一个线程池. 其次,为什么要用线程池,难道来一个请求给它申请一个线程,请求处理完了释放线程不行么?也行,但是如果创建线程 ...
- 19.C#逐一介绍IEnumerable和IEnumerable<T>中的扩展方法(10.3-10.5)
今天没有太多的言语,只有代码,扩展方法多得太多,不能一一列完,书中一些,看多了也就会使用了. //Enumerable.Range 返回起始到结束范围,是一个Enumrable<int>类 ...
- AngularJS-入门篇
AngularJS是什么? 既然能找到这篇日志,证明大家已经了解AngularJS了我这里也就不长篇大论的说了. 其实AngularJS就是,使用JavaScript编写的客户端技术.和Web技术( ...
- 自定义EL
1.建一个类 package com.zh.util; public class GetInFo { public static String eval(String infix){ //注意的是这里 ...