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

原文地址:https://www.cnblogs.com/chenyongblog/p/5720830.html