一、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与值栈的更多相关文章

  1. Struts2笔记3--获取ServletAPI和OGNL与值栈

    获取ServletAPI: 第一种方式: //在request域中放入属性req,暂且认为getContext()获取的是request域空间,但实际不是 ActionContext.getConte ...

  2. struts2中,OGNL访问值栈的时候查找的顺序是什么?请排序:模型对象、临时对象、固定名称的对象、Action对象

    struts2中,OGNL访问值栈的时候查找的顺序是什么?请排序:模型对象.临时对象.固定名称的对象.Action对象 解答:struts2的值栈排列顺序为:1).临时对象:2).模型对象:3).Ac ...

  3. 框架学习之Struts2(三)---OGNL和值栈

    一.OGNL概述 1.1OGNL是对象图导航语言(Object-Graph Navigation Languaged)的缩写,他是一种功能强大的表达式语言,通过简单一致的表达式语法,可以存取Java对 ...

  4. EL与OGNL以及值栈的理解

    这里先添加下在项目遇到的问题: 这两天在做论坛项目的时候,犯了一个错误:将数据放入值栈中,结果jsp页面获取不到. 困扰了许久: 总结如下: (1)每个action对应相应页面的值栈中值的获取,在属于 ...

  5. Struts2 (三) — OGNL与值栈

    一.OGNL表达式 1.概述 1.1什么是OGNL ​ OGNL是Object-Graph Navigation Language的缩写,俗称对象图导航语言. 它是一种功能强大的表达式语言,通过它简单 ...

  6. OGNL与值栈

    一.OGNL入门 1.什么是OGNL OGNL的全称是对象图导航语言(Object-Graph Navigation Language),它是一种功能强大的开源表达式语言.使用这种表达式语言,可以通过 ...

  7. (转)OGNL与值栈

    http://blog.csdn.net/yerenyuan_pku/article/details/67709693 OGNL的概述 什么是OGNL 据度娘所说: OGNL是Object-Graph ...

  8. Struts工作机制图+OGNL+EL+值栈(Map,对象栈)

    struts 值栈  通过get set方法 方便的获取,设置属性值      比如从jsp页面传来的參数...从Action设置jsp所要回显的内容 注意EL表达式,struts2对request进 ...

  9. OGNL stack value 值栈(主要参考官方手册)

    The framework uses a standard naming context to evaluate OGNL expressions. The top level object deal ...

随机推荐

  1. Asp.Net Core2.2 源码阅读系列——控制台日志源码解析

      为了让我们第一时间知道程序的运行状态,Asp.Net Core 添加了默认的日志输出服务.这看起来并没有什么问题,对于开发人员也相当友好,但如果不了解日志输出的细节,也有可能因为错误的日志级别配置 ...

  2. [c++] 面试题之犄角旮旯 第壹章

    记录C/C++语言相关的问题. 算法可视化:https://visualgo.net/en <data structure and algorithm in c++> By Adam 有免 ...

  3. jenkins自动化部署项目5 -- 系统管理-系统设置ssh配置

    [系统管理]-[系统设置] 如果应用服务(前端后台)要部署在linux服务器上,我选择的是用ssh 为了jenkins登录远程登录linux服务器可以免密登录,先配置公钥和私钥: 我是在windows ...

  4. 我用阿里云的虚拟云主机,也能配置https加密吗?

    我用阿里云的虚拟云主机,也能配置https加密吗?答案是YES. 整个过程比想象中还要简单,都是一些基本的配置,虚拟主机 Web托管都可以很容易的搞定https. 首先我们要了解一下,阿里云是怎么支持 ...

  5. Java 提取Word中的文本和图片

    本文将介绍通过Java来提取或读取Word文档中文本和图片的方法.这里提取文本和图片包括同时提取文档正文当中以及页眉.页脚中的的文本和图片. 使用工具:Free Spire.Doc for Java ...

  6. Java 基础篇之集合

    List 集合 List 集合中元素有序.可重复,集合中每个元素都有其对应的索引顺序. List 判断两个对象相等,只要通过 equals 方法比较返回 true 即可. 看个例子: public c ...

  7. Spring IOC(1)----容器刷新(refresh())之前

    首先本次分析是基于注解形式的,想来xml格式的原理都是类似的. 首先说一下什么是Bean定义(beandefinition):bean定义并不是实例化的bean,而是bean对象的一些信息,根据这些定 ...

  8. 针对永久不过期的key 批量设置过期时间

    问题需求: redis内存暴增,后来发现有很多设置永久不过期. 解决:查找出来之后针对前缀批量设置过期时间 (过期时间与开发沟通 保证服务不受影响) 来源于网上杨一的代码 正好解决了我遇到的问题 在这 ...

  9. Ng项目安装到指定盘符

    全局安装 1.node.js 2.cnpm 3.typeScript 4.ng-cli 指定安装: 1.首先在想要的盘符内新建一个名字 例: D盘中新建一个angualr的文件夹 2.在开始菜单中输入 ...

  10. 手把手带你利用Ribbon实现客户端的负载均衡

    之前的文章<SpringCloud搭建注册中心与服务注册>介绍了注册中心的搭建和服务的注册,本文将介绍下服务消费者通过Ribbon调用服务实现负载均衡的过程. 本文目录 一.Ribbon服 ...