精华内容
下载资源
问答
  • 2022-03-29 21:19:14

    1. 页面静态化介绍

            在项目中我们已经实现了移动端套餐列表页面和套餐详情页面的动态展示。但是我们需要思考一个问题,就是对于这两个页面来说,每次用户访问这两个页面都需要查询数据库获取动态数据进行展示,而且这两个页面的访问量是比较大的,这就对数据库造成了很大的访问压力,并且数据库中的数据变化频率并不高。那我们需要通过什么方法为数据库减压并提高系统运行性能呢?答案就是页面静态化。

            页面静态化其实就是将原来的动态网页(例如通过ajax请求动态获取数据库中的数据并展示的网页)改为通过静态化技术生成的静态网页,这样用户在访问网页时,服务器直接给用户响应静态html页面,没有了动态查询数据库的过程。

     那么这些静态HTML页面还需要我们自己去编写吗?其实并不需要,我们可以通过专门的页面静态化技术帮我们生成所需的静态HTML页面,例如:Freemarker、thymeleaf等。

    2. Freemarker介绍

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

    3. Freemarker入门案例 

    3.1 环境搭建

    创建maven工程并导入Freemarker的maven坐标

    <dependency>
      <groupId>org.freemarker</groupId>
      <artifactId>freemarker</artifactId>
      <version>2.3.23</version>
    </dependency>

    3.2 创建模板文件

    模板文件中有四种元素:

    1、文本,直接输出的部分 2、注释,即<#--...-->格式不会输出 3、插值(Interpolation):即${..}部分,将使用数据模型中的部分替代输出 4、FTL指令:FreeMarker指令,和HTML标记类似,名字前加#予以区分,不会输出

    Freemarker的模板文件后缀可以任意,一般建议为ftl。

    在D盘创建ftl目录,在ftl目录中创建名称为test.ftl的模板文件,内容如下:

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

    3.3 生成文件

    使用步骤:

    第一步:创建一个 Configuration 对象,直接 new 一个对象。构造方法的参数就是 freemarker的版本号。

    第二步:设置模板文件所在的路径。

    第三步:设置模板文件使用的字符集。一般就是 utf-8。

    第四步:加载一个模板,创建一个模板对象。

    第五步:创建一个模板使用的数据集,可以是 pojo 也可以是 map。一般是 Map。

    第六步:创建一个 Writer 对象,一般创建 FileWriter 对象,指定生成的文件名。

    第七步:调用模板对象的 process 方法输出文件。

    第八步:关闭流。

    public static void main(String[] args) throws Exception{
        //1.创建配置类
        Configuration configuration=new Configuration(Configuration.getVersion());
        //2.设置模板所在的目录 
        configuration.setDirectoryForTemplateLoading(new File("D:\\ftl"));
        //3.设置字符集
        configuration.setDefaultEncoding("utf-8");
        //4.加载模板
        Template template = configuration.getTemplate("test.ftl");
        //5.创建数据模型
        Map map=new HashMap();
        map.put("name", "张三");
        map.put("message", "欢迎来到传智播客!");
        //6.创建Writer对象
        Writer out =new FileWriter(new File("d:\\test.html"));
        //7.输出
        template.process(map, out);
        //8.关闭Writer对象
        out.close();
    }

     上面的入门案例中Configuration配置对象是自己创建的,字符集和模板文件所在目录也是在Java代码中指定的。在项目中应用时可以将Configuration对象的创建交由Spring框架来完成,并通过依赖注入方式将字符集和模板所在目录注入进去。

    4. Freemarker指令

    4.1 assign指令

    assign指令用于在页面上定义一个变量

    (1)定义简单类型

    <#assign linkman="周先生">
    联系人:${linkman}

     (2)定义对象类型

    <#assign info={"mobile":"13812345678",'address':'北京市昌平区'} >
    电话:${info.mobile}  地址:${info.address}

    4.2 include指令

    include指令用于模板文件的嵌套

    (1)创建模板文件head.ftl

    <h1>测试代码</h1>

     (2)修改入门案例中的test.ftl,在test.ftl模板文件中使用include指令引入上面的模板文件

    <#include "head.ftl"/>

    4.3 if指令

    if指令用于判断

    (1)在模板文件中使用if指令进行判断

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

    (2)在java代码中为success变量赋值

    map.put("success", true);

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

    4.4 list指令

    list指令用于遍历

    (1)在模板文件中使用list指令进行遍历

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

     (2)在java代码中为goodsList赋值

    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);

    更多相关内容
  • Freemarker页面静态化

    2021-05-06 14:10:52
    1、什么是页面静态华 将动态页面转化成静态的html,降低与数据库的交互次数,提高页面的访问速度 就是服务器在请求来之前把已经固定好的东西先编译好了,等请求来了再动态的填数据,不要等请求来了什么都没做忙得...

    1、什么是页面静态华

    将动态页面转化成静态的html,降低与数据库的交互次数,提高页面的访问速度
    就是服务器在请求来之前把已经固定好的东西先编译好了,等请求来了再动态的填数据,不要等请求来了什么都没做忙得半死
    利用第三方提供的模板引擎,生成对应的html
    thymeleaf
    freemark
    Velocity

    2、为什么要使用网页静态化技术

    网页静态化技术和缓存技术的共同点都是为了减轻数据库的访问压力 而网页静态化比较适合大规模且相对变化不太频繁的数据。另外网页静态化还有利于SEO。 将网页以纯静态化的形式展现,就可以使用Nginx这样的高性能的web服务器来部署 Nginx可以承载5万的并发,而Tomcat只有几百

    3、Freemarker

    3.1、什么是 Freemarker

    freemarker是apache的一个开源的模板引擎,它基于模板来生成文本输出。
    freemaker模板引擎可以通过模板和数据生成静态化页面.

    3.2、优点

    1. 提前根据模板和数据生成静态化页面通过io流将页面写入到硬盘上, 访问的时候直接访问.就不用访问数据库了, 可以大大提高数据库的高并发读取性能. 是数据库访问量降低.

    1. 由于页面是提前生成好的, 所以访问速度快, 客户体验好
    2. 由于html不需要tomcat解析浏览器可以直接访问, 所以给tomcat降低高并发访问压力.

     

    3.3、使用场景

    新闻网站新闻页面通过freemarker提前生成好 电商网站商品详情页面通过freemarker提前生成好 原则:页面有固定的样式, 并且一次生成多次读取, 尽量少的改动数据

    3.4、运行过程

    3.5、模板

    模板在freemarker中是以.ftl为后缀名的文件, 在模板中可以使用html标签, css, js,图片等静态资源
    模板中可以使用el表达式获取数据, 但是无法使用jstl标签来判断和循环, 所以模板引擎会有自己的一套标签库供我们使用.

    3.6、数据

    数据一般存储在关系型数据库或者redis或者mongodb中获取.

    3.7、模板文件中四种元素

    1. 文本,直接输出的部分
    2. 注释,即<#—…—>格式不会输出
    3. 插值(Interpolation):即${..}部分,将使用数据模型中的部分替代输出
    4. FTL指令:FreeMarker指令,和HTML标记类似,名字前加#予以区分,不会输出

    4、入门程序

    4.1、创建Maven工程

    4.2、引入pom依赖

    <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.23</version>
    </dependency>

    创建模板文件

    <html>
    <head>
        <meta charset="utf-8">
        <title>Freemarker入门小DEMO </title>
    </head>
    <body>
    <#--注释内容  -->
    ${name},你好。${message}
    </body>
    </html>

    生成文件

    创建一个测试类

    public class TestFreemarker {
        /*
        第一步:创建一个 Configuration 对象,直接 new 一个对象。构造方法的参数就是 freemarker的版本号。
        第二步:设置模板文件所在的路径。
        第三步:设置模板文件使用的字符集。一般就是 utf-8.
        第四步:加载一个模板,创建一个模板对象。
        第五步:创建一个模板使用的数据集,可以是 pojo 也可以是 map。一般是 Map。
        第六步:创建一个 Writer 对象,一般创建一 FileWriter 对象,指定生成的文件名。
        第七步:调用模板对象的 process 方法输出文件。
        第八步:关闭流
         */
        public static void main(String[] args) throws Exception {
            //1.创建配置类
            Configuration configuration=new Configuration(Configuration.getVersion());
            //2.设置模板所在的目录(绝对路径)
            configuration.setDirectoryForTemplateLoading(new File("D:\\java\\撩课-高新强\\分布式项目(代码)\\code2\\FreeMarkerPro\\src\\main\\resources\\ftl"));
            //3.设置字符集
            configuration.setDefaultEncoding("utf-8");
            //4.加载模板
            Template template = configuration.getTemplate("MyFreemark.ftl");
            //5.创建数据模型
            Map map=new HashMap();
            map.put("name", "joker");
            map.put("message", "welcome Freemarker");
            //6.创建Writer对象
            Writer out =new FileWriter(new File("d:\\test.html"));
            //7.输出
            template.process(map, out);
            //8.关闭Writer对象
            out.close();
        }
    }

    4.3、点击测试

    生成文件在D:test.html

    5、FTL指令

    5.1、assign指令

    此指令用于在页面上定义一个变量

    <#assign myname="Myxq--">
    ${myname}

    定义对象类型

    <#assign info={"name":"myxqName",'age':'30'} >
    电话:${info.name}  地址:${info.age}

    5.2、list指令

    遍历数组

      List goodsList=new ArrayList();
            goodsList.add("goods1");
            goodsList.add("goods2");
            goodsList.add("goods3");
            Map map=new HashMap();
            map.put("goodsList",goodsList);
            //6.创建Writer对象
            Writer out =new FileWriter(new File("d:\\test.html"));
            //7.输出
            template.process(map, out);

    <#list users as user>
        ${user_index} --- ${user.name}--${user.age}
    </#list>

    5.3、if指令

    <#assign myname="myxq">
    <#if myname="myxq">
        <h1>大标题1myxq</h1>
    <#else>
        <h1>大标题2</h1>
    </#if>

    5.4、include指令

    用于模板文件的嵌套

     <#include "header.ftl">

    总结

    与缓存技术一样都是为了减轻数据库的访问压力,而网页静态化比较适合大规模且相对变化不太频繁的数据。另外网页静态化还有利于SEO。 将网页以纯静态化的形式展现,就可以使用Nginx这样的高性能的web服务器来部署,Nginx可以承载5万的并发,而Tomcat只有几百,这也是Freemarker的优势。

     

    展开全文
  • 页面静态化技术freemarker三.Freemarker基本操作1.引入依赖:2.创建模板文件:3.FTL指令:四.freemarker整合spring五.总结:1.什么是网页静态化技术2.网页静态化技术与缓存技术的比较3.网页静态化技术的应用场景4....

    一.背景

    用户访问动态页面时都需要通过ajax发送请求查询数据库获取动态数据进行展示,但是这页面的访问量如果比较大且数据库中的数据变化频
    率并不高,这就会对数据库造成了很大的访问压力。如何对数据库减压并提高系统运行性能呢?答案就是页面静态化。

    页面静态化其实就是将原来的动态网页(例如通过ajax请求动态获取数据库中的数据并展示的网页)改为通过静态化技术生成的静态网页,这样用户在访问网页时,服务器直接给用户响应静态html页面,没有了动态查询数据库的过程。

    二.页面静态化技术freemarker

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

    在这里插入图片描述

    三.Freemarker基本操作

    1.引入依赖:

    <dependency> 	
    	<groupId>org.freemarker</groupId> 
    	<artifactId>freemarker</artifactId> 
    	<version>2.3.23</version> 
    </dependency>
    

    2.创建模板文件:

    模板文件中有四种元素:

    • html原生文本
    • 注释,即<#-- -->
    • 插值::即${…}部分,将使用数据模型中的部分替代输出
    • FTL指令::FreeMarker指令,和HTML标记类似,名字前加#予以区分,不会输出
      freemarker模板文件后缀一般为 .ftl

    编写模板文件:

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

    通过java结合模板文件生成html文件

    public static void main(String[] args) throws Exception{ 
    
    //1.创建配置类 
    
    	Configuration configuration=new Configuration(Configuration.getVersion()); 
    
    //2.设置模板所在的 目录 
    
    	configuration.setDirectoryForTemplateLoading(new File("D:\\ftl")); 
    
    //3.设置字符集 
    
    	configuration.setDefaultEncoding("utf-8"); 
    
    //4.加载模板 (模板目录下以ftl后缀的模板文件)
    
    	Template template = configuration.getTemplate("test.ftl"); 
    
    //5.创建数据模型 
    
    	Map map=new HashMap(); 
    
    	map.put("name", "张三"); 
    
    	map.put("message", "欢迎!"); 
    
    //6.创建Writer对象 ,创建html生成的目录
    
    	Writer out =new FileWriter(new File("d:\\test.html")); 
    
    //7.输出 
    
    	template.process(map, out); 
    
    //8.关闭Writer对象 
    
    	out.close(); 
    
    }
    

    生成的html文件如下:(对应的$ {name}、$ {message}被成功替换)

    <html> 
    	<head>
    		<meta charset="utf-8"> 
    		<title>Freemarker入门</title> 
    	</head>
    	<body>
     张三你好,欢迎 
     	</body>
    </html>
    

    3.FTL指令:

    • assign指令:用于在页面上定义一个变量
    1. 定义一个简单类型

    <#assign linkman=“周先生”>
    联系人:${linkman}

    1. 定义一个json对象

    <#assign info={“mobile”:“123456”,‘address’:‘地球’} >
    电话:$ {info.mobile} 地址:$ {info.address}

    • include指令:用于模板文件的嵌套。一个模板引入另一个模板
    <!--head.ftl-->
    <h1> hello</h1>
    
    <!--test.ftl-->
    <#include "head.ftl"/>
    <br>
    world
    

    最终生成的html文件

    <h1>hello</h1>
    <br>
    world
    
    • if 指令:在模板文件中使用指令进行判断
    <#if success=true>
    	 你已通过实名认证 
    <#else>
     	 你未通过实名认证 
    </#if>
    

    在java中:

    map.put("success", true);
    
    • list指令:list指令用于遍历

    模板文件

    <#list>
    商品名称: ${goods.name} 价格:${goods.price}
    <br>
    </#list>
    

    java代码

    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);
    

    以上就是freemarker的基本用法,但是在实际开发中freemarker要远远复杂的多。

    四.freemarker整合spring

    依赖引入和上面一样:

    <dependency> 	
    	<groupId>org.freemarker</groupId> 
    	<artifactId>freemarker</artifactId> 
    	<version>2.3.23</version> 
    </dependency>
    

    spring配置文件:

    <bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer"> 
    <!--指定模板文件所在目录--> 
    	<property name="templateLoaderPath" value="/WEB-INF/ftl/" />
     <!--指定字符集-->
     	<property name="defaultEncoding" value="UTF-8" /> 
    </bean> 
     <context:property-placeholder location="classpath:freemarker.properties"/>
    
    //生成的html文件所存放的位置
    out_put_path=D:/ideaProjects/zj/health_mobile/src/main/webapp/pages
    

    通用生成html文件样式:

    /**
    * templateName模板文件的名称
    * htmlPageName生成html文件的名称
    * map  给${} 赋值的映射关系
    */
     public void generteHtml(String templateName,String htmlPageName,Map map){
            Configuration configuration = freeMarkerConfigurer.getConfiguration();//获得配置对象
            Writer out = null;
            try {
                Template template = configuration.getTemplate(templateName);
                //构造输出流
                out = new FileWriter(new File(outPutPath + "/" + htmlPageName));
                //输出文件
                template.process(map,out);
                out.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    

    五.总结:

    1.什么是网页静态化技术

    随着用户访问量以及数据量的增大,网页静态化技术方案如今越来越流行。
    什么是网页静态化技术呢?简单来说就是将网页以纯静态方式的形式展现。

    2.网页静态化技术与缓存技术的比较

    共同点:都可以减小数据库的访问压力。

    区别:

    (1)缓存技术(例如redis)适用于小规模的数据。以及一些经常变动的数据

    (2)网页静态化技术适用于大规模但是变化不太频繁的数据

    3.网页静态化技术的应用场景

    (1)新闻门户网站的文章类型频道一般都用到了网页静态化技术。点击新闻直接会跳到静态化的页面。
    (2)电商网站的商品详情页也十分常用,我们在存储商品的时候会生成静态化页面,点击商品详情,会直接跳到生成的商品详情的静态化页面。
    (3)网页静态化技术可以结合Nginx这种高性能web服务器来提高并发访问量。

    4.什么是FreeMarker

    FreeMarker是一款用Java语言编写的模板引擎,用它可以通过模板和要改变的数据来生成输出文本(例如HTML网页,配置文件,源代码等),作为用来实现网页静态化技术的一种手段。FreeMarker的使用率大大超过其他一些技术。对于系统中频繁使用数据库进行查询但是内容更新很小的应用,都可以用FreeMarker将网页静态化,这样就避免了大量的数据库访问请求,从而提高网站的性能。

    其他链接:
    freemarker官网

    展开全文
  • 目前企业中:主要用 Freemarker静态页面或是页面展示 总结:freemarker 模版引擎,可以使用 Freemarker 模版生成 html 页面Freemarker 语法 /** * freemark入门案例 * freemark三要素: * 1.
  • FreeMarker页面静态化

    2020-03-15 19:37:15
    页面静态化及页面发布流程图如下: 业务流程如下: 1、获取模型数据 2、制作模板 3 、对页面进行静态化 4、将静态化生成的html页面存放文件系统中 5、将存放在文件系统的html文件发布到服务器 FreeMarker介绍...

    如何对页面进行静态化?
    一个页面等于模板加数据,在添加页面的时候我们选择了页面的模板。
    页面静态化就是将页面模板和数据通过技术手段将二者合二为一,生成一个html网页文件。
    页面静态化及页面发布流程图如下:
    在这里插入图片描述

    业务流程如下:
    1、获取模型数据
    2、制作模板
    3 、对页面进行静态化
    4、将静态化生成的html页面存放文件系统中
    5、将存放在文件系统的html文件发布到服务器

    FreeMarker介绍

    freemarker是一个用Java开发的模板引擎

    常用的java模板引擎还有哪些?
    Jsp、Freemarker、Thymeleaf 、Velocity 等。

    模板+数据模型=输出
    freemarker并不关心数据的来源,只是根据模板的内容,将数据模型在模板中显示并输出文件(通常为html,也可以生成其它格式的文本文件)

    FreeMarker快速入门

    reemarker作为springmvc一种视图格式,默认情况下SpringMVC支持freemarker视图格式。
    需要创建Spring Boot+Freemarker工程用于测试模板。
    创建一个freemarker 的测试工程专门用于freemarker的功能测试与模板的测试。
    pom.xml 如下

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <parent>
            <artifactId>xc-framework-parent</artifactId>
            <groupId>com.xuecheng</groupId>
            <version>1.0-SNAPSHOT</version>
            <relativePath>../xc-framework-parent/pom.xml</relativePath>
        </parent>
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>test-freemarker</artifactId>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-freemarker</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
            </dependency>
            <dependency>
                <groupId>com.squareup.okhttp3</groupId>
                <artifactId>okhttp</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
            </dependency>
            <dependency>
                <groupId>org.apache.commons</groupId>
                <artifactId>commons-io</artifactId>
            </dependency>
        </dependencies>
    </project>
    

    application.yml内容如下:

    server:
      port: 8088 #服务端口
    
    spring:
      application:
        name: test-freemarker #指定服务名
      freemarker:
        cache: false  #关闭模板缓存,方便测试
        settings:
          template_update_delay: 0 #检查模板更新延迟时间,设置为0表示立即检查,如果时间大于0会有缓存不方便进行模板测试
    
    
    

    在freemarker的测试工程下创建模型类型用于测试

    package com.xuecheng.test.freemarker.model;
    import lombok.Data;
    import lombok.ToString;
    import java.util.Date;
    import java.util.List;
    @Data
    @ToString
    public class Student {
        private String name;//姓名
        private int age;//年龄
        private Date birthday;//生日
        private Float money;//钱包
        private List<Student> friends;//朋友列表
        private Student bestFriend;//最好的朋友
    }
    

    创建模板

    在 src/main/resources下创建templates,此目录为freemarker的默认模板存放目录。
    在templates下创建模板文件test1.ftl,模板中的${name}最终会被freemarker替换成具体的数据。

    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf‐8">
        <title>Hello World!</title>
    </head>
    <body>
    Hello ${name}!
    </body>
    </html>
    

    创建Controller类,向Map中添加name,最后返回模板文件。

    package com.xuecheng.test.freemarker.controller;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.client.RestTemplate;
    import java.util.Map;
    @RequestMapping("/freemarker")
    @Controller
    public class FreemarkerController {
        @Autowired
        RestTemplate restTemplate;
        @RequestMapping("/test1")
        public String freemarker(Map<String, Object> map){
            map.put("name","黑马程序员");
            //返回模板文件名称
            return "test1";
        }
    }
    

    创建启动类

    @SpringBootApplication
    public class FreemarkerTestApplication {
        public static void main(String[] args) {
            SpringApplication.run(FreemarkerTestApplication.class,args);
        }
    }
    

    测试
    请求:http://localhost:8088/freemarker/test1
    屏幕显示: Hello 黑马程序员!

    FreeMarker基础

    Freemarker静态化依赖数据模型和模板
    下边方法形参map即为freemarker静态化所需要的数据模型,在map中填充数据:

     @RequestMapping("/test1")
        public String freemarker(Map<String, Object> map){
            //向数据模型放数据
            map.put("name","黑马程序员");
            Student stu1 = new Student();
            stu1.setName("小明");
            stu1.setAge(18);
            stu1.setMondy(1000.86f);
            stu1.setBirthday(new Date());
            Student stu2 = new Student();
            stu2.setName("小红");
            stu2.setMondy(200.1f);
            stu2.setAge(19);
    //        stu2.setBirthday(new Date());
            List<Student> friends = new ArrayList<>();
            friends.add(stu1);
            stu2.setFriends(friends);
            stu2.setBestFriend(stu1);
            List<Student> stus = new ArrayList<>();
            stus.add(stu1);
            stus.add(stu2);
            //向数据模型放数据
            map.put("stus",stus);
            //准备map数据
            HashMap<String,Student> stuMap = new HashMap<>();
            stuMap.put("stu1",stu1);
            stuMap.put("stu2",stu2);
            //向数据模型放数据
            map.put("stu1",stu1);
            //向数据模型放数据
            map.put("stuMap",stuMap);
            //返回模板文件名称
            return "test1";
        }
    

    List指令

    本节定义freemarker模板,模板中使用freemarker的指令,关于freemarker的指令需要知道:

    1、注释,即<#‐‐和‐‐>,介于其之间的内容会被freemarker忽略
    2、插值(Interpolation):即${..}部分,freemarker会用真实的值代替${..}
    3、FTL指令:和HTML标记类似,名字前加#予以区分,Freemarker会解析标签中的表达式或逻辑。
    4、文本,仅文本信息,这些不是freemarker的注释、插值、FTL指令的内容会被freemarker忽略解析,直接输出内
    容。
    

    在test1.ftl模板中使用list指令遍历数据模型中的数据:

    <table>
        <tr>
         <td>序号</td>    
            <td>姓名</td>
            <td>年龄</td>
            <td>钱包</td>
        </tr>
        <#list stus as stu>
            <tr>
                <td>${stu_index + 1}</td>
                <td>${stu.name}</td>
                <td>${stu.age}</td>
                <td>${stu.mondy}</td>
            </tr>
        </#list>
    </table>
    

    说明:
    _index:得到循环的下标,使用方法是在stu后边加"_index",它的值是从0开始

    遍历Map数据

    模板

    输出stu1的学生信息:<br/>
    姓名:${stuMap['stu1'].name}<br/>
    年龄:${stuMap['stu1'].age}<br/>
    输出stu1的学生信息:<br/>
    姓名:${stuMap.stu1.name}<br/>
    年龄:${stuMap.stu1.age}<br/>
    遍历输出两个学生信息:<br/>
    <table>
        <tr>
            <td>序号</td>
            <td>姓名</td>
            <td>年龄</td>
            <td>钱包</td>
        </tr>
    <#list stuMap?keys as k>
    <tr>
        <td>${k_index + 1}</td>
        <td>${stuMap[k].name}</td>
        <td>${stuMap[k].age}</td>
        <td >${stuMap[k].mondy}</td>
    </tr>
    </#list>
    </table>
    

    if指令

    if 指令即判断指令,是常用的FTL指令,freemarker在解析时遇到if会进行判断,条件为真则输出if中间的内容,否
    则跳过内容不再输出。
    模板

    <table>
        <tr>
            <td>姓名</td>
            <td>年龄</td>
            <td>钱包在这里插入代码片</td>
        </tr>
        <#list stus as stu>
            <tr>
                <td <#if stu.name =='小明'>style="background:red;"</#if>>${stu.name}</td>
                <td>${stu.age}</td>
                <td >${stu.mondy}</td>
            </tr>
        </#list>
    </table>
    

    空值处理

    判断某变量是否存在使用 “??” 用法为:variable??,如果该变量存在,返回true,否则返回false
    例:为防止stus为空报错可以加上判断如下:

    	<#if stus??>
        <#list stus as stu>
         ......    
        </#list>
        </#if>
    

    缺失变量默认值使用 “!” 使用!要以指定一个默认值,当变量为空时显示默认值。
    例: ${name!’’}表示如果name为空显示空字符串
    如果是嵌套对象则建议使用()括起来
    例: ${(stu.bestFriend.name)!’’}表示,如果stu或bestFriend或name为空默认显示空字符串

    内建函数

    内建函数语法格式: 变量+?+函数名称
    1、和到某个集合的大小
    ${集合名?size}
    2、日期格式化

    显示年月日: ${today?date}
    显示时分秒:${today?time}  
    显示日期+时间:${today?datetime} <br>       
    自定义格式化:  ${today?string("yyyy年MM月")}
    

    3、内建函数c
    map.put(“point”, 102920122);
    point是数字型,使用${point}会显示这个数字的值,并每三位使用逗号分隔。
    如果不想显示为每三位分隔的数字,可以使用c函数将数字型转成字符串输出
    ${point?c}
    4、将json字符串转成对象
    一个例子:
    其中用到了 assign标签,assign的作用是定义一个变量。

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

    使用模板文件静态化

    //基于模板生成静态化文件
    @Test
    public void testGenerateHtml() throws IOException, TemplateException {
        //创建配置类
        Configuration configuration=new Configuration(Configuration.getVersion());
         //设置模板路径
        String classpath = this.getClass().getResource("/").getPath();
        configuration.setDirectoryForTemplateLoading(new File(classpath + "/templates/"));
        //设置字符集
        configuration.setDefaultEncoding("utf‐8");
        //加载模板
        Template template = configuration.getTemplate("test1.ftl");
        //数据模型
        Map<String,Object> map = new HashMap<>();
        map.put("name","黑马程序员");
        //静态化
        String content = FreeMarkerTemplateUtils.processTemplateIntoString(template, map);
        //静态化内容
        System.out.println(content);
        InputStream inputStream = IOUtils.toInputStream(content);
        //输出文件
        FileOutputStream fileOutputStream = new FileOutputStream(new File("d:/test1.html"));
        int copy = IOUtils.copy(inputStream, fileOutputStream);
    }
    

    使用模板字符串静态化

    //基于模板字符串生成静态化文件
    @Test
    public void testGenerateHtmlByString() throws IOException, TemplateException {
        //创建配置类
        Configuration configuration=new Configuration(Configuration.getVersion());
        //模板内容,这里测试时使用简单的字符串作为模板
        String templateString="" +
                "<html>\n" +
                "    <head></head>\n" +
                "    <body>\n" +
                "    名称:${name}\n" +
                "    </body>\n" +
                "</html>";
      
        //模板加载器
        StringTemplateLoader stringTemplateLoader = new StringTemplateLoader();
        stringTemplateLoader.putTemplate("template",templateString);
        configuration.setTemplateLoader(stringTemplateLoader);
        //得到模板
        Template template = configuration.getTemplate("template","utf‐8");
        //数据模型
        Map<String,Object> map = new HashMap<>();
        map.put("name","黑马程序员");
        //静态化
        String content = FreeMarkerTemplateUtils.processTemplateIntoString(template, map);
        //静态化内容
        System.out.println(content);
        InputStream inputStream = IOUtils.toInputStream(content);
        //输出文件
        FileOutputStream fileOutputStream = new FileOutputStream(new File("d:/test1.html"));
        IOUtils.copy(inputStream, fileOutputStream);
    }
    
    展开全文
  • Freemarker 导入坐标 <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.23</version> </dependency> 创建...
  • 文章目录freemarker页面静态化介绍为什么使用页面静态化Freemarker入门案例 freemarker页面静态化介绍 FreeMarker原理  FreeMarker是一个基 于Java的开发包和类库的一种将模板和数据进行整合并输出文本的通用...
  • Java使用Freemarker页面静态化生成实现

    多人点赞 热门讨论 2022-06-19 20:04:08
    构造方法的参数就是 freemarker的版本号。第二步:设置模板文件所在的路径。第三步:设置模板文件使用的字符集。一般就是 utf-8。第四步:加载一个模板,创建一个模板对象。第五步:创建一个模板使用的数据集,可以...
  • Freemarker 页面静态化详解

    千次阅读 2016-08-03 19:33:24
    Freemarker的语言概述 FreeMarker是一个模板引擎,一个基于模板生成...虽然FreeMarker具有一些编程的能力,但通常由Java程序准备要显示的数据,由FreeMarker生成页面,通过模板显示准备的数据(如下图) Freemarke
  • 一、在springMVC文件中配置freemarker视图解析器 二、建立模型文件(freemarker完全支持el表达式语言) 我的目录是:WebContent/WEB-INF/view/index.ftl,建立一个文件后缀为ftl即可! &lt;!DOCTYPE ...
  • freemarker页面静态化/页面预览 项目结构图 配置文件 pom.xml <!-- springboot 中自带的页面渲染工具为thymeleaf 还有freemarker 这两种模板引擎 --> <dependency> <groupId>org.spring...
  • freemarker页面静态化

    2019-09-10 19:13:20
    这里我们以网页静态化技术之一的Freemarker 为例子。以电商为原型 对于电商网站的商品详情页来说,至少几百万个商品,每个商品又有大量的信息,这样的情况同样也适用于使用网页静态化来解决 网页静态化技术和缓存...
  • Freemarker 页面静态化

    2015-11-20 16:53:31
    FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,...l 虽然FreeMarker具有一些编程的能力,但通常由Java程序准备要显示的数据,由FreeMarker生成页面,通过模板显示准备的数据(如下图) 模板 + 

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,228
精华内容 4,891
关键字:

freemarker页面静态化