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

freemark基础知识

前言:使用freemarker对应生成一个html文件,保存到磁盘,访问文件就不一定使用tomcat,可以使用nginx(http服务器)访问。可以使用freemaker工具生成。只生成一次,html静态页面是实实在在存在磁盘上了。

 

一、 什么是freemarker

FreeMarker是一个用Java语言编写的模板引擎,它基于模板来生成文本输出。FreeMarker与Web容器无关,即在Web运行时,它并不知道Servlet或HTTP。它不仅可以用作表现层的实现技术,而且还可以用于生成XML,JSP或Java 等。

 

二、 Freemarker的使用方法

第一步:把freemarker的jar包添加到工程中

第二步:freemarker的运行不依赖web容器,可以在java工程中运行。创建一个测试方法进行测试。

第三步:创建一个Configration对象

第四步:告诉config对象模板文件存放的路径。

第五步:设置config的默认字符集。一般是utf-8

第六步:从config对象中获得模板对象。需要指定一个模板文件的名字。

第七步:创建模板需要的数据集。数据集可以是一个map对象也可以是一个pojo,把模板需要的数据都放入数据集。

第八步:创建一个Writer对象,指定生成的文件保存的路径及文件名。

第九步:调用模板对象的process方法生成静态文件。需要两个参数数据集和writer对象。

第十步:关闭writer对象。

 代码实现(数据源)

public class FreeMarkerTest {

 

     @Test

     public void testFreeMarker() throws Exception {

         // 第一步:把freemarker的jar包添加到工程中

         // 第二步:freemarker的运行不依赖web容器,可以在java工程中运行。创建一个测试方法进行测试。

         // 第三步:创建一个Configuration对象

         Configuration configuration = new Configuration(Configuration.getVersion());

         // 第四步:告诉config对象模板文件存放的路径。

         configuration.setDirectoryForTemplateLoading(new File("D:\\workspaces-itcast\\JaveEE18\\taotao-portal\\src\\main\\webapp\\WEB-INF\\ftl"));

         // 第五步:设置config的默认字符集。一般是utf-8

         configuration.setDefaultEncoding("utf-8");

         // 第六步:从config对象中获得模板对象。需要制定一个模板文件的名字。

         Template template = configuration.getTemplate("first.ftl");

         // 第七步:创建模板需要的数据集。可以是一个map对象也可以是一个pojo,把模板需要的数据都放入数据集。

         Map root = new HashMap<>();

         root.put("hello", "hello freemarker");

         // 第八步:创建一个Writer对象,指定生成的文件保存的路径及文件名。

         Writer out = new FileWriter(new File("D:\\temp\\html\\hello.html"));

         // 第九步:调用模板对象的process方法生成静态文件。需要两个参数数据集和writer对象。

         template.process(root, out);

         // 第十步:关闭writer对象。

         out.flush();

         out.close();

     }

}

 

模板中的内容:

${hello}

 

三、Freemarker模板的写法

1、取简单数据类型数据

使用EL表达式。

${hello}

 

2、包装数据类型

模板:

<html>

<head>

      <title>${title}</title>

</head>

<body>

      <label>学号:</label>${student.id}<br>

      <label>姓名:</label>${student.name}<br>

      <label>住址:</label>${student.address}<br>

</body>

</html>

 

3、 历遍集合/数组

List<Person> persons = new ArrayList<Person>();

省略….

页面中内容 

<#list persons as p>   数据集(persons) 对象(p)

${p.id}/${p.name}

</#list>

 

4、 获得当前迭代的索引(循环中取下标)

List<Person> list = new ArrayList<Person>();

获取当前选代的索引:<br/>

<#list persons as p>

       ${p_index}     // p_index取下标

</#list>

 

5、 模板中判断条件

<#if 判断条件>

<#else>

</#if>

逻辑运算符(==   !=   ||   &&)

 

6、日期类型格式化

默认格式

1:date     生成的日期格式1

${cur_time?date}   ?date告诉freemarker要生成的日期格式

2:datetime    生成的日期格式2

${cur_time?datetime}

3:time        生成的日期格式3

${cur_time?time}

 自定义格式 

${cur_time?string("yyyy-MM-dd HH:mm:ss")} 

 

7、 处理null值

root.put(“val”,null);

 

解决办法

1:null 变空串

${val!}     ${val!"这里是空"}    !后面是默认值 加上!可以处理title为空值的情况 为了日后能理解  可以使用“”,在里面添加说明文字

2:为Null时给默认值

${val!“我是默认值"}

 

3、如果日期为空<#if curdate ??>      ??代表满足的情况下

       当前日期:${curdate?string("yyyy/MM/dd HH:mm:ss")}

       <#else>

       curdate属性为null

       </#if>

 8、Include

将另一个页面引入本页面时可用以下命令完成,.ftl并不是必须的,只要能把文件引入就行,这样显规范

 <#include "/include/head.html">

 

三、项目中使用freemarker

使用freemarker整合spring。把Configuration交给spring容器管理。

依赖的jar包:

<dependency>

       <groupId>org.springframework</groupId>

       <artifactId>spring-context-support</artifactId>

       <version>4.1.3.RELEASE</version>

</dependency>

<dependency>

       <groupId>org.freemarker</groupId>

       <artifactId>freemarker</artifactId>

       <version>2.3.23</version>

</dependency>

 

1.2.1   Spring配置文件

<bean id="freemarkerConfig"

         class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">

         <property name="templateLoaderPath" value="/WEB-INF/ftl/" />

         <property name="defaultEncoding" value="UTF-8" />

     </bean>

转载于:https://www.cnblogs.com/kelly-one/p/7392283.html

相关文章:

  • avaweb(三十二)——JDBC学习入门
  • 希尔排序之C++实现(初级版)
  • 在linux中,如何增加、修改、删除、暂停和冻结用户名
  • 深入理解Java内存模型——volatile
  • js面试中长见的算法题(转载)
  • Mybatis避免出现语法错
  • 94)图片验证码
  • css的存在形式及优先级
  • Java学习3——java介绍
  • VS编译器问题总结
  • 软件工程进阶
  • lilntcode-508-摆动排序
  • [hdu2196]Computer树的直径
  • Android开发艺术探索
  • Java-网络编程 socket
  • Akka系列(七):Actor持久化之Akka persistence
  • django开发-定时任务的使用
  • HTTP 简介
  • mysql innodb 索引使用指南
  • scrapy学习之路4(itemloder的使用)
  • Terraform入门 - 3. 变更基础设施
  • ucore操作系统实验笔记 - 重新理解中断
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • Zsh 开发指南(第十四篇 文件读写)
  • 前端学习笔记之观察者模式
  • 设计模式(12)迭代器模式(讲解+应用)
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 仓管云——企业云erp功能有哪些?
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • #{} 和 ${}区别
  • #每日一题合集#牛客JZ23-JZ33
  • (11)MSP430F5529 定时器B
  • (16)Reactor的测试——响应式Spring的道法术器
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (4.10~4.16)
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (万字长文)Spring的核心知识尽揽其中
  • (一)eclipse Dynamic web project 工程目录以及文件路径问题
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • (转)项目管理杂谈-我所期望的新人
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • **PHP二维数组遍历时同时赋值
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .equals()到底是什么意思?
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET Core中Emit的使用
  • .Net 访问电子邮箱-LumiSoft.Net,好用
  • .net 前台table如何加一列下拉框_如何用Word编辑参考文献
  • .NET/C# 使用 SpanT 为字符串处理提升性能
  • .NET性能优化(文摘)
  • [AIGC 大数据基础]hive浅谈
  • [Android Pro] Notification的使用