4、OGNL与值栈
一、OGNL
1、什么是OGNL
对象导航图语言(Object Graph Navigation Language),简称OGNL,是应用于Java中的一个开源的表达式语言(Expression Language),它被集成在Struts2等框架中,作用是对数据进行访问,它拥有类型转换、访问对象方法、操作集合对象等功能
2、OGNL的作用
支持对象方法调用
支持类静态方法调用和值访问,表达式的格式为@[类全名(包括包路径)]@[方法名|值名]
支持赋值操作和表达式串联
访问OGNL上下文和ActionContext
操作集合对象
3、OGNL的要素
表达式:是整个OGNL的核心,OGNL会根据表达死去对象中取值。所有OGNL操作都是针对表达式解析后进行的。他表明了此次OGNL操作要做什么
根对象(Root):可以理解为OGNL的操作对象,表达式规定了做什么,而root对象则规定了对谁操作。
Context对象:上下文环境规定了OGNL的操作在哪里进行,上下文环境Context是一个Map类型的对象,在表达式中访问Context中的对象,需要使用#号加上对象名称
二、普通Java项目使用OGNL
package com.turtle.demo2; import ognl.Ognl;
import ognl.OgnlContext;
import ognl.OgnlException; import java.util.HashMap;
import java.util.Map; public class OgnlDemo {
public static void main(String[] args) throws OgnlException {
OgnlContext ognlContext = new OgnlContext(); String lengthStr = Ognl.getValue("'Hello Ognl'.length()", ognlContext, ognlContext.getRoot()).toString();
System.out.println("字符串的长度为"+lengthStr); // 静态方法的调用方式
String value = Ognl.getValue("@java.lang.Math@random()*100", ognlContext, ognlContext.getRoot()).toString();
System.out.println("取到的随机值为"+value); // 从Root对象中取数据
Map<String,String> map = new HashMap<>();
map.put("name","Turtle");
ognlContext.setRoot(map);
String name = Ognl.getValue("name",ognlContext,ognlContext.getRoot()).toString();
System.out.println(name); }
}
三、值栈
1、ValueStack是Struts的一个接口
OgnlValueStack是ValueStack的实现类,客户端发起一个请求Struts2架构会创建一个Action实例,同时创建一个OgnlValueStack值栈实例,OgnlValueStack贯穿整个Action的生命周期,Struts2中使用OGNL将请求Action的参数封装为对象存储到值栈中,并通过OGNL表达式读取值栈中的对象属性值。
2、Context:即OgnlContext上下文
它是一个map结构,上下文中存储了一些引用,parameters、request、session、application等,上下文的Root为CompoundRoot
OgnlContext中的一些引用:
parameters:包含当前请求参数
request:包含当前request对象中的所有属性
session:包含当前session对象中的所有属性
application:包含当前application对象中的所有属性
attr:该Map按如下顺序来检索某个属性:request、session、application。
3、CompoundRoot:存储了action实例,它作为OgnlContext的Root对象
OgnlContext的Root继承ArrayList实现压栈和出栈的功能,拥有栈的特点,先进先出,后进后出,最后压进栈的数据在栈顶,称为对象栈。
Struts2对原Ognl做出改进,Root使用CompoundRoot(自定义栈),使用OgnlValueStack的findValue方法可以在CompoundRoot中从栈顶向栈底查找的对象的属性值。
CompoundRoot作为OgnlContext的Root对象,并且在CompoundRoot中action实例位于栈顶,当读取action的属性时候先从栈顶对象中找对应的属性,如果找不到
则继续找栈中的其他对象,如果找到则停止查找。
4、ActinContext和ValueStack的关系:
在创建ActionContext的时候,创建ValueStack的对象,将ValueStack对象给ActionContextActionContext中有一个ValueStack的引用,ValueStack中也有一个ActionContext的引用ActionContext获取ServletAPI的时候,依赖值栈
5、获取值栈对象
通过ActionContext对象获取
通过request域获取值栈
ValueStack valueStack1 = ActionContext.getContext().getValueStack(); ValueStack valueStack2 = (ValueStack) ServletActionContext.getRequest().getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY);
6、操作值栈
对action类中的属性提供get方法的方式
因为Action本身在值栈中,Action中的属性也就默认在值栈中了,所以我们可以通过Action的属性提供get方法的方式来操作值栈
手动操作值栈
调用值栈的push和set方法对值栈进行操作
7、访问值栈的数据
#号的使用:
获取context的数据:
<s:property value="#request.name"/>
在使用struts的UI标签的时候,用于构建一个Map集合
<s:iterator value="#{'a':'1','b':'2','c':'3'}" var="entry">
<%--使用key-value来取值--%>
<s:property value="key"/>======<s:property value="value"/><br/>
<%--使用var变量中的key -- value 来取值--%>
<s:property value="#entry.key"/>=====<s:property value="#entry.value"/>
</s:iterator>
%号的使用:
%强制解析OGNl表达式:
<s:textfield name="name" value="%{#request.name}"/>
%强制不解析OGNl表达式:
<s:property value="%{'#request,name'}"/>
$号的使用:
在配置文件中使用Ognl表达式:在struts的配置文件中使用 .xml文件或者是属性文件
4、OGNL与值栈的更多相关文章
- Struts2笔记3--获取ServletAPI和OGNL与值栈
获取ServletAPI: 第一种方式: //在request域中放入属性req,暂且认为getContext()获取的是request域空间,但实际不是 ActionContext.getConte ...
- struts2中,OGNL访问值栈的时候查找的顺序是什么?请排序:模型对象、临时对象、固定名称的对象、Action对象
struts2中,OGNL访问值栈的时候查找的顺序是什么?请排序:模型对象.临时对象.固定名称的对象.Action对象 解答:struts2的值栈排列顺序为:1).临时对象:2).模型对象:3).Ac ...
- 框架学习之Struts2(三)---OGNL和值栈
一.OGNL概述 1.1OGNL是对象图导航语言(Object-Graph Navigation Languaged)的缩写,他是一种功能强大的表达式语言,通过简单一致的表达式语法,可以存取Java对 ...
- EL与OGNL以及值栈的理解
这里先添加下在项目遇到的问题: 这两天在做论坛项目的时候,犯了一个错误:将数据放入值栈中,结果jsp页面获取不到. 困扰了许久: 总结如下: (1)每个action对应相应页面的值栈中值的获取,在属于 ...
- Struts2 (三) — OGNL与值栈
一.OGNL表达式 1.概述 1.1什么是OGNL OGNL是Object-Graph Navigation Language的缩写,俗称对象图导航语言. 它是一种功能强大的表达式语言,通过它简单 ...
- OGNL与值栈
一.OGNL入门 1.什么是OGNL OGNL的全称是对象图导航语言(Object-Graph Navigation Language),它是一种功能强大的开源表达式语言.使用这种表达式语言,可以通过 ...
- (转)OGNL与值栈
http://blog.csdn.net/yerenyuan_pku/article/details/67709693 OGNL的概述 什么是OGNL 据度娘所说: OGNL是Object-Graph ...
- Struts工作机制图+OGNL+EL+值栈(Map,对象栈)
struts 值栈 通过get set方法 方便的获取,设置属性值 比如从jsp页面传来的參数...从Action设置jsp所要回显的内容 注意EL表达式,struts2对request进 ...
- OGNL stack value 值栈(主要参考官方手册)
The framework uses a standard naming context to evaluate OGNL expressions. The top level object deal ...
随机推荐
- java线上cpu、内存问题排查方法
一.线程 查进程中占用cpu高的线程 ps -mp xxxxx -o THREAD,tid,time | sort -rn 将线程的id从10位转到16位,可以在下面jstack中找到对应线程 输出线 ...
- docker运行jexus+mono爬坑记
新的.net core都已经支持docker.手头有一些原来开发的asp.net旧项目,用的asp.net mvc开发的,跑在.net formwork 4.6上. 在docker的公共仓库searc ...
- 程序员写 2000 行 if else?领导:这个锅我不背
前言 知乎上有小伙伴提了这么一个问题,如何看待陕西省普通话水平测试成绩查询系统?查询系统前端代码就直接给出了身份账号,姓名,证书编号,如果信息是真的,就泄露了这么多考生的信息,白给那种.为什么会发生这 ...
- vue中关于滚动条的那点事
vue中关于滚动条的那点事 不知道你有没有遇到过这种情况,有时当页面切换时,滚动条不在页面的顶端.最近半路加入一个项目,就遇到这种情况.(若只是为了解决此问题,可直接翻到最下方)下面谈谈解决此问题的过 ...
- 从SpringMVC获取用户信息谈起
Github地址:https://github.com/andyslin/spring-ext 编译.运行环境:JDK 8 + Maven 3 + IDEA + Lombok spring-boot: ...
- Spring boot 梳理 - @SpringBootConfiguration
@SpringBootConfiguration继承自@Configuration,二者功能也一致,标注当前类是配置类, 并会将当前类内声明的一个或多个以@Bean注解标记的方法的实例纳入到sprin ...
- Spring boot 梳理 - Spring boot 与 JSP
若使用Spring boot 开发web应用中使用jsp,需要打包成war,并部署到非嵌入式servlet容器中运行,在嵌入式servlet中无法运行,且需要匹配非嵌入式servlet版本与Sprin ...
- 读《深入理解Elasticsearch》点滴-改善查询相关性
1.标准查询 query match _all query:"搜索字符串" operator:or 2.多匹配查询+区分权重 query multi_match "que ...
- 读《深入理解Elasticsearch》点滴-查询分类
1.如何分类,略.个人不接受书中的分类方法,建议采用官网上的分类方法 2.term查询,可以模拟No-SQL数据库
- 基于 HTML5 和 WebGL 的地铁站 3D 可视化系统
前言 工业互联网,物联网,可视化等名词在我们现在信息化的大背景下已经是耳熟能详,日常生活的交通,出行,吃穿等可能都可以用信息化的方式来为我们表达,在传统的可视化监控领域,一般都是基于 Web SCAD ...