Freemarker是java的免费模板引擎,主要用于MVC中的view层,生成html展示数据给客户端,可以完全替代jsp。 FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写,模板中没有业务逻辑,外部java程序通过数据库操作等生成数据传入template中, 然后输出页面。它能够生成各种文本:HTML、XML、RTF、Java源代码等等,而且不需要Servlet环境,并且可以从任何源载入模板,如本地文件、数据库等等。
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-freemarker
**templates :该目录是安全的;意味着该目录下的内容是不允许外界直接访问的。**
FreeMarker
<#-- 注释部分 -->
<#-- 使用插值 -->
Welcome ${user} !
<#-- 使用FTL指令 -->
<#list animals as being>
${being}
#list>
@Controller
public class FreemarkerController {
private List animals =new ArrayList();
{
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的一些使用,所以绝对是不会涉及到数据库还有Spring Boot的技术使用;这也是为了方便大家清楚的了解和参考,要不然光环境配置搭建就太过复杂繁琐了,一些用到的数据我会直接使用java方式构造虚拟
<#list nameList as names>
${names}
#list>
主要是进行迭代服务器端传递过来的List集合,name是list循环的时候取的一个循环变量.相关指令:
//遍历MAP
<#list map?keys as k>
#list>
<#list animals as ani>
${list?size}
${ani_index}
${ani.name}${ani.price}
<#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>
<#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;
}
@Override
public 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 creatStrings() {
List nameList = new ArrayList();
nameList.add("刘青霞");
nameList.add("张韶涵");
nameList.add("宋祖英");
nameList.add("李宇春");
return nameList;
}
/**
* 封装对象list
*
* @return
*/
public List creatData() {
List 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 strings = creatStrings();
model.addAttribute("strings", strings);
return "qh_strlist";
}
/**
* Object list
*
* @param modelMap
* @return
*/
@RequestMapping(value = "/ftl/list")
public String showList(ModelMap modelMap) {
List students = creatData();
// 参数传递方式一:
// modelMap.addAttribute("students", students);
// 参数传递方式二:
modelMap.put("students", students);
return "qh_list";
}
}
qh_list.ftl模板
FreeMarker-list测试
<#list students as student>
姓名:${student.name}
性别:${student.sex}
年龄:${student.age}
地址:${student.address}
手机:${student.phone}
#list>
qh_strlist模板
<#list strings as name>
${name}
#list>
本地测试: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模板
<#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>
本地测试: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;
}
@Override
public 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模板
<#-- 字符串用法 -->
<#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>
<#-- 数字用法 -->
<#switch x>
<#case 1>
1
<#case 2>
2
<#default>
d
#switch>
本地测试: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 creatStrings() {
List nameList = new ArrayList();
nameList.add("刘青霞");
nameList.add("张韶涵");
nameList.add("宋祖英");
nameList.add("李宇春");
return nameList;
}
//用于测试list是否为空
@GetMapping("/ftl/orglist")
public String showList(Model model) {
List orglist = creatStrings();
model.addAttribute("orglist", orglist);
return "list_empty";
}
}
list_empty.ftl模板
<#if orglist?? && (orglist?size > 0) >
list不为空
<#else>
list为空
#if>
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 creatStrings() {
List nameList = new ArrayList();
nameList.add("刘青霞");
nameList.add("张韶涵");
nameList.add("宋祖英");
nameList.add("李宇春");
return nameList;
}
//用于测试list是否为空
@GetMapping("/ftl/orglist")
public String showList(Model model) {
List orglist = creatStrings();
model.addAttribute("orglist", orglist);
return "list_empty";
}
}
list_empty.ftl模板
<#if orglist?? && (orglist?size > 0) >
list不为空
<#else>
list为空
#if>
<#if obj??>
obj不为空
<#else>
obj为空
#if>
本地测试:http://localhost:8080/ftl/orglist
未完待续。。。。。