SpringBoot整合模板FreeMarker篇
模板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>
- condition,condition2等表达式将被计算成布尔值。
- elseif 和 else必须出现在if的内部,也就是说,在if的开始标签和结束标签之间。
- 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>
- switch(expr),其中expr只能是以下两种:
a>枚举常量:内部是由整型或者字符类型实现
b>整数表达式:整数表达式指的是基本类型int或者包装类Integer,也包括不同的长度整型,例如short。 - 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种方式:
- <#if xx?exists>
- <#if xx??>
- <#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种做法:
用if判断对象是否为空
<#if obj??>不为空处理</#if>
<#if obj?default(“xxx”)>
obj如果为空则给obj复制xxx。给对象赋默认值,避免空值
使用${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篇相关推荐
- springboot整合layui + Freemarker
一.新建Springboot工程 配置POM <dependencies><dependency><groupId>org.springframework.boot ...
- SpringBoot 整合模板引擎 Thymeleaf 页面跳转失败的解决方案
1. 出错现象 我们知道 Thymeleaf 模板引擎规定的文件路劲应该是在 templates 目录下面的. 但是笔者在开发的过程中,满足了上述要求但是还是没能映射成功. 我们来看看 index.h ...
- springboot整合jd freemarker
所有源码见我的资源 springcloud源码 1 pom.xml <dependency> <groupId>org.springframework.boot</gr ...
- 很详细的SpringBoot整合UEditor教程
很详细的SpringBoot整合UEditor教程 2017年04月10日 20:27:21 小宝2333 阅读数:21529 版权声明:本文为博主原创文章,未经博主允许不得转载. https://b ...
- 玩转 SpringBoot 2 快速整合 | FreeMarker篇
FreeMarker 介绍 Apache FreeMarker™是一个模板引擎:一个Java库,用于根据模板和更改数据生成文本输出(HTML网页,电子邮件,配置文件,源代码等).模板是用FreeMar ...
- 【模板引擎】Springboot整合ThymeleafThymeleaf基本语法
Thymeleaf介绍 thymeleaf是一个XML/XHTML/HTML5模板引擎,可用于Web与非Web环境中的应用开发.它是一个开源的Java库,基于Apache License 2.0许可, ...
- SpringBoot中整合使用Freemarker
场景 springboot不建议使用jsp,使用模板引擎,比如thymeleaf,velocity,freemarker. 项目搭建专栏: https://blog.csdn.net/BADAO_LI ...
- springboot整合视图层Thymeleaf、freemarker
springboot整合视图层以thymeleaf和freemarker为例 1.整合Thymeleaf 主要配置application.properties #是否开启缓存,默认为true spri ...
- 「快学springboot」SpringBoot整合freeMark模板引擎
前言 虽然现在流行前后端分离开发和部署,但是有时候还是需要用到服务端渲染页面的.比如:需要考虑到SEO优化等问题的时候,FreeMark其实还是很有作用的.本人的博客本来是用React开发的,但是后来 ...
最新文章
- Golang 笔记 1 基础、基本数据类型
- 年月跨度_预应力跨度国内第一!1850吨146米跨度钢结构整体拔高22米!
- 【PC工具】windows图片文字识别软件,天若OCR文字识别软件
- 空净厂商为何对“9颗星”认证趋之若鹜?
- ActivityGroup 实现分页和自定义标签(内有GridView的点击背景样式的改变方法)
- 玻璃体混浊研究中需要解决的问题(持续更新中)
- freetextbox java_FreeTextBox3.2.2下载及使用详解(图)
- [one day one question] safari缓存太厉害
- Gartner发布2022年政府行业重要业务趋势:数字化与创新、基础设施等
- UICollectionViewCell的设置间距
- 删除一个非空的无用表空间
- cassss服务未启动_systemd时代的服务管理
- Kubernetes 1.4安装后查看记录
- python基于base64模块实现图像数据编码处理、解码还原实践【解决解码数据损失问题】
- 安装Mercurial进行版本管理
- 38张史上最全的IT架构师技能图谱(高清版下载)
- 8cm等于多少像素_像素和厘米如何换算
- 利用ffmpeg将H264解码为RGB
- [论文总结] 科技论文英语写作笔记1
- 【论文翻译】Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
热门文章
- 漫谈TCP新算法Elastic-TCP
- 电脑桌面没有wifi图标了导致连接不上网络,解决方法
- 数据分析报告,就该这么写
- firefly-rk3288开发板Linux驱动——LED驱动
- itx机箱尺寸_鞋盒大小的ITX机箱初体验 | FORMULA X1装机展示
- 教你去掉 U盘写保护
- Mybatis中mapper.xml中like模糊查询字符串,日期写法
- Application的启动流程
- Java执行引擎工作原理:方法调用
- String.length() 与 String.getBytes().length