一、freemarker 介绍
目录
FreeMarker 是一款 模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本 (HTML 网页,电子邮件,配置文件,源代码等) 的通用工具。 它不是面向最终用户的,而是一个 Java 类库,是一款程序员可以嵌入他们所开发产品的组件。模板编写为FreeMarker Template Language (FTL) 。它是简单的,专用的语言, 不是 像 PHP 那样成熟的编程语言。 那就意味着要准备数据在真实编程语言中来显示,比如数据库查询和业务运算, 之后模板显示已经准备好的数据。在模板中,你可以专注于如何展现数据, 而在模板之外可以专注于要展示什么数据。
常用的 java 模板引擎还有哪些?Jsp、Freemarker、Thymeleaf 、Velocity 等。
- 1.Jsp 为 Servlet 专用,不能单独进行使用。
- 2.Thymeleaf 为新技术,功能较为强大,但是执行的效率比较低。
- 3.Velocity从2010年更新完 2.0 版本后,便没有在更新。Spring Boot 官方在 1.4 版本后对此也不在支持,虽然 Velocity 在 2017 年版本得到迭代,但为时已晚。
二、环境搭建&&快速入门
freemarker 作为 springmvc 一种视图格式,默认情况下 SpringMVC 支持 freemarker 视图格式。需要创建 Spring Boot+Freemarker 工程用于测试模板。
1. 创建测试工程
创建一个 freemarker-demo 的测试工程专门用于 freemarker 的功能测试与模板的测试。pom.xml 如下
<properties> <maven.compiler.source>8</maven.compiler.source> <maven.compiler.target>8</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-freemarker</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </dependency> <!-- lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <!-- apache 对 java io 的封装工具库 --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-io</artifactId> <version>1.3.2</version> </dependency> </dependencies>
2. 配置文件
配置application.yml
server: port: 8881 #服务端口 spring: application: name: freemarker-demo #指定服务名 freemarker: cache: false #关闭模板缓存,方便测试 settings: template_update_delay: 0 #检查模板更新延迟时间,设置为0表示立即检查,如果时间大于0会有缓存不方便进行模板测试 suffix: .ftl #指定Freemarker模板文件的后缀名 template-loader-path: classpath:/templates
3. 创建模型类
在freemarker的测试工程下创建模型类型用于测试
@Data public class Student { private String name;//姓名 private int age;//年龄 private Date birthday;//生日 private Float money;//钱包 }
4. 创建模板
在 resources 下创建 templates ,此目录为 freemarker 的默认模板存放目录。在 templates 下创建模板文件 01-basic.ftl ,模板中的插值表达式最终会被 freemarker 替换成具体的数据。<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Hello World!</title> </head> <body> <b>普通文本 String 展示:</b><br><br> Hello ${name!} <br> <hr> <b>对象Student中的数据展示:</b><br/> 姓名:${(stu.name)!}<br/> 年龄:${stu.age} <hr> </body> </html>
5. 创建controller
创建Controller类,向Map中添加name,最后返回模板文件。
@Controller public class HelloController { @GetMapping("/basic") public String hello(Model model){ //name model.addAttribute("name","freemarker"); //stu Student student = new Student(); student.setName("zkt"); student.setAge(18); model.addAttribute("stu",student); return "01-basic"; } }
6. 创建启动类
@SpringBootApplication public class FreemarkerDemoApplication { public static void main(String[] args) { SpringApplication.run(FreemarkerDemoApplication.class,args); } }
7. 测试
请求:http://localhost:8881/basic
三、静态化测试
之前的测试都是SpringMVC 将 Freemarker 作为视图解析器( ViewReporter )来集成到项目中,工作中,有的时候需要使用Freemarker 原生 Api 来生成静态内容,下面一起来学习下原生 Api 生成文本文件。
1. 需求分析
使用 freemarker 原生 Api 将页面生成 html 文件,本节测试 html 文件生成的方法:![]()
2. 静态化测试
根据模板文件生成 html 文件①:修改 application.yml 文件,添加以下模板存放位置的配置信息,完整配置如下:同上 ②:在 test 下创建测试类server: port: 8881 #服务端口 spring: application: name: freemarker-demo #指定服务名 freemarker: cache: false #关闭模板缓存,方便测试 settings: template_update_delay: 0 #检查模板更新延迟时间,设置为0表示立即检查,如果时间大于0会有缓存不方便进行模板测试 suffix: .ftl #指定Freemarker模板文件的后缀名 template-loader-path: classpath:/templates
②:在test下创建测试类
@SpringBootTest(classes = FreemarkerDemoApplication.class) @RunWith(SpringRunner.class) public class FreemarkerTest { @Autowired private Configuration configuration; @Test public void test() throws IOException, TemplateException { //freemarker的模板对象,获取模板 Template template = configuration.getTemplate("02-list.ftl"); Map params = getData(); //合成 //第一个参数 数据模型 //第二个参数 输出流 template.process(params, new FileWriter("D:\\work\\list.html")); } private Map getData() { Map<String, Object> map = new HashMap<>(); //zkt1对象模型数据 Student stu1 = new Student(); stu1.setName("zkt1"); stu1.setAge(18); stu1.setMoney(1000.86f); stu1.setBirthday(new Date()); //zkt2对象模型数据 Student stu2 = new Student(); stu2.setName("zkt2"); stu2.setMoney(200.1f); stu2.setAge(19); //将两个对象模型数据存放到List集合中 List<Student> stus = new ArrayList<>(); stus.add(stu1); stus.add(stu2); //向map中存放List集合数据 map.put("stus", stus); //返回Map return map; } }