.ftl文件简介及语法

1、Freemarker模板的文件后缀名
2、Freemarker其实是一种比较简单的网页展示技术,说白了就是网页模板和数据模型的结合体。这种结合模式的好处就是,分离了网页界面设计人员和编程人员的工作,让他们各司其职。
据个人理解,Freemarker大致的工作方式是,网页模板里面嵌入了数据模型中的数据、Freemarker自定义流程控制语言、Freemarker自定义的操作函数等等,在装载网页的时候,Freemarker模板自动从数据模型中提取数据,并解释整个网页为我们熟知的HTML页面。
在B/S程式设计中,常常有美工和程序员二个角色,他们具有不同专业技能:美工专注于表现——创建页面、风格、布局、效果等等可视元素;而程序员则忙于创建程式的商业流程,生成设计页面要显示的数据等等。
很多时候,要显示的资料在设计的时候并不存在,它们一般是在运行时由程式产生的,比如执行“价格不高于800NT的USB Disk”查询的返回结果。这种技术需求产生了JSP等Scriptlet,JSP十分强大,但是也常常被滥用,并导致一些不良的后果,将逻辑和表现混合在一起。,破坏了美工和程序员职责的正常分解使JSP页面难以阅读和维护。
模板引擎就是为了解决上面的问题而产生的。在设计HTML的时候,我们加入一些特定指令来指定要插入哪些数据,这些加了特殊指令的HTML或者其他文本,我们称为模板(Template)。而模板引擎会在输出页面时,用适当的数据替代这些代码
模板和嵌入JSP的HTML是不同的,模板指令只有很有限的编程能力,可以避免混入商业逻辑。
总结
简单的说,FreeMarker就是一种用Java编写的模板引擎,它根据模板输出多种规格的文本。特别指出的是,FreeMarker与Web应用框架无关,它同样可以应用在非Web应用程序环境中,而且,FreeMarker并不是只能生成HTML页面,它也可以生成各种文本,如XML/RTF/Java源代码等。
Freemarker是一个非常优秀的模版引擎,这个模版引擎可用于任何场景,FreeMarker负责将数据模型中的数据合并到模版中,从而生成标准输出。
FreeMarker特别适应与MVC模式的Web应用,通常有Java程序准备要显示的数据,由FreeMarker模版引擎来生成页面,而FreeMarker模版则提供页面布局支持,从而能更好地规范MVC架构,保证视图逻辑和业务逻辑分离。
语法:

直接调用后台方法代码
<PRE class=ftl name="code">默认两种用法   
${!("")}   
${default("")}</PRE>   
<@s.property value="%{getPieceByType(type)}"/>   
getPieceByType为方法名,type为值  

Ftl代码默认两种用法   ${!("")}   ${default("")}  默认两种用法 
${!("")} 
${default("")} 
<@s.property value="%{getPieceByType(type)}"/> 
getPieceByType为方法名,type为值 

时间格式化的方法代码 
最好加上 判断下c时候存在   
<#if c??>   
${c.addtime?string("yyyy-MM-dd HH:mm:ss")   
</#if>  

最好加上判断下c时候存在 
<#if c??> 
${c.addtime?string("yyyy-MM-dd HH:mm:ss") 
</#if>  

判断长度并截取代码 
<#if c.titleH1??>   
<#if c.titleH1?length lt 33>   
${c.titleH1}   
action 中   
配置    
private String inputPath;    
private HttpServletResponse servletResponse;    

public void setServletResponse(HttpServletResponse arg0) {   
this.servletResponse = arg0;    
}   

public HttpServletResponse getServletResponse() {   
return servletResponse;   
}    

public String formguideDownloads() throws Exception {   
formguide.setTemplateId(formguide.getTemplateId()+".jsp");     
return SUCCESS;         
}   

xml中配置   
<action name="formguideDownloads" class="com.jcauto.cms.action.FormguideAction" method="formguideDownloads">       
<result name="success" type="stream">       
<param name="contentType">text/plain;charset=utf-8</param>     
<param name="inputName">inputStream</param>         
<param name="contentDisposition">attachment;filename="${formguide.templateId}"</param>     
<param name="bufferSize">4096</param>       
</result>     
</action>      

页面上   
formguide/formguideDownloads.action?formguide.templateId=${form.templateId?if_exists}&inputPath=${fileUrlFileName?if_exists}${form.templateId?if_exists}.jsp" <#else>   
${c.titleH1[0..32]}...   
</#if>   
</#if>   
注意length是从0开始算所以如果想截取33位就使用0..32就可以了  

<#if c.titleH1??> 
<#if c.titleH1?length lt 33> 
${c.titleH1} 
action 中 
配置 
private String inputPath; 
private HttpServletResponse servletResponse; 

public void setServletResponse(HttpServletResponse arg0) { 
this.servletResponse = arg0; 
} 

public HttpServletResponse getServletResponse() { 
return servletResponse; 
} 

public String formguideDownloads() throws Exception { 
formguide.setTemplateId(formguide.getTemplateId()+".jsp");  
return SUCCESS;      
} 

xml中配置 
<action name="formguideDownloads" class="com.jcauto.cms.action.FormguideAction" method="formguideDownloads">    
<result name="success" type="stream">    
<param name="contentType">text/plain;charset=utf-8</param>  
<param name="inputName">inputStream</param>      
<param name="contentDisposition">attachment;filename="${formguide.templateId}"</param>  
<param name="bufferSize">4096</param>    
</result>  
</action>   

页面上 
formguide/formguideDownloads.action?formguide.templateId=${form.templateId?if_exists}&inputPath=${fileUrlFileName?if_exists}${form.templateId?if_exists}.jsp" <#else> 
${c.titleH1[0..32]}... 
</#if> 
</#if> 
注意length是从0开始算所以如果想截取33位就使用0..32就可以了 

List-map使用代码 
ftl.list   
<#list List as list>   
${list}   
</#list>   
list_index取出行号索引从0开始                 
formguideList?size 可以判断list大小   
这里多说一句有很多list中属性的用法不一一列举,大家可以查下ftl API    
ftl.map   
<#list Map?keys as s>   
${Map[s]}   
</#list>   

s.list   
<@s.iterater value="List" var=list>   
</@s.iterater>   
s.if   
<@s.if>   
</@>   
<@s.else>   
</@>   
ftl.if   
<#if>   
<#else>   
</#if>  

ftl.list 
<#list List as list> 
${list} 
</#list> 
list_index取出行号索引从0开始              
formguideList?size 可以判断list大小 
这里多说一句有很多list中属性的用法不一一列举,大家可以查下ftl API 
ftl.map 
<#list Map?keys as s> 
${Map[s]} 
</#list> 

s.list 
<@s.iterater value="List" var=list> 
</@s.iterater> 
s.if 
<@s.if> 
</@> 
<@s.else> 
</@> 
ftl.if 
<#if> 
<#else> 
</#if> 

上传代码 
<form actoin="${path}/piece/findPiece.action" name="form1" method="Post" enctype="multipart/form-data">    
<s:file name="sfile"/>   
</form>   
后台action中配置   
File sfile;   
String sfileName;   
String sfileType;  

<form actoin="${path}/piece/findPiece.action" name="form1" method="Post" enctype="multipart/form-data"> 
<s:file name="sfile"/> 
</form> 
后台action中配置 
File sfile; 
String sfileName; 
String sfileType; 

下载代码 
前台   
<a href="${path}/formguide /formguideDownloads.action?formguide.templateId=${form.templateId?if_exists}& amp;inputPath=${fileUrlFileName?if_exists}${form.templateId?if_exists}.jsp"& gt;下载</a> |     

后台   
private HttpServletResponse servletResponse;     
private String inputPath;    
public void setServletResponse(HttpServletResponse arg0) {   
this.servletResponse = arg0;    
}   

public HttpServletResponse getServletResponse() {   
return servletResponse;   
}   
public String formguideDownloads() throws Exception {   
formguide.setTemplateId(formguide.getTemplateId()+".jsp");     
return SUCCESS;         
}   

public InputStream getInputStream() throws Exception {    
return ServletActionContext.getServletContext().getResourceAsStream(   
inputPath);     
}   

xml   
<action name="formguideDownloads" class="com.jcauto.cms.action.FormguideAction" method="formguideDownloads">       
<result name="success" type="stream">       
<param name="contentType">text/plain;charset=utf-8</param>     
<param name="inputName">inputStream</param>         
<param name="contentDisposition">attachment;filename="${formguide.templateId}"</param>     
<param name="bufferSize">4096</param>       
</result>     
</action>    

前台 
<a href="${path}/formguide /formguideDownloads.action?formguide.templateId=${form.templateId?if_exists}& amp;inputPath=${fileUrlFileName?if_exists}${form.templateId?if_exists}.jsp"& gt;下载</a> |  

后台 
private HttpServletResponse servletResponse;  
private String inputPath; 
public void setServletResponse(HttpServletResponse arg0) { 
this.servletResponse = arg0; 
} 

public HttpServletResponse getServletResponse() { 
return servletResponse; 
} 
public String formguideDownloads() throws Exception { 
formguide.setTemplateId(formguide.getTemplateId()+".jsp");  
return SUCCESS;      
} 

public InputStream getInputStream() throws Exception { 
return ServletActionContext.getServletContext().getResourceAsStream( 
inputPath);  
} 
xml 
<action name="formguideDownloads" class="com.jcauto.cms.action.FormguideAction" method="formguideDownloads">    
<result name="success" type="stream">    
<param name="contentType">text/plain;charset=utf-8</param>  
<param name="inputName">inputStream</param>      
<param name="contentDisposition">attachment;filename="${formguide.templateId}"</param>  
<param name="bufferSize">4096</param>    
</result>  
</action>    

Ftl中的循环代码 
使用宏标签来循环生成固定的值   
其中local中来定义值   
repeat用来生成   
<#macro repeat count>   
<#local y = "<img src='http://www.jcauto.com.cn/ProConsole/images/star0506.gif' border='0' alt='' width='11' height='11'/>">   
<#list 1..count as x>   
${y} ${count}/${x}: <#nested>   
</#list>   
</#macro>   
<@repeat count=3>${y?default("?")} ${x?default("?")} ${count?default("?")}</@repeat>  

使用宏标签来循环生成固定的值 
其中local中来定义值 
repeat用来生成 
<#macro repeat count> 
<#local y = "<img src='http://www.jcauto.com.cn/ProConsole/images/star0506.gif' border='0' alt='' width='11' height='11'/>"> 
<#list 1..count as x> 
${y} ${count}/${x}: <#nested> 
</#list> 
</#macro> 
<@repeat count=3>${y?default("?")} ${x?default("?")} ${count?default("?")}</@repeat> 

Ftl变量转换代码 
?number转为数字   
?c转为字符串   
?string转为字符串   
?currency(货币)   
?percent(百分比)   
trim 删除字符串首尾空格 ${“  String ”?trim} 结果为String   
split使用指定的分隔符将一个字符串拆分为一组字符串   
<#list “This|is|split”?split(“|”) as s>   
${s}   
</#list>   
${“strabg”?replace(“ab”,”in”)} 结果为string   
${“string”?contains(“ing”)?string} 结果为true   
注意:布尔值必须转换为字符串才能输出   
${“string”?index_of(“in”) 结果为3  
${“string”?index_of(“ab”) 结果为-1  
length返回字符串的长度 ${“string”?length}结果为6  
lower_case将字符串转为小写   
${“STRING”?lower_case}à结果为string   
upper_case将字符串转为大写   
${“string”?upper_case}à结果为STRING   
ends_with 判断某个字符串是否由某个子串结尾,返回布尔值。   
${“string”?ends_with(“ing”)?string} 返回结果为true   
注意:布尔值必须转换为字符串才能输出   
html 用于将字符串中的<、>、&和“替换为对应得&lt;&gt;&quot:&amp   
index_of(substring,start)在字符串中查找某个子串,返回找到子串的第一个字符的索引,如果没有找到子串,则返回-1。   
Start参数用于指定从字符串的那个索引处开始搜索,start为数字值。   
如果start大于字符串长度,则start取值等于字符串长度,如果start小于0, 则start取值为   
${‘str’?substring(0)}à结果为str   
${‘str’?substring(0,1)}à结果为s   

2.cap_first 将字符串中的第一个单词的首字母变为大写。   
${‘str’?cap_first}à结果为Str   

3.uncap_first将字符串中的第一个单词的首字母变为小写。   
${‘Str’?cap_first}à结果为str   

4.capitalize将字符串中的所有单词的首字母变为大写   
${‘str’? capitalize}à结果为STR   
date,time,datetime将字符串转换为日期   
例如:   
<#assign date1=”2009-10-12”?date(“yyyy-MM-dd”)>   
<#assign date2=”9:28:20”?time(“HH:mm:ss”)>   
<#assign date3=” 2009-10-12 9:28:20”?time(“HH:mm:ss”)>   
${date1}à结果为2009-10-12  
${date2}à结果为9:28:20  
${date3}à结果为2009-10-12 9:28:20  

?number转为数字 
?c转为字符串 
?string转为字符串 
?currency(货币) 
?percent(百分比) 
trim 删除字符串首尾空格 ${“  String ”?trim} 结果为String 
split使用指定的分隔符将一个字符串拆分为一组字符串 
<#list “This|is|split”?split(“|”) as s> 
${s} 
</#list> 
${“strabg”?replace(“ab”,”in”)} 结果为string 
${“string”?contains(“ing”)?string} 结果为true 
注意:布尔值必须转换为字符串才能输出 
${“string”?index_of(“in”) 结果为3 
${“string”?index_of(“ab”) 结果为-1 
length返回字符串的长度 ${“string”?length}结果为6 
lower_case将字符串转为小写 
${“STRING”?lower_case}à结果为string 
upper_case将字符串转为大写 
${“string”?upper_case}à结果为STRING 
ends_with 判断某个字符串是否由某个子串结尾,返回布尔值。 
${“string”?ends_with(“ing”)?string} 返回结果为true 
注意:布尔值必须转换为字符串才能输出 
html 用于将字符串中的<、>、&和“替换为对应得&lt;&gt;&quot:&amp 
index_of(substring,start)在字符串中查找某个子串,返回找到子串的第一个字符的索引,如果没有找到子串,则返回-1。 
Start参数用于指定从字符串的那个索引处开始搜索,start为数字值。 
如果start大于字符串长度,则start取值等于字符串长度,如果start小于0, 则start取值为 
${‘str’?substring(0)}à结果为str 
${‘str’?substring(0,1)}à结果为s 

2.cap_first 将字符串中的第一个单词的首字母变为大写。 
${‘str’?cap_first}à结果为Str 

3.uncap_first将字符串中的第一个单词的首字母变为小写。 
${‘Str’?cap_first}à结果为str 

4.capitalize将字符串中的所有单词的首字母变为大写 
${‘str’? capitalize}à结果为STR 

date,time,datetime将字符串转换为日期 
例如: 
<#assign date1=”2009-10-12”?date(“yyyy-MM-dd”)> 
<#assign date2=”9:28:20”?time(“HH:mm:ss”)> 
<#assign date3=” 2009-10-12 9:28:20”?time(“HH:mm:ss”)> 
${date1}à结果为2009-10-12 
${date2}à结果为9:28:20 
${date3}à结果为2009-10-12 9:28:20 

宏定义hash内置函数代码 
Hash的内置函数   
1.hash?keys 返回hash里的所有key,返回结果为sequence   

2.hash?values 返回hash里的所有value,返回结果为sequence   
例如:   
<#assign user={“name”:“hailang”, “sex”:“man”}>   
<#assign keys=user?keys>   
<#list keys as key>   
${key}=${user[key]}   
</#list>  

Hash的内置函数 
1. hash?keys 返回hash里的所有key,返回结果为sequence 

2.hash?values 返回hash里的所有value,返回结果为sequence 
例如: 
<#assign user={“name”:“hailang”, “sex”:“man”}> 
<#assign keys=user?keys> 
<#list keys as key> 
${key}=${user[key]} 
</#list>
<think>首先,用户的问题是:“我想了解.ftl文件的用途和相关技术背景 请问ftl文件是什么以及它在IT开发中的作用”。用户想了解.ftl文件是什么以及它在IT开发中的作用。 根据系统级指令: - 所有行内数学表达式必须使用$...$格式。 - 独立公式必须使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,例如:[^1] 用户可见层指令: - 回答结构清晰,帮助用户逐步解决问题。 - 尽量保证回答真实可靠。 参考站内引用: - 引用[1]: 关于Freemarker模板引擎,.ftl后缀文件用于取值时使用插值表达式。[^1] - 引用[2]: UBI均衡、日志打印等,涉及FTL(Flash Translation Layer)在Nand Flash中的应用。[^2] - 引用[3]: Java操作FreeMarker模板引擎,.ftl文件用于HTML内容,带有变量替换。[^3] - 引用[4]: Java加载.ftl,涉及Nginx配置。[^4] - 引用[5]: FTL文件模板导出Word文档,包含图片。[^5] 这些引用表明.ftl文件主要与FreeMarker模板引擎相关,但也提到了FTL在存储技术中的含义。用户的问题集中在IT开发中,所以焦点应该在FreeMarker上,因为引用[1]、[3]、[4]、[5]都涉及FreeMarker模板。 关键点: - .ftl文件是FreeMarker模板文件的后缀。 - FreeMarker是一个Java-based模板引擎,用于生成文本输出(如HTML、XML、代码等),基于模板和数据模型。 - 在IT开发中,它常用于Web开发,动态生成内容。 回答结构: 1. **介绍.ftl文件**:解释它是什么。 2. **技术背景**:简要说明FreeMarker模板引擎。 3. **用途**:在IT开发中的作用,如Web开发、文档生成等。 4. **引用相关部分**:自然地添加引用标识。 5. **生成相关问题**:在最后添加相关问题部分。 确保回答使用中文。 生成相关问题: - 基于主题,生成2-3个相关问题。 最后,添加引用标识:例如,如果引用内容,末尾加[^1]等。 内容大纲: - 开头:直接回答什么是.ftl文件。 - 主体:分步解释。 - 什么是FreeMarker模板引擎。 - .ftl文件的结构和用途。 - 在IT开发中的应用。 - 结尾:总结并添加相关问题。 引用使用: - 引用[1]: 提到.ftl文件用于插值表达式。 - 引用[3]: 示例Java操作FreeMarker。 - 引用[5]: 导出Word文档。 引用[2]是关于FTL在存储中的含义,可能不相关,除非用户提到存储技术,但问题焦点是IT开发,所以优先FreeMarker。 用户问题没有指定上下文,但引用中大部分是FreeMarker,所以假设用户指的是FreeMarker模板文件。 回答: - 定义:.ftl文件是FreeMarker模板文件的后缀名,FreeMarker是一个模板引擎。 - 作用:在IT开发中,用于将数据模型和模板结合生成动态内容,如HTML页面、电子邮件、报告等。 - 背景:基于Java,但可以用于其他语言。 添加引用:例如,当提到插值表达式时,引用[1];当提到Java操作时,引用[3]。 相关问题: 1. FreeMarker模板引擎的基本语法是什么? 2. 如何在Java项目中集成和使用FreeMarker? 3. FreeMarker与其他模板引擎(如Thymeleaf)相比有什么优势? 确保数学表达式正确:用户问题中没有数学内容,但如果有,需用$...$或$$...$$。这里可能不需要。 最后,输出格式:回答后,添加“§§相关问题§§”部分。</think>### .ftl文件的用途和相关技术背景 在IT开发中,.ftl文件是FreeMarker模板引擎的专用文件格式(后缀名为.ftl),它基于模板和数据模型动态生成文本输出,如HTML、XML、Word文档或代码文件。FreeMarker是一个开源的Java-based模板引擎,由Apache基金会维护,广泛应用于Web开发、文档生成和代码自动化等场景。下面我将逐步解释其核心概念、技术背景和在IT开发中的作用,确保内容清晰可靠。 #### 1. **什么是.ftl文件?** - .ftl文件是一个纯文本文件,包含静态内容(如HTML标签)和动态占位符(称为**插值表达式**),例如`${variableName}`。当应用程序运行时,FreeMarker引擎将数据模型(如Java对象)注入模板,替换这些占位符,生成最终的输出内容。例如,一个简单的.ftl文件可能如下: ```html <!DOCTYPE html> <html> <body> <h1>欢迎, ${userName}!</h1> <!-- 插值表达式用于动态取值 --> </body> </html> ``` 这里,`${userName}` 会在渲染时被实际数据替换[^1]。 #### 2. **技术背景:FreeMarker模板引擎** - **核心机制**:FreeMarker采用MVC(Model-View-Controller)设计模式,将业务逻辑(Controller)与视图表现(View)分离。.ftl文件作为视图层,定义了输出结构;数据模型由后端代码(如Java)提供,引擎负责渲染。这避免了在代码中硬编码HTML,提高了可维护性。 - **关键特性**: - **插值表达式**:用于变量替换,如`${data}`,支持简单运算和条件判断。 - **指令标签**:使用`<#...>`语法控制逻辑,如循环和条件分支(例如`<#list items as item>...</#list>`)。 - **跨平台性**:虽然基于Java,但FreeMarker可集成到多种环境(如Spring框架),并支持输出任意文本格式[^3]。 - **性能优势**:FreeMarker在渲染时高效且轻量,适合高并发Web应用,因为它避免了运行时编译(如JSP),而是预编译模板[^5]。 #### 3. **在IT开发中的作用** .ftl文件在IT开发中扮演核心角色,尤其在以下场景: - **Web开发**:动态生成HTML页面。例如,在Java Web应用中,.ftl文件存储在`resources/templates`目录,后端控制器填充数据模型后,引擎渲染为响应内容。这简化了前后端分离,提高了开发效率[^1][^3]。 - **文档生成**:自动化创建Word、PDF或Excel文档。通过.ftl模板定义文档结构(如标题、表格),结合数据生成定制化报告。优点包括样式控制灵活、输出格式标准,且支持图片嵌入[^5]。 - **代码和配置生成**:用于生成源代码、配置文件或SQL脚本。例如,在代码生成工具中,.ftl模板基于数据模型输出重复性代码,减少手动错误。 - **电子邮件和报告**:批量生成个性化邮件或业务报告,利用模板动态插入用户数据。 总体而言,.ftl文件通过解耦数据和视图,提升了代码复用性和可测试性。在性能上,FreeMarker优于许多传统方案(如JSP),因为它减少了服务器负载,并支持缓存优化[^4]。 #### 4. **相关技术背景扩展** - **与其他技术的比较**:FreeMarker常与Thymeleaf或Velocity对比,但FreeMarker以语法简洁和强大逻辑控制见长。在存储技术中,FTL(Flash Translation Layer)是另一个概念,用于NAND Flash管理(如磨损均衡),但这与.ftl文件无关,用户需注意区分[^2]。 - **学习资源**:入门FreeMarker可通过官方文档或Java框架集成(如Spring Boot),常见工具包括IDE插件(支持.ftl语法高亮)和Maven依赖管理。 .ftl文件作为FreeMarker的核心载体,是IT开发中实现动态内容生成的利器。结合数据模型,它让开发更高效、灵活,尤其适合需要高定制化输出的项目[^3][^5]。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值