在前面的文章里介绍过freemarker,thymeleaf模板引擎,本文介绍另一个性能超高的模板引擎---Beetl,据说此模板引擎的性能远超Freemarker。官网的说法是,Beetl 远超过主流java模板引擎性能(引擎性能5-6倍于FreeMarker,2倍于JSP。参考附录),而且消耗较低的CPU。
官方网站是:
DocumentDescriptionhttp://ibeetl.com/guide/#/beetl 这个网站上有详细的示例。想深入学习的话可在此网站上下载资料。
那么为什么有时候我们需要考虑使用模板引擎呢?使用VUE做前后端分离的前端不可以吗?使用模板引擎的主要场景是内容类网站,希望HTML正文能够对爬虫友好的,或者说内容能够直接呈现在html元素中,而不是通过接口动态赋值给页面元素的。
本文介绍Beetl快速上手的过程。
一、引入依赖
在openjweb-core模块中引入beetl依赖
XML
<dependency>
<groupId>com.ibeetl</groupId>
<artifactId>beetl-framework-starter</artifactId>
<version>1.2.28.RELEASE</version>
</dependency>
二、开发测试类
在openjweb-sys工程中建一个BeetlDemoController.java:
java
package org.openjweb.sys.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.HashMap;
import java.util.Map;
/**
* http://localhost:8001/demo/beetl/queryBook
*/
@Controller
@RequestMapping(value="/demo/beetl/")
public class BeetlDemoController {
@RequestMapping(value="/queryBook")
public String queryBook( Model model) {
Map<String,Object> map = new HashMap();
map.put("name", "三国演义");
map.put("author", "罗贯中");
model.addAttribute("book", map);
return "beetlDemo.btl";//返回页面名
}
}
这段代码创建了一个Map,map中含name,author,然后设置给book变量返回给前端的beetlDemo.btl页面。
然后在openjweb-sys的resources/templates下建一个beetlDemo.btl文件:
html
<!DOCTYPE HTML>
<html>
<head>
<title>图书</title>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
</head>
<body>
<table border="1">
<tr>
<td>book</td>
<td>author</td>
</tr>
<tr>
<td>${book.name}</td>
<td>${book.author}</td>
</tr>
</table>
</body>
</html>
文件中使用了{book.name}和{book.author}两个变量。
运行http://localhost:8001/demo/beetl/queryBook :
但是在实际项目中,如果把前端制作好的.html文件再改成扩展名.btl的话,会耗费时间,另外也不利于实时查看页面展示效果。所以还是使用.html后缀比较方便一点。如果使用.html后缀,可在application-dev.yml中增加:
beetl:
suffix: html
注意不是在spring节点下增加的,后缀html也不带. 别写成.html ,这个是实测过的。改成html后缀后,上面的beetlDemoController.java中的return "beetlDemo.btl" ;改为return "beetlDemo.html" ;即可。注意如果去掉.html会解析失败,所以需要写完整的文件名。改为解析.html后,.btl的解析就不支持了。
经过测试,beetl改为解析.html后,并不影响thymeleaf解析前面章节示例中的页面。另外以后项目主要还是使用beetl作为模板引擎。
二、beetl基础语法
如果完整学习beetl基础语法可查看官方资料:DocumentDescriptionhttp://ibeetl.com/guide/#/beetl/all 这里介绍常用的语法,beetl的语法有点类似javascript,也有点类似jsp,可以使用<%%>来书写beetl脚本。我们创建一个测试html,命名为beetlDemo3.html:
html
<!DOCTYPE HTML>
<html>
<head>
<title>图书2</title>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
</head>
<body>
<%
var a = 2;
var b = 3;
var result = a+b;
%>
hello 2+3=${result}<p>
<!--rotate-->
<%
for(user in users){
%>
hello,${user.realName},your email is ${user.userEmail} ;
<% } %>
</body>
</html>
然后在控制层中再增加一个测试方法,这个测试方法返回用户列表,然后在前端展示:
java
//http://localhost:8001/demo/beetl/demo
/**
* 演示beetl语法
* @param model
* @return
*/
@RequestMapping(value="/demo")
public String demo( Model model) {
CommUser user = new CommUser();
user.setRealName("张三");
user.setUserEmail("abc@163.com");
List<CommUser> list = new ArrayList<>();
list.add(user );
user = new CommUser();
user.setRealName("李四");
user.setUserEmail("lisi@163.com");
list.add(user );
model.addAttribute("users", list);
return "beetlDemo3.html";//返回页面名
}
上面的代码创建了2个用户,放到users变量中返回给beetleDemo3.html,在beetleDemo3.html中,使用
html
<%
for(user in users){
%>
hello,${user.realName},your email is ${user.userEmail} ;
<% } %>
循环显示users中的realName和userEmail,运行效果:
另外
<%
var a = 2;
var b = 3;
var result = a+b;
%>
hello 2+3=${result}<p>
演示了在html中书写动态脚本,有点类似jsp和javascript。
另外我们还可以使用beetl的逻辑表达式if,在beetlDemo3.html的</body>前加上下面的代码:
html
<%
var aa = 1;
var bb="good";
var cc = null;
if(aa==1&&bb=="good"&&cc==null){
%>
<script>alert('符合条件')</script>
<%
}
else{%>
<script>alert('不符合条件')</script>
<%
}
%>
运行效果:
还有其他常用的语法,下面是for的表达式:
<% var a = [1,2,3]; for(var i=0;i<a.~size;i++){ print(a[i]); } %>
下面是while循环:
<% var i = 0; while(i<5){ print(i); i++; } %>
其他语法就不再一一列举了。大家可以在使用的过程中根据需要来学习更多的语法。
本例代码见github: