freemarker简单入门

FreeMarker



FreeMarker概念

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

​ 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转义、压缩、语法高亮等等;你可以定义自己的转换

为Web准备
​ 在模板语言中内建处理典型Web相关任务(如HTML转义)的结构
​ 能够集成到Model2 Web应用框架中作为JSP的替代
​ 支持JSP标记库
​ 为MVC模式设计:分离可视化设计和应用程序逻辑;分离页面设计员和程序员



配置坐标依赖和部署插件

<?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-mavenplugin.
			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">

<servlet>
  <servlet-name>freemarker</servlet-name>
  <servlet-class>freemarker.ext.servlet.FreemarkerServlet</servlet-class>
  <init-param>
    <param-name>TemplatePath</param-name>
    <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>
<servlet-mapping>
  <servlet-name>freemarker</servlet-name>
  <url-pattern>*.ftl</url-pattern>
</servlet-mapping>


</web-app>




FreeMarker 数据类型

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

  • ​ 布尔型:等价于 Java 的 Boolean 类型,不同的是不能直接输出,可转换为字符串输出
  • ​ 日期型:等价于 java 的 Date 类型,不同的是不能直接输出,需要转换成字符串再输出
  • ​ 数值型:等价于 java 中的 int,float,double 等数值类型
  • ​ 有三种显示形式:数值型(默认)、货币型、百分比型
  • ​ 字符型:等价于 java 中的字符串,有很多内置函数
  • ​ sequence 类型:等价于 java 中的数组,list,set 等集合类型
  • ​ hash 类型:等价于 java 中的 Map 类型



数据类型

​ boolean类型数据
​ 不能直接输出在freemarker的页面上
​ ?c ${k?c}
​ ?string ${k?string}
​ ?string(“返回值为true执行”,“返回值为false执行”) ${k?string(“这是对的”,“这是错的”)}
​ ?then(“返回值为true执行”,“返回值为false执行”) ${k?then(“这是对的”,“这是错的”)}


日期类型

​ 在freemarker中日期类型不能直接输出;如果输出要先转成日期型或字符串

            1. 年月日         	    ?date
            2. 分秒          	    ?time
            3. 年月日时分秒     ?datetime
            4. 定格式                ?string("自定义格式")
                  ​    y:年  M:月  d:日
                  ​    H:时  m:分  s:秒



数值类型

​ 在freemarker中日期类型可以直接输出
​ 字符串 ?c
​ 货币类型 ?string.currency
​ 百分比 ?string.percent
​ 保留浮点数指定小数个数,#的个数就代表保留小数的个数(四舍五入) ?string[“0.##”]


字符串类型

​ 在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”)


字符串空值情况处理

​ FreeMarker 的变量必须赋值,否则就会抛出异常。而对于 FreeMarker 来说,null 值和不存在的变量是
完全一样的,因为 FreeMarker 无法理解 null 值。
​ FreeMarker 提供两个运算符来避免空值:
​ ① ! :指定缺失变量的默认值
${value!}:如果value值为空,则默认值是空字符串
${value!“默认值”}:如果value值为空,则默认值是字符串"默认值"
​ ② ?? :判断变量是否存在
如果变量存在,返回 true,否则返回 false
${(value??)?string}



数据类型:序列类型 (数组、List、Set)

​ 通过list指令输出序列
​ <#list 序列名 as 元素名>
​ ${名称}
​ </#list>

  1. ​ 获取序列的长度 ${序列名?size}

  2. ​ 获取序列元素的下标 ${元素名?index}

  3. ​ 获取第一个元素 ${序列名?first}

  4. ​ 获取最后一个元素 ${序列名?last}

  5. ​ 倒序输出序列名 ?reverse

  6. ​ 升序输出序列名 ?sort

  7. ​ 降序输出序列名 ?sort?reverse

  8. ​ 指定字段名排序序列名 ?sort_by(“字段名”)

    注:一般是JavaBean集合,对应的字段名需要提供get方法



    获取 hash 数据

<#list cityMap?keys as key>
    ${key}----${cityMap[key]} <br><#--这个可以去map中value值-->
</#list>
<br>





常见指令



assign 自定义变量指令

​ 语法:
​ <#assign 变量名=值>
​ <#assign 变量名=值 变量名=值> (定义多个变量)


if, else, elseif 逻辑判断指令

​ 格式:
​ <#if condition>
​ …
​ <#elseif condition2>
​ …
​ <#elseif condition3>
​ …
​ <#else>
​ …
​ </#if>
​ 注:

            1. condition, condition2等:将被计算成布尔值的表达式。
            2. lseif 和 else 指令 是可选的。



list指令

​ 格式1:
​ <#list sequence as item>

​ </#list>
​ 格式2:
​ <#list sequence as item>

​ <#else>
​ 当没有选项时,执行else指令
​ </#list>
​ 注:

            1. else 部分是可选的
            2. equence: 想要迭代的项,可以是序列或集合的表达式
            3. item: 循环变量 的名称
            4. 没有迭代项时,才使用 else 指令, 可以输出一些特殊的内容而不只是空在那里
            5. 都要在定义后使用,需要用if判断后使用



macro 自定义指令 (宏)
            1. 基本使用
        格式:
        ​    <#macro 指令名>
        ​        指令内容
        ​    </#macro>
        使用:
        ​    <@指令名>< /@指令名>
            2. 有参数的自定义指令
        格式:
        ​     <#macro 指令名 参数名1 参数名2>
        ​        指令内容
        ​    </#macro>
        使用:
        ​    <@指令名 参数名1=参数值1 参数名2=参数值2>< /@指令名>
        注:
                1. 指令可以被多次使用。
                2. 自定义指令中可以包含字符串,也可包含内置指令



nested 占位指令

​ nested 相当于占位符,一般结合macro指令一起使用。
​ 可以将自定义指令中的内容通过nested指令占位,当使用自定义指令时,会将占位内容显示。


import 指令

可以引入一个库。也就是说,它创建一个新的命名空间,
然后在那个命名空间中执行给定路径的模板。可以使用引入的空间中的指令。
​ 导入
​ <#import “需要引入的页面” as 别名>
​ 使用方式:
​ <@别名.内容>< /@别名.内容>


include指令

相当于把文件内容直接复制到指令位置
< # include “test.txt”>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值