freemarker 模版引擎

一:FreeMarker概述

FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写。

具有一定的编程能力,
由FreeMarker生成页面,通过模板显示准备的数据:大致结构如下

    ftl 模版文件
                  ---FreeMarker引擎 ---->输出想要的结果
       数据模型

FreeMarker不是一个Web应用框架,而适合作为Web应用框架一个组件。

FreeMarker与容器无关,因为它并不知道HTTPServletFreeMarker同样可以应用于非Web应用程序环境。


二:FreeMarker生成模版文件

直接上代码;以下是通过ftl文件生成xml文件的代码。
    package test;


import java.io.File;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.StringWriter;
import java.io.Writer;
import java.util.List;
import java.util.Map;


import org.apache.commons.io.FileUtils;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import freemarker.template.Configuration;
import freemarker.template.Template;


public class FreeMarkerTest {


/**
* @param args
*/
@SuppressWarnings("unchecked")
public static void main(String[] args) {

try {
// 创建数据模型
Map<String, Object> model = Maps.newHashMap();
List lstcore = Lists.newArrayList();
lstcore.add("test1");
lstcore.add("test2");
model.put("lstcore", lstcore);


// 创建Freemarker 实例
// Configuration实例是存储FreeMarker应用级设置的核心部分
Configuration configuration = new Configuration();


// 设置模版加载目录,指定模板文件从何处加载的数据源--是指定目录不是文件
configuration.setDirectoryForTemplateLoading(new File(
FreeMarkerTest.class.getClassLoader().getResource(
"test/freemarker/ftl").getFile()));


// 获得模板模板代表了freemarker.template.Template的实例。典型的做法是从Configuration实例中获取一个Template实例。注意是获取config加载目录下的文件,不然文件目录找不到。
Template template = configuration.getTemplate("solr.ftl");


// 这里的时候 已经有数据模型和 flt模版,数据+模版=输出
StringWriter write = new StringWriter();
template.process(model, write);
            FileUtils.writeStringToFile(new File("solr.xml"), write.toString(), "utf-8");
            
// 如果测试用,来显示生成的数据,这里打印在控制台
//Writer write = new OutputStreamWriter(System.out);
//template.process(model, write);


write.flush();
write.close();


} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

}
   这样 对应的solr.xml文件 就生成了。

三:FreeMarker模版语法

      freemarker用于定义接收数据模型的语法,类似与jsp中标签,大同小异。
if指令
root.put("random", new Random().nextInt(100));
------------------------------------------------
if语句测试:
${user}是<#if user=="老高">我们的老师</#if>
------------------------------------------------
if else 语句测试:
<#if num0 gt 18>  <#--不是使用>,大部分时候,freemarker会把>解释成标签结束! -->
及格!
<#else>
不及格!
</#if>
---------------------------------------------------
if else if else语句测试:
<#if random gte 90>
优秀!
<#elseif random gte 80>
良好!
<#else>
一般!
</#if>
----------------------------------------------------




list指令
List list = new ArrayList();
list.add(new Address("中国","北京"));
list.add(new Address("中国","上海"));
list.add(new Address("美国","纽约"));
root.put("lst", list);
测试list指令:
<#list lst as dizhi >
<b>${dizhi.country}</b> <br/>
</#list>


思考问题:<c:forEach> status属性。在此处如何实现?

控制台打印:
测试list语句:
<b>中国</b> <br/>
<b>中国</b> <br/>
<b>美国</b> <br/>

include指令
增加被包含文件,放于templates目录下:
 

模板文件中代码如下:
测试include指令:
<#include "included.txt" />

自定义指令(macro指令)
<#macro m1>   <#--定义指令m1 -->
<b>aaabbbccc</b>
<b>dddeeefff</b>
</#macro>
<@m1 /><@m1 />  <#--调用上面的宏指令 -->


定义带参的宏指令:
<#macro m2 a b c >
${a}--${b}--${c}
</#macro>
<@m2 a="老高" b="老张" c="老马" />


nested指令:
<#macro border> 
  <table border=4 cellspacing=0 cellpadding=4><tr><td> 
    <#nested> 
  </td></tr></table> 
</#macro>
<@border >表格中的内容!</@border>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值