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文件中引入依赖


  	
    
        org.springframework.boot
        spring-boot-starter-web
    
    
    
        org.springframework.boot
        spring-boot-starter-freemarker
    
  

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

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

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

三、FreeMarker 学习入门引导示例

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

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

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





FreeMarker


	<#-- 注释部分 -->
	
<#-- 使用插值 -->

Welcome ${user} !

<#-- 使用FTL指令 --> <#list animals as being>
  • ${being}
  • @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的一些指令使用;博主这里就是单纯的讲解FreeMarker的一些使用,所以绝对是不会涉及到数据库还有Spring Boot的技术使用;这也是为了方便大家清楚的了解和参考,要不然光环境配置搭建就太过复杂繁琐了,一些用到的数据我会直接使用java方式构造虚拟

    4.1、list 指令

    定义

    <#list nameList as names>    
      ${names}   
    
    

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

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

    方式

    1. 获取或者设置list相关信息
    <#list animals as ani>
        
        
    ${list?size}
    ${ani_index}
    ${ani.name}${ani.price}
    <#if !ani_has_next> ${ani.name}
    2. list排序
    //升序:sort_by()
    <#list list?sort_by("字段") as x>
    
    //降序:sort_by()?reverse
    <#list list?sort_by("字段")?reverse as x>
    
    
    3. list嵌套
    <#list jsskList as jsskVO>
        <#list kcList as kcVO>
            
            <#if kcVO.kch=jsskVO.kch> 
                ${kcVO.kcm}
            
        
    
    

    例子

    测试对象类

    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}

    qh_strlist模板

    
    
    	
    		
    		
    	
    	
    		<#list strings as name>
    		 ${name}	
    		
    	
    
    

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

    SpringBoot整合模板FreeMarker篇_第1张图片

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

    SpringBoot整合模板FreeMarker篇_第2张图片

    4.2、 if else指令详解

    定义

    <#if condition>...
    <#elseif condition2>...
    <#elseif condition3>...
    <#else>...
    
    
    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模板

    
    
    	
    		
    		
    	
    	
    		
    	<#if student.age lt 12>  
    		${student.name}不是一个初中生  
    		<#elseif student.age lt 15>  
    		${student.name}不是一个高中生  
    		<#elseif student.age lt 18>  
    		${student.name}不是一个大学生  
    		<#else>  
    		${student.name}是一个大学生  
    	
    	
    
    

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

    SpringBoot整合模板FreeMarker篇_第3张图片

    4.3、switch case指令详解

    定义

    <#switch value> 
    <#case refValue>...<#break> 
    <#case refValue>...<#break> 
    <#default>... 
    
    
    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模板

    
    
    	
    		
    		
    	
    	
    		<#-- 字符串用法 -->
    			
    		<#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 x> <#case 1> 1 <#case 2> 2 <#default> d

    本地测试:http://localhost:8080/ftl/switch
    SpringBoot整合模板FreeMarker篇_第4张图片

    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 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为空	
    		
    	
    
    
    

    4.5、if 判断对象是否为空

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

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

    2. 给对象赋默认值,避免空值
      使用${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 obj??> obj不为空 <#else> obj为空

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

    SpringBoot整合模板FreeMarker篇_第5张图片

    未完待续。。。。。

    你可能感兴趣的:(SpringBoot)