美文网首页右耳菌-邓小白的Java架构师的修炼之路
FreeMarker的高级应用和SpringBoot的整合

FreeMarker的高级应用和SpringBoot的整合

作者: 右耳菌 | 来源:发表于2022-05-03 20:33 被阅读0次

1. FreeMarker的List指令

<#list sequence as item>
    Part repeated for each item
<#else>
    Part executed when there are 0 items
</#list>
  • else:可选,代表如果没有迭代数据的话,就展示else的内容
  • sequence:你要迭代的数据变量名
  • item:迭代项的变量名

  • 语法2(从FreeMarker 2.3.23版本开始):
<#list sequence>
    Part executed once if we have more than 0 items
    <#items as item>
        Part repeated for each item
    </#items>
    Part executed once if we have more than 0 items
<#else>
    Part executed when there are 0 items
</#list>

当你想在list指令里面使用列表、表格等标签时,若不嵌套items指令,当数据没内容,则会输出空列表,所以我们使用items来避免出现空列表和空表格在HTML页面上;

  • sequence:你要迭代的数据变量名
  • item:迭代项变量名

  • 要点3 - sep指令
<#list users as user>
  <div>
    ${user}<#sep>, </#sep>
  </div>
</#list>

简写如下

<#list users as user>${user}<#sep>, </#list>

当你需要在每一个迭代项中间放一些内容的时候,我们可以使用sep指令(插入的内容不能在第一项之前或最后一项之后)


  • 要点4 - break指令

在任意迭代过程中跳出,配合if指令一起使用

<#list 1..10 as x>
  ${x}
  <#if x == 3>
    <#break>
  </#if>
</#list>

  • 要点5 - list中的排序
  • 升序:sort_by()
    语法:
<#list list?sort_by("字段") as x> 
</#list>
  • 降序:sort_by()?reverse
    语法:
<#list list?sort_by("字段")?reverse as x>
</#list>

  • 要点:list遍历Map:

语法:

<#list dataMap?keys as key>
 <option value="${key}">${dataMap[key]}</option>
</#list>

2. FreeMarker的内建函数

  • 官网 https://freemarker.apache.org/docs/ref_builtins_alphaidx.html

  • 内建函数的特点
    都是书写在 “ ? ” 后面,且都能实现某个功能(函数)

  • 什么叫内建函数
    1.所谓内建函数,就是由语法规定存在的函数。这些函数,包含在编译器的运行时库中,程序员不必单独书写代码实现它,只需要调用既可,而他们的实现,由该编译器对应的厂商完成。
    2.简单的说,就是不需要引入任何外部资源就可以使用的函数

  • 内建函数参考

  1. 字符串内建函数
  2. 数字内建函数
  3. 日期内建函数
  4. 布尔值内建函数
  5. 序列内建函数
  6. 哈希表内建函数
  7. 结点(对于XML)内建函数
  8. 循环变量内建函数
  9. 独立类型内建函数
  10. 很少使用的和专家级的内建函数

3. SpringBoot 集成 FreeMarker

  • 创建SpringBoot 项目
  1. 引入相关依赖 (仅罗列需要的)
        <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>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.2</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
  1. 修改application.properties
#mysql的配置信息
spring.datasource.url=jdbc:mysql://localhost:3306/cloud_study?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true
spring.datasource.username=####
spring.datasource.password=####
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

spring.freemarker.suffix=.ftl
  • 创建Emp实体类
package cn.lazyfennec.springbootfreemarker.entity;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * @Author: Neco
 * @Description:
 * @Date: create in 2022/5/4 9:41
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Emp {
    private int empno;
    private String ename;
    private String job;
    private Integer mgr;
    private Integer sal;
    private Integer comm;
    private Integer deptno;
}
  • 创建 EmpRepository
package cn.lazyfennec.springbootfreemarker.repository;

import cn.lazyfennec.springbootfreemarker.entity.Emp;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * @Author: Neco
 * @Description:
 * @Date: create in 2022/5/4 9:42
 */
@Repository
public interface EmpRepository {
    @Select("select empno,ename,sal,job,comm,mgr,deptno from emp")
    List<Emp> findAll();
}
  • 创建EmpController
package cn.lazyfennec.springbootfreemarker.controller;

import cn.lazyfennec.springbootfreemarker.entity.Emp;
import cn.lazyfennec.springbootfreemarker.repository.EmpRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpSession;
import java.util.List;

/**
 * @Author: Neco
 * @Description:
 * @Date: create in 2022/5/4 9:39
 */
@Controller
public class EmpController {
    @Autowired
    private EmpRepository empRepository;

    @RequestMapping("/show")
    public String showAll(HttpSession session) {
        System.out.println(1111);
        List<Emp> empList = empRepository.findAll();
        session.setAttribute("emplist", empList);
        return "list";
    }
}
  • xxxApplication 新增 MapperScan 注解
@MapperScan(basePackages = "cn.lazyfennec.springbootfreemarker.repository")
@SpringBootApplication
public class SpringbootFreemarkerApplication {
  • resources -> templates 下创建 list.ftl
<html>
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <title>登陆页面</title>
    <!-- jQuery文件。务必在bootstrap.min.js 之前引入 -->
    <script src="https://cdn.staticfile.org/jquery/3.2.1/jquery.min.js"></script>
    <!-- 新 Bootstrap4 核心 CSS 文件 -->
    <link rel="stylesheet" href="https://cdn.staticfile.org/twitter-bootstrap/4.1.0/css/bootstrap.min.css">
    <!-- popper.min.js 用于弹窗、提示、下拉菜单 -->
    <script src="https://cdn.staticfile.org/popper.js/1.12.5/umd/popper.min.js"></script>
    <!-- 最新的 Bootstrap4 核心 JavaScript 文件 -->
    <script src="https://cdn.staticfile.org/twitter-bootstrap/4.1.0/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container">
    <table class="table table-dark table-hover">
        <thead>
        <tr>
            <th>empno</th>
            <th>ename</th>
            <th>job</th>
            <th>sal</th>
            <th>mgr</th>
            <th>comm</th>
            <th>deptno</th>
        </tr>
        </thead>
        <tbody>
        <#list emplist as emp>
            <tr>
                <td>${emp.empno}</td>
                <td>${emp.ename}</td>
                <td>${emp.job}</td>
                <td>${emp.sal}</td>
                <td>${emp.mgr!"没有上司"}</td>
                <#--                <td>${emp.comm!"没有奖金"}</td>-->
                <td>
                    <#if emp.comm??>
                        <#if emp.comm=0>
                            奖金为零
                        <#else>
                            ${emp.comm}
                        </#if>
                    <#else>
                        没有奖金
                    </#if>
                </td>
                <td>${emp.deptno}</td>
            </tr>
        </#list>
        </tbody>
    </table>
</div>
</body>
</html>
  • 测试
测试

如果觉得有收获就点个赞吧,更多知识,请点击关注查看我的主页信息哦~

相关文章

网友评论

    本文标题:FreeMarker的高级应用和SpringBoot的整合

    本文链接:https://www.haomeiwen.com/subject/mjliyrtx.html