自学内容网 自学内容网

Freemarker-语法笔记

如果想要运行本文示例,则先应该做好这篇文章的前提:Freemarker-本地硬编码的方式使用

首先我们定义一个类,名字叫User,这个类作为本文的前提

public class User {
    private String name;
    private int age;
    private boolean isHuman;
    // 为了排版省略get/set,但是你要注意你不能省略,或者使用lombok
}

示例1:显示单个User

JAVA文件

public static void main(String[] args) throws Exception {
        Configuration cfg = new Configuration(new Version("2.3.31"));
        String fileName = "fremk.ftl";
        String templateFilePath = System.getProperty("user.home") + File.separator + "Desktop" + File.separator + "fremk.ftl";
        cfg.setDirectoryForTemplateLoading(new File(templateFilePath).getParentFile());
        cfg.setDefaultEncoding("UTF-8");
        Template template = cfg.getTemplate(fileName);
        // ==============设置model
        User user = new User();
        user.setName("兔二抱");
        user.setAge(3);
        StringWriter out = new StringWriter();
        template.process(user, out);// 此处标准做法其实是将user放到一个map中,不过这次是代码演示
        // ==============
        System.out.println(out);// 这里会打印出“你好,我是兔二抱”
}

FTL文件

你好,我是${name},我${age}岁了

示例2:循环List<User>

JAVA文件

// ==============设置model
Map<String, Object> model = new HashMap<>();
List<User> users = new ArrayList<>();
User u1 = new User();
u1.setName("兔二抱");
u1.setAge(3);
User u2 = new User();
u2.setName("兔三抱");
u2.setAge(3);
users.add(u1);
users.add(u2);
model.put("users", users);
StringWriter out = new StringWriter();
template.process(model, out);// 此处需要将users放到一个map中,这也是标准做法
// ==============

FTL文件

<#list users as user>
    <li>${user.name}</li><#-- 注意,这里的li是html标签,不是freemarker的标签 -->
</#list>

注意:使用一个 Map 来作为根数据模型更加灵活,因为它可以同时包含多个不同类型的数据,包括列表、单个对象和其他值。也就是说template.process方法的第一个参数,强烈推荐使用Map作为参数

示例2:判断List中最后一个元素

下面的例子会打印兔二抱,兔三抱,注意"兔三抱"后面没有逗号
FTL文件如下

<#list users as user>
    ${user.name}
    <#-- has_next是freemarker的关键字,用来判断是否有下一个元素 -->
    <#if user?has_next>
    ,
    </#if>
</#list>

示例3:判断true还是false

下面的例子会打印是人类
JAVA文件

// ==============设置model
User user = new User();
user.setHuman(true);
StringWriter out = new StringWriter();
template.process(user, out);// 为了演示,直接把user扔里,所以没用map再包一层
// ==============

FTL文件如下

<#-- 注意这里不是isHuman,这与freemarker没有关系,java bean规范如下 -->
<#-- is开头的基本数据类型boolean最终去掉is -->
<#-- is开头的封装数据类型Boolean是不会去掉is的 -->
<#-- 如果java代码用map又包一层,比如map.put("aaa",user),则if里应该是aaa.human -->
<#if human>
是人类
<#else>
不是人类
</#if>

示例4:处理#或者其他关键符号开头的文本

#是freemarker的关键标识符,所以如果想在模板处理之后显示#,那就需要特殊处理,例如java代码有String name=“兔二抱”,而我也想最终在页面上显示#{兔二抱},那么#{${name}}这么写是不行的,需要如下写法才行
JAVA文件

String name = "兔二抱"; 

FTL文件

<#--写法1:在${}内部解析name并且在内部用字符串拼接"#{""}" -->
${"#{"+name+"}"} 
<#--写法2:使用Assign关键字定义一个freemarker变量来存储井号和左大括号字符串 -->
<#assign aaa="#{"/>
${aaa}name}

原文地址:https://blog.csdn.net/u011624903/article/details/145013105

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!