service.java.ftl(Service 接口模板标准规范版2)

JAVA用.ftl模板文件生成PDF(含生成代码) 场景:产品提了个需求,要求按照他给的原型格式生成一个PDF文件。 (这是产品给的原型) 解决思路:可以先写一个.ftl模板文件(其实也就是一个html页面),然后预留对应的字段放入map中进行替换(其中data11....都是要替换的) 注: Freemarker是一个模板框架,主要是为了加快染速度而产生的。它与web容器无关,只要是关于模板生成一些代码的都可以使用它完成。 比如xml,Java代码的生成等。 其他类似的模板框架还有velocity。 贴出部分map代码: Map&l 阅读详情

当然可以!以下是完全符合企业级开发规范、基于 MyBatis-Plus 最新最佳实践、并添加了详尽中文注释的 service.java.ftl 和 service-impl.java.ftl 模板文件。

这两个模板是后端服务层的核心,直接决定了业务逻辑的可读性、可维护性和扩展性。它们严格遵循:

  • 接口与实现分离(SOLID 原则)
  • MyBatis-Plus IService 标准继承
  • 方法命名规范(list, page, getById, save, updateById, removeById)
  • 事务控制(默认由 @Transactional 保证,但模板中不强制,留给开发者按需添加)
  • 异常处理(推荐在 Controller 层统一处理,Service 层抛出业务异常)
  • 注释完整(每个方法均有清晰说明,便于团队协作)

✅ 一、service.java.ftl —— Service 接口模板(标准规范版)

<#--
  =================================================================================================
  MyBatis-Plus 代码生成器 - Service 接口模板 (标准规范版)
  =================================================================================================
  作者:CodeGenWeb
  生成时间:${now?string("yyyy-MM-dd HH:mm:ss")}
  数据库表:${table.comment}(表名:${table.name})
  
  说明:
  1. 本模板定义 Service 接口,遵循 MyBatis-Plus 的 IService 标准。
  2. 所有基础 CRUD 方法(list, page, getById, save, updateById, removeById)已由 IService 提供,
     无需手动声明,开发者仅需在此接口中声明**自定义业务方法**。
  3. 所有方法均使用中文注释,明确参数、返回值、异常场景,便于前端和团队理解。
  4. 本文件为 Freemarker 模板,生成时会自动替换 ${} 中的变量。
  5. 请勿手动修改生成的文件,下次生成将覆盖!
  =================================================================================================
-->

package ${package.Service};

import com.baomidou.mybatisplus.extension.service.IService;
import ${package.Entity}.${entity};
import org.springframework.stereotype.Service;

/**
 * ${table.comment!""} 服务接口
 * 
 * <p>本接口继承 MyBatis-Plus 的 IService,自动获得以下基础方法:</p>
 * <ul>
 *   <li><code>list()</code> - 查询所有记录</li>
 *   <li><code>page(Page<T> page)</code> - 分页查询</li>
 *   <li><code>getById(id)</code> - 根据ID查询单条记录</li>
 *   <li><code>save(entity)</code> - 新增记录</li>
 *   <li><code>updateById(entity)</code> - 根据ID更新记录</li>
 *   <li><code>removeById(id)</code> - 根据ID删除记录(物理删除)</li>
 * </ul>
 * 
 * <p>开发者应在本接口中声明**自定义的业务方法**,例如:批量导入、复杂查询、状态变更等。</p>
 * 
 * <p>建议:每个业务方法都应有清晰的语义,如:activateUser, cancelOrder, batchImportUsers。</p>
 * 
 * @author ${author}
 * @date ${now?string("yyyy-MM-dd")}
 */
public interface ${service} extends IService<${entity}> {

    /**
     * 根据用户名查询用户信息
     * 
     * <p>此方法用于在登录或用户检索时,通过用户名精确查找用户记录</p>
     * 
     * @param username 用户名(非空,唯一)
     * @return 找到的 User 对象,未找到返回 null
     * @throws IllegalArgumentException 当 username 为 null 或空字符串时抛出
     */
    ${entity} getByUsername(String username);

    /**
     * 根据邮箱查询用户信息
     * 
     * <p>此方法用于用户注册时检查邮箱是否已被占用</p>
     * 
     * @param email 邮箱地址(非空,唯一)
     * @return 找到的 User 对象,未找到返回 null
     * @throws IllegalArgumentException 当 email 为 null 或空字符串时抛出
     */
    ${entity} getByEmail(String email);

    /**
     * 批量启用/禁用用户
     * 
     * <p>用于管理员批量操作用户状态,支持传入多个用户ID</p>
     * 
     * @param userIds 要操作的用户ID列表(非空)
     * @param enabled   true=启用,false=禁用
     * @return 成功操作的记录数
     * @throws IllegalArgumentException 当 userIds 为 null 或空时抛出
     */
    int batchEnableUsers(java.util.List<Long> userIds, boolean enabled);

    /**
     * 根据创建时间范围查询用户列表
     * 
     * <p>用于生成用户增长报表,支持按时间段筛选</p>
     * 
     * @param startTime 创建开始时间(包含)
     * @param endTime   创建结束时间(包含)
     * @return 满足条件的用户列表
     */
    java.util.List<${entity}> listByCreateTimeRange(java.time.LocalDateTime startTime, java.time.LocalDateTime endTime);

    /**
     * 重置用户密码(业务逻辑方法)
     * 
     * <p>此方法包含业务逻辑:校验用户是否存在、生成新密码、加密存储、发送通知等</p>
     * 
     * @param userId 用户ID
     * @return 重置是否成功
     * @throws UserNotFoundException 当用户不存在时抛出自定义异常
     */
    boolean resetPassword(Long userId);

    // ==================== 以下为预留方法示例(请根据实际业务增删) ====================
    // /**
    //  * 导出用户数据为 Excel
    //  * 
    //  * @param params 查询参数
    //  * @return Excel 文件字节数组
    //  */
    // byte[] exportUsersToExcel(UserExportParam params);

    // /**
    //  * 检查用户是否拥有某个权限
    //  * 
    //  * @param userId 用户ID
    //  * @param permission 权限标识
    //  * @return 是否拥有该权限
    //  */
    // boolean hasPermission(Long userId, String permission);
}

✅ 模板说明(关键点)

特性说明
继承 IService<${entity}>自动获得 MyBatis-Plus 提供的全部基础方法,无需重复定义。
方法命名规范使用动词+名词,如 getByUsername, batchEnableUsers,语义清晰。
参数校验注释明确说明 @param 是否允许为 null,避免调用方传参错误。
返回值说明清晰说明返回 null、List、boolean、int 的含义。
异常说明使用 @throws 注解,明确业务异常(如 UserNotFoundException)。
预留注释提供了两个常见业务场景的注释示例(导出、权限),供开发者参考。
日期类型使用 java.time.LocalDateTime,符合现代 Java 标准,避免 Date。

✅ 二、service-impl.java.ftl —— Service 实现类模板(标准规范版)

<#--
  =================================================================================================
  MyBatis-Plus 代码生成器 - Service 实现类模板 (标准规范版)
  =================================================================================================
  作者:CodeGenWeb
  生成时间:${now?string("yyyy-MM-dd HH:mm:ss")}
  数据库表:${table.comment}(表名:${table.name})
  
  说明:
  1. 本模板实现 Service 接口,继承 MyBatis-Plus 的 ServiceImpl。
  2. 所有基础 CRUD 方法已由 ServiceImpl 自动实现,无需编写。
  3. 开发者只需在此类中实现 Service 接口中定义的**自定义业务方法**。
  4. 所有方法均使用中文注释,详细说明逻辑、事务、异常处理。
  5. 使用 @Resource 注入 Mapper,符合项目规范。
  6. 本文件为 Freemarker 模板,生成时会自动替换 ${} 中的变量。
  7. 请勿手动修改生成的文件,下次生成将覆盖!
  =================================================================================================
-->

package ${package.ServiceImpl};

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import ${package.Mapper}.${mapper};
import ${package.Service}.${service};
import ${package.Entity}.${entity};
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

/**
 * ${table.comment!""} 服务实现类
 * 
 * <p>本类继承 ServiceImpl,自动注入 ${mapper},并实现 ${service} 接口中定义的自定义业务方法。</p>
 * <p>所有基础方法(如 save, updateById, getById)均由父类实现,此处无需重写。</p>
 * 
 * <p>事务管理:</p>
 * <ul>
 *   <li>默认情况下,所有方法都在 Spring 事务中执行。</li>
 *   <li>对于涉及多表操作或复杂业务逻辑的方法,应显式添加 @Transactional 注解。</li>
 * </ul>
 * 
 * @author ${author}
 * @date ${now?string("yyyy-MM-dd")}
 */
@Service
public class ${serviceImpl} extends ServiceImpl<${mapper}, ${entity}> implements ${service} {

    @Resource // ✅ 使用 @Resource 注入 Mapper,符合项目规范
    private ${mapper} ${mapperVar}; // Mapper 实例,用于自定义复杂查询

    /**
     * 根据用户名查询用户信息
     * 
     * <p>实现逻辑:使用 LambdaQueryWrapper 构建查询条件,精确匹配 username 字段</p>
     * 
     * @param username 用户名(非空)
     * @return 找到的 User 对象,未找到返回 null
     * @throws IllegalArgumentException 当 username 为 null 或空字符串时抛出
     */
    @Override
    public ${entity} getByUsername(String username) {
        // 参数校验
        if (username == null || username.trim().isEmpty()) {
            throw new IllegalArgumentException("用户名不能为空");
        }

        // 使用 LambdaQueryWrapper 构建查询条件,避免 SQL 注入
        return this.getOne(
                new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<${entity}>()
                        .eq(${entity}::getUsername, username)
        );
    }

    /**
     * 根据邮箱查询用户信息
     * 
     * <p>实现逻辑:使用 LambdaQueryWrapper 构建查询条件,精确匹配 email 字段</p>
     * 
     * @param email 邮箱地址(非空)
     * @return 找到的 User 对象,未找到返回 null
     * @throws IllegalArgumentException 当 email 为 null 或空字符串时抛出
     */
    @Override
    public ${entity} getByEmail(String email) {
        // 参数校验
        if (email == null || email.trim().isEmpty()) {
            throw new IllegalArgumentException("邮箱不能为空");
        }

        return this.getOne(
                new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<${entity}>()
                        .eq(${entity}::getEmail, email)
        );
    }

    /**
     * 批量启用/禁用用户
     * 
     * <p>实现逻辑:</p>
     * <ol>
     *   <li>校验 userIds 集合是否为空</li>
     *   <li>构建批量更新的 LambdaUpdateWrapper</li>
     *   <li>使用 update 方法执行批量更新</li>
     * </ol>
     * 
     * @param userIds 要操作的用户ID列表(非空)
     * @param enabled   true=启用,false=禁用
     * @return 成功操作的记录数
     * @throws IllegalArgumentException 当 userIds 为 null 或空时抛出
     */
    @Override
    public int batchEnableUsers(java.util.List<Long> userIds, boolean enabled) {
        // 参数校验
        if (userIds == null || userIds.isEmpty()) {
            throw new IllegalArgumentException("用户ID列表不能为空");
        }

        // 构建批量更新条件:更新 id 在 userIds 中的记录,设置 is_active 字段
        int count = this.update(
                new com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper<${entity}>()
                        .in(${entity}::getId, userIds) // in 查询
                        .set(${entity}::getIsActive, enabled) // 设置字段值
        );

        return count;
    }

    /**
     * 根据创建时间范围查询用户列表
     * 
     * <p>实现逻辑:使用 LambdaQueryWrapper 构建时间范围查询(>= startTime 且 <= endTime)</p>
     * 
     * @param startTime 创建开始时间(包含)
     * @param endTime   创建结束时间(包含)
     * @return 满足条件的用户列表
     * @throws IllegalArgumentException 当 startTime 或 endTime 为 null 时抛出
     */
    @Override
    public java.util.List<${entity}> listByCreateTimeRange(java.time.LocalDateTime startTime, java.time.LocalDateTime endTime) {
        // 参数校验
        if (startTime == null || endTime == null) {
            throw new IllegalArgumentException("时间范围参数不能为空");
        }

        // 构建时间范围查询:create_time >= startTime AND create_time <= endTime
        return this.list(
                new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<${entity}>()
                        .ge(${entity}::getCreateTime, startTime) // >=
                        .le(${entity}::getCreateTime, endTime)   // <=
                        .orderByDesc(${entity}::getCreateTime)    // 按创建时间倒序
        );
    }

    /**
     * 重置用户密码
     * 
     * <p>实现逻辑(包含业务流程):</p>
     * <ol>
     *   <li>根据 userId 查询用户是否存在</li>
     *   <li>若不存在,抛出 UserNotFoundException</li>
     *   <li>生成随机密码(建议使用 UUID 或密码生成器)</li>
     *   <li>对密码进行加密(使用 BCrypt)</li>
     *   <li>更新用户密码字段</li>
     *   <li>发送通知(如邮件、短信)—— 此处为伪代码,需集成消息服务</li>
     * </ol>
     * 
     * <p>此方法涉及数据库更新,应保证事务性,已在 Service 层默认开启事务。</p>
     * 
     * @param userId 用户ID
     * @return 重置是否成功
     * @throws UserNotFoundException 当用户不存在时抛出自定义异常
     */
    @Override
    public boolean resetPassword(Long userId) {
        // 1. 查询用户
        ${entity} user = this.getById(userId);
        if (user == null) {
            throw new UserNotFoundException("用户不存在,ID: " + userId);
        }

        // 2. 生成新密码(生产环境请使用专业密码生成器)
        String newPassword = java.util.UUID.randomUUID().toString().substring(0, 12);

        // 3. 加密密码(使用 BCrypt,需引入 Spring Security)
        // String encryptedPassword = BCrypt.hashpw(newPassword, BCrypt.gensalt());

        // 4. 更新密码(假设字段名为 password)
        user.setPassword(newPassword); // 生产环境请替换为加密后的密码
        boolean updated = this.updateById(user);

        // 5. 发送通知(伪代码)
        // emailService.sendPasswordResetEmail(user.getEmail(), newPassword);

        return updated;
    }

    // ==================== 以下为预留方法实现示例(请根据实际业务增删) ====================
    // /**
    //  * 导出用户数据为 Excel
    //  * 
    //  * @param params 查询参数
    //  * @return Excel 文件字节数组
    //  */
    // @Override
    // public byte[] exportUsersToExcel(UserExportParam params) {
    //     List<${entity}> list = this.listByCreateTimeRange(params.getStartTime(), params.getEndTime());
    //     // 使用 Apache POI 或 EasyExcel 生成 Excel
    //     return ExcelUtil.exportToBytes(list);
    // }

    // /**
    //  * 检查用户是否拥有某个权限
    //  * 
    //  * @param userId 用户ID
    //  * @param permission 权限标识
    //  * @return 是否拥有该权限
    //  */
    // @Override
    // public boolean hasPermission(Long userId, String permission) {
    //     // 查询用户-权限关联表
    //     return ${mapperVar}.hasPermission(userId, permission);
    // }
}

✅ 模板说明(关键点)

特性说明
继承 ServiceImpl<${mapper}, ${entity}>自动注入 Mapper,无需手动 @Autowired。
使用 @Resource 注入 Mapper明确使用 @Resource,符合您项目规范。
LambdaQueryWrapper / LambdaUpdateWrapper使用方法引用(${entity}::getField),类型安全、编译期检查,避免字符串拼接错误。
参数校验所有方法入口都进行 null 或 empty 校验,防止空指针。
异常抛出使用自定义业务异常(如 UserNotFoundException),便于 Controller 层统一处理。
事务管理注释说明默认事务,明确何时需加 @Transactional。
注释结构每个方法都包含:目的、逻辑步骤、输入输出、注意事项。
预留注释提供了两个复杂业务的实现骨架,降低开发成本。

✅ 最终效果与最佳实践

维度说明
可读性方法命名清晰,注释详尽,新人 10 分钟上手。
可维护性业务逻辑与数据访问分离,易于单元测试。
健壮性参数校验 + 异常抛出,避免隐性错误。
扩展性通过接口定义,可轻松替换实现类(如 Mock、Mockito)。
规范性完全符合 MyBatis-Plus 官方推荐、Spring Boot 企业规范。

✅ 企业级建议:

  1. 为每个 Service 方法编写单元测试(使用 @DataJpaTest 或 @SpringBootTest)。
  2. 为自定义异常(如 UserNotFoundException)创建独立异常类。
  3. 将 resetPassword 中的密码生成和加密逻辑抽取为 PasswordService,实现单一职责。
  4. 对 batchEnableUsers 这类批量操作,考虑使用 MyBatis-Plus 的 batchInsert / batchUpdate 提升性能。

✅ 总结

一个优秀的 Service 层,不是写得越多越好,而是写得越少越准。
这两个模板,不写一行多余代码,只写业务该有的逻辑,
它们是团队协作的契约,是代码质量的基石。

✅ 复制此模板,您的项目将拥有业界标准的 Service 层实现。
✅ 从此,您的团队不再为“这个方法怎么写”而争论。


ftl模板自动生成dao、service层功能,包括实现 ftl模板自动生成dao、service层功能,包括实现... ftl模板自动生成dao、service层功能,包括实现... ftl模板自动生成dao、service层功能,包括实现... ftl模板自动生成dao、service层功能,包括实现... 立即下载

相关推荐

Java根据ftl模板生成多表格复杂性word文档

Java根据ftl模板生成多表格复杂性word文档,工程可直接导入eclipse中执行的。

java使用ftl模板导出word文档

java使用ftl模板导出word文档

qq_62726444的博客 4782

NXP S32K3 Safety软件生态全解析:RTD、SPD、SAF、SCST到底怎么选?

本文深入解析NXP S32K3系列MCU的安全软件生态,详细对比RTD、SPD、SAF和SCST四大组件的功能定位与选型策略。针对不同ASIL等级需求,提供从架构设计到工程实践的完整解决方案,帮助开发者高效实现功能安全认证,优化汽车电子系统的安全性与可靠性。

weixin_42524226的博客 323

Java使用ftl模板文件生成Word,以及Word转换图片或Pdf工具类

最近在项目中使用打印功能,发现这个功能我已经写过多次了,下面这个文章的发步日期在2020年,不得不感慨时间之快啊。下面介绍一下应用场景:这次项目依旧是springboot项目,使用ftl模版生成的word文件。比上一版相比更加灵活而且实用性更高,还可插入base64图片进行展示关于ftl模板我会简单介绍一下使用的心得,其实也是一些标签而已,熟悉以后操作起来也比较快下载。

焦糖橙子 8799

使用同一个时钟源clki,做两个二分频时钟,得到div2_clk1和div2_clk2,这两个时钟都能跟源时钟clki同步,但是div2_clk1和div2_clk2的相位可能是相同的,也可能是反相

比如,触发器1的初始Q为0,而触发器2的初始Q为1(这可能由于芯片制造工艺的微小差异、上电过程的随机性、或没有全局复位信号导致)。这句话的意思是:虽然div2_clk1和div2_clk2都是由同一个妈妈(clki)生出来的,频率也都是妈妈的一半,但它们“起步”的时刻可能不同。所以,上面那段话是在提醒你注意这种潜在的、由分频产生的时钟相位关系的不确定性,这在异步电路设计或时钟管理中是必须考虑的关键因素。结果:div2_clk1和div2_clk2的波形完全重合,它们的上升沿和下降沿都发生在同一时刻。

m0_49540263的博客 591

如何利用VS2017创建一个简单的窗口

#如何利用VS2017创建一个简单的窗口 1、新建->Windows桌面向导 2、应用程序类型->桌面应用程序,点击确定 3、点击调试->开始调试 可建立如下图的窗口 4、可以在生成的项目文件的中找到windows17_2的应用程序,打开界面如下: 注:新建空白项目也可以,注意在解决方案资源器中添加.cpp文件,如源.cpp文件,下载代码见博文 ...

weixin_46894139的博客 2914

java 按模版生成word,docx格式、ftl,并以zip格式下载

java 按模版生成word,docx格式、ftl,并以zip格式下载

清叶 的专栏 1404

cadence中利用sva进行FPV实战(可直接使用)

在cadence中使用fpv进行formal验证

youzjuer的博客 749

Java通过Ftl模版创建doc文件

Java通过Ftl模版创建doc文件。

qq_15596257的博客 941

华为OD机试真题 新系统 - 勇攀数字高峰 (Java/Py/C/C++/Js/Go)

本文整理华为 OD 机试新系统机考真题库,涵盖高频考点精析与完整题目内容,提供 C 语言、Java、C++、Python、Go、JavaScript 多语言源码实现,搭配详细解题思路讲解,并支持在线 OJ 刷题练习,助力高效备考华为 OD 机试新系统。

算法大师! 2088

【通信原理】基于【MATLAB】的通信OFDM系统仿真

主要进行OFDM系统的仿真,使用MATLAB软件对OFDM系统的接收端和发射端分别进行模拟仿真。

ALi.S的博客 5791

java中freemarker使用ftl模版生成PDF文件

从jar中读取字体和ftl模版,如果你不想从jar中读取,可以自己改造一下,就是不管你是从其他地方读文件或者从数据库中字符串,总之你要把他转换成字符串

u010696176的博客 1万+

SAP采购申请审批策略配置简介

SAP采购申请审批策略配置简介 1、CT04创建特征

我小时候很黑的博客 8159

ftl模板之code-generator

二、创建ftl模板 三、Java实体类生成案例 四、效果如下 ftl模板,可以高度自定义生成代码…。如html、vue、Java等。{看一下ftl语法即可}

weixin_52236586的博客 583

从 Material Requirements Planning 看 SAP 物料计划的底层控制逻辑

文章摘要:SAP中的MRP(物料需求计划)不仅仅是运行一个程序(如MD01N),其关键在于主数据和组织层级的正确配置。MRP的核心是解决"何时需要多少物料"的问题,涉及采购、生产、库存等多种供应来源。物料主数据的MRP视图必须在组织层级(如工厂、存储位置)下维护,不同层级的计划逻辑可能完全不同。S/4HANA更强调MRP Area作为细分计划单位,取代传统存储位置MRP。实施时需注意MRP Profile的合理使用,避免批量错误,并特别关注物料生命周期管理(如停用物料和替代件),这些因素共同决定了MRP能否

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1410

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

【FTL】 java模板引擎

4:通过json参数来调用特定的接口,拿到接口返回的URL。这里实际会年变为一个PDF文件。2:前端开发完之后,为一个HTML文件。基于FTL语法,改造HTML文件为FTL文件。1:简单:由后端开发模板 复杂:由前端开发模板(本次业务由前端开发模板)(开发阶段的操作方法,生产完整流程不知道)3:上传并配置到后台管理系统模板管理页面。.ftl为后缀的就是FTL文件。

weixin_50914566的博客 347

IMSL CNL 7.0.0 (x86-64)Crack

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

Java通过ftl模板导出word最详细教程

首先用office建一个word文档 参数写自己查询出来的字段,我在这里房里图片是方便找到位置替换为64位编码 模板创建好之后,另存为Word 2003 XML文档(*.xml) 存储为别的可能会报错,我只用这一种 存储为xml之后千万不要用word打开,最好用notpad++打开,复制里面的数据到格式化xml工具在线格式化工具格式化一下(注:该工具有弊端,会把定义的参数打散,需要自己手动修改一下) 比如这里我定义的是${about},他给分开,只需要删除多余的<w:r>标签即可 修改后

qq_43842093的博客 5808

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

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

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

JavaEE进阶——FreeMarker模板引擎

I. 简介 FreeMarker 是一款 模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。 模板编写为FreeMarker Template Language (FTL)。 在模板中,你可以专注于如何展现数据, 而在模板之外可以专注于...

等一杯咖啡的博客 2万+

Java根据模版导出(ftl方式)

实际项目中经常遇到需要根据模版导出数据,普通一点的导出模版都挺好实现的,如果涉及到勾选框、表格循环的方式就比较麻烦一点,这篇文章主要记录一下我在项目中是如何导出word(其中包括根据值勾选、表格循环、图片)

黄先森的博客 2292

java ftl 模板_Java模板引擎 - FreeMarker

http://freemarker.foofun.cn/https://freemarker.apache.org/https://mvnrepository.com/artifact/org.freemarker/freemarker常用代码@Testpublic void deptemp() throws TemplateNotFoundException, MalformedTemplate...

weixin_42302384的博客 1487

java中freemarker使用FTL模版导出word文档

java中freemarker使用FTL模版导出word文档

Temp_1998_H的博客 2430

记录 java 发送邮箱 读取 ftl 模板

java 发送邮箱 读取 ftl 模板

tian__c的博客 444

模板引擎Freemarker使用教程

FreeMarker 是一款 模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。

2402_84949062的博客 5031

【java导出Word模板(FTL文件,含单元格合并)】

1.4IDEA中开始敲代码(条件姓名相同则合并单元格,依次推,多种情况合并也可使用)1.3查看ftl文件中的列名,${}是否都在中,如果标签内有其他内容删除即可。1.1新建Word模板,选择好需要的字体大小,居中样式等(下图是遍历数据,采用${}占位)1.8加载FTL文件输出文件流,返回给前端,ftl文件位于当前模块的Resource下。1.5FTL文件中遍历标签,结尾处结束,A相当于一个Student对象。1.6FTL文件合并。...

weixin_59831515的博客 5201

java关于ftl模板生成html以及word(实现在线预览、编辑功能)

问题描述: 最早试过了xml模板生成word,虽然文件格式保留的多,但是这种模板生成的word转html,用单纯的poi中的XWPFDocument、HWPFDocument是有问题的,因为word本质上还是xml,xml转html,poi是暂时不支持的,而且,除了上述的问题外,xml模板的语言很少有java去学习,一旦涉及到模板的调整,一般都是花费很大力气都很难改成功的,基于上述的情况,我并没...

qq_16207635的博客 1万+

FreeMarker模板使用方法讲解

 FreeMarker简介FreeMarker模板文件主要由如下4个部分组成:1,文本:直接输出的部分2,注释:格式部分,不会输出3,插值:即${...}或#{...}格式的部分,将使用数据模型中的部分替代输出4,FTL指令:FreeMarker指定,和HTML标记类似,名字前加#予以区分,不会输出 下面是一个FreeMarker模板的例子,包含了以上所说的4个部分

489
上一篇: service.java.ftl(Service 接口模板参考示例1)
下一篇: api.ts.ftl 和 types.ts.ftl(TypeScript 模板参考示例1)
龙茶清欢
博客等级 码龄7年 3720粉丝 375原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙茶清欢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值