当前位置: 首页 > news >正文

Freemarker-语法笔记

如果想要运行本文示例,则先应该做好这篇文章的前提:Freemarker-本地硬编码的方式使用

首先我们定义一个类,名字叫User,这个类作为本文的前提

public class User {private String name;private int age;private boolean isHuman;// 为了排版省略get/set,但是你要注意你不能省略,或者使用lombok
}

语法糖

  • 示例1:显示单个User
  • 示例2:循环List\<User>
  • 示例2:判断List中最后一个元素
  • 示例3:判断true还是false
  • 示例4:处理#或者其他关键符号开头的文本

示例1:显示单个User

JAVA文件

public static void main(String[] args) throws Exception {Configuration cfg = new Configuration(new Version("2.3.31"));String fileName = "fremk.ftl";String templateFilePath = System.getProperty("user.home") + File.separator + "Desktop" + File.separator + "fremk.ftl";cfg.setDirectoryForTemplateLoading(new File(templateFilePath).getParentFile());cfg.setDefaultEncoding("UTF-8");Template template = cfg.getTemplate(fileName);// ==============设置modelUser user = new User();user.setName("兔二抱");user.setAge(3);StringWriter out = new StringWriter();template.process(user, out);// 此处标准做法其实是将user放到一个map中,不过这次是代码演示// ==============System.out.println(out);// 这里会打印出“你好,我是兔二抱”
}

FTL文件

你好,我是${name},我${age}岁了

示例2:循环List<User>

JAVA文件

// ==============设置model
Map<String, Object> model = new HashMap<>();
List<User> users = new ArrayList<>();
User u1 = new User();
u1.setName("兔二抱");
u1.setAge(3);
User u2 = new User();
u2.setName("兔三抱");
u2.setAge(3);
users.add(u1);
users.add(u2);
model.put("users", users);
StringWriter out = new StringWriter();
template.process(model, out);// 此处需要将users放到一个map中,这也是标准做法
// ==============

FTL文件

<#list users as user><li>${user.name}</li><#-- 注意,这里的li是html标签,不是freemarker的标签 -->
</#list>

注意:使用一个 Map 来作为根数据模型更加灵活,因为它可以同时包含多个不同类型的数据,包括列表、单个对象和其他值。也就是说template.process方法的第一个参数,强烈推荐使用Map作为参数

示例2:判断List中最后一个元素

下面的例子会打印兔二抱,兔三抱,注意"兔三抱"后面没有逗号
FTL文件如下

<#list users as user>${user.name}<#-- has_next是freemarker的关键字,用来判断是否有下一个元素 --><#if user?has_next>,</#if>
</#list>

示例3:判断true还是false

下面的例子会打印是人类
JAVA文件

// ==============设置model
User user = new User();
user.setHuman(true);
StringWriter out = new StringWriter();
template.process(user, out);// 为了演示,直接把user扔里,所以没用map再包一层
// ==============

FTL文件如下

<#-- 注意这里不是isHuman,这与freemarker没有关系,java bean规范如下 -->
<#-- is开头的基本数据类型boolean最终去掉is -->
<#-- is开头的封装数据类型Boolean是不会去掉is的 -->
<#-- 如果java代码用map又包一层,比如map.put("aaa",user),则if里应该是aaa.human -->
<#if human>是人类
<#else>	不是人类	
</#if>

示例4:处理#或者其他关键符号开头的文本

#是freemarker的关键标识符,所以如果想在模板处理之后显示#,那就需要特殊处理,例如java代码有String name=“兔二抱”,而我也想最终在页面上显示#{兔二抱},那么#{${name}}这么写是不行的,需要如下写法才行
JAVA文件

String name = "兔二抱"; 

FTL文件

<#--写法1:在${}内部解析name并且在内部用字符串拼接"#{""}" -->
${"#{"+name+"}"} 
<#--写法2:使用Assign关键字定义一个freemarker变量来存储井号和左大括号字符串 -->
<#assign aaa="#{"/>
${aaa}name}

http://www.mrgr.cn/news/83270.html

相关文章:

  • Python Pandas(3):DataFrame
  • DeepSeeek如何在Window本地部署
  • 22.[前端开发]Day22-CSS单位-CSS预处理器-移动端视口
  • Level DB --- Iterator
  • 洛谷P2127序列排序 思考与解答
  • 学JDBC 第二日
  • 单例模式-如何保证全局唯一性?
  • 前端前置知识
  • Scala分布式语言二(基础功能搭建、面向对象基础、面向对象高级、异常、集合)
  • 【阅读笔记】消化内镜入门及规范操作
  • vue video重复视频 设置 srcObject 视频流不占用资源 减少资源浪费
  • Leetcode 221. 最大正方形 动态规划
  • MiniFilter文件过滤
  • 静态路由配置与调试——计算机网络实训day1
  • [QCustomPlot] 交互示例 Interaction Example
  • SAP-FICO 标准价格与移动平均价格
  • NLP中常见的分词算法(BPE、WordPiece、Unigram、SentencePiece)
  • 音频数据增强:提升音频信号质量的多种技术
  • Open WebUI 与 AnythingLLM 安装部署
  • Docker compose 使用 --force-recreate --no-recreate 控制重启容器时的行为
  • Python 的网页自动化工具 DrissionPage 介绍
  • 互联网架构变迁:从 TCP/IP “呼叫” 到 NDN “内容分发” 的逐浪之旅
  • 【没能解决】虚拟机不能进入图形界面问题
  • 安卓硬件加速hwui
  • js实现一个可以自动重链的websocket客户端
  • 【ASP.NET学习】ASP.NET MVC基本编程