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;
	}
	@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<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;
	}
	@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模板

<!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

在这里插入图片描述

未完待续。。。。。


版权声明:本文为qq_34195507原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。