欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Freemarker基础

程序员文章站 2022-07-14 10:28:44
...

FreeMarker

1.什么是FreeMarker

Freemarker 是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写,具有以下特点: (1)Freemarker
适合被设计用来生成HTML Web页面,特别是基于MVC模式的应用程序。 (2)虽然Freemarker
具有一些编程的能力,但通常由Java程序准备要显示的数据,由Freemarker 生成页面,通过模板显示准备的数据 。
(3)Freemarker 不是一个Web应用框架,而适合作为Web应用框架一个组件。 (4)Freemarker
与容器无关,因为它并不知道HTTP或Servlet。 (5)Freemarker
更适合作为Model2框架(如Struts)的视图组件,你也可以在模板中使用JSP标记库。 (6)Freemarker 是免费的。

2.FreeMarker的下载

<font color=#8470FF>Jar包:可在www.freemark.org下载,或者去maven.aliyu.com下载。</font>
插件:可在www.freemark.org下载,或者百度

3.FreeMarker的基本语法

1、FreeMarker标记 FreeMarker标记的设计非常精炼,只有三种:
1)$ : ${expression} FreeMarker会在输出时用实际值进行替代
例如:${stockNum?default(‘’)}
2) # :标准的FTL标记。大部分FreeMarker指令都以#开始,可以明显地与html标区分
<#if user = "BigJoe">our beloved leader</#if>。
同时,FTL文件的注释包含在<#–和–>(而不是<!--和-->)之间
3)@作为用户定义指令使用宏变量时,使用@替代FTL标记中的#。后面将详细介绍宏
2标准的FTL标记指令(后面的代码注释有详细介绍)
1) if, else, elseif
2) switch, case, default, break
3) list, break
4)include
5) Import
6) assign
7) macro, nested, return
4.freemarker中的函数
1. 变量?first 返回变量的第一个值。
2. 变量?last 返回变量的最后一个值。
3. 变量?reverse 将变量的现有顺序反转,即倒序排序
4. 变量?size 返回变量的大小
5. 变量?sort 将变量中的对象转化为字符串后顺序排序
6. 变量?sort_by(value) 按变量中对象的属性value进行排序

5.实例

Java代码:
package freemarker;

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;

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

public class Freemarker {
    public static void main(String[] args) throws Exception {
        //创建Configuration对象
        Configuration cfg = new Configuration();
        //寻找模板的路径
        cfg.setDirectoryForTemplateLoading(new File("template"));
        //抓取数据
        cfg.setObjectWrapper(new DefaultObjectWrapper());
        //构建数据
        Map latest = new HashMap();
        latest.put("url", "www.baidu.com");
        latest.put("urlname", "百度");

        String [] arr = {"1","2","3","4","5"};

        Map root = new HashMap();
        root.put("user", "zs");
        root.put("latest",latest);
        root.put("sex", "1");
        root.put("arr", arr);
        //实例化模板
        Template temp = cfg.getTemplate("hello.ftl");
        //输出(控制台或者文件都可以)
        FileOutputStream fos = new FileOutputStream("E:\\Mr.liao\\FREEMARKER\\hello.html");
        Writer out = new OutputStreamWriter(fos);
        //关联数据
        temp.process(root,out);
        out.flush();
    }
}
Ftl文件代码:
Hello.ftl:
    <#--
定义模板
-->
<html>
<head>
    <title>Hello World!</title>
</head> 
<body>
    <h1>欢迎您:${user}</h1><br/>
    <a href="${latest.url}">${latest.urlname}</a>
    <#--注意数据类型,类型一致才能比较-->
    性别:
    <#if sex='0'><#elseif sex='1'><#else>
        没有这个性别
    </#if>
    性别:
    <#--switch,case,default,break-->
    <#switch sex>
        <#case "0"><#break>
        <#case "1"><#break>
        <#default>
        没有这个性别
        <#break>    
    </#switch>
    <br/>
    输出结果:
    <#--list(for循环),break,数组_index(下标)-->
    <#list arr as tmp>
        <#if (tmp_index+1)%2=0>
            <font color=blue>${tmp}</font>
        <#else>
            <font color=green>${tmp}</font>
        </#if>
    </#list>
    <br/>
    <#--插入模板-->
    <#include "include.ftl">
    ${age}
    ${like}
    <br/>
    <#--import 可以给插入的模板指定别名,这样可以解决变量同名调用的问题-->
    <#import "include.ftl" as c>
    ${c.age}
    ${c.like}
    <br/>
    <#--定义宏,类似于java中的方法,jsp没有宏,可多次调用-->
    <#macro mymacro p1 p2>
        结果:${p1+p2}
    </#macro>
    <br/>
    <#--使用宏-->
    <@mymacro p1=100 p2=100 />
    <br/>
    <#--调用函数-->
    长度:${c.age?length}
</body>
</html>
Include.ftl:
<#--定义变量,如果在标签内声明值则不需要结束标签-->
<#assign age=12>
<#--定义变量,如果在标签声明值则需要结束标签-->
<#assign like>篮球</#assign>
web.xml
    <!-- freemarker配置 -->
    <servlet>
        <servlet-name>freemarker</servlet-name>
        <servlet-class>freemarker.ext.servlet.FreemarkerServlet</servlet-class>

        <!-- 模板的查找路径 从上下文根路径查找 模板 ftl -->
        <init-param>
            <param-name>TemplatePath</param-name>
            <param-value>/</param-value>
        </init-param>
        <!-- 是否不需要缓存 -->
        <init-param>
            <param-name>NoCache</param-name>
            <param-value>true</param-value>
        </init-param>
        <!-- 最终显示是html -->
        <init-param>
            <param-name>ContentType</param-name>
            <param-value>text/html;charset=UTF-8</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>freemar</servlet-name>
        <url-pattern>*.ftl</url-pattern>
    </servlet-mapping>