el表达式笔记及ognl

文章目录

    • 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 firstLITERAL_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 kindprivate TokenKind(String tokenString) {this.tokenChars = tokenString.toCharArray();this.hasPayload = (this.tokenChars.length == 0);}private TokenKind() {this("");}@Overridepublic 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.mzph.cn/diannao/40820.shtml

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

相关文章

shark云原生-日志体系-filebeat高级配置(适用于生产)

文章目录 1. filebeat.inputs 静态日志收集器2. filebeat.autodiscover 自动发现2.1. autodiscover 和 inputs2.2. 如何配置1.2.1. Providers 提供者1.2.2. Providers kubernetes templates1.2.3. 基于提示&#xff08;hints&#xff09;的自动发现支持的 **hints**的完整列表&…

windows搭建mqtt服务器,并配置DTU收集传感器数据

1.下载并安装emqx服务器 参考&#xff1a;Windows系统下本地MQTT服务器搭建&#xff08;保姆级教程&#xff09;_mqtt windows-CSDN博客 这里我下载的是emqx-5.3.0-windows-amd64.zip版本 下载好之后&#xff0c;放到服务器的路径&#xff0c;我这里放的地方是&#xff1a;C…

脑启发设计:人工智能的进化之路

编者按&#xff1a;你可以用左手&#xff08;不常用的那只手&#xff09;的小指与食指拿起一件物品么&#xff1f; 试完你是不是发现自己竟然可以毫不费力地用自己不常用的手中&#xff0c;两根使用频率相对较低的手指&#xff0c;做一个不常做的动作。这就是人类大脑不可思议…

如何声明一个类?类如何继承?

要声明一个类&#xff0c;需要使用关键字class&#xff0c;后面跟着类名。类名通常以大写字母开头。类的声明通常包括类的成员变量和成员函数。 类可以通过继承来扩展现有的类。要让一个类继承另一个类&#xff0c;需要使用冒号&#xff08;:&#xff09;并在后面跟着父类的名…

等保2.0中,云计算平台如何做到数据的分类和加密?

数据分类 在等保2.0中&#xff0c;数据分类是确保数据安全的首要步骤。云计算平台需要根据数据的敏感性和重要性进行分类&#xff0c;以便采取相应的保护措施。数据分类通常包括以下几个步骤&#xff1a; 数据识别&#xff1a;识别出哪些数据是需要保护的&#xff0c;这可能包…

py黑帽子学习笔记_burp

配置burp kali虚机默认装好了社区版burp和java&#xff0c;其他os需要手动装 burp是用java&#xff0c;还得下载一个jython包&#xff0c;供burp用 配apt国内源&#xff0c;然后apt install jython --download-only&#xff0c;会只下载包而不安装&#xff0c;下载的目录搜一…

电子数据取证如何规范高效

文章关键词&#xff1a;电子数据取证、现场勘验、手机取证 随着信息技术的迅猛发展和广泛应用&#xff0c;电子数据作为一种独立的法定证据形式&#xff0c;在执纪执法实践中的作用愈加凸显。规范、科学、高效的电子数据取证工作&#xff0c;不仅是保证电子数据符合法定要求、…

FreeRTOS LVGL页面切换为LCD纯手动绘制遇到的问题

有时候我们需要将FreeRTOS和LVGL页面切换为LCD纯手动绘制,提供更高的灵活性和可定制性。 自定义界面设计:使用LCD纯手动绘制界面,可以完全自定义界面的外观和行为。可以根据特定的需求和设计概念创建独特的用户界面,而不受LVGL框架的限制。 资源优化:LVGL是一个功能强大的…

9.x86游戏实战-汇编指令mov

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 工具下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1rEEJnt85npn7N38Ai0_F2Q?pwd6tw3 提…

java实现多级菜单展示(递归)

实体类如下&#xff1a; package com.ssdl.baize.po;import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonIgnore; import io.swagger.annotations.ApiModel; import io.swagge…

cefsharp在splitContainer.Panel2中显示调试工具DevTools(非弹出式)含源代码

一、弹出式调试工具 (ShowDevTools) ChromiumWebBrowser webbrowser; public void showDevTools(){//定位到某元素webbrowser.ShowDevTools(null, parameters.XCoord, parameters.YCoord);

STM32智能农业监控系统教程

目录 引言环境准备智能农业监控系统基础代码实现&#xff1a;实现智能农业监控系统 4.1 数据采集模块 4.2 数据处理与分析 4.3 控制系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;农业监控与优化问题解决方案与优化收尾与总结 1. 引言 智能农业监控系统利用STM32嵌…

代码随想录day37 动态规划(3)

416. 分割等和子集 - 力扣&#xff08;LeetCode&#xff09; 解1&#xff1a;二维dp数组&#xff0c;时间O(m*n)&#xff0c;空间O(m*n)&#xff0c;m、n为dp数组的行和列数。 判断原数组总和能否整除2&#xff1b; 将target设为total // 2&#xff08;若是total / 2&#…

遇到的异步问题

事例1&#xff1a; app.post("/predictfunc") async def predictfunc(item: Item):# 使用asyncio.to_thread()在单独的线程中运行predict_in_threadresult await asyncio.to_thread(predictfunc_main, item)return result 事例2&#xff1a; app.post("/remo…

PCL从理解到应用【02】PCL环境安装 | PCL测试| Linux系统

前言 本文介绍在Ubuntu18.04系统中&#xff0c;如何安装PCL。 源码安装方式&#xff1a;pcl版本1.91&#xff0c;vtk版本8.2.0&#xff0c;Ubuntu版本18.04。 安装好后&#xff0c;可以看到pcl的库&#xff0c;在/usr/lib/中&#xff1b; 通过编写C代码&#xff0c;直接调用…

华为路由器静态路由配置(eNSP模拟实验)

实验目标 如图下所示&#xff0c;让PC1ping通PC2 具体操作 配置PC设备ip 先配置PC1的ip、掩码、网关。PC2也做这样的配置 配置路由器ip 配置G0/0/0的ip信息 #进入系统 <Huawei>system-view #进入GigabitEthernet0/0/0接口 [Huawei]int G0/0/0 #设置接口的ip和掩码 […

【UE5.3】笔记7 控制Pawn移动

使用A、D键控制角色左右移动 打开我们的BP_Player蓝图类&#xff0c;选择事件图表&#xff0c;添加我们的控制事件 右键&#xff0c;搜索A keyboard&#xff0c;选择A,如下图&#xff0c;D也是 添加扭矩力 首先我们要把我们的player上的模拟物理选项打开&#xff0c;这样我们…

ChatGPT在Java后端开发中的应用与影响

随着人工智能技术的发展&#xff0c;尤其是OpenAI推出的聊天机器人模型ChatGPT&#xff0c;其强大的自然语言理解和生成能力正在改变着我们的生活和工作方式。在Java后端开发领域&#xff0c;ChatGPT同样有着广泛的应用前景&#xff0c;并且能够为Java后端开发者带来诸多好处。…

Caused by: java.io.IOException: Broken pipe

IO异常&#xff1a;管道破裂。 推荐文章&#xff1a;解决java.io.IOException: Broken pipe的报错

JavaFx基础知识

1.Stage 舞台 如此这样的一个框框&#xff0c;舞台只是这个框框&#xff0c;并不管里面的内容 public void start(Stage primaryStage) throws Exception {primaryStage.setScene(new Scene(new Group()));primaryStage.getIcons().add(new Image("/icon/img.png"))…