SpringBoot静态化FreeMarker
项目结构图

配置文件
-
pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <parent> <artifactId>xc-framework-parent</artifactId> <groupId>com.xuecheng</groupId> <version>1.0-SNAPSHOT</version> <relativePath>../xc-framework-parent/pom.xml</relativePath> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>test-freemarker</artifactId> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- 导入模板引擎freemarker --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-freemarker</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <!-- http远程访问的 --> <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-io</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </dependency> </dependencies> </project> -
application.yml
server: port: 8088 #服务端口 spring: application: name: test‐freemarker #指定服务名 freemarker: cache: false #关闭模板缓存,方便测试 settings: template_update_delay: 0 #检查模板更新延迟时间,设置为0表示立即检查,如果时间大于0会有缓存不方便 进行模板测试 -
logback-spring.xml
<?xml version="1.0" encoding="UTF-8"?> <configuration> <!--定义日志文件的存储地址,使用绝对路径--> <property name="LOG_HOME" value="/Users/xiaoge/Downloads/CMSPROJECT/logs"/> <!-- Console 输出设置 --> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> <charset>utf8</charset> </encoder> </appender> <!-- 按照每天生成日志文件 --> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--日志文件输出的文件名--> <fileNamePattern>${LOG_HOME}/xc.%d{yyyy-MM-dd}.log</fileNamePattern> </rollingPolicy> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <!-- 异步输出 --> <appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender"> <!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 --> <discardingThreshold>0</discardingThreshold> <!-- 更改默认的队列的深度,该值会影响性能.默认值为256 --> <queueSize>512</queueSize> <!-- 添加附加的appender,最多只能添加一个 --> <appender-ref ref="FILE"/> </appender> <logger name="org.apache.ibatis.cache.decorators.LoggingCache" level="DEBUG" additivity="false"> <appender-ref ref="CONSOLE"/> </logger> <logger name="org.springframework.boot" level="DEBUG"/> <root level="info"> <!--<appender-ref ref="ASYNC"/>--> <appender-ref ref="FILE"/> <appender-ref ref="CONSOLE"/> </root> </configuration>
实体类
-
Student
package com.xuecheng.test.freemarker.model; import lombok.Data; import lombok.ToString; import java.util.Date; import java.util.List; /** * @Author: 潇哥 * @DateTime: 2020/10/31 下午3:29 * @Description: TODO */ @Data @ToString public class Student { private String name;//姓名 private int age;//年龄 private Date birthday;//生日 private Float money;//钱包 private List<Student> friends;//朋友列表 private Student bestFriend;//最好的朋友 }
测试
-
FreemarkerTest—(重点—静态化生成)
package com.xuecheng.test.freemarker; import com.xuecheng.test.freemarker.model.Student; import freemarker.cache.StringTemplateLoader; import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.TemplateException; import org.apache.commons.io.IOUtils; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.ui.freemarker.FreeMarkerTemplateUtils; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.*; /** * @Author: 潇哥 * @DateTime: 2020/10/31 下午5:12 * @Description: TODO */ @SpringBootTest @RunWith(SpringRunner.class) public class FreemarkerTest { /** * 测试静态化, 基于ftl模板文件生成html文件 */ @Test public void testGenerateHtml() throws IOException, TemplateException { // 定义配置类 Configuration configuration = new Configuration(Configuration.getVersion()); // 得到classpath的路径 String classpath = this.getClass().getResource("/").getPath(); // 定义模板路径 configuration.setDirectoryForTemplateLoading(new File(classpath + "/templates/")); // 获取模板文件内容 Template template = configuration.getTemplate("test1.ftl"); // 定义数据模型 Map map = getMap(); // 静态化 String content = FreeMarkerTemplateUtils.processTemplateIntoString(template, map); // 创建输出流 InputStream inputStream = IOUtils.toInputStream(content); FileOutputStream outputStream = new FileOutputStream(new File("/Users/xiaoge/IdeaProjects/xcEduService/test1.html")); // 输出文件 IOUtils.copy(inputStream, outputStream); // 关闭输出流 inputStream.close(); outputStream.close(); } /** * 基于模板文件的内容 (字符串) 生成html文件 */ @Test public void testGenerateHtmlByString() throws IOException, TemplateException { // 定义配置类 Configuration configuration = new Configuration(Configuration.getVersion()); // 定义模板 // 模板内容(字符串) // 模板内容, 这里测试时使用简单的字符串作为模板 String templateString = "" + "<html>\n" + " <head></head>\n" + " <body>\n" + " 名称:${name}\n" + " </body>\n" + "</html>"; // 使用模板加载器变为模板 StringTemplateLoader stringTemplateLoader = new StringTemplateLoader(); stringTemplateLoader.putTemplate("template", templateString); // 在配置中设置模板加速器 configuration.setTemplateLoader(stringTemplateLoader); // 获取模板的内容 Template template = configuration.getTemplate("template", "utf-8"); // 定义数据模型 Map map = getMap(); // 静态化 String content = FreeMarkerTemplateUtils.processTemplateIntoString(template, map); // 创建输出流 InputStream inputStream = IOUtils.toInputStream(content); FileOutputStream outputStream = new FileOutputStream(new File("/Users/xiaoge/IdeaProjects/xcEduService/test2.html")); // 输出文件 IOUtils.copy(inputStream, outputStream); // 关闭文件 inputStream.close(); outputStream.close(); } /** * 数据模型 */ public static Map getMap() { Map map = new HashMap(); // map就是freemarker模板所使用的数据 map.put("name", "潇哥"); Student stu1 = new Student(); stu1.setName("小明"); stu1.setAge(18); stu1.setMoney(1000.86f); stu1.setBirthday(new Date()); Student stu2 = new Student(); stu2.setName("小红"); stu2.setMoney(200.1f); stu2.setAge(19); stu2.setBirthday(new Date()); // 朋友列表 List<Student> friends = new ArrayList<>(); friends.add(stu1); // 给第二名学生设置朋友列表 stu2.setFriends(friends); // 给第二个学生设置最好的朋友 stu2.setBestFriend(stu1); List<Student> stus = new ArrayList<>(); stus.add(stu1); stus.add(stu2); // 将学生列表放在数据模型中 map.put("stus",stus); // 准备map数据 HashMap<String,Student> stuMap = new HashMap<>(); stuMap.put("stu1",stu1); stuMap.put("stu2",stu2); //向数据模型放数据 map.put("stu1",stu1); //向数据模型放map数据 map.put("stuMap",stuMap); map.put("point", 102920122); return map; } }
浙公网安备 33010602011771号