网页静态化技术 Freemarker

网页静态化技术 Freemarker

网页静态化技术

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

FreeMarker

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

使用

1.导入依赖 pom.xml

<dependencies>
   <dependency>
       <groupId>org.freemarker</groupId>
       <artifactId>freemarker</artifactId>
       <version>2.3.23</version>
   </dependency>
</dependencies>
2.Test类
public class FreemarkerTest {
   public static void main(String[] args) throws Exception {
   // 第一步:创建一个 Configuration 对象,直接 new 一个对象。构造方法的参数就是freemarker 的版本号。
       Configuration configuration = new Configuration(Configuration.getVersion());
  // 第二步:设置模板文件所在的路径。
       configuration.setDirectoryForTemplateLoading(new File("D:\\work\\ideawork\\freeMarker_demo\\src\\main\\resources"));
  // 第三步:设置模板文件使用的字符集。一般就是 utf-8.
       configuration.setDefaultEncoding("UTF-8");
 // 第四步:加载一个模板,创建一个模板对象。
       Template template = configuration.getTemplate("test.ftl");
 //  第五步:创建一个模板使用的数据集,可以是 pojo 也可以是 map。一般是 Map。
       Map map = new HashMap();
 // 第六步:创建一个 Writer 对象,一般创建一 FileWriter 对象,指定生成的文件名。
       map.put("username", "张三");

       // 向数据集中添加一个集合
       List<String> stringList = new ArrayList<String>();
       stringList.add("AAA");
       stringList.add("BBB");
       stringList.add("CCC");
       map.put("stringList",stringList);
       map.put("nowTime",new Date());
       map.put("id",1);
       map.put("goodsName",null);
       map.put("goodsName1",null);

   //  第七步:调用模板对象的 process 方法输出文件。
       FileWriter writer = new FileWriter("d:\\aaa.html");
       template.process(map, writer);
   //  第八步:关闭流
       writer.close();
   }

}
3.test.ftl模板文件
<!doctype html>
<html lang="en">
<head>
   <meta charset="UTF-8">
</head>
<body>
 
${username}

<#--1.3.1  assign:在模板中定义变量-->
<#assign user={"name":"chenqi","age":'11'}>
${user.name}<br>
${user.age}<br>

<#--1.3.2  Include:模板中引入其他的模板-->
<#include 'head.ftl'>


<#--1.3.3  If:判断-->
<#if user.age=='11'>
   chenqi 11
<#else>
   chenqi is not 11
</#if>

<#--1.3.4  List:循环-->
<#list stringList as str>
   <div>${str}</div>
</#list>


   <#--1.4    内建函数(内置的函数)-->
   <#--写法:变量?函数名称-->
   <#--1.4.1  获取数组或集合的长度 size-->
${stringList?size}

   <#--1.4.2  把字符串转成对象 eval-->
<#assign user1='{"name":"李四","age":"30"}'?eval>
${user1.name}

   <#--1.4.3  日期函数-->
   <#--向数据集中添加一个当前时间-->
   <#--map.put("nowTime",new Date());-->
   <#--模板中处理日期:-->
${nowTime?date}<br/>
${nowTime?time}<br/>
${nowTime?datetime}<br/>
${nowTime?string('yyyy-MM-dd HH:mm:ss')}<br/>

   <#--1.4.4  把数字转成字符串 c-->
${id?c}
     
   <#--1.5    空值的处理-->
   <#--1.5.1  判断是否有空值包含null  ??-->
<#if goodsName??>
   goodsName有值
<#else >
   goodsName没有值
</#if>
<br>
   <#--1.5.2  如果没有值,可以给默认值-->
${goodsName1!'chenqi'}
</body>
</html>
// 示例
   @Autowired
private FreeMarkerConfigurer freemarkerConfig;
public String generatorItem(Long goodsId) throws Exception {

   // 根据id获取一个组合类对象
   Goods goods = itempageService.findOne(goodsId);
   Configuration configuration = freemarkerConfig.getConfiguration();
   Template template = configuration.getTemplate("item.ftl");
   configuration.setDefaultEncoding("UTF-8");

   List<TbItem> itemList = goods.getItemList();
   for (TbItem tbItem : itemList) {
       Map map = new HashMap();
       map.put("goods", goods);
       map.put("tbItem", tbItem);
       FileWriter writer = new FileWriter("D:\\java\\html\\" + tbItem.getId() + ".html");
       template.process(map, writer);
       writer.close();
   }
   return "OK!";
}

发表评论