FreeMarker 是一种基于模板的、用来生成输出文本的同用工具,所以必须要定制符合自己业务的模板,然后生成自己的 html 页面。
FreeMarker 是通过 freemarker.template.Configuration 这个对象模板进行加载的(也用于处理创建和缓存预解析模板的工作),我们可以通过 getTemplate 方法获取想要的模板
注意事项:freemarker.template.Configuration 在整个应用中必须保证唯一实例
定义模板
news.ftl:
<!doctype html>
<html>
<head>
<#-- freemarker模板中设置编码格式,避免中文乱码 -->
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
<title>${title}</title>
</head>
<body>
<#-- 新闻标题 -->
<h1>${title}</h1>
<p>
新闻来源:${source} <br/>
发布时间:${pubTime?string("yyyy-MM-dd HH:mm:ss")}
</p>
<#-- 新闻内容 -->
<p>
${content}
</p>
</body>
</html>
加载模板
Servlet:生成相关的
@WebServlet("/news")
public class NewsController extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 实例化模板对象
Configuration configuration = new Configuration();
// 设置加载模板的上下文环境以及模板存放路径
configuration.setServletContextForTemplateLoading(getServletContext(), "/templates");
// 设置模板的编码格式
configuration.setDefaultEncoding("UTF-8");
// 加载模板文件,获取模板对象
Template template = configuration.getTemplate("news.ftl");
// 设置数据模型
Map<String, Object> map = new HashMap<>();
map.put("title","世界末日");
map.put("source","news.baidu.com" );
map.put("pubTime", new Date());
map.put("content", "世界末日即将到来");
// 设置文件路径:获取项目的根目录
String basePath = req.getServletContext().getRealPath("/");
// 设置html的存放路径
File htmlFile = new File(basePath + "/html");
// 判断文件目录是否存在
if (!htmlFile.exists()){
// 如果文件夹不存在
htmlFile.mkdir();
}
// 得到生成的文件名(生成随机不重复的文件名)
String fileName = System.currentTimeMillis() + ".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();
}
}
}