博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring学习笔记17--在XML中使用SPEL
阅读量:4494 次
发布时间:2019-06-08

本文共 3783 字,大约阅读时间需要 12 分钟。

SPEL(Spring Expression Language)即Spring3中功能丰富强大的表达式语言,简称SpEL。SpEL是类似于OGNL和JSF EL的表达式语言,能够在运行时构建复杂表达式,存取对象属性、对象方法调用等。所有的SpEL都支持XML和Annotation两种方式,格式:#{ SpEL expression }。

可参考文章 

CSDN博主 gudong2945 的 
Spring官方文档 

Spring SPEL功能简介

通过spel我们可以实现 

1. 通过bean的id对bean进行引用 
1. 调用方法以及引用对象中的属性 
1. 计算表达式的值 
1. 正则表达式的匹配 
1. 集合的操作

Spring SPEL配置

Maven依赖

org.springframework
spring-context
4.2.1.RELEASE
  • 1
  • 2
  • 3
  • 4
  • 5

只需要将spring-context添加到依赖即可,spring-context中有对spring-expression的依赖,添加依赖后会自动下载。

Spring配置文件中的配置

增加对P标签和Util的支持,修改schema,添加P和Util

xmlns:p="http://www.springframework.org/schema/p"xmlns:util="http://www.springframework.org/schema/util"
http://www.springframework.org/schema/utilhttp://www.springframework.org/schema/util/spring-util.xsd
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

最终结果如下

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

注入基础类型

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

引用对象、属性和方法

对象引用

语法如下:#{beanId}

...
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

对象属性引用

语法如下:#{beanId.propertyName}

...
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

对象方法引用

语法如下:#{beanId.method()}

...
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

还可以链式操作

  • 1

这样写如果people.getName()为null,会抛出空指针异常,为了避免抛出异常我们要使用?.表达式

  • 1

调用类的静态方法

语法:T(class.method())

  • 1

SPEL运算符支持

算术运算符

算数运算符:+, -, *, /, %, ^ 

语法:#{number+number} #{number-number} ···

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

字符串连接

字符串连接符:+ 

语法:#{'str1' + 'str2'}

  • 1
  • 2

比较运算符

比较运算符: <, >, ==, <=, >=, lt(<), gt(>), eq(==), le(<=), ge(>=)

注意在XML中不能使用>>=需要用gtge代替,<<=亲测可用

...
  • 1
  • 2

逻辑运算符

逻辑运算符号:and, or, not, !

  • 1
  • 2
  • 3
  • 4

if…else表达式

基本语法:条件?true:false

#wangchengwei
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

更为简洁的方式

#wangchengwei
  • 1
  • 2
  • 3

注意:?:之间不能有空格

正则表达式

使用matches关键字,结果为布尔类型

  • 1

SPEL对集合的支持

定义Bean实体类

package com.codestd.springstudy.lesson03;import org.springframework.stereotype.Component;public class People { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

List集合

定义集合

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

其中p:name="jaune003"等同于<property name="name" value="jaune003" />

通过下标访问集合中的元素

  • 1
  • 2

从Map中获取指定的Key

定义Map集合

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

通过key访问集合中的元素

  • 1
  • 2

从Properties中获取制定的Key

添加Properties文件,文件位置放到spel/setup.properties,文件内容如下

system.name=spel
  • 1

Properties文件的使用

...
  • 1
  • 2
  • 3

通过下标访问systemEnvironment(系统环境变量)和systemProperties(系统属性)中的值

  • 1
  • 2

在JDK文档中System类中有这样的方法getProperties()在此方法的详细介绍中有下面的参数可供使用: 

java.version Java 运行时环境版本 
java.vendor Java 运行时环境供应商 
java.vendor.url Java 供应商的 URL 
java.home Java 安装目录 
java.vm.specification.version Java 虚拟机规范版本 
java.vm.specification.vendor Java 虚拟机规范供应 
java.vm.specification.name Java 虚拟机规范名称 
java.vm.version Java 虚拟机实现版本 
java.vm.vendor Java 虚拟机实现供应商 
java.vm.name Java 虚拟机实现名称 
java.specification.version Java 运行时环境规范版本 
java.specification.vendor Java 运行时环境规范供应商 
java.specification.name Java 运行时环境规范名称 
java.class.version Java 类格式版本号 
java.class.path Java 类路径 
java.library.path 加载库时搜索的路径列表 
java.io.tmpdir 默认的临时文件路径 
java.compiler 要使用的 JIT 编译器的名称 
java.ext.dirs 一个或多个扩展目录的路径 
os.name 操作系统的名称 
os.arch 操作系统的架构 
os.version 操作系统的版本 
file.separator 文件分隔符(在 UNIX 系统中是“/”) 
path.separator 路径分隔符(在 UNIX 系统中是“:”) 
line.separator 行分隔符(在 UNIX 系统中是“/n”) 
user.name 用户的账户名称 
user.home 用户的主目录 
user.dir 用户的当前工作目录

获取字符串中的某个字符

可直接通过下标获取字符串中的某个字符

  • 1

条件筛选

筛选子集

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

peopleList.?[name == 'jaune004']筛选出的是一个List集合,后面加上下标表示取第1个。

注意:这种写法在无法匹配到元素时会报错

集合的投影

语法:.![],集合返回的是集合,在Bean中先添加集合属性

private List
names;
  • 1
  • 1

返回:names[jaune001, jaune002, jaune003, jaune004]

转载于:https://www.cnblogs.com/huangyangquan/p/8617629.html

你可能感兴趣的文章
ArrayList源码解析
查看>>
他们创造了美国 读书笔记
查看>>
SQL Server 2008 修改表所有者,架构
查看>>
literal在程序語言中的意思(轉)
查看>>
EnumClipboardFormats
查看>>
我最常用的Elipse快捷键
查看>>
单元测试(Unit Testing) 集成测试(Integrated Testing)系统测试(System Testing)
查看>>
DTO – 服务实现中的核心数据
查看>>
QWebView 与Js 交互
查看>>
linux脚本Shell之awk详解(二)
查看>>
转载-30分钟搞定后台登录界面(103个后台PSD源文件、素材网站)
查看>>
jxl导出Excel文件
查看>>
Oracle创建/删除表空间和用户(2014-3-10 记)
查看>>
springboot 初探 、基础及配置
查看>>
基于OWin的Web服务器Katana发布版本3
查看>>
数据库事务特性汇总
查看>>
对象深度克隆
查看>>
MATLAB动画显示串口数据【实例】(修正链接)
查看>>
windows共享目录映射到linux本地目录
查看>>
单例模式的python实现
查看>>