5分钟学会springboot中beetl模版引擎的基本使用
Beetl是一款优秀的模版引擎,它借鉴了js的语法,大大降低的学习的成本。因为是国产,所以有详细的中文文档。更是降低了的学习的门槛。
官网
在SpringBoot中整合Beetl
导入依赖
<!-- https://mvnrepository.com/artifact/com.ibeetl/beetl -->
<dependency>
<groupId>com.ibeetl</groupId>
<artifactId>beetl</artifactId>
<version>3.1.7.RELEASE</version>
</dependency>
配置类
import org.beetl.core.resource.ClasspathResourceLoader;
import org.beetl.ext.spring.BeetlGroupUtilConfiguration;
import org.beetl.ext.spring.BeetlSpringViewResolver;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class BeetlConfiguration {
@Value("${beetl.templates-path}")
private String templatesPath;
@Bean(initMethod = "init", name = "beetlConfig")
public BeetlGroupUtilConfiguration getBeetlGroupUtilConfiguration() {
BeetlGroupUtilConfiguration beetlGroupUtilConfiguration = new BeetlGroupUtilConfiguration();
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
if (classLoader == null) {
classLoader = BeetlConfiguration.class.getClassLoader();
}
ClasspathResourceLoader classpathResourceLoader = new ClasspathResourceLoader(classLoader, templatesPath);
beetlGroupUtilConfiguration.setResourceLoader(classpathResourceLoader);
beetlGroupUtilConfiguration.init();
beetlGroupUtilConfiguration.getGroupTemplate().setClassLoader(classLoader);
return beetlGroupUtilConfiguration;
}
@Bean(name = "beetlViewResolver")
public BeetlSpringViewResolver getBeetlSpringViewResolver(
@Qualifier("beetlConfig") BeetlGroupUtilConfiguration beetlGroupUtilConfiguration) {
BeetlSpringViewResolver beetlSpringViewResolver = new BeetlSpringViewResolver();
beetlSpringViewResolver.setContentType("text/html;charset=UTF-8");
beetlSpringViewResolver.setOrder(0);
beetlSpringViewResolver.setSuffix(".btl");
beetlSpringViewResolver.setConfig(beetlGroupUtilConfiguration);
return beetlSpringViewResolver;
}
}
配置项
# 配置模板引擎所在的目录
beetl:
templates-path: templates
模板引擎所在目录
classpath路径下的 templates 目录
Hello World
Controller
@RequestMapping("/helloworld")
@Controller
public class HelloworldController {
@GetMapping
public Object helloworld () {
return new ModelAndView("/helloworld/helloworld");
}
}
模版引擎
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Hello World!</title>
</head>
<body>
<%
var message = "Hello World!";
%>
<h1>${message}</h1>
</body>
</html>
渲染效果
基本的语法
使用 <% %> 作为模板语言的定界符,使用 ${name} 渲染数据
通过Controller设置变量
@RequestMapping("/demo1")
@Controller
public class Demo1Controller {
@GetMapping
public Object demo1 () {
ModelAndView modelAndView = new ModelAndView("/demo1/demo1");
/**
* 填充变量到Model,相当于在模板引擎中定义了全局变量。可以在任意地方使用,
*/
modelAndView.addObject("name", "SpringBoot");
return modelAndView;
}
}
视图
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Demo1</title>
</head>
<body>
<%
// 在定界符里面,就完全当js来写模板引擎的代码
/*
* 支持多行注释语法
*/
// 在定界符外面,通过 ${name} 来读取到模板变量的值
%>
<%
// 字符串的拼接
var finalName = "Hello " + name; // 对字符串进行拼接。name 变量来自于 Controller中对ModelAndView的填充
%>
<div>${finalName}</div>
<%
// 基本的运算
var a = 2;
var b = 3;
var result = a + b;
%>
<div>${result}</div>
</body>
</html>
如你所见,当js写。不需要额外的学习成本。支持基本的运算,拼接
渲染结果
渲染集合
Controller
@RequestMapping("/demo2")
@Controller
public class Demo2Controller {
@GetMapping
public Object demo1 () {
ModelAndView modelAndView = new ModelAndView("/demo2/demo2");
// 集合
modelAndView.addObject("list", Arrays.asList("选项1", "选项2", "选项3"));
return modelAndView;
}
}
视图
使用下标遍历
.~size 是集合类型的一个虚拟属性。它返回集合的长度。 ${} 表达式,支持通过下标取值。与js无异。
<ul>
<%
for (var i = 0; i < list.~size; i ++){
%>
<li>${list[i]}</li>
<%
}
%>
</ul>
使用forEeach遍历
<ul>
<%
for (var item in list){
%>
<li>${item}</li>
<%
}
%>
</ul>
使用forEeach遍历的时候,可以通过一些预定义的属性,来获取迭代状态
<ul>
<%
for (var item in list){
%>
<li>${item} - ${itemLP.index} - ${itemLP.size} - ${itemLP.first} - ${itemLP.last} - ${itemLP.even} - ${itemLP.odd}</li>
<%
}
%>
</ul>
LP是Beetl隐含定义的变量,能在循环体内使用。其命名规范是item名称后加上LP,他提供了当前循环的信息,如
userLP.index 当前的索引,从1开始
userLP.size 集合的长度
userLP.first 是否是第一个
userLP.last 是否是最后一个
userLP.even 索引是否是偶数
userLP.odd 索引是否是奇数
渲染Map/对象
Controller
@RequestMapping("/demo3")
@Controller
public class Demo3Controller {
@GetMapping
public Object demo3 () {
ModelAndView modelAndView = new ModelAndView("/demo3/demo3");
// Map
modelAndView.addObject("map", Collections.singletonMap("我是key", "我是value"));
// 对象
modelAndView.addObject("user", new User(1, "KevinBlandy", new Date())); // public User(Integer id, String name, Date createdDate) {...}
return modelAndView;
}
}
视图
Map的迭代,使用forEach。在循环体中通过key
和value
获取对应的值。
<ul>
<%
for(entry in map) {
var key = entry.key; // 获取到key属性
var value = entry.value; // 获取到value属性
%>
<li>key=${key}, value=${value}</li>
<%
}
%>
Map属性的访问,支持类似于数组的访问方式
<div>${map["我是key"]}</div>
访问对象的属性
<ul>
<li>${user.id}</li>
<li>${user.name}</li>
<li>${user.createdDate}<</li>
</ul>
更多的内容,查看官方文档
以上简单的介绍了整合springboot,以及对于集合,Map,对象这类基本的数据处理。对于一般的应用而言,满足基本的渲染要求。毕竟模板引擎的任务只是读取数据和基本的判断。
Beetl的功能不仅仅于此,还支持如下的功能
- 自定义函数/标签/虚拟属性
- 自定义异常处理
- 布局
- …
需要深入学习,可以参阅官方文档。beetl,不难。好使!