Freemarker的使用方法
1、 Freemarker概念
1.1 什么是freemarker
FreeMarker是一个用Java语言编写的模板引擎,它基于模板来生成文本输出。FreeMarker与Web容器无关,即在Web运行时,它并不知道Servlet或HTTP。它不仅可以用作表现层的实现技术,而且还可以用于生成XML,JSP或Java 等。
1.2 Freemarker的使用方法
第一步:把freemarker的jar包添加到工程中
第二步:freemarker的运行不依赖web容器,可以在java工程中运行。创建一个测试方法进行测试。
第三步:创建一个Configration对象
第四步:告诉config对象模板文件存放的路径。
第五步:设置config的默认字符集。一般是utf-8
第六步:从config对象中获得模板对象。需要制定一个模板文件的名字。
第七步:创建模板需要的数据集。可以是一个map对象也可以是一个pojo,把模板需要的数据都放入数据集。
第八步:创建一个Writer对象,指定生成的文件保存的路径及文件名。
第九步:调用模板对象的process方法生成静态文件。需要两个参数数据集和writer对象。
第十步:关闭writer对象。
1.3 代码实现
public class FreeMarkerTest { @Test public void testFreeMarker() throws Exception { // 第一步:把freemarker的jar包添加到工程中 // 第二步:freemarker的运行不依赖web容器,可以在java工程中运行。创建一个测试方法进行测试。 // 第三步:创建一个Configuration对象 Configuration configuration = new Configuration(Configuration.getVersion()); // 第四步:告诉config对象模板文件存放的路径。 configuration.setDirectoryForTemplateLoading(new File("D:\\workspaces\\portal\\src\\main\\webapp\\WEB-INF\\ftl")); // 第五步:设置config的默认字符集。一般是utf-8 configuration.setDefaultEncoding("utf-8"); // 第六步:从config对象中获得模板对象。需要制定一个模板文件的名字。 Template template = configuration.getTemplate("first.ftl"); // 第七步:创建模板需要的数据集。可以是一个map对象也可以是一个pojo,把模板需要的数据都放入数据集。 Map root = new HashMap<>(); root.put("hello", "hello freemarker"); // 第八步:创建一个Writer对象,指定生成的文件保存的路径及文件名。 Writer out = new FileWriter(new File("D:\\temp\\html\\hello.html")); // 第九步:调用模板对象的process方法生成静态文件。需要两个参数数据集和writer对象。 template.process(root, out); // 第十步:关闭writer对象。 out.flush(); out.close(); } }
模板:
${hello}
2、 Freemarker模板的写法
2.1 取简单数据类型数据
使用EL表达式。
${hello}
2.2 包装数据类型
模板:
<html> <head> <title>${title}</title> </head> <body> <label>学号:</label>${student.id}<br> <label>姓名:</label>${student.name}<br> <label>住址:</label>${student.address}<br> </body> </html>
2.3 历遍集合/数组
List<Person> persons = new ArrayList<Person>(); 省略…. 页面中内容 <#list persons as p> ${p.id}/${p.name} </#list>
2.4 获得当前迭代的索引
List<Person> list = new ArrayList<Person>(); 获取当前选代的索引:<br/> <#list persons as p> ${p_index} </#list>
2.5 模板中判断条件
<#if 判断条件> <#else> </#if> 逻辑运算符(== != || &&)
2.6 日期类型格式化
默认格式
1:date
${cur_time?date}
2:datetime
${cur_time?datetime}
3:time
${cur_time?time}
自定义格式
${cur_time?string("yyyy-MM-dd HH:mm:ss")}
2.7 处理null值
root.put(“val”,null); 解决办法 1:null 变 空串 ${val!} ${val!"这里是空"} 2:为Null时给默认值 ${val!"我是默认值"} 3、时间类型判断为空
<#if curdate ??> 当前日期:${curdate?string("yyyy/MM/dd HH:mm:ss")} <#else> curdate属性为null </#if>
2.8 Include
将另一个页面引入本页面时可用以下命令完成 <#include "/include/head.html">
3、项目中使用freemarker
使用freemarker整合spring。把Configuration交给spring容器管理。
依赖的jar包:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>4.1.3.RELEASE</version> </dependency> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.23</version> </dependency>
3.1 Spring配置文件
在Spring中配置Configration对象
<bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"> <property name="templateLoaderPath" value="/WEB-INF/ftl/" /> <property name="defaultEncoding" value="UTF-8" /> </bean>
第一个参数是模板存放路径,第二个字符编码
3.2 静态文件生成的时机
1、当用户第一次访问时生成静态文件。不推荐使用。
原因:高并发的情况下,容易将不完整的静态页面传递给前台用户。
2、当后台添加、编辑商品时生成静态网页。
此时,需要前台系统发布服务,供后台系统调用,当后台添加或者修改商品时调用此服务。此时前台系统的功能就是生成静态页面。
3.3 整合代码
@Override public Result genItemHtml(Long itemId) throws Exception { //商品基本信息 TbItem tbItem = itemService.getItemById(itemId); //商品描述 String itemDesc = itemService.getItemDescById(itemId); //规格参数 String itemParam = itemService.getItemParamById(itemId); //生成静态页面 Configuration configuration = freeMarkerConfigurer.getConfiguration(); Template template = configuration.getTemplate("item.ftl"); //创建一个数据集 Map root = new HashMap<>(); //向数据集中添加属性 root.put("item", tbItem); root.put("itemDesc", itemDesc); root.put("itemParam", itemParam); //创建一个Writer对象 Writer out = new FileWriter(new File(STATIC_PAGE_PATH + itemId + ".html")); //生成静态文件 template.process(root, out); out.flush(); out.close();
return Result.ok();
}
3.4 访问配置
可以参考我之前写的
3.5 报错406问题
由于请求的url的后缀为.html,要求返回为一个字符串页面。所以报错
解决方法:不要使用*.html的后缀,配置多个servlet-mapping,拦截其他的后缀,如*.action
注:其实解决方案很多,本文写的这种是生成文件放在硬盘,使用http服务器访问静态文件。还有一种应用很广泛的解决方案,就是类似jsp的配置,实际就是配置一个视图解析器,流程和使用jsp一样,用户在请求这个页面时,将生成的静态页面直接呈现在用户面前,硬盘并不保存这个页面。
❤本博客只适用于研究学习为目的,大多为学习笔记,如有错误欢迎指正,如有误导敬请谅解(本人尽力保证90%的验证和10%的猜想)。
❤如果这篇文章对你有一点点的帮助请给一份推荐! 谢谢!你们的鼓励是我继续前进的动力。