[toc]
网页静态化技术Freemarker
FreeMarker 是一个用 Java 语言编写的模板引擎,它基于模板来生成文本输出。FreeMarker与 Web 容器无关,即在 Web 运行时,它并不知道 Servlet 或 HTTP。它不仅可以用作表现层的实现技术,而且还可以用于生成 XML,JSP 或 Java 等。
1. 网页静态化技术使用场景
网页静态化技术和缓存技术的共同点都是为了减轻数据库的访问压力,但是具体的应用场景不同,缓存比较适合小规模的数据,而网页静态化比较适合大规模且相对变化不太频繁的数据。另外网页静态化还有利于SEO(Search Engine Optimization)。另外我们如果将网页以纯静态化的形式展现,就可以使用Nginx这样的高性能的web服务器来部署。Nginx可以承载5万的并发,而Tomcat只有三百到五百。
2. 页面静态化技术Freemarker入门Demo
2.1 引入依赖
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.1</version> <configuration> <target>1.8</target> <source>1.8</source> </configuration> </plugin> </plugins> </build>
<dependencies> <!--引入freemarker的jar包--> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.23</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency>
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.8</version> </dependency>
</dependencies>
|
2.2 Java代码控制生成Html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| public class genFreemarker {
@Test public void test() throws Exception{ Configuration configuration = new Configuration( Configuration.getVersion() );
configuration.setDirectoryForTemplateLoading( new File("D:\\javaCode\\freemarker\\src\\main\\resources\\") );
configuration.setDefaultEncoding( "utf-8" );
Template template = configuration.getTemplate( "index.ftl" );
Map map = new HashMap(); map.put( "name","taoge" ); map.put( "message","牛逼" ); map.put("success",true);
List list = new ArrayList<>();
list.add(new Good("taozi","25.4")); list.add(new Good("lizi","5.4")); list.add(new Good("juzi","2.4"));
map.put("list",list);
map.put("today",new Date()); map.put("point",1234567); map.put("flag","1");
Writer writer = new FileWriter( new File("D:\\javaCode\\freemarker\\src\\main\\resources\\index.html") );
template.process(map,writer);
writer.close(); } }
|
2.3 FTL指令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
| <#--include指令--> <#include "header.ftl">
${name},你好${message}
<#-- 定义一个变量(简单类型) --> <#assign linkman="涛先生"> 联系人:${linkman}
<#--先定义,再输出数据。电话输出会有逗号因为是数值,可以使用字符串定义,或者使用内嵌函数c--> <#assign taoge={"mobile":13855200338,"salary":50}> 电话:${taoge.mobile?c} 薪水:${taoge.salary}
<#--分支语句 =和== 一样--> <#if success=true> 你已经验证通过了 <#else> 您没有验证通过 </#if> <#--循环 --> <#list list as good> 商品编号:${good_index+1} 商品名称:${good.name}, 商品价格:${good.price} <br/>
</#list> <#--获取集合的长度--> 当前商品的条数是:${list?size}
<#assign xiaoxin="{'color':'black','height':'175'}"?eval>
${xiaoxin.color} ${xiaoxin.height}
<div> <#--日期函数必须指定数据类型 date:年月日 time:时分秒 datetime:年月日时分秒 --> ${today?date} ${today?time} ${today?datetime} <#--自定义日期格式的数据 --> ${today?string("yyyy/MM/dd")}
</div>
<div> ${point} <#--去除分隔符c--> ${point?c} </div>
<div> 判断空值: <#if flag??> <#--flag为null不存在--> 变量存在 <#else> 变量不存在 </#if> </div> <div> <#--!"0" !添加缺失的默认值--> ${flag1!"0"} ${flag1!""} ${flag1!} </div> <#--运算符返回值只能是boolean类型的-->
//比较运算符 表达式中支持的比较运算符有如下几个: 1 =或者==:判断两个值是否相等. 2 !=:判断两个值是否不等. 3 >或者gt:判断左边值是否大于右边值 4 >=或者gte:判断左边值是否大于等于右边值 5 <或者lt:判断左边值是否小于右边值 6 <=或者lte:判断左边值是否小于等于右边值
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| 字符串输出: ${"Hello ${name} !"} / ${"Hello " + name + " !"} <#assign cname=r"特殊字符完成输出(http:\www.baidu.com)"> ${cname}
字符串截取 : 通过下标直接获取下标对应的字母: ${name[2]} 起点下标..结尾下标截取字符串:${name[0..5]}
算数运算: <#-- 支持"+"、"-"、"*"、"/"、"%"运算符 --> <#assign number1 = 10> <#assign number2 = 5> "+" : ${number1 + number2} "-" : ${number1 - number2} "*" : ${number1 * number2} "/" : ${number1 / number2} "%" : ${number1 % number2}
比较运算符: <#if number1 + number2 gte 12 || number1 - number2 lt 6> "*" : ${number1 * number2} <#else> "/" : ${number1 / number2} </#if>
|