Java模板引擎之Freemarker

Freemarker:是一款模板引擎,不是web框架。


本例java文件:

import java.io.File;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;

import freemarker.template.Configuration;
import freemarker.template.Template;

public class Test1 {
    public static void main(String[] args) throws Exception {
        //创建freemarker配置实例
        Configuration cfg = new Configuration();
        cfg.setDirectoryForTemplateLoading(new File("templates"));

        //创建数据模型
        Map root = new HashMap<>();
        root.put("user", "sy");
        root.put("random", new Random().nextInt(100));

        List list = new ArrayList<>();
        list.add(new Address("中国", "北京"));
        list.add(new Address("英国", "伦敦"));
        list.add(new Address("美国", "纽约"));
        root.put("lst", list);

        root.put("date1", new Date());

        root.put("htm2", "<b>粗体</b>");

        //加载模板文件
        Template t1 = cfg.getTemplate("a.ftl");

        //显示生成的数据
        Writer out = new OutputStreamWriter(System.out);
        t1.process(root, out); //加载root数据并输出
        out.flush();
        out.close();
    }
}

数据类型:

一:直接指定值
1、字符串:字符串值使用单引号或双引号限定。

<#assign c="sss" /> <#-- assign是定义变量  -->

2、数值:可直接输入,不需引号

<#assign b=123 />

3、布尔值:true或false,不使用引号

<#assign a=true /> <#-- assign是定义变量  -->

4、集合:集合用中括号包括,集合元素间用逗号分隔。使用数字范围也可表示数字集合,如1..5等同于[1,2,3,4,5]; 5..1表示[5,4,3,2,1]

5、Map对象:Map对象使用花括号包括,Map中的key-value对之间用冒号分隔,多组key-value对之间用逗号分隔。(key必须是字符串)

6、时间对象:

//创建数据模型
Map root = new HashMap<>();
root.put("date1", new Date());
${date1?string("yyyy-MM-dd HH:mm:ss")}
<#-- 输出:2017-04-12 16:16:37 -->

7、javabean的处理:同EL表达式一样,类型可自动转化


二:输出变量值:使用点(.)语法来访问java对象的属性
1、顶层变量:即直接放在数据模型中的值,输出用${name}即可。

Map root = new HashMap<>();
root.put("user", "sy");
你好,${user},今天你的精神不错! <#--输出:你好,sy,今天你的精神不错!-->

2、输出集合元素:根据集合元素的索引输出集合元素,索引用中括号包括。如:输出[“1”,”2”,”3”]这个集合number,可用${number[0]}输出第一个数字,还可用number[1..2]表示原集合的子集合[“2”,”3”]

3、输出Map元素:对于javabean,如下几种写法效果一致:

book.author.name
book.author["name"]
book["author"].name
book["author"]["name"]

三、字符串操作
1、字符串连接,下两种写法等效:
${"Hello,${user}"}
${"hello,"+user+"!"}

2、截取字串:根据字符串索引进行

<#assign number="01234">
${number[0]} <#-- 输出字符0 -->
${number[0..3]} <#-- 输出字串0123 -->

四:集合连接操作:运算符”+”


五、Map连接操作:运算符”+”


六、算术运算符:“+”“-””*”“/”“%”


七:比较运算符
1、=(或==):判断两个值是否相等
2、!=:判断两值是否不相等
3、>(或gt) :大于
4、>=(或gte):大于等于
5、<(或lt): 小于
6、<=(或lte):小于等于


八、逻辑运算符
1、&&:逻辑与
2、||:逻辑或
3、!:逻辑非


九、内建函数
1、html:对字符串进行HTML编码
2、cap_irst:是字符串第一个字母大写
3、lower_case:将字符串转成小写
4、upper_case:将字符串转成大写
5、size:获取集合中元素个数
6、int:获取数字的整数部分

Map root = new HashMap<>();
root.put("htm2", "<b>粗体</b>");
${htm2?html}
<#--输出:&lt;b&gt;粗体&lt;/b&gt;-->

十、空值处理空值:freemarker变量必须赋值,否则会抛异常。freemarker提供两个运算符来避免空值:
1、!:指定缺失变量的默认值

<#-- ${sss} 没有定义这个变量,会报异常 -->
${sss!} <#-- 没有定义这个变量,默认值是空字符串 -->
${sss!"abc"} <#-- 没有定义这个变量,默认值是字符串abc -->
<#--输出: 
        abc-->

2、??:判断变量是否存在,存在返回true,否则返回false

<#if myname??><h1>Welcome ${myname}</h1></#if>

模板开发语句:

一、if指令:
单判断:

<#if user=="sy">
    哈哈!
</#if>  <#-- 输出:哈哈! -->

双判断:

root.put("random", new Random().nextInt(100));
<#if random gte 60>  <#-- random>=60 -->
    及格
<#else>
    不及格
</#if>

多重判断:

<#if random gte 90>
    优秀!
<#elseif random gte 80>
    良好!
<#else>
    一般!
</#if>

二、list指令:

Map root = new HashMap<>();
List list = new ArrayList<>();
list.add(new Address("中国", "北京"));
list.add(new Address("英国", "伦敦"));
list.add(new Address("美国", "纽约"));
root.put("lst", list);

<#list lst as dizhi>
    <b>${dizhi.country}</b> <br/>
</#list>

<#-- 输出: <b>中国</b> <br/>
           <b>英国</b> <br/>
           <b>美国</b> <br/>  -->

三、include指令:
included.txt:

我是被包含的文件的内容!!!

a.ftl:

<#include "included.txt" />
<#-- 输出included.txt内容:我是被包含的文件的内容!!! -->

四、自定义指令(macro指令(宏指令)):
定义宏:

<#macro m1> <#--定义指令m1-->
    <b>aaabbbccc</b>
    <b>dddeeefff</b>
</#macro>

定义带参的宏:

<#macro m2 a b c>
    ${a}--${b}--${c}
</#macro>

nested指令(嵌入指令):

<#macro border>
    <table border=4 cellspacing=0 cellpadding=4>
        <tr>
            <td>
                 <#nested> 
            </td>
        </tr>
    </table>
</#macro>

调用宏:

<@m1 /> <@m1 /> <@m1 /> <#--调用三次m1,输出三次:<b>aaabbbccc</b>
                                            <b>dddeeefff</b> -->
<@m2 "hi" "nihao" "hello" /> <#-- 输出:hi--nihao--hello-->
<@m2 "s" "ss" "sss" />  <#-- 输出:s--ss--sss -->
<@border>
    sdasdsadjkskj;;sdkasdkksaj
</@border>
<#-- 输出:
    <table border=4 cellspacing=0 cellpadding=4>
        <tr>
            <td>
    sdasdsadjkskj;;sdkasdkksaj
            </td>
        </tr>
    </table>
-->

五、命名空间namespace:
路径不应包含大写字母,为了分隔词语,使用下划线。
b.ftl:

<#macro copyright date>
    <p>Copyright ${date} sy.</p>
</#macro>
<#assign mail="sy@1.com">

a.ftl:

<#import "b.ftl" as bb />
<@bb.copyright date="2017.4.12" />
${bb.mail}
<#assign mail="my@1.com" />
${mail}
<#assign mail="my@1.com" in bb />
${bb.mail}

<#--输出:
    <p>Copyright 2017.4.12 sy.</p>
sy@1.com
my@1.com
my@1.com
-->
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值