最近项目中有个邮件发送的需求,不过要求发送的HTML格式的邮件。由于Beetl对java语言的良好支持和很好的性能,我们决定使用Beetl作为我们的模板引擎。

Beetl官网已经有了很详细的教程,所以本篇侧重于实战应用,适合需要不懂beetl或其他模板引擎但需要快速上手写出代码的人。

那么为什么要用模板引擎呢?很简单的原因,实际应用场景中文本的格式是固定的,但是内容有所不同。如果是不复杂的内容我们可以直接用代码生成需要的文本。但是当文本变得复杂的时候,我们用java生成文本的性能就会下降,同时也不利于维护。解决办法是将数据和格式进行分离,将一个文本分成模板和数据。模板中有固定的格式,需要动态变化的数据一般用占位符代替。这样我们想改模板格式的时候不需要去更改代码,只需要去改模板就可以了。同时模板引擎渲染文本的效率也会更高。

一、安装

Maven项目直接添加下面的依赖。

  1. <dependency>
  2. <groupId>com.ibeetl</groupId>
  3. <artifactId>beetl-framework-starter</artifactId>
  4. <version>1.1.55.RELEASE</version>
  5. </dependency>

二、直接上手

Beetl的核心是GroupTemplate,创建GroupTemplate需要俩个参数,一个是模板资源加载器,一个是配置类。

  1. public void BeetlString() throws Exception {
  2. //new一个模板资源加载器
  3. StringTemplateResourceLoader resourceLoader = new StringTemplateResourceLoader();
  4. /* 使用Beetl默认的配置。
  5. * Beetl可以使用配置文件的方式去配置,但由于此处是直接上手的例子,
  6. * 我们不去管配置的问题,只需要基本的默认配置就可以了。
  7. */
  8. Configuration config = Configuration.defaultConfiguration();
  9. //Beetl的核心GroupTemplate
  10. GroupTemplate groupTemplate = new GroupTemplate(resourceLoader, config);
  11. //我们自定义的模板,其中${title}就Beetl默认的占位符
  12. String testTemplate="<html>\n" +
  13. "<head>\n" +
  14. "\t<title>${title}</title>\n" +
  15. "</head>\n" +
  16. "<body>\n" +
  17. "\t<h1>${name}</h1>\n" +
  18. "</body>\n" +
  19. "</html>";
  20. Template template = groupTemplate.getTemplate(testTemplate);
  21. template.binding("title","This is a test template Email.");
  22. template.binding("name", "beetl");
  23. //渲染字符串
  24. String str = template.render();
  25. System.out.println(str);
  26. }

Beetl的使用很简单,我们首先需要一个模板资源加载器(实际上有六种不同的模板资源加载器),和Beetl的配置来创建Beetl核心GroupTemplate。

第二步,我们需要通过GroupTemplate将自己定义的String模板加载为Beetl模板——Template。

第三步,我们使用template中的操作,将数据和占位符绑定。

第四步,渲染最终的文本。

这样一个简单的Beetl例子就完成了,你可以运行一下试试看。渲染成功的结果应该是这样的:

  1. <html>
  2. <head>
  3. <title>This is a test template Email.</title>
  4. </head>
  5. <body>
  6. <h1>beetl</h1>
  7. </body>
  8. </html>

三、使用Map绑定

上面的例子中只有两个参数,我们单个绑定也不会觉得麻烦。实际使用可能会有相当多的参数,这时候我们直接绑定就会变得麻烦。Beetl支持使用Map来绑定参数。

  1. //...
  2. Map<String,String> map=new HashMap<String,String>()
  3. map.put("name", "beetl");
  4. map.put("title","This is a test template Email.");
  5. template.binding(map);
  6. //...

可以试着优化一下代码结构来更好地让数据和模板分离,比如函数的参数传入一个map。

四、使用循环语句

上一步我们使用了Map来绑定,这次我们要试试传入Map格式的数据,并在Beetl模板中使用循环语句遍历Map。

Beetl支持丰富的循环方式,如for-in,for(exp;exp;exp),以及while循环,以及循环控制语句break;continue; 另外,如果没有进入for循环体,还可以执行elsefor指定的语句。

模板中使用Beetl语法需要用<% %> 括起来。以下例子来自官方文档:

  1. <%
  2. for(entry in map){
  3. var key = entry.key;
  4. var value = entry.value;
  5. print(value);
  6. }
  7. %>

我们给出一个实际的例子:

  1. public void BeetlString() throws Exception {
  2. //...
  3. String testTemplate="<html>\n" +
  4. "<head>\n" +
  5. "\t<title>This is a test template Email.</title>\n" +
  6. "</head>\n" +
  7. "<body>\n" +
  8. "\t<h1>beetl</h1>\n" +
  9. "<%" +
  10. " for(entry in map){" +
  11. " print(entry.key+\":\"+entry.value);}%>"+
  12. "</body>\n" +
  13. "</html>";
  14. Template t = gt.getTemplate(testTemplate);
  15. t.fastBinding(map);
  16. Map<String,String> data=new HashMap<String,String>();
  17. data.put("test","213");
  18. data.put("aaa","123");
  19. //把map类型数据绑定到占位符map上,但在Beetl中使用循环时不需要用${}
  20. t.binding("map",data);
  21. String str = t.render();
  22. System.out.println(str);
  23. }

输出结果:

  1. <html>
  2. <head>
  3. <title>This is a test template Email.</title>
  4. </head>
  5. <body>
  6. <h1>beetl</h1>
  7. aaa:123test:213</body>
  8. </html>

五、条件语句

条件语句跟js的语法基本一致,没有特别的地方。但是请注意<%%>中不能使用占位符,否则会报错。

以下内容来自官方文档

if else

同js一样,支持if else,如下例子

  1. <%
  2. var a =true;
  3. var b = 1;
  4. if(a&&b==1){
  5. }else if(a){
  6. }else{
  7. }
  8. %>
switch-case

同js一样,支持switch-case,如下例子

  1. <%
  2. var b = 1;
  3. switch(b){
  4. case 0:
  5. print("it's 0");
  6. break;
  7. case 1:
  8. print("it's 1");
  9. break;
  10. default:
  11. print("error");
  12. }
  13. %>

switch变量可以支持任何类型,而不像js那样只能是整形

select-case

select-case 是switch case的增强版。他允许case 里有逻辑表达式,同时,也不需要每个case都break一下,默认遇到合乎条件的case执行后就退出。

  1. <%
  2. var b = 1;
  3. select(b){
  4. case 0,1:
  5. print("it's small int");
  6. case 2,3:
  7. print("it's big int");
  8. default:
  9. print("error");
  10. }
  11. %>

select 后也不需要一个变量,这样case 后的逻辑表达式将决定执行哪个case.其格式是

  1. <%
  2. select {
  3. case boolExp,orBoolExp2:
  4. doSomething();
  5. }
  6. %>
  7. <%
  8. var b = 1;
  9. select{
  10. case b<1,b>10:
  11. print("it's out of range");
  12. break;
  13. case b==1:
  14. print("it's 1");
  15. break;
  16. default:
  17. print("error");
  18. }
  19. %>

Beetl模板引擎入门教程的更多相关文章

  1. .net 开源模板引擎jntemplate 教程:基础篇之语法

    一.基本概念 上一篇我们简单的介绍了jntemplate并写了一个hello world(如果没有看过的,点击查看),本文将继续介绍jntemplate的模板语法. 我们在讲解语法前,首先要了解一下标 ...

  2. .net 开源模板引擎jntemplate 教程:基础篇之在ASP.NET MVC中使用Jntemplate

    在ASP.NET MVC 中使用Jntemplate 上一篇我们详细介绍了jntemplate的标签语法,本篇文章将继续介绍如何在ASP.NET MVC 中使用Jntemplate. 一.使用Jnte ...

  3. SpringBoot集成beetl模板快速入门

    SpringBoot集成beetl模板快速入门 首次探索 beetl官方网址:http://ibeetl.com/ 创建SpringBoot工程(idea) 新建工程 选择创建Spring工程 书写包 ...

  4. HTML5模板引擎 Thymeleaf 教程(转)

    原文:http://www.open-open.com/lib/view/open1383622135586.html Thymeleaf是一个XML/XHTML/HTML5模板引擎,可用于Web与非 ...

  5. Velocity模板引擎入门

    类似于PHP中的Smarty,Velocity是一个基于Java的模板引擎(template engine).它允许任何人仅仅简单的使用模板语言(template language)来引用由java代 ...

  6. thymeleaf模板引擎入门

    ThymeLeaf是什么 Thymeleaf是一个用于服务器端的java模板引擎,它使用简单但功能强大,目前可以处理的模板类型包括:HTML.XML.TEXT.JavaScript.CSS等. 搭建t ...

  7. 【Python-Django】Jinja2模板引擎配置教程详解!!!!

    Jinjia2的官方文档:http://jinja.pocoo.org/docs/2.10/ 1. 安装Jinja2扩展包 $ pip install Jinja2 2. 配置Jinja2模板引擎 T ...

  8. beetl模板引擎使用笔记

    maven项目pom: <dependency> <groupId>com.ibeetl</groupId> <artifactId>beetl< ...

  9. FreeMarker数据模板引擎全面教程mark

    http://blog.csdn.net/fhx007/article/details/7902040/#comments 以下内容全部是网上收集: FreeMarker的模板文件并不比HTML页面复 ...

随机推荐

  1. java cocurrent ConcurrentHashMap、读写锁、Condition、线程池、Barrier、CountDownLatch、Callable、BlockingQueue

    Java并发学习笔记 - yang_net - 博客频道 - CSDN.NET               Java并发学习笔记 - yang_net - 博客频道 - CSDN.NET 并发小结:高 ...

  2. sql中把字符串转化为数字的方法

    1. convert(int,字段名) 2. cast(字段名 as int)

  3. MongoDB的固态list

    在MongoDB中当前数据库所指定的list可以是一个固态的list,所谓固态就是大小确定,如创建一个固态的集合:db.createCollection("固态集合的名字",{ca ...

  4. Celery 分布式任务队列入门

    一.Celery介绍和基本使用 Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理, 如果你的业务场景中需要用到异步任务,就可以考虑使用celery ...

  5. lmathlib文件

    lua的math库是通过lua扩展而来,主要对系统math库进行了一次封装,以供lua使用,一般可以从lmathlib文件开始阅读源码. //绝对值 static int math_abs (lua_ ...

  6. 洛谷P2059 卡牌游戏 [JLOI2013] 概率dp

    第一道期望题好像是?还是对这类题目的做法启发比较大的quqqqqq 正解:概率dp 解题报告: 先港下,学到的一个算是结论的玩意儿: 概率正推期望逆推 很多时候正推期望是很麻烦的,但是逆推回去就会,简 ...

  7. function $(id) {}表示什么函数

    function $(id) {}表示什么函数 一.总结 1.就是简写,不然每次打document.getElementById很烦 二.问题 function $(id) {return docum ...

  8. 使用spring boot,gradle,idea,js,html创建一个小的前后端程序

    1:配置build.gradle,添加依赖等 buildscript { repositories { mavenCentral() } dependencies { classpath('org.s ...

  9. [py]约瑟夫问题-循环队列

    约瑟夫问题(历史战争问题) 直观理解 老外视频讲解 模拟器演示 约瑟夫问题 数学姥公众号 讲的最清楚 背景及,推倒过程讲解得很清晰,旨在提高人们对数据的兴趣 简单说下: 几个人围成一圈(循环队列), ...

  10. 尝试.Net Core—使用.Net Core + Entity FrameWork Core构建WebAPI(一)

    想尝试.Net Core很久了,一直没有时间,今天回家,抛开一切,先搭建一个.Net Core的Demo出来玩玩. 废话少说,咱直奔主题: 一.开发环境 VS2015 Update3 Microsof ...