freemarker自定义模板

news2024/12/24 3:14:56

模板编程器指南

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

freemarker官网参考:
https://freemarker.apache.org/docs/pgui_quickstart_all.html

模板由freemarker.template.template实例表示。通常,您可以使用其从Configuration实例中获取Template实例。getTemplate方法。如果您将示例模板存储在前面集合目录的test.ftlh文件中,则可以执行以下操作:

Template temp=cfg.getTemplate(“test.ftlh”);

这为您提供了一个Template实例,该实例是通过读取/where/you/store/templates/test.ftlh并对其进行解析而创建的。Template实例以解析后的形式存储模板,而不是以文本形式存储。如果模板丢失或语法不正确,getTemplate将引发异常。
配置缓存模板实例,因此当您下次调用cfg.getTemplate(“test.ftlh”)时,它可能不会再次读取和解析模板文件,只是返回与第一次相同的模板实例。

data-model + template = output

它将数据模型和一个Writer作为参数。它将生成的输出写入Writer

一旦获得了Template实例,就可以无限次地将其与不同的数据模型合并(Template实例是无状态的)。此外,test.ftlh文件仅在创建Template实例时访问,而不是在调用process方法时访问。


@Service
public class TemplateServiceImpl implements TemplateService {
    // 本地模板文件:resources/freemarker/test.ftlh
    @Override
    public String getTemplateContentFromFile(){

        Configuration cfg = new Configuration(Configuration.VERSION_2_3_31);
        cfg.setDefaultEncoding("UTF-8");
        try {
            ClassPathResource freemarker = new ClassPathResource("freemarker");
            File file = freemarker.getFile();
            cfg.setDirectoryForTemplateLoading(file);
        } catch (IOException e) {
            e.printStackTrace();
        }
        cfg.setSQLDateAndTimeTimeZone(TimeZone.getDefault());
        StringWriter writer = null;
        try {
            Template template = cfg.getTemplate("test.ftlh");
            Product product = new Product();
            product.setName("zjy");
            product.setUrl("www.baidu.com");
            HashMap<String, Object> map = new HashMap<>();
            map.put("user", "wwowowow");
            map.put("latestProduct", product);

            writer = new StringWriter();
            template.process(map, writer);
        } catch (IOException | TemplateException e) {
            e.printStackTrace();
        } finally {
            IOUtils.closeQuietly(writer);
        }
        return writer.toString();
    }

    @Override
    public String getTemplateContentFromString(String content, Map<String, Object> dataModal) {
    	if (MapUtil.isEmpty(dataModal)) {
            return null;
        }
        String fileName = dataModal.getOrDefault("fileName", "demo.html").toString();
        
        StringReader reader = new StringReader(content);
        StringWriter writer = null;
        try {
            Template template = new Template(fileName, reader, null, "UTF-8");
            writer = new StringWriter();
            template.process(dataModal, writer);

        } catch (IOException e) {
            e.printStackTrace();
        } catch (TemplateException e) {
            e.printStackTrace();
        } finally {
            org.apache.commons.io.IOUtils.closeQuietly(writer);
        }

        return writer.toString();
    }
}

// 浏览器下载
@RequestMapping(value = "/text/upload", method = RequestMethod.GET)
@ResponseBody
public HttpServletResponse upload(HttpServletResponse response) {
    String templateContent = templateService.getTemplateContentFromFile();
    try (StringReader reader = new StringReader(templateContent);
         ServletOutputStream output = response.getOutputStream()) {

        response.reset();
        // 定义输入文件名
        String encode = URLEncoder.encode("zjy.html", "UTF-8");
        response.setHeader("Content-Disposition", "attachment;filename=" + encode);
        // 定义输出类型
//            response.setContentType("bin");
//            response.setContentType("application/x-msdownload");
        response.setContentType("application/octet-stream");
        response.setCharacterEncoding("UTF-8");
        IOUtils.copy(reader, output, Charset.forName("UTF-8"));

    } catch (IOException e) {
        e.printStackTrace();
    }
    return response;
}

// 下载到本地resources
@RequestMapping(value = "/text/local", method = RequestMethod.GET)
@ResponseBody
public void localDown() {
    try {
        String templateContent = templateService.getTemplateContentFromFile();
        ClassPathResource resource = new ClassPathResource("bak/test.html");
        File file = resource.getFile();
        FileUtil.writeUtf8String(templateContent, file);
    } catch (IOException e) {
        e.printStackTrace();
    }

}

手动维护模板并生成文件

/**
     * 编辑器保存的是字符串,
     * 使用freemarker模板引擎,
     * 将dataModal数据填充到模板中
     * 返回完成文件
     * @param data
     * @return
     */
@RequestMapping(value = "/text/save", method = RequestMethod.POST)
@ResponseBody
public String save(@Nullable @RequestBody String data) {
// 1. 创建datamodal数据
    Product product = new Product();
    product.setTemplateFileName("demo.html");
    product.setName("zjy");
    product.setUrl("www.baidu.com");
    HashMap<String, Object> map = new HashMap<>();
    map.put("user", "wwowowow");
    map.put("latestProduct", product);
    // 2. data-model + template = output
    String content = templateService.getTemplateContentFromString(data, map);
    //      字符串模板创建指定文件,如果不存在新建,存在覆盖
    FileUtil.writeUtf8String(content, "E:\\note\\flowable-project\\liteflow-demo\\liteflow-example\\src\\main\\java\\com\\yomahub\\liteflow\\example\\controller\\demo.html");
    return content;
}

在这里插入图片描述

xml

元素、文本、注释、处理指令等
The parse method removescomment and processing instruction nodes by default
解析方法 会删除 注释和 处理指令节点

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1039139.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C# OpenCvSharp Yolov8 Cls 图像分类

效果 项目 代码 using OpenCvSharp; using OpenCvSharp.Dnn; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms;namespace OpenC…

【OpenPLC学习】RK3568上运行OpenPLC

1 下载Runtime源码 git clone https://github.com/thiagoralves/OpenPLC_v3.git2 安装程序 ./install.sh linux3 在RK3568上运行Runtime sh start_openplc.sh4 在windows网页端登录 账号&#xff1a;openplc 密码&#xff1a;openplc 6 下载OpenPLC Editor https://git…

​旅行季《乡村振兴战略下传统村落文化旅游设计》许少辉八一著作想象和世界一样宽广

​旅行季《乡村振兴战略下传统村落文化旅游设计》许少辉八一著作想象和世界一样宽广

防火墙旁挂、和热备

旁挂 拓扑 防火墙配置 interface GigabitEthernet0/0/0 undo shutdown ip binding vpn-instance default ip address 172.25.254.2 255.255.255.0 alias GE0/METH service-manage http permit service-manage https permit service-manage ping permit service-manage…

由于找不到MSVCP140.dll,无法继续执行代码,重新安装程序可能会解决此问题的”修复方案

在Windows操作系统中&#xff0c;msvcp140.dll是一个非常重要的动态链接库文件&#xff0c;它是Microsoft Visual C 2015 Redistributable的一部分。这个文件主要用于支持许多应用程序的正常运行&#xff0c;例如Microsoft Office、SQL Server等。当计算机上缺少msvcp140.dll文…

网络编程-TCP协议(客户端和服务端)

需要了解UDP协议的&#xff0c;可以看往期文章 https://flypeppa.blog.csdn.net/article/details/133273416 TCP/IP参考模型 代码案例 服务端代码 package com.hidata.devops.paas.udp;import java.io.BufferedReader; import java.io.IOException; import java.io.InputStr…

tomcat在idea上的配置

tomcat在idea上的配置主要包含以下几个步骤&#xff1a; 1、创建一个maven web工程 2、配置tomcat 1、创建一个maven web工程 第一个是仓库配置文件的路径&#xff0c;第二个是你的仓库路径。 2、配置tomcat 配置tomcat有以下两种方式&#xff1a; 1、集成配置 2、插件配置…

Unity 制作登录功能01-创建登录的UI并获取输入内容

1.创建UI面板 导入插件TextMesh Pro 2.编写脚本获取用户输入 这里用的是输入框侦听函数&#xff0c;所有UI都可以使用侦听函数 &#xff0c;需要注意TMP_InputField 这个类是UI中导入的一个插件TextMesh Pro&#xff01;在代码中需要引用using TMPro; 命名空间&#xff01; …

9月25日学习记录

1. vs中Qt添加模块在这个位置&#xff1a; VS2019 Qt 怎么添加Qt模块&#xff1f;_qtvs添加第三方qt模块_令狐掌门的博客-CSDN博客 2.布局学习 (1) QVBoxLayout *layoutnew QVBoxLayout(this);QWidget *w1new QWidget;QWidget *w2new QWidget;w1->setStyleSheet("bac…

【STM32笔记】HAL库I2C通信配置、读写操作及通用函数定义

【STM32笔记】HAL库I2C通信配置、读写操作及通用函数定义 文章目录 I2C协议I2C配置I2C操作判断I2C是否响应I2C读写 附录&#xff1a;Cortex-M架构的SysTick系统定时器精准延时和MCU位带操作SysTick系统定时器精准延时延时函数阻塞延时非阻塞延时 位带操作位带代码位带宏定义总…

【广州华锐互动】VR智能内容中控平台有什么作用?

随着科技的发展&#xff0c;教育方式也在不断地进行创新。广州华锐互动开发的VR智能内容中控平台&#xff0c;为教育带来了新的可能性。它不仅可以帮助教师更好地控制和管理虚拟现实教学环境&#xff0c;还可以让学生在虚拟环境中进行互动学习&#xff0c;提高他们的学习效果。…

C#中实现定时器Timer定时判断IP是否ping通(连通)和端口号是否telnet可达(可用)

场景 Winform中使用HttpClient(设置最大超时响应时间)调用接口并做业务处理时界面卡住&#xff0c;使用async Task await异步任务编程优化&#xff1a; Winform中使用HttpClient(设置最大超时响应时间)调用接口并做业务处理时界面卡住&#xff0c;使用async Task await异步任…

做个网页火了,结果一天欠下8000元!

大家好&#xff0c;我是鱼皮。 事情是这样的&#xff0c;昨天我在 B 站某个视频的评论区下被 了&#xff1a; 我内心&#xff1a;熟悉&#xff1f;什么熟悉&#xff1f;我以为又是朋友开玩笑说哪个动物和我长得很像来着。 结果点进去一看&#xff0c;标题就直接 “震惊” 到…

【Vue】深究计算和侦听属性的原理

hello&#xff0c;我是小索奇&#xff0c;精心制作的Vue系列教程持续更新哈&#xff0c;涵盖大量的经验和示例&#xff0c;由浅入深进行讲解&#xff0c;想要学习&巩固&避坑就一起学习吧~ 计算和侦听属性 计算属性 重点概要 定义&#xff1a;要用的属性不存在&#…

3战略设计

产品代码都给你看了&#xff0c;可别再说不会DDD&#xff08;三&#xff09;&#xff1a;战略设计 # 这是一个讲解DDD落地的文章系列&#xff0c;作者是《实现领域驱动设计》的译者滕云。本文章系列以一个真实的并已成功上线的软件项目——码如云&#xff08;https://www.mryq…

产品经理认证(UCPM)备考心得

UCPM是联合国训练所CIFAL中心颁发的产品经理证书。如今&#xff0c;ESG是推动企业可持续发展的新潮流。UCPM作为一种可持续发展证书&#xff0c;为我们带来了一套先进科学、系统全面的产品管理模式&#xff0c;是产品管理领域公认的权威证书。那么&#xff0c;如何准备这张证书…

MySQL中explain各字段详解及举例

MySQL版本&#xff1a;8.0.33 建表语句&#xff1a; DROP TABLE IF EXISTS actor; CREATE TABLE actor (id int(11) NOT NULL,name varchar(45) DEFAULT NULL,update_time datetime DEFAULT NULL,PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8;INSERT INTO actor (i…

AxureRP制作静态站点发布互联网,实现公网访问【内网穿透】

AxureRP制作静态站点发布互联网&#xff0c;内网穿透实现公网访问 文章目录 AxureRP制作静态站点发布互联网&#xff0c;内网穿透实现公网访问前言1.在AxureRP中生成HTML文件2.配置IIS服务3.添加防火墙安全策略4.使用cpolar内网穿透实现公网访问4.1 登录cpolar web ui管理界面4…

力扣-290.单词规律

Idea 先建立一个hashmap&#xff0c;记录s串中的每个单词以及对应的下标再建立一个hashmap&#xff0c;记录pattern串中相同字母以及对应的下标遍历pattern串时&#xff0c;遇到不同字母存到pat表中&#xff0c;同时将下标对应的s中的单词存入到查重test集中&#xff0c;因为如…

2023年8月京东洗烘套装行业品牌销售排行榜(京东数据开放平台)

鲸参谋监测的京东平台8月份洗烘套装市场销售数据已出炉&#xff01; 根据鲸参谋平台的数据显示&#xff0c;今年8月份&#xff0c;京东平台洗烘套装的销量为1.1万&#xff0c;同比增长约218%&#xff1b;销售额约为1.2亿&#xff0c;同比增长约279%。可以看到&#xff0c;洗烘…