- 使用 Spring Initializr 创建 Spring Boot 应用程序
- 在Spring Boot中配置Cassandra
- 在 Spring Boot 上配置 Tomcat 连接池
- 将Camel消息路由到嵌入WildFly的Artemis上
注意: 强烈建议过一遍文档(不懂英文,直接Edge翻译、谷歌翻译网页)哦,这部分的内容并不多,跟着Demo敲就完事了
官方文档: https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#expressions
注意: 测试Demo用到的第三方工具包是Hutool哦
注意: .属性名 == 如果对象没有此字段定义,则会调用get属性名() 方法进行获取值
package top.linruchang.myblog;
import cn.hutool.core.lang.Console;
import org.junit.jupiter.api.Test;
import org.springframework.expression.Expression;
import org.springframework.expression.ExpressionParser;
import org.springframework.expression.spel.standard.SpelExpressionParser;
import java.util.Arrays;
/**
* 作用:
*
* @author LinRuChang
* @version 1.0
* @date 2022/05/06
* @since 1.8
**/
public class SpELTest {
@Test
public void test1() {
ExpressionParser parser = new SpelExpressionParser();
Expression exp = parser.parseExpression("'Hello World'.bytes");
byte[] bytes = (byte[]) exp.getValue();
Console.log(bytes);
System.out.println(Arrays.toString(bytes));
}
@Test
public void test2() {
ExpressionParser parser = new SpelExpressionParser();
Expression exp = parser.parseExpression("'Hello World'.hash");
Integer hashNum = exp.getValue(Integer.class);
Console.log(hashNum);
System.out.println(hashNum);
}
@Test
public void test3() {
ExpressionParser parser = new SpelExpressionParser();
Expression exp = parser.parseExpression("5.MIN_VALUE");
Integer MIN_VALUE = exp.getValue(Integer.class);
Console.log(MIN_VALUE);
System.out.println(MIN_VALUE);
}
@Test
public void test4() {
ExpressionParser parser = new SpelExpressionParser();
Expression exp = parser.parseExpression("5L.MIN_VALUE");
Long MIN_VALUE = exp.getValue(Long.class);
Console.log(MIN_VALUE);
System.out.println(MIN_VALUE);
}
@Test
public void test5() {
ExpressionParser parser = new SpelExpressionParser();
Expression exp = parser.parseExpression("'5L'.getBytes");
byte[] bytes = exp.getValue(byte[].class);
Console.log(bytes);
System.out.println(bytes);
}
@Test
public void test6() {
ExpressionParser parser = new SpelExpressionParser();
Expression exp = parser.parseExpression("'5L'.getBytes.length");
Integer byteLength = exp.getValue(Integer.class);
Console.log(byteLength);
System.out.println(byteLength);
}
}
public class DBTest {
public class DBTest {
@Test
public void test16() {
SysUser sysUser = new SysUser();
sysUser.setEmail("邮箱地址");
SpelExpressionParser spelExpressionParser = new SpelExpressionParser();
Expression expression = spelExpressionParser.parseExpression("email?.length");
Object value = expression.getValue(sysUser);
Console.log(value);
//问好等价于下面那句话
expression = spelExpressionParser.parseExpression("nickName?.length");
value = expression.getValue(sysUser);
Console.log(value);
expression = spelExpressionParser.parseExpression("loginName != null ? loginName.length : null");
value = expression.getValue(sysUser);
Console.log(value);
expression = spelExpressionParser.parseExpression("loginName.length");
value = expression.getValue(sysUser);
Console.log(value);
}
}
/**
* 作用:
*
* @author LinRuChang
* @version 1.0
* @date 2022/05/06
* @since 1.8
**/
public class SpELTest {
/**
* 正常使用的静态方法调用不了
*/
@Test
public void test7() {
SpelExpressionParser spelExpressionParser = new SpelExpressionParser();
Expression expression = spelExpressionParser.parseExpression("String.valueOf(5)");
String value = expression.getValue(String.class);
Console.log(value);
}
/**
* 间接的调用静态方法
*/
@Test
public void test9() {
SpelExpressionParser spelExpressionParser = new SpelExpressionParser();
//静态方法
Expression expression = spelExpressionParser.parseExpression("new Long('5').hashCode(5l)");
Integer value = expression.getValue(Integer.class);
Console.log(value);
//成员方法
expression = spelExpressionParser.parseExpression("new Long('5').floatValue()");
Float value2 = expression.getValue(Float.class);
Console.log(value2);
}
}
public class SpELTest {
/**
* 静态方法调用不了
*/
@Test
public void test10() {
//SysUser sysUser = new SysUser();
//sysUser.setEmail("邮箱地址");
Map sysUser = new HashMap();
sysUser.put("email", "邮箱地址");
SpelExpressionParser spelExpressionParser = new SpelExpressionParser();
//解析某对象的email属性 - Bean对象
//Expression expression = spelExpressionParser.parseExpression("email != null ? email.length() : 0");
//Map == 键值对
//Expression expression = spelExpressionParser.parseExpression("get('email') != null ? get('email').length() : 0");
Expression expression = spelExpressionParser.parseExpression("['email'] != null ? ['email'].length() : 0");
Integer value = expression.getValue(sysUser, Integer.class);
Console.log(value);
}
}
public class SpELTest {
/**
* 静态方法调用不了
*/
@Test
public void test11() {
SysUser sysUser = new SysUser();
sysUser.setEmail("邮箱地址");
SpelExpressionParser spelExpressionParser = new SpelExpressionParser();
Expression expression = spelExpressionParser.parseExpression("nickName");
expression.setValue(sysUser,"大家好");
Console.log(sysUser);
}
/**
* 静态方法调用不了
*/
@Test
public void test12() {
SysUser sysUser = new SysUser();
sysUser.setEmail("邮箱地址");
SpelExpressionParser spelExpressionParser = new SpelExpressionParser();
//设置el表达式执行标准,【仅能读取属性不能修改属性】
EvaluationContext evaluationContext = SimpleEvaluationContext.forReadOnlyDataBinding().build();
Expression expression = spelExpressionParser.parseExpression("nickName");
expression.setValue(evaluationContext,sysUser,"大家好");
Console.log(sysUser);
}
}
public class DBTest {
/**
* 静态赋值
*/
@Test
public void test12_2() {
SysUser sysUser = new SysUser();
sysUser.setEmail("邮箱地址");
SpelExpressionParser spelExpressionParser = new SpelExpressionParser();
Expression expression = spelExpressionParser.parseExpression("nickName = '大家好'");
expression.getValue(sysUser);
Console.log(sysUser);
}
}
public class DBTest {
/**
* 动态赋值
*/
@Test
public void test12_3() {
SysUser sysUser = new SysUser();
sysUser.setEmail("邮箱地址");
SpelExpressionParser spelExpressionParser = new SpelExpressionParser();
StandardEvaluationContext standardEvaluationContext = new StandardEvaluationContext();
standardEvaluationContext.setVariable("newNickname", "大家好");
Expression expression = spelExpressionParser.parseExpression("nickName = #newNickname");
expression.getValue(standardEvaluationContext,sysUser);
Console.log(sysUser);
}
}
public class SpELTest {
@Test
public void test13() {
SpelExpressionParser spelExpressionParser = new SpelExpressionParser();
Expression expression = spelExpressionParser.parseExpression("T(java.lang.String).valueOf(5)");
String value = expression.getValue(String.class);
Console.log(value);
Expression expression1 = spelExpressionParser.parseExpression("T(java.util.Arrays).asList(1,2,3,4)");
List value1 = expression1.getValue(List.class);
Console.log(value1);
}
}
public class DBTest {
@Test
public void test15() {
StandardEvaluationContext standardEvaluationContext = new StandardEvaluationContext();
standardEvaluationContext.setVariable("addSuffixIfNot", ReflectUtil.getMethodByName(StrUtil.class,"addSuffixIfNot"));
SpelExpressionParser spelExpressionParser = new SpelExpressionParser();
Expression expression = spelExpressionParser.parseExpression("#addSuffixIfNot('name', '后缀')");
Object value = expression.getValue(standardEvaluationContext);
Console.log(value);
}
}
public class DBTest {
@Test
public void test14() {
SpelExpressionParser spelExpressionParser = new SpelExpressionParser();
//简写的三元运算符
StandardEvaluationContext standardEvaluationContext = new StandardEvaluationContext();
standardEvaluationContext.setVariable("content", "发的范德萨发");
standardEvaluationContext.setVariable("content2", null);
Expression expression = spelExpressionParser.parseExpression("#content?:'无内容'");
//Expression expression = spelExpressionParser.parseExpression("#content? #content:'无内容'"); //不可写成这样会报错,前面必须是java的布尔值类型
Object value = expression.getValue(standardEvaluationContext);
Console.log(value);
expression = spelExpressionParser.parseExpression("#content2?:'无内容'");
value = expression.getValue(standardEvaluationContext);
Console.log(value);
//标准的三元运算符
expression = spelExpressionParser.parseExpression("T(cn.hutool.core.util.StrUtil).isNotBlank(#content2) ? #content2 : '无内容'");
value = expression.getValue(standardEvaluationContext);
Console.log(value);
}
}
介绍:类似Stream.filter作用
public class DBTest {
@Test
public void test18() {
List<SysUser> sysUsers = new ArrayList<>();
sysUsers.add(new SysUser());
IntStream.range(1,5).forEachOrdered(num -> {
SysUser sysUser = new SysUser();
sysUser.setEmail("邮箱" + num);
sysUser.setId(String.valueOf(num));
sysUsers.add(sysUser);
});
StandardEvaluationContext standardEvaluationContext = new StandardEvaluationContext();
standardEvaluationContext.setVariable("sysUsers2", sysUsers);
standardEvaluationContext.setVariable("sysUsers3", Collections.emptyList());
standardEvaluationContext.setVariable("sysUsers4", null);
SpelExpressionParser spelExpressionParser = new SpelExpressionParser();
//下面四者等价,第三个可能会出现空指针问题
Expression expression = spelExpressionParser.parseExpression("#root?.?[id > '3']");
//Expression expression = spelExpressionParser.parseExpression("#root?.?[id > '3']");
//Expression expression = spelExpressionParser.parseExpression("#root.?[id > '3']");
//Expression expression = spelExpressionParser.parseExpression("?[id > '3']");
List value = expression.getValue(sysUsers, List.class);
Console.log(value);
expression = spelExpressionParser.parseExpression("#sysUsers2?.?[email == '邮箱3']");
value = expression.getValue(standardEvaluationContext, List.class);
Console.log(value);
expression = spelExpressionParser.parseExpression("#sysUsers3?.?[email == '邮箱3']");
value = expression.getValue(standardEvaluationContext, List.class);
Console.log(value);
expression = spelExpressionParser.parseExpression("#sysUsers4?.?[email == '邮箱3']");
value = expression.getValue(standardEvaluationContext, List.class);
Console.log(value);
}
}
介绍:类似Stream.map作用
public class DBTest {
@Test
public void test17() {
List<SysUser> sysUsers = new ArrayList<>();
sysUsers.add(new SysUser());
IntStream.range(1,5).forEachOrdered(num -> {
SysUser sysUser = new SysUser();
sysUser.setEmail("邮箱" + num);
sysUsers.add(sysUser);
});
StandardEvaluationContext standardEvaluationContext = new StandardEvaluationContext();
standardEvaluationContext.setVariable("sysUsers2", sysUsers);
standardEvaluationContext.setVariable("sysUsers3", Collections.emptyList());
standardEvaluationContext.setVariable("sysUsers4", null);
SpelExpressionParser spelExpressionParser = new SpelExpressionParser();
//下面四者等价,第三个可能会出现空指针异常问题
Expression expression = spelExpressionParser.parseExpression("#this?.![email]");
//Expression expression = spelExpressionParser.parseExpression("#root?.![email]");
//Expression expression = spelExpressionParser.parseExpression("#root.![email]");
//Expression expression = spelExpressionParser.parseExpression("![email]");
List value = expression.getValue(sysUsers, List.class);
Console.log(value);
expression = spelExpressionParser.parseExpression("#sysUsers2?.![email]");
value = expression.getValue(standardEvaluationContext, List.class);
Console.log(value);
expression = spelExpressionParser.parseExpression("#sysUsers3?.![email]");
value = expression.getValue(standardEvaluationContext, List.class);
Console.log(value);
expression = spelExpressionParser.parseExpression("#sysUsers4?.![email]");
value = expression.getValue(standardEvaluationContext, List.class);
Console.log(value);
}
}
public class DBTest {
@Test
public void test19() {
SpelExpressionParser spelExpressionParser = new SpelExpressionParser();
//模板变量解析开始${ 待解析的内容 解析结束}
TemplateParserContext templateParserContext = new TemplateParserContext();
Expression expression = spelExpressionParser.parseExpression("你好我是你爸爸:#{#fatherName}",templateParserContext);
StandardEvaluationContext standardEvaluationContext = new StandardEvaluationContext();
standardEvaluationContext.setVariable("fatherName","Tom");
Object value = expression.getValue(standardEvaluationContext);
Console.log(value);
}
}
我的 Web 应用程序在后端使用 Node.js 和 Express。当违反内容安全策略 (CSP) 时,报告 URI 报告空对象。我的后台代码如下: app.use(bodyParser.urlen
在服务器端提供静态服务的方式在 Express 中似乎非常简单: To serve static files such as images, CSS files, and JavaScript fil
var express = require('express'); var app = express(); 这就是我们创建快速应用程序的方式。但是这个'express()'是什么?它是方法还是构造函
我在尝试安装时收到以下错误 express : npm ERR! code ERR_OSSL_PEM_NO_START_LINE npm ERR! errno ERR_OSSL_PEM_NO_STAR
如 express 所述routing guide和 this answer ,我们可以创建“迷你应用程序”并从主应用程序使用它。但是我看到一段代码,它在模块中使用 app 而不是 router ap
我正在写一个 NestJS应用。现在我想安装 Express中间件 express-openapi-validator . 但是,我无法让它工作。有一个 description for how to
我看过很多类似的帖子,似乎我声明的 var1 似乎需要在其他地方传递,但我似乎无法弄清楚。 public Expression> CreateEqualNameExpression(string ma
Express(或 Connect 的)bodyParser 中间件被标记为已弃用,建议用户改用: app.use(connect.urlencoded()) app.use(connect.json
我只是想知道这种看似尴尬的配置的原因是什么(来自 Getting Started w/ Apollo Server ), const server = new ApolloServer({ //
我正在尝试在表单组中写入表单控件特定的验证错误消息。我在网上找到了几个教程和示例 ( such as this one ),概述了一个看似简单的 *ngIf div,如果在控件上检测到错误,则显示错误
我有一个简单的 Express 应用程序,托管在 AWS 上,使用无服务器框架。 我正在使用 serverless-http 包装 express 应用程序以部署到 AWS lambda 函数,并使用
我最近在 mozilla 教程的帮助下安装了 node 和 express。我正在安装应用程序生成器的下一步,但是当我运行时 npm install express-generator -g 在我的终
我遇到过两种不同的方式来定义 express、use() 中间件,我想知道它们之间是否有任何区别,或者它是否只是语法糖? 一个 const app = express(); app.use(cors(
我试图让我的 Jade 模板编写一个相对于当前 URL 的超链接 ( )。 例如,我的 View 是从 http://localhost/cats 调用的它看起来像这样: extends layou
检查 Express 文档我在下面看到了这种解决方案: app.all('/*', function(req, res) { console.log('Intercepting request
我似乎无法弄清楚如何包含多个模型。 我有三个模型。Tabs, Servers, and PointsTabs hasMany ServerServers belongsTo Tabs and hasM
我已使用Web PI安装IIS Express。在托盘中,没有IIS Express图标。如何在不使用命令行的情况下启动IIS Express?我希望IIS永久运行,因此没有命令行。 最佳答案 参见R
我不想在我的网站上使用 Jade 或 EJS。如何在不默认使用 Jade 模板的情况下创建快速站点?谢谢 最佳答案 如果您想要的是直接为静态 html 文件提供缓存资源的可能性,同时仍然能够点击“/”
Express是否支持HTTP动词“PATCH”,例如: app.patch("/api/resource", function(req, res){ ... }); 我检查了文档,对我来说似乎还不清
我正在快速服务器中运行 vue SPA。问题是当使用历史模式并刷新页面时,我得到一个 404 not found 异常。我尝试使用 connect-history-api-fallback 但不起作用
我是一名优秀的程序员,十分优秀!