JAVA网络爬虫
HttpClient

导航

 

SpringBoot静态化FreeMarker

项目结构图

在这里插入图片描述

配置文件

  1. 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>
    
  2. application.yml

    server:
      port: 8088 #服务端口
    spring:
      application:
        name: test‐freemarker #指定服务名
      freemarker:
        cache: false #关闭模板缓存,方便测试
        settings:
          template_update_delay: 0 #检查模板更新延迟时间,设置为0表示立即检查,如果时间大于0会有缓存不方便 进行模板测试
    
  3. 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>
    

实体类

  1. 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;//最好的朋友
    
    }
    

测试

  1. 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;
        }
    
    }
    
posted on 2020-11-01 17:00  gmlgxx  阅读(48)  评论(0)    收藏  举报