zoukankan      html  css  js  c++  java
  • 实现一个代码自动生成(一):模板引擎Freemarker

    前言

    在现在的开发当中,代码生成已经是必不可少的一个功能,每个公司都会有自己的一套定制的项目骨架,而实现代码自动生成,模板引擎是必不可少的,所以在这篇博客中,将会讲解freemarker在代码生成中所扮演的角色,以及介绍如何在Java项目中使用它!

    模板引擎FreeMarker

    模板引擎是什么?

    模板引擎一般指将通用代码和业务数据分离开来的技术,该技术有多种实现,如置换型、解释型、编译型,如JSP就是其中一种应用非常广泛的模板引擎技术(其本质是一个Servlet,用来生成Html文件)

    FreeMarker是什么?

    官方文档:

    FreeMarker 是一款 模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。
    模板编写为FreeMarker Template Language (FTL)。它是简单的,专用的语言, 不是 像PHP那样成熟的编程语言。 那就意味着要准备数据在真实编程语言中来显示,比如数据库查询和业务运算, 之后模板显示已经准备好的数据。在模板中,你可以专注于如何展现数据, 而在模板之外可以专注于要展示什么数据。

    简单来讲就是FreeMarker把目标文本分解成了Model、View,然后引擎自身充当了Controller,也就是常见的MVC模式。
    FreeMarker通过预先定义好的模板文件(ftl文件),再把如Java对象中的属性进行填充,最后输出目标文件。

    FreeMarker如何使用?

    FreeMarker不像JSP,需要绑定Servlet才能使用,在Java中我们只需要导入对应的Jar包就可以使用了!接下来会介绍在Maven项目中如何使用FreeMarker。

    加入依赖

    首先我们先在pom.xml中加入FreeMarker的依赖:

    <dependency>   
        <groupId>org.freemarker</groupId>    
        <artifactId>freemarker</artifactId>    
        <version>2.3.23</version>
    </dependency>
    

    创建Configuration实例

    // step1 创建freemarker.template.Configuration配置实例
    Configuration configuration = new Configuration(Configuration.VERSION_2_3_22);
    

    创建数据模型

    我们可以使用一个String,或者以下的类型的实例充当数据模型,在这里使用了一个自定义的Bean

    使用 java.lang.String 来构建字符串。
    使用 java.lang.Number 来派生数字类型。
    使用 java.lang.Boolean 来构建布尔值。
    使用 java.util.List 或Java数组来构建序列。
    使用 java.util.Map 来构建哈希表。
    使用自定义的bean类来构建哈希表,bean中的项和bean的属性对应。比如, product 的 price 属性 (getProperty())可以通过 product.price 获取。(bean的action也可以通过这种方式拿到; 要了解更多可以参看 这里)

    //创建一个root hash对象,用来装载数据对象
    Map<String, Object> root = new HashMap<>();
    //将数据对象装载入hash中
    root.put("user", new User("Joe",17));
    

    使用到的自定义的User类

    //User
    public class User {  
        private String name;
        private int age;
        
        public String getName()
        {    
            return name;
        }
        public int getAge()
        {    
            return age;
        }
        
        User(String name, int age) {
        this.age = age;
        this.name = name;
        }
     }
    

    创建一个模板文件(.ftl文件)

    <--! demo.ftl -->
    <user>
        <name>user.name</name>
        <age>user.age</age>
    </user>
    

    获取模板

    获取之前我们创建的demo.ftl模板文件

    Template temp = cfg.getTemplate("demo.ftl");
    

    合并模板和数据

    我们在了解FreeMarker的开始就知道,数据模型+模板=目标输出,在最后,我们只需要将获取到的模板,和自定义的root hash对象进行绑定,这里会使用到Template的process()方法;

    //创建输出流,定义输出的文件
    File docFile = new File("demo.xml");
    out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(docFile)));
    //process方法将数据与模板进行绑定,输出到out输出流
    temp.process(root, out);
    

    最后我们成功地新建了demo.xml文件!

    <--! demo.ftl -->
    <user>
        <name>Joe</name>
        <age>17</age>
    </user>
    

    整合代码

    // 创建freemarker.template.Configuration配置实例
    Configuration configuration = new Configuration(Configuration.VERSION_2_3_22);
    //创建一个root hash对象,用来装载数据对象
    Map<String, Object> root = new HashMap<>();
    //将数据对象装载入hash中
    root.put("user", new User("Joe",17));
    //获取模板
    Template temp = cfg.getTemplate("demo.ftl");
    //创建输出流,定义输出的文件
    File docFile = new File("demo.xml");
    out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(docFile)));
    //process方法将数据与模板进行绑定,输出到out输出流
    temp.process(root, out);
    
  • 相关阅读:
    leetcode——33.搜索旋转排序数组
    leetcode——80.删除排序数组中的重复项2
    leetcode——26.删除排序数组中的重复项
    leetcode——18.四数之和
    leetcode——42.接雨水
    leetcode——11.盛最多水的容器
    leetcode——16.最接近的三数之和
    leetcode——15.三数之和
    leetcode——1002.查找常用字符
    004 linux学习:【第4篇】之nginx
  • 原文地址:https://www.cnblogs.com/joe2047/p/11223525.html
Copyright © 2011-2022 走看看