使用freemarker生成静态html文件

一、引入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-freemarker</artifactId>
    <version>2.1.10.RELEASE</version>
</dependency>

二、yml配置


#freemarker相关配置属性
spring:
  freemarker:
    allow-request-override: false
    allow-session-override: false
    cache: true
    template_update_delay: 60000
    charset: UTF-8
    check-template-location: true
    content-type: text/html
    template-loader-path: classpath:/templet/
    suffix: .ftl
    enabled: true
    expose-spring-macro-helpers: true

在springboot yml文件中增加springboot的配置,其中template-loader-path的配置是freemarker文件的加载路径,suffix表示以.ftl结尾的文件。

三、在resources目录下创建一个ftl文件

在resources目录下创建一个templet目录,按照上一步配置的路径。
在目录下创建一个createHtml.ftl文件,这个就是我们要生成的静态html文件的模版,基本的freemarker语法,可以网上了解一下,这里贴部分样例


<#if list.futureList??>
		<li class="li_title"> <span bgcolor="#ff6600" align="center" style="width: 100%;"><span
		  style="color:#ffffff;"><strong>这里是个标题</strong></span></span>
		</li>
		<#list list.futureList as zst >
			<#assign isNew = (zst.isNew)?string('true','false') />
			<#assign isHot = (zst.isHot)?string('true','false') />
			<li class="li_list" onmouseover="this.style.backgroundColor='#F3F3F3'"
				onmouseout="this.style.backgroundColor='#ffffff'" style="background-color:#ffffff;" align="center"
				VerTypeID="${zst.verTypeIdStr}" AuthYear="${zst.userCrown}">
                <span><a href="${zst.gameWeb!}" target="_blank">${zst.groupName!}
			   <#if zst.isYellow=='1'>
				   <#if isNew='true'>
					   <img src="images/new.gif" class="hotpic" />
								<#else >
					   <img src="images/hot.gif" class="hotpic" />
				   </#if>
							<#elseif isNew='true'>
				   <img src="images/new.gif" class="hotpic" />
			   <#elseif isHot='true'>
				   <img src="images/hot.gif" class="hotpic" />
			   </#if>
			   <#if zst.userCrown gte 1>
				   <img title="${zst.userCrown}!" src="images/crown_${zst.userCrown}.png" />
			   </#if>
</a></span>
				<span title="██${zst.gameName}██" class="serverName" type="pcm"><a href="${zst.gameWeb!}"
																				   target="_blank">${zst.gameName}</a><img class='pc' src='https://image-storage.oss-cn-hangzhou.aliyuncs.com/image/zst/pc_m(2).png' border='0' style="width:17px; height:15px; left:137px;"/></span>
				<span style="color:red">${zst.startTime}</span>
				<span title="${zst.gameDesc}">${zst.gameDesc}</span>
				<span><a href="javascript:;"
						 onclick="StarGmae(this,'${zst.dlqDownAddr}','${zst.gameWeb!}','','','start')"
						 class="pn pnc" style="padding:5px;"><span>按钮</span></a></span>
				<span><a href="${zst.gameWeb!}" target="_blank" class="pn pnd" style="padding:5px;"
						 onclick="_czc.push(['_trackEvent',  '点击', '进入GM游戏官网', '游戏网站','5','dianji']);"><span>点击查看</span></a></span>
			</li>
		</#list>
	</#if>

接下来我们要做的就是如何把数据传进来。

四、往模版传入数据

/**
* freemarker配置 可以读取我们在yml中的配置,比如模版文件的路径,
*/
@Autowired
private FreeMarkerConfigurer freeMarkerConfigurer;

@Override
public boolean createHtml(String outputPath) {
    Configuration cfg = freeMarkerConfigurer.getConfiguration();
    Writer out = null;

    File file = new File(outputPath);
    try {
       // ZstServerBO bo=new ArrayList<>();
       // List<T> list = null; 这里是获取你要插入模版的数据

        cfg.setDefaultEncoding(StandardCharsets.UTF_8.name());
        Template template = cfg.getTemplate("createHtml.ftl");
        out = new OutputStreamWriter(new FileOutputStream(file), StandardCharsets.UTF_8);

//将数据放在map里,然后就会自动渲染模版,忘你制定的路径生成一个html文件
        Map<String, Object> map = new HashMap<>();
        map.put("zstlist", bo);
        map.put("verTypeList", list);
        template.process(map,out);
        logger.info("生成静态html,路径:{}",outputPath);
        return true;
    } catch (Exception e) {
        logger.error("生成html静态文件失败",e);

    }finally {
        if (out != null) {
            try {
                out.flush();
                out.close();
            } catch (IOException e) {
                logger.error("流关闭失败",e);
            }
        }

    }
    return false;
}




版权声明:本文为Soda_lw原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。