SPEL表达式支持:
一、基本表达式:字面量表达式、关系,逻辑与算数运算表达式、字符串连接及截取表达式、三目运算及Elivis表达式、正则表达式、括号优先级表达式;
二、类相关表达式:类类型表达式、类实例化、instanceof表达式、变量定义及引用、赋值表达式、自定义函数、对象属性存取及安全导航表达式、对象方法调用、Bean引用;
三、集合相关表达式:内联List、内联数组、集合,字典访问、列表,字典,数组修改、集合投影、集合选择;不支持多维内联数组初始化;不支持内联字典定义;
四、其他表达式:模板表达式。
注:SpEL表达式中的关键字是不区分大小写的。
表达式解析主要包括以下三点.
1. 单词分解
规则如下:
1. 添加结束符[\0] ;
2. 转为char数组. charAt(i)
3. 对每一个字符进行分解
a) 如果是字母,一直往后找,如果一直是字母或数字,下划线,$那么继续.
i. 如果该字符串只有2或3那么判断是否是操作符
1. 如果是操作符,以操作符token加入
2. 如果不是操作符,以一般的字符串token加入
b) + 以加号操作符加入.
c) _ 与字母处理方式一样
d) – 以头号操作符加入
e) : 以冒号操作符加入
f) . 以点号操作符加入
g) , 以逗号操作符加入
h) * 以乘号操作符加入
i) / 以除号操作符加入
j) % 以百分号操作符加入
k) ( 以左括号操作符加入
l) ) 以右括号操作符加入
m) [ 以左中括号操作符加入
n) # 以井号操作符加入
o) ] 以右中括号操作符加入
p) { 以左大括号操作符加入
q) } 以右大括号操作符加入
r) @ 以@操作符加入
s) ^ 如果为组合^[,那么以组合操作符^[加入,否则以指数操作符加入
t) ! 如果为组合!=, ![,那么以组合操作符加入,否则以非操作符加入
u) = 如果为组合==,那么以组合操作符加入,否则以相等操作符加入
v) ? 如果以组合?[,?:,?. 那么以组合操作符加入,否则以问号操作符加入
w) $ 如果以组合$[,那么以组合操作符加入,否则同字母处理方式一样.
x) > 如果以组合>=,那么以组合操作符加入, 否则以>操作符加入
y) <如果以组合<=,那么以组合操作符加入, 否则以<操作符加入
z) ‘0~9’ ,以0x开头,那么处理为16进制,如果为数据,那么把数字作为一个组合,最后以L结尾为long数字。 带E,处理为进制数字.带f为float,带d为double,以Long,Int等操作符加入
aa) ‘ ’,’\t’,’\n’,’\r’,啥都不干
bb) ‘\’’,以字符串处理.
cc) ‘”’,以字符串处理
dd) 0 结束
2. 词法分析
1. 循环每一个token
2. 对每一个token进行处理[逻辑清晰,易处理]
i. eatLogicalOrExpression[吃逻辑或表达式or]
1. class OpOr extends Operator
a) public BooleanTypedValue
getValueInternal(ExpressionState state)
2. abstract class Operator extends SpelNodeImpl
3. class SpelNodeImpl implements SpelNode
4. Object getValue(ExpressionState expressionState) throws EvaluationException;
5.
ii. eatLogicalAndExpression[吃逻辑and]
iii. eatRelationalExpression[吃关系(>,>=,<,<=,==,!=,instanceof, matches, between)]
iv. eatSumExpression[吃统计(+-)](这里可以重写+方法,在EvaluationContext复写)
v. eatProductExpression[吃产品*/%]
vi. eatPowerExpression[吃power ^]
vii. eatUnaryExpression[号+-!]
viii. eatPrimaryExpression[吃主体]
ix. eatStartNode [开始吃节点]
1. int,long,float,Boolean,string push next return pop
2. (,吃表达示从开头开始吃,)push 当前吃的东西 return true pop
3. 普通IDENTIFIER,(, eatPossiblyQualifiedId,)push Type引用户 pop
4. 普通IDENTIFIER,null,push null pop(maybeEatNullReference)
5. 普通IDENTIFIER ,new,maybeEatConstructorReference, ConstructorReference,pop
6. 普通IDENTIFIER,maybeEatMethodOrProperty,
maybeEatMethodArgs,参数,为空表示属性,不为空表示为方法
7. 普通IDENTIFIER,maybeEatFunctionOrVar,#,方法参数,
8. maybeEatBeanReference,@ bean引用
9. maybeEatProjection ![
10. maybeEatSelection $[
11. maybeEatSelection [
12. maybeEatInlineList {}
x. 如果节点为.,[,?.则请取下一个节点作为CompoundExpression,否则返回SpelNodeImpl
xi. Return
3. 生成语法树
先执行最里面优先级最高的
数据操作符(^,*/%,+-,><>=<=!===,and,or)
10 * 10 + 1 + 2 * 3 + 5 * 2
加载10(primary)
加载* 再加载10 作为*组合(primary,*)
加载+,加载(primary,*),结果为1,作为+组合
加载+,加载(primary,*), 结果为2,* 那么2*3作为组合,那么再作为+组合
以下的同…
4. 解析语法树
执行具体的操作符,计算最后的结果
分享到:
相关推荐
7. **Spring表达式语言(SpEL)**:Spring Expression Language允许在运行时查询和操作对象图。在2.1版本中,SpEL开始被引入,提供了一种强大的方式来表达bean属性和方法的值。 8. **事件驱动**:Spring支持事件...
Spring表达式语言(SpEL, Spring Expression Language)是一种强大的查询和操作对象图的语言。本章讲解了SpEL的基本语法和用法,包括如何在Spring配置文件中使用SpEL表达式来引用其他Bean属性值等内容。 ### 使用...
下面,我们来深入解读Spring 3.0 API中的重要知识点。 首先,文档提到了Spring框架的介绍,其中包含了依赖注入和控制反转(IoC),这是Spring框架的核心概念之一。依赖注入(Dependency Injection, DI)允许我们...
以下是对Spring框架主要模块及其源码的详细解读: 1. **依赖注入(Dependency Injection, DI)** Spring 的核心特性之一是依赖注入,它允许开发者在运行时通过容器来管理对象及其依赖关系。DI 可以通过构造器注入...
本文将对Spring Web Flow 2.30官方文档的关键知识点进行深入解读,旨在帮助开发者全面理解并掌握这一工具。 ### 一、Spring Web Flow 2.30概述 #### 1.1 What this guide covers 本指南全面覆盖了Spring Web Flow ...
具体用途需要根据文件内容来解读。 总之,Spring与Struts2的整合能够提升应用的灵活性和可扩展性,而AOP的使用则进一步增强了代码的可维护性和透明度。通过深入理解和实践这些技术,开发者可以构建出更强大、更健壮...
7. **Spring Expression Language (SpEL)**: SpEL是Spring表达式语言,它允许在运行时查询和操作对象图。它被广泛应用于Spring的配置中,用于动态评估表达式。 8. **Spring JDBC Template**: 提供了对JDBC的抽象,...
1. **spring-expression**: 这是Spring表达式语言(Spring Expression Language, SpEL)的源代码。SpEL是一个强大且灵活的内嵌表达式语言,用于在运行时查询和操作对象图。它支持属性导航、方法调用、条件和逻辑运算...
以下是对"spring2.0-中文参考手册pdf.zip"中可能包含的关键知识点的详细解读: 一、依赖注入(Dependency Injection, DI) Spring 2.0加强了依赖注入功能,使得组件之间的依赖关系可以通过配置文件或注解来管理,而...
Spring JSP的优势在于其简洁的模板语法和强大的EL(Expression Language)表达式,使得开发者可以方便地访问后台数据并展示在页面上。同时,Spring JSP还支持Tiles、FreeMarker等视图解析器,增加了灵活性。 **...
5. **spring-expression.jar**(Spring Expression Language, SpEL):这是一个强大的表达式语言,用于在运行时查询和操作对象图。SpEL允许在配置中进行复杂的逻辑判断,例如在bean的属性注入中动态计算值,或者在...
Cron表达式是Unix/Linux系统中的定时任务调度器Cron所使用的语法,也被广泛应用于Java世界,例如Quartz、Spring等框架。它允许用户以字符串的形式定义任务的执行时间,如分钟、小时、日期等。这个压缩包文件包含了对...
- 虽然JSP仍然是Web开发的一种选择,但现代框架如Spring MVC、JSF提供了更高效、可维护的开发方式。 通过深入学习这个教程,你将能够熟练掌握JSP的各个方面,从基础到高级,为构建复杂的Java Web应用打下坚实的基础...
本篇文章将详细解读一个基于SSM(Spring、SpringMVC、MyBatis)框架和JSP(JavaServer Pages)技术的家居商城系统源码数据库,为读者提供深入理解SSM+JSP开发模式及其在实际项目中的应用。 首先,SSM是Java企业级...
本篇文章将详细解读一个利用Java技术栈,特别是SpringBoot框架构建的旅游网站源码数据库。这是一份适用于毕业设计或项目开发的优秀案例,涵盖了SSM(Spring、SpringMVC、MyBatis)到SpringBoot的升级转变,以及JSP...
"jspmum7mq"可能是项目源代码、配置文件或者数据库脚本,但由于文件名不明确,无法进一步详细解读。 在这样的项目中,开发者可能需要实现以下功能: 1. 用户注册与登录:包括身份验证、密码加密等。 2. 同学信息...
JSP结合EL(Expression Language)和JSTL(JavaServer Pages Standard Tag Library)标签库,可以方便地展示数据和实现页面逻辑。 五、数据库设计 实验中心管理系统必然涉及到多张数据库表,如用户信息、实验课程、...
开发者可能需要了解JSP指令、脚本元素、表达式以及EL(Expression Language)和JSTL(JavaServer Pages Standard Tag Library)等概念。 `智能化小区管理系统.lw+ppt.zip`文件可能包含了项目的详细设计介绍和演示...
通过对源码的分析和数据库设计的解读,我们可以了解到该系统的关键技术和应用实践。 首先,SpringBoot是Spring框架的一个轻量级衍生品,它简化了Spring应用的初始搭建和配置工作。在本系统中,SpringBoot作为核心...