引言FreeMarker 是一种前端模板引擎，通常可以通过模板来批量生成静态页面，当然也可以做一些代码的自动生成。众所周知的，访问静态页面的速度相比走Servlet要快得多，如果一个页面，不会经常改变，生成静态页面会减少动态服务器的负载压力，通过静态服务器，如Nginx，Nginx的并发量2~5w，而动态服务器的并发量普遍很低，因此也说明了静态页面的优越性。倘若使用Tomcat来处理静态页面，岂不是大材小用了？导入引用官网中的一张图通俗的说是在模板中定义好样式和坑位，然后通过往坑位里放值，从而生成文件。做个Demo导入Pom<?xml version="1.0" encoding="UTF-8"?> 4.0.0 top.zunmx T_FK 1.0 war org.freemarker freemarker 2.3.31 org.springframework spring-webmvc 5.3.5 junit junit 4.13.1 test org.springframework spring-test 5.3.5 生成器package top.zunmx.demo; import freemarker.template.Configuration; import freemarker.template.Template; import java.io.File; import java.io.FileWriter; import java.io.Writer; import java.util.*; public class Maker { public static void main(String[] args) throws Exception { //step 1 Configuration configuration = new Configuration(Configuration.getVersion()); //step 2 configuration.setDirectoryForTemplateLoading(new File(new File("").getAbsolutePath() + "/src/main/webapp/template/")); //step 3 configuration.setURLEscapingCharset("utf-8"); //step 4 Template template = configuration.getTemplate("template.ftl"); //step 5 Map<String, Object> info = new HashMap<String, Object>(); info.put("name", "zunmx"); info.put("age", 20); info.put("website", "https://www.zunmx.top"); info.put("date", new Date()); List<String> skill = new ArrayList<String>(); skill.add("Java"); skill.add("Python"); skill.add("C++"); skill.add("PHP"); info.put("skill", skill); List<Object> goodsList = new ArrayList<Object>(); Map<String, Object> goods1 = new HashMap<String, Object>(); goods1.put("name", "Dell Gaming 7567"); goods1.put("cate", "Computer"); goods1.put("price", 7999); goodsList.add(goods1); Map<String, Object> goods2 = new HashMap<String, Object>(); goods2.put("name", "Red MI 8 PRO"); goods2.put("cate", "Phone"); goods2.put("price", 1499); goods2.put("status", 1); goodsList.add(goods2); Map<String, Object> goods3 = new HashMap<String, Object>(); goods3.put("name", "MI Band 5"); goods3.put("cate", "Watch"); goods3.put("price", 219); goodsList.add(goods3); info.put("goods", goodsList); //step 6 Writer out = new FileWriter(new File("./src/main/webapp", "info.html")); //step 7 template.process(info, out); //step 8 out.close(); } }模板文件footer(页脚) 设为首页 关于(About) 意见反馈 帮助中心 京公网安备123456789号 京ICP证123456号 ©2021 DEMO footer(页首) Zunmx FTL demo Head 正文 FreeMarker Demo <#include "header.ftl"/> <#-- 这是 注释 --> 模板产生于 ${date?date} ${date?time} 也就是说${date?datetime}，这是我们自定义的格式：${date?string("yyyy-MM-dd HH:mm:ss.sss")} 这样呢？${.now} <#list 1..10 as n>${n}</#list> 哈喽啊，我是${name} <#assign linkman="zunmx"> ---${linkman}--- <#if name="zunmx"> 欢迎您${name} <#else> ${name}不是主人 </#if> <#assign _0 ='{"name":"howl","age":"22"}'/> <#assign data=_0?eval/> name age ${data.name} ${data.age} 技能表： <#list skill as item> ${item_index+1}、${item} </#list> 共展示了${skill?size}个技能 序号 商品名 商品类别 价格 价格(不转换) 价格(货币) 状态 <#list goods as item> ${item?index+1} ${item.name} ${item.cate} ${item.price} ${item.price?c} ${item.price?string.currency} <#if item.status?? >√<#else>×</#if> </#list> <#include "footer.ftl"/> 测试这样也深刻的表明了导入中的那张图，通过模板和定义的值，进而生成文件