Freemarker网页静态化技术

定义

Freemarker是一个模板搜索引擎,一个基于模板生成文本输出的工具,采用纯java编写;虽然Freemarker具有一定的编程能力,但是通常还是需要由java程序提供需要显示的数据。

核心:模板+数据模型=输出

在这里插入图片描述

使用场景及作用

  1. 动态页面

    模板引擎可以让程序实现界面与数据分离,业务代码与逻辑代码的分离,这就提升了开发效率,良好的设计也使得代码复用变得更加容易。在模板中可以专注如果展示数据,而在模板之外,可以更专注要展示哪些数据。

  2. 页面静态化

    使用模板+数据模型,就能能够实现数据的展示,快速将两者进行组合,生成一个完成渲染的静态化html页面。

  3. 代码生成器

    能够根据提前编写好的模板,使用Freemarker提供的指定,配合数据模型,达到生成代码的功能。

使用

  1. 导入maven依赖

    <dependency>
        <groupId>org.freemarker</groupId>
        <artifactId>freemarker</artifactId>
        <version>2.3.23</version>
    </dependency>
    
  2. 创建模板文件

    模板中一般包含4中元素:

    • 文本:直接输出的部分。
    • 注释:使用<#--注释内容-->注释符号中的数据不会输出。
    • 插值:使用${},表达式,就能够使用数据模型中的对应数据,替换插值表达式中的变量,进行数据输出。
    • FTL指令:Freemarker指令,类似于HTML标记,指令前会加#井号进行区分。

    注意:freemarker模板文件的后缀名可以任意,但是一般使用ftl作为后缀名。

    在本地磁盘创建

    <html>
        <head>
            <meta charset="utf-8">
            <title>Freemarker入门</title>
        </head>
        <body>
            <#--我只是一个注释,我不会有任何输出  -->
            ${name}你好,${message}
        </body>
    </html>
    
  3. 编写java类

    public static void main(String[] args) throws IOException, TemplateException {
    
        /*
            1.设置配置,加载模板
             */
        //创建一个Configuration对象,参数为freemarker的版本号
        Configuration configuration = new Configuration(Configuration.getVersion());
        //配置模板文件所在目录
        configuration.setDirectoryForTemplateLoading(new File("D:/ftl"));
        //设置编码
        configuration.setDefaultEncoding("UTF-8");
        //加载模板文件,注意加载的模板文件名,必须要在配置的目录下
        Template template = configuration.getTemplate("freemarker.ftl");
    
        /*
            2.设置数据模型
             */
        //设置数据模型,注意的是,添加的key要和模板中取数据时所用的key相同
        Map map = new HashMap();
        map.put("name", "张三");
        map.put("message", "哈哈");
    
        /*
            3.将数据模型与模板进行组合输出
             */
    
        //定数据输出的文件,并获取该文件的字符输出流
        FileWriter writer = new FileWriter("D:/ftl/test.html");
        //将模板输出
        template.process(map, writer);
        //关闭流
        writer.close();
    }
    
  4. 注意

    1. freemarker再与spring进行整合,生成静态页面时,如果出现乱码问题,可以使用记事本软件打开静态页面,如果在记事本中出现乱码,那么就需要指定数据库的编码格式。

      jdbc.url=jdbc:mysql://192.168.242.130:3306/hse?characterEncoding=UTF-8&serverTimezone=UTC

    2. 如果记事本中正常显示,但是静态网页本身出现乱码,那么就需要设置使用模板生成页面时的输出流,设置输出流的编码。

      OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(
          new File(outPath + "/" + fileName)), "utf-8");
      template.process(data, writer);
      

      采用OutputStreamWriter字符转换流,该流对象是字符流到字节流的桥梁,使用该流对象的时候指定编码格式为utf-8。

    zhi’ding

  5. assign指令

    • 作用:用于在页面上定义一个变量。

    • 使用:使用${},表达式使用定义的变量

    • 定义简单类型

      <#assign username="不知火舞">
      ${username}
      
    • 定义对象类型

      <#assign student={"user": "王昭君", "age": 19}>
      ${student.user}
      ${student.age}
      
  6. include指令

    • 作用:用于模板文件的嵌套

    • 使用

      <#include "要包含的模板文件名.ftl"/>
      
  7. if指令

    • 作用:用于在模板中进行判断。

      模板文件中

      <#if bl==true>
      	判断为真
      	<#else>
      	判断为假
      </#if>
          
          
      <#if number==1>
      	数值为1
      <#elseif number==2>
      	数值为2
      <#else>
          数值为3
      </#if>
      

      java代码

      Map map = new HashMap();
      map.put("bl", true);
      
    • 注意:也可以在模板文件中使用assign指令,定义变量,用作if指令的判断变量

  8. list指令

    • 作用:用于在模板文件中进行遍历输出

    • 使用:

      模板文件中

      <#list goods as goodsList>
          商品名称:${goods.name}
          商品价格:${goods.price}
      <#list>
      

      java代码中

      //创建一个list对象
      List goodsList=new ArrayList();
      
      //创建map对象,每个map封装一个商品的信息
      Map goods1=new HashMap();
      goods1.put("name", "苹果");
      goods1.put("price", 5.8);
      
      Map goods2=new HashMap();
      goods2.put("name", "香蕉");
      goods2.put("price", 2.5);
      
      Map goods3=new HashMap();
      goods3.put("name", "橘子");
      goods3.put("price", 3.2);
      
      //将每个map对象看做是一个商品对虾,k'm'k'k
      goodsList.add(goods1);
      goodsList.add(goods2);
      goodsList.add(goods3);
      map.put("goodsList", goodsList);
      

    Spring集合firemarker

    1. 导入依赖

      <dependency>
       <groupId>org.freemarker</groupId>
       <artifactId>freemarker</artifactId>
       <version>2.3.23</version>
      </dependency>
      
    2. 编写模板文件,模板文件后缀名以.ftl结尾

    3. 在spring中配置模板文件

      freemarker.properties(指定通过模板文件生成的静态页面的存放路径)

      out_put_path=D:/ideaProjects/health_parent/health_mobile/src/main/webapp/pages
      

      applicationContext-firemarker.xml(在spring初始化的时候,配置firemarker的FreeMarkerConfigurer类对象)

      <bean id="freemarkerConfig"
       class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
       <!--指定模板文件所在目录-->
       <property name="templateLoaderPath" value="/WEB-INF/ftl/" />
       <!--指定字符集-->
       <property name="defaultEncoding" value="UTF-8" />
      </bean>
      <context:property-placeholder location="classpath:freemarker.properties"/>
      
    4. 编写逻辑代码根据模板生成静态页面

      在逻辑代码中进行查询等操作,获取需要的数据,建立数据模型,通过与模板页面的结合进行展示,最终生成模板页面。

    注意

    模板页面还可以结合vue进行使用,页面上使用vue,在js中使用freemarker给数据模型赋值

    模板页面

    <!--页面省略-->
    <script>
        var vue = new Vue({
            el: '#app',
            data: {
                //${setMealList}是firemarker表达式,而setMealList对象是通过代码模板代码建立的数据模型
                setmealList: ${setMealList}
            },
        });
    </script>
    </body>
    

    数据还是通过java代码,传递给模板页面,模板页面就能够使用${}表达式进行获取。
    注意:使用freemarker与vue结合的时候,在vue中不能使用对象.属性的方式,否则会报错!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值