Freemarker
Freemarker简介
Freemarker是一个用Java语言编写的模板引擎,用于基于模板和数据生成文本输出。它可以用于生成HTML网页、XML文档、电子邮件、配置文件等任何格式的文本。Freemarker将业务逻辑与表示逻辑分离,使得开发人员可以专注于功能实现,而设计师可以专注于页面布局。
快速入门
1. 添加依赖
如果你使用的是Maven项目,可以在pom.xml中添加如下依赖:
<dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.31</version>
</dependency>
2. 配置环境
创建一个Configuration对象,指定模板加载路径。
import freemarker.template.Configuration;
import freemarker.template.Template;Configuration cfg = new Configuration(Configuration.VERSION_2_3_31);
cfg.setDirectoryForTemplateLoading(new File("path/to/your/templates/directory"));
3. 创建模型
模型是传递给模板的数据。
Map<String, Object> model = new HashMap<>();
model.put("name", "John Doe");
model.put("age", 30);
4. 加载并合并模板
Template temp = cfg.getTemplate("templateName.ftl");
Writer out = new PrintWriter(new FileOutputStream("output.html"), true);
temp.process(model, out);
案例一
假设你有一个简单的HTML模板helloWorld.ftl:
<!DOCTYPE html>
<html>
<head><title>Hello World</title>
</head>
<body><h1>Welcome, ${name}!</h1><p>You are ${age} years old.</p>
</body>
</html>
你可以使用以下Java代码生成HTML文件:
import java.io.*;
import java.util.Map;
import java.util.HashMap;
import freemarker.template.*;public class HelloWorld {public static void main(String[] args) throws Exception {Configuration cfg = new Configuration(Configuration.VERSION_2_3_31);cfg.setDirectoryForTemplateLoading(new File("templates"));Map<String, Object> model = new HashMap<>();model.put("name", "John Doe");model.put("age", 30);Template temp = cfg.getTemplate("helloWorld.ftl");Writer out = new PrintWriter(new FileOutputStream("output.html"), true);temp.process(model, out);}
}
案例二
更复杂的案例可能涉及模板继承、列表循环、条件判断等。例如,你可能有如下的模板结构:
base.ftl: 基础模板,包含头部和尾部。index.ftl: 继承base.ftl,添加动态内容。
base.ftl
<!DOCTYPE html>
<html>
<head><title>${title}</title>
</head>
<body><header><h1>Welcome to our site</h1></header><div id="content"><#include "content.ftl"></div><footer><p>© 2024 Our Company</p></footer>
</body>
</html>
index.ftl
<@base title="Home Page"><#list items as item><div><h2>${item.title}</h2><p>${item.description}</p></div></#list>
</@base>
在这个例子中,base.ftl是一个基础模板,index.ftl通过@base指令继承了基础模板,并传入了标题参数。index.ftl还包含了对items列表的循环。
这个案例展示了Freemarker的模板继承和列表处理能力,适用于构建复杂且可重用的页面结构。
相关文章:
Freemarker
Freemarker简介 Freemarker是一个用Java语言编写的模板引擎,用于基于模板和数据生成文本输出。它可以用于生成HTML网页、XML文档、电子邮件、配置文件等任何格式的文本。Freemarker将业务逻辑与表示逻辑分离,使得开发人员可以专注于功能实现,…...
基于Zero-shot实现LLM信息抽取
基于Zero-shot方式实现LLM信息抽取 在当今这个信息爆炸的时代,从海量的文本数据中高效地抽取关键信息显得尤为重要。随着自然语言处理(NLP)技术的不断进步,信息抽取任务也迎来了新的突破。近年来,基于Zero-shot&#x…...
【python】tkinter GUI编程经典用法,Label标签组件应用实战详解
✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…...
国产操作系统上给麒麟虚拟机安装virtualbox增强工具 _ 统信 _ 麒麟 _ 中科方德
原文链接:国产操作系统上给麒麟虚拟机安装virtualbox增强工具 | 统信 | 麒麟 | 中科方德 Hello,大家好啊!昨天给大家带来了一篇在国产操作系统上给VirtualBox中的Win7虚拟机安装增强工具的文章,今天我们将继续深入,介绍…...
(delphi11最新学习资料) Object Pascal 学习笔记---第14章泛型第3节(特定类约束)
14.3.2 特定类约束 如果您的泛型类需要使用某个特定子集的类(特定层次结构),则可能需要根据给定基类指定约束。 例如,如果您声明: typeTCompClass<T: TComponent> class 则此泛型类的实例仅适用于组…...
【postgresql初级使用】视图上的触发器instead of,替代计划的rewrite,实现不一样的审计日志
instead of 触发器 专栏内容: postgresql使用入门基础手写数据库toadb并发编程 个人主页:我的主页 管理社区:开源数据库 座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物. 文章目录 inst…...
window.setInterval(func,interval)定时器
window.setInterval()是JavaScript中的方法,用于在指定的时间间隔重复执行某个函数或代码块。它接受两个参数,第一个参数是要执行的函数或代码块,第二个参数是时间间隔(以毫秒为单位)。 以下是使用window.setInterval…...
Einstein Summation 爱因斯坦求和 torch.einsum
Einstein Summation 爱因斯坦求和 torch.einsum flyfish 理解爱因斯坦求和的基本概念和语法,这对初学者来说可能有一定难度。对于不熟悉该表示法的用户来说,可能不如直接的矩阵乘法表达式易于理解。 整个思路是 向量的点积 -》矩阵乘法-》einsum 向…...
TCP攻击是怎么实现的,如何防御?
TCP(Transmission Control Protocol)是互联网协议族中的重要组成部分,用于在不可靠的网络上提供可靠的数据传输服务。然而,TCP协议的一些特性也使其成为攻击者的目标,尤其是DDoS(Distributed Denial of Ser…...
Chrome DevTools开发者调试工具
Chrome DevTools 是一个功能强大的网页开发工具,集成在谷歌浏览器中,帮助开发者调试和优化网页应用。以下是详细的功能说明和使用技巧: 1. 打开 DevTools 快捷键:按下 F12 或 CtrlShiftI(Windows/Linux)或…...
产品创新管理:从模仿到引领,中国企业的创新之路
一、引言 在全球化竞争日益激烈的今天,科技创新已成为推动国家经济增长和社会进步的关键动力。中国自改革开放四十年来,在科技创新领域取得了举世瞩目的成就,从跟踪模仿到自主研发,再到自主创新、开放创新和协同创新并举…...
Android 日志实时输出
开发中如果只是单纯的应用开发,Android studio基本上可以满足,但是如果应用和系统联调那就得用logcat实时输出了,我这里都是总结的实用经验,没那么多花里胡哨 Android 日志实时输出 1、输出 android log //分步,进入s…...
JavaEE初阶---多线程编程(一.线程与进程)
目录 🤣一.线程与进程的概念与联系: 进程的基本概念: 线程的基本概念: 进程和线程的区别与联系: 🙃代码执行实列: 1.通过继承Thread父类来实现多线程 2.通过实现Runnable接口来实现多线程…...
react+vite创建
要在本地初始化一个结合了React和Vite的项目,你可以遵循以下步骤: 1、安装Node.js: 确保你的机器上已安装了Node.js。如果未安装,请前往Node.js官网下载并安装。 2、使用终端或命令提示符: 打开你的终端(…...
软考 系统架构设计师系列知识点之杂项集萃(29)
接前一篇文章:软考 系统架构设计师系列知识点之杂项集萃(28) 第46题 以下描述中,( )不是嵌入式操作系统的特点。 A. 面向应用,可以进行裁剪和移植 B. 用于特定领域,不需要支持多任…...
[Qt开发]当我们在开发兼容高分辨率和高缩放比、高DPI屏幕的软件时,我们在谈论什么。
前言 最近在开发有关高分辨率屏幕的软件,还是做了不少尝试的,当然我们也去网上查了不少资料,但是网上的资料也很零碎,说不明白,这样的话我就做个简单的总结,希望看到这的你可以一次解决你有关不同分辨率下…...
uniapp视频组件层级太高,解决方法使用subNvue原生子体窗口
目录 前言 先看一下uniapp官网的原话: subNvue的一些参数介绍 subNvues使用方法: 绑定id 显示 subNvue 弹出层 subNvue.show() 参数信息 subNvue.hide() 参数信息 在使用subNvue 原生子体窗口 遇到的一些问题 前言 nvue 兼容性 以及使用方式 控…...
java项目使用jsch下载ftp文件
pom <dependency><groupId>com.jcraft</groupId><artifactId>jsch</artifactId><version>0.1.55</version> </dependency>demo1:main方法直接下载 package com.example.controller;import com.jcraft.jsch.*; im…...
指针(初阶1)
一.指针是什么 通俗的讲,指针就是地址,其存在的意义就像宾馆房间的序号一样是为了更好的管理空间。 如下图: 如上图所示,指针就是指向内存中的一块空间,也就相当于地址 二.一个指针的大小是多少 之前我们学习过&#x…...
MySQL实体类框架
实现mysql数据库的增删改查功能 import com.mchange.v2.collection.MapEntry; import lombok.Data; import org.junit.jupiter.api.Test;import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.lang.reflect.*; import java.sql.*; …...
Qwen3.5-4B-Claude-Opus部署教程:supervisor托管+健康检查全流程详解
Qwen3.5-4B-Claude-Opus部署教程:supervisor托管健康检查全流程详解 1. 模型介绍 Qwen3.5-4B-Claude-4.6-Opus-Reasoning-Distilled-GGUF 是一个基于 Qwen3.5-4B 的推理蒸馏模型,重点强化了结构化分析、分步骤回答、代码与逻辑类问题的处理能力。该版本…...
Qwen3-VL-Reranker-8B应用场景:科研数据集图文代码混合检索
Qwen3-VL-Reranker-8B应用场景:科研数据集图文代码混合检索 1. 科研检索的痛点与解决方案 科研工作者在日常研究中经常面临这样的困境:手头有大量包含文本、图像、代码片段的研究资料,想要快速找到相关内容却异常困难。传统的文本检索工具只…...
OpenClaw技能扩展:安装百川2-13B-4bits专用插件提升自动化能力
OpenClaw技能扩展:安装百川2-13B-4bits专用插件提升自动化能力 1. 为什么需要为OpenClaw安装专用插件 去年冬天,我在处理一批技术文档归档任务时,发现OpenClaw的基础能力虽然强大,但在处理特定领域内容时总有些力不从心。比如让…...
Pencil:重新定义设计与开发的边界
🎨 Pencil:重新定义设计与开发的边界 更多问题讨论和资料获取,请关注文章最后的微信公众号 当"设计即代码"成为现实,前端开发者的工作流正在经历一场革命 📖 什么是 Pencil? 如果你是一名前端开…...
FedMeta: Accelerating Federated Learning with Meta-Learning for Enhanced Privacy and Efficiency
1. FedMeta:当联邦学习遇上元学习 想象一下,你正在训练一个能识别手写数字的AI模型,但数据分散在成千上万个用户的手机里。传统联邦学习就像让每个用户都从头开始训练完整模型,既耗流量又费时间。而FedMeta的聪明之处在于——它让…...
别再乱填了!手把手教你配置Keil的IROM1和IRAM1,让STM32程序跑得更稳
深度解析Keil内存配置:从原理到实战的STM32开发指南 当你第一次在Keil MDK的"Target"选项卡中看到IROM1和IRAM1的配置项时,是否感到困惑?这些看似简单的地址和大小设置,实际上关系到整个嵌入式系统的稳定运行。许多开发…...
用CODrone数据集训练YOLOv8-OBB:手把手教你搞定无人机旋转目标检测模型
从CODrone到YOLOv8-OBB:实战无人机旋转目标检测全流程指南 无人机航拍视角下的目标检测一直是计算机视觉领域的难点——倾斜视角带来的目标旋转、飞行高度变化导致的尺度差异、复杂背景干扰等问题,让传统水平框检测方法捉襟见肘。本文将带您完整实现从CO…...
RWKV7-1.5B-g1a轻量对话模型应用:微信公众号自动回复+知识库问答搭建
RWKV7-1.5B-g1a轻量对话模型应用:微信公众号自动回复知识库问答搭建 1. 模型简介与特点 rwkv7-1.5B-g1a 是基于 RWKV-7 架构的多语言文本生成模型,特别适合中文轻量对话场景。相比传统大模型,它具有以下优势: 资源占用低&#…...
别再纠结模型了!用Python+Simulink快速搭建四旋翼无人机仿真(附完整代码)
用PythonSimulink快速搭建四旋翼无人机仿真实战指南 四旋翼无人机开发中最令人头疼的环节,往往不是控制算法设计,而是如何快速搭建一个可靠的仿真环境。我曾见过不少团队在模型选择上耗费数周时间,最终却陷入理论完美主义陷阱——他们反复纠结…...
零基础玩转VideoFusion:高效视频批量处理全攻略
零基础玩转VideoFusion:高效视频批量处理全攻略 【免费下载链接】VideoFusion 一站式短视频拼接软件 无依赖,点击即用,自动去黑边,自动帧同步,自动调整分辨率,批量变更视频为横屏/竖屏 项目地址: https://gitcode.com/gh_mirrors/vi/VideoFusion 在数字内容创…...
