FreeMaker学习笔记

本文深入解析Freemarker模板引擎技术,涵盖原理、常用语法及项目实战,对比JSP,详细介绍Freemarker的执行方式、开发效率及数据提取方式,适合Web开发人员学习。

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

Freemarker模板引擎技术


  • 了解模板引擎原理

  • 掌握Freemarker常用语法

  • Freemarker项目实战

1、什么是模板引擎?
答:模板引擎的目标是"数据 + 模板 = 结果"
模板引擎将数据与展现有效“解耦”。

主流的模板引擎

JSP (Java Server Page)
Freemaker (模板引擎)
Beetl
Freemarker是免费开源的模板引擎技术
Freemarker脚本为Freemarker Template Language (拓展名 .ftl)
Freemarker提供了大量内建函数来简化开发

JSP与Freemarker的比较

比较项目JSPFreemarker
官方标准
执行方式编译型解释性
执行效率
开发效率
拓展能力
数据提取JSTL+EL内置标签

如何使用Freemarker

在网站上输入freemarker.aphache.org 下载解压后将jar文件添加到工程中
之后编辑器会推荐下载一个编辑器,下载即可。

在类中使用Freemarker的步骤
1、加载模板
	//导入相关的包,创建核心配置对象
	Configuration config = new Configuration(Configuration.VERSION_2_3_28);
    //指定版本号
	设置加载目录
		config.setClassForTemplateLoading(FreemarkerSample1.class, "");
				//第一个参数是.ftl文件在那个类下面
				//第二个参数是传入空字符串代表当前包的意思
	   //得到模板对象
       Template t = config.getTemplate("sample1.ftl");

	    	// 2、创建数据
     	 	Map<String,Object> date = new HashMap<>();
      	 	date.put("site", "新浪");
      	 	date.put("url", "http://www.sina.com");

			// 3、产生输出
       	 	t.process(date,new OutputStreamWriter(System.out));
FTL取值

${属性名} 取值,可对属性进行计算
${属性名!默认值} 使用默认值
${属性名?string} 格式化输出
Freemarker对javabean 也有着良好的支持
定义一个computer类,其中包含一些字段

data.put("date", new Date());
data.put("number",837183.883217);
Map<String,Object> info = new HashMap<>();
info.put("cpu", "i5-7740");
//实例化computer对象
Computer c1 = new Computer( "123456", "Thinkpad", 1, "李四", new Date(), 12900f, info );        
data.put("computer",  c1 );

在ftl文件中可以使用如下代码提取数据:

	<#-- 这是一段注释 -->
	${site}
	${url}
	<#-- !默认值 -->
	${author!"不存在的属性"}
	${date?string("yyyy年MM月dd日  HH:mm:ss SSS")}
	${number?string("0.00")}
	SN:${computer.sn}
	型号:${computer.model}
	状态:${computer.state}
	用户:${computer.user}
	采购时间:${computer.dop?string("yyyy年MM月dd日")}
	采购价格:${computer.price?string("0.00")}
	配置信息
	------------------
	CPU:${computer.info["cpu"]}    //info为Map类型的数据,[]内填写key值
	内存:${computer.info["memory"]!"无内存信息"}

if 分支判断
示例:

假设需要根据学生成绩判断其等级,其中student.score存储学生成绩,在ftl文件中

//值得注意的是,在freemarker中,判断字符串是否相等,可以直接使用 '=='号

<#if student.grade == "A" >
优秀
</#if>

<#-- ??用来判断对象是否为空,true不为空,false为空 -->
<#if computer.user??>
用户:${computer.user}
</#if>


switch分支判断

<#switch computer.state>
	<#case 1>
状态:正在使用
	<#break>
	<#case 2>
状态:闲置
	<#break>
	<#case 3>
状态:已作废
	<#break>
	<#default>
	状态:无效状态
</#switch>
	

List 迭代列表

<#list  student  as  stu >
   <li>${stu_index} - ${stu.name} </li>
</#list>

List迭代Map

<#list map?keys  as key>
      ${key}:${map[key]}
</#list>

List迭代Map
<#list computer_map?keys as k>
${k}-${computer_map[k].model}
${computer_map[k].price?string("0.00")}
</#list>

使用内建函数

函数名说明示例
lower_case/upper_case大小写转换“abcdef”?upper_case
cap_first首字母大写“jackson”?cap_first
index_of查找字符索引“abcdef”?index_of(“b”)
length返回字符串长度“abcdef”?length
round/floor/ceiling四舍五入/上下取整pi?floor
size得到集合元素总数student?size
first / last获取第一个/最后一个元素students?first
sort_by按某个属性对集合排序list?sort_by(“time”)
${name?cap_first}
${brand?upper_case}
${brand?length}
${words?replace("blood","*****")}
${words?index_of("blood")}
<#-- 利用string实现三目运算符的操作 -->
${(words?index_of("blood3")!=-1)?string("包含敏感词汇","不包含敏感词汇")}

${n?round}
${n?floor}
${n?ceiling}

公司共有${computers?size}台电脑
第一台:${computers?first.model}
最后一台:${computers?last.model}

<#list computers?sort_by("price")?reverse as c >
      ${c.sn}-${c.price}
</#list>

Freemarker官方中文文档:http://freemarker.foofun.cn/dgui_quickstart_template.html

Freemarker与java整合
1、引入freemarker.jar包
在Webcontent的WEB-INF目录下的lib文件中将jar文件复制进去,加入到工程中去
在web.xml的配置文件中 ,配置好相关配置

	<servlet>
   	 <servlet-name>freemarker</servlet-name>
   	 <servlet-class>freemarker.ext.servlet.FreemarkerServlet</servlet-class>
   	 <init-param>
     	 <param-name>TemplatePath</param-name>
     	 <param-value>/WEB-INF/ftl</param-value>	//#路径写死了
  	</servlet>
  	<servlet-mapping>
   	 <servlet-name>freemarker</servlet-name>
   	 <url-pattern>*.ftl</url-pattern>
在WEB-INF目录下创建ftl文件,测试
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值