freemarker的使用心得

深入解析FreeMarker:Java后端模板引擎的“常青树”,2026年仍值得学 摘要: FreeMarker作为一款历经20年迭代的Java模板引擎,在前后端分离时代依然不可替代。其核心优势在于轻量无依赖、模板与数据分离、语法强大且支持多格式输出,适用于报表生成、代码生成、邮件模板等场景。通过SpringBoot整合FreeMarker,开发者可快速实现动态文本渲染,如HTML页面、Word/Excel文档等。文章详细解析了FreeMarker的工作流程(模板+数据模型=输出)、核心特性及五大实用场景(如后端渲染、静态化页面),并提供了新手入门指南与常见避坑技巧(如空值处理、缓存配置) 阅读详情

freemarker目前虽然使用的公司不多,但是在某些时候就必须使用,当需要遍历json数据的时候,目前市面上的好多显示组件都达不到要求唯一能用的也就只有freemarker了。在java里使用的模板引擎有velocity、freemarker,至于velocity由于比较古老加之功能也不及freemarker那么强大使用的人群已经很少了。这次打算系统性的分享我学习freemarker的心得。

一  第一个freemarker程序

freemarker是一种与web容器无关的技术,应用并不局限于页面。使用java开发出来的模板引擎。因此java中使用freemarker应该算得上是一个比较好的选择了

freemarker的运行原理总结起来就是如下四点:

(1)初始化freemarker配置实例

(2)创建数据模型

(3)加载模板文件

(4)显示生成后的数据

如果要使用freemarker要做的就是把freemarker的jar包放到lib或者构建路径下面就OK了,来看下面这段程序

package org.lxh;

import java.io.*;
import java.util.*;

import freemarker.template.Configuration;
import freemarker.template.Template;

public class FirstFreemarker {

	public static void main(String[] args) throws Exception {
		//创建freemarker配置实例
        Configuration config=new Configuration();
        config.setDirectoryForTemplateLoading(new File("template"));
        //创建数据模型
        Map<String,String> m=new HashMap<String,String>();
        m.put("name", "cry");
        //加载模板文件
        Template t=config.getTemplate("index.ftl");
        //显示生成后的数据
        Writer w=new OutputStreamWriter(System.out);
        t.process(m, w);
        w.close();
	}

}
运行效果如下所示:


二  freemarker进阶

如果觉得freemarker的能力就这么点那就错了,freemarker还包含数据类型、条件判断、数据遍历、内建函数等,这些功能对日常开发已经足够,看下面这段程序

package org.lxh;

import java.io.File;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;

import freemarker.template.Configuration;
import freemarker.template.Template;

public class UseIf {
	public static void main(String[] args) throws Exception {
		//创建freemarker配置实例
        Configuration config=new Configuration();
        config.setDirectoryForTemplateLoading(new File("template"));
        //创建数据模型
        Map<String,Object> m=new HashMap<String,Object>();
        m.put("score",  new Random().nextInt(100));
        
        UserInfo u1=new UserInfo();
        u1.setName("仓木麻衣");
        u1.setPassword("123456");
        UserInfo u2=new UserInfo();
        u2.setName("柯南");
        u2.setPassword("654321");
        List<UserInfo> all=new ArrayList<UserInfo>();
        all.add(u2);
        all.add(u1);
        m.put("userList", all);
        m.put("time", new Date());
        m.put("str", "北京,上海,杭州");
        //加载模板文件
        Template t=config.getTemplate("useif.ftl");
        //显示生成后的数据
        Writer w=new OutputStreamWriter(System.out);
        t.process(m, w);
        w.close();

	}
}

看下模板文件的内容:

--------------if语句的使用----------------
<#if score gte 60>
 及格
<#elseif score gte 80&&score lte 90>
良好
<#else>
高材生
</#if>
--------------空值判断、默认值---------------
${name!"未定义"}
--------------判断值是否存在------------
<#if name??>
  name存在
<#else>
 name不存在
</#if>
-------------使用list遍历数据--------------
<#list userList as user>
<#if  user_has_next> 最后一组:${user.name}-${user.password}<#else>${user.name}-${user.password}</#if>
</#list>
-------------其他内建函数-----------------
(1)日期格式化
${time?string("yyyy-MM-dd")}
(2)截取字符串
${str?substring(0,2)}
(2)indexof的使用
${str?last_index_of(",")}
(2)split的使用
<#list "12,13,14,15"?split(",") as item>
${item}
</#list>

对于list的遍历有两个隐含变量用的比较多分别是_index  _has_next  ,详细的使用可以百度一下,真的很简单


三 freemarker宏指令

宏指令可以简单理解成在freemarker可以自己定义的公共方法,具体用途主要用于分页,来看下面的这个最简单的例子

package org.lxh;

import java.io.File;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;

import freemarker.template.Configuration;
import freemarker.template.Template;

public class UseMacro {

	public static void main(String[] args) throws Exception {
		//创建freemarker配置实例
        Configuration config=new Configuration();
        config.setDirectoryForTemplateLoading(new File("template"));
        //创建数据模型
        Map<String,Object> m=new HashMap<String,Object>();
        m.put("type", "other");
        m.put("num1", 2);
        m.put("num2", 3);
        //加载模板文件
        Template t=config.getTemplate("macro.ftl");
        //显示生成后的数据
        Writer w=new OutputStreamWriter(System.out);
        t.process(m, w);
        w.close();

	}

}

模板文件的内容如下:

----------------------宏指令的使用 m1可以看成是方法的名称,num1、num2为入参----------------------
<#macro m1 num1 num2>
<#assign result=num1+num2>
<h3>${result}</h3>
</#macro>
<@m1 5 6/>
----------------------宏指令(嵌入式)-----------------
<#macro m2>
<h3><#nested></h3>
</#macro>
<@m2>hello world</@m2>

运行效果如下:



四  其他指令

包含指令:<#include "test.txt"  />

import指令:<#import "b.ftl" as bb  />

<#macro copyright date>
  <p>Copyright (C) ${date}.</p> 
</#macro> 


当ftl文件比较多的时候,而且这些ftl有引用关系,这个时候import就可以大展拳脚了,如<@bb.copyright date="2010-2011" />

五  struts2中使用freemarker

struts2是不能直接使用freemarker的,如果一定要用可以:

 (1)解压struts2-core-X.X.X.jar文件,把在META-INF文件夹下面的struts-tags.tld文件复制到WEB-INF文件夹下。   将freemark的jar导入到工程中

 (2)在web.xml文件中配置freemark同时启动JSPSupportServlet.代码如下

<servlet>
        <servlet-name>freemarker</servlet-name>
        <servlet-class>
            freemarker.ext.servlet.FreemarkerServlet
        </servlet-class>
        <!--下面的配置freemarke的ftl文件的位置 -->
        <init-param>
            <param-name>TemplatePath</param-name>
            <param-value>/</param-value>
        </init-param>
        <!-- 是否和服务器(tommcat)一起启动。-->
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>freemarker</servlet-name>
        <url-pattern>*.ftl</url-pattern>
    </servlet-mapping>


<servlet>
  <!-- define a JspSupportServlet Object -->
  <servlet-name>JspSupportServlet</servlet-name>
  <servlet-class>org.apache.struts2.views.JspSupportServlet</servlet-class>
  <!-- setting JspSupportServlet auto start -->
  <load-on-startup>1</load-on-startup>
 </servlet>

(3).在FreeMarker模板中使用assign指令导入标签库,这样在freemarker中就可以使用struts2的标签了

<#assign s=JspTaglibs["/WEB-INF/struts-tags.tld"] /> 注:这里我把struts-tags.tld放在WEB-INF下面

(4)在FreeMarker模板中使用struts标签

<@s;property value=""/>

注:struts使用freemarker要在result的节点加上type="freemarker"

对于这种做法有些时候不好用,freemarker也提供了在jsp页面使用freemarker的方法,同样的还是需要把freemarker的tld文件放在WEB-INF下面,这个文件如果找不到可以建一个叫fmtag.tld的文件,内容如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE taglib
        PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"
        "http://java.sun.com/j2ee/dtds/web-jsptaglib_1_1.dtd">

<taglib>

  <tlibversion>2.0</tlibversion>
  <jspversion>1.1</jspversion>
  <shortname>FreeMarker JSP Support</shortname>

  <tag>
    <name>template</name>
    <tagclass>freemarker.ext.jsp.FreemarkerTag</tagclass>
    <bodycontent>tagdependent</bodycontent>
    <info>Allows evaluation of FreeMarker templates inside JSP</info>
    <attribute>
      <name>caching</name>
      <required>false</required>
    </attribute>
  </tag>
</taglib>

接下来看看在jsp中怎么使用freemarker

(1)jsp页面引入freemarker标签库

<%@ taglib prefix="fm" uri="/WEB-INF/fmtag.tld" %>

(2)嵌入freemarker

 <fm:template>
       freemarker语句
</fm:template>

综合前面的情况无论怎么用是不是都很简单呢


六  扩充freemarker内建函数

freemarker虽然提供很多内建函数,但仍然有需要自定义的时候,freemarker也运行用户写自定义函数,如下所示:

public class MyFmTag implements TemplateMethodModel  {
	
	public Object exec(List param) throws TemplateModelException {
		Object result=null;
		if("save".equals(param.get(0).toString())){
			//调用保存方法
		}
		return result;
	}
	//保存方法................
}
 使用的时候就像下面这样就ok了

 <#assign check= "org.lxh.util.MyFmTag"?new()/>
 <#assign result=check('save','xxx')/>



用Docker-Compose三节点部署生产级Doris集群:从配置文件到故障转移 本文详细介绍了如何使用Docker-Compose部署一个生产级的三节点Apache Doris集群。内容涵盖从核心架构理解、配置文件编写到集群初始化验证的全过程,并重点讲解了如何实现高可用、数据持久化、健康检查以及故障转移等生产级运维关键点,为中小团队提供了一种在容器化便利性与系统稳定性间取得平衡的可靠部署方案。 阅读详情

相关推荐

基于STM32F407的DDS信号源设计与实现:DAC+DMA+TIM的高精度波形生成

本文详细介绍了基于STM32F407微控制器实现高精度DDS信号源的完整方案。通过结合DAC、DMA和TIM外设,并运用DDS算法,实现了分辨率高达0.001Hz的波形生成。文章深入剖析了相位累加器、波表查表等核心原理,提供了从CubeMX配置到代码实战的完整指南,并探讨了性能优化与高频输出问题的解决方案。

weixin_29193259的博客 502

最近在看的freemarker,个人认为有助于理解

freemarker   优点:   1、不能编写java代码,可以实现严格的mvc分离   2、性能非常不错   3、对jsp标签支持良好   4、内置大量常用功能,使用非常方便   5、宏定义(类似jsp标签)非常方便   6、使用表达式语言   缺点:   1、不是官方标准   2、用户群体和第三方标签库没有jsp多   性能:velocity应该是最好的,其次是j

老夫聊发少年狂 3364

从零到一:uniPush2.0全链路集成与多厂商通道配置实战

本文提供了uniPush2.0从零开始的全链路集成与多厂商通道配置实战指南。详细讲解了DCloud平台配置、uniCloud云函数开发、客户端CID获取与消息监听,并重点攻克了华为、小米、OPPO、vivo等主流厂商推送通道的配置难点与避坑技巧,帮助UniApp开发者实现“一次集成,全端覆盖”的高效消息推送方案。

onion的博客 431

模板技术(如 FreeMarker、Thymeleaf)的发展现状

模板技术(如 FreeMarker、Thymeleaf)在动态页面生成、文档处理等场景中依然有其独特的优势。尽管受到前后端分离架构的冲击,但它们在快速开发、文档生成等特定场景中不可替代。对于开发者而言,熟悉模板引擎的使用仍然是提升开发效率、优化后端服务的重要技能。

东南草堂 1901

别再找在线API了!用C#调用微信电脑版自带的OCR,本地识别又快又准

本文详细介绍了如何利用C#调用微信电脑版内置的OCR引擎实现本地文字识别,解决传统云端API的隐私和网络依赖问题。微信OCR具备高精度中文识别、完全离线运行和零成本接入三大优势,特别适合企业文档电子化处理。通过实战代码演示了核心交互逻辑、批量处理流水线和表格数据提取等高级应用场景。

weixin_29295541的博客 588

操作系统笔记【全-408统考】【附思维导图】

操作系统 思维导图 概述 操作系统的概念 管理计算机软件和硬件资源 最基本的系统软件 特征 并发 区分并发并行 共享 互斥共享方式 同时访问方式 虚拟 逻辑上多个。虚拟处理器的分时,空分复用的虚拟存储器 采用多道程序设计 异步 由于资源有限,进程走走停停 可能会导致进程产生与时间有关的错误。访问顺序 目的和功能 1.管理计算机资源 功能 处理机管理、存储器管理、文件管理、设备管理 目标:安全、有效 2.作为用户与计算机硬件系统

wvdon 2364

Freemarker 3种循环模式

Freemarker 3种循环模式 1. map循环2. list循环3. 自定义次数循环 ) 1. map循环 举例: <#if vo.urlMap??> <#list vo.urlMap?keys as key> <li> <a href="${vo.urlMap[key]!''}}">${key!''}</a> &l...

_WanG 4万+

AutoGLM-Phone 实现“豆包 AI 手机”的自动化操作手机的实战方案教程 让普通手机秒变ai手机

是一个基于视觉语言模型(VLM)的 AI 手机智能助理框架。❌ 不依赖固定坐标❌ 不需要提前录制脚本✅ 能“看懂”手机屏幕✅ 能理解自然语言指令✅ 能自动规划操作路径并执行让 AI 像人一样看屏幕、想步骤、点手机。从工程角度看,AutoGLM-Phone 已经具备“AI 手机助理”的完整雏形能看能理解能规划能执行能跨 App所谓的「豆包 AI 手机」,本质上就是这类能力的产品化封装。而现在,这套能力已经可以被普通开发者亲手跑起来、改起来、甚至接入自己的业务场景。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 593

freemarker使用心得

jar包地址:http://www.freemarker.org/freemarkerdownload.html FreeMarker是一个用Java语言编写的模板引擎,它基于模板来生成文本输出。 FreeMarker与Web容器无关,即在Web运行时,它并不知道Servlet或HTTP。 它不仅可以用作表现层的实现技术,而且还可以用于生成XML,JSP或Java 等。 Demo:

charming的专栏 3773

Oracle11g下载与安装(windows)

一、Oracle11g下载 二、安装准备 三、执行安装步骤 四、测试连接 附:Oracle11g服务说明

欢迎订阅我的“JAVA全栈开发笔记(全)”专栏,价格优惠,仅需19.9元。 2万+

检测头篇 | 手把手教你如何去更换YOLOv8的检测头为ASFF_Detect

自适应空间特征融合(ASFF)的主要原理旨在解决单次检测器中不同尺度特征的不一致性问题。具体来说,ASFF通过动态调整来自不同尺度特征金字塔层的特征贡献,确保每个检测对象的特征表示是一致且最优的。本文所做出的改进是将YOLOv8的检测头更换为ASFF_Detect。🌈

小哥谈 2497

freemarker的使用心得,freemarker使用心得

freemarker目前虽然使用的公司不多,但是在某些时候就必须使用,当需要遍历json数据的时候,目前市面上的好多显示组件都达不到要求唯一能用的也就只有freemarker了。在java里使用的模板引擎有velocity、freemarker,至于velocity由于比较古老加之功能也不及freemarker那么强大使用的人群已经很少了。这次打算系统性的分享我学习freemarker的心得。

LANGZI7758521的专栏 3283

【工具插件类教学】Unity翻书效果插件Book-Page Curl Pro教程

特征: • 从左到右和从右到左翻页 • 与画布缩放器 配合使用 • 可配置的自动翻转脚本 • 支持向页面 添加 UI 元素 • 支持透明页面 • 适用于“世界空间”画布

纯技术流日常开发商业开发记录总结等 3672

关于用freemarker模板导出word文件的使用心得

心得: 1、打开word文档,编辑内容,用key占位符替换动态数据2、后台代码使用map存储结构,key值要和{key}占位符替换动态数据 2、后台代码使用map存储结构,key值要和key占位符替换动态数据2、后台代码使用map存储结构,key值要和{key}值相同。 3、替换文本的时候,生成的ftl文件中的${}可能会被分隔开,要手动把中间的代码删除 4、使用freemarker语法进行循环遍...

weixin_43936983的博客 367

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

在WEB程序中使用FreeMarker心得

今天做了Struts2、Hibernate3、Spring2、FreeMarker的框架整合程序。 按照网上找的相关资料去做的程序报错了,因为是第一次用FreeMarker,所以没有经验,网上说只要把Struts2的核心jar包里的struts-tags.tld放在WEB-INF目录下,在*.ftl页面里做这样的引用就可以,可我的程序却报了 exception:freemarker.t...

iteye_10711的博客 155

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

freeMarker使用心得(一)

首先,曾经天真的以为freemarker跟jstl和el一样,只是显示数据用的标签。但是实际上freemarker数据jsp级别的,可以用来生成静态页面。 先来看看freemarker在页面上是如何被调用的。 publicclassFreeMarkHander{ ...

chuminlu1534的博客 175

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

关于使用freemarker的一些心得体会

在项目上配置使用freemarker很简单,只需引入一个包即可,也可跟springMVC,struts等框架整合使用,它是一款很好的模板引擎。 常用指令有: if指令 <#if condition>...<#elseif condition2> ...<#else> ...</#if>list指令 <#list sequence as...

weixin_30347009的博客 108

FreeMarker的基础语法使用 && 心得和技巧

FreeMarker语言 FreeMarker语言概述 FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写。 FreeMarker被设计用来生成HTML Web页面,特别是基于MVC模式的应用程序 虽然FreeMarker具有一些编程的能力,但通常由Java程序准备要显示的数据,由FreeMarker生成页面,通过模板显示准备的数据(如下图) Fr...

qq_18932003的博客 1050

使用FreeMarker生成Word出错的一点心得

这几天在维护一个导出word的一个功能,领导改了word模板,不得不重来一遍。也不过是刘欢歌中所言:“只不过是重头再来”。废话少说,直接进入主题。用了FreeMaker这么多天,也总结出不少规律。FreeMarker报错就是下面两种。 情景1: Expression hello is undefined on line 3, column 85440 in doc.ftl. The probl

学习笔记 1万+

使用freemarker的一点心得!

在开发中很容易忽视一点,输入一个值(可能是小数),输出时如果不做处理,就很容易出现 隐形的BUG。比如,如果从数据库取出一个0.22的数值,一般的输出${x?if_exists?html}, 这时是显示0,而不是0.22。 应该写成${x?if_exists?string.number} 或者 ${x?if_exists.toString()?html} 下面就是关于数字的...

bee100的专栏 376

freemarker生成word使用心得

1.首先使用word创建自己需要的模板样式,参数通过占位符填充,生成模板后,将后缀名修改为ftl,然后通过工具打开ftl文件,因为此处你需要添加你通过代码遍历获得的对象这样ftl模板中的参数才能获取到对象值。我在使用中发现的问题:1.当你生成word文件为doc后缀时,会造成当你运行全部流程,并检查代码无误,但生成的数据与实际数据不一致;然而将你的后缀名改为docx时,然后在运行,数据一致。2.我的word模板报告中存在照片,在生成照片时出现了些许问题,在使用过程如果发现了问题可以问我。

weixin_54424145的博客 220

FreeMarker的一些使用心得和技巧

来源:http://www.blogjava.net/usherlight/archive/2009/04/28/267879.html 1. TagLib的运用(Spring Security)在web.xml中添加: &lt;servlet&gt; &lt;servlet-name&gt;JSPSupportServlet&lt;/servlet-name&gt; &lt;servlet...

系统运维 137
上一篇: java使用mongoDB和freemarker的注意事项
下一篇: SpringMVC的使用基础篇
青蛙小王子
博客等级 码龄16年 239粉丝 311原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值