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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM