Spring框架 - Web框架 FreeMarker

#FreeMarker FreeMarker官网
FreeMarker是模板引擎

##问题 我们希望在html页面当中显示我们的内容,但是所要显示的内容并不是静态的,而是动态的,根据不同显示不同html页面。从程序仅仅只对内容发生变化,html、css等都没有发生变化。

输入图片说明
我们可以把这些内容以${key_name}的形式,而是动态的值,所显示的内容与传递的数据有关系。在根据数据模型填写进入html页面的对应位置中。

输入图片说明

##数据模型 模板引擎:指把模板和数据模型整合到一起。

数据模型,并非我们想象的如下内容
输入图片说明

实际是更复杂的树状结构
从如下结构我们可以得知,不光是数字,字符串类型,还有可能是对象等内容。我们把animals这样的对象称作hashes,实际上就是hash表。我们把具体的key-value,value是字符、数字等称作scalars。
这样我们可以从root按照路径的方式进行访问。

输入图片说明

##模板 浅蓝色部分的我们称作文本,文本不会发生变动,作为常量。在这里写的内容,在模板转换后,并不发生变化,直接传出。
绿色部分的称为注释,与代码中注释是一样的效果,永远不会传出。不发生任何作用,最终不会输出。
黄色内容,我们称作FTL标签:指令,如下的模板标签由两个组成了一条指令
橙色部分称作,插值:表达式。最终表达式进行计算,或者替换。

输入图片说明

所以对于模板来说最终要的有两点,指令和表达式。

##指令

  • 开始标签:<#directivename parameters>
  • 结束标签:</directivename>

常用指令if,list,include指令

###if指令 简单的if指令

<#if user == "Big Joe">
    balabala
</#if>

if-else编写

<#if xxxx>
    balabala
<#elseif xxxx>
    balabala
<#else>
    balabala
</#if>

###list指令 我们最终想要的把数据列表使用list指令进行显示

<#list aniamls as animal>
    balabala ${animal.name}:${animal.price}
</#list>

输入图片说明

###include指令 举例来说,我们页面上由多个相同部分组成,如header,sidebar,footer等。前段页面上,每个页面都是这些内容。显示内容一致。所以我们通过include,直接把模板加载到页面当中。

输入图片说明

##表达式

  • 直接指定值

    • 字符串:"Foo"或者'Foo'
    • 数字:123.56
    • 布尔值:true,false
    • 序列:["foo","bar",123.45],值域:0..9,0..<10
    • 哈希表:{"name":"green mouse","price":150}
  • 检索变量 - 检索数据模型

    • 顶层变量:user
    • 哈希表数据:user.name、user["name"]
    • 列表数据:products[5]
  • 连接操作

    • users + ["guest"]
    • passwords + {"joe":"secret42"}
    • "Hello" + user + "!"
  • 算术运算、比较运算、逻辑操作

##使用FreeMarker 在没有模板的情况下使用FreeMarker

  • 创建配置
    在Spring中的FreeMarker需要设置模板路径、模板的编码等内容。通过Configuration的类指定路径,修改编码。一般在项目启动的时候,配置示例,而不需要每次启动在执行示例。
        Configuration cfg = new Configuration(Configuration.VERSION_2_3_22);
        cfg.setDirectoryForTemplateLoading(
                new File("/Users/winpro/Documents/CourseProject/freemarker/src/main/resources"));
        cfg.setDefaultEncoding("UTF-8");
        cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
  • 定义模板
    输入图片说明

  • 数据模型
    输入图片说明

  • 定义数据模型
    以Map的形式定义数据模型
    输入图片说明
    以对象的形式定义数据模型
    输入图片说明

#代码示例

package freemarker;

import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import freemarker.template.TemplateExceptionHandler;

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

/**
 * Created by yanfa on 2016/10/29.
 */
public class HavaTestFreeMarker {

    public static void main(String [] args) throws IOException, TemplateException {
        Configuration cfg = new Configuration(Configuration.VERSION_2_3_22);
        cfg.setDirectoryForTemplateLoading(
                new File("D:\\ZhanPeng\\Workspace\\J2ee\\SpringStudy\\spring-web-view\\src\\main\\webapp\\WEB-INF\\freemarker"));
        cfg.setDefaultEncoding("UTF-8");
        cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);

        Template freeMarkerTemplate = cfg.getTemplate("login_user.ftl");

        Map<String, Object> root = new HashMap<String, Object>();
        root.put("username", "ZhanPeng");
        root.put("password", "password");

        Writer out = new OutputStreamWriter(System.out);
        freeMarkerTemplate.process(root, out);

    }
}

在Spring中例子的login_user.ftl

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>用户信息</title>
</head>
<body>
    <p>FreeMarker通过如下方式引用Model的数据</p>
    <p>Username:${username}</p>
    <p>Password:${password}</p>
</body>
</html>

输出结果

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>用户信息</title>
</head>
<body>
    <p>FreeMarker通过如下方式引用Model的数据</p>
    <p>Username:ZhanPeng</p>
    <p>Password:password</p>
</body>
</html>

转载于:https://my.oschina.net/hava/blog/777876

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值