美文网首页右耳菌-邓小白的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