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模板是不是很有用,有了它可以少寫多少代碼