el表达式笔记及ognl

news2024/7/4 0:39:11

文章目录

    • spel底层
      • spel核心代码
        • TokenKind源码
      • spel本地调试
    • spel示例
        • spel list例子
        • spel 对象例子
        • spel list例子
        • SimpleEvaluationContext 类找不到
          • ##### spel 如何表示包含(也就是like)?
        • spel官网文档
      • ognl表达式
      • ognl和表达式语言的区别

这里重点说下SPEL(Spring Expression Language)。

spel底层

还是那句话,没有谁想要研究底层,除非他遇到问题解不了。
个人就是这种情况,如:spel模糊匹配怎么弄?
文档中的例子不一定全,简单说就是比较概括,但是底层代码却是最完整的。

什么?看代码太麻烦。恰恰相反,最复杂的就是最简单的,看了看代码,反而对spel的了解深入了些。

spel核心代码

核心代码在这里(表达式非模板,模板有另外的解析):
org.springframework.expression.spel.standard.InternalSpelExpressionParser.eatExpression()

它的机制比较清楚。简单说就是根据符号,进行解析

TokenKind源码

这个枚举类很关键,所有的表达式符号都在这里,所以不用去查是否支持了,看这个类就一目了然。

照搬源码:

enum TokenKind {

	// ordered by priority - operands first

	LITERAL_INT,

	LITERAL_LONG,

	LITERAL_HEXINT,

	LITERAL_HEXLONG,

	LITERAL_STRING,

	LITERAL_REAL,

	LITERAL_REAL_FLOAT,

	LPAREN("("),

	RPAREN(")"),

	COMMA(","),

	IDENTIFIER,

	COLON(":"),

	HASH("#"),

	RSQUARE("]"),

	LSQUARE("["),

	LCURLY("{"),

	RCURLY("}"),

	DOT("."),

	PLUS("+"),

	STAR("*"),

	MINUS("-"),

	SELECT_FIRST("^["),

	SELECT_LAST("$["),

	QMARK("?"),

	PROJECT("!["),

	DIV("/"),

	GE(">="),

	GT(">"),

	LE("<="),

	LT("<"),

	EQ("=="),

	NE("!="),

	MOD("%"),

	NOT("!"),

	ASSIGN("="),

	INSTANCEOF("instanceof"),

	MATCHES("matches"),

	BETWEEN("between"),

	SELECT("?["),

	POWER("^"),

	ELVIS("?:"),

	SAFE_NAVI("?."),

	BEAN_REF("@"),

	FACTORY_BEAN_REF("&"),

	SYMBOLIC_OR("||"),

	SYMBOLIC_AND("&&"),

	INC("++"),

	DEC("--");


	final char[] tokenChars;

	final private boolean hasPayload;  // is there more to this token than simply the kind


	private TokenKind(String tokenString) {
		this.tokenChars = tokenString.toCharArray();
		this.hasPayload = (this.tokenChars.length == 0);
	}

	private TokenKind() {
		this("");
	}


	@Override
	public String toString() {
		return (name() + (this.tokenChars.length !=0 ? "(" + new String(this.tokenChars) +")" : ""));
	}

	public boolean hasPayload() {
		return this.hasPayload;
	}

	public int getLength() {
		return this.tokenChars.length;
	}

}

spel本地调试

通过属性注入的方式也不慢,但是还有更简单的方式,就是本地直接调试,如在main方法里面。

不只一种方式可以配置环境变量,如:
1、StandardEvaluationContext

StandardEvaluationContext context = new StandardEvaluationContext();

2、EvaluationContext context(需要spring 4.3.15.RELEASE及以上)

EvaluationContext context = StandardEvaluationContext.forReadOnlyDataBinding().build();

后续示例,context哪个都可能啊。

spel示例

spel list例子
List<Integer> primes = new ArrayList<Integer>();
primes.addAll(Arrays.asList(2,3,5,7,11,13,17));
ExpressionParser parser = new SpelExpressionParser();
StandardEvaluationContext context = new StandardEvaluationContext();
context.setVariable("primes",primes);
List<Integer> primesGreaterThanTen = (List<Integer>) parser.parseExpression("#primes.?[#this>10]").getValue(context);
System.out.println(JSON.toJSONString(primesGreaterThanTen));
spel 对象例子
 String usernmae =
(String) parser.parseExpression("#user.userName").getValue(context);
System.out.println(usernmae);
spel list例子

List primes = new ArrayList();
primes.addAll(Arrays.asList(2,3,5,7,11,13,17));
ExpressionParser parser = new SpelExpressionParser();
StandardEvaluationContext context = new StandardEvaluationContext();
context.setVariable(“primes”,primes);
List primesGreaterThanTen = (List) parser.parseExpression(“#primes.?[#this>10]”).getValue(context);
System.out.println(JSON.toJSONString(primesGreaterThanTen));

SimpleEvaluationContext 类找不到

SimpleEvaluationContext was added in 4.3.15.RELEASE so the fact you can’t find it in 4.3.14.RELEASE is perfectly normal.
Spring Boot 1.5.13 uses Spring Framework 4.3.17.RELEASE.
由此可见,由于SimpleEvaluationContext 是4.3.15.RELEASE才增加的,只要把依赖的版本大于这个版本就行了。但由于官方推荐springBoot 1.5.13应该使用spring的4.3.17.RELEASE版本,那就把spring版本升级。

简单说,就是SimpleEvaluationContext是4.3.15.RELEASE及以上版本才支持的。
升级下maven即可。

注:spring版本和release版本不是一回事。

##### spel 如何表示包含(也就是like)?

待办

spel官网文档

这里用5.3.18版本的吧,如下连接直接定位到spel。

https://docs.spring.io/spring-framework/docs/5.3.18/reference/html/core.html#expressions

ognl表达式

ognl表达式我们一定不陌生,可能会说没听说过,实际我们一直在用。
举个最简单的例子,spring的配置文件,其实就是ognl表达式。

spring.application.name=crm
server.port=8080

为什么要整理下呢?是因为遇到个问题,需要模糊匹配个值,居然不知道如何写,难道真的啥也不会了?

ognl和表达式语言的区别

ognl最早出现在structs,需要和structs一起使用。
表达式语言则是个比较广泛的概念,其中最出名的就是spring的(是spring的吗?)el表达式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1886547.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

分文件编译(简单学生系统)

定义学生基本信息 ①输出所有学生信息 ②删除某个学生后&#xff0c;输出所有学生信息 ③修改某个学生信息后&#xff0c;输出所有学生信息 ④查找某个学生的信息 main.c #include"k11*.h" int main(int argc, const char *argv[]) {struct student p[4]{{"…

ShareX:不仅仅是截图工具

名人说&#xff1a;莫道谗言如浪深&#xff0c;莫言迁客似沙沉。 ——刘禹锡《浪淘沙》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 一、软件介绍1、ShareX2、核心功能 二、下载安装1、下载2、安装 三、使用方法…

CentOS7.9下yum升级Apache HTTP Server2.4.6到2.4.60

CentOS7.9系统默认的Apache版本 在CentOS7.9上&#xff0c;如果使用yum安装Apache HTTP Server是最多到2.4.6版本的&#xff0c;这是因为el7下官方仓库的最高版本就是2.4.6&#xff0c;证据如下&#xff1a; $ yum info httpd ...... Installed Packages Name : httpd…

虚拟纪念展馆建设的重大意义:重新定义纪念活动的未来

一、什么是虚拟纪念展馆&#xff1f; 虚拟纪念展馆是一种利用3D、VR等技术在线展示历史事件、人物或文化遗产的数字化空间。这些展馆通过虚拟现实、增强现实和3D建模等技术手段&#xff0c;创建出身临其境的体验&#xff0c;使参观者可以在互联网上以互动方式探索和学习。 二、…

Golang | Leetcode Golang题解之第205题同构字符串

题目&#xff1a; 题解&#xff1a; func isIsomorphic(s, t string) bool {s2t : map[byte]byte{}t2s : map[byte]byte{}for i : range s {x, y : s[i], t[i]if s2t[x] > 0 && s2t[x] ! y || t2s[y] > 0 && t2s[y] ! x {return false}s2t[x] yt2s[y] …

nginx 只有图片等静态资源时 监听80端口 会404 NOT FOUND

解决方法 删除 /var/nginx/sites-enabled 原因&#xff1a;当nginx没有设置首页路径index时&#xff0c;sites-enabled目录中配置的优先级会高于nginx.conf 导致404 NOT FOUND sites-enabled文件中的default会将80端口索引至默认值&#xff1a;/var/www/html目录下&#xff…

Redis基础教程(八):redis集合(Set)

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; &#x1f49d;&#x1f49…

职场小白必备待办工具有哪些 适合新手的待办app

初入职场的小白们&#xff0c;常常会遇到各种挑战。从最初的迷茫&#xff0c;到对工作的逐步熟悉&#xff0c;每一步都需要时间和精力的投入。尤其是当面对繁多的工作任务时&#xff0c;如何快速有效地完成它们&#xff0c;成为了许多职场新人需要面对的问题。 在这个快节奏的…

数字集群手持终端是什么_鼎跃安全

在当今快速发展的科技时代&#xff0c;通信技术的进步为各行各业带来了巨大的变革。尤其是在公共安全、应急救援和交通运输等领域&#xff0c;通信的及时性和可靠性变得尤为重要。数字集群手持终端作为一种专用于数字集群通信系统的便携式设备&#xff0c;数字集群手持终端是一…

AI模特换装试衣软件定制服务公司

&#x1f31f; 最强AI模特换装试衣模型训练、定制服务公司出炉 —— 触站AI&#x1f680; &#x1f3a8; 在AI技术的浪潮中&#xff0c;触站AI以其专业和创新&#xff0c;成为企业AI图像领域的技术解决方案服务公司&#xff0c;为设计界带来了革命性的变化。 &#x1f6e0;️ …

PDF一键转PPT文件!这2个AI工具值得推荐,办公必备!

PDF转换为PPT文件&#xff0c;是职场上非常常见的需求&#xff0c;过去想要把PDF文件转换为PPT&#xff0c;得借助各种文件转换工具&#xff0c;但在如今AI技术主导的大背景下&#xff0c;我们在选用工具时有了更多的选择&#xff0c;最明显的就是基于AI技术打造的AI格式转换工…

恢复的实现技术-日志和数据转储

一、引言 在系统正常运行的情况下&#xff0c;事务处理的恢复机制应采取某些技术措施为恢复做好相应的准备&#xff0c;保证在系统发生故障后&#xff0c;能将数据库从一个不一致的错误状态恢复到一个一致性状态 恢复技术主要包括 生成一个数据库日志&#xff0c;来记录系统中…

机械行业常见问题及ERP解决办法

机械行业在全球经济一体化和技术进步背景下&#xff0c;面临着越来越多的挑战。为了在激烈的市场竞争中立于不败之地&#xff0c;企业需要找到合适的方法优化生产流程、降低成本、提升客户满意度。因此&#xff0c;有效地利用企业资源规划&#xff08;ERP&#xff09;解决方案变…

isidentifier()方法——判断字符串是否为合法的Python标识符或变量名

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 语法参考 isidentifier()方法用于判断字符串是否是有效的Python标识符&#xff0c;还可以用来判断变量名是否合法。isidentifier()方法的语法格式如…

JAVA妇产科专科电子病历系统源码,前端框架:Vue,ElementUI

JAVA妇产科专科电子病历系统源码&#xff0c;前端框架&#xff1a;Vue&#xff0c;ElementUI孕产妇健康管理信息管理系统是一种将孕产妇健康管理信息进行集中管理和存储的系统。通过建立该系统&#xff0c;有助于提高孕产妇健康管理的效率和质量&#xff0c;减少医疗事故发生的…

IDEA2024 Ctrl+Alt+L 格式化代码快捷键失效的解决办法及如何使用OpenArk查询电脑的所有快捷键解决快捷键冲突问题。

今天用Idea2024发现格式化代码的快捷键CtrlAltL失效了&#xff0c;最开始是去idea里面的设置那检查&#xff0c;发现没有问题。 然后就考虑是不是快捷键冲突了&#xff0c;最后发现是qq的热键冲突&#xff0c;关掉qq的就好了。 上网查询还有个可能是网易云的快捷键冲突 如果没…

crewAI实践过程中,memory规避openai的使用方法以及(windows下xinferece框架使用踩过的坑)

问题&#xff1a; 在使用crewAI开发项目的过程中&#xff0c;memory开启后报错&#xff1a;openai key is fake 经代码核查&#xff0c;其默认使用了openai的embedding模型。 解决方法 经查阅资料&#xff0c;可以参考其本地部署llm的方法。 本地部署模型可以使用xinference…

【面试题】TLS和SSL协议的区别

TLS&#xff08;Transport Layer Security&#xff09;和SSL&#xff08;Secure Sockets Layer&#xff09;协议都是用于在网络上建立安全通信连接的协议&#xff0c;但它们在多个方面存在区别。以下是TLS和SSL协议之间区别的详细分析&#xff1a; 1. 发展历程与标准化 SSL&a…

苹果电脑废纸篓数据被清空了,有什么方法可以恢复吗?

使用电脑的用户都知道&#xff0c;被删除的文件一般都会经过回收站&#xff0c;想要恢复它直接点击“还原”就可以恢复到原始位置。mac电脑同理也是这样&#xff0c;但是“回收站”在mac电脑显示为“废纸篓”。 苹果电脑废纸篓数据被清空了&#xff0c;有什么方法可以恢复吗&am…

CVE-2024-0603 漏洞复现

CVE-2024-0603 源码&#xff1a;https://gitee.com/dazensun/zhicms 开题&#xff1a; CVE-2024-0603描述&#xff1a;ZhiCms up to 4.0版本的文件app/plug/controller/giftcontroller.php中存在一处未知漏洞。攻击者可以通过篡改参数mylike触发反序列化&#xff0c;从而远程…