Freemarker-语法笔记
如果想要运行本文示例,则先应该做好这篇文章的前提:Freemarker-本地硬编码的方式使用
首先我们定义一个类,名字叫User,这个类作为本文的前提
public class User {private String name;private int age;private boolean isHuman;// 为了排版省略get/set,但是你要注意你不能省略,或者使用lombok
}
语法糖
- 示例1:显示单个User
- 示例2:循环List\<User>
- 示例2:判断List中最后一个元素
- 示例3:判断true还是false
- 示例4:处理#或者其他关键符号开头的文本
示例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);// ==============设置modelUser 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}