网页静态化技术Freemarker

一:我们为什么使用网页静态化?

       我们都知道静态化网页可以提供很好的用户体验,一些大型的新闻类网站中的文字新闻就是采用了静态化的页面,还有电商项目中商品的详情页也是使用了静态化网页,从中可以看出这些数据量都是很庞大的而且一般都不会发生改变,对于这样的数据都可以采用网页静态化的技术.

二:网页静态化的优点?

     1.使用网页静态化可以缓解数据库的压力,我们不需要频繁的查询数据库.

     2.静态化的页面有利于我们做SEO优化,提高网站的竞争力.

     3.如果我们将网页以纯静态化的展示就可以使用Nginx这样的高性能服务器部署,Nginx大约可以承载5万的并发量.

三:什么是freemarker?

     

         从百度百科中我们可以看出freemarker是一个用java语言编写的模板引擎,基于模板来生成文本,在实际的项目中freemarker与web容器无关,它不仅可以用作表现层的实现技术,而且还可以生成java,xml,jsp等.

四:freemarker的入门程序

       1.首先我们创建一个普通的maven工程

       2.引入freemarker的jar包依赖

       

       3.怎么来创建模板文件?

            一般模板文件中有四种元素:

            (1)文本,可以直接输出的内容

            (2)注释,使用<#-- -->格式

            (3)插值,即${..}部分,将使用数据模型中的内容代替输出

            (4)FTL指令,注意指令的前面都是加"#"的,比较重要的内容,稍后会详细讲解

       4.创建一个模板文件test.ftl(注意释ftl格式的文件,即freemarker template language)

<html>
<head>
    <meta charset="utf-8">
    <title>Freemarker 入门程序  </title>
</head>
<body>
<#--只是一个注释,不会有任何输出 -->
${name},你好。${message}
</body>
</html>

        5. 生成文件的程序:

package com.study;

import freemarker.template.Configuration;
import freemarker.template.Template;

import java.io.File;
import java.io.FileWriter;
import java.util.HashMap;
import java.util.Map;

public class Test {
    public static void main(String[] args) throws Exception {

        // 第一步:创建一个 Configuration 对象,直接 new 一个对象。构造方法的参数就是freemarker 的版本号。
        //虽然这个构造器已经过时了,但不影响我们使用
        Configuration configuration = new Configuration(Configuration.getVersion());
        //第二步:设置模板文件所在的路径,这就看你放在哪里了,
        // 直接在模板文件上右键copy path,然后复制的路径再把文件名删掉,为了省事我直接抛出IO异常
        configuration.setDirectoryForTemplateLoading(
                new File("D:\\dev\\workspace\\untitled2\\freemarker\\src\\main\\ftl"));
        //第三步:设置模板文件使用的字符集。一般就是 utf-8.
        configuration.setDefaultEncoding("utf-8");
        //第四步:加载一个模板,创建一个模板对象。
        Template template = configuration.getTemplate("test.ftl");
        // 第五步:创建一个模板使用的数据集,可以是 pojo 也可以是 map。一般是 Map。
        Map map = new HashMap();
        map.put("name","血小板");
        map.put("message","你很卡哇伊");
        //第六步:创建一个 Writer 对象,一般创建一 FileWriter 对象,指定生成的文件名。
        FileWriter fileWriter = new FileWriter(new File("D:\\test.html"));
        //第七步:调用模板对象的 process 方法输出文件。
        template.process(map,fileWriter);
        //第八步:关闭流
        fileWriter.close();
    }
}

        6.运行main方法,如果没问题后,就可以看到D盘下新生成了一个test.html,打开这个网页后的效果:

右键查看网页源代码:

从这可以看出,freemarker把我们以前的name和message替换成了我们自己定义的数据.

五:接下来就是比较重要的FTL指令:

  1.assign指令,此指令用于在页面上定义变量

      (1)定义简单类型的变量

<#assign num="666">
num:${num}</br>

      (2)定义对象类型变量

<#assign info={"mobile":"123456","address":"地球"}>
mobile:${info.mobile}<br>
address:${info.address}<br>

      (3)再次执行main函数生成页面的代码后,运行结果:

  2.include指令,此指令用于模板之间的嵌套,当然也可嵌套HTML文件等

<#include "test02.ftl">
<#include "1.html">

  我们在同一个目录下分别添加了如上两个文件

   test02.ftl的内容

<html>
<head>
    <meta charset="utf-8">
    <title>HTML </title>
</head>
<body>

<#assign num2="888">
num:${num2}</br>

</body>
</html>

   1.html的内容

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>999999999</h1>
</body>
</html>

   最后运行效果:

  3.if指令

    用法:

<#if num="66">
    6666666666
<#else >
    9999999999
</#if>

    而且你可以使用"=",也可以使用"=="

  4.list指令

     在我们上面写的main方法中添加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);
goodsList.add(goods1);
goodsList.add(goods2);
goodsList.add(goods3);
map.put("goodsList", goodsList);

      然后模板中使用如下方式拿到数据:

<#list goodsList as goods>
    索引值:${goods_index} name:${goods.name}  price:${goods.price}<br>
</#list>

   运行效果:

  

    如果我们需要获取索引值,则可以使用变量名+"_index"的方式获取

  5.内建函数

     基本语法:变量+?+函数名称

    (1)获取集合的大小

集合的总记录数:${goodsList?size}

    (2)转换json字符串为对象

<#assign text="{'bank':'工商银行','account':'1111111111111111111111111'}" />
<#assign data=text?eval />
开户行:${data.bank} 账号:${data.account}

    (3)日期格式化

     在我们上面写的main方法中添加map数据后面继续写:

map.put("today", new Date());

     然后模板中改写:

当前日期:${today?date} <br>
当前时间:${today?time} <br>
当前日期+时间:${today?datetime} <br>
日期格式化: ${today?string("yyyy 年 MM 月")}

     运行效果:

 

    (4)数字转化为字符串

   在我们上面写的main方法中添加map数据后面继续写:

map.put("shu",12345678);

   然后利于插值表达式获取数据,实际上此时已近转为字符串了:

${shu}

   但是运行的效果是:.

  发现它是利用","进行分离的,如果想去除","可以使用内建函数c,注意是小写的c

${shu?c}

    (5)空值处理运算符

如果你在模板中使用了变量但是在代码中没有对变量赋值,那么运行生成时会抛出异常。但
是有些时候,有的变量确实是 null,怎么解决这个问题呢?

       <1>判断某变量是否存在:??

<#if aaa??>
aaa 变量存在
<#else>
aaa 变量不存在
</#if>

如果添加了一个判断,即使在代码中没有对变量赋值,运行程序时也不会报错

       <2>缺失变量默认值:!

我们除了可以判断是否为空值,也可以使用!对 null 值做转换处理

${aaa!'-'}

如果aaa为null,则会输出 -,而且在代码中不对aaa赋值也不会报错

    (6)运算符

       <1>算术运算符

FreeMarker 表达式中完全支持算术运算,FreeMarker 支持的算术运算符包括:+, - , * , / , %

       <2>逻辑运算符

逻辑与:&&
逻辑或:||
逻辑非:!
逻辑运算符只能作用于布尔值,否则将产生错误

       <3>比较运算符

1) =或者==:判断两个值是否相等.
2) !=:判断两个值是否不等.
3) >或者 gt:判断左边值是否大于右边值
4) >=或者 gte:判断左边值是否大于等于右边值
5) <或者 lt:判断左边值是否小于右边值
6) <=或者 lte:判断左边值是否小于等于右边值
注意: =和!=可以用于字符串,数值和日期来比较是否相等,但=和!=两边必须是相同类型的值,
否则会产生错误,而且 FreeMarker 是精确比较,"x ","X"是不等的.其它的运行符可以作用于
数字和日期,但不能作用于字符串,大部分的时候,使用gt等字母运算符代替>会有更好的效果,
因为 FreeMarker 会把>解释成 FTL 标签的结束字符,当然,也可以使用括号来避免这种情况,
如:<#if (x>y)>

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值