模板FreeMarker篇

一、FreeMarker 介绍

Freemarker是java的免费模板引擎,主要用于MVC中的view层,生成html展示数据给客户端,可以完全替代jsp。 FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写,模板中没有业务逻辑,外部java程序通过数据库操作等生成数据传入template中, 然后输出页面。它能够生成各种文本:HTML、XML、RTF、Java源代码等等,而且不需要Servlet环境,并且可以从任何源载入模板,如本地文件、数据库等等。

二、Spring Boot 集成Freemarker基本操作

2.1、先在pom.xml文件中引入依赖

<dependencies><!-- springBoot web的启动器 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- springBoot 引入freemarker的依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-freemarker</artifactId></dependency></dependencies>

2.2、FreeMarker模板资源默认路径:classpath:/templates/ ;想要详细了解配置的可以看源码FreeMarkerProperties 配置类

在 resources目录下新建一个templates的目录用于放Freemarker模板文件;Freemarker模板文件默认以.ftl后缀结尾

**templates :该目录是安全的;意味着该目录下的内容是不允许外界直接访问的。**

三、FreeMarker 学习入门引导示例

3.1、注释 :即<#–…-->格式不会输出

3.2、 插值(Interpolation):即${…}或者#{…}格式的部分,将使用数据模型中的部分替代输出

3.3、 FTL指令:FreeMarker指令,和HTML标记类似,名字前加#予以区分,不会输出。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>FreeMarker</title>
</head>
<body><#-- 注释部分 --><br><#-- 使用插值 --><h1>Welcome ${user} !</h1><u1><#-- 使用FTL指令 -->  <#list animals as being><li>${being} </li></#list></u1>
</body></html>
@Controller
public class FreemarkerController {private List<String> animals =new ArrayList<String>();{animals.add("Dog");animals.add("Cat");animals.add("Pig");animals.add("Tigger");}/*** ModelMap   和 Model  封装数据都可以*//* @RequestMapping(value="/ftl/freemarker")public String showFreemarker(ModelMap  modelMap ){modelMap.addAttribute("user", "losser");modelMap.put("animals", animals);return "animal";}*/@RequestMapping(value="/ftl/freemarker")public String showFreemarker(Model  modelMap ){modelMap.addAttribute("user", "losser");modelMap.addAttribute("animals", animals);return "animal";}}

四、FreeMarker 指令介绍

通过上面的小案例我们也体会到了FreeMarker的一些指令使用;博主这里就是单纯的讲解FreeMarker的一些使用,所以绝对是不会涉及到数据库还有Spring Boot的技术使用;这也是为了方便大家清楚的了解和参考,要不然光环境配置搭建就太过复杂繁琐了,一些用到的数据我会直接使用java方式构造虚拟

4.1、list 指令

定义

<#list nameList as names>    ${names}
</#list>

主要是进行迭代服务器端传递过来的List集合,name是list循环的时候取的一个循环变量.相关指令:

  • item_index:当前变量的索引值
  • item_has_next:是否存在下一个对象
  • break:跳出迭代
//遍历MAP
<#list map?keys as k><option value="${k}">${map[k]}</option>
</#list>

方式

1. 获取或者设置list相关信息
<#list animals as ani><!-- 获取list的size长度 --><div>${list?size}<div><!-- 获取list遍历中的下标序号 --><div>${ani_index}<div><!-- 遍历list的值 --><div>${ani.name}${ani.price}<div><!-- 是否是最后一个元素 --><#if !ani_has_next>${ani.name}</#if>
</#list>
2. list排序
//升序:sort_by()
<#list list?sort_by("字段") as x>
</#list>
//降序:sort_by()?reverse
<#list list?sort_by("字段")?reverse as x>
</#list>
3. list嵌套
<#list jsskList as jsskVO><#list kcList as kcVO><!-- kcVO里有编号和名称,而jsskVO里只有编号 --><#if kcVO.kch=jsskVO.kch> ${kcVO.kcm}</#if></#list>
</#list>

例子

测试对象类

package cn.com.qihang.bean;public class Student {private String name;private int age;private String sex;private String address;private String phone;public Student(String name, int age, String sex, String address, String phone) {super();this.name = name;this.age = age;this.sex = sex;this.address = address;this.phone = phone;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public String getPhone() {return phone;}public void setPhone(String phone) {this.phone = phone;}@Overridepublic String toString() {return "Student [name=" + name + ", age=" + age + ", sex=" + sex + ", address=" + address + ", phone=" + phone+ "]";}}

Controller访问类:这里提供了演示单一的String 集合和对象集合的数据

@Controller
public class QHListController {/*** String list* * @return*/public List<String> creatStrings() {List<String> nameList = new ArrayList<String>();nameList.add("刘青霞");nameList.add("张韶涵");nameList.add("宋祖英");nameList.add("李宇春");return nameList;}/*** 封装对象list* * @return*/public List<Student> creatData() {List<Student> students = Arrays.asList(new Student("张三丰", 26, "男", "湖北省武汉市武昌洪山区", "15107128499"),new Student("李雪", 20, "女", "湖北省武汉市武昌", "15107128499"),new Student("刘刘", 22, "男", "湖南省长沙市", "15107128499"),new Student("吴明", 21, "女", "广东省深圳市", "15107128499"));return students;}/*** String list* @param model* @return*/@GetMapping("/ftl/strlist")public String showStringList(Model model) {List<String> strings = creatStrings();model.addAttribute("strings", strings);return "qh_strlist";}/*** Object list* * @param modelMap* @return*/@RequestMapping(value = "/ftl/list")public String showList(ModelMap modelMap) {List<Student> students = creatData();// 参数传递方式一:// modelMap.addAttribute("students", students);// 参数传递方式二:modelMap.put("students", students);return "qh_list";}
}

qh_list.ftl模板

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>FreeMarker-list测试</title></head><body><#list students as student>姓名:${student.name}  性别:${student.sex}  年龄:${student.age}  地址:${student.address}  手机:${student.phone}<br/></#list></body>
</html>

qh_strlist模板

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title></title></head><body><#list strings as name>${name} </#list></body>
</html>

本地测试:http://localhost:8080/ftl/strlist

本地测试:http://localhost:8080/ftl/list

4.2、 if else指令详解

定义

<#if condition>...
<#elseif condition2>...
<#elseif condition3>...
<#else>...
</#if>
  1. condition,condition2等表达式将被计算成布尔值。
  2. elseif 和 else必须出现在if的内部,也就是说,在if的开始标签和结束标签之间。
  3. if中可以包含任意数量的elseif(包含0个),而且结束时else时可选的。

列子

Controller层访问方法

@Controller
public class QHListController {@GetMapping("/ftl/ifelse")public String showAge(Model model) {Student student = new Student("张君雅", 15, "女", "中国台湾", "1809090998");model.addAttribute(student);return "qh_ifelse";}
}

qh_ifelse.ftl模板

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title></title></head><body><#if student.age lt 12>  ${student.name}不是一个初中生  <#elseif student.age lt 15>  ${student.name}不是一个高中生  <#elseif student.age lt 18>  ${student.name}不是一个大学生  <#else>  ${student.name}是一个大学生  </#if></body>
</html>

本地测试:http://localhost:8080/ftl/ifelse

4.3、switch case指令详解

定义

<#switch value>
<#case refValue>...<#break>
<#case refValue>...<#break>
<#default>...
</#switch>
  1. switch(expr),其中expr只能是以下两种:
    a>枚举常量:内部是由整型或者字符类型实现
    b>整数表达式:整数表达式指的是基本类型int或者包装类Integer,也包括不同的长度整型,例如short。
  2. case后面接的可以是常量数值,也可以是常量计算式,但是不能使变量或者是带有变量的表达式。

例子

测试string使用对象

public class Being {private String type;private String size;public Being(String type, String size) {this.type = type;this.size = size;}public String getType() {return type;}public void setType(String type) {this.type = type;}public String getSize() {return size;}public void setSize(String size) {this.size = size;}@Overridepublic String toString() {return "Being [type=" + type + ", size=" + size + "]";}}

Controller访问方法

@Controller
public class QHListController {/*** String switch* @param model* @return*/@GetMapping("/ftl/switch")public String showSize(Model model) {//字符串方式Being being = new Being("土豆", "small");model.addAttribute(being);//数字方式model.addAttribute("x", 2);return "qh_switch";}}

qh_switch.ftl模板

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title></title></head><body><#-- 字符串用法 --><#switch being.size>  <#case "small">  This will be processed if it is small  <#break>  <#case "medium">  This will be processed if it is medium  <#break>  <#case "large">  This will be processed if it is large  <#break>  <#default>  This will be processed if it is neither  </#switch><br/><#-- 数字用法 --><#switch x>  <#case 1>  1  <#case 2>  2  <#default>  d  </#switch></body>
</html>

本地测试:http://localhost:8080/ftl/switch

4.4、list判断是否为空

freemarker中list判断是否为空一般有3种方式:

  1. <#if xx?exists>
  2. <#if xx??>
  3. <#if xx?default(“xxx”)>

例子

Controller访问方法

@Controller
public class QHListController {/*** String list* * @return*/public List<String> creatStrings() {List<String> nameList = new ArrayList<String>();nameList.add("刘青霞");nameList.add("张韶涵");nameList.add("宋祖英");nameList.add("李宇春");return nameList;}//用于测试list是否为空@GetMapping("/ftl/orglist")public String showList(Model model) {List<String> orglist = creatStrings();model.addAttribute("orglist", orglist);return "list_empty";}}

list_empty.ftl模板

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title></title></head><body><#if orglist?? && (orglist?size > 0) >list不为空<#else>list为空    </#if></body>
</html>

4.5、if 判断对象是否为空

freemarker中判断对象是否为空,一般有2种做法:

  1. 用if判断对象是否为空
    <#if obj??>不为空处理</#if>
    <#if obj?default(“xxx”)>
    obj如果为空则给obj复制xxx。

  2. 给对象赋默认值,避免空值
    使用${obj!‘xxx’}来避免对象为空的错误。如果obj为空,则obj=xxx

例子

Controller访问方法

@Controller
public class QHListController {/*** String list* * @return*/public List<String> creatStrings() {List<String> nameList = new ArrayList<String>();nameList.add("刘青霞");nameList.add("张韶涵");nameList.add("宋祖英");nameList.add("李宇春");return nameList;}//用于测试list是否为空@GetMapping("/ftl/orglist")public String showList(Model model) {List<String> orglist = creatStrings();model.addAttribute("orglist", orglist);return "list_empty";}}

list_empty.ftl模板

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title></title></head><body><#if orglist?? && (orglist?size > 0) >list不为空<#else>list为空    </#if><br /><#if obj??>obj不为空<#else>obj为空</#if>   </body>
</html>

本地测试:http://localhost:8080/ftl/orglist

未完待续。。。。。

SpringBoot整合模板FreeMarker篇相关推荐

  1. springboot整合layui + Freemarker

    一.新建Springboot工程 配置POM <dependencies><dependency><groupId>org.springframework.boot ...

  2. SpringBoot 整合模板引擎 Thymeleaf 页面跳转失败的解决方案

    1. 出错现象 我们知道 Thymeleaf 模板引擎规定的文件路劲应该是在 templates 目录下面的. 但是笔者在开发的过程中,满足了上述要求但是还是没能映射成功. 我们来看看 index.h ...

  3. springboot整合jd freemarker

    所有源码见我的资源  springcloud源码 1 pom.xml <dependency> <groupId>org.springframework.boot</gr ...

  4. 很详细的SpringBoot整合UEditor教程

    很详细的SpringBoot整合UEditor教程 2017年04月10日 20:27:21 小宝2333 阅读数:21529 版权声明:本文为博主原创文章,未经博主允许不得转载. https://b ...

  5. 玩转 SpringBoot 2 快速整合 | FreeMarker篇

    FreeMarker 介绍 Apache FreeMarker™是一个模板引擎:一个Java库,用于根据模板和更改数据生成文本输出(HTML网页,电子邮件,配置文件,源代码等).模板是用FreeMar ...

  6. 【模板引擎】Springboot整合ThymeleafThymeleaf基本语法

    Thymeleaf介绍 thymeleaf是一个XML/XHTML/HTML5模板引擎,可用于Web与非Web环境中的应用开发.它是一个开源的Java库,基于Apache License 2.0许可, ...

  7. SpringBoot中整合使用Freemarker

    场景 springboot不建议使用jsp,使用模板引擎,比如thymeleaf,velocity,freemarker. 项目搭建专栏: https://blog.csdn.net/BADAO_LI ...

  8. springboot整合视图层Thymeleaf、freemarker

    springboot整合视图层以thymeleaf和freemarker为例 1.整合Thymeleaf 主要配置application.properties #是否开启缓存,默认为true spri ...

  9. 「快学springboot」SpringBoot整合freeMark模板引擎

    前言 虽然现在流行前后端分离开发和部署,但是有时候还是需要用到服务端渲染页面的.比如:需要考虑到SEO优化等问题的时候,FreeMark其实还是很有作用的.本人的博客本来是用React开发的,但是后来 ...

最新文章

  1. Golang 笔记 1 基础、基本数据类型
  2. 年月跨度_预应力跨度国内第一!1850吨146米跨度钢结构整体拔高22米!
  3. 【PC工具】windows图片文字识别软件,天若OCR文字识别软件
  4. 空净厂商为何对“9颗星”认证趋之若鹜?
  5. ActivityGroup 实现分页和自定义标签(内有GridView的点击背景样式的改变方法)
  6. 玻璃体混浊研究中需要解决的问题(持续更新中)
  7. freetextbox java_FreeTextBox3.2.2下载及使用详解(图)
  8. [one day one question] safari缓存太厉害
  9. Gartner发布2022年政府行业重要业务趋势:数字化与创新、基础设施等
  10. UICollectionViewCell的设置间距
  11. 删除一个非空的无用表空间
  12. cassss服务未启动_systemd时代的服务管理
  13. Kubernetes 1.4安装后查看记录
  14. python基于base64模块实现图像数据编码处理、解码还原实践【解决解码数据损失问题】
  15. 安装Mercurial进行版本管理
  16. 38张史上最全的IT架构师技能图谱(高清版下载)
  17. 8cm等于多少像素_像素和厘米如何换算
  18. 利用ffmpeg将H264解码为RGB
  19. [论文总结] 科技论文英语写作笔记1
  20. 【论文翻译】Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks

热门文章

  1. 漫谈TCP新算法Elastic-TCP
  2. 电脑桌面没有wifi图标了导致连接不上网络,解决方法
  3. 数据分析报告,就该这么写
  4. firefly-rk3288开发板Linux驱动——LED驱动
  5. itx机箱尺寸_鞋盒大小的ITX机箱初体验 | FORMULA X1装机展示
  6. 教你去掉 U盘写保护
  7. Mybatis中mapper.xml中like模糊查询字符串,日期写法
  8. Application的启动流程
  9. Java执行引擎工作原理:方法调用
  10. String.length() 与 String.getBytes().length