freemarker的学习和使用

本文介绍了Freemarker作为一款模板引擎的工作原理和优势,包括它如何实现逻辑与页面设计的分离,以及如何实现页面静态化。详细讲述了Freemarker模板的组成部分,如Text文本、插值、FTL标签和注释,并提供了具体模板示例。此外,还讨论了在SpringMVC框架下如何结合Maven进行Freemarker的配置和使用,包括模板的引入、数据注入以及关键标签的解析方法。

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

1、freemarker是什么
      freemarker是一款模板引擎,它实现程序逻辑和页面设计的分离,完成静态文本的输出。它不是web开发框架,准确来说,它仅仅只是我们MVC开发下,视图层的一个组件而已。

2、为什么要用freemarker
     使用freemarker实现逻辑和表现的分离,使java程序员和美工能够各司其职,发挥所长,只专注自己的擅长的方面。并且它的页面是静态化的,方便搜索引擎找到。

3、freemarker的模板(ftl文件)构成
    (1)、Text文本:文本会照着原样来输出。
    (2)、Interpolation 插值:这部分的输出会被计算的值来替换。插值由${和}所分隔(或者#{和},这种风格已经不建议再使用了)。
    (3)、FTL tags标签:FTL标签和HTML标签很相似,但是它们却是给FreeMarker的指示,而且不会打印在输出内容中。
    (4)、Comments注释:FTL的注释和HTML的注释也很相似,但它们是由<#--和-->来分隔的。注释会被FreeMarker所忽略,更不会在输出内容中显示。
     我们来看一个具体的模板,其中的内容已经用颜色来标记了:文本,插值,FTL标签,注释。    
<html>
<head>
<title>Welcome!</title>
</head>
<body>
<#-- Greet the user with his/her name -->
<h1>Welcome ${user}!</h1>
<p>We have these animals:
<ul>
<#list animals as being>
<li>${being.name} for ${being.price} Euros
</#list> 
</ul>
</body>
</html>

4、freemarker的使用
    说明:这里的freemarker使用示例,是在springMVC框架下,结合maven自动化构建的示例。
    (1)maven引包
<dependency>
	<groupId>org.freemarker</groupId>
         <artifactId>freemarker</artifactId>
         <version>2.3.16</version>
</dependency>
     (2)编写前台模板展示页面
       这里只给出一些html片段和ftl模板文件,首先是html片段a.html,然后是ftl模板文件b.ftl
<div class="module-one">
	<div class="mode-left">
	   <div class="mode-left-tit clearfix">
	      <h1 class="mo-tit-h1 font">行业资讯</h1>
	      <span class="span-more"><a href="../../mvc/web/news.html">更多>></a></span>
	   </div>
	   <div class="mode-left-con home-mode-h">
			<#include "/res/web/template/index-adt4.ftl">
	     <div class="mode-list3" id="mode-list3">
			<!--  行业资讯  -->
		    <#include "/res/web/template/index-infomations.ftl">
             </div>
         </div>
<pre name="code" class="html">      </div>
 </div>
 
 
<#list infomations as info>
	<#if info_index ==0>
		<div class="mode-list3-tab" style="height:235px;overflow:hidden">
	<#else>
		<div class="mode-list3-tab hide"  style="height:235px;overflow:hidden">
	</#if>
	<h1 class="font"><a target="_blank" href="../../mvc/web/newsDetail.html?newId=${info.id}">${info.title}</a></h1>
			 <#if info.content?length gt 200>${info.content[0..200]}......<a target="_blank" style="color:#e50011;"   href="newsDetail.html?newId=${info.id}">[ 详情 ]</a>
			  <#else>${info.content}
			 </#if>
			 
	</div>
</#list>
    我们是怎样来显示引入了ftl模板文件的html页面呢?首先,我们要在浏览器地址栏中输入向后台发送请求的路径,比如localhost:8080/mvc/web/index.html,然后服务器后台查询数据,并将数据插入模板文件里,最后输出到页面。  
  (3)向后台发送请求
@RequestMapping(value="/index")
	public ResponseEntity<String> index(){
		try {
			Map<String,Object> data = new HashMap<String,Object>();
			//行业资讯
			data.put("infomations", getInfomation());
			return super.getFreeMark("/res/web/index.html", data);
		} catch (IOException e) {
			return new ResponseEntity<String>(e.getMessage(),HttpStatus.NOT_FOUND);
		}
	}
    controller层的这个方法最关键的地方是super.getFreeMark( string url, map data),它将对引入了模板文件的html进行组装数据,其工作流程是先通过freeMarker加载模板,然后获取模板,再将要插入的数据插入到模板中,最后是将获得的模板+数据通过 html的response响应流输出到页面。super.getFreeMark( string url, map data)的具体实现,我会在接下来的文章中讨论。
    这里再解释一下上述代码中所使用的freeMarker标签   
<#include "/res/web/template/index-infomations.ftl">
    在html页面中引入ftl模板文件
<#list infomations as info>
</#list>
    “infomations”是服务器端查询的List集合数据,freeMarker解析遇到这个标签时,它会循环输出<#list></#list>标签之内的内容。
<#if info_index ==0>
		<div class="mode-list3-tab" style="height:235px;overflow:hidden">
	<#else>
		<div class="mode-list3-tab hide"  style="height:235px;overflow:hidden">
	</#if> 
	</div>
     <#if></#if>为判断标签,这里表示如果info_index等于0,解析为”<div class="mode-list3-tab" style="height:235px;overflow:hidden">“,否则解析为”<div class="mode-list3-tab hide"  style="height:235px;overflow:hidden">“,"info_index"中的info是上边List集合infomations中的元素,index是表示循环这个list的下标,索引。

5、freemarker学习笔记
(1)freemarker不允许值丢失,即当值为空或者null的时候,会报错。
        解决办法:在值后面加!"缺省值"
        <h1>Welcome ${user.name}!"缺省值"</h1>
(2)??表示user为空,则不输出if内的内容
        <#if user??><h1>Welcome ${user.name}!"缺省值"</h1></#if>
(3)返回回来的值可以计算,但它必须是数值型
        ${cargo.weight/2}
(4)<#if>标签表达式有逻辑操作:
        逻辑或:||
        逻辑与:&&
        逻辑非:!
        注意:逻辑操作符仅仅在布尔值之间有效,若用在其他类型将会产生错误导致模板执行中止。
(5)当你需要输出<,&像这样的特殊符号,把插值放在escape指令中,它会输出&amp;










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值