freemarker总结

Freemarker

1.freemarker的概述

1.1  模板引擎技术

Freemarker 是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写,具有以下特点:

1Freemarker 适合被设计用来生成HTML Web页面,特别是基于MVC模式的应用程序。

2)虽然Freemarker 具有一些编程的能力,但通常由Java程序准备要显示的数据,由Freemarker 生成页面,通过模板显示准备的数据 。

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

4Freemarker 与容器无关,因为它并不知道HTTPServlet

5Freemarker 更适合作为Model2框架(如Struts)的视图组件,你也可以在模板中使用JSP标记库。

6Freemarker 是免费的 。

数据模型+模版=输出

 freemarker总结

 

public static void main(String[] args) throws IOException, TemplateException {

//设置ftl查找目录

Configuration cfg = new Configuration();

//设置数据的抓取模式

cfg.setDirectoryForTemplateLoading(

        new File("template"));

cfg.setObjectWrapper(new DefaultObjectWrapper());  

//构建数据

Map root = new HashMap();

root.put("user", "Big Joe");

root.put("sex", "1");

String[] str=new String[]{"1","2","3","4"};

root.put("str", str);

Map latest = new HashMap();

root.put("latestProduct", latest);

latest.put("url", "products/greenmouse.html");

latest.put("name", "green mouse");

List list=new ArrayList();

User user=new User("1","zd");

User user1=new User("2","ls");

list.add(user);

list.add(user1);

root.put("userlist", list);

//实例化模板对象

Template temp = cfg.getTemplate("helloworld.ftl");

FileOutputStream fos=new FileOutputStream("C:\\html\\hello.html");

//生成html输出到目标

Writer out =new OutputStreamWriter(fos);

temp.process(root, out);

out.flush();

}

模板:

<html>

<head>

  <title>Welcome!</title>

</head>

<body>

  <h1>Welcome ${user}!</h1>

  <p>Our latest product:

  <a href="${latestProduct.url}">${latestProduct.name}</a>!

2.静态化

 freemarker总结

3.FTL标记指令

(1)if,else,ifelse

语法:<#if  条件>

....

<#elseif  条件>

...

<#else>

...

</#if>

:判断条件类型一致

 

(2)switch,case,default,break

<#switch being.size>

   <#case "small">

      This will be processed if it is small

      <#break>

   <#case "medium">

      This will be processed if it is medium  

     <#break>

   <#case "large">

      This will be processed if it is large

      <#break>

  <#default>

     This will be processed if it is neither

 </#switch>

 

(3)list,break(可以理解为for循环)

<#list  数组或集合  as  临时变量>

${临时变量}---${临时变量名_index}

</#list>

 

解释:(临时变量_index:获取当前的素引从0开始

 临时变量_has_next:判断list集合是否换有值

Break:标记用于退出标记

)

 

(4)定义变量

<#assign  =><#assign  ></#assign>

 

(5)include指令

<#include  “include.ftl”>

${age}

(6)import 指令

<#import  “include.ftl”  as 别名>

${别名.age}

 

includeimport的区别:

includeimport都是将一个页面包含另一个页面,

Include:引入两个是会覆盖

Import:引入两个是不会覆盖

(7)macro()指令

<#macro mymacro p1 p2>

${p1+p2}

</#macro>

<@mymacro p1=14 p2=45 />

4.FTL内置处理函数:

 :${str?upper_case}

html-对字符串进行HTML编码
     cap_first-使字符串第一个字母大写
     lower_case-将字符串转换成小写
     trim-去掉字符串前后的空白字符

     length –取得字符串长度

     js_string---包含的特殊字符(如回车、\”),转化成变量可以接收的值

  size-获得序列中元素的数目

  int-取得数字的整数部分

5.sequence  序列(对应java里的list、数组等非键值对的集合)hash键值对的集合

<#list myid?keys as tmp>

${tmp}

</#list>

 

<#list ['a','b'] as tmp>

${tmp}

</#list>

数据结构:

Map latest=new HashMap();

latest.put("id_1", "10");

latest.put("id_2", "12");

latest.put("id_3", "3");

Map root = new HashMap();

root.put("myid", latest);

6.特殊字符串的显示

如果包含特殊字符需要转义,如下面的例子

${"It's \"quoted\" and this is a backslash: \\"}

${'It\'s "quoted" and this is a backslash: \\'}

输出结果

It's "quoted" and this is a backslash: \

 It's "quoted" and this is a backslash: \

有一类特殊的字符串称为raw字符串,被认为是纯文本:

  ${r"${foo}"}

  ${r"C:\foo\bar"}

  ${foo}

  C:\foo\bar  

 

7.模板中的变量的使用范围及命名空间变更的使用范围:

plain(全局)变量:可以在模板的任何地方访问,包括使用include指令插入的模板,使用assign指令创建和替换

局部变量:在macro中有效,使用local指令创建和替换

循环变量:只能存在于指令的嵌套内容,由指令(list)自动创建;宏的参数是局部变量,而不是循环变量

 

局部变量隐藏(而不是覆盖)同名的plain变量;

循环变量隐藏同名的局部变量和plain变量,