FreeMarker

本文主要介绍了FreeMarker,一个用于生成动态Web内容的强大的模板引擎。内容包括其概述、配置与依赖、数据类型、常用指令以及页面静态化等核心功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. FreeMarker

  • 概述

     FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。 是一个Java类库。
     特性:
     	1.通用目标
     		能够生成各种文本:HTML、XML、RTF、Java源代码等等。
     		易于嵌入到你的产品中:轻量级;不需要Servlet环境。
     		插件式模板载入器:可以从任何源载入模板,如本地文件、数据库等等。
     		你可以按你所需生成文本:保存到本地文件;作为Email 发送;从Web应用程序发送它返回给Web浏览器。
     	2.强大的模板语言
     		所有常用的指令:include、if/elseif/else、循环结构。
     		在模板中创建和改变变量。
     		几乎在任何地方都可以使用复杂表达式来指定值。
     		命名的宏,可以具有位置参数和嵌套内容。
     		名字空间有助于建立和维护可重用的宏库,或将大工程分成模块,而不必担心名字冲突。
     		输出转换块:在嵌套模板片段生成输出时,转换HTML转义、压缩、语法高亮等等;你可以定义自己的转换。
     	3.通用数据模型
     		FreeMarker不是直接反射到Java对象,Java对象通过插件式对象封装,以变量方式在模板中显示。
     		你可以使用抽象(接口)方式表示对象(JavaBean、XML文档、SQL查询结果集等等),告诉模板开发者使用方法,使其不受技术细节的打扰。
     	4.为Web准备
     		在模板语言中内建处理典型Web相关任务(如HTML转义)的结构。
     		能够集成到Model2 Web应用框架中作为JSP的替代。
     		支持JSP标记库。
     		为MVC模式设计:分离可视化设计和应用程序逻辑;分离页面设计员和程序员。
     	5.智能的国际化和本地化
     		字符集智能化(内部使用UNICODE)。
     		数字格式本地化敏感。
     		日期和时间格式本地化敏感。
     		非US字符集可以用作标识(如变量名)。
     		多种不同语言的相同模板。
     	6.强大的XML处理能力
     		<#recurse> 和 <#visit> 指令(2.3版本)用于递归遍历XML树。在模板中清楚和直接的访问XML对象模型。
     		开源论坛JForum就是使用了FreeMarker做为页面模板。
     格式:
     	${express}
     注释:
     	<!--HTML注释,css,js-->
     	<#--freemarker注释-->
    
  • 配置坐标依赖和部署插件

     pom.xml中添加:
     	<!-- 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>
     	<!--插件地址:Tomcat http://tomcat.apache.org/maven-plugin-2.2/ Jetty https://www.eclipse.org/jetty/documentation/current/jetty-maven- plugin.html --> 
     	<!-- 配置jetty插件 --> 
     	<plugin> 
     		<groupId>org.eclipse.jetty</groupId> 
     		<artifactId>jetty-maven-plugin</artifactId> 
     		<version>9.2.1.v20140609</version> 
     	</plugin>
     web.xml变为:
     	<?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>/template</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>
    
  • 数据类型

     1.布尔型:
     	等价于Java的Boolean类型。
     	不同的是不能直接输出,可转换为字符串输出。
     	 	?c                  ${bool?c}
            ?string             ${bool?string}
            ?string("","")      ${bool?string("数据值是true的时候显示","数据值是flase的时候显示")}
            ?then("","")        ${bool?then("数据值是true的时候显示","数据值是flase的时候显示")}
     2.日期型:
     	等价于java的Date类型。
     	不同的是不能直接输出,需要转换成字符串再输出。
     		?date				年月日          
         	?date				时分秒         
        	?datetime			年月日时分秒     
         	?string("自定义格式")指定格式        
            	y:年  M:月  d:日
                H:时  m:分  s:秒
     3.数值型:
     	等价于java 中的int,float,double等数值类型。
     	可以直接输出,有三种显示形式:数值型(默认)、货币型、百分比型。
     	1.转字符串
        	普通字符串       	?c
            货币型字符串     	?string.currency
            百分比型字符串   	?string.percent
        2.保留浮点型数值指定小数位(#表示一个小数位)
             					?string["0.##"]
     4.字符型:
     	等价于java中的字符串string。
     	可以直接输出,有很多内置函数。
     		?substring(start,end) 		截取字符串(左闭右开) 
     		?uncap_first 				首字母小写输出
     		?cap_first 					首字母大写输出  
     		?lower_case 				字母转小写输出 
     		?upper_case 				字母转大写输出 
     		?length						获取字符串长度
     		?starts_with("xx")?string 	是否以指定字符开头(boolean类型) 
     		?ends_with("xx")?string 	是否以指定字符结尾(boolean类型) 
     		?index_of("xx") 			获取指定字符的索引 
     		?trim 						去除字符串前后空格 
     		?replace("xx","xx")			替换指定字符串 
     5.sequence类型:
     	等价于java中的数组,list,set 等集合类型。
     	通过list指令输出序列 
     		<#list 序列名 as 元素名> 
     			${名称} 
     		</#list>
     			${序列名?size} 			获取序列的长度 
     			${元素名?index} 			获取序列元素的下标 
     			${序列名?first} 			获取第一个元素 
     			${序列名?last} 			获取最后一个元素 
     			序列名?reverse 			倒序输出 
     			序列名?sort 				升序输出 
     			序列名?sort?reverse 		降序输出 
     			序列名?sort_by("字段名")	指定字段名排序 
     注意:一般是JavaBean集合,对应的字段名需要提供get方法。
     6.hash类型:
     	等价于java中的Map类型。
     	1.key遍历输出 
     		<#list hash?keys as key> 
     			${key} -- ${hash[key]} 
     		</#list> 
     	2.value遍历输出 
     		<#list hash?values as value> 
     			${value} 
     		</#list>
    
  • 常见指令

     1.assign 			自定义变量指令 
     	可以创建一个新的变量, 或者替换一个已经存在的变量。
     语法:
     	<#assign 变量名=值> 
     	或
     	<#assign 变量名=值 变量名=值> (定义多个变量)
     2.if elseif else 	逻辑判断指令
     	可以使用if ,elseif和else指令来条件判断是否满足某些条件。
     格式:
     	<#if condition> 
     		... 
     	<#elseif condition2> 
     		... 
     	<#elseif condition3> 
     		... 
     	<#else> 
     		... 
     	</#if>
     注意: 
     	1.condition, condition2等:将被计算成布尔值的表达式。 
     	2.elseif和else指令是可选的。
     3.list 			遍历指令
     	可以使用list指令来对序列进行遍历。
     格式1:
     	<#list sequence as item> 
     	</#list> 
     格式2:
     	<#list sequence as item> 
     	<#else> 
     		当没有选项时,执行else指令 
     	</#list> 
     注意: 
     	1.else 部分是可选的 。
     	2.sequence:想要迭代的项,可以是序列或集合的表达式 。
     	3.item:循环变量的名称。
     	4.当没有迭代项时,才使用else指令, 可以输出一些特殊的内容而不只是空在那里。
     4.macro 			自定义指令宏
     	可以使用macro指令来自定义一些自定义指令。
     	格式1(无参数):
     		<#macro 指令名> 
     			指令内容 
     		</#macro> 
     	使用:
     		<@指令名></@指令名>
     	格式2(有参数):
     		<#macro 指令名 参数名1 参数名2> 
     			指令内容 
     		</#macro> 
     	使用:
     		<@指令名 参数名1=参数值1 参数名2=参数值2></@指令名>
     注意: 
     	1.指令可以被多次使用。 
     	2.自定义指令中可以包含字符串,也可包含内置指令。
     5.nested 			占位指令
     	nested指令执行自定义指令开始和结束标签中间的模板片段。
     	嵌套的片段可以包含模板中任意合法的内容。
     	一般结合macro指令一起使用。 
     	可以将自定义指令中的内容通过nested指令占位,当使用自定义指令时,会将占位内容显示。
     6.import 			导入指令
    	import 指令可以引入一个库。
    	也就是说,它创建一个新的命名空间,然后在那个命名空间中执行给定路径的模板。
    	可以使用引入的空间中的指令。
    	格式:
    		<#import "文件名" as 自定义名称>
     7.include 			包含指令
     	可以使用include指令在你的模板中插入另外一个FreeMarker模板文件 。 
     	被包含模板的输出格式是在include标签出现的位置插入的。 
     	被包含的文件和包含它的模板共享变量,就像是被复制粘贴进去的一样。
     	格式:
     		<#include "文件名">
    
  • 页面静态化

     通过freemarker.template.Configuration这个对象对模板进行加载的(它也处理创建和缓存预解析模板的工作),
     然后我们通过getTemplate方法获得你想要的模板,
     有一点要记住freemarker.template.Configuration在你整个应用必须保证唯一实例。
    
  • 运算符

     1.算术运算符
     	+、-、*、/、%
     2.逻辑运算符 
     	&&、||、!
     3.比较运算符 
     	> (gt)				大于号,推荐使用gt 
     	< (lt)				小于号,推荐使用lt 
     	>= (gte)			大于等于, 推荐是用gte 
     	<= (lte)			小于等于,推荐使用lte 
     	== 					等于 
     	!= 					不等于
     4.空值运算符 
     	??				判断是否为空,返回布尔类型 
     		如果不为空返回 false, 如果为空返回 true,不能直接输出 ${(name??)?string} 
     	!				设置默认值
     		如果为空,则设置默认值 
     		1.设置默认为空字符串: ${name!} 
     		2.设置指定默认值 ${name!'zhangsan'}
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值