前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MVEL2.x模板指南

MVEL2.x模板指南

作者头像
Abalone
发布于 2022-07-14 06:14:16
发布于 2022-07-14 06:14:16
2.1K00
代码可运行
举报
文章被收录于专栏:影像技术栈影像技术栈
运行总次数:0
代码可运行

简介

MVEL最初作为Mike Brock创建的 Valhalla项目的表达式计算器(expression evaluator)。Valhalla本身是一个早期的类似 Seam 的“开箱即用”的Web 应用框架,而 Valhalla 项目现在处于休眠状态, MVEL则成为一个继续积极发展的项目。相比最初的OGNLJEXLJUEL等项目,而它具有远超它们的性能、功能和易用性 - 特别是集成方面。它不会尝试另一种JVM语言,而是着重解决嵌入式脚本的问题。关于MVEL的语法请参考MVEL 2.x语法指南

MVEL 2.0提供了一个新的,更强大的,统一的模板引擎,汇集了1.2中引入的许多模板概念。 不幸的是,1.2中的模板引擎的架构不足以用于常规维护,并且决定从头开始完全重写模板引擎。

一、MVEL 2.0基本模板

MVEL模板由纯文本文档中的orb-tags组成。 Orb标记表示引擎将在运行时计算模板的动态元素。

如果你熟悉FreeMarker,这种类型的语法将不会完全陌生。

1. 一个简单的模板

代码语言:javascript
代码运行次数:0
运行
复制
Hello, @{person.getSex() == 'F' ? 'Ms.' : 'Mr.'} @{person.name}

This e-mail is to thank you for your interest in MVEL Templates 2.0.

此模板展示了可以在简单文本中嵌入表达式。当计算结果时,输出可能如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
Hello, Ms. Sarah Peterson

This e-mail is to thank you for your interest in MVEL Templates 2.0.

2. 转义@符号

当然,由于@符号用于表示orb-tag的开头,因此您可能需要对其进行转义,以防止其被编译器处理。幸运的是,只有一种情况,即当你实际上需要输出‘@{‘字符串在您的模板上时。

由于编译器需要@和{组合触发orb识别,你可以自由使用@符号而不转义它们。例如:

代码语言:javascript
代码运行次数:0
运行
复制
Email any questions to: foo@bar.com

@{date}
@include{'disclaimer.html'}

但是在你需要一个@符号挨着一个orb-tag的情况下,你需要通过重复它两次来避免它:

代码语言:javascript
代码运行次数:0
运行
复制
@{username}@@@{domain}

这是两个@转义一个符号,第三个@是标签的开始。如果你感觉这看起来太乱,你可以使用替代方法,即使用表达式标签,如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
@{username}@{'@'}@{domain}

二、MVEL 2.0 Orb标签

本文包含了MVEL 2.0模板引擎中所有开箱即用的orb标签。

1. @{} Orb表达式

@{}表达式是orb-tag的最基本形式。它包含一个对字符串求值的值表达式,并附加到输出模板中。例如:

代码语言:javascript
代码运行次数:0
运行
复制
Hello, my name is @{person.name}

2. @code{} 静默代码标签

静默代码标记允许您在模板中执行MVEL表达式代码。它不返回值,并且不以任何方式影响模板的格式。

代码语言:javascript
代码运行次数:0
运行
复制
@code{age = 23; name = 'John Doe'}
@{name} is @{age} years old

该模板将计算出:John Doe is 23 years old。

3. @if{}@else{} 控制流标签

@if{}和@else{}标签在MVEL模板中提供了完全的if-then-else功能。 例如:

代码语言:javascript
代码运行次数:0
运行
复制
@if{foo != bar}
   Foo not a bar!
@else{bar != cat}
   Bar is not a cat!
@else{}
   Foo may be a Bar or a Cat!
@end{}

MVEL模板中的所有块必须用@end{}标签来终止,除非是if-then-else结构,其中@else{}标记表示前一个控制语句的终止。

4. @foreach{} Foreach迭代

foreach标签允许您在模板中迭代集合或数组。 注意:foreach的语法已经在MVEL模板2.0中改变,以使用foreach符号来标记MVEL语言本身的符号。

代码语言:javascript
代码运行次数:0
运行
复制
@foreach{item : products} 
 - @{item.serialNumber}
@end{}

MVEL 2.0要求您指定一个迭代变量。虽然MVEL 1.2假设您没有指定别名,但由于对该默认操作有一些抱怨,因此已被删除。

5. 多重迭代

您可以通过逗号分隔迭代在一个foreach循环中一次性迭代多个集合:

代码语言:javascript
代码运行次数:0
运行
复制
@foreach{var1 : set1, var2 : set2}
  @{var1}-@{var2}
@end{}

6. 分隔

你可以通过在@end{}标签中指定迭代器的文本分隔符。

代码语言:javascript
代码运行次数:0
运行
复制
@foreach{item : people}@{item.name}@end{', '}

将返回类似这样的结果:John, Mary, Joseph。

7. @include{} 包含模板文件

您可以使用此标签将模板文件包含到MVEL模板中。

代码语言:javascript
代码运行次数:0
运行
复制
@include{'header.mv'}

This is a test template.

您还可以通过在模板名称后面添加分号在include标签内执行MVEL表达式:

代码语言:javascript
代码运行次数:0
运行
复制
@include {'header.mv'; title ='Foo Title'}

8. @includeNamed{} 包括一个命名模板

命名模板是已经通过TemplateRegistry预先编译并传递到运行时的模板,或者已在模板本身中声明的模板。 您只需添加:

代码语言:javascript
代码运行次数:0
运行
复制
@includeNamed {'fooTemplate'}
@includeNamed {'footerTemplate',showSomething = true}

你也可以在@includeNamed{}标签中执行MVEL代码,就像@include{}标签一样。

9. @declare{} 声明一个模板

除了包括外部文件的外部模板,并以编程方式传递它们之外,您还可以从模板中声明模板。 它允许你做这样的事情:

代码语言:javascript
代码运行次数:0
运行
复制
@declare{'personTemplate'}
 Name: @{name}
 Age:  @{age}
@end{}

@includeNamed{'personTemplate'; name='John Doe'; age=22}

10. @comment{} 注释标签

注释标签允许您向模板添加不可见的注释。 例如:

代码语言:javascript
代码运行次数:0
运行
复制
@comment{
  This is a comment
}
Hello: @{name}!

三、MVEL 2.0模板集成

使用MVEL模板是直接和容易的。 与常规MVEL表达式一样,它们可以解释性地执行,或者预编译并重新用于更快的评估。

1. org.mvel.templates.TemplateRuntime 类

TemplateRuntime类是模板引擎的中心。您可以通过eval()方法将要计算的模板传递给模板引擎。

一般来说,模板引擎遵循上下文和变量绑定的所有相同规则,使用一组重载的eval()方法。

下面是一个解析模板的简单例子:

代码语言:javascript
代码运行次数:0
运行
复制
String template = "Hello, my name is @{name.toUpperCase()}");
Map vars = new HashMap();
vars.put("name", "Michael");

String output = (String) TemplateRuntime.eval(template, vars);

在执行结束时,“output”变量将包含字符串:

代码语言:javascript
代码运行次数:0
运行
复制
Hello, my name is MICHAEL

2. org.mvel.templates.TemplateCompiler类

TemplateCompiler类允许预先编译模板。

当编译模板时,将生成一个紧凑,可重用的评估树,可以快速用于计算模板。它直接使用:

代码语言:javascript
代码运行次数:0
运行
复制
String template = "1 + 1 = @{1+1}";

// 编译模板
CompiledTemplate compiled = TemplateCompiler.compileTemplate(template);

// 执行模板
String output = (String) TemplateRuntime.execute(compiled);

在执行结束时,“output”变量将包含字符串:

代码语言:javascript
代码运行次数:0
运行
复制
1 + 1 = 2
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-09-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
MVEL 2.x语法指南
MVEL全称为:MVFLEX Expression Language,是用来计算Java语法所编写的表达式值的表达式语言。MVEL的语法很大程度上受到Java语法的启发,但为了使表达式语法更高效,还是有一些基本差异,例如可以像正则表达式一样直接支持集合、数组和字符串匹配的运算。
Abalone
2022/07/14
2.8K0
Groovy模板引擎
Groovy语言包含了一个模板引擎功能,可以生成各种类型的格式化文件,非常方便。模板引擎有下面几个,它们都实现了Template接口。
乐百川
2022/05/05
3.1K0
Django 模板4.1
模板介绍 作为Web框架,Django提供了模板,可以很便利的动态生成HTML 模版系统致力于表达外观,而不是程序逻辑 模板的设计实现了业务逻辑(view)与显示内容(template)的分离,一个视图可以使用任意一个模板,一个模板可以供多个视图使用 模板包含 HTML的静态部分 动态插入内容部分 Django模板语言,简写DTL,定义在django.template包中 由startproject命令生成的settings.py定义关于模板的值: DIRS定义了一个目录列表,模板引擎按列表
Lansonli
2021/10/09
1.5K0
smarty模板引擎原理解析
//php 控制器文件 <?php //引入模板引擎文件 include("20130304.php"); $smarty = new TinySmarty(); $qq_numbers=array(
joshua317
2018/04/13
1.7K0
JAVA安全之Velocity模板注入刨析
关于Velocity模板注入注入之前一直缺乏一个系统性的学习和整理,搜索网上大多数类似的内容都是一些关于漏洞利用的复现,而且大多都仅限于Velocity.evaluate的执行,对于载荷的构造以及执行过程并没有详细的流程分析,于是乎只能自己动手来填坑了~
Al1ex
2024/09/26
3760
JAVA安全之Velocity模板注入刨析
python 模板实现-引擎的编写(有时间试一下)
1.模板的编写:https://blog.csdn.net/MageeLen/article/details/68920913
晓歌
2018/08/15
1.4K0
Apache Velocity-----基于Java的模板引擎
Apache Velocity是一个基于Java的模板引擎,它提供了一个模板语言去引用由Java代码定义的对象。Velocity是Apache基金会旗下的一个开源软件项目,旨在确保Web应用程序在表示层和业务逻辑层之间的隔离(即MVC设计模式)。
wuweixiang
2018/08/14
10.5K0
Ansible Jinja2 模板使用
3、 该用户也被 ansible 使用,因为几乎所有的生产环境都是禁止 root 远程登录的(因此该 yun 用户也进行了 sudo 提权)。
踏歌行
2020/10/15
5K0
Ansible Jinja2 模板使用
Spring MVC 学习总结(七)——FreeMarker模板引擎与动态页面静态化
模板引擎可以让程序实现界面与数据分离,业务代码与逻辑代码的分离,这就提升了开发效率,良好的设计也使得代码复用变得更加容易。一般的模板引擎都包含一个模板解析器和一套标记语言,好的模板引擎有简洁的语法规则、强大的功能、高效的渲染效率、详尽的帮助说明与不断的更新与维护。常见的前端模板引擎有:
张果
2022/05/09
4.1K0
Spring MVC 学习总结(七)——FreeMarker模板引擎与动态页面静态化
(五) SpringBoot起飞之路-Thymeleaf模板引擎整合及基本用法总结
现在来说,前后端分离开始更加流行,但是很多旧的项目,或者自己一个人写东西,我感觉使用模板引擎也是非常不错的选择,还有时候去找一些后台的开源模板,有一些也都用了Thymeleaf, 何况出于学习的态度,学哪种技术都是可以的
BWH_Steven
2020/05/31
2.2K0
微服务架构Day03-SpringBoot之web开发配置
概述 SpringBoot开发: 1.创建SpringBoot应用,选中需要的场景模块。 2.SpringBoot已经默认将场景模块配置好,只需要在配置文件中指定少量的配置(数据库地址,用户名,密码)就可以运行起来。 3.只需要编写业务逻辑代码。 需要掌握自动配置原理:这个场景中SpringBoot默认配置好了什么,能不能修改,能修改哪些配置,能不能扩展。 XxxAutoConfiguration:帮我们给容器中自动配置组件 XxxProperties:配置类,封装配置文件中的内容 SpringBoo
攻城狮Chova
2022/01/22
9840
重学SpringBoot系列之整合静态资源与模板引擎
当然,可以通过spring.resources.static-locations配置指定静态文件的位置。但是要特别注意,一旦自己指定了静态资源目录,系统默认的静态资源目录就会失效。所以系统默认的就已经足够使用了,尽量不要自定义。
大忽悠爱学习
2021/12/07
5.3K0
重学SpringBoot系列之整合静态资源与模板引擎
05_模板引擎
模板引擎可以让将数据和HTML模板更加友好的结合,省去繁琐的字符串拼接,使代码更加易于维护。
张哥编程
2024/12/13
2050
低代码探索:freemarker的模板和表达式
在低代码探索:Java 模板引擎技术 中,我们介绍了freemarker的概念和简单使用示例。本篇会详细介绍一下freemarker中的表达式,这在使用时很重要。我们通过模板定义要生成的页面框架,通过表达式来实现参数占位/替换,输入变量的首字母大/小写转换,以及for循环遍历等等。通过模板与表达式的配合,生成所需的页面/代码文件。
程序员架构进阶
2022/12/01
2K0
低代码探索:freemarker的模板和表达式
JavaScript Standard Style(JS Standard 代码风格规则详解)
现在所有流行的代码压缩器都是通过 AST 压缩,因此它们在处理没有分号的 JavaScript 代码时没有问题(因为 JavaScript 不是必须使用分号)。
FungLeo
2019/05/26
2.8K0
poi-tl实现对Word模板中复杂表格的数据填充
注意: 只能操作.docx格式的word,不能操作.doc格式的word. 只能操作word中的表格, 不能操作Excel中的表格
时间静止不是简史
2022/12/09
13.9K0
poi-tl实现对Word模板中复杂表格的数据填充
java velocity 语法_Velocity语法
#set($name = “hello”)说明:velocity中变量是弱类型的。
全栈程序员站长
2022/09/14
2.6K0
FreeMarker模板开发指南知识点梳理
freemarker是什么? 有什么用? 怎么用? (问得好,这些都是我想知道的问题) freemarker是什么?   FreeMarker 是一款 模板引擎: 即一种基于模板和要改变的数据, 并用
JackieZheng
2018/01/16
1.6K0
FreeMarker模板开发指南知识点梳理
深入解析Spring EL表达式:概念、特性与应用
EL表达式,全称Expression Language,是一种表达式语言,它借鉴了JavaScript和XPath的表达式语言,并设计用来简化在Java Web应用程序中的表达式。在JSP 2.0及以后的版本中,EL表达式被引入,允许开发者在JSP页面上更方便地访问和操作数据。
公众号:码到三十五
2024/03/19
3.9K0
《Kotin 编程思想·实战》
Xtend是Eclipse推出的一个新的JVM语言,并无意替代Java,而是以己之长补Java之短,精简代码,无类型,改进可读和维护。Eclipse Xtend可以编译成可读的Java代码,类似CoffeeScript之于Javascript。
一个会写诗的程序员
2018/08/17
1.4K0
相关推荐
MVEL 2.x语法指南
更多 >
目录
  • 简介
  • 一、MVEL 2.0基本模板
    • 1. 一个简单的模板
    • 2. 转义@符号
  • 二、MVEL 2.0 Orb标签
    • 1. @{} Orb表达式
    • 2. @code{} 静默代码标签
    • 3. @if{}@else{} 控制流标签
    • 4. @foreach{} Foreach迭代
    • 5. 多重迭代
    • 6. 分隔
    • 7. @include{} 包含模板文件
    • 8. @includeNamed{} 包括一个命名模板
    • 9. @declare{} 声明一个模板
    • 10. @comment{} 注释标签
  • 三、MVEL 2.0模板集成
    • 1. org.mvel.templates.TemplateRuntime 类
    • 2. org.mvel.templates.TemplateCompiler类
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档