struts2之ognl表达式

point transformer v3结构 分割结构: embedding->enc->dec embedding->enc0->enc1->enc2->enc3->enc4->dec3->dec2->dec1->dec0 embedding ->block0->block1 ->dow->block0->block1 ->dow->block0->block1 ->dow->block0->block1-&gt 阅读详情

struts2之ognl基础

前言

之前讲了基于maven的struts2框架项目的简单流程,这次主要讲关于struts2的ognl。

ognl

什么是ognl?

OGNL的全称是Object Graph Navigation Language(对象图导航语言),它是一种强大的表达式语言。

说起表达式语言我们就会想起来el表达式,ognl表达式与el表达式最大的区别就是他可以存值也可以取值,而el表达式只能取值。

什么是ognl上下文?

OgnlContext(OGNL上下文)其实就是一个map集合,(无序,键不能重复值能重复,无下标)

OgnlContext由根对象(1)+非根对象(N)组成(就像一个老板带着很多小弟)

非根对象要通过"#key"访问,根对象可以省略"#key"(非跟对象就像小弟,跟对象就像老板,别人叫你们当中的老板直接叫老板过来一下,而叫小弟需要叫出其名字才能找到这个人)

Struts2中OGNL Context上下文的实现者为ActionContext。

actionContext中ognl结构图:

在这里插入图片描述

每发送一个请求,一定会产生一个新的actionContext,他又会产生五个基础对象即上图所述,其中有一个跟对象(valueStack)和非跟对象,只要这个请求没有发生改变,这个actionContext就不会发生改变,即使你重新new一次。只有请求销毁或者重新发送请求。

ognl对应的方法:

package com.zengjing.util;

import ognl.Ognl;
import ognl.OgnlContext;
import ognl.OgnlException;

/**
 * 用于OGNL表达计算的一个工具类
 * 
 */
public class OnglExpression {
	private OnglExpression() {
	}

	/**
	 * 根据OGNL表达式进行取值操作
	 * 
	 * @param expression
	 *            ognl表达式
	 * @param ctx
	 *            ognl上下文
	 * @param rootObject
	 *            ognl根对象
	 * @return
	 */
	public static Object getValue(String expression, OgnlContext ctx,
			Object rootObject) {
		try {
			return Ognl.getValue(expression, ctx, rootObject);
		} catch (OgnlException e) {
			throw new RuntimeException(e);
		}
	}

	/**
	 * 根据OGNL表达式进行赋值操作
	 * 
	 * @param expression
	 *            ognl表达式
	 * @param ctx
	 *            ognl上下文
	 * @param rootObject
	 *            ognl根对象
	 * @param value
	 *            值对象
	 */
	public static void setValue(String expression, OgnlContext ctx,
			Object rootObject, Object value) {
		try {
			Ognl.setValue(expression, ctx, rootObject, value);
		} catch (OgnlException e) {
			throw new RuntimeException(e);
		}
	}
}

这边写了个demo来测试ognl上下文的方法:

package com.zengjing.entity;

import com.zengjing.entity.Employee;
import com.zengjing.entity.Manager;
import com.zengjing.util.OnglExpression;

import ognl.OgnlContext;
import ognl.OgnlException;

public class Demo1 {

	/**
	 * @param args
	 * @throws OgnlException
	 */
	public static void main(String[] args)  {
		Employee e = new Employee();
		e.setName("小李");

		Manager m = new Manager();
		m.setName("张经理");

		// 创建OGNL下文,而OGNL上下文实际上就是一个Map对象
		OgnlContext ctx = new OgnlContext();

		// 将员工和经理放到OGNL上下文当中去
		ctx.put("employee", e);
		ctx.put("manager", m);
		ctx.setRoot(e);// 设置OGNL上下文的根对象

		/** ********************** 取值操作 *************************** */
		// 表达式name将执行e.getName(),因为e对象是根对象(请注意根对象和非根对象表达式的区别)
		String employeeName = (String) OnglExpression.getValue("name", ctx, e);
		System.out.println(employeeName);

		// 表达式#manager.name将执行m.getName(),注意:如果访问的不是根对象那么必须在前面加上一个名称空间,例如:#manager.name
		String managerName = (String) OnglExpression.getValue("#manager.name",
				ctx, e);
		System.out.println(managerName);

		// 当然根对象也可以使用#employee.name表达式进行访问
		employeeName = (String) OnglExpression.getValue("#employee.name", ctx,
				e);
		System.out.println(employeeName);

		/** ********************** 赋值操作 *************************** */
		OnglExpression.setValue("name", ctx, e, "小明");
		employeeName = (String) OnglExpression.getValue("name", ctx, e);
		System.out.println(employeeName);

		OnglExpression.setValue("#manager.name", ctx, e, "孙经理");
		managerName = (String) OnglExpression.getValue("#manager.name", ctx, e);
		System.out.println(managerName);

		OnglExpression.setValue("#employee.name", ctx, e, "小芳");
		employeeName = (String) OnglExpression.getValue("name", ctx, e);
		System.out.println(employeeName);
	}

}

ValueStack(值栈)

什么是值栈?

先进后出的数据结构,类似于弹夹push/pop(先进去的后打出来)

值栈的作用?

作用域的方式用来存值,在页面和后台之间进行数据传递。在action中将数据存入值栈,然后在页面中通过el表达式或ognl表达式取值。

值栈的存储位置?

值栈存储在Action对象中,每创建一个Action对象(ActionContext),就是创建一个ValueStack值栈对象,同一个Action对象中只会有一个ValueStack。

【DeepSeek开发入门】DeepSeek API 开发初体验 在人工智能蓬勃发展的时代,DeepSeek作为一款功能强大的AI大模型,为开发者提供了丰富的接口和便捷的开发体验。本文将基于DeepSeek的几个关键接口,带你快速入门,开启DeepSeek开发的探索之旅。通过本文,你已经初步了解了DeepSeek开发中几个重要接口的使用方法,包括列出模型、对话补全和查询余额接口,以及开发过程中的常见问题及解决办法。这是你踏入DeepSeek开发领域的第一步。在后续的学习中,你可以深入研究模型的参数调优,探索不同模型在各种场景下的应用,如利用模型实现更复杂的推理对话功能。 阅读详情

相关推荐

手把手教你逆向京东搜索接口:H5ST 556位参数生成与V8补环境技巧

本文深入解析了京东搜索接口中关键的H5ST 556位参数生成机制,并提供了详细的逆向实战指南。针对其复杂的反爬虫环境检测,文章重点介绍了通过链式补环境技巧,在Node.js中完整模拟浏览器环境(包括原型链检测和指纹验证)的方法,帮助开发者成功绕过防护并生成有效参数。

weixin_29315091的博客 480

Struts2之OGNL表达式

Struts2之OGNL表达式

qq_42640067的博客 1097

植物GO注释

本文主要是对没有GO term库的植物进行注释。 1、选用AgriGo 进行注释,在agriGO中点击species后,查看与你目标物种相近的物种作为库 2、比如我以甜菜为例 为了找到和GO term对应的ID,先找到PLAZA,进入网站https://bioinformatics.psb.ugent.be/plaza/versions/plaza_v3_di...

weixin_30300225的博客 2224

Maven Struts2

org.apache.struts struts2-core ${struts.version} org.apache.struts struts2-json-plugin ${struts.version} org.apache.struts struts2-spring-plugin ${struts.version}

十年彩虹 745

开源AI数字人DUIX:从零构建你的智能交互助手

本文详细介绍了如何利用开源AI数字人DUIX从零构建智能交互助手。文章阐述了DUIX作为开源项目的核心优势,包括低成本启动、低网络依赖和高度可定制性,并提供了从开发环境搭建、核心模块(AI模型、语音、形象)配置到个性化业务逻辑开发与最终部署的完整实践指南,帮助开发者快速掌握构建专属AI数字人的全流程。

weixin_29051811的博客 504

Docker深度详解:从原理到实践的全方位指南

本文深入解析了Docker容器化技术的核心原理与实战应用。主要内容包括:1) Docker核心架构与优势,对比容器与虚拟机的关键差异;2) 企业级部署方案,涵盖离线安装与多镜像源配置;3) 高级镜像构建技术,如参数化构建、缓存优化及安全扫描;4) 容器生命周期管理,包括健康检查、资源限制及数据持久化方案。文章提供了丰富的代码示例和生产级配置建议,如使用Trivy进行安全扫描、精确控制容器资源等技术细节,帮助开发者全面掌握现代容器化技术。

weixin_42593797的博客 1280

ognl表达式系列3--ognl在struts2环境的基本使用

引用自:https://www.cnblogs.com/ends-earth/p/10714068.html jsp中需要引入ognl标签库才能用 <%@ taglib uri="/struts-tags" prefix=“s” %> 1)访问对象中的方法 <s:property value="'helloworld'.length()"/> 2.访问静态方法 struts2中默认静态访问方法是关闭的(默认设置在struts2-core-xxx.jar 包中的 .

qq_37326058的博客 356

FPGA实战:用DDR3和乒乓操作解决视频帧撕裂问题(附Verilog代码)

本文详细介绍了如何利用DDR3内存和乒乓操作架构解决FPGA视频处理中的帧撕裂问题。通过多帧缓存原理、AXI接口配置和自适应乒乓操作设计,有效隔离读写操作,确保视频流稳定传输。文章包含Verilog代码实现和性能优化技巧,适用于工业相机、医疗影像等高速视频处理场景。

m2n3b4v5c6的博客 289

Struts2使用OGNI

1.我们可以使用这些标签直接定义request ,session.application request:    session:    application:    2.我们之前直接访问的属性是因为我们访问的值栈对象 3.我们访问非值栈对象 #application.username

Keepsmileq的博客 421

Microsemi Libero使用技巧11——CoreUARTAPB RX管脚分配时不显示

调用串口IP核CoreUARTAPB,并例化到顶层设计,发现UART_RX管脚在进行管脚分配时没有显示出来,最后发现是CoreAPB3总线IP核配置不对导致,改为如下配置后正常。

whik1194的博客 757

多角度模板匹配的模板创建技巧

基于形状的模板匹配多角度创建技巧

manuoo的专栏 3402

Struts2——OGNL表达式

一、简介 OGNL(对象图导航语言:Object Graphic Navigation Language),是Struts2框架默认的表达式语言。 作用:取值,获取javaBean中的属性,获取List或者数组元素,获得Map的键值对,还可以执行逻辑运算。 二、OGNL三要素 1.表达式 2.根对象root 3.上下文context 三、例子 三个类,User为根对象,User类中包含group作为成员变量,Group类中包含branch作为成员变量,分别提供对应变量的get,set方法 pac

是草莓味的啊 529

RAG面试内容整理-8. 文档分块策略(滑动窗口、语义切分)

RAG系统通常面对长文档或整篇知识库资料的检索需求,但大模型一次处理的文本长度有限,向量索引也需固定大小的文本片段。因此,将长文档拆分成合适片段是必不可少的步骤,被称为文档分块(chunking)策略。

不务正业的猿 690

Struts2学习笔记三:OGNL表达式学习、Struts2与Ognl表达式的结合原理

文章目录1. Struts2学习笔记三:OGNL表达式学习、Struts2与Ognl表达式的结合原理1.1. 什么是OGNL表达式1.2. 使用OGNL表达式1.3. Struts2和ONGL表达式的结合原理 1. Struts2学习笔记三:OGNL表达式学习、Struts2与Ognl表达式的结合原理 1.1. 什么是OGNL表达式 OGNL:对象视图导航语言,是比EL表达式有更加丰富的功能,E...

公子&小白的博客 725

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

深入解析Struts2中的OGNL表达式及其强大功能

值栈(ValueStack)是什么值栈(ValueStack),是 Struts2 的数据中转站,栈中自动保存了当前Action 对象和其他相关对象(包括常用的 Web 对象的引用,如 request、session、application 等),也可以手动保存自己的数据对象,同时也可以随时随地将对象从值栈取出或操作(通过 OGNL 表达式)值栈(ValueStack),

蓝鲸鱼计算机软件开发工作室 1308

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Struts2之Ognl表达式

这里写目录标题前言Mock.js简介Mock.js使用步骤2.1 安装mockjs依赖2.2 引入2.3 目录和文件创建 前言 前后端分离开发开发过程当中,经常会遇到以下几个尴尬的场景: 老大,接口文档还没输出,我的好多活干不下去啊! 后端小哥,接口写好了没,我要测试啊! 前后端分离之后,前端迫切需要一种机制, 不再需要依赖后端接口开发, 而今天的主角mockjs就可以做到这一点 ! Mock.js简介 Mock.js是一个模拟数据的生成器,用来帮助前端调试开发、进行前后端的原型分离以及用来提高自动化

月亮投递员的博客 549

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Struts2中OGNL表达式的用法

今天分享的是Struts2框架中的一种ognl表达式语言,主要分两个目标去学习     1.理解struts2传值的优先级     2.ognl与el的区别 一:ognl表达式语言简介   OGNL的全称是Object Graph Navigation Language(对象图导航语言),它是一种强大的表达式语言,让你通过简单一致的表达式语法来读取和设置Java对象的属性...

a846075506的博客 315

Struts2—Ognl 表达式

补充一下Ognl表达式的相关的知识点。尽量调有用的知识点来进行记录。Ognl:Object-Graph Navigation Language,表达式语言,Java能做的,都可以使用OGNL来完成,实际上相当于动态的Java代码执行。

王嘟嘟的博客 977

Struts2(15)_Struts2 的 ognl 表达式

本系列博客汇总在这里:Struts2 汇总 ognl 表达式一、什么是 ognl 表达式二、ognl 对普通方法的调用三、ognl 对静态变量和静态方法的调用四、ActionContext1、在 context map 中存取数据2、在值栈中存取数据 源码工程文件为:struts2_17 一、什么是 ognl 表达式 OGNL 是 Object Graphic Navigation Lan...

魏宇轩 652

Struts2--用OGNL表达式从域中取值

在实际开发过程中,OGNL 表达式要结合 struts2 的标签使用,主要就是%、#和$三个符号的使用。 # 符号 在 Struts2 框架中,#符号有三种用途,分别如下: 1.访问非跟对象的属性 如访问 OGNL 上下文和 Action 上下文。由于 Struts2 中值栈被视为根对象,所以访问其他非根对象时,需要加#前缀。 #相当于 ActionContext.getContext()。例如‘...

吴声子夜歌的博客 749

Struts2中OGNL表达式

前提:在struts2中要使用OGNL表达式,必须放到Struts2的标签中。 与jsp,servlet对比

Newstar优快云的博客 9128

struts2中的ognl表达式

1、object graph navigation language 对象导航图语言 2、ognl和struts2没有必然的关系,它不是真正的编程语言,它只是一种数据访问语言。 3、在struts2中ognl完成数据设置,类型转换两个功能,Apache推荐使用。 4、需要的jar包  ognl-3.1.15.jar  javassist-3.20.0-GA.jar 5、ognl的思想 把数...

底层码农 1万+

Struts2中的OGNL表达式

浅析值栈 ValueStack对象相当于一个栈,它贯穿整个Action的生命周期,每个Action类的对象实例都会拥有一个ValueStack对象 当Struts2接收到一个*.action请求后,并不是直接调用Action方法,而是先将Action类的相应属性放到ValueStack对象的顶层节点 值栈也位于内存中,它也是和parameters、request、session、applic

wxwlife2006的专栏 1万+

Struts2:OGNL表达式

OGNL表达式 OGNL(Object-Graph Navigation Language)的全称是对象图导航语言,是一个用来获取和设置java对象属性的表达式语言的开源表达式语言,通过使用表达式语法导航对象图,而不是直接调用对象的获取和设置方法。同时它可以提供许多应用,比如在XML文件或者脚本文件中嵌入OGNL表达式语法,在JSP页面使用OGNL表达式语法。 OGNL的三要素 一、表达式:...

离开屏幕的光,哪盏灯照亮你的孤独? 417

Struts2的OGNL表达式语言(转)

1.OGNL表达式语言OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,它是一个开源项目。 Struts 2框架使用OGNL作为默认的表达式语言。 相对EL表达式,它提供了平时我们需要的一些功能,如:支持对象方法调用,如xxx.sayHello(); 支持类静态方法调用和值访问,表达式的格式为@[类全名(包括包路径)]@[方法名 | 值名],

388

Struts2 OGNL表达式

访问值栈中普通属性 Ognl类中创建一个简单的属性username(设置set get方法),传入参数username=u。 获取值栈中普通属性OGNL表达式 <li >访问值栈中的action的普通属性: username = <s:property value="username"/> </li> 访问值栈中对象 创建user对象,在action中创建us...

OVO_LQ_Start的博客 286
上一篇: 基于maven搭建struts2框架项目
下一篇: Hibernate框架入门
Jiang呀
博客等级 码龄7年 16粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值