博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
网页静态化(freemarker)
阅读量:2240 次
发布时间:2019-05-09

本文共 6026 字,大约阅读时间需要 20 分钟。

  FreeMarker 是一个用 Java 语言编写的模板引擎,它基于模板来生成文本输出。FreeMarkerWeb 容器无关,即在 Web 运行时,它并不知道 Servlet HTTP。它不仅可以用作表现层的实现技术,而且还可以用于生成 XMLJSP Java

  网页静态化技术和缓存技术的共同点都是为了减轻数据库的访问压力,但是具体的应用场景不同,缓存比较适合小规模的数据,而网页静态化比较适合大规模且相对变化不太频繁的数据。另外网页静态化还有利于SEO

  另外我们如果将网页以纯静态化的形式展现,就可以使用Nginx这样的高性能的web服务器来部署。Nginx可以承载5万的并发,而Tomcat只有几百

FTL指令

  (1) assign指令

    1) 定义简单类型

<#assign linkman="佩奇">联系人:${linkman}

    2) 定义对象类型

<#assign info={"mobile":"13301231212",'address':'佩奇街'} >电话:${info.mobile}  地址:${info.address}

  (2) include指令

<#include "head.ftl">

  (3) if指令

    1) 在模板文件上添加

<#if success=true>  你已通过实名认证<#else>    你未通过实名认证

    2) 在代码中对str变量赋值

     在freemarker的判断中,可以使用= 也可以使用==

map.put("success", true);

  (4) list指令

    如果想在循环中得到索引,使用循环变量+_index就可以得到

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

  (5) 内建函数

共  ${goodsList?size}  条记录

  (6) 转换JSON字符串为对象

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

  (7) 日期格式化

代码dataModel.put("today", new Date());在模板文件中加入当前日期:${today?date} 
当前时间:${today?time}
当前日期+时间:${today?datetime}
日期格式化: ${today?string("yyyy年MM月")}

  (8) 数字转换为字符串

代码中对变量赋值:map.put("point", 102920122);修改模板:累计积分:${point}

  (9) 空值处理运算符

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

     用法为:variable??,如果该变量存在,返回true,否则返回false

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

    2) 缺失变量默认值:!

     使用!null值做转换处理

${aaa!'-'}

   (10) 运算符

    1) 算数运算符

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

    2) 逻辑运算符

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

    3) 比较运算符

    表达式中支持的比较运算符有如下几个:  1  =或者==:判断两个值是否相等 2  !=:判断两个值是否不等 3  >或者gt:判断左边值是否大于右边值  4  >=或者gte:判断左边值是否大于等于右边值  5  <或者lt:判断左边值是否小于右边值  6  <=或者lte:判断左边值是否小于等于右边值 

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

 

生成静态页面

  (1) 依赖

org.freemarker
freemarker

  (2) applicationContext-service.xml

 
     

  (3) web.xml

contextConfigLocation
classpath*:spring/applicationContext-*.xml
org.springframework.web.context.ContextLoaderListener

  (4) 生成静态页面的class

@Servicepublic class ItemPageServiceImpl implements ItemPageService {   private String "d:\\item\\";// 网页生成目录        @Autowired    private FreeMarkerConfig freeMarkerConfig;        @Autowired    private TbGoodsMapper goodsMapper;        @Autowired    private TbGoodsDescMapper goodsDescMapper;            @Override    public boolean genItemHtml(Long goodsId){                        try {            Configuration configuration = freeMarkerConfig.getConfiguration();            Template template = configuration.getTemplate("item.ftl");            Map dataModel=new HashMap<>();                        //1.加载商品表数据            TbGoods goods = goodsMapper.selectByPrimaryKey(goodsId);            dataModel.put("goods", goods);                        //2.加载商品扩展表数据                        TbGoodsDesc goodsDesc = goodsDescMapper.selectByPrimaryKey(goodsId);            dataModel.put("goodsDesc", goodsDesc);                                    Writer out=new FileWriter(pagedir+goodsId+".html");            template.process(dataModel, out);            out.close();            return true;                    } catch (Exception e) {            e.printStackTrace();            return false;        }    }}

   (5) ftl:/xxx-details-service/src/main/webapp/WEB-INF/ftl/item.ftl

    
产品详情页
<#include "head.ftl">
<#assign itemImages=goodsDesc.itemImages?eval>
<#assign customAttributeItems=goodsDesc.customAttributeItems?eval>
<#assign specificationItems=goodsDesc.specificationItems?eval>
<#if itemImages?size gt 0>
    <#list itemImages as image>

{ {item.title}}

${goods.caption}
价  格
¥
{ {item.price}}
降价通知
累计评价
612188
促  销
加价购
满999.00另加20.00元,或满1999.00另加30.00元,或满2999.00另加40.00元,即可在购物车换购热销商品
支  持
以旧换新,闲置手机回收 4G套餐超值抢 礼品购
配 送 至
满999.00另加20.00元,或满1999.00另加30.00元,或满2999.00另加40.00元,即可在购物车换购热销商品

库存数量: ${item.num}

<#list specificationItems as specificationItem>
选择${specificationItem.attributeName}
<#list specificationItem.attributeValue as attributeValue>
${attributeValue} 
<#include "foot.ftl">

 

转载于:https://www.cnblogs.com/lin-nest/p/10322903.html

你可能感兴趣的文章
Java网络编程与NIO详解11:Tomcat中的Connector源码分析(NIO)
查看>>
深入理解JVM虚拟机1:JVM内存的结构与消失的永久代
查看>>
深入理解JVM虚拟机3:垃圾回收器详解
查看>>
深入理解JVM虚拟机4:Java class介绍与解析实践
查看>>
深入理解JVM虚拟机5:虚拟机字节码执行引擎
查看>>
深入理解JVM虚拟机6:深入理解JVM类加载机制
查看>>
深入了解JVM虚拟机8:Java的编译期优化与运行期优化
查看>>
深入理解JVM虚拟机9:JVM监控工具与诊断实践
查看>>
深入理解JVM虚拟机10:JVM常用参数以及调优实践
查看>>
深入理解JVM虚拟机12:JVM性能管理神器VisualVM介绍与实战
查看>>
深入理解JVM虚拟机13:再谈四种引用及GC实践
查看>>
Spring源码剖析1:Spring概述
查看>>
Spring源码剖析2:初探Spring IOC核心流程
查看>>
Spring源码剖析5:JDK和cglib动态代理原理详解
查看>>
Spring源码剖析6:Spring AOP概述
查看>>
【Linux】进程的理解(二)
查看>>
【C++】STL -- Vector容器的用法
查看>>
【Linux】Linux中的0644 和 0755的权限
查看>>
【数据结构】有关二叉树的面试题
查看>>
【Linux】内核态和用户态
查看>>