FreeMarker 是一种基于模板的、用来生成输出文本的同用工具,所以必须要定制符合自己业务的模板,然后生成自己的 html 页面。
FreeMarker 是通过 freemarker.template.Configuration 这个对象模板进行加载的(也用于处理创建和缓存预解析模板的工作),我们可以通过 getTemplate 方法获取想要的模板
注意事项:freemarker.template.Configuration 在整个应用中必须保证唯一实例

定义模板

news.ftl:

  1. <!doctype html>
  2. <html>
  3. <head>
  4. <#-- freemarker模板中设置编码格式,避免中文乱码 -->
  5. <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
  6. <title>${title}</title>
  7. </head>
  8. <body>
  9. <#-- 新闻标题 -->
  10. <h1>${title}</h1>
  11. <p>
  12. 新闻来源:${source} <br/>
  13. 发布时间:${pubTime?string("yyyy-MM-dd HH:mm:ss")}
  14. </p>
  15. <#-- 新闻内容 -->
  16. <p>
  17. ${content}
  18. </p>
  19. </body>
  20. </html>

加载模板

Servlet:生成相关的

  1. @WebServlet("/news")
  2. public class NewsController extends HttpServlet {
  3. @Override
  4. protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  5. // 实例化模板对象
  6. Configuration configuration = new Configuration();
  7. // 设置加载模板的上下文环境以及模板存放路径
  8. configuration.setServletContextForTemplateLoading(getServletContext(), "/templates");
  9. // 设置模板的编码格式
  10. configuration.setDefaultEncoding("UTF-8");
  11. // 加载模板文件,获取模板对象
  12. Template template = configuration.getTemplate("news.ftl");
  13. // 设置数据模型
  14. Map<String, Object> map = new HashMap<>();
  15. map.put("title","世界末日");
  16. map.put("source","news.baidu.com" );
  17. map.put("pubTime", new Date());
  18. map.put("content", "世界末日即将到来");
  19. // 设置文件路径:获取项目的根目录
  20. String basePath = req.getServletContext().getRealPath("/");
  21. // 设置html的存放路径
  22. File htmlFile = new File(basePath + "/html");
  23. // 判断文件目录是否存在
  24. if (!htmlFile.exists()){
  25. // 如果文件夹不存在
  26. htmlFile.mkdir();
  27. }
  28. // 得到生成的文件名(生成随机不重复的文件名)
  29. String fileName = System.currentTimeMillis() + ".html";
  30. // 创建文件对象
  31. File file = new File(htmlFile, fileName);
  32. // 获取文件输出流
  33. FileWriter writer = new FileWriter(file);
  34. // 生成html(将数据填充到模板中)
  35. try {
  36. template.process(map, writer);
  37. } catch (TemplateException e) {
  38. e.printStackTrace();
  39. } finally {
  40. // 关闭资源
  41. writer.flush();
  42. writer.close();
  43. }
  44. }
  45. }