struts2框架学习笔记5:OGNL表达式
OGNL取值范围分两部分,root、Context两部分
可以放置任何对象作为ROOT,CONTEXT中必须是Map键值对
示例:
准备工作:
public void fun1() throws Exception {
// 准备ONGLContext
// 准备Root
User rootUser = new User("tom", 18);
// 准备Context
Map<String, User> context = new HashMap<String, User>();
context.put("user1", new User("jack", 18));
context.put("user2", new User("rose", 22));
OgnlContext oc = new OgnlContext();
// 将rootUser作为root部分
oc.setRoot(rootUser);
// 将context这个Map作为Context部分
oc.setValues(context);
// 书写OGNL
Ognl.getValue("", oc, oc.getRoot());
//在""中书写OGNL表达式即可
}
User类:
package bean;
public class User {
private String name;
private Integer age;
public User() {
super();
// TODO Auto-generated constructor stub
}
public User(String name, Integer age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
语法:
从root中取出对象:
// 取出root中user对象的name属性
String name = (String) Ognl.getValue("name", oc, oc.getRoot());
Integer age = (Integer) Ognl.getValue("age", oc, oc.getRoot());
从Context中取出对象:
// 取出context中键为user1对象的name属性
String name1 = (String) Ognl.getValue("#user1.name", oc, oc.getRoot());
String name2 = (String) Ognl.getValue("#user2.name", oc, oc.getRoot());
Integer age = (Integer) Ognl.getValue("#user2.age", oc, oc.getRoot());
为属性赋值:
// 将root中的user对象的name属性赋值
Ognl.getValue("name='jerry'", oc, oc.getRoot());
给context赋值:
String name2 = (String) Ognl.getValue("#user1.name='张三'", oc, oc.getRoot());
调用对象的方法:
// 调用root中user对象的setName方法
Ognl.getValue("setName('张三')", oc, oc.getRoot());
String name1 = (String) Ognl.getValue("getName()", oc, oc.getRoot()); String name2 = (String) Ognl.getValue("#user1.setName('lucy'),#user1.getName()", oc, oc.getRoot());
(注意:可以将两条语句写在一起,逗号分隔,返回值是最后一个语句)
调用静态方法:
Double pi = (Double) Ognl.getValue("@java.lang.Math@PI", oc,oc.getRoot());
创建对象:
// 创建list对象
Integer size = (Integer) Ognl.getValue("{'tom','jerry','jack','rose'}.size()", oc, oc.getRoot());
String name1 = (String) Ognl.getValue("{'tom','jerry','jack','rose'}[0]", oc, oc.getRoot());
String name2 = (String) Ognl.getValue("{'tom','jerry','jack','rose'}.get(1)", oc, oc.getRoot()); // 创建Map对象
Integer size2 = (Integer) Ognl.getValue("#{'name':'tom','age':18}.size()", oc, oc.getRoot());
String name3 = (String) Ognl.getValue("#{'name':'tom','age':18}['name']", oc, oc.getRoot());
Integer age = (Integer) Ognl.getValue("#{'name':'tom','age':18}.get('age')", oc, oc.getRoot());
OGNL表达式和Struts2结合原理:
OGNLContext本质上就是Struts2中的值栈(ValueStack)
ValueStack中有两部分:ROOT、CONTEXT
(队列:先进先出、栈:先进后出)
ROOT部分是一个栈,CONTEXT部分是ActionContext
ROOT中的这个栈本质是一个容器(集合)
例如用list集合制作栈结构容器:push压栈方法 list.add(0,a);、pop弹栈方法 list.remove(0),就可以模拟一个栈
Struts2中有一个类:CompoundRoot类就是一个栈,实现原理和上面类似
用栈的原因:在取栈中的属性时候,会从栈顶开始找属性,找不到继续向下找,找到停止
默认情况下栈中放置的是当前访问的Action对象。
OGNL表达式和Struts2结合的体现:
Struts2有一个拦截器params,作用是将获得的参数交给OGNL处理
struts2框架学习笔记5:OGNL表达式的更多相关文章
- Struts2学习笔记(OGNL表达式)
Struts 2支持以下几种表达式语言: OGNL(Object-Graph Navigation Language),可以方便地操作对象属性的开源表达式语言: JSTL(JSP Standard T ...
- j2ee开发之struts2框架学习笔记
Struts2框架技术重点笔记 1.Struts2 是在webwork基础上发展而来. 2.Struts2 不依赖struts API和 servlet API 3.Struts2提供了拦截器,表现层 ...
- [ SSH框架 ] Struts2框架学习之三(OGNl和ValueStack值栈学习)
一.OGNL概述 1.1 什么是OGNL OGNL的全称是对象图导航语言( object-graph Navigation Language),它是一种功能强大的开源表达式语言,使用这种表达式语言,可 ...
- struts2框架学习笔记7:struts2标签
三大标签: 1.JSP:脚本,为了替代servlet,已过时 2.JSTL:标准标签库(core.format.sql.xml),还未淘汰的只有core库 3.Struts2标签库:由Struts2开 ...
- Struts2框架学习笔记--strtus2初识
struts2概述: 1.struts2框架应用于javaEE三层结构中的Web层框架 2.struts2框架是在struts1和webwork基础之上发展的全新框架(脱胎换骨 ,用法完全不一样)ps ...
- struts2框架学习笔记1:搭建测试
Servlet是线程不安全的,Struts1是基于Servlet的框架 而Struts2是基于Filter的框架,解决了线程安全问题 因此Struts1和Struts2基本没有关系,只是创造者取名问题 ...
- Struts2框架学习笔记1
1,框架概述 1.1,什么是框架(了解) 将一些重复性的代码进行封装,简化程序员的编程操作,可以使得程序员在编码中把更多的精力放到业务需求的分析和理解上面,相当于一个半成品软件. 1.2,三大框架(掌 ...
- struts2框架学习笔记6:拦截器
拦截器是Struts2实现功能的核心部分 拦截器的创建: 第一种: package interceptor; import com.opensymphony.xwork2.ActionInvocati ...
- struts2框架学习笔记4:获取参数
第一种参数获取方式: 编写一个前端页面,提交表单,做示例: <form action="${pageContext.request.contextPath}/Demo1Action&q ...
随机推荐
- vsCode关闭代码检查工具
在script标签里,第一行输入下面的内容即可:
- String、StringBuffer、StringBuilder区别
String.StringBuffer.StringBuilder区别 StringBuffer.StringBuilder和String一样,也用来代表字符串.String类是不可变类,任何对Str ...
- 3、支付结果 /items/result?point=1&orderNo=201903211035400001
<template> <div> <div class="toppic"> <img src="../../../assets/ ...
- java学习笔记(十):scanner输入
可以通过 Scanner 类来获取用户的输入. 通过next()类和nextLine()类来获取字符串. 通过 Scanner 类的 next() 类来获取输入的字符串. import java.ut ...
- extJs相关名字解释
1.initComponent 初始化部件启动 2.defaults : Object defaults属性可以包含任意个name/value属性对,这些属性将会被添加到每一个元素中...例如, ...
- Python人工智能之路 - 第三篇 : PyAudio 实现录音 自动化交互实现问答
Python 很强大其原因就是因为它庞大的三方库 , 资源是非常的丰富 , 当然也不会缺少关于音频的库 关于音频, PyAudio 这个库, 可以实现开启麦克风录音, 可以播放音频文件等等,此刻我们不 ...
- sys、os 模块
sys 模块常见函数 sys.argv #命令行参数List,第一个元素是程序本身路径 sys.exit(n) #退出程序,正常退出时exit(0) sys.vers ...
- select2插件设置选中值并显示的问题
在select2中,要想设置指定值为选中状态并显示: $("#select2_Id").val("XXXXX").select2() 或者 var obj= $ ...
- vue js库的条件渲染
条件渲染 通过条件指令可以控制元素的创建(显示)或者销毁(隐藏),常用的条件指令如下: v-if v-if可以控制元素的创建或者销毁 <h1 v-if="ok">Yes ...
- 【读书笔记】深入应用C++11代码优化与工业级应用 读书笔记01
第一章 使用C++11让程序更简洁.更现代 1.1 类型推导 1.1.1 auto类型推导 1.auto关键字的新意义 不同于python等动态类型语言的运行时进行变量类型的推导,隐式类型定义的类 ...