freemarker 订阅
FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页、电子邮件、配置文件、源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。FreeMarker是免费的,基于Apache许可证2.0版本发布。其模板编写为FreeMarker Template Language(FTL),属于简单、专用的语言。需要准备数据在真实编程语言中来显示,比如数据库查询和业务运算, 之后模板显示已经准备好的数据。在模板中,主要用于如何展现数据, 而在模板之外注意于要展示什么数据 [1]  。 展开全文
FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页、电子邮件、配置文件、源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。FreeMarker是免费的,基于Apache许可证2.0版本发布。其模板编写为FreeMarker Template Language(FTL),属于简单、专用的语言。需要准备数据在真实编程语言中来显示,比如数据库查询和业务运算, 之后模板显示已经准备好的数据。在模板中,主要用于如何展现数据, 而在模板之外注意于要展示什么数据 [1]  。
信息
最新版本
FreeMarker 2.3.23
类    别
模板引擎
特    点
通用性高,模板语言强大
中文名
福瑞马克
外文名
FreeMarker
freemarker发展历史
FreeMarker最初的设计,是被用来在MVC模式的Web开发框架中生成HTML页面的,没有被绑定到Servlet或HTML或任意Web相关的东西上,它也可以用于非Web应用环境中。1999年末,FreeMarker的第一个版本出现在SourceForge网站上,它最初是由Benjamin Geer和Mike Bayer编写,他们定义了FreeMarker最基本的语法。FreeMarker 1获得了LGPL(宽通用公共许可证)的许可,其版权归属于Benjamin Geer。此外,Nicholas Cull、Holger Arendt等人对该项目也做出了主要贡献。在2002年初,Jonathan Revusky用JavaCC重写了FreeMarker的核心代码(语法和编译),虽然对FreeMarker 1尽量做到向后兼容,但几乎是完全重写了。Attila Szegedi对FreeMarker 2也有重要影响,除了重构和优化一些核心的API(应用程序编程接口),Attila还作为主要编写者实现了FreeMarker对日期、时间的支持,写出的freemarker.ext*包完成对javabean、Jython和XML的映射,以及HTTP servlet、JSP和Ant的集成。Dániel Dékány主要负责文档以及项目的维护(截至2011年,Dániel Dékány仍是该项目的主要维护者) [2]  。2002年3月18日,FreeMarker的第一个发布候选版2.0 RC1发布 [3]  ,又经过了2个候选版的BUG修复之后,正式版的Free Marker2.0于2002年4月18日发布 [4]  。2002年10月17日,FreeMarker 2.1 发布,该版本并不能与2.0版本兼容,所以使用者如果不是新建工程的话,需要重新审视已有的代码和模版 [5]  。由于项目没有法律实体,FreeMarker的2.0.x和2.1.x的版权仍归属Benjamin Geer。而在2002年12月制作2.2版本时,Benjamin Geer出于对自由开源许可的理解,将代码库版权转给Visigoth Software Society(西班牙的一个非营利性软件协会)和共同创办人Jonathan Revusky [2]  。2003年3月27日,FreeMarker 2.2 发布,这个版本引入了一些非常重要的新特性,但是有一些功能却不能逆向兼容 [6]  。在2.2的版本中,可能最重要的新特性就是namespace支持,这使得FreeMarker成为了合适大规模项目的工具,因为它允许不同页面分享的宏和变量没有任何名称空间冲突。同时,宏也变得更加强大,因为他们可以调用可选目标,并且宏现作为一流的变量,可以传递给其他宏使用。此外2.2中另一个吸引人的特性为,FreeMarker可以利用由第三方所写的JSP标记库 [7]  。在此之后,2.3版本之前,共更新了8个版本 [6]  。2004年6月15日,FreeMarker 2.3 发布,此版本对2.2系列进行了质量上的改进,以及引入了大量的新功能。最主要的改进点在于可以定义函数(方法)模版,插入字符串变量,支持宏参数和更为智能的默认对象包装。但2.3并不支持2.2.x的向后兼容,所以仅供新项目使用 [8]  。2005年1月4日的2.3.1版本到10月10日2.3.4版本主要是编写和维护一些新特性,以及BUG错误修复。2006年3月11日发布的2.3.5版本,因为发现严重错误而被撤回 [9]  ,在后续的2.3.6版本中修复。2.3.7时出了一个测试版本用于BUG修正和FreemarkerServlet的改进,其正式版中新增substring用于处理空的或缺失的变量 [10]  。 2006年7月9日发布2.3.8版本,提高了对JSP 2.0的兼容性 [11]  。2007年1月23日发布2.3.9版本,包含了对JDK 1.5枚举和通过BeansWrapper公共类字段的支持 [12]  。2007年4月20的2.3.10版本到2009年12月10日的2.3.16版本都是一些小性能改进和BUG修复。2011年5月17日,FreeMarker 2.3.17 发布,该版本主要进行了安全性的修复并扩充了一些内建函数 [13]  。2011年5月22日,FreeMarker 2.3.18 发布,修复jar包相关的bug [14]  。2012年2月29日,FreeMarker 2.3.19 发布,该版本修复了两个重要的bug,另外新增对JSON字符串进行处理的方法json_string等小改动 [15]  。2013年6月27日,FreeMarker 2.3.20 发布,主要对于使用IDE工具的修改 [16]  。2014年10月12日,FreeMarker 2.3.21 发布,对Java版本的最低要求从1.2变为1.4。由于旧的BSD风格许可不被OSI所承认,且Visigoth Software Society停滞不前,其许可变更为Apache 2.0版,所有者转为Attila Szegedi、Daniel Dekany和Jonathan Revusky(FreeMarker 2的主要开发者) [2]  。2015年3月1日,FreeMarker 2.3.22 发布,在FTL模板和Java方面做了一些更改 [17]  。2015年7月1日,FreeMarker经过投票进入了Apache Incubator,其项目授予给Apache软件基金会 [2]  。2015年7月5日,FreeMarker 2.3.23 发布,在FTL模板和Java上做了大量修改。尤其增加了list中items和else的字指令,使常见遍历任务更简单 [18]  。2015年9月2日,FreeMarker的主代码库从GitHub导入到Apache软件基金会的基础设施中发展 [2]  。2018年3月21日,FreeMarker在Apache Incubator中升级为顶级项目 [2]  。
收起全文
精华内容
参与话题
问答
  • Freemarker

    万次阅读 2019-09-09 23:21:06
    1. 什么是Freemarker 在java领域,表现层技术主要有三种:jsp、freemarker、velocity。 jsp是大家最熟悉的技术 优点: 1、功能强大,可以写java代码 2、支持jsp标签(jsp tag) 3、支持表达式语言(el) 4、官方...

    1. 什么是Freemarker

    在java领域,表现层技术主要有三种:jspfreemarkervelocity

    jsp是大家最熟悉的技术
    优点:
    1、功能强大,可以写java代码
    2、支持jsp标签(jsp tag)
    3、支持表达式语言(el)
    4、官方标准,用户群广,丰富的第三方jsp标签库
    5、性能良好。jsp编译成class文件执行,有很好的性能表现
    缺点:
    jsp没有明显缺点,非要挑点骨头那就是,由于可以编写java代码,如使用不当容易破坏mvc结构。

    velocity是较早出现的用于代替jsp的模板语言
    优点:
    1、不能编写java代码,可以实现严格的mvc分离
    2、性能良好,据说比jsp性能还要好些
    3、使用表达式语言,据说jsp的表达式语言就是学velocity的
    缺点:
    1、不是官方标准
    2、用户群体和第三方标签库没有jsp多。
    3、对jsp标签支持不够好
    freemarker
    优点:
    1、不能编写java代码,可以实现严格的mvc分离
    2、性能非常不错
    3、对jsp标签支持良好
    4、内置大量常用功能,使用非常方便
    5、宏定义(类似jsp标签)非常方便
    6、使用表达式语言
    缺点:
    1、不是官方标准
    2、用户群体和第三方标签库没有jsp多
    选择freemarker的原因:
    1、性能。velocity应该是最好的,其次是jsp,普通的页面freemarker性能最差(虽然只是几毫秒到十几毫秒的差距)。但是在复杂页面上(包含大量判断、日期金额格式化)的页面上,freemarker的性能比使用tag和el的jsp好。
    2、宏定义比jsp tag方便
    3、内置大量常用功能。比如html过滤,日期金额格式化等等,使用非常方便
    4、支持jsp标签
    5、可以实现严格的mvc分离

    JSP页面前后端的代码写到了一起,耦合度很高,前端开发需要熟悉后台环境,需要去调试。而让后台开发去做不熟悉的界面设计。对两者而言,交替性的工作需要花费一定的学习成本,效率低下。 使用FreeMarker后,前后端完全分离,大家各干各的,互不影响。
    JSP功能强大,可以写Java代码,但是页面会有大量业务逻辑,不利于维护和阅读,更不利于前后台分工,容易破坏MVC结构,所以舍弃JSP,选择使用FreeMarker是大势所趋。
    众所周知,JSP在第一次执行的时候需要转换成Servlet类,之后的每次修改都要编译和转换。这样就造成了每次修改都需要等待编译的时间,开发效率低下。 而FreeMarker模板技术并不存在编译和转换的问题,所以就不会存在上述问题。相比而言,使用freeMark可以提高一定的开发效率

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

    目前企业中:主要用Freemarker做静态页面或是页面展示

    2. Freemarker的使用方法

    把freemarker的jar包添加到工程中。
    Maven工程添加依赖

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

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

    模板:
    ${hello} 

    @Test
        public void genFile() throws Exception {
            // 第一步:创建一个Configuration对象,直接new一个对象。构造方法的参数就是freemarker对于的版本号。
            Configuration configuration = new Configuration(Configuration.getVersion());
            // 第二步:设置模板文件所在的路径。
            configuration.setDirectoryForTemplateLoading(new File("D:/workspaces-itcast/term197/taotao-item-web/src/main/webapp/WEB-INF/ftl"));
            // 第三步:设置模板文件使用的字符集。一般就是utf-8.
            configuration.setDefaultEncoding("utf-8");
            // 第四步:加载一个模板,创建一个模板对象。
            Template template = configuration.getTemplate("hello.ftl");
            // 第五步:创建一个模板使用的数据集,可以是pojo也可以是map。一般是Map。
            Map dataModel = new HashMap<>();
            //向数据集中添加数据
            dataModel.put("hello", "this is my first freemarker test.");
            // 第六步:创建一个Writer对象,一般创建一FileWriter对象,指定生成的文件名。
            Writer out = new FileWriter(new File("D:/temp/term197/out/hello.html"));
            // 第七步:调用模板对象的process方法输出文件。
            template.process(dataModel, out);
            // 第八步:关闭流。
            out.close();
        }

    3. 模板的语法

    访问map中的key
    ${key}

    访问pojo中的属性
    Student对象。学号、姓名、年龄
    ${key.property}

    取集合中的数据
    <#list 集合 as 循环的变量>

    <#list studentList as student>
    ${student.id}/${studnet.name}
    </#list>

    去循环中的下标

    <#list studentList as student>
        ${student_index}
    </#list>

     判断

    <#if student_index % 2 == 0>
    <#else>
    </#if>

     日期类型格式化 

     

    Null值的处理

    Include标签

    4. Freemarker整合spring

    4.1. 创建整合spring的配置文件

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <bean id="freemarkerConfig" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">

        <property name="templateLoaderPath" value="/WEB-INF/ftl/" />

        <property name="defaultEncoding" value="UTF-8" />

        <property name="freemarkerSettings">

        <!-- 设置默认的编码方式,原先是GBK,需要设置成utf-8 -->

        <props>

            <!--用于解决前端报空指针问题 不用再空值后面+ !号-->

            <prop key="classic_compatible">true</prop>

            <!-- <prop key="defaultEncoding">utf-8</prop>

            <prop key="template_exception_handler">rethrow</prop>

        </props>

        </property>

      </bean>

    </beans>

    需要编写一Controller进行测试

    4.2 Controller

    请求的url:/genhtml
    参数:无
    返回值:ok (String, 需要使用@ResponseBody)
    业务逻辑:
    1、从spring容器中获得FreeMarkerConfigurer对象。
    2、从FreeMarkerConfigurer对象中获得Configuration对象。
    3、使用Configuration对象获得Template对象。
    4、创建数据集
    5、创建输出文件的Writer对象。
    6、调用模板对象的process方法,生成文件。
    7、关闭流。

    加载配置文件:

    @Controller
    public class HtmlGenController {
        
        @Autowired
        private FreeMarkerConfigurer freeMarkerConfigurer;
    
        @RequestMapping("/genhtml")
        @ResponseBody
        public String genHtml()throws Exception {
            // 1、从spring容器中获得FreeMarkerConfigurer对象。
            // 2、从FreeMarkerConfigurer对象中获得Configuration对象。
            Configuration configuration = freeMarkerConfigurer.getConfiguration();
            // 3、使用Configuration对象获得Template对象。
            Template template = configuration.getTemplate("hello.ftl");
            // 4、创建数据集
            Map dataModel = new HashMap<>();
            dataModel.put("hello", "1000");
            // 5、创建输出文件的Writer对象。
            Writer out = new FileWriter(new File("D:/temp/term197/out/spring-freemarker.html"));
            // 6、调用模板对象的process方法,生成文件。
            template.process(dataModel, out);
            // 7、关闭流。
            out.close();
            return "OK";
        }
    }

    5. 商品详情页面静态化

    5.1 网页的静态化方案
    输出文件的名称:商品id+“.html”
    输出文件的路径:工程外部的任意目录。
    网页访问:使用nginx访问网页。在此方案下tomcat只有一个作用就是生成静态页面。
    工程部署:可以把taotao-item-web部署到多个服务器上。
    生成静态页面的时机:商品添加后,生成静态页面。可以使用Activemq,订阅topic(商品添加)

    3.5.2. MessageListener
    需要实现MessageListener,把Active的客户端jar包的依赖添加到工程中。

    业务逻辑:
    1、创建一个MessageListener接口的实现类
    2、从message中取商品id
    3、查询商品基本消息、商品描述。
    4、创建商品详情页面的模板。
    5、指定文件输出目录
    6、生成静态文件。

    安装http服务器。 

    public class HtmlGenListener implements MessageListener {
    
        @Autowired
        private ItemService itemService;
        @Autowired
        private FreeMarkerConfigurer freeMarkerConfigurer;
        @Value("${HTML_OUT_PATH}")
        private String HTML_OUT_PATH;
        
        @Override
        public void onMessage(Message message) {
            try {
                // 1、创建一个MessageListener接口的实现类
                // 2、从message中取商品id
                TextMessage textMessage = (TextMessage) message;
                String strItemId = textMessage.getText();
                Long itemId = new Long(strItemId);
                // 3、查询商品基本消息、商品描述。
                TbItem tbItem = itemService.getItemById(itemId);
                Item item = new Item(tbItem);
                TbItemDesc tbItemDesc = itemService.getItemDescById(itemId);
                //创建数据集
                Map data = new HashMap<>();
                data.put("item", item);
                data.put("itemDesc", tbItemDesc);
                // 4、创建商品详情页面的模板。
                // 5、指定文件输出目录
                Configuration configuration = freeMarkerConfigurer.getConfiguration();
                Template template = configuration.getTemplate("item.htm");
                FileWriter out = new FileWriter(new File(HTML_OUT_PATH + itemId + ".html"));
                // 6、生成静态文件。
                template.process(data, out);
                //关闭流
                out.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
    }

     3.5.3. Spring配置文件

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.2.xsd">

      <!-- 真正可以产生Connection的ConnectionFactory,由对应的 JMS服务厂商提供 -->

      <bean id="targetConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">

         <property name="brokerURL" value="tcp://192.168.25.168:61616" />

      </bean>

      <!-- Spring用于管理真正的ConnectionFactory的ConnectionFactory -->

      <bean id="connectionFactory" class="org.springframework.jms.connection.SingleConnectionFactory">

        <!-- 目标ConnectionFactory对应真实的可以产生JMS Connection的ConnectionFactory -->

        <property name="targetConnectionFactory" ref="targetConnectionFactory" />

      </bean> <!--这个是主题目的地,一对多的 -->

      <bean id="topicDestination" class="org.apache.activemq.command.ActiveMQTopic">

        <constructor-arg value="item-add-topic" />

      </bean>

      <!-- 配置消息监听器 -->

      <bean id="htmlGenListener" class="com.taotao.item.listener.HtmlGenListener"/>

        <!-- 配置监听容器 -->    

        <!-- 消息监听容器 -->

        <bean class="org.springframework.jms.listener.DefaultMessageListenerContainer">

        <property name="connectionFactory" ref="connectionFactory" />

        <property name="destination" ref="topicDestination" />

        <property name="messageListener" ref="htmlGenListener" />

      </bean>

    </beans>

    附加:Freemarker生成Java代码:https://www.cnblogs.com/itdragon/p/7750903.html

    展开全文
  • FreeMarker

    2020-12-01 11:47:28
    FreeMarker 主要内容 FreeMarker 概述 FreeMarker概念 ​ FreeMarker 是一款 模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。 是一个Java类库...

    FreeMarker

    主要内容

    在这里插入图片描述

    FreeMarker 概述

    FreeMarker概念

    ​ FreeMarker 是一款 模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。 是一个Java类库。

    ​ FreeMarker 被设计用来生成 HTML Web 页面,特别是基于 MVC 模式的应用程序,将视图从业务逻辑中抽离处理,业务中不再包括视图的展示,而是将视图交给 FreeMarker 来输出。虽然 FreeMarker 具有一些编程的能力,但通常由 Java 程序准备要显示的数据,由 FreeMarker 生成页面,通过模板显示准备的数据(如下图):

    ​ FreeMarker不是一个Web应用框架,而适合作为Web应用框架一个组件。

    ​ FreeMarker与容器无关,因为它并不知道HTTP或Servlet。FreeMarker同样可以应用

    于非Web应用程序环境。

    ​ FreeMarker更适合作为Model2框架(如Struts)的视图组件,你也可以在模板中使用

    JSP标记库。

    FreeMarker特性

    通用目标

    ​ 能够生成各种文本:HTML、XML、RTF、Java 源代码等等

    ​ 易于嵌入到你的产品中:轻量级;不需要 Servlet 环境

    ​ 插件式模板载入器:可以从任何源载入模板,如本地文件、数据库等等

    ​ 你可以按你所需生成文本:保存到本地文件;作为 Email 发送;从 Web 应用程序发送它返回给 Web 浏览器

    强大的模板语言

    ​ 所有常用的指令:include、if/elseif/else、循环结构

    ​ 在模板中创建和改变变量

    ​ 几乎在任何地方都可以使用复杂表达式来指定值

    ​ 命名的宏,可以具有位置参数和嵌套内容

    ​ 名字空间有助于建立和维护可重用的宏库,或将大工程分成模块,而不必担心名字冲突

    ​ 输出转换块:在嵌套模板片段生成输出时,转换HTML转义、压缩、语法高亮等等;你可以定义自己的转换

    通用数据模型

    ​ FreeMarker不是直接反射到Java对象,Java对象通过插件式对象封装,以变量方式在模板中显示

    ​ 你可以使用抽象(接口)方式表示对象(JavaBean、XML文档、SQL查询结果集等等),告诉模板开发者使用方法,使其不受技术细节的打扰

    为Web准备

    ​ 在模板语言中内建处理典型Web相关任务(如HTML转义)的结构

    ​ 能够集成到Model2 Web应用框架中作为JSP的替代

    ​ 支持JSP标记库

    ​ 为MVC模式设计:分离可视化设计和应用程序逻辑;分离页面设计员和程序员

    智能的国际化和本地化

    ​ 字符集智能化(内部使用UNICODE)

    ​ 数字格式本地化敏感

    ​ 日期和时间格式本地化敏感

    ​ 非US字符集可以用作标识(如变量名)

    ​ 多种不同语言的相同模板

    强大的XML处理能力

    ​ <#recurse> 和 <#visit> 指令(2.3版本)用于递归遍历XML树。在模板中清楚和直接的访问XML对象模型。开源论坛 JForum 就是使用了 FreeMarker 做为页面模板。

    FreeMarker环境搭建

    新建 Maven Web项目

    配置坐标依赖和部署插件

    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">
      <modelVersion>4.0.0</modelVersion>
    
      <groupId>com.xxxx</groupId>
      <artifactId>freemarker</artifactId>
      <version>1.0-SNAPSHOT</version>
      <packaging>war</packaging>
    
      <name>freemarker Maven Webapp</name>
      <!-- FIXME change it to the project's website -->
      <url>http://www.example.com</url>
    
      <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
      </properties>
    
      <dependencies>
        <!-- freemarker的坐标依赖 -->
        <dependency>
          <groupId>org.freemarker</groupId>
          <artifactId>freemarker</artifactId>
          <version>2.3.23</version>
        </dependency>
        <!-- servlet-api的坐标依赖 -->
        <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>javax.servlet-api</artifactId>
          <version>3.0.1</version>
        </dependency>
    
      </dependencies>
    
      <build>
        <finalName>freemarker</finalName>
        <!--
            插件地址:
              Tomcat
                http://tomcat.apache.org/maven-plugin-2.2/
              Jetty
                https://www.eclipse.org/jetty/documentation/current/jetty-maven-plugin.html
        -->
        <plugins>
          <!-- 配置jetty插件 -->
          <plugin>
            <groupId>org.eclipse.jetty</groupId>
            <artifactId>jetty-maven-plugin</artifactId>
            <version>9.2.1.v20140609</version>
          </plugin>
        </plugins>
    
      </build>
    </project>
    

    修改配置文件 web.xml

    在项目的webapp/WEB-INF目录下的web.xml文件中,添加freemarker 相关 servlet 配置

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app id="WebApp_ID" version="3.0"
             xmlns="http://java.sun.com/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
     http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
      <!-- FreeMarker 的Servlet配置 -->
      <servlet>
        <servlet-name>freemarker</servlet-name>
        <servlet-class>freemarker.ext.servlet.FreemarkerServlet</servlet-class>
        <init-param>
          <!-- 模板路径 -->
          <param-name>TemplatePath</param-name>
          <!-- 默认在webapp目录下查找对应的模板文件 -->
          <param-value>/</param-value>
        </init-param>
        <init-param>
          <!-- 模板默认的编码:UTF-8 -->
          <param-name>default_encoding</param-name>
          <param-value>UTF-8</param-value>
        </init-param>
      </servlet>
      <!-- 处理所有以.ftl结尾的文件;ftl是freemarker默认的文件后缀 -->
      <servlet-mapping>
        <servlet-name>freemarker</servlet-name>
        <url-pattern>*.ftl</url-pattern>
      </servlet-mapping>
    </web-app>
    

    编写Servlet类

    package com.xxxx.controllter;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    @WebServlet("/f01")
    public class FreeMarker01 extends HttpServlet {
        @Override
        protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // 添加数据
            request.setAttribute("msg","Hello FreeMarker!");
            // 请求转发跳转到ftl文件中
            request.getRequestDispatcher("template/f01.ftl").forward(request,response);
        }
    }
    

    新建模板文件 ftl

    在webapp目录下新建template文件夹,创建f01.ftl文件

    启动项目

    访问项目

    浏览器地址栏输入:http://localhost:8989/f01

    FreeMarker 数据类型

    Freemarker 模板中的数据类型由如下几种:

    • 布尔型:等价于 Java 的 Boolean 类型,不同的是不能直接输出,可转换为字符串输出

    • 日期型:等价于 java 的 Date 类型,不同的是不能直接输出,需要转换成字符串再输出

    • 数值型:等价于 java 中的 int,float,double 等数值类型

      有三种显示形式:数值型(默认)、货币型、百分比型

    • 字符型:等价于 java 中的字符串,有很多内置函数

    • sequence 类型:等价于 java 中的数组,list,set 等集合类型

    • hash 类型:等价于 java 中的 Map 类型

    布尔类型

    1. 在Servlet中设置布尔类型的数据

      // 布尔类型
      request.setAttribute("flag", true);
      
    2. 获取数据

      <#--
          数据类型:布尔类型
              在freemarker中布尔类型不能直接输出;如果输出要先转成字符串
              方式一:?c
              方式二:?string 或 ?string("true时的文本","false时的文本")
      -->
      ${flag?c} <br>
      ${flag?string} <br>
      ${flag?string("yes","no")} <br>
      

    日期类型

    1. 在Servlet中设置日期类型的数据

      // 日期类型
      request.setAttribute("createDate",new Date());
      
    2. 获取数据

      <#--
          数据类型:日期类型
              在freemarker中日期类型不能直接输出;如果输出要先转成日期型或字符串
              1. 年月日          ?date
              2. 时分秒          ?time
              3. 年月日时分秒     ?datetime
              4. 指定格式        ?string("自定义格式")
                                 y:年  M:月  d:日
                                 H:时  m:分  s:秒
      -->
      <#-- 输出日期格式 -->
      ${createDate?date} <br>  
      <#-- 输出时间格式 -->
      ${createDate?time} <br> 
      <#-- 输出日期时间格式 -->
      ${createDate?datetime} <br>   
      <#-- 输出格式化日期格式 -->
      ${createDate?string("yyyy年MM月dd日 HH:mm:ss")} <br>   
      

    数值类型

    1. 在Servlet设置数值型的数据

      // 数值类型
      request.setAttribute("age",18); // 数值型
      request.setAttribute("salary",10000); // 数值型
      request.setAttribute("avg",0.545); // 浮点型
      
    2. 获取数据

      <#--
          数据类型:数值类型
              在freemarker中数值类型可以直接输出;
              1. 转字符串
                  普通字符串       ?c
                  货币型字符串     ?string.currency
                  百分比型字符串   ?string.percent
              2. 保留浮点型数值指定小数位(#表示一个小数位)
                  ?string["0.##"]
      -->
      <#-- 直接输出数值型 -->
      ${age} <br>
      ${salary} <br>
      <#-- 将数值转换成字符串输出 -->
      ${salary?c} <br>
      <#-- 将数值转换成货币类型的字符串输出 -->
      ${salary?string.currency} <br>
      <#-- 将数值转换成百分比类型的字符串输出 -->
      ${avg?string.percent} <br>
      <#-- 将浮点型数值保留指定小数位输出 (##表示保留两位小数) -->
      ${avg?string["0.##"]} <br>
      

    字符串类型

    1. 在Servlet中设置字符串类型的数据

      // 字符串类型
      request.setAttribute("msg","Hello ");
      request.setAttribute("msg2","freemarker");
      
    2. 获取数据

      <#--
          数据类型:字符串类型
              在freemarker中字符串类型可以直接输出;
              1. 截取字符串(左闭右开) ?substring(start,end)
              2. 首字母小写输出  ?uncap_first
              3. 首字母大写输出  ?cap_first
              4. 字母转小写输出  ?lower_case
              5. 字母转大写输出  ?upper_case
              6. 获取字符串长度  ?length
              7. 是否以指定字符开头(boolean类型) ?starts_with("xx")?string
              8. 是否以指定字符结尾(boolean类型) ?ends_with("xx")?string
              9. 获取指定字符的索引  ?index_of("xx")
              10. 去除字符串前后空格 ?trim
              11. 替换指定字符串  ?replace("xx","xx")
      -->
      <#-- 直接输出 -->
      ${msg} - ${msg2} <br>
      ${msg?string} - ${msg2?string} <br>
      <#-- 1. 截取字符串(左闭右开) ?substring(start,end) -->
      ${msg2?substring(1,4)} <br>
      <#-- 2. 首字母小写输出  ?uncap_first -->
      ${msg?uncap_first} <br>
      <#-- 3. 首字母大写输出  ?cap_first -->
      ${msg2?cap_first} <br>
      <#-- 4. 字母转小写输出  ?lower_case -->
      ${msg?lower_case} <br>
      <#-- 5. 字母转大写输出  ?upper_case -->
      ${msg?upper_case} <br>
      <#-- 6. 获取字符串长度  ?length -->
      ${msg?length} <br>
      <#-- 7. 是否以指定字符开头(boolean类型) ?starts_with("xx")?string -->
      ${msg?starts_with("H")?string} <br>
      <#-- 8. 是否以指定字符结尾(boolean类型) ?ends_with("xx")?string -->
      ${msg?ends_with("h")?string} <br>
      <#-- 9. 获取指定字符的索引  ?index_of("xxx") -->
      ${msg?index_of("e")} <br>
      <#-- 10. 去除字符串前后空格 ?trim -->
      ${msg?trim?length} <br>
      <#-- 11. 替换指定字符串  ?replace("xx","xxx") -->
      ${msg?replace("o","a")}<br>
      

    字符串空值情况处理

    ​ FreeMarker 的变量必须赋值,否则就会抛出异常。而对于 FreeMarker 来说,null 值和不存在的变量是完全一样的,因为 FreeMarker 无法理解 null 值。

    ​ FreeMarker 提供两个运算符来避免空值:

    ​ ① ! :指定缺失变量的默认值

    ​ ${value!}:如果value值为空,则默认值是空字符串

    ​ ${value!“默认值”}:如果value值为空,则默认值是字符串"默认值"

    ​ ② ?? :判断变量是否存在

    ​ 如果变量存在,返回 true,否则返回 false

    ​ ${(value??)?string}

    <#-- 如果值不存在,直接输出会报错 -->
    <#--${str}-->
    <#-- 使用!,当值不存在时,默认显示空字符串 -->
    ${str!}<br>
    <#-- 使用!"xx",当值不存在时,默认显示指定字符串 -->
    ${str!"这是一个默认值"}<br>
    <#-- 使用??,判断字符串是否为空;返回布尔类型。如果想要输出,需要将布尔类型转换成字符串 -->
    ${(str??)?string}<br>
    

    sequence 类型

    1. 在Servlet中设置序列类型的数据

      // 序列类型 (数组、List、Set)
      // 数组操作
      String[] stars = new String[]{"周杰伦","林俊杰","陈奕迅","五月天"};
      request.setAttribute("stars",stars);
      
      // List操作
      List<String> citys = Arrays.asList("上海","北京","杭州","深圳");
      request.setAttribute("cityList",citys);
      
      // JavaBean集合
      List<User> userList = new ArrayList<>();
      userList.add(new User(1,"zhangsan",22));
      userList.add(new User(2,"lisi",18));
      userList.add(new User(3,"wangwu",20));
      request.setAttribute("userList",userList);
      
    2. 获取数据

      <#--
          数据类型:序列类型 (数组、List、Set)
              通过list指令输出序列
                  <#list 序列名 as 元素名>
                      ${名称}
                  </#list>
              获取序列的长度        ${序列名?size}
              获取序列元素的下标     ${元素名?index}
              获取第一个元素        ${序列名?first}
              获取最后一个元素      ${序列名?last}
      
              倒序输出    	 序列名?reverse
              升序输出    	 序列名?sort
              降序输出    	 序列名?sort?reverse
              指定字段名排序    序列名?sort_by("字段名")
                 注:一般是JavaBean集合,对应的字段名需要提供get方法
      -->
      <#-- 数组操作 -->
      <#list stars as star>
          下标:${star?index} -- 名字:${star} <br>
      </#list>
      数组的长度:${stars?size}  <br>
      <#-- 获取第一个元素 -->
      第一个元素:${stars?first} <br>
      <#-- 获取最后一个元素 -->
      最后一个元素:${stars?last} <br>
      <hr>
      
      <#-- List操作 -->
      <#list cityList as city >
          ${city} <br>
      </#list>
      List的size:${cityList?size} <br>
      <#-- 倒序输出 -->
      <#list cityList?reverse as city >
          ${city} -
      </#list>
      <br>
      
      <#-- 升序输出 -->
      <#list cityList?sort as city >
          ${city} -
      </#list>
      <br>
      <#-- 降序输出 -->
      <#list cityList?sort?reverse as city >
          ${city} -
      </#list>
      <hr>
      
      <#-- JavaBean集合 -->
      <#list userList as user>
          编号:${user.userId}&nbsp;&nbsp;
          姓名:${user.uname}&nbsp;&nbsp;
          年龄:${user.uage}&nbsp;&nbsp;
          <br>
      </#list>
      
      <#-- 按照指定字段名排序 -->
      <#list userList?sort_by("uage") as user>
          ${user.uname} |
      </#list>
      

    hash 类型

    1. 在Servlet中设置hash类型的数据

      // Map操作
      Map<String,String> cityMap = new HashMap<>();
      cityMap.put("sh","上海");
      cityMap.put("bj","北京");
      cityMap.put("sz","深圳");
      request.setAttribute("cityMap",cityMap);
      
    2. 获取数据

      <#--
          数据类型:hash类型
               key遍历输出
                  <#list hash?keys as key>
                      ${key} -- ${hash[key]}
                  </#list>
               value遍历输出
                  <#list hash?values as value>
                      ${value}
                  </#list>
      -->
      <#-- key遍历输出 -->
      <#list cityMap?keys as key>
          ${key} -- ${cityMap[key]} <br>
      </#list>
      
      <#-- value遍历输出 -->
      <#list cityMap?values as value>
          ${value} |
      </#list>
      

    FreeMarker 常见指令

    assign 自定义变量指令

    ​ 使用 assign 指令你可以创建一个新的变量, 或者替换一个已经存在的变量。

    <#--
        assign 自定义变量指令
            语法:
                <#assign 变量名=值>
                <#assign 变量名=值 变量名=值> (定义多个变量)
    -->
    <#assign str="hello">
    ${str} <br>
    <#assign num=1 names=["zhangsan","lisi","wangwu"] >
    ${num} -- ${names?join(",")}
    

    if elseif else 逻辑判断指令

    ​ 可以使用 ifelseifelse 指令来条件判断是否满足某些条件。

    <#--
        if, else, elseif 逻辑判断指令
            格式:
                <#if condition>
                  ...
                <#elseif condition2>
                  ...
                <#elseif condition3>
                  ...
                <#else>
                  ...
                </#if>
            注:
                1. condition, condition2等:将被计算成布尔值的表达式。
                2. elseif 和 else 指令 是可选的。
    -->
    <#assign score = 80>
    <#if score < 60>
        你个小渣渣!
        <#elseif score == 60>
            分不在高,及格就行!
        <#elseif score gt 60 && score lt 80>
            哎哟不错哦!
        <#else>
            你很棒棒哦!
    </#if>
    <br>
    
    <#-- 判断数据是否存在 -->
    <#assign list="">
    <#if list??>
        数据存在
        <#else>
            数据不存在
    </#if>
    

    list 遍历指令

    ​ 可以使用 list 指令来对序列进行遍历。

    <#--
        list指令
            格式1:
                <#list sequence as item>
    
                </#list>
            格式2:
                <#list sequence as item>
    
                <#else>
                    当没有选项时,执行else指令
                </#list>
            注:
                1. else 部分是可选的
                2. sequence: 想要迭代的项,可以是序列或集合的表达式
                3. item: 循环变量 的名称
                4. 当没有迭代项时,才使用 else 指令, 可以输出一些特殊的内容而不只是空在那里
    -->
    <#assign users = ["张三","李四","王五"]>
    <#-- 遍历序列 -->
    <#list users as user>
        ${user}
    </#list>
    
    <br>
    <#--判断数据不为空,再执行遍历 (如果序列不存在,直接遍历会报错)-->
    <#if users2??>
        <#list users2 as user>
            ${user}
        </#list>
    </#if>
    <br>
    
    <#assign users3 = []>
    <#-- 当序列没有数据项时,使用默认信息 -->
    <#list users3 as user>
        ${user}
        <#else>
            当前没有数据!
    </#list>
    

    macro 自定义指令

    ​ 可以使用 macro 指令来自定义一些自定义指令。

    <#--
        macro 自定义指令 (宏)
            1. 基本使用
                格式:
                    <#macro 指令名>
                        指令内容
                    </#macro>
                使用:
                    <@指令名></@指令名>
            2. 有参数的自定义指令
                格式:
                     <#macro 指令名 参数名1 参数名2>
                        指令内容
                    </#macro>
                使用:
                    <@指令名 参数名1=参数值1 参数名2=参数值2></@指令名>
    
            注:
                1. 指令可以被多次使用。
                2. 自定义指令中可以包含字符串,也可包含内置指令
    -->
    <#-- 定义基本的自定义指令 -->
    <#macro address>
        © 1999–2015 The FreeMarker Project. All rights reserved.
    </#macro>
    <#-- 使用指令 -->
    <@address></@address> <br>
    <@address></@address>
    <hr>
    
    <#-- 定义有参数的自定义指令 -->
    <#macro queryUserByName uname>
        通过用户名查询用户信息 - ${uname}
    </#macro>
    <#-- 使用指令,并传递参数 -->
    <@queryUserByName uname="admin"></@queryUserByName> <br>
    
    <#-- 定义有多个参数的自定义指令 -->
    <#macro queryUserByParams uname uage>
        通过多个餐宿查询用户信息 - ${uname} - ${uage}
    </#macro>
    <#-- 使用指令,并传递多个参数 -->
    <@queryUserByParams uname="admin" uage=18></@queryUserByParams> <br>
    <hr>
    
    <#-- 自定义指令中包含内置指令 -->
    <#macro cfb>
        <#list 1..9 as i>
            <#list 1..i as j>
                ${j}*${i}=${j*i}&nbsp;
            </#list>
            <br>
        </#list>
    </#macro>
    <@cfb></@cfb>
    <@cfb></@cfb>
    
    <#-- 动态数据 -->
    <#macro cfb2 num>
        <#list 1..num as i>
            <#list 1..i as j>
                ${j}*${i}=${j*i}&nbsp;
            </#list>
            <br>
        </#list>
    </#macro>
    <@cfb2 num=5></@cfb2>
    

    nested 占位指令

    nested 指令执行自定义指令开始和结束标签中间的模板片段。嵌套的片段可以包含模板中任意合法的内容。

    <#--
        nested 占位指令
            nested 相当于占位符,一般结合macro指令一起使用。
            可以将自定义指令中的内容通过nested指令占位,当使用自定义指令时,会将占位内容显示。
    -->
    <#macro test>
        这是一段文本!
        <#nested>
        <#nested>
    </#macro>
    <@test><h4>这是文本后面的内容!</h4></@test>
    

    import 导入指令

    import 指令可以引入一个库。也就是说,它创建一个新的命名空间, 然后在那个命名空间中执行给定路径的模板。可以使用引入的空间中的指令。

    commons.ftl

    <#macro cfb>
        <#list 1..9 as i>
            <#list 1..i as j>
                ${j}*${i}=${j*i}&nbsp;
            </#list>
            <br>
        </#list>
    </#macro>
    

    在其他ftl页面中通过import导入commons.ftl的命名空间,使用该命名空间中的指令

    test.ftl

    <#-- 导入命名空间 -->
    <#import "commons.ftl" as common>
    <#-- 使用命名空间中的指令 -->
    <@common.cfb></@common.cfb>
    

    include 包含指令

    ​ 可以使用 include 指令在你的模板中插入另外一个 FreeMarker 模板文件 。 被包含模板的输出格式是在 include 标签出现的位置插入的。 被包含的文件和包含它的模板共享变量,就像是被复制粘贴进去的一样。

    <#--包含指令(引入其他页面文件) include-->
    <#--html文件-->
    <#include "test.html"> 
    
    <#--freemarker文件-->
    <#include "test.ftl"> 
    
    <#--text文件-->
    <#include "test.txt"> 
    

    FreeMarker 页面静态化

    ​ 通过上述介绍可知 Freemarker 是一种基于模板的、用来生成输出文本的通用工具,所以
    我们必须要定制符合自己业务的模板,然后生成自己的 html 页面。Freemarker 是通过
    freemarker.template.Configuration 这个对象对模板进行加载的(它也处理创建和缓存预
    解析模板的工作),然后我们通过 getTemplate 方法获得你想要的模板,有一点要记住
    freemarker.template.Configuration 在你整个应用必须保证唯一实例。

    定义模板

    news.ftl

    <#-- 新闻标题 -->
    <h1>${title}</h1>
    <p>
        新闻来源:${source} &nbsp; 发布时间:${pubTime?sring("yyyy-MM-dd HH:mm")}
    </p>
    <#-- 新闻内容 -->
    <p>
        ${content}
    </p>
    

    加载模板

    
    @WebServlet("/news")
    public class NewsServlet extends HttpServlet {
        @Override
        protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // 实例化模板配置对象
            Configuration configuration = new Configuration();
            // 设置加载模板的上下文 以及 设置加载模板路径(模板存放的路径)
            configuration.setServletContextForTemplateLoading(getServletContext(),"/template");
            // 设置模板的编码格式
            configuration.setDefaultEncoding("UTF-8");
            // 加载模板文件,获取模板对象
            Template template = configuration.getTemplate("news.ftl");
    
             // 设置模型数据
            Map<String,Object> map = new HashMap<>();
            map.put("title", "特别就业季:稳就业情况如何? 哪些问题待解?");
            map.put("source", "人民日报");
            map.put("pubTime", new Date());
            map.put("content", "中共中央政治局常务委员会近日召开会议强调," +
                    "要有针对性地开展援企、稳岗、扩就业工作," +
                    "做好高校毕业生、农民工等重点群体就业工作," +
                    "积极帮助个体工商户纾困。疫情期间,稳就业情况如何?还有哪些问题待解?" +
                    "记者采访了不同群体,记录这个特别的就业季。");
    
            // 获取项目所在的根目录
            String basePath = request.getServletContext().getRealPath("/");
            // 设置页面存放的目录
            File htmlFile = new File(basePath + "/html");
            // 判断目录是否存在
            if (!htmlFile.exists()) {
                // 如果目录不存在,则新建目录
                htmlFile.mkdir();
            }
            // 获取文件名(随机生成不重复的文件名)
            String fileName = System.currentTimeMillis() + ".html";
            // 创建html文件
            File file = new File(htmlFile, fileName);
            // 获取文件输出流
            FileWriter writer = new FileWriter(file);
            try {
                // 输出html  将模型数据填充到模板中
                template.process(map, writer);
                // 输出成功
                System.out.println("新闻创建成功!");
            } catch (TemplateException e) {
                e.printStackTrace();
            } finally {
                writer.flush();
                writer.close();
            }
        }
    }
    

    生成对应的html文件

    ​ 浏览器地址栏输入:

    ​ http://localhost:8989/news

    ​ 生成的文件存放在当前项目的webapp目录下的html目录中。

    FreeMarker 运算符

    算术运算符

    <!--
        算术运算
            +、-、*、/、%
    -->
    <#assign a1 = 8 a2 = 2 >
    ${a1} + ${a2} = ${a1 + a2} <br/>
    ${a1} - ${a2} = ${a1 - a2} <br/>
    ${a1} * ${a2} = ${a1 * a2} <br/>
    ${a1} / ${a2} = ${a1 / a2} <br/>
    ${a1} % ${a2} = ${a1 % a2} <br/>
    <!--字符串运算-->
    ${"hello" + "," + "freemarker"}
    

    逻辑运算符

    <#--
        逻辑运算符
         &&、||、!
    -->
    

    比较运算符

    <#--
        比较运算符
            > (gt): 大于号,推荐使用 gt
            < (lt): 小于号,推荐使用 lt
            >= (gte): 大于等于, 推荐是用 gte
            <= (lte): 小于等于,推荐使用 lte
            == : 等于
            != : 不等于
    -->
    

    空值运算符

    <#--
        空值运算符
         1. ??:判断是否为空,返回布尔类型
            如果不为空返回 false, 如果为空返回 true,不能直接输出
            ${(name??)?string}
         2. !: 设置默认值,如果为空,则设置默认值
             1. 设置默认为空字符串:
             ${name!}
             2. 设置指定默认值
             ${name!'zhangsan'}
    -->
    
    展开全文
  • freemarker

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

    freemarker

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

    引入freemarker依赖

    <dependency>

      <groupId>org.freemarker</groupId>

      <artifactId>freemarker</artifactId>

      <version>2.3.23</version>

    </dependency>

     

    freemarker原理

    模板 + 数据模型 = 输出

    对象的访问

    Person p  = new Person();
    Map root = new HashMap();
    root.put(“person”,p);
    
    freemarker.html内容如下:
    ${person.id}=${person.name}
    

    历遍集合/数组

    List<Person> persons = new ArrayList<Person>();
    
    //页面中内容
    
    <#list persons as p>
    ${p.id}/${p.name}
    </#list>
    
    获取当前选代的索引:<br/>
    <#list persons as p>
    	${p_index}
    </#list>
    
    

    if

    逻辑运算符(==   !=   ||   &&)
    
    <html>
    <body>
    	<#list persons as p>
    		<#if p_index%2 != 0 || p_index==0>
    			输出一行字
    		</#if>
    		index:${p_index}|${p.id}:${p.name}<br>
    	</#list>
    </body>
    </html>
    

    else

    <html>
    <body>
    	<#list persons as p>
    		<#if p_index%2 != 0 || p_index==0>
    			<span style="color:red">
    				index:${p_index}|${p.id}:${p.name}<br>
    			</span>
    		<#else>
    			<span style="color:blue">
    				index:${p_index}|${p.id}:${p.name}<br>
    			</span>
    		</#if>
    	</#list>
    </body>
    

    格式化日期

    默认格式
    1:date
    ${cur_time?date}
    2:datetime
    ${cur_time?datetime}
    3:time
    ${cur_time?time}
    
    自定义格式
    ${cur_time?string("yyyy-MM-dd HH:mm:ss")} 

     null处理

    root.put(“val”,null);
    
    解决办法
    1:null 变 空串
    ${val!}     ${val!"这里是空"}
    2:为Null时给默认值
    ${val!“我是默认值"}
    3:
    <#if curdate ??>
    属性不为空
    <#else>
    属性为空
    <#/if>
    

     引页面

    将另一个页面引入本页面时可用以下命令完成
    
    <#include "/include/head.html">
    

    freemaker整合spring

     

    添加依赖:
    <dependency>
    	<groupId>org.springframework</groupId>
    	<artifactId>spring-context-support</artifactId>
    	<version>4.1.3.RELEASE</version>
    </dependency>
    <dependency>
    	<groupId>org.freemarker</groupId>
    	<artifactId>freemarker</artifactId>
    	<version>2.3.23</version>
    </dependency>
    
    
    在ApplicationContext.xml中添加如下内容:
    <bean id="freemarkerConfig"	class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
    	<property name="templateLoaderPath" value="/WEB-INF/freemarker/" />
    	<property name="defaultEncoding" value="UTF-8" />
    </bean>
    
    代码:
    Configuration configuration = freeMarkerConfigurer.getConfiguration();
    Template template = configuration.getTemplate("item.ftl");
    Map root = new HashMap();
    //取商品信息
    ....
    FileWriter out = new FileWriter(new File(HTML_GEN_PATH + id + ".html"));
    template.process(root, out);
    out.flush();
    out.close();
    

     

    更为详细的网页版学习资料,可在上传的资源中下载

     

    展开全文
  • freeMarker

    千次阅读 2012-08-24 09:31:44
    使用freemarker实际上就是做前端展示,相当于html与jsp之外的另一种选择方案;比如html中不能使用Java对象,而jsp又会常常嵌套大量Java代码这两种从某种意义上都有一定的弊端;而freemarker却相当于整合了html和jsp...

         使用freemarker实际上就是做前端展示,相当于html与jsp之外的另一种选择方案;比如html中不能使用Java对象,而jsp又会常常嵌套大量Java代码这两种从某种意义上都有一定的弊端;而freemarker却相当于整合了html和jsp的优势吧!比如:在freemarker中我可以使用html标签,同时可以使用EL表达式来获取Java对象,并通过freemarker的特有的一些指令来处理Java对象,但是又不涉及到实质上的Java代码!

         因此freemarker可以有效的阻止Java代码的嵌入;而且freemarker可以自定义自己的宏macro(相当于标签)。

    展开全文
  • freemarker

    2008-05-21 17:15:29
    FreeMarker 是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯 Java 编写, FreeMarker 被设计用来生成 HTML Web 页面,特别是基于 MVC 模式的应用程序, 虽然 FreeMarker 具有一些编程的能力,但...
  • freemarker类型转换

    千次阅读 多人点赞 2019-07-31 19:13:33
    操作字符串函数 1. substring(start,end)从一个字符串中截取子串 ...start:截取子串开始的索引,start必须大于等于0,小于等于end ...end: 截取子串的长度,end必须大于等于0,小于等于字符串长度,如果省略该...
  • freemarker语法

    2017-12-20 21:02:44
    freemarker freemarker freemarker freemarker freemarker freemarker freemarker freemarker
  • freemarker 模板刷新freemarker 模板刷新freemarker 模板刷新freemarker 模板刷新freemarker 模板刷新freemarker 模板刷新
  • Freemarker:Freemarker简介

    2018-05-17 16:10:26
    1、Freemarker模板的文件后缀名 *.ftl2、Freemarker其实是一种比较简单的网页展示技术,说白了就是网页模板和数据模型的结合体。这种结合模式的好处就是,分离了网页界面设计人员和编程人员的工作,让他们各司其职。...
  • FreeMarker Demo

    热门讨论 2013-12-06 11:55:05
    这是一个java项目 下载这个示例 轻松搞定FreeMarker 包括: FreeMarker 解析javabean FreeMarker 解析map FreeMarker 解析list include标签用法
  • <div><p>Hi Team, I am facing an issue while running my serenity...<p>Error executing FreeMarker template <a href="https://github.com/serenity-bdd/serenity-core/files/1618908/exception.txt">exception.txt ...
  • # freemarker模板引擎 spring.freemarker.allow-request-override=true spring.freemarker.allow-session-override=true spring.freemarker.cache=false spring.freemarker.check-template-location=true spring....
  • Freemarker自定义方法

    2015-09-08 16:55:15
    Freemarker
  • freemarker插件

    2016-12-03 16:15:06
    freemar在eclipse中没有提示,样式一片灰白,看着以及编写给人很不爽的感觉,找了很长时间才找的有用插件 ...1.解压后找到hudson.freemarker_ide_0.9.14 2.加到eclipse的plugins下 3.重启eclipse 若依旧未成功可以留言
  • Freemarker教程

    千次阅读 2017-03-17 13:30:57
    Freemarker 是一款模板引擎,是一种基于模版生成静态文件的通用 工具,它是为java程序员提供的一个开发包,或者说是一个类库,它不是面向最终用户的,而是为程序员提供了一款可以嵌入他们开发产品的应用程序。...
  • FreeMarker入门

    2019-08-17 11:14:02
    文章目录FreeMarker简介FreeMarker特性FreeMarker优缺点FreeMarker工作原理FreeMarker详细学习 FreeMarker简介 FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页、电子邮件...

空空如也

1 2 3 4 5 ... 20
收藏数 26,409
精华内容 10,563
关键字:

freemarker