使用freemarker实现代码生成的小项目|后端代码生成篇

SpringBoot系列:Spring Boot使用模板引擎FreeMarker 可能有人会问我为什么愿意去花时间帮助大家实现求职梦想,因为我一直坚信时间是可以复制的。我牺牲了自己的大概十个小时写了这片文章,换来的是成千上万的求职者节约几天甚至几周时间浪费在无用的资源上。上面的这些(算法与数据结构)+(Java多线程学习手册)+(计算机网络顶级教程)等学习资源《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!上面的这些(算法与数据结构)+(Java多线程学习手册)+(计算机网络顶级教程)等学习资源。 阅读详情

使用freemarker实现代码生成的小项目|后端代码生成篇

前言

使用freemarker来生成代码,先定义代码的模板,使用定义的模板和传入的模型变量来生成相应的代码。

源码地址:https://github.com/lizhongxiang12138/code-main.git

下一篇是 使用freemarker实现代码生成的小项目|前端代码篇

先看效果

效果

项目结构

├─.idea
│  └─libraries
├─.mvn
│  └─wrapper
├─code-generation   代码生成业务模块
├─code-generation-template  代码模板模块
├─code-generation-ui  代码生成UI模块
└─common

代码模板模块(code-generation-template)

代码模板模块用来定义代码的模板

模块结构

├─src
│  ├─main
│  │  ├─java
│  │  │  └─com
│  │  │      └─lzx
│  │  │          └─code
│  │  │              └─codegenerationtemplate
│  │  │                  │  CodeGenerationTemplateApplication.java
│  │  │                  │
│  │  │                  └─template
│  │  │                          Controller.ftl				api接口类模板
│  │  │                          Dao.ftl							DAO模板
│  │  │                          EntityTemple.ftl			实体类模板
│  │  │                          Service.ftl           		业务接口类模板
│  │  │                          ServiceImpl.ftl     		业务实现类模板
│  │  │                          TemplateUtils.java    	模板工具类
│  │  │
│  │  └─resources
│  │          application.yml
│  │
│  └─test
│      └─java
│          └─com
│              └─lzx
│                  └─code
│                      └─codegenerationtemplate
│                          │  CodeGenerationTemplateApplicationTests.java
│                          │
│                          └─template
│                                  TemplateUtilsTest.java

代码生成业务模块(code-generation)

代码生成业务模块提供生成代码的功能

模块结构

│  .gitignore
│  code-generation.iml
│  HELP.md
│  mvnw
│  mvnw.cmd
│  pom.xml
│
├─.mvn
├─src
│  ├─main
│  │  ├─java
│  │  │  └─com
│  │  │      └─lzx
│  │  │          └─code
│  │  │              └─codegeneration
│  │  │                  │  CodeGenerationApplication.java
│  │  │                  │
│  │  │                  ├─config
│  │  │                  │      CorsFilter.java  									过滤器,对跨域的支持
│  │  │                  │
│  │  │                  ├─controller
│  │  │                  │      CodeGenerationController.java			代码生成的api接口
│  │  │                  │
│  │  │                  ├─entity
│  │  │                  │      ClassBean.java									代码生成的模型定义1
│  │  │                  │      ClassBeanField.java							代码生成的模型定义2
│  │  │                  │
│  │  │                  ├─service
│  │  │                  │  │  CodeGenerationService.java				代码生成功能业务接口
│  │  │                  │  │
│  │  │                  │  └─impl
│  │  │                  │          CodeGenerationServiceImpl.java	代码生成功能业务实现
│  │  │                  │
│  │  │                  └─vo
│  │  │                          DataTypeVO.java
│  │  │
│  │  └─resources
│  │          application.yml

主要业务代码

package com.lzx.code.codegeneration.service.impl;

import com.lzx.code.codegeneration.entity.ClassBean;
import com.lzx.code.codegeneration.service.CodeGenerationService;
import com.lzx.code.codegenerationtemplate.template.TemplateUtils;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.io.IOException;
import java.io.StringWriter;

/**
 * 描述: 代码服务生成业务实现
 *
 * @Auther: lzx
 * @Date: 2019/7/18 13:10
 */
@Service
@Slf4j
public class CodeGenerationServiceImpl implements CodeGenerationService {

    private Configuration cfg;

    public CodeGenerationServiceImpl() throws IOException {
        cfg = TemplateUtils.getConfiguration();
    }

    /**
     * 生成实体类
     * @param classBean
     * @return
     */
    @Override
    public String generationEntiry(ClassBean classBean) throws IOException, TemplateException {
        Template template = cfg.getTemplate("EntityTemple.ftl", "UTF-8");

        //输出
        StringWriter out = new StringWriter();
        template.process(classBean,out);
        return out.toString();
    }

    @Override
    public String generationDao(ClassBean classBean) throws IOException, TemplateException {
        Template template = cfg.getTemplate("Dao.ftl", "UTF-8");

        //输出
        StringWriter out = new StringWriter();
        template.process(classBean,out);
        return out.toString();
    }

    /**
     * 生成业务接口代码
     * @param classBean
     * @return
     */
    @Override
    public String generationService(ClassBean classBean) throws IOException, TemplateException {
        Template template = cfg.getTemplate("Service.ftl", "UTF-8");

        //输出
        StringWriter out = new StringWriter();
        template.process(classBean,out);
        return out.toString();
    }

    /**
     * 生成业务的实现
     * @param classBean
     * @return
     */
    @Override
    public String generationServiceImpl(ClassBean classBean) throws IOException, TemplateException {
        Template template = cfg.getTemplate("ServiceImpl.ftl", "UTF-8");

        //输出
        StringWriter out = new StringWriter();
        template.process(classBean,out);
        return out.toString();
    }

    @Override
    public String generationController(ClassBean classBean) throws IOException, TemplateException {
        Template template = cfg.getTemplate("Controller.ftl", "UTF-8");

        //输出
        StringWriter out = new StringWriter();
        template.process(classBean,out);
        return out.toString();
    }
}

UI模块(code-generation-ui)

UI模块提供代码生成功能的界面

模块结构

├─src
│  ├─main
│  │  ├─java
│  │  │  └─com
│  │  │      └─lzx
│  │  │          └─code
│  │  │              └─codegenerationui
│  │  │                      CodeGenerationUiApplication.java
│  │  │
│  │  └─resources
│  │      │  application.yml
│  │      │
│  │      ├─static
│  │      │      generaCode-ui.html			操作管理界面
│  │      │
│  │      └─templates

界面代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <!-- 引入样式 -->
    <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
    <style>

    </style>
</head>
<body>
<div id="app">
    <!-- 类基本信息 -->
    <el-form :inline="true" :model="form" class="demo-form-inline" label-width="150px">
        <el-form-item label="类描述">
            <el-input v-model="form.classDescribe" placeholder="类描述"></el-input>
        </el-form-item>
        <el-form-item label="类名">
            <el-input v-model="form.className" placeholder="类名"></el-input>
        </el-form-item>
        <el-form-item label="bean名称">
            <el-input v-model="form.springBeanName" placeholder="bean名称"></el-input>
        </el-form-item>
        <el-form-item label="表名称">
            <el-input v-model="form.tableName" placeholder="表名称"></el-input>
        </el-form-item>
        <el-form-item label="主键在表中的字段名">
            <el-input v-model="form.idColumnName" placeholder="主键在表中的字段名"></el-input>
        </el-form-item>
        <el-form-item label="主键的描述">
            <el-input v-model="form.idDescribe" placeholder="主键的描述"></el-input>
        </el-form-item>
        <el-form-item label="主键字段名">
            <el-input v-model="form.idName" placeholder="主键字段名"></el-input>
        </el-form-item>
        <el-form-item label="主键类型">
            <el-input v-model="form.idType" placeholder="主键类型"></el-input>
            <template slot-scope="{row,$index}">
                <el-select v-model="form.idType" filterable clearable placeholder="请选择">
                    <el-option
                            v-for="item in type"
                            :key="item.name"
                            :label="item.name"
                            :value="item.name">
                    </el-option>
                </el-select>
            </template>
        </el-form-item>
    </el-form>
    <!-- 类基本信息 edn -->

    <!-- 操作按钮 -->
    <el-form :inline="true" :model="form" class="demo-form-inline" label-width="0px">
        <el-form-item>
            <el-button type="primary" @click="onAdd">添加字段</el-button>
        </el-form-item>

        <el-form-item>
            <el-button type="primary" @click="getCode('ENTITY')">生成实体</el-button>
        </el-form-item>
        <el-form-item>
            <el-button type="primary" @click="getCode('DAO')">生成DAO</el-button>
        </el-form-item>
        <el-form-item>
            <el-button type="primary" @click="getCode('SERVICE')">生成Service</el-button>
        </el-form-item>
        <el-form-item>
            <el-button type="primary" @click="getCode('SERVICE_IMPL')">生成Service实现</el-button>
        </el-form-item>
        <el-form-item>
            <el-button type="primary" @click="getCode('CONTROLLER')">生成Controller</el-button>
        </el-form-item>
    </el-form>
    <!-- 操作按钮 end -->



    <!-- 类字段维护 -->
    <el-table
            :data="form.fields"
            style="width: 100%">
        <el-table-column
                prop="describe"
                label="字段描述"
                width="180">
            <template slot-scope="{row,$index}">
                <el-input v-model='row.describe'></el-input>
            </template>
        </el-table-column>
        <el-table-column
                prop="name"
                label="字段名称">
            <template slot-scope="{row,$index}">
                <el-input v-model='row.name'></el-input>
            </template>
        </el-table-column>
        <el-table-column
                prop="type"
                label="字段类型">
            <template slot-scope="{row,$index}">
                <el-select v-model="row.type" filterable clearable placeholder="请选择">
                    <el-option
                            v-for="item in type"
                            :key="item.name"
                            :label="item.name"
                            :value="item.name">
                    </el-option>
                </el-select>
            </template>
        </el-table-column>
        <el-table-column
                prop="columnName"
                label="表的字段名称"
                width="180">
            <template slot-scope="{row,$index}">
                <el-input v-model='row.columnName'></el-input>
            </template>
        </el-table-column>
        <el-table-column
                fixed="right"
                label="操作"
                width="150">
            <template slot-scope="scope">
                <el-button @click="deleteField(scope.$index)" type="danger" size="small">删除</el-button>
            </template>
        </el-table-column>
    </el-table>
    <!-- 类字段维护 end-->

    <!-- 代码生成结果 -->
    <el-dialog title="生成的代码" :visible.sync="dialogTableVisible">
        <!-- 生成的代码 -->
        <el-form ref="form" :model="form" label-width="0px">
            <el-form-item>
                <el-input type="textarea" :rows="30" v-model="returnData.data"></el-input>
            </el-form-item>
        </el-form>
    </el-dialog>
    <!-- 代码生成结果 end -->

</div>
</body>
<!-- 引入组件库 -->
<!-- import Vue before Element -->
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script src="https://unpkg.com/axios/dist/axios.min.js"></script>
<script src="https://unpkg.com/element-ui/lib/index.js"></script>
<script>
    new Vue({
        el:"#app",
        data:{
            dialogTableVisible: false,
            type:[],
            form:{
                "classDescribe": "学生表",
                "className": "Student",
                "idColumnName": "ID",
                "idDescribe": "主键",
                "idName": "id",
                "idType": "String",
                "springBeanName": "student",
                "tableName": "STUDENT",
                "fields": []
            },
            returnData:{

            }
        },
        mounted(){
            this.init();
        },
        methods:{
            /**
             * 初始化数据
             */
            init(){
                //初始化数据
                var _this = this;
                axios.get(
                    "http://localhost:30007/codeGeneration/getAllDataType"
                ).then(function(rsp){
                    debugger;
                    _this.type = rsp.data.data;
                    console.log(this.application);
                }).catch(function(error){
                    debugger;
                });
            },
            /**
             * 添加字段
             */
            onAdd(){
                //添加字段
                var _this = this;
                _this.form.fields.push({});
            },
            /**
             * 删除字段
             */
            deleteField(index){
                debugger;
                var _this = this;
                _this.form.fields.splice(index,1);
            },
            /**
             *  获取生成的代码
             * @param code 需要生成的文件代码
             */
            getCode(code) {
                var _this = this;
                axios.post(
                    "http://localhost:30007/codeGeneration/generationCode/"+code,_this.form
                ).then(function(rsp){
                    debugger;
                    if(rsp){
                        _this.returnData=rsp.data;
                        _this.dialogTableVisible = true;
                    }
                }).catch(function (error) {

                });
            }
        }
    });
</script>
</html>
shopee app算法分析第一篇 shopee app算法分析第一篇分析完整算法大概要好几篇,耐心等待下.国内只会发律师函,牛逼,一个律师套话,一个律师发函,大意了(警惕卡通律师头像),希望law可以保护好你,还是干国外好. 阅读详情

相关推荐

DeepSeek-OCR 本地部署使用教程(附完整环境配置与推理示例)

DeepSeek-OCR是由DeepSeek AI推出的开源OCR模型,支持高精度文档识别与结构化输出(如Markdown转换)。本文提供了详细的本地部署指南,包括系统要求(推荐Linux+A100 GPU)、环境配置(Python 3.12.9+PyTorch 2.6.0+CUDA 11.8)、模型下载及两种推理方式:高性能的vLLM(适合批量处理)和灵活的Transformers(适合调试)。支持多种分辨率模式和提示词模板,适用于合同识别、PDF转换等场景。常见问题包括显存优化和性能调优建议。

qq_58607032的博客 6715

FreeMarker 生成代码

freemarker代码生成 数据库代码生成 mvc三层代码生成

lanse_huanxiang的专栏 620

3D美术14——max——fbx导入max后直接生成bip人形骨骼插件

最近经常会从unity里反八FBX到max里进行2次修改。 但是非常尴尬的事情就是,就是用max做的fbx,你在反导入回来,BIP骨骼都会变成预制体。这个时候有一个方法补救。那就是在导入的时候调整一下参数。(如下图) 把这里调整成设置为骨骼。就还可以了。 但是,如果你不是用max做的FBX。呵呵,那么你一定很头大,因为完全没有用。 所以,这个时候就要上插件了。 Autofbxtobip v.1.1 这个插件适用于2015及其以上版本。 在这之前我还用过一款叫BIPPY,但是效果相当感人,照着这个图片调整

qq_37576129的博客 1万+

使用FreeMarker生成代码

pom.xml // 引入FreeMarker包。Test.ftl // 指定的模板引擎。Main.java // 生成代码封装。

focus-unchanged-thing 1622

UPF2.1进阶指南:如何优雅地处理Hard Macro与Top-Level Port的电源意图

本文深入解析UPF2.1在复杂SoC设计中的高级电源意图建模,重点探讨Hard Macro与顶层端口的电源管理实战技巧。通过`power_model`和`set_port_attribute`的高级应用,解决第三方硬核IP电源建模不透明、顶层端口电源属性定义不当等工程难题,提供可靠的电源管理方案,确保芯片设计性能与功耗的精确控制。

weixin_30443747的博客 168

病理图像处理个人手札(三)WSI & MIL

1.什么是WSI? WSI全称是Whole Slide Image,也就是全视野数字切片,主要应用在病理学细胞图像领域。WSI 是利用数字扫描仪对传统的病理切片进行扫描,采集具有高分辨率的数字图像,再通过计算机将得到的碎片化图像进行无缝拼接整合,制作可视化数字图像的一项技术。与传统载玻片相比,很好地解决了传统的玻璃切片易损坏、易褪色、易丢片、检索困难的问题。 一言以蔽之,WSI是对传统载玻片进行数字化。 由于是全视野,因此它将包含多尺度的切片在一个文件上面。因此WSI将使用到金字塔模型满足其支持不同分辨率的

baiweizeng的博客 1万+

使用freemarker模版引擎生成代码

使用freemarker模版引擎生成代码

zwl2220943286的博客 551

EduCoder 计算机网络实验 IP协议分析

第1关:跟踪抓包 任务描述 相关知识 IPV4数据包 截获数据报 分析截获结果 使用git将本地文件推送到远程仓库永久保存 操作要求 任务描述 本关任务:使用 Ping 命令发送数据报,用 Wireshark 截获数据报,分析 IP 数据报的格式,理解 IPV4 地址的编址方法,加深对 IP 协议的理解。 相关知识 为了完成本关任务,你需要掌握: 截获数据报; 简单分析数据包格式。 IPV4数据包 网际协议第 4 版(Internet Protocol version 4

qq_41975868的博客 1万+

Freemarker自定义代码生成器

Freemarker自定义代码生成器:帕斯卡风格进行快速开发dao层

Huangjunqi23的博客 2668

R语言孟德尔随机化环境搭建:手把手教你搞定gwasvcf、gwasglue等包的安装报错(附本地安装包)

本文详细介绍了R语言中孟德尔随机化环境搭建的全流程,重点解决gwasvcf、gwasglue等包的安装报错问题。从依赖关系解析到GitHub访问配置,再到离线安装方案,手把手教你搭建完整的分析环境,特别适合生物信息学新手快速上手。

weixin_29093017的博客 215

QTI Camera Stack 中的多摄调度模型与 SyncGroup 实现机制详解

在当前高端移动影像系统中,搭载主摄、长焦、超广、ToF、IR 等多个图像模组已成标配,实现高效、低延迟、高稳定性地调度这些 Sensor 的图像能力成为 QTI Camera Stack 架构的关键组成。高通平台通过构建 Camera SyncGroup 模型与多层调度策略,在 ISP 层实现多模组图像流的绑定控制、帧级时间同步、主副摄无感切换、双路并发采集等能力。 本文基于 Snapdragon 8 Gen 系列平台的实际调测经验,系统解析 Camera Stack 中多摄调度模型的结构设计、各层模块职责

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 1055

基于freemarker构建专属代码生成器——代码生成器的底层原理

通常来讲,在Java开发中最基本的也是占用我们最大量事件的就是CRUD,也就是频繁地构造“实体类”、“dao层代码”以及相关的service层和controller层的代码。其实,这一部分工作,可以使用代码生成器来完成,这里就要用到,我们的freemarker引擎了,我们需要将刚刚的代码复制到Hello.ftl文件中,然后将World和world提出按成变量(注意这里区分大小写)当然,我们可以使用循环,判断等逻辑表达生成更加复杂,通用性更好的模板。经过这样的三步走,最终就是我们的想要生成的目标代码。

m0_47532096的博客 1250

深度解析:LPDDR5 采样 Mask 背后的秘密 —— 从 Jitter 到 BER 全面剖析

在 LPDDR5 中,CK/DQS 信号相当于“指挥棒”,而数据(DQ)要在时钟节拍里被准确采样。Crosspoint Mask 区域横轴:时间 (Time)纵轴:电压 (Vref)👉 只要采样点落在这个区域内,数据就是正确的。否则就会出错。BERPBERPMask 就像高速公路的收费站口,如果车(采样点🚗)在车道内,顺利通过;一旦跑偏,就撞护栏。LPDDR5 的速率极高,UI 非常短,Mask 区域成为核心指标各种 Jitter、Noise 会不断压缩 Mask。

weixin_43199439的博客 354

后端学习之 FreeMarker 使用教程

今天笔者带大家来使用后端比较好用的一种模板引擎 FreeMarker ,流行的前端页面大多是用 HTML 编写,但 HTML 一般情况下无法直接与后端进行交互(从各种作用域中取值),但是 FreeMarker 不仅囊括了 HTML 的语法,还能直接与后端进行交互,是不是很棒呢!接下来就交给笔者为大家进行介绍~~ FreeMarker 概念 FreeMarker 是一款模板引擎: 即一种基于模板和要改变的数据,并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。 是一个Java类

人在江湖飘,哪能不挨刀 2万+

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Java模版引擎之Freemarker篇

一.初识Freemarker1.1什么是Freemarker Freemarker是一款模版引擎 Freemarker不是web框架 Freemarker官网http://http://freemarker.org 1.2 数据模型+模板输出=html(输出)1.3前端设计师和程序员的侧重点 MVC设计(Model,View,Controller) 前端设计师侧重于View(模版设计) 后端设计师全

泡泡菜叶的博客 1万+

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

前端笔记-freemarker模板获取后端数据及提交数据

目录 基本概念 代码与实例 基本概念 这里有如下页面: 这里面表单的数据都是从后端获取的,点获取数据,会调用getRecord方法从数据库获取数据。 点击提交备注,是备注可以让用户填写。 提交后,更新数据库中的数据。 在freemarker中使用${xxxx},这种方式获取单条的数据。 代码与实例 前端代码如下: <!DOCTYPE htm...

IT1995的博客 1万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Spring Boot集成OpenPDF和Freemarker实现PDF导出功能并附水印

在我们日常开发中,生成 文件是一项常见的需求。无论是生成单据、报表、发票还是其他文档, 格式因其便捷的打印和跨平台支持而被广泛使用。本文将介绍如何在 项目中使用 和 来实现 HTML 模板到 PDF 的导出功能输出的单据效果: 后端编码形式输出的单据效果:Flying Saucere介绍

Micro麦可乐的博客 1万+

springboot+freemarker实现一个后端页面

以上就是基与springboot2.7.14+freemarker案例。我在做项目的时候强行将springboot3.0.2降至2.7.14,否则jdk1.8上运行会报错。springboot3.0.2对应jdk版本是17,而springboot2.7.14对应jdk版本只要1.8。

m0_66701499的博客 1017

以freemarker和vue为例深入理解后端渲染、前端渲染

目录 一、springboot集成freemaker demo 二、echarts图表,echarts已由百度迁入apache,官网。 三、vue.js 后端使用----非node环境vue-cli构建的vue使用方式 官网 四、freemarker后端渲染,vue前端渲染 五、案例:html转pdf的几个方案 一、springboot集成freemaker demo pom.xml <?xml version="1.0" encoding="UTF-8"?> <..

MJ的博客 5763

代码生成!FreeMarker模板引擎入门教程

代码生成器最经典的方法就是:提前编写 模板文件,并将用户输入的 参数 替换到模板文件中,从而生成完整代码。

努力做最接地气的编程干货分享,感谢关注 3542

spring boot 配置freemarker及使用freemarker渲染页面

1.springboot 中自带的页面渲染工具为thymeleaf 还有freemarker 这两种模板引擎 简单比较下两者不同, 1.1freemaker 优点 freemarker 不足:thymeleaf由于使用了标签属性做为语法,模版页面直接用浏览器渲染,使得前端和后端可以并行开发。freemarket使用这样的语法,就无法直接使浏览器渲染出原本页面的样子。

寂夜了无痕的博客 8万+

java使用freemarker生成word

java使用freemarker生成word

qq_42851623的博客 4903

页面静态化(FreeMarker)在SpringMVC中的使用

为什么需要页面静态化 页面静态化,其核心思想是将原本由服务器动态生成内容的JSP页面转化为静态的HTML页面,供用户直接访问,这一转换具有以下几点主要优点: 访问效率提升:转化后的静态HTML页面在用户访问时,浏览器可以直接加载并渲染,无需再次访问数据库或缓存获取数据,因此,大幅度提升了页面的访问速度。 搜索引擎优化:从网站优化的角度来看,搜索引擎对静态网页更为青睐,因其内容清晰明了且易...

年轻就是资本的专栏 1047

Java使用Freemarker页面静态化生成实现

2、创建模板文件 模板文件中有四种元素:在D盘创建ftl目录,在ftl目录中创建名称为test.ftl的模板文件,内容如下: 创建模板文件示例使用步骤:第一步:创建一个 Configuration 对象,直接 new 一个对象。构造方法的参数就是 freemarker的版本号。第二步:设置模板文件所在的路径。第三步:设置模板文件使用的字符集。一般就是 utf-8。第四步:加载一个模板,创建一个模板对象。第五步:创建一个模板使用的数据集,可以是 pojo 也可以是 map。一般是 Map。第六步:创建一个 W

我要记录学习博客 1993

【然然管理系统】基于 SpringBoot+MyBatisPlus+Freemarker 实现代码生成功能(上)

针对后台开发中CRUD代码重复编写问题,然然管理系统基于SpringBoot+MyBatisPlus+Freemarker技术栈,实现了数据库表到Java代码的一键生成功能。系统通过查询information_schema获取表结构信息,自动完成Entity/Mapper/Service/Controller代码生成。核心模块包括:1)数据层查询表字段信息;2)服务层处理字段类型映射;3)工具类实现表名转换;4)控制层提供表查询和代码生成接口。该功能显著提升了开发效率

奔跑吧,兄弟 718

七 Freemarker(项目实现)

七 Freemarker(项目实现思路) 初始用 背景:目前的文章详情页是一 个普通html, 详情数据是需要经过请求发送到后端才能获得数据,静态化就是每个文章的页面都是独立的一个htm页面,不需要经过后端请求就能直接独立打开供用户浏览。而媒体类网站、或者电商商品页通常会进行页面静态化。 页面静态化的优点: ●更容易做SEO (被百度和某些其他搜索引擎收录) ●加速用户访问,先展示主体部分,也就是文章的详情,然后其他数据异步加载 ●不经过url请求的同时也降低请求数据库的压力 常见的模板引擎: JSP, F

Devil_B的博客 419
上一篇: Spring Cloud 生态使用
下一篇: recyclerview的简单使用(小白笔记版)
1024程序猿~嗷~
博客等级 码龄10年 26粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值