Java模板引擎生成代码的几种常见方式及其使用方法

 更新时间:2025年08月21日 09:46:07   作者:爱的叹息  
在Java中,有多种模板引擎可以用于代码生成,包括FreeMarker、Velocity、Thymeleaf等,下面我将详细介绍每种方式的优缺点,并提供完整的代码示例,需要的朋友可以参考下

这个问题是关于Java中使用模板引擎生成代码的方式,本文我将为您详细介绍几种常见的Java模板引擎及其使用方法。

在Java中,有多种模板引擎可以用于代码生成,包括FreeMarker、Velocity、Thymeleaf等。下面我将详细介绍每种方式的优缺点,并提供完整的代码示例

1. FreeMarker

FreeMarker是一个用Java编写的模板引擎,最初专注于使用MVC软件架构生成Web页面。但FreeMarker也可以用于非Web应用程序环境,如代码生成。

优点:

  • 模板语言功能强大,易于学习
  • 不依赖Web环境,可以独立使用
  • 性能良好
  • 模板缓存机制高效

缺点:

  • 学习曲线相较于其他模板引擎略陡峭
  • 错误提示不够友好

Maven依赖:

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

示例代码:

import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;

import java.io.*;
import java.util.HashMap;
import java.util.Map;

public class FreeMarkerCodeGenerator {
    public static void main(String[] args) throws IOException, TemplateException {
        // 创建配置实例
        Configuration cfg = new Configuration(Configuration.VERSION_2_3_32);
        
        // 设置模板文件目录
        cfg.setDirectoryForTemplateLoading(new File("src/main/resources/templates"));
        
        // 设置默认编码
        cfg.setDefaultEncoding("UTF-8");
        
        // 获取模板
        Template template = cfg.getTemplate("code-template.ftl");
        
        // 准备数据模型
        Map<String, Object> dataModel = new HashMap<>();
        dataModel.put("className", "User");
        dataModel.put("packageName", "com.example.model");
        dataModel.put("fields", new String[]{"id", "name", "email"});
        
        // 输出文件
        Writer fileWriter = new FileWriter(new File("User.java"));
        template.process(dataModel, fileWriter);
        fileWriter.close();
        
        System.out.println("代码生成完成!");
    }
}

模板文件 (src/main/resources/templates/code-template.ftl):

package ${packageName};

public class ${className} {
<#list fields as field>
    private String ${field};
</#list>

<#list fields as field>
    public String get${field?cap_first}() {
        return ${field};
    }

    public void set${field?cap_first}(String ${field}) {
        this.${field} = ${field};
    }
</#list>
}

2. Apache Velocity

Velocity是Apache软件基金会提供的一个基于Java的模板引擎,使用简单模板语言来引用由Java代码定义的对象。

优点:

  • 语法简洁
  • 与FreeMarker相比,语法更简单
  • 社区活跃,文档丰富

缺点:

  • 功能相较于FreeMarker略显简单
  • 更新频率较低

Maven依赖:

<dependency>
    <groupId>org.apache.velocity</groupId>
    <artifactId>velocity-engine-core</artifactId>
    <version>2.3</version>
</dependency>

示例代码:

import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.VelocityEngine;
import org.apache.velocity.runtime.RuntimeServices;
import org.apache.velocity.runtime.RuntimeSingleton;
import org.apache.velocity.runtime.parser.ParseException;
import org.apache.velocity.runtime.parser.node.SimpleNode;

import java.io.*;
import java.util.Properties;

public class VelocityCodeGenerator {
    public static void main(String[] args) throws IOException, ParseException {
        // 初始化Velocity引擎
        Properties props = new Properties();
        props.setProperty("resource.loader", "file");
        props.setProperty("file.resource.loader.class", 
            "org.apache.velocity.runtime.resource.loader.FileResourceLoader");
        props.setProperty("file.resource.loader.path", "src/main/resources/templates");
        
        VelocityEngine ve = new VelocityEngine(props);
        ve.init();
        
        // 获取模板
        Template template = ve.getTemplate("velocity-template.vm");
        
        // 创建上下文并添加数据
        VelocityContext context = new VelocityContext();
        context.put("className", "Product");
        context.put("packageName", "com.example.model");
        String[] fields = {"id", "name", "price"};
        context.put("fields", fields);
        
        // 输出生成的代码
        Writer writer = new FileWriter("Product.java");
        template.merge(context, writer);
        writer.close();
        
        System.out.println("Velocity代码生成完成!");
    }
}

模板文件 (src/main/resources/templates/velocity-template.vm):

package $packageName;

public class $className {
#foreach($field in $fields)
    private String $field;
#end

#foreach($field in $fields)
    public String get${field.substring(0,1).toUpperCase()}${field.substring(1)}() {
        return $field;
    }

    public void set${field.substring(0,1).toUpperCase()}${field.substring(1)}(String $field) {
        this.$field = $field;
    }
#end
}

3. Thymeleaf

Thymeleaf是一个现代化的服务器端Java模板引擎,能够处理HTML、XML、JavaScript、CSS甚至纯文本。

优点:

  • 与Spring框架集成良好
  • 支持自然模板(可以在浏览器中直接打开)
  • 功能丰富,支持表达式、条件语句、循环等

缺点:

  • 相对于其他模板引擎,较为重量级
  • 主要用于Web开发,用于代码生成略显复杂

Maven依赖:

<dependency>
    <groupId>org.thymeleaf</groupId>
    <artifactId>thymeleaf</artifactId>
    <version>3.1.2.RELEASE</version>
</dependency>

示例代码:

import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;
import org.thymeleaf.templateresolver.FileTemplateResolver;

import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

public class ThymeleafCodeGenerator {
    public static void main(String[] args) throws IOException {
        // 配置模板引擎
        TemplateEngine templateEngine = new TemplateEngine();
        FileTemplateResolver templateResolver = new FileTemplateResolver();
        templateResolver.setPrefix("src/main/resources/templates/");
        templateResolver.setSuffix(".html");
        templateResolver.setTemplateMode("TEXT");
        templateResolver.setCharacterEncoding("UTF-8");
        templateEngine.setTemplateResolver(templateResolver);
        
        // 创建上下文
        Context context = new Context();
        context.setVariable("className", "Order");
        context.setVariable("packageName", "com.example.model");
        context.setVariable("fields", Arrays.asList("id", "customerName", "totalAmount"));
        
        // 处理模板
        String result = templateEngine.process("thymeleaf-template", context);
        
        // 写入文件
        Writer writer = new FileWriter("Order.java");
        writer.write(result);
        writer.close();
        
        System.out.println("Thymeleaf代码生成完成!");
    }
}

模板文件 (src/main/resources/templates/thymeleaf-template.html):

package [( ${packageName} )];

public class [( ${className} )] {
[# th:each="field : ${fields}"]
    private String [( ${field} )];[/]

[# th:each="field : ${fields}"]
    public String get[( ${#strings.capitalize(field)} )]() {
        return [( ${field} )];
    }

    public void set[( ${#strings.capitalize(field)} )](String [( ${field} )]) {
        this.[( ${field} )] = [( ${field} )];
    }
[/]
}

总结表格

模板引擎优点缺点适用场景
FreeMarker功能强大,性能好,不依赖Web环境学习曲线较陡,错误提示不够友好通用代码生成,Web页面生成
Velocity语法简洁,易于上手功能相对简单,更新频率较低简单代码生成,配置文件生成
Thymeleaf与Spring集成好,支持自然模板较为重量级,主要用于Web开发Web应用中的代码生成,与Spring集成的项目

每种模板引擎都有其特点和适用场景,选择时应根据项目需求、团队熟悉度和具体应用场景来决定。对于一般的代码生成任务,FreeMarker和Velocity是较为常见的选择,而如果项目已经使用了Spring框架,Thymeleaf可能是一个更好的选择。

以上就是Java模板引擎生成代码的几种常见方式及其使用方法的详细内容,更多关于Java模板引擎生成代码的资料请关注脚本之家其它相关文章!

相关文章

  • java中JDeps命令使用

    java中JDeps命令使用

    jdeps是一个Java类依赖分析工具,用于分析Java应用程序的依赖情况,包括类、包、模块以及JDK内部API的使用,本文就来详细的介绍一下,感兴趣的可以了解一下
    2024-09-09
  • Java按照添加顺序的集合几种方法详解

    Java按照添加顺序的集合几种方法详解

    这篇文章主要介绍了Java按照添加顺序的集合几种方法的相关资料,文中介绍了Java中五种常用的数据结构(ArrayList、LinkedList、LinkedHashSet、LinkedHashMap、Stream)及其特点,适合不同的应用场景,需要的朋友可以参考下
    2024-12-12
  • SpringBoot启动时加载指定方法的方式小结

    SpringBoot启动时加载指定方法的方式小结

    本文主要给大家介绍了Spring Boot项目启动时加载指定方法都有哪些方式的,文中给大家介绍了五种常用的方式,有详细的代码示例,具有一定的参考价值,需要的朋友可以参考下
    2023-08-08
  • SpringBoot实现Logback输出日志到Kafka方式

    SpringBoot实现Logback输出日志到Kafka方式

    本文介绍了如何在SpringBoot应用中通过自定义Appender实现Logback输出日志到Kafka,包括配置maven依赖、Kafka工具类和logback.xml配置
    2025-02-02
  • springMVC框架下JQuery传递并解析Json数据

    springMVC框架下JQuery传递并解析Json数据

    json作为一种轻量级的数据交换格式,在前后台数据交换中占据着非常重要的地位,这篇文章主要介绍了springMVC框架下JQuery传递并解析Json数据,有兴趣的可以了解一下。
    2017-01-01
  • java 算法之归并排序详解及实现代码

    java 算法之归并排序详解及实现代码

    这篇文章主要介绍了java 算法之归并排序详解及实现代码的相关资料,需要的朋友可以参考下
    2017-03-03
  • Java Spring Boot实现简易扫码登录详解

    Java Spring Boot实现简易扫码登录详解

    这篇文章主要为大家详细介绍了java Spring Boot实现app扫码登录功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-09-09
  • Java+TestNG接口自动化入门详解

    Java+TestNG接口自动化入门详解

    本文主要介绍了Java+TestNG接口自动化入门,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • Java的特点和优点(动力节点整理)

    Java的特点和优点(动力节点整理)

    由于Java语言的设计者们十分熟悉C++语言,所以在设计时很好地借鉴了C++语言。可以说,Java语言是一种比C++语言“还面向对象”的一种编程语言,下面通过本文说下java的特点和优点
    2017-03-03
  • Java JSQLParser解析SQL的使用指南

    Java JSQLParser解析SQL的使用指南

    JSQLParser是一个Java语言的SQL语句解析工具,可以将SQL语句解析成为Java类的层次结构,还支持改写SQL,下面我们就来看看它的具体使用吧
    2025-05-05

最新评论