FreeMarker笔记 前言&第1章 入门

简介

简介

FreeMarker是一款模板引擎:一种基于模板的、用来生成输出文本(任何来自于HTML格式的文本用来自动生成源代码)的通用工具。它是为Java程序员提供的一个开发包或者说是类库。它不是面向最终用户,而是为程序员提供的可以嵌入他们开发产品的一款应用程序。

特点

功能

基础

概要、关键字

建议

前言

FreeMarker是一款模板引擎:一种基于模板的、用来生成输出文本(任何来自于HTML格式的文本用来自动生成源代码)的通用工具。它是为Java程序员提供的一个开发包或者说是类库。它不是面向最终用户,而是为程序员提供的可以嵌入他们开发产品的一款应用程序。

FreeMarker的设计实际上是被用来生成HTML网页,尤其是通过基于实现了MVC(Model View Controller,模型-视图-控制器)模式的Servlet应用程序。使用MVC模式的动态网页的构思使得你可以将前端设计者(编写HTML)从程序员中分离出来。所有人各司其职,发挥其擅长的一面。网页设计师可以改写页面的显示效果而不受程序员编译代码的影响,因为应用程序的逻辑(Java程序)和页面设计(FreeMarker模板)已经分开了。页面模板代码不会受到复杂的程序代码影响。这种分离的思想即便对一个程序员和页面设计师是同一个人的项目来说都是非常有用的,因为分离使得代码保持简洁而且便于维护。

FreeMarker不是Web应用框架。它是Web应用框架中的一个适用的组件。

第1章 入门

1.2 模板+数据模型=输出

1.3 数据模型一览

1.4 模板一览

1.4.1 简介

FTL tags标签:FreeMarker模板的语言标签。一般以符合#开头,用户自定义的FTL标签使用@代替#

Comments注释:FreeMarker的注释和HTML的注释相似,但是它用<#---->来分隔。

directives指令:就是所指的FTL标签。

1.4.2 指令示例
1.4.2.1 if指令

假设你只想向你的老板Big Joe(而不是其他人)问好,就可以这样做:

<h1>
Welcome ${user}<#if user == "Big Joe">, our beloved leader</#if>!
</h1>

使用<#else>标签:

<#if animals.python.price < animals.elephant.price>
    Pythons are cheaper than elephants today.
<#else>
    Pythons are not cheaper than elephants today.
</#if>

如果变量本身就是布尔值,可以直接作为if的条件;

<#if animals.python.protected>
    Warniing! Pythons are protected animals!
</#if>
实例

/FreeMarker-hello-web/src/main/java/org/yejq/fre/model/Animal.java


public class Animal {

    private String name;
    private double price;
    private boolean protect;

    。。。
}

/FreeMarker-hello-web/src/main/java/org/yejq/fre/service/Exercises.java


    public void testIf(Model model){
        model.addAttribute("user", "Big Joe");

        Map<String, Animal> animals = new HashMap<String, Animal>();
        animals.put("python", new Animal("python", 300, true));
        animals.put("elephant", new Animal("elephant", 400, false));
        model.addAttribute("animals", animals);
    }

/FreeMarker-hello-web/src/main/webapp/WEB-INF/ftl/2/if.ftl


<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8" />
    <title>If指令</title>
</head>
<body>
    <h1>Welcome ${user}<#if user == "Big Joe">, our beloved leader</#if></h1>
    <p>
        <#--大于号两边要加括号括起来,否则会以为是结束标签 -->
        <#if (animals.python.price > animals.elephant.price)>
            python.price > elephant.price
        <#else>
            python.price <= elephant.price
        </#if>
    </p>
    <p>
        <#if animals.python.protect>
            python.protect = true;
        </#if>
    </p>
</body>
</html>

测试: http://localhost/test/2/if/testIf

1.4.2.2 list指令

当需求遍历集合的内容时,list指令是非常好用的。

<#list animals as being>
    <tr><td>${being.name}<td>${being.price} Euros
</#list>
实例

/FreeMarker-hello-web/src/main/java/org/yejq/fre/service/Exercises.java


    public void testList(Model model){
        List<Animal> animals = new ArrayList<Animal>();
        animals.add(new Animal("python", 300, true));
        animals.add(new Animal("elephant", 400, false));
        model.addAttribute("animals", animals);
    }

/FreeMarker-hello-web/src/main/webapp/WEB-INF/ftl/2/list.ftl


    <h3>list指令</h3>
    <table border=1>
        <#list animals as animal>
            <tr>
                <#-- boolean类型要设置默认输出值,否则报错 -->
                <td>${animal.name}, ${animal.price}, ${animal.protect?c}</td>
            </tr>
        </#list>
    </table>

测试:

http://localhost/test/2/list/testList

1.4.2.3 include指令

在当前模板中插入其他文件的内容。

copyright_footer.html:


<hr>
<i>
Copyright (c) 2000<a href="http://www.xxx.com">Acmee Inc</a>,
<br>
All Rights Reserved.
</i>

当需要copyright时,引入

<#include "/copyright_footer.html">
实例

/FreeMarker-hello-web/src/main/webapp/WEB-INF/ftl/2/copyright.html


<hr>
<i>
    Copyright (c) 2000<a href="http://www.xqsoso.com">Acmee Inc</a>,
    <br>
    All Rights Reserved.中文测试
</i>

/FreeMarker-hello-web/src/main/webapp/WEB-INF/ftl/2/include.ftl


    <h3>include指令</h3>
    <#include "copyright.html">

测试:http://localhost/test/2/include/null

1.4.2.4 联合使用指令

指令可以嵌套使用;

1.4.2.5 处理不存在的变量
<h1>Welcome ${user!"Anonymous"}!</h1>

通过在变量名后边跟一个!和默认值。

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

可以使用??询问freemarker一个变量是否存在,将它和if指令合并,那么如果user变量不存在的话将会忽略整个问候代码段;

<#if user??><h1>Welcome ${user}!</h1></#if>

对于多级访问的变量,比如animals.python.price,书写代码:animals.python.price!0,仅当animals.python存在且最后一个子变量price可能不存在(这种情况下我们假设价格是0)。如果animals或者python不存在,那么模板处理过程将会以“未定义的变量”错误而停止。为了防止这种情况的发生,可以这样来书写代码(animals.python.price)!0。这种情况下当animals或python不存在时表达式的结果仍然是0。对于??也是同样用来的处理这种逻辑的,animals.python.price??对比(animals.python.price)??来看;

实例

/FreeMarker-hello-web/src/main/webapp/WEB-INF/ftl/2/null.ftl


    <h3>处理不存在的变量</h3>
    <p>welcome, ${user!"anonymous"}</p>
    <p>检测user是否存在,<#if user??>Welcome, ${user}</#if></p>
    <#--不加括号会报错: nested exception is freemarker.core.InvalidReferenceException: The following has evaluated to null or missing-->
    <p>多级访问, ${(animals.python.price)!0}</p>

测试: http://localhost/test/2/null/null

参考资料

  1. B1 :《FreeMarker中文版文档.pdf》

  2. B2 :

项目

  1. P1:F:\360\Learn\FreeMarker\workspace\FreeMarker-hello-java\https://github.com/yejq/FreeMarker-hello-java.git

  2. P2:F:\360\Learn\freemarker\workspace\FreeMarker-hello-web\https://github.com/yejq/FreeMarker-hello-web.git
时间: 2024-11-10 11:53:50

FreeMarker笔记 前言&第1章 入门的相关文章

jQuery学习笔记(一):入门

jQuery学习笔记(一):入门 一.JQuery是什么 JQuery是什么?始终是萦绕在我心中的一个问题: 借鉴网上同学们的总结,可以从以下几个方面观察. 不使用JQuery时获取DOM文本的操作如下: 1 document.getElementById('info').value = 'Hello World!'; 使用JQuery时获取DOM文本操作如下: 1 $('#info').val('Hello World!'); 嗯,可以看出,使用JQuery的优势之一是可以使代码更加简练,使开

C++ Primer快速学习 第一章 入门

很多人说C++Primer不适合于入门,本系列入门文章向大家证明了:这是一个谎言. 第一章 入门 本章介绍 C++ 的大部分基本要素:内置类型.库类型.类类型.变量.表 达式.语句和函数. 1.1. 编写简单的 C++ 程序 每个 C++ 程序都包含一个或多个 函数 ,而且必须有一个命名为 main.函数 由执行函数功能的语句序列组成.操作系统通过调用 main 函数来执行程序, main 函数则执行组成自己的语句并返回一个值给操作系统. 下面是一个简单的 main 函数,它不执行任何功能,只是

《深入Java虚拟机学习笔记》- 第4章 网络移动性

Java虚拟机学习笔记(四)网络移动性 <深入Java虚拟机学习笔记>- 第4章 网络移动性,布布扣,bubuko.com

《深入Java虚拟机学习笔记》- 第7章 类型的生命周期

一.类型生命周期的开始 如图所示 初始化时机 所有Java虚拟机实现必须在每个类或接口首次主动使用时初始化: 以下几种情形符合主动使用的要求: 当创建某个类的新实例时(或者通过在字节码中执行new指令,或者通过不明确的创建.反射.克隆和反序列化): 当调用某个类的静态方法时(即在字节码中执行invokestatic指令): 当使用某个类或接口的静态字段,或者对该字段赋值时(用final修饰的静态字段除外,它被初始化为一个编译时常量表达式): 当调用Java API中的某些反射方法: 当初始化某个

《深入Java虚拟机学习笔记》- 第13章 逻辑运算

<深入Java虚拟机学习笔记>- 第13章 浮点运算 <深入Java虚拟机学习笔记>- 第13章 逻辑运算,布布扣,bubuko.com

《深入Java虚拟机学习笔记》- 第12章 整数运算

Java虚拟机提供几种进行整数算术运算的操作码,他们执行基于int和long类型的运算.当byte.short和char类型值参与算术运算时,首先会将它们转换为int类型.这些操作码都不会抛出异常,溢出在这里通常可以被忽略. 整数加法 操作码 操作数 说明 iadd (无) 从栈中弹出两个int类型数,相加,然后将所得int类型结果压回栈 ladd (无) 从栈中弹出两个long类型数,相加,然后将所得long类型结果压回栈 将一个常量与局部变量相加 操作码 操作数 说明 iinc vindex

《深入Java虚拟机学习笔记》- 第2章 平台无关

Java虚拟机学习笔记(二)平台无关 <深入Java虚拟机学习笔记>- 第2章 平台无关,布布扣,bubuko.com

【读书笔记】计算机网络1章:课程介绍、协议、分层

这是我在Coursera上的学习笔记.课程名称为<Computer Networks>,出自University of Washington. 由于计算机网络才诞生不久,目前正在以高速在发展,所以有些旧的教材可能都已经跟不上时代了.这门课程在2013年左右录制,知识相对还是比较新的.覆盖了计算机网络中的各个协议层,从物理层到应用层都讲得非常仔细.学完这门课程之后对计算机网络会有比较深刻的了解. 本章讲述了这门课程的大致情况,讲述了协议.协议层等基本概念. 目标和动机 课程的主要目标就是介绍计算

SQL Server2012 T-SQL基础教程--读书笔记(8 - 10章)

SQL Server2012 T-SQL基础教程--读书笔记(8 - 10章) 示例数据库:点我 CHAPTER 08 数据修改 8.1 插入数据 8.1.1 INSERT VALUES 语句 8.1.2 INSERT SELECT 语句 8.1.3 INSERT EXEC 语句 8.1.4 SELECT INTO 语句 8.1.5 BULK INSERT 语句 8.1.6 标识列属性和序列对象 8.1.6.1 标识列属性 8.1.6.2 序列对象 8.2 删除数据 8.2.1 DELETE 语