目录
1.OGNL
1.1OGNL概述
1.1.1什么是OCNL
1.1.2为什么学习OGNL
1.1.3OGNL使用的要素
1.2OGNL的Java环境入门(了解)
1.2.1访问对象的方法
1.2.2访问对象的静态方法
1.2.3获得root中的数据
1.2.4获得OgnlContext中的数据
1.3OGNL的Struts2环境入门
1.3.1访问对象的方法
1.3.2访问对象的静态方法
2.值栈
2.1值栈的概述
2.1.1什么是值栈
2.1.2值栈的内部结构
2.1.3值栈与ActionContext的关系
2.1.4获得值栈对象
2.1.5操作值栈
2.1.6获得值栈数据
2.1.7EL为何能访问值栈数据
3OGNL中的特殊字符
3.1#号
3.2%号
3.3$符号
OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言,通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。它使用相同的表达式去存取对象的属性。
OGNL:对象图导航语言,比EL表达式强大很多倍的语言。El从域对象中获取数据,OGNL调用对象的方法获取Struts2值栈的数据。OGNl其实是第三方的表达式语言。
1.表达式
2.根对象
3.Context对象
/**
* @Title: Ognl01.java
* @Package top.yangxianyang.struts2.ognl
* @Description: TODO(ognl入门)
* @author A18ccms A18ccms_gmail_com
* @date 2018年11月29日 下午3:01:43
* @version V1.0
*/
package top.yangxianyang.struts2.ognl;
import org.junit.Test;
import ognl.Ognl;
import ognl.OgnlContext;
import ognl.OgnlException;
/**
*
* 项目名称:Strutsday03
* 类名称:Ognl01
* 类描述:ognl入门
* 创建人:yangyangyang
* 创建时间:2018年11月29日 下午3:01:43
* 修改人:yangyangyang
* 修改时间:2018年11月29日 下午3:01:43
* 修改备注:
* @version
*
*/
public class Ognl01 {
@Test
/*
* OGNL调用对象方法
*/
public void demo1() throws OgnlException {
//获得Context
OgnlContext context =new OgnlContext();
//获得对象
Object root=context.getRoot();
//执行表达式
Object b=Ognl.getValue("'helloword'.length()", context, root);
System.out.println(b);
}
}
@Test
/*
* OGNL调用静态方法
*/
public void demo2() throws OgnlException {
//获得Context
OgnlContext context =new OgnlContext();
//获得对象
Object root=context.getRoot();
//执行表达式 :@类名@方法名
Object b=Ognl.getValue("@java.lang.Math@random()", context, root);
System.out.println(b);
}
@Test
/*
* 获得Root中的数据,不需要加#
*/
public void demo3() throws OgnlException {
//获得Context
OgnlContext context =new OgnlContext();
//获得对象
User u=new User("ccc","123");
context.setRoot(u);
Object root=context.getRoot();
//执行表达式
String b=(String) Ognl.getValue("username", context, root);
System.out.println(b);
}
@Test
/*
* 获得Root中的数据,需要加#
*/
public void demo4() throws OgnlException {
//获得Context
OgnlContext context =new OgnlContext();
//获得对象
Object root=context.getRoot();
//向Context中存入数据
context.put("name", "数据的神色");
//执行表达式
String b=(String) Ognl.getValue("#name", context, root);
System.out.println(b);
}
OGNL在Struts2环境中的入门
调用对象方法
先开启支持:
页面编写:
调用静态对象方法
Struts2将XWork对Ognl的扩展这一套机制封装起来,这个对象叫ValueStack。
ValueStack实际上就是一个容器。它由Struts框架创建,当前端页面如jsp发送一个请求时,Struts的默认拦截器会将请求中的数据进行封装,并入ValueStack的栈顶。
ValueStack是Struts2的一个接口,字面意义为值栈,OgnlValueStack是 ValueStack的实现类,客 户端发起一个请求,struts2架构会创建一个action实例同时创建一个OgnlValueStack值栈实例, OgnlValueStack贯穿整个Action的生命周期,struts2中使用OGNL将请求Action的参数封装为对象存储 到值栈中,并通过OGNL表达式读取值栈中的对象属性值。
ValueStack中有两个主要的区域:
操作栈主要指的是操作ValueStack中的root区域。
public class ValueStackDemo2 extends ActionSupport {
@Override
public String execute() throws Exception {
// 第一种,通过ActionContext获得
ValueStack vs1 = ActionContext.getContext().getValueStack();
// 第二种 通过request对象获取
ValueStack vs2 = (ValueStack) ServletActionContext.getRequest()
.getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY);
System.out.println(vs1 == vs2);
return NONE;
}
}
Action编写:
/**
* @Title: ValueStackDemo3.java
* @Package top.yangxianyang.struts2.ValueStack
* @Description: TODO(用一句话描述该文件做什么)
* @author A18ccms A18ccms_gmail_com
* @date 2018年11月30日 下午2:47:15
* @version V1.0
*/
package top.yangxianyang.struts2.ValueStack;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.util.ValueStack;
import top.yangxianyang.struts2.entity.User;
/**
*
* 项目名称:Strutsday03
* 类名称:ValueStackDemo3
* 类描述: 操作ValueStack
* 创建人:yangyangyang
* 创建时间:2018年11月30日 下午2:47:15
* 修改人:yangyangyang
* 修改时间:2018年11月30日 下午2:47:15
* 修改备注:
* @version
*
*/
public class ValueStackDemo3 extends ActionSupport{
private User user;
//
// public User getUser() {
// return user;
// }
@Override
public String execute() throws Exception {
//第一种:在Action中提供属性的get方法
//user=new User("王五","123456");
//第二种,向值栈中保存数据
//获取值栈对象
ValueStack vs=ActionContext.getContext().getValueStack();
//使用push(Object obj);set(String key,Object obj)
user=new User("张丽","123456忐忑");
//现在user在栈顶
vs.push(user);
//创建一个Map集合,将map压入栈顶
vs.set("name", "张家辉");
return SUCCESS;
}
}
页面编写:
第一种
第二种
获取值栈中的数据在页面中使用OGNL表达式即可:
Action页面
public class ValueStackDemo4 extends ActionSupport {
@Override
public String execute() throws Exception {
//获取值栈对象
ValueStack vs=ActionContext.getContext().getValueStack();
//向值栈中保存数据
User user=new User("aaa张丽","123456忐忑");
vs.push(user);
//向值栈中保存集合
List users =new ArrayList();
users.add(new User("啊啊啊","34esw"));
users.add(new User("哈哈哈","3s4ew"));
users.add(new User("呵呵呵","34esw"));
users.add(new User("嘿嘿","34sdew"));
users.add(new User("悠悠","34dew"));
vs.set("list", users);
//向context中存入数据
ServletActionContext.getRequest().setAttribute("name", "嘿嘿嘿嘿嘿嘿");
ServletActionContext.getRequest().getSession().setAttribute("name", "呀呀呀呀呀呀呀呀呀呀呀");
ServletActionContext.getServletContext().setAttribute("name", "youyouiiouuuuuuu");
return SUCCESS;
}
}
Jsp页面
因为Struts2的框架的底层对request.getAttribute(String name)进行了增强。
#号的用法
获取Context的数据
<%
request.setAttribute("name", "杨吖颖");
%>
构建Map集合
--
--
--
强制解析OGNL
%号的用法
姓名:
在配置文件中使用OGNL
源码:链接: https://pan.baidu.com/s/1q_nkDYAxPQRwAWBG1yg2Sg 提取码: g5xd 复制这段内容后打开百度网盘手机App,操作更方便哦