Struts中整合的强大Ognl学习(一)
测试使用了一个JavaBean的User,User中的Address单独封装再形成了一个JavaBean;
为了测试静态方法和静态变量调用,写了一个Util方法;
因为测试Ognl功能过多所以直接使用的Junit进行测试!
其中只用使用四个struts中的包,创建一个普通的java项目来测试!

User.java
package mzy.entity;
public class User {
private String name;
private int age;
private String password;
private Address address;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
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 String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User [name=" + name + ", password=" + password + ", address=" + address + "]";
}
}
Address.java
package mzy.entity;
public class Address {
private String city;
private String street;
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getStreet() {
return street;
}
public void setStreet(String street) {
this.street = street;
}
}
DateUtils.java
package mzy.entity;
package mzy.utils;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateUtils {
public static double PI = 3.1425926;
/**
* 返回当前时间方法!
*/
public static String getTime() {
return new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date());
}
/**
* 回音方法! 经常用于测试
*/
public static String echo(String str) {
return str;
}
}
下面是测试,emmm,很长很长!!!
package mzy.demo;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.junit.Test;
import mzy.entity.Address;
import mzy.entity.User;
import ognl.Ognl;
public class Demo {
/*
* 演示ognl的基本使用!
*/
// ----------------演示从根中取值----------------
@Test
public void fun1 () throws Exception {
User u = new User();
u.setName("Tom");
/*
* 参数一:填写ognl表达式
* 参数二:Map -> context上下文
* 参数三:javaBean/List/Map ... Root 根
*/
// 根是javaBean
String name = (String) Ognl.getValue("name", new HashMap(), u);
System.out.println(name);
}
@Test
public void fun2 () throws Exception {
List<User> list = new ArrayList<User>();
User u1 = new User();
u1.setName("Tom");
User u2 = new User();
u2.setName("Jerry");
list.add(u1);
list.add(u2);
/*
* 参数一:填写ognl表达式
* 参数二:Map -> context上下文
* 参数三:javaBean/List/Map ... Root 根
*/
// 根是List:Ognl默认从根下去取值!
String name01 = (String) Ognl.getValue("[0].name", new HashMap(), list);
String name02 = (String) Ognl.getValue("[1].name", new HashMap(), list);
System.out.println(name01);
System.out.println(name02);
}
@Test
public void fun3 () throws Exception {
Map<String, Object> map = new HashMap<String, Object>();
map.put("name", "Tom");
/*
* 参数一:填写ognl表达式
* 参数二:Map -> context上下文
* 参数三:javaBean/List/Map ... Root 根
*/
// 根是List:Ognl默认从根下去取值!
String name = (String) Ognl.getValue("name", new HashMap(), map);
System.out.println(name);
}
// ----------------演示从上下文取值----------------
@Test
public void fun4 () throws Exception {
Map<String, Object> map01 = new HashMap<String, Object>();
map01.put("name", "Tom");
Map<String, Object> map02 = new HashMap<String, Object>();
map02.put("name", "Jerry");
/*
* 参数一:填写ognl表达式
* 参数二:Map -> context上下文
* 参数三:javaBean/List/Map ... Root 根
*/
// 根是List:Ognl默认从根下去取值! name
// 要从上下文去取的话,用#name!
// String name = (String) Ognl.getValue("name", map02, map01); // Tom
String name = (String) Ognl.getValue("#name", map02, map01); // Jerry
System.out.println(name);
}
// ----------------演示从对象中取对象的值:层级可以无限----------------
@Test
public void fun5 () throws Exception {
User u = new User();
u.setName("Tom");
Address a = new Address();
a.setCity("ChengDu");
u.setAddress(a);
/*
* 参数一:填写ognl表达式
* 参数二:Map -> context上下文
* 参数三:javaBean/List/Map ... Root 根
*/
// 使用Ognl取出User中Address中的city的值
String city = (String) Ognl.getValue("address.city", new HashMap(), u);
System.out.println(city);
}
// ----------------演示赋值----------------
@Test
public void fun6() throws Exception {
// 演示赋值
User u = new User();
// 方式一:getValue中expression位置写name=xxx
Ognl.getValue("name='Tom'", new HashMap(), u);
System.out.println(u.getName());
// 方式二:setValue中最后一个位置写value
Ognl.setValue("name", new HashMap(), u, "Jerry");
System.out.println(u.getName());
Map map = new HashMap();
// 赋值必须在根中! 上下文不能赋值!!!
Ognl.setValue("#name", map, u, "Jerry");
System.out.println(map.get("name"));
}
// ----------------演示Ognl调用方法----------------
@Test // 调用根中的方法!
public void fun7() throws Exception {
// 调用方法:但是该方法必须存在于根中!
User u = new User();
Ognl.getValue("setName('Jack')", new HashMap(), u);
System.out.println(u.getName());
}
@Test // 访问静态方法和静态变量
public void fun8() throws Exception {
// 演示静态方法访问:不受在根中的限制了!可以不在根中(肯定更不是上下文,只是指外部)
/*
* Ognl中规定,所有静态的方法和变量都用@符号表示;
* 如果在根中的话,直接写方法名之类的就好了;
* 但是如果不在根中的话,就要写完整类名,并加我们要访问的方法或者变量(中间还要使用一次@符号)
*/
User u = new User();
// 演示静态无参方法调用
String time = (String) Ognl.getValue("@mzy.utils.DateUtils@getTime()", new HashMap(), u);
System.out.println(time);
// 演示静态有参方法调用
String echo = (String) Ognl.getValue("@mzy.utils.DateUtils@echo('hiahia~~')", new HashMap(), u);
// Ognl.setValue(expression, root, value); // 同前面的一类的set方法
System.out.println(echo);
/*
* 上面的context位置的参数因为用不到,所以可以选择两个 参数的getValue方法
*/
// 演示静态变量的访问
double Pi = (double) Ognl.getValue("@mzy.utils.DateUtils@PI", u);
System.out.println(Pi);
}
// ----------------演示Ognl进行数学差运算----------------
@Test // 进行数学运算
public void fun9() throws Exception {
int result = (int) Ognl.getValue("1+1", new User()); // 根必须要有,但是取值不一定从根中取,所以我们的根就可以随便new一个javaBean对象
System.out.println(result);
}
// ----------------演示Ognl多个表达式的时候使用, 分隔----------------
@Test // 多个Ognl表达式的时候,连接符的使用
public void fun10() throws Exception {
User u = new User();
u.setName("Tom");
Object result = Ognl.getValue("name='Tom', name='Jerry'", u); // 根必须要有,但是取值不一定从根中取,所以我们的根就可以随便new一个javaBean对象
// 测试:这样写的话只返回最后一个表达式的结果,并不能返回所有的结果
System.out.println(result);
}
// ----------------演示Ognl创建对象(List、Map ... )----------------
@Test
public void fun11() throws Exception {
// 演示创建List
List list = (List) Ognl.getValue("{'Tom', 'Jerry', 'Jack', 'Rose'}", new User());
System.out.println(list);
// 演示创建Map
Map map = (Map)Ognl.getValue("#{'name':'Tom', 'age':'18', 'sex':'男'}", new User());
System.out.println(map);
// 创建javaBean:很鸡肋,略
}
// ----------------演示in和not in----------------
@Test
public void fun12() throws Exception {
// 注意内部的单引号!!!我之前忘了!!!
// true
Object a = Ognl.getValue("'Tom' in {'Tom', 'Jerry', 'Jack', 'Rose'}", new User());
// false
boolean b = (boolean)Ognl.getValue("'tom' in {'Tom', 'Jerry', 'Jack', 'Rose'}", new User());
// false
boolean c = (boolean)Ognl.getValue("'Tom' not in {'Tom', 'Jerry', 'Jack', 'Rose'}", new User());
// true 自动做了去空格的trim操作!
boolean d = (boolean)Ognl.getValue("' Tom ' not in {'Tom', 'Jerry', 'Jack', 'Rose'}", new User());
System.out.println(a+", "+b+", "+c+", "+d);
}
// ----------------演示映射----------------
@Test
public void fun13() throws Exception {
/*
* 需求:
* 得到所有User的name属性的集合
*/
List<User> list = new ArrayList<User>();
User u1 = new User();
User u2 = new User();
User u3 = new User();
u1.setName("Tom");
u2.setName("Jerry");
u3.setName("Rose");
list.add(u1);
list.add(u2);
list.add(u3);
// 默认没有#号的时候为从根中取,只要是不能从根中取到的,和不能从根中直接取到的都要加#
// 把list设置为根:expr中的this表示根
Object value = Ognl.getValue("#this.{name}", list);
System.out.println(value);
}
// ----------------集合的选择,过滤----------------
@Test
public void fun14() throws Exception {
/*
* 需求:
* 过滤掉List中所有年龄大于18的user
*/
List<User> list = new ArrayList<User>();
User u1 = new User();
User u2 = new User();
User u3 = new User();
u1.setName("Tom");
u1.setAge(17);
u2.setName("Jerry");
u1.setAge(18);
u3.setName("Rose");
u1.setAge(19);
list.add(u1);
list.add(u2);
list.add(u3);
// 默认没有#号的时候为从根中取,只要是不能从根中取到的,和不能从根中直接取到的都要加#
// 把list设置为根:expr中的this表示根:注意这里是过滤!!age > 18
Object value = Ognl.getValue("#this.{?age>18}", list);
System.out.println(value);
}
}
Struts中整合的强大Ognl学习(一)的更多相关文章
- 在Apache Struts中利用OGNL注入
前言 本文简要介绍了Apache Struts的OGNL注入缺陷,文章中介绍使用简单的应用程序复现OGNL注入.深入研究针对公共漏洞,并理解这类漏洞. 内容 安装Apache Tomcat服务器(入门 ...
- Struts中的OGNL和EL表达式笔记
Struts中的OGNL和EL表达式笔记 OGNL(Object-Graph Navigation Language),可以方便的操作对象属性的表达式语言. 1.#符号的用途 一般有三种方式: 1.1 ...
- Struts中Validate()和validateXxx的使用
Struts中Validate()和validateXxx的使用 学习struts2之后,你会发现validate在之前是没有的!它是怎么实现的呢? validate和validateXxxx都是拦截 ...
- 【转】SSH中 整合spring和proxool 连接池
[摘要:比来做的一个项目中应用到了毗邻池技巧,大概我们人人比拟认识的开源毗邻池有dbcp,c3p0,proxool.对那三种毗邻池来讲,从机能战失足率来讲,proxool轻微比前两种好些.本日我首要简 ...
- Spring Boot中整合Sharding-JDBC单库分表示例
本文是Sharding-JDBC采用Spring Boot Starter方式配置第二篇,第一篇是读写分离讲解,请参考:<Spring Boot中整合Sharding-JDBC读写分离示例> ...
- 源码安装ipython,并在ipython中整合spark
一.安装ipython 下载ipython, https://pypi.python.org/packages/source/i/ipython/ipython-2.2.0.tar.gz#md5=b9 ...
- Sql Server 中一个非常强大的日期格式化函数
Sql Server 中一个非常强大的日期格式化函数Select CONVERT(varchar(100), GETDATE(), 0)-- 05 16 2006 10:57AMSelect CONV ...
- ASP.NET MVC3 中整合 NHibernate3.3、Spring.NET2.0 时 Session 关闭问题
一.问题描述 在向ASP.NET MVC中整合NHibernate.Spring.NET后,如下管理员与角色关系: 类public class Admin { public virtual strin ...
- struts中的数据校验
1.struts中如何进行数据校验 在每一个Action类中,数据校验一般都写在业务方法中,比如login().register()等.struts提供了数据校验功能.每个继承自ActionSuppo ...
随机推荐
- 图像旋转的FPGA实现(一)
继续图像处理专题,这次写的是图像旋转.若要说小分辨率的图像旋转倒也简单,直接将原始图像存储在BRAM中,然后按照旋转后的位置关系取出便是.但是对于高分辨的图像(720P及以上)就必须得用DDR3或者D ...
- 浅析java中的IO流
在java中IO类很庞大,初学的时候觉得傻傻分不清楚.其实java流归根结底的原理是普通字节流,字节缓冲流,转换流.最基础的是普通字节流,即从硬盘读取字节写入到内存中,但在实际使用中又发现一些特殊的需 ...
- vue-- 利用过滤-实现搜索框的姓名的搜索
<div class="fl w-200 m-l-30"> <el-input placeholder="输入用户名" v-model=&qu ...
- php预定义常量运用
当前url 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; 当前文件路径 dirname(__FILE__)header(" ...
- IOS真机调试找不到设备:ERROR: Could not connect to lockdownd, error code -[x]
报错信息: Could not connect to lockdownd, error code -3 解决方法:修改var/db/lockdown文件夹的读写权限 在终端找到文件夹cd var/db ...
- 使用策略者模式减少switch case 语句
策略者模式 很简单的一个定义:抽象策略(Strategy)类:定义了一个公共接口,各种不同的算法以不同的方式实现这个接口,环境角色使用这个接口调用不同的算法,一般使用接口或抽象类实现. 场景 在这之前 ...
- JAVA数组的基础入门>从零开始学java系列
目录 JAVA数组的基础入门 什么是数组,什么情况下使用数组 数组的创建方式 获取数组的数据 数组的内存模型 为什么数组查询修改快,而增删慢? 查询快的原因 增删慢的原因 数组的两种遍历方式以及区别 ...
- Java面向对象01——什么是面向对象
面向过程&面向对象 面向过程思想(微观): 步骤清晰简单,第一步做什么,第二部做什么....... 面向过程适合处理一些较为简单的问题 面向对象思想(宏观): 物以类聚,分类的思维模式,思考问 ...
- 【Python机器学习实战】感知机和支持向量机学习笔记(三)之SVM的实现
前面已经对感知机和SVM进行了简要的概述,本节是SVM算法的实现过程用于辅助理解SVM算法的具体内容,然后借助sklearn对SVM工具包进行实现. SVM算法的核心是SMO算法的实现,首先对SMO算 ...
- 易语言效率与C++究竟差多少(质数和计算)
文本首发bIlibili,cnblogs为作者补发,如在其他平台看见本文,均为经允许的盗窃 易语言作为款主打 中文 易用 编程的开发软件.但是很多人都在批评易语言的效率. 我们今天通过 质数和计算 来 ...