FreeMarker
什么是freemarker
FreeMarker是一个用Java语言编写的模板引擎,它基于模板来生成文本输出。FreeMarker与Web容器无关,即在Web运行时,它并不知道Servlet或HTTP。它不仅可以用作表现层的实现技术,而且还可以用于生成XML,JSP或Java 等。
目前企业中主要用Freemarker做静态页面或是页面展示
freemarker原理
freemarker的使用方法
首先,添加依赖
<!-- https://mvnrepository.com/artifact/org.freemarker/freemarker --> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.23</version> </dependency>
使用步骤:
首先需要创建一个模板文件:
模板内容:
如果之前没有在Eclipse中安装过相应的插件,会有弹窗提示安装插件,不过说实话,并没有什么用,很不智能......
然后先进行简单测试:
@Test public void testFreeMarker() throws Exception { // 创建一个模板文件 // 创建一个Configuration对象 Configuration configuration = new Configuration(Configuration.getVersion()); // 设置模板文件保存的目录 configuration.setDirectoryForTemplateLoading(new File("D:/WorkSpace/workspace/e3-item-web/src/main/webapp/WEB-INF/ftl/")); // 设置文件的编码格式,一般是utf-8 configuration.setDefaultEncoding("utf-8"); // 加载一个模板文件,创建一个模板对象 Template template = configuration.getTemplate("hello.ftl"); // 创建一个穆数据集,可以是pojo也可以是map,推荐使用map Map<String, String> data = new HashMap<>(); data.put("hello", "hello freemarker!"); // 创建一个Writer对象,指定输出文件的路径以及文件名 Writer out = new FileWriter(new File("E:/Temp/freemarker/hello.txt")); // 生成静态页面 template.process(data, out); // 关闭流 out.close(); }
执行之后,生成静态文件:
模板的常用语法
1.访问map中的key
这个很简单,和EL表达式差不多,就比如上面的${hello }
2.访问pojo中的属性
这个用法也是和EL表达式一样
模板:
运行效果:
3.取集合中的数据
用法:
<#list stuList as student>
学号:${student.id}
</#list>
需要两个参数,分别对应着<c:foreach>标签中的items和var
模板: 执行效果:
4.取循环中的下标
方法:
<#list stuList as student>
学号:${student.id},序号${student_index}
</#list>
效果:
5.判断
用法:
<#if stu_index % 2 == 0>
yyyyyy
<#else>
nnnnnn
</#if>
效果:
6.日期类型格式化
用法:
7.Null值的处理
对于Null值(不存在或为NULL),不进行处理在生成静态文件时就会报错。
两种处理方式:
8.include标签
方法:<#include “模板名称”>
需要注意的是,如果包含的模板中有需要数据的地方,也要将对应的数据放入数据集中。
9.格式化数值
对于数值,比如long型的数据,默认的格式是xx,xxx,xxx如果想将逗号分隔符去掉,需要在后面加一个?c 例:
<!-- Freemaker --> <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>
<strong class="price">${item.price?c }</strong>
这里只是介绍了几种常用的语法,具体的语法有很多,可以参看FreeMarker的官方文档。
FreeMarker整合Spring生成静态页面
第一步:引入依赖,整合spring需要的Jar和FreeMarker的Jar:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> </dependency> <!-- freemarker --> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> </dependency>
第二步:创建整合Spring的配置文件
<!-- Freemaker --> <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>
第三步:使用
@Controller public class HtmlGenController { @Autowired private FreeMarkerConfigurer freeMarkerConfigurer; //这里省略了后缀.html,所以访问的时候应该是127.0.0.1:8086/genhtml.html @RequestMapping("/genhtml") @ResponseBody public String genHtml() throws Exception { Configuration configuration = freeMarkerConfigurer.getConfiguration(); // 加载模板对象 Template template = configuration.getTemplate("student.ftl"); // 创建一个数据集 Map<String, Object> data = new HashMap<>(); // 向数据集中添加需要的所有数据,此处省略................................. // 指定文件输出路径以及文件名 Writer out = new FileWriter(new File("E:/Temp/freemarker/student.html")); // 输出文件 template.process(data, out); // 关闭流 out.close(); return "OK"; }}然后启动服务,访问127.0.0.1:8086/genhtml.html,就会生成对应的静态文件student.html
访问: