freemarker的使用心得

本文详细介绍Freemarker模板引擎的使用方法,包括基本使用、高级特性如条件判断、数据遍历、宏指令等,并介绍如何在Struts2框架中集成Freemarker,以及如何自定义内建函数。

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

freemarker的使用心得

freemarker目前虽然使用的公司不多,但是在某些时候就必须使用,当需要遍历json数据的时候,目前市面上的好多显示组件都达不到要求 唯一能用的也就只有freemarker了。在java里使用的模板引擎有velocity、freemarker,至于velocity由于比较古老加 之功能也不及freemarker那么强大使用的人群已经很少了。这次打算系统性的分享我学习freemarker的心得。

一  第一个freemarker程序

freemarker是一种与web容器无关的技术,应用并不局限于页面。使用java开发出来的模板引擎。因此java中使用freemarker应该算得上是一个比较好的选择了

freemarker的运行原理总结起来就是如下四点:

(1)初始化freemarker配置实例

(2)创建数据模型

(3)加载模板文件

(4)显示生成后的数据

如果要使用freemarker要做的就是把freemarker的jar包放到lib或者构建路径下面就OK了,来看下面这段程序

package org.lxh;  import java.io.*; import java.util.*;  import freemarker.template.Configuration; import freemarker.template.Template;  public class FirstFreemarker {   public static void main(String[] args) throws Exception {   //创建freemarker配置实例  Configuration config=new Configuration();  config.setDirectoryForTemplateLoading(new File("template"));  //创建数据模型  Map<String,String> m=new HashMap<String,String>();  m.put("name", "cry");  //加载模板文件  Template t=config.getTemplate("index.ftl");  //显示生成后的数据  Writer w=new OutputStreamWriter(System.out);  t.process(m, w);  w.close();  }  }

运行效果如下所示:

二  freemarker进阶

如果觉得freemarker的能力就这么点那就错了,freemarker还包含数据类型、条件判断、数据遍历、内建函数等,这些功能对日常开发已经足够,看下面这段程序

package org.lxh;  import java.io.File; import java.io.OutputStreamWriter; import java.io.Writer; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Random;  import freemarker.template.Configuration; import freemarker.template.Template;  public class UseIf {  public static void main(String[] args) throws Exception {   //创建freemarker配置实例  Configuration config=new Configuration();  config.setDirectoryForTemplateLoading(new File("template"));  //创建数据模型  Map<String,Object> m=new HashMap<String,Object>();  m.put("score",  new Random().nextInt(100));    UserInfo u1=new UserInfo();  u1.setName("仓木麻衣");  u1.setPassword("123456");  UserInfo u2=new UserInfo();  u2.setName("柯南");  u2.setPassword("654321");  List<UserInfo> all=new ArrayList<UserInfo>();  all.add(u2);  all.add(u1);  m.put("userList", all);  m.put("time", new Date());  m.put("str", "北京,上海,杭州");  //加载模板文件  Template t=config.getTemplate("useif.ftl");  //显示生成后的数据  Writer w=new OutputStreamWriter(System.out);  t.process(m, w);  w.close();   } }

看下模板文件的内容:

--------------if语句的使用---------------- <#if score gte 60>  及格 <#elseif score gte 80&&score lte 90> 良好 <#else> 高材生 </#if> --------------空值判断、默认值--------------- ${name!"未定义"} --------------判断值是否存在------------ <#if name??>   name存在 <#else>  name不存在 </#if> -------------使用list遍历数据-------------- <#list userList as user> <#if  user_has_next> 最后一组:${user.name}-${user.password}<#else>${user.name}-${user.password}</#if> </#list> -------------其他内建函数----------------- (1)日期格式化 ${time?string("yyyy-MM-dd")} (2)截取字符串 ${str?substring(0,2)} (2)indexof的使用 ${str?last_index_of(",")} (2)split的使用 <#list "12,13,14,15"?split(",") as item> ${item} </#list>

对于list的遍历有两个隐含变量用的比较多分别是_index  _has_next  ,详细的使用可以百度一下,真的很简单

三 freemarker宏指令

宏指令可以简单理解成在freemarker可以自己定义的公共方法,具体用途主要用于分页,来看下面的这个最简单的例子

package org.lxh;  import java.io.File; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.Writer; import java.util.HashMap; import java.util.Map;  import freemarker.template.Configuration; import freemarker.template.Template;  public class UseMacro {   public static void main(String[] args) throws Exception {   //创建freemarker配置实例  Configuration config=new Configuration();  config.setDirectoryForTemplateLoading(new File("template"));  //创建数据模型  Map<String,Object> m=new HashMap<String,Object>();  m.put("type", "other");  m.put("num1", 2);  m.put("num2", 3);  //加载模板文件  Template t=config.getTemplate("macro.ftl");  //显示生成后的数据  Writer w=new OutputStreamWriter(System.out);  t.process(m, w);  w.close();   }  }

模板文件的内容如下:

----------------------宏指令的使用 m1可以看成是方法的名称,num1、num2为入参---------------------- <#macro m1 num1 num2> <#assign result=num1+num2> <h3>${result}</h3> </#macro> <@m1 5 6/> ----------------------宏指令(嵌入式)----------------- <#macro m2> <h3><#nested></h3> </#macro> <@m2>hello world</@m2>

运行效果如下:

四  其他指令

包含指令:<#include "test.txt"  />

import指令:<#import "b.ftl" as bb  />

<#macro copyright date>   <p>Copyright (C) ${date}.</p>  </#macro>

当ftl文件比较多的时候,而且这些ftl有引用关系,这个时候import就可以大展拳脚了,如<@bb.copyright date="2010-2011" />

五  struts2中使用freemarker

struts2是不能直接使用freemarker的,如果一定要用可以:

(1) 解压 struts2-core-X.X.X.jar 文件,把在 META-INF 文件夹下面的 struts-tags.tld 文件复制到 WEB-INF 文件夹下。     将 freemark 的 jar 导入到工程中

(2) 在 web.xml 文件中配置 freemark 同时启动 JSPSupportServlet. 代码如下

<servlet>   <servlet-name>freemarker</servlet-name>   <servlet-class>    freemarker.ext.servlet.FreemarkerServlet   </servlet-class>   <!--下面的配置freemarke的ftl文件的位置 -->   <init-param>    <param-name>TemplatePath</param-name>    <param-value>/</param-value>   </init-param>   <!-- 是否和服务器(tommcat)一起启动。-->   <load-on-startup>1</load-on-startup>  </servlet>   <servlet-mapping>   <servlet-name>freemarker</servlet-name>   <url-pattern>*.ftl</url-pattern>  </servlet-mapping>   <servlet>   <!-- define a JspSupportServlet Object -->   <servlet-name>JspSupportServlet</servlet-name>   <servlet-class>org.apache.struts2.views.JspSupportServlet</servlet-class>   <!-- setting JspSupportServlet auto start -->   <load-on-startup>1</load-on-startup>  </servlet>

(3) .在FreeMarker模板中使用assign指令导入标签库,这样在freemarker中就可以使用struts2的标签了

<#assign s=JspTaglibs["/WEB-INF/struts-tags.tld"] /> 注:这里我把struts-tags.tld放在WEB-INF下面

(4) 在FreeMarker模板中使用struts标签

<@s;property value=""/>

注:struts使用freemarker要在result的节点加上type="freemarker"

对于这种做法有些时候不好用,freemarker也提供了在jsp页面使用freemarker的方法,同样的还是需要把freemarker的tld文件放在WEB-INF下面,这个文件如果找不到可以建一个叫fmtag.tld的文件,内容如下:

<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE taglib         PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"         "http://java.sun.com/j2ee/dtds/web-jsptaglib_1_1.dtd">  <taglib>    <tlibversion>2.0</tlibversion>   <jspversion>1.1</jspversion>   <shortname>FreeMarker JSP Support</shortname>    <tag>     <name>template</name>     <tagclass>freemarker.ext.jsp.FreemarkerTag</tagclass>     <bodycontent>tagdependent</bodycontent>     <info>Allows evaluation of FreeMarker templates inside JSP</info>     <attribute>       <name>caching</name>       <required>false</required>     </attribute>   </tag> </taglib>

接下来看看在jsp中怎么使用freemarker

(1)jsp页面引入freemarker标签库

<%@ taglib prefix="fm" uri="/WEB-INF/fmtag.tld" %>

(2)嵌入freemarker

<fm:template>        freemarker语句 </fm:template>

综合前面的情况无论怎么用是不是都很简单呢

六  扩充freemarker内建函数

freemarker虽然提供很多内建函数,但仍然有需要自定义的时候,freemarker也运行用户写自定义函数,如下所示:

public class MyFmTag implements TemplateMethodModel  {    public Object exec(List param) throws TemplateModelException {   Object result=null;   if("save".equals(param.get(0).toString())){    //调用保存方法   }   return result;  }  //保存方法................ }

使用的时候就像下面这样就ok了

<#assign check= "org.lxh.util.MyFmTag"?new()/>

<#assign result=check('save','xxx')/>

转载于:https://www.cnblogs.com/shaoke123/p/4775805.html

资源下载链接为: https://pan.quark.cn/s/22ca96b7bd39 在 IT 领域,文档格式转换是常见需求,尤其在处理种文件类型时。本文将聚焦于利用 Java 技术栈,尤其是 Apache POI iTextPDF 库,实现 doc、xls(涵盖 Excel 2003 及 Excel 2007+)以及 txt、图片等格式文件向 PDF 的转换,并实现在线浏览功能。 先从 Apache POI 说起,它是一个强大的 Java 库,专注于处理 Microsoft Office 格式文件,比如 doc xls。Apache POI 提供了 HSSF XSSF 两个 API,其中 HSSF 用于读写老版本的 BIFF8 格式(Excel 97-2003),XSSF 则针对新的 XML 格式(Excel 2007+)。这两个 API 均具备读取写入工作表、单元格、公式、样式等功能。读取 Excel 文件时,可通过创建 HSSFWorkbook 或 XSSFWorkbook 对象来打开相应格式的文件,进而遍历工作簿中的每个 Sheet,获取行列数据。写入 Excel 文件时,创建新的 Workbook 对象,添加 Sheet、Row Cell,即可构建新 Excel 文件。 再看 iTextPDF,它是一个用于生成修改 PDF 文档的 Java 库,拥有丰富的 API。创建 PDF 文档时,借助 Document 对象,可定义页面尺寸、边距等属性来定制 PDF 外观。添加内容方面,可使用 Paragraph、List、Table 等元素将文本、列表表格加入 PDF,图片可通过 Image 类加载插入。iTextPDF 支持种字体样式,可设置文本颜色、大小、样式等。此外,iTextPDF 的 TextRenderer 类能将 HTML、
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值