ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Freemarker入门

2019-12-30 23:03:59  阅读:245  来源: 互联网

标签:入门 FreeMarker Freemarker personMap put freemarker 模板 页面


什么是 FreeMarker?

FreeMarker 是一款 模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。

模板编写为FreeMarker Template Language (FTL)。它是简单的,专用的语言, 不是 像PHP那样成熟的编程语言。 那就意味着要准备数据在真实编程语言中来显示,比如数据库查询和业务运算, 之后模板显示已经准备好的数据。在模板中,你可以专注于如何展现数据, 而在模板之外可以专注于要展示什么数据。

Figure

这种方式通常被称为 MVC (模型 视图 控制器) 模式,对于动态网页来说,是一种特别流行的模式。 它帮助从开发人员(Java 程序员)中分离出网页设计师(HTML设计师)。设计师无需面对模板中的复杂逻辑, 在没有程序员来修改或重新编译代码时,也可以修改页面的样式。

而FreeMarker最初的设计,是被用来在MVC模式的Web开发框架中生成HTML页面的,它没有被绑定到 Servlet或HTML或任意Web相关的东西上。它也可以用于非Web应用环境中。

FreeMarker 是免费的, 基于Apache许可证2.0版本发布。

作用与优点

作用:freemarker模板引擎可以通过模板和数据生成静态页面

优点:

1.提前根据模板和数据生成静态化页面 可以通过IO流 将页面写在硬盘上 访问的时候直接进行访问不去访问数据库 提高了用户的体验度

2.以往用JSP展现数据时,程序员并不熟悉界面设计技术,反之界面开发人员,也并不熟悉程序语言。协调工作很困难,使用FreeMarker后,作为界面开发人员,只专心创建HTML文件、图像以及Web页面的其他可视化方面,不用理会数据;而程序开发人员则专注于系统实现,负责为页面准备要显示的数据。

3.由于是静态页面 所以html不需要tomcat解析浏览器就可以直接访问

缺点:

应用FreeMarker模板技术,在修改模板后,可能会看到已经过期的数据。如:生成静态的HTML页面后,如果一旦模板改变,而没有及时更新模板生成的HTML页面的话,用户看到的就是过期的数据。

使用场景

1.新闻网站 新闻页面 通过freemarker提前生成好

2.电商网站的商品详情页面 通过freemarker提前生成的

原则:页面固定的样式 并且一次生成多次读取  尽量的少改动数据 

同类技术


和freemarker同类型的技术

velocity技术-------------------也是一个模板引擎框架 但是被freemarker所替代

模板:在freemarker中式以.ftl为后缀的文件。模板中可以使用CSS JS img 图片等静态资源 可以使用el表达式来获取数据 

无法使用jstl来进行判断和循环 但是自身有一套标签库可以提供我们使用

数据:一般存在在关系型数据库 redis mongodb 中

使用步骤和入门Demo

使用步骤:

第一步:创建一个Configuration对象,直接new一个对象。
第二步:设置模板文件所在的路径。
第三步:设置模板文件使用的字符集。一般就是utf-8.
第四步:加载一个模板,创建一个模板对象。
第五步:创建一个模板使用的数据集,可以是pojo也可以是map。一般是Map。
第六步:创建一个Writer对象,一般创建一FileWriter对象,指定生成的文件名。
第七步:调用模板对象的process方法输出文件。
第八步:关闭流。

第一步  引入meven中的POM.xml

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

第二步 代码引入

    public static void main(String[] args) throws Exception{
        //1创建模板引擎
        Configuration conf = new Configuration();
        //2加载模板所在路径位置
        conf.setDirectoryForTemplateLoading(new File("E:\\ideaProject\\freemarkerDemo\\src\\main\\resources\\ftl"));
        //3加载模板对象
        Template template = conf.getTemplate("test.ftl");
        //4模拟假数据   将这些数据放入到模板中
        Map<String, Object> rootMap = new HashMap<String,Object>();
        rootMap.put("name","张三");
        rootMap.put("message","这是一个freemarker生成的静态页面");
        // 模拟List集合数据
        List<String> personList =  new ArrayList<String>();
        personList.add("青龙");
        personList.add("白虎");
        personList.add("老牛");
        personList.add("龙头");
        rootMap.put("personList",personList);
        //  模拟Map集合数据
        Map<String, String> personMap = new HashMap<>();
        personMap.put("001","韦小宝");
        personMap.put("002","双儿");
        personMap.put("003","阿珂");
        personMap.put("004","建宁");
        personMap.put("005","龙儿");
        personMap.put("006","曾柔");
        rootMap.put("personMap",personMap);
     //模拟日期格式 rootMap.put("today",new Date());
     //模拟资薪中间的间隔 rootMap.put("point",882168988); // 5 创建io流 流中指定文件输出位置和文件名 Writer out = new FileWriter(new File("E:\\ideaProject\\freemarkerDemo\\src\\main\\java\\admin\\hhh.html")); // 6生成静态页面 template.process(rootMap,out); // 7关闭流 out.close();

第三步 所对应的ftl文件

<html>
<head>
    <meta charset="utf-8"/>
    <title>Freemarker入门小demo</title>
</head>
<body>
<#--引入外部页面-->
<#include "head.ftl"/>
<#--我只是一个注释我不会有任何的输出-->
姓名:${name} <br>
简述:${message}  <br/>
<#assign linkman="李四">
<#assign linkman="王五">
联系人:${linkman}
<#assign info={"mobile":"1588888","address":"这是一个地址XXXXX"}>
电话:${info.mobile} 地址:${info.address}


<#--去List集合数据-->
<#list personList as person>
    <#if person_index==0>
        这是第一次循环
    <#else>
        这是第${person_index+1}次循环
    </#if>
    集合索引 ${person_index}
    ${person}
</#list>
共${personList?size}条记录

<#--获取map集合中的数据-->
<#list personMap?keys as key>
    map中的key为:${key} map中的value为:${personMap[key]}
</#list>
当前日期:${today?date}<br>
当前时间:${today?time}<br>
当前 日期+时间   :${today?datetime}<br>
格式化:${today?string("yyyy年MM月dd日")}<br>
${point}<br>
累计月薪 ${point?c}
<#if aaa??>
    aaa变量存在
<#else>
    aaa变量不存在
</#if>
${aaa!'这个aaa变量不存在'}
</body>
</html>

第四步 生成静态页面 效果

语法详解

数据类型

和java不同,FreeMarker不需要定义变量的类型,直接赋值即可。

字符串: value = "xxxx" 。如果有特殊字符 string = r"xxxx" 。单引号和双引号是一样的。

数值:value = 1.2。数值可以直接等于,但是不能用科学计数法。

布尔值:true or  false。

List集合:list = [1,2,3] ; list=[1..100] 表示 1 到 100 的集合,反之亦然。

Map集合:map = {"key" : "value" , "key2" : "value2"},key 必须是字符串哦!

实体类:和EL表达式差不多,直接点出来。

字符串操作

字符串连接:可以直接嵌套${"hello , ${name}"} ; 也可以用加号${"hello , " + name}

字符串截取:string[index]。index 可以是一个值,也可以是形如 0..2 表示下标从0开始,到下标为2结束。一共是三个数。

比较运算符

== (等于),!= (不等于),gt(大于),gte(大于或者等于),lt(小于),lte(小于或者等于)。不建议用 >,<  可能会报错!

一般和 if 配合使用

内建函数

FreeMarker 提供了一些内建函数来转换输出,其结构:变量?内建函数,这样就可以通过内建函数来转换输出变量。

1. html: 对字符串进行HTML编码;
2. cap_first: 使字符串第一个字母大写;
3. lower_case: 将字符串转成小写;
4. upper_case: 将字符串转成大写;
5. size: 获得集合中元素的个数;
6. int: 取得数字的整数部分。

变量空判断

 !    指定缺失变量的默认值;一般配置变量输出使用
??    判断变量是否存在。一般配合if使用 <#if value??></#if>

宏指令

可以理解为java的封装方法,供其他地方使用。宏指令也称为自定义指令,macro指令

语法很简单:<#macro val > 声明macro </#macro>; 使用macro <@val />  

命名空间

可以理解为java的import语句,为避免变量重复。一个重要的规则就是:路径不应该包含大写字母,使用下划线_分隔词语,myName --> my_name

语法很简单:<#import "xxx.ftl" as val> 

其他没有说明的语法是因为和java一样,没什么特别之处。所以没有列出来。

 

总结

1. 知道了FreeMarker是一块模版引擎,可以生产xml,html,java等文件

2. 知道了FreeMarker文件提供占位符,java文件提供数据,通过FreeMarker模版引擎生产有数据的页面,文中是将数据放在Map中。web应用可以用setter/getter 方法

3. 知道了FreeMarker语法中字符串的显示特殊字符,截取的操作。以及一些内置方法的使用

4. 重点了解FreeMarker的空判断知识点。判断变量是否为空用 "??" ,如果变量为空设置默认值。如果不注意空问题,可能会出现黄色页面的提示哦!

5. FreeMarker的宏概念,命名空间,引入文件,给变量赋值,集合的遍历等。

6. Freemarker 整合SpringMVC。

标签:入门,FreeMarker,Freemarker,personMap,put,freemarker,模板,页面
来源: https://www.cnblogs.com/hank-hush/p/12121556.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有