FreeMarker快速入门详解(一)

自古美人都是妖i 提交于 2020-08-08 12:18:34

​​​​​​一. freemarker 概述

 

 

模板引擎

只是根据模板的内容,将数据模型在模板中显示并输出文件(通常为html,也可以生成其它格式的文本文件)

  • 数据模型:数据模型在java中可以是基本类型也可以List、Map、Pojo等复杂类型

 

  • 模板

 

  • 输出

 

常见的模板引擎

常用的java模板引擎哪些?

模板名称

描述

扩展名

jsp

JavaEE规范中一个技术,在html代码中可以嵌入Java代码。开发中老项目还使用,新项目使用比较少。

*.jsp

Freemarker

模板技术

*.ftl

Thymeleaf

模板技术

*.th

Velocity

模板技术

*.vm

 

 

二.环境搭建

此篇环境搭建父项目同MongoDB篇刚开始搭建的父类项目是同样流程,

可直接参考我前面博客

https://my.oschina.net/ithuang/blog/4315825

 

FreeMarker:

步骤一:父项目搭建好后, 创建子模块

步骤二: 然后直接点下一步

 

步骤三:最后输入项目名即可

 

步骤四: 添加Pom.xml坐标

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-freemarker</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
<!--        lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
<!--        测试-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
<!--        IO-->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-io</artifactId>
        </dependency>
<!--        mongodb-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>
<!--    fastjson    -->
        <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
     <version>1.2.67</version>
        </dependency>

    </dependencies>

 

步骤五: 创建yml文件,编写端口号

煌sir已经一次添加了所有需要用到的配置(一次到位,安排)

spring:
  freemarker:
    settings:
      classic_compatible: true       #兼容模式
  data:
    mongodb:
      uri: mongodb://localhost:27017/demo
server:
  port: 8088 #服务端口

 

 

步骤六: 编写启动类

@SpringBootApplication
public class TestFreeMarkerApplication {
    public static void main(String[] args) {
        SpringApplication.run(TestFreeMarkerApplication.class,args);
    }
}

 

 

三. 入门案例

  • 步骤一:编写controller

@Controller    //注意:不能使用@RestController,需要返回一个视图(找页面)
public class FreemarkerController {
 
    @GetMapping("/test")
    public String test() {
        return "test";
    }
}

 

 

  • 步骤二:编写ftl文件(注意:ftl写在templates文件下)

 

 

  • 步骤三:测试,启动程序并访问

 

 

四. FreeMarker基础

1.​​​​​​基本语法

1、注释,即<#--和-->,介于其之间的内容会被freemarker忽略

2、插值(Interpolation):即${..}部分,freemarker会用真实的值代替${..}

3、FTL指令:和HTML标记类似,名字前加#予以区分,Freemarker会解析标签中的表达式或逻辑。

4、文本,仅文本信息,这些不是freemarker的注释、插值、FTL指令的内容会被freemarker忽略解析,直接输出内容。

<#-- 注释 -->
${user.age}
<#if 条件>
</#if>

 

2.数据模型

方式1:使用ModelAndView

/**
 * 方式1:使用ModelAndView
 *
 * @return
 */
@GetMapping("/model_a")
public ModelAndView model_a() {
    // 1.创建模型视图对象
    ModelAndView modelAndView = new ModelAndView();
    // 1.1设置模型数据
    HashMap<String, String> map = new HashMap<>();
    map.put("name", "jack");
    map.put("age", "18");
    modelAndView.addObject("user", map);
    // 1.2设置页面
    modelAndView.setViewName("model_a");
    // 2.返回
    return modelAndView;
}

 

  • 创建 model_a.ftl 文件

  • 用户名: ${user.name} <br/>
    密码: ${user.age}
    

 

 

  • 方式2:使用Model

  • controller:
  • /**
     * 方式2; 使用Model
     *
     * @param model
     * @return
     */
    @GetMapping("/model_b")
    public String model_b(Model model) {
        // 1.设置模型数据
        Map<String, String> map = new HashMap<>();
        map.put("name", "jack");
        map.put("age", "99");
        model.addAttribute("user", map);
    
        // 2.返回视图(页面)
        return "/model_b";
    }

创建 model_b.ftl 文件

用户名: ${user.name} <br/>
密码: ${user.age}

 

  • 方式3:使用自定义数据

  • Controller:
  • /**
     * 方式3:使用自定义数据
     */
    @GetMapping("/model_c")
    public String model_c(Map map) {
        //设置数据
        Map<String, String> userMap = new HashMap<>();
        userMap.put("name", "jack");
        userMap.put("age", "20");
        map.put("user", userMap);
    
        //设置页面
        return "/model_c";
    }

​​​​​​​创建 model_c.ftl 文件

用户名: ${user.name} <br/>
密码: ${user.age}

 

3.​​​​​​​ List指令:遍历List

  • 语法

<#list 集合 as 变量>
    循环体
</#list>
_index:得到循环的下标,值是从0开始。使用方法"变量_index" 

 

步骤一: 编写JavaBean,User对象(username,password,age)及其构造

@Data
@NoArgsConstructor  //无参
@AllArgsConstructor // 有参
public class User {
private String username;
private String password;
private Integer age;
}

 

步骤二: 编写controller,List集合存放一组数据

Controller:

/**
 * list遍历
 *
 * @param model
 * @return
 */
@GetMapping("/list")
public String list(Model model) {
    //设置模型(数据)
    List<User> list = new ArrayList();
    list.add(new User("jack", "1234", 18));
    list.add(new User("rose", "5678", 21));
    model.addAttribute("allUser", list);

    //返回页面
    return "list";
}

 

步骤三: 编写模板,list.ftl

list遍历
<#list  allUser as user>
    ${user_index +1} -- ${user.username} --${user.password}--${user.age}<br/>
</#list>
  • 测试

 

问:  查询所有用户,如何使用 <table>标签进行布局

ftl:

<table border="1">
    <tr>
        <td>用户名</td>
        <td>密码</td>
        <td>年龄</td>
    </tr>
    <#list allUser as user>
        <tr>
            <td>${user.username}</td>
            <td>${user.password}</td>
            <td>${user.age}</td>
        </tr>
    </#list>
</table>

 

 

4.​​​​​​​ List指令:遍历Map

  • 数据获取方式:
//通过 . 依次获得
语法:${集合变量.key值.属性名}
例如:${allUser.user1.username}

//通过 [] 获得,允许[]中使用变量,如果是字符串需要使用引号
语法:${集合变量['key值'].属性名}
例如:${allUser['user1'].username}

 

  • 获得map的所有key

语法:集合变量?keys

 

步骤一:编写controller,Model + Map<String,User>

/**
 * 遍历Map
 */
@GetMapping("/map")
public String map(Model model) {
    //设置模型(数据)
    Map<String, User> map = new HashMap<>();
    map.put("user1", new User("jack", "1234", 18));
    map.put("user2", new User("rose", "5678", 21));

    model.addAttribute("allUser", map);
    //设置视图(页面)
    return "map";
}

 

步骤二:编写模板map.ftl,通过遍历map的key,遍历map数据

<#--指定key -->
${allUser.user1.username}<br/>
${allUser['user1'].username}<br/>

<#--遍历一组-->
<#list allUser?keys as k>
    ${k} --${allUser[k].username} --${allUser[k].password} --${allUser[k].age} <br/>
</#list>

 

测试:

 

 

5.​​​​​​​if指令

  • 语法

  • <#if 条件>
    </#if>
  • 实例

<#if token = 1234 >
</#if>
//注意:条件中的值类型,必须与变量的类型匹配

 

步骤一:编写controller

/**
 * if指令
 *
 * @param model
 * @return
 */
@GetMapping("/if")
public String _if(Model model) {
    //设置数据
    model.addAttribute("token", 1234);
    model.addAttribute("token2", "5678");
    return "if";
}

 

步骤二:编写模板 if.ftl

<#--if判断-->
<#if token==1234>
    token 是1234<br/>
</#if>

<#if token2!="1234">
    token2不是5678 <br/>
</#if>

<#--不要使用> 用gt 替换-->
<#if token gt 100>
    大于 <br/>
</#if>


<#--空值处理-->
<#--不为空处理-->
<#if token??>
    token不为空 <br/>
</#if>

<#--为空处理-->
<#if !token3??>
    token3为空 <br/>
</#if>

<#--默认值-->
${token3!'3的默认值'}<br/>

测试:

 

6.​​​​​​​兼容

  1. 情况1:使用${}显示不存在的数据,将抛异常
  2. 情况2:使用if比较值相同,但类型不相同的数据时,将抛异常

具体详情可查看我上篇博客:

https://my.oschina.net/ithuang/blog/4321897

 

 

 

看完恭喜你,又知道了一点点!!!

你知道的越多,不知道的越多! 

~感谢志同道合的你阅读,  你的支持是我学习的最大动力 ! 加油 ,陌生人一起努力,共勉!!

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!