Java开发的模板引擎--freemarker

2023-11-06

一、基础知识

1.1 模版引擎

一种基于模版和要改变的数据,并用来生成输出文本(html、电子邮件、配置文件,源代码)的通用工具。他不是面向最终用户的,而是一个Java类库;

1.2 关于freemarker

freemarker是免费的,其模版编写为freemarker template language(FTL freemarker模版语言),属于简单的专用语言。需要准备数据在起真实编程语言中显示,例如数据库查询和业务运算、之后模版显示已经准备好的数据;而在模版中主要用户如何展现数据;
也就是说:模版(template)+数据(java object) ==freemarker==》作用下成为要的output

1.3 常用的java模版引擎

Jsp、freemarker、(Thymeleaf 、Velocity )

1.4 快速入门

1.4.1 指定了SpringBoot的版本

    <parent>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring‐boot‐starter‐parent</artifactId>
       <version>2.1.3.RELEASE</version>
</parent>

1.4.2 指定了pom.xml文件依赖

<dependencies>
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring‐boot‐starter‐freemarker</artifactId>
       </dependency>
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring‐boot‐starter‐web</artifactId>
       </dependency>
       <dependency>
           <groupId>org.projectlombok</groupId>
           <artifactId>lombok</artifactId>
       </dependency>
       <dependency>
           <groupId>com.squareup.okhttp3</groupId>
           <artifactId>okhttp</artifactId>
       </dependency>
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring‐boot‐starter‐test</artifactId>
       </dependency>
       <dependency>
           <groupId>org.apache.commons</groupId>
           <artifactId>commons‐io</artifactId>
       </dependency>

1.4.2 指定了配置文件application.yml

server:
	port: 8088 #服务端口 
	servlet:
       context‐path: /test‐freemarker
spring:
    application:
		name: test‐freemarker #指定服务名 
	freemarker:
        charset: UTF‐8
        content‐type: text/html
        suffix: .ftl
        enabled: true
        # 模版的加载路径
        template‐loader‐path: classpath:/templates/
	resources:
		add‐mappings: false #关闭工程中默认的资源处理
	mvc:
		throw‐exception‐if‐no‐handler‐found: true #出现错误时直接抛出异常

二、FreeMarker的基础指令

2.1 数据模型

Freemarker静态化依赖数据模型和模板,一般在方法中的形参map即为freemarker静态化所需要的数据模型,在map中填充数据;

注意:关于freemarker的指令需要知道

  1. 注释,即<#‐‐和‐‐>,介于其之间的内容会被freemarker忽略
  2. 插值(Interpolation):即 . . 部分 , f r e e m a r k e r 会用真实的值代替 {..}部分,freemarker会用真实的值代替 ..部分,freemarker会用真实的值代替{…}
  3. FTL指令:和HTML标记类似,名字前加#予以区分,Freemarker会解析标签中的表达式或逻辑。
  4. 文本,仅文本信息,这些不是freemarker的注释、插值、FTL指令的内容会被freemarker忽略解析,直接输出内 容。

2.2 关于数据模型map类型为中为List的指令

2.2.1 遍历数据模型map类型为中为list

<#list stus as stu>
<!--#list:表明是freemaker中的list指令-->
<!--stus:表示当前从数据模型中拿下来的数据为list类型的数据名字-->
<!--as stu:表示当前从数据模型中拿下来的数据为list类型的数据名为stus中每一项当作一个stu类型-->

2.2.1 取一个对象中的各个属性

			<tr>
				<!--_index:得到循环的下标,使用方法是在stu后边加"_index",它的值是从0开始-->
               <td>${stu_index + 1}</td>
               <!--通过对象加'.'取值-->
               <td>${stu.name}</td>
               <td>${stu.age}</td>
               <td>${stu.mondy}</td>
           </tr>

2.3 关于数据模型map类型为中为map的指令

2.3.1 关于获取数据类型map中类型为map中的莫一键的值

<!--方式一-->
<!--解释:-->
<!--先获取数据模型中key为stuMap的值,然后又因为这个值也是一个map集合,在此通过['key']获取到值的值,然后通过'.'就可以获取值的值中的对象对象了-->
${stuMap['stu1'].name}<br/>
<!--方式二-->
<!--解释:-->
<!--先获取数据模型中key为stuMap的值,然后又因为这个值也是一个map集合,在此通过.key获取到值的值,然后通过'.'就可以获取值的值中的对象对象了-->
${stuMap.stu1.name}<br/>

2.3.2 遍历数据模型map类型为中为map

<!--#list:表明是freemaker中的list指令,要遍历-->
<!--stuMap?keys:将数据模型中键为stuMap中的所有值作为keys集合-->
<!--as k:将数据模型中键为stuMap中的所有值作为keys集合 每一项为一个键k-->
<#list stuMap?keys as k>
	<tr>
		<!--这一项的索引加一-->
       <td>${k_index + 1}</td>
       <!--键为stuMap中k项的对象.属性一-->
       <td>${stuMap[k].name}</td>
       <td>${stuMap[k].age}</td>
       <td >${stuMap[k].mondy}</td>
   </tr>

2.4 部分操作指令

2.4.1 if指令

if 指令即判断指令,是常用的FTL指令,freemarker在解析时遇到if会进行判断,条件为真则输出if中间的内容,否则跳过内容不再输出。
demo:
<!--#if:表示是freemarker模版中的if指令-->
<!--如果name是小明-->
<#if stu.name =='小明'>

2.4.2 运算符指令

  1. 算数运算符 FreeMarker表达式中完全支持算术运算,FreeMarker支持的算术运算符包括:+, - , * , / , %
  2. 逻辑 运算符 逻辑运算符有如下几个: 逻辑与:&& 逻辑或:|| 逻辑非:! 逻辑运算符只能作用于布尔值,否则将产生错误
  3. 比较运算符 表达式中支持的比较运算符有如下几个:
    1. =或者==:判断两个值是否相等.
    2. !=:判断两个值是否不等.
    3. 或者gt:判断左边值是否大于右边值

    4. =或者gte:判断左边值是否大于等于右边值

    5. <或者lt:判断左边值是否小于右 边值
    6. <=或者lte:判断左边值是否小于等于右边值
      关于运算符的注意点
      注意: =和!=:可以用于字符串,数值和日期来比较是否相等,但**=和!=两边必须是相同类型的值**,否则会产生错误,而且 FreeMarker是精确比较,“x”,"x ","X"是不等的.其它的运行符可以作用于数字和日期,但不能作用于字符串,大部分的时 候,使用gt等字母运算符代替>会有更好的效果,因为 FreeMarker会把**>解释成FTL标签的结束字符**,当然,也可以使用括 号来避免这种情况,如:<#if (x>y)>

2.4.2 null值处理指令

  1. 判断某变量是否存在使用 “??” 用法为:variable??,如果该变量存在,返回true,否则返回false
    demo: <#if stus??>
  2. 缺失变量默认值使用 “!” 使用!要以指定一个默认值,当变量为空时显示默认值
    demo:${name!‘’}表示如果name为空显示空字符串
    如果是嵌套对象则建议使用()括起来。
    例: ${(stu.bestFriend.name)!‘’}表示,如果stu或bestFriend或name为空默认显示空字符串。

2.5 关于FreeMarker的内置对象

在freemarker中可以访问Request、Session等内置对象
Request: 用于获取Request对象中的attribute对象。
Session:用于获取Session对象中的attribute对象。
RequestParameters:用于获取Request对象的parameter参数(浏览器端发送的请求数据)
注意
使用内置对象需要先暴露内置对象==》通过配置文件

spring:
	freemarker:
		request‐context‐attribute: rc #把Spring的RequestContext对象暴露为变量rc 
		expose‐request‐attributes: true
		expose‐session‐attributes: true

三级目录

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java开发的模板引擎--freemarker 的相关文章

  • Java 中等效的并行扩展

    我在 Net 开发中使用并行扩展有一些经验 但我正在考虑在 Java 中做一些工作 这些工作将受益于易于使用的并行库 JVM 是否提供任何与并行扩展类似的工具 您应该熟悉java util concurrent http java sun
  • 如何为最终用户方便地启动Java GUI程序

    用户想要从以下位置启动 Java GUI 应用程序Windows 以及一些额外的 JVM 参数 例如 javaw Djava util logging config file logging properties jar MyGUI jar
  • 如何使用 Java 和 Selenium WebDriver 在 C 目录中创建文件夹并需要将屏幕截图保存在该目录中?

    目前正在与硒网络驱动程序和代码Java 我有一种情况 我需要在 C 目录中创建一个文件夹 并在该文件夹中创建我通过 selenium Web 驱动程序代码拍摄的屏幕截图 它需要存储在带有时间戳的文件夹中 如果我每天按计划运行脚本 所有屏幕截
  • Play框架运行应用程序问题

    每当我尝试运行使用以下命令创建的新 Web 应用程序时 我都会收到以下错误Play http www playframework org Error occurred during initialization of VM Could no
  • Java JDBC:更改表

    我希望对此表进行以下修改 添加 状态列 varchar 20 日期列 时间戳 我不确定该怎么做 String createTable Create table aircraft aircraftNumber int airLineCompa
  • Final字段的线程安全

    假设我有一个 JavaBeanUser这是从另一个线程更新的 如下所示 public class A private final User user public A User user this user user public void
  • Android:捕获的图像未显示在图库中(媒体扫描仪意图不起作用)

    我遇到以下问题 我正在开发一个应用程序 用户可以在其中拍照 附加到帖子中 并将图片保存到外部存储中 我希望这张照片也显示在图片库中 并且我正在使用媒体扫描仪意图 但它似乎不起作用 我在编写代码时遵循官方的Android开发人员指南 所以我不
  • 反射找不到对象子类型

    我试图通过使用反射来获取包中的所有类 当我使用具体类的代码 本例中为 A 时 它可以工作并打印子类信息 B 扩展 A 因此它打印 B 信息 但是当我将它与对象类一起使用时 它不起作用 我该如何修复它 这段代码的工作原理 Reflection
  • 操作错误不会显示在 JSP 上

    我尝试在 Action 类中添加操作错误并将其打印在 JSP 页面上 当发生异常时 它将进入 catch 块并在控制台中打印 插入异常时出错 请联系管理员 在 catch 块中 我添加了它addActionError 我尝试在jsp页面中打
  • Spring Data JPA 应用排序、分页以及 where 子句

    我目前正在使用 Spring JPA 并利用此处所述的排序和分页 如何通过Spring data JPA通过排序和可分页查询数据 https stackoverflow com questions 10527124 how to query
  • 斯坦福 NLP - 处理文件列表时 OpenIE 内存不足

    我正在尝试使用斯坦福 CoreNLP 中的 OpenIE 工具从多个文件中提取信息 当多个文件 而不是一个 传递到输入时 它会给出内存不足错误 All files have been queued awaiting termination
  • Java按日期升序对列表对象进行排序[重复]

    这个问题在这里已经有答案了 我想按一个参数对对象列表进行排序 其日期格式为 YYYY MM DD HH mm 按升序排列 我找不到正确的解决方案 在 python 中使用 lambda 很容易对其进行排序 但在 Java 中我遇到了问题 f
  • getResourceAsStream() 可以找到 jar 文件之外的文件吗?

    我正在开发一个应用程序 该应用程序使用一个加载配置文件的库 InputStream in getClass getResourceAsStream resource 然后我的应用程序打包在一个 jar文件 如果resource是在里面 ja
  • 如何在控制器、服务和存储库模式中使用 DTO

    我正在遵循控制器 服务和存储库模式 我只是想知道 DTO 在哪里出现 控制器应该只接收 DTO 吗 我的理解是您不希望外界了解底层域模型 从领域模型到 DTO 的转换应该发生在控制器层还是服务层 在今天使用 Spring MVC 和交互式
  • 仅将 char[] 的一部分复制到 String 中

    我有一个数组 char ch 我的问题如下 如何将 ch 2 到 ch 7 的值合并到字符串中 我想在不循环 char 数组的情况下实现这一点 有什么建议么 感谢您花时间回答我的问题 Use new String value offset
  • 无法捆绑适用于 Mac 的 Java 应用程序 1.8

    我正在尝试将我的 Java 应用程序导出到 Mac 该应用程序基于编译器合规级别 1 7 我尝试了不同的方法来捆绑应用程序 1 日食 我可以用来在 Eclipse 上导出的最新 JVM 版本是 1 6 2 马文 看来Maven上也存在同样的
  • 如何从指定日期获取上周五的日期? [复制]

    这个问题在这里已经有答案了 如何找出上一个 上一个 星期五 或指定日期的任何其他日期的日期 public getDateOnDay Date date String dayName 我不会给出答案 先自己尝试一下 但是 也许这些提示可以帮助
  • Java列表的线程安全

    我有一个列表 它将在线程安全上下文或非线程安全上下文中使用 究竟会是哪一个 无法提前确定 在这种特殊情况下 每当列表进入非线程安全上下文时 我都会使用它来包装它 Collections synchronizedList 但如果不进入非线程安
  • 有没有办法为Java的字符集名称添加别名

    我收到一个异常 埋藏在第 3 方库中 消息如下 java io UnsupportedEncodingException BIG 5 我认为发生这种情况是因为 Java 没有定义这个名称java nio charset Charset Ch
  • 如何修复 JNLP 应用程序中的“缺少代码库、权限和应用程序名称清单属性”?

    随着最近的 Java 更新 许多人都遇到了缺少 Java Web Start 应用程序的问题Codebase Permissions and Application name体现属性 尽管有资源可以帮助您完成此任务 但我找不到任何资源综合的

随机推荐

  • telnet无效指令,telnet找不到命令

    在命令提示符下运行telnet 提示 telnet既不是内部命令 也不是可执行程序或批处理文件 telnet如何解决而不是内部或外部命令 实际上 在Windows7系统环境中 Telnet客户端缺省处于关闭状态 更改设定的步骤如下 1 单击
  • MySQL基础(四)----DCL

    目录 一 介绍 二 主要命令 2 1 GRANT 授权 2 1 1 对数据库授权 2 1 2 对数据库下某表的权限 2 2 REVOKE 撤销权限 2 3 DENY 拒绝权限 三 其他命令 拓展 3 1 CREATE LOGIN 创建登录名
  • matlab小波分解及小波包分解函数

    Wavelet Toolbox GUI Graphical User Interface waveletAnalyzer Start Wavelet Analyzer graphical user interface tools Wavel
  • JVM内存模型,栈,本地方法栈,程序计数器,堆,方法区,详细讲解

    1 栈 线程不共享 栈又称方法栈 线程私有的 线程执行方法是都会创建一个栈阵 用来存储局部变量表 操作栈 动态链接 方法出口等信息 调用方法时执行入栈 方法返回式执行出栈 在方法中声明的变量可以是基本类型的变量 也可以是引用类型的变量 1
  • JAVA-反射篇

    反射 一 反射是什么 二 反射的用处 三 如何使用反射 0 反射判断类型 1 反射相关类 2 通过反射获取类三种方式 3 通过Class字节码对象操作字节码文件 3 1 使用Class字节码对象实例化对象 3 2 反射获取类的修饰符 3 3
  • Qt 遍历 QTreeView 获取所有节点数据

    实现代码 model 为私有变量 QStandardItemModel model void ParamSettingDlg GetNode for int i 0 i lt model gt rowCount i QStandardIte
  • react---ant design pro----修改logo和title

    1 内容页的logo和tittle修改入口 如果想要直接干掉logo 需要在App tsx里面写这个 logo false 2 网页左边的logo和tittle修改入口 直接修改 地址 提前放好图片文件在public里面
  • WTL配置

    上几天下了一个VC 程序 使用VS2008打开直接编译 提示 fatal error C1083 无法打开包含文件 atlapp h No such file or directory 上网查了一下 说是没有配置第三方WTL库 WTL是什么
  • 基于docker安装gitlab

    采用docker镜像安装GitLab 3 2 1 简介 官网 https github com sameersbn docker gitlab 7 4 3之前版本 镜像里包含所有组件 7 4 3版本镜像里只包含核心组件 nginx sshd
  • 记一次生产环境踩过的坑

    欢迎访问个人博客 德鲁大叔撸代码 今天 自己负责开发的对账系统终于要上线了 激动又紧张 激动什么 完全个人开发的项目第一次走上线流程 甚是激动啊 紧张什么 对呀 就是因为第一次上线 所以怕出现什么不可预测的问题 毕竟公司会把上线成功率当做有
  • C语言-控制程序的输入输出并设置参数

    一 控制程序的输入输出c语言编写的小工具 操作系统会为其分配三条数据流 一个标准输入 一个标准输出 一个标准错误输出 1 用户也可以通过编写代码控制输入输出的数据流数量2 用户可通过操作系统的命令设置输入输出目标是屏幕还是文件 是键盘还是文
  • mysql分别获取已有数据date中的年月日

    感谢原问题回答者的分享 https zhidao baidu com question 217376525 html mysql数据库 test表中有一字段Date 类型为date 已有数据 如何分别获取其中的年 月 日 不是获得当前日期哦
  • ArcGIS小技术 —— 修改字段顺序的三种方法

    修改字段顺序的四种方法 数据字段如下 方法一 合并 方法二 追加 方法三 删除并按顺序重新创建字段 数据字段如下 方法一 合并 使用合并工具调整字段顺序 方法二 追加 1 创建一个新的数据 并且按照想要的顺序添加好字段 2 使用 追加 工具
  • 采用face_recognition进行人脸识别时,解决摄像头太远人脸太小导致无法检测的问题

    经测试发现 把图像resise放大后再进行人脸识别 可以识别出非常小的人脸区域 以上相片站在10米开外 分辨率300万的笔记本电脑上都可以识别 不过处理速度非常的慢 很卡 不知道换1080TI或者以上显卡能否提高效率 本来离摄像头不到1米的
  • 用ESP学习单片机之Arduino_Esp-32s获取2.8‘‘TFT LCD屏幕的触摸数据_ILI9341_SPI_XPT2046

    简介 点亮该屏幕的笔记 既然都能显示了 肯定要获取触摸位置啊 从实物图中可知该屏幕的触摸IC为XPT2046 Arduino IDE需配置esp32开发环境 开发板 ESP 32 触摸过程 这里实现的是触摸屏幕获取坐标 IO映射 TFT L
  • 医学知识-CT的窗宽窗位

    CT的窗技术 窗技术是CT检查中用以观察不同密度的正常组织或病变的一种显示技术 包括窗宽 window width 和窗位 window level 由于各种组织结构或病变具有不同的CT值 因此欲显示某一组织结构细节时 应选择适合观察该组织
  • 为什么软件开发很难?真相了

    为什么软件开发很难 真相了 作者 Jeremy Mikkol 本文认为这种困难与编程语言无关 因为现代的编程语言已经足够好了 那么 原因到底是什么 有一种观点认为 使用更好的编程语言就会让软件开发变得更容易 更高效 在汇编或 Fortran
  • vue ajax异步提交文件,vue中用ajax上传文件

    直接上代码 uploadCompany function event this file event target files let formdata new FormData formdata append file this file
  • 深度学习中常用的Adam算法

    一 Adam算法 Adam Adaptive momentum 是一种自适应动量的随机优化方法 A method for stochastic optimization 经常作为深度学习中的优化器算法 二 算法详细步骤 引用 三 Adam优
  • Java开发的模板引擎--freemarker

    模板引擎 freemarker 一 基础知识 1 1 模版引擎 1 2 关于freemarker 1 3 常用的java模版引擎 1 4 快速入门 1 4 1 指定了SpringBoot的版本 1 4 2 指定了pom xml文件依赖 1