FreeMarker HTML模板引擎

在真正的学习之前,应该明白这个一些前置的准备工作

1.Maven依赖
<dependency>  
    <groupId>org.freemarker</groupId>  
    <artifactId>freemarker</artifactId>  
    <version>2.3.31</version>  
</dependency>
2.fts后缀文件

该文件为html模板文件,定义了html最后是以什么格式渲染出来,本质上就是使用了占位符,class转递参数过来渲染再将整个源码回馈给class
![[Pasted image 20241229134917.png]]
这是一个最常见的且最简单的例子,其中
在这里插入图片描述

${key} 是一个键值对的体现,通过这个方式可以实现在html中占位以及获取到Key的操作、
<#list items as item><#list> 这个就跟python的写法差不多了,是一个循环,items是容器,item是迭代项

开始使用FreeMarker

1.配置FreeMarker
Configuration cfg = new Configuration(Configuration.VERSION_2_3_31); // 创建并配置版本号
cfg.setDirectoryForTemplateLoading(new File("src/main/java/org/example")); // 指定模板文件所在文件夹路径
cfg.setDefaultEncoding("UTF-8"); // 设置读取输出的默认编码
2.加载模板
Template template = cfg.getTemplate("template.ftl"); // 基于上面的文件夹路径中的模板文件
3.准备数据模型
Map<String, Object> data = new HashMap<>(); // 创建一个map来存储键值对数据,key对应模板中的key,最后在模板中放入的是Key读取的是值
data.put("title", "Example Website");
data.put("header", "Welcome to my website!");
data.put("content", "This is an example of a FreeMarker app.");
data.put("items", list.of("数据1","数据2")); // jdk9引入的新创建list的方式
4.处理模板
StringWriter out = new StringWriter(); //通常用于在内存中捕获和存储输出,用于存储模板处理后的输出
template.process(data, out); // 将数据模型和输出流传递给模板引擎,模板引擎将根据模板文件和数据模型生成HTML内容
String html = out.toString();// 到这步html输出的就是一个渲染好数据的的html模板代码
5.使用io流写入数据,创建html文件
BufferedWriter bw = new Buffered(new FileWriter("test.html"));
bw.write(html); // 利用直接写入字符串的特性
bw.close

完整代码

创建一个template.ftl文件

<#--html模板-->  
<!DOCTYPE html>  
<html>  
<head>  
    <meta charset="UTF-8">  
    <title>${title}</title>  
</head>  
<body>  
<h1>${header}</h1>  
<p>${content}</p>  
<ul>  
    <#list items as item>  
        <li>${item}</li>  
    </#list>  
</ul>  
<p>${aichat}</p>  
</body>  
</html>

在main方法执行

package org.example;  
  
import freemarker.template.Configuration;  
import freemarker.template.Template;  
import freemarker.template.TemplateException;  
  
import java.io.*;  
import java.util.HashMap;  
import java.util.Map;  
import java.util.*;  
  
public class Main {  
  
    public static void main(String[] args) {  
        Configuration cfg = new Configuration(Configuration.VERSION_2_3_31);  
        try {  
            cfg.setDirectoryForTemplateLoading(new File("src/main/java/org/example"));  
            cfg.setDefaultEncoding("UTF-8");  
            Template template = cfg.getTemplate("template.ftl");  
            Map<String, Object> data = new HashMap<>();  
            data.put("title", "Example Website");  
            data.put("header", "Welcome to my website!");  
            data.put("content", "This is an example of a FreeMarker app.");  
            data.put("items", List.of("数据1","数据2"));  
            StringWriter out = new StringWriter();  
            template.process(data, out);  
            String html = out.toString();  
  
            // io写入创建html文件  
            File file = new File("test.html");  
            BufferedWriter bw = new BufferedWriter(new FileWriter(file));  
            bw.write(html);  
            bw.close();  
        } catch (IOException | TemplateException e) {  
            e.printStackTrace();  
        } catch (InterruptedException e) {  
            throw new RuntimeException(e);  
        }  
    }  
  
}
一个非侵入式、不会破坏原来静态页面结构、可被浏览器正确显示的、格式良好的前端HTML模板引擎。彻底实现前后端分离,让后端专注业务的处理。 传统MVC开发模式,V层使用服务器端渲染。美工设计好静态HTML文件,交给后端工程师,需要转换成Jsp、Freemarker、Velocity等动态模板文件。这种模式有几个缺点 1、动态模板文件不能被浏览器解释、必须要运行在服务器中才能显示出效果 2、动态效果和静态效果分别存在不同文件,美工和后端工程师需要分别维护各自页面文件,其中一方需要修改页面,都需要通知另一方进行修改 3、页面数据不能分块加载、获取跨域数据比较麻烦 domTemplate.js 模板引擎是通过在标签中添加自定义属性,实现动态模板功能,当没有引入domTemplate脚本, 则自定义标签属性不会被浏览器解析,不会破坏原有静态效果,当引入domTemplate脚本,模板引擎回去解析这些标签属性, 并加载数据进行动态渲染。 下图:对比服务器页面渲染和使用domTemplate前端引擎开发流程 服务器端模板解析 domTemplate前端解析 用法 导入jquery.js或者zepto.js和domTemplate.js $(function () {  $.domTemplate.init(options); //可以通过selector指定根节点,默认根节点是body,表示从body开始,渲染整个页面  }); 或者解析某一个html片段。 $('selector').domTemplate(options); //渲染数据是通过h-model 自动去获取数据,也可以通过data指定全局数据 if条件标签 <div> <p h-if="{user.id==50}" h-text="用户ID等于50">xxx</p> <p>其他内容</p> <div> switch条件标签 <p h-switch="{user.id}"> <input type="text" h-case="20" h-val="{user.email}"/> <input type="text" h-case="60" h-val="拉拉"/> <input type="text" h-case="*" h-val="丽丽"/>  </p> each遍历标签 <p>遍历List例子</p> <ul> <li h-each= "user,userStat : {users}" h-text="{userStat.index 1}-{user.email}"> 李小璐</li> </ul> 自定义标签 $.domTemplate.registerTag('tagName',function(ctx,name,exp){ }); //tagName 是自定义标签名称,用时要加上前缀,如定义'test'标签,用时h-test="" 标签:domTemplate 分享 window._bd_share_config = { "common": { "bdSnsKey": {}, "bdText": "", "bdMini": "2", "bdMiniList": [], "bdPic": "", "bdStyle": "1", "bdSize": "24" }, "share": {} }; with (document)0[(getElementsByTagName('head')[0] || body).appendChild(createElement('script')).src = 'http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion=' ~(-new Date() / 36e5)];\r\n \r\n \r\n \r\n \r\n \u8f6f\u4ef6\u9996\u9875\r\n \u8f6f\u4ef6\u4e0b\u8f7d\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\nwindow.changyan.api.config({\r\nappid: 'cysXjLKDf', conf: 'prod_33c27aefa42004c9b2c12a759c851039' });
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值