网页静态化技术 -Freemarker
原因:在我们开发过程中,一般会大量的网页静态化部分的解决问题,例如新闻网站的那些静态新闻,再比如我们大型的电商项目,每个商品的详情页,都是一些静态资源,如果每次用户访问都要去数据库中访问,那么无疑会造成高并发的现象,而且造成资源的浪费。
技术:网页静态化技术和缓存技术的共同点都是为了减轻数据库的访问压力,但是具体的应用场景不同,缓存比较适合小规模的数据,而网页静态化比较适合大规模且相对变化不太频繁的数据。另外网页静态化还有利于SEO。
另外我们如果将网页以纯静态化的形式展现,就可以使用Nginx这样的高性能的web服务器来部署。Nginx可以承载5万的并发,而Tomcat只有几百。
##一,那我们来认识下什么时Freemarker吧?
FreeMarker 是一个用 Java 语言编写的模板引擎,它基于模板来生成文本输出。FreeMarker与 Web 容器无关,即在 Web 运行时,它并不知道 Servlet 或 HTTP。它不仅可以用作表现层的实现技术,而且还可以用于生成 XML,JSP 或 Java 等。
##二,来个小的工程我们来体验下:
项目依赖:
org.freemarker
freemarker
2.3.23
以前的时候可能我们还写过信,或者现在很多人也会写请假条之类的,会发现那个东西是不是一种模板呢?
亲爱的**,你好! ************************************************************************ 署名: 日期:
那么我们今天就来创建一个:
"utf-8">Freemarker入门小DEMO <#--我只是一个注释,我不会有任何输出 --> ${name},你好。${message}
下面我们来创建一个类:
package cn.liurui.core.demo;
import freemarker.template.Configuration;
import freemarker.template.Template;
import java.io.File;
import java.io.FileWriter;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
* @author liurui
* @date $ {DATE} 12:04
*/
public class Freemarker_Demo {
public static void main(String[] args) throws Exception{
//准备数据模型 可以是json数据,也可以是javabean数据类型
Map dataMap = new HashMap();
//配置freemarker
//设置configuration的配置
Configuration configuration = new Configuration(Configuration.VERSION_2_3_23);
//设置模板路径
configuration.setDirectoryForTemplateLoading(new File("D:/Users/Administrator/
shop_pinyougou_demo_parent/freemarker_demo/src/main/resources"));
//设置模板内容编码
configuration.setDefaultEncoding("utf-8");
//设置模板对象
Template template = configuration.getTemplate("index.ftl");
//设置模板文件
FileWriter writer = new FileWriter("D:/1.html");
//合成输出
template.process(dataMap,writer);
//关闭
writer.flush();
writer.close();
}
}
//5.创建数据模型
Map map=new HashMap();
map.put("name", "张三 ");
map.put("message", "欢迎来到神奇的Freemarker世界!");
然后我们启动这个主方法:就会在页面上看到我们会输出 张三,欢迎来到神奇的Freemarker世界!
如果这个Freemarker模板仅仅只能做到这么简单的,那我们也不会用它是吧。。。。
下面我们来看看Ftl指令:
<#assign linkman="赵四">
联系人:${linkman}//联系人:赵四
<#assign info={"mobile":"110",'address':'黄河西路'} >
电话:${info.mobile} 地址:${info.address}//电话:110 地址:黄河西路
##一,我们一般网页前端写的页面,如果几个页面头部相同,会单独写一个头部,然后通过inculde命令去导入,那么我们模板也会有这个指令:
<#include "head.ftl">
##二,if指令
在我们的类中我们会添加一个:
dataMap.put("success",false);//当为true时,为ok,当为false时,为no
<#if success=true> ok <#else> no #if>
##三,list指令
List goodsList=new ArrayList();
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+1} 商品名称: ${goods.name} 价格:${goods.price}
#list>
打印结果:
1 商品名称:苹果 价格:5.8
2 商品名称:香蕉 价格:2.5
3 商品名称:橘子 价格:3.2
##四,我们需要将json字符串转成对象:
<#assign text="{'bank':'工商银行','account':'10101920201920212'}" />
<#assign data=text?eval />
开户行:${data.bank} 账号:${data.account}
##五,日期格式:
Map dataMap = new HashMap();
dataMap.put("today",new Date());
/**
* 当前日期:2019-9-30
当前时间:16:38:50
当前日期加时间;2019-9-30 16:38:50
日期格式化:2019年09月30日 16时38分50秒
*/
当前日期:${today?date}
当前时间:${today?time}
当前日期加时间;${today?datetime}
日期格式化:${today?string("yyyy年MM月dd日 HH时mm分ss秒")}
##六,判断变量是否存在?
<#if aaa??>
aaa变量存在
<#else >
aaa变量不存在
#if>