<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>Freemarker on Anttu&#39;s Blog</title>
		<link>https://anTtutu.github.io/tags/freemarker/</link>
		<description>Recent content in Freemarker on Anttu&#39;s Blog</description>
		<generator>Hugo</generator>
		<language>zh-CN</language>
		
		
		
		
			<lastBuildDate>Thu, 21 Nov 2024 08:00:00 +0800</lastBuildDate>
		
			<atom:link href="https://anTtutu.github.io/tags/freemarker/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>SpringBoot接入FreeMarker完整指南：依赖、配置与可运行样例</title>
				<link>https://anTtutu.github.io/post/2024-11-21-springboot-freemarker-integration/</link>
				<pubDate>Thu, 21 Nov 2024 08:00:00 +0800</pubDate>
				<guid>https://anTtutu.github.io/post/2024-11-21-springboot-freemarker-integration/</guid>
				<description>&lt;h2 id=&#34;前言&#34;&gt;前言&lt;/h2&gt;&#xA;&lt;p&gt;FTL 模板语法在 &lt;a href=&#34;https://anTtutu.github.io/post/2024-11-14-freemarker-ftl/&#34;&gt;FreeMarker常用语法与指令详解&lt;/a&gt;里整理过了，这篇解决另一半问题：怎么把 FreeMarker 接进 SpringBoot。依赖、配置、渲染、全局变量，配一套能直接跑的样例。&lt;/p&gt;&#xA;&lt;h2 id=&#34;1引入依赖&#34;&gt;1、引入依赖&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;div style=&#34;background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&#xA;&lt;table style=&#34;border-spacing:0;padding:0;margin:0;border:0;&#34;&gt;&lt;tr&gt;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;1&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;2&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;3&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;4&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;5&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;6&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;7&#xA;&lt;/span&gt;&lt;span style=&#34;white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f&#34;&gt;8&#xA;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;vertical-align:top;padding:0;margin:0;border:0;;width:100%&#34;&gt;&#xA;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#0550ae&#34;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.boot&lt;span style=&#34;color:#0550ae&#34;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#0550ae&#34;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-boot-starter-freemarker&lt;span style=&#34;color:#0550ae&#34;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#0550ae&#34;&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.boot&lt;span style=&#34;color:#0550ae&#34;&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#0550ae&#34;&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-boot-starter-web&lt;span style=&#34;color:#0550ae&#34;&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#0550ae&#34;&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&lt;p&gt;starter 会自动带上 freemarker 核心包和 &lt;code&gt;FreeMarkerAutoConfiguration&lt;/code&gt;，不加任何配置就能跑。&lt;/p&gt;&#xA;&lt;h2 id=&#34;2目录结构&#34;&gt;2、目录结构&lt;/h2&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;src/main/java&#xA;  └── com.example.demo&#xA;      ├── DemoApplication.java&#xA;      └── controller/PageController.java&#xA;src/main/resources&#xA;  ├── application.yml&#xA;  ├── static/                  # 静态资源（css/js）&#xA;  └── templates/               # 模板默认目录（classpath:/templates/）&#xA;      ├── index.ftl&#xA;      ├── user/&#xA;      │   └── detail.ftl&#xA;      └── common/&#xA;          ├── header.ftl&#xA;          └── footer.ftl&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;约定就三条：模板放 &lt;code&gt;classpath:/templates/&lt;/code&gt;，后缀 &lt;code&gt;.ftl&lt;/code&gt;，Controller 返回视图名不带后缀。&lt;/p&gt;</description>
			</item>
			<item>
				<title>FreeMarker FTL语法速查：从插值到宏的完整笔记</title>
				<link>https://anTtutu.github.io/post/2024-11-14-freemarker-ftl/</link>
				<pubDate>Thu, 14 Nov 2024 08:00:00 +0800</pubDate>
				<guid>https://anTtutu.github.io/post/2024-11-14-freemarker-ftl/</guid>
				<description>&lt;h2 id=&#34;前言&#34;&gt;前言&lt;/h2&gt;&#xA;&lt;p&gt;FreeMarker 在老项目和邮件模板、报表模板场景里依然大量存在。FTL 语法细节多、容易忘，这篇按「输出 → 运算 → 流程控制 → 集合 → 指令 → 宏」的顺序整理成速查笔记。&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;基本原则：&lt;strong&gt;所有标签必须闭合&lt;/strong&gt;，否则 FreeMarker 无法解析。注释格式 &lt;code&gt;&amp;lt;#-- 注释内容 --&amp;gt;&lt;/code&gt;，不会输出。&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;h2 id=&#34;一字符输出&#34;&gt;一、字符输出&lt;/h2&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-ftl&#34; data-lang=&#34;ftl&#34;&gt;${emp.name?if_exists}            &amp;lt;#-- 变量存在输出，否则不输出 --&amp;gt;&#xA;${emp.name!}                     &amp;lt;#-- 同上 --&amp;gt;&#xA;${emp.name?default(&amp;#34;xxx&amp;#34;)}       &amp;lt;#-- 变量不存在，取默认值xxx --&amp;gt;&#xA;${emp.name!&amp;#34;xxx&amp;#34;}                &amp;lt;#-- 同上 --&amp;gt;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;常用内建函数&lt;/strong&gt;：&lt;/p&gt;</description>
			</item>
	</channel>
</rss>
