第三章 【若依框架:Velocity】Velocity模板引擎深度应用

目录

一、Velocity基础概念

二、Velocity快速入门

[1. 基础模板示例](#1. 基础模板示例)

[2. Java代码渲染](#2. Java代码渲染)

三、Velocity核心语法

[1. 变量定义与使用](#1. 变量定义与使用)

[2. 对象操作](#2. 对象操作)

[3. 循环控制](#3. 循环控制)

[4. 条件判断](#4. 条件判断)

四、代码生成模板实战

[1. 实体类模板改造(集成Lombok)](#1. 实体类模板改造(集成Lombok))

[2. Controller模板改造(集成Swagger)](#2. Controller模板改造(集成Swagger))


本文介绍了Java模板引擎Velocity的基础概念和核心语法。Velocity可实现界面与代码分离,常用于Web内容生成、代码生成、SQL脚本等场景。文章首先展示了基础模板示例和Java渲染代码,然后详细讲解了变量定义、对象操作、循环控制和条件判断等核心语法。最后通过实体类模板和Controller模板的实战案例,展示了如何集成Lombok和Swagger进行代码生成。全文涵盖了Velocity从基础到应用的关键知识点,为开发者提供了实用的技术参考。

一、Velocity基础概念

Velocity是基于Java的模板引擎,实现界面与代码分离,主要应用场景:

  • Web内容动态生成

  • Java源代码生成

  • SQL脚本生成

  • XML配置文件生成

  • 网页静态化

二、Velocity快速入门

1. 基础模板示例
html 复制代码
<!DOCTYPE html>
<html>
<body>
    <h3>动态内容:${message}</h3>
</body>
</html>
2. Java代码渲染
java 复制代码
public class VelocityDemo {
    public static void main(String[] args) throws Exception {
        // 初始化模板引擎
        VelocityInitializer.initVelocity();
        
        // 准备数据模型
        VelocityContext context = new VelocityContext();
        context.put("message", "动态内容示例");
        
        // 读取并渲染模板
        Template template = Velocity.getTemplate("vm/template.html.vm", "UTF-8");
        FileWriter writer = new FileWriter("output.html");
        template.merge(context, writer);
        writer.close();
    }
}

三、Velocity核心语法

1. 变量定义与使用
java 复制代码
velocity

## 定义变量
#set($name = "velocity")

## 使用变量
变量值:${name}
简写形式:$name

## 字符串拼接
#set($service = "order")
${service}Service  ## 输出:orderService
2. 对象操作
java 复制代码
velocity

## 对象属性访问
区域ID:$region.id
区域名称:${region.regionName}
3. 循环控制
java 复制代码
velocity

## 集合遍历
#set($seasons = ["春", "夏", "秋", "冬"])
#foreach($item in $seasons)
   序号[$foreach.count] $item
#end

## 对象集合遍历
#foreach($region in $regionList)
   区域ID:$region.id,名称:$region.regionName
#end
4. 条件判断
java 复制代码
velocity

## if-else判断
#set($score = 85)
#if($score >= 80)
    优秀
#elseif($score >= 60)
    及格
#else
    不及格
#end

## 对象空值判断
#if($obj)
   对象存在
#end

#if(!$obj)
   对象为空
#end

四、代码生成模板实战

1. 实体类模板改造(集成Lombok)
java 复制代码
velocity

package ${packageName}.domain;

#foreach ($import in $importList)
import ${import};
#end
import com.example.common.annotation.Excel;
import com.example.common.core.domain.BaseEntity;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * ${functionName}对象 ${tableName}
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class ${ClassName} extends BaseEntity {
    private static final long serialVersionUID = 1L;
    
    #foreach ($column in $columns)
    #if(!$table.isSuperColumn($column.javaField))
    /** $column.columnComment */
    #if($column.list)
    @Excel(name = "${column.columnComment}")
    #end
    private $column.javaType $column.javaField;
    #end
    #end
    
    #if($table.sub)
    private List<${subClassName}> ${subclassName}List;
    #end
}
2. Controller模板改造(集成Swagger)
java 复制代码
velocity

package ${packageName}.controller;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;

@Api(tags = "${functionName}Controller")
@RestController
@RequestMapping("/${moduleName}/${businessName}")
public class ${ClassName}Controller extends BaseController {
    
    @ApiOperation("查询${functionName}列表")
    @PreAuthorize("@ss.hasPermi('${permissionPrefix}:list')")
    @GetMapping("/list")
    public TableDataInfo list(${ClassName} ${className}) {
        startPage();
        List<${ClassName}> list = ${className}Service.select${ClassName}List(${className});
        return getDataTable(list);
    }
    
    @ApiOperation("获取${functionName}详细信息")
    @PreAuthorize("@ss.hasPermi('${permissionPrefix}:query')")
    @GetMapping(value = "/{${pkColumn.javaField}}")
    public AjaxResult getInfo(@PathVariable("${pkColumn.javaField}") ${pkColumn.javaType} ${pkColumn.javaField}) {
        return success(${className}Service.select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaField}));
    }
}
相关推荐
SuperEugene2 分钟前
Axios 接口请求规范实战:请求参数 / 响应处理 / 异常兜底,避坑中后台 API 调用混乱|API 与异步请求规范篇
开发语言·前端·javascript·vue.js·前端框架·axios
FreakStudio12 分钟前
0 元学嵌入式 GUI!保姆级 LVGL+MicroPython 教程开更,从理论到实战全搞定
python·单片机·嵌入式·面向对象·电子diy
abigale031 小时前
【浏览器 API / 网络请求 / 文件处理】前端文件上传全流程:从基础上传到断点续传
前端·typescript·文件上传·vue cli
Setsuna_F_Seiei1 小时前
AI 对话应用之页面滚动交互的实现
前端·javascript·ai编程
xuxie991 小时前
N11 ARM-irq
java·开发语言
cjy0001111 小时前
springboot的 nacos 配置获取不到导致启动失败及日志不输出问题
java·spring boot·后端
新缸中之脑1 小时前
追踪来自Agent的Web 流量
前端
wefly20172 小时前
从使用到原理,深度解析m3u8live.cn—— 基于 HLS.js 的 M3U8 在线播放器实现
java·开发语言·前端·javascript·ecmascript·php·m3u8
zhenxin01222 小时前
Spring Boot实现定时任务
java
小江的记录本2 小时前
【事务】Spring Framework核心——事务管理:ACID特性、隔离级别、传播行为、@Transactional底层原理、失效场景
java·数据库·分布式·后端·sql·spring·面试