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

  • 相关阅读:
    JS中的事件&对象
    WSL使用小结:从ArchLinux到Manjaro
    WSL学习:安装ArchLinux和Root/Cling以及注意事项
    Qt5网络请求使用及WebRequest函数
    有道词典中的OCR功能:第三方库的变化
    C++学习(二):学会使用stringstream
    C语言集锦(三)Direct3D和GDI+的例子
    网络那些事:浏览器、网络协议以及常见软件
    C++学习(一):现代C++尝试
    PostScript学习:另一种缩写为PS的技术
  • 原文地址:https://www.cnblogs.com/chenyongblog/p/5720830.html
Copyright © 2020-2023  润新知