[Freemarker] 在Java中简单实现对Freemarker的引用
Demo目录结构
├─src
│ ├─main
│ │ ├─java
│ │ │ └─demo
│ │ │ └─freemarker
│ │ │ ├─main
│ │ │ │ Test.java
│ │ │ │
│ │ │ ├─model
│ │ │ │ User.java
│ │ │ │
│ │ │ ├─output
│ │ │ │ 01.html
│ │ │ │
│ │ │ ├─template
│ │ │ │ 01.ftl
│ │ │ │
│ │ │ └─util
│ │ │ FreeMarkerUtil.java
1. 添加对freemarker的依赖
这里我使用的新建一个Maven Project,在pom.xml中添加dependency
<dependencies>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.23</version>
</dependency>
</dependencies>
2. 知道你喜欢看源码
3. 代码解读
FreeMarkerUtil.java
getTemplateByName(String name)
public Template getTemplateByName(String name) {
Template template = null;
try {
Configuration configuration = new Configuration(new Version("2.3.23"));
configuration.setClassForTemplateLoading(this.getClass(), "../template/");
template = configuration.getTemplate(name);
} catch (TemplateNotFoundException e) {
e.printStackTrace();
} catch (MalformedTemplateNameException e) {
e.printStackTrace();
} catch (ParseException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return template;
}
由于引入的freemarker的version是2.3.23,这个版本中废弃(Deprecated)了Configuration空的构造函数,在2.3.20这个版本中还是OK的,目前这个版本需要传入一个Version对象,configuration中需要设置template模板存放的basePackagePath,然后通过传入的name在对应的basePackagePath中查找对应的ftl文件
showTemplate(String name, Map<String, Object> map)
public void showTemplate(String name, Map<String, Object> map) {
try {
Template template = this.getTemplateByName(name);
template.process(map, new PrintWriter(System.out));
} catch (TemplateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
该方法用于在Console下打印出生成的视图,Template中有process方法是这一逻辑,也方便查看结果
createFile(String templateName, Map<String, Object> map, String fileName)
public void createFile(String templateName, Map<String, Object> map, String fileName) {
try {
FileWriter fileWriter = new FileWriter("src/main/java/demo/freemarker/output/" + fileName);
Template template = this.getTemplateByName(templateName);
template.process(map, fileWriter);
} catch (IOException e) {
e.printStackTrace();
} catch (TemplateException e) {
e.printStackTrace();
}
}
}
该方法用于生成输出文件
FTL中传入对象
首先修改ftl模板
<body>
Hello, ${userName}, welcome!!!
Users:
ID: ${user.id}
UserName: ${user.name}
Age: ${user.age}
</body>
User user = new User();
user.setId(101);
user.setName("Tom");
user.setAge(12);
map.put("user", user);
看下生成的结果
FTL中传入集合试试
再次修改ftl模板
<body>
<div>
Input string:
Hello, ${userName}, welcome!!!
</div>
<div>
Input object:
ID: ${user.id}
UserName: ${user.name}
Age: ${user.age}
</div>
<div>
Input objects:
<table border="1">
<tr>
<th>ID</th>
<th>Name</th>
<th>Age</th>
</tr>
<#list users as user>
<tr>
<td>ID: ${user.id}</td>
<td>Name: ${user.name}</td>
<td>Age: ${user.age}</td>
</tr>
</#list>
</table>
</div>
</body>
传入User对象集合
List<User> users = new ArrayList<User>();
User user1 = new User();
user1.setId(1);
user1.setName("User 1");
user1.setAge(10);
users.add(user1);
User user2 = new User();
user2.setId(2);
user2.setName("User 2");
user2.setAge(11);
users.add(user2);
User user3 = new User();
user3.setId(3);
user3.setName("User 3");
user3.setAge(3);
users.add(user3);
map.put("users", users);
看下生成效果
发挥你的想象,ftl模板是不是很有用,有了它可以少写多少代码