一、FreeMarker 页面静态化
通过上述介绍可知 Freemarker 是一种基于模板的、用来生成输出文本的通用工具,所以 我们必须要定制符合自己业
务的模板,然后生成自己的 html 页面。Freemarker 是通过 freemarker.template.Confifiguration 这个对象对模板进
行加载的(它也处理创建和缓存预 解析模板的工作),然后我们通过 getTemplate 方法获得你想要的模板,有一点
要记住 freemarker.template.Confifiguration 在你整个应用必须保证唯一实例。
1、定义模板
创建news.ftl模板文件
<!doctype html> <html> <head> <#-- freemaeker模板中设置编码格式,否则中文可能乱码 --> <meta http-equiv="content-type" content="text/html;charset=UTF-8"> </head> <body> <#-- 新闻标题 --> <h2 align="center">${title}</h2> <#-- 新闻来源 和 发布时间 --> <p align="center"> 新闻来源:${source} 发布时间:${pubTime} </p> <#-- 新闻内容 --> <p style="text-indent: 2em"> ${content} </p> </body> </html>
2、加载模板
package com.xxxx.servlet; import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.TemplateException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.util.HashMap; import java.util.Map; @WebServlet("/news") public class NewsServlet extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 实例化模板对象 Configuration configuration = new Configuration(); // 设置加载模板的上下文 以及加载模板的路径 (模板存放路径) configuration.setServletContextForTemplateLoading(getServletContext(),"/template"); // 设置模板的编码格式 configuration.setDefaultEncoding("UTF-8"); // 加载模板文件 获取模板对象 Template template = configuration.getTemplate("news.ftl"); // 设置数据模型 Map<String,Object> map = new HashMap<>(); map.put("title","【战“疫”说理】良好的公民素养和国民心态是“硬核”力量"); map.put("source","经济日报-中国经济网"); map.put("pubTime","2020年03月16日 10:00"); map.put("content","公共性的社会大事件,是检验和透视公民素养和国民心态的一个重要窗口。" + "在突袭而至的新冠肺炎疫情面前,一方面,抗击疫情的过程就是淬炼公民素养和国民心态的熔炉;另一方面,良好的公民素养和国民心态也是疫情防控的“硬核”力量,更是推动战“疫”积极向好态势不断拓展的精神之盾。\n" + "\n疫情防控,既是大战,也是大考。涵养良好的公民素养和国民心态,是疫情期间摆在我们面前的考题,同时也是提升国家治理能力过程中需要面对的课题。\n" + "\n着眼三个方面 提升科学素养\n\n疫情面前,每个人都是防控链条中的重要一环。做好自我保护,既是对自己、家人负责,也是对社会负责。有效做好科学防控,每个人都应具备必要的科学素养。"); // 获取项目的根目录 String basePath = req.getServletContext().getRealPath("/"); // 设置html的存放路径 File htmlFile = new File(basePath + "/html"); // 判断文件(目录)是否存在 if (!htmlFile.exists()) { // 如果文件目录不存在,则新建文件目录 htmlFile.mkdir(); } // 得到生成的文件名 (生成随机不重复的文件名) String fileName = System.currentTimeMillis() + ".html"; // 创建html文件 File file = new File(htmlFile,fileName); // 获取文件输出流 FileWriter writer = new FileWriter(file); // 生成html (将数据模型填充到模板中) try { template.process(map,writer); } catch (TemplateException e) { e.printStackTrace(); } finally { // 关闭资源 writer.flush(); writer.close(); } } }
3、生成对应的html文件
浏览器地址栏输入:
生成的文件存放在当前项目的webapp目录下的html目录中。