FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写,
模板用servlet提供的数据动态地生成 HTML,模板语言是强大的直观的,编译器速度快,
输出接近静态HTML页面的速度。
一.Freemarker模板应用事例。
1.创建模板文件,在/resource/template目录下建立freemarkerLocal.ftl文件。
- ------------------普通变量获取-------------------
- ${user}
- ---------获取Map中属性--------------
- ${latestProduct.url}
- ${latestProduct.name}
- -------自定义的indexOf方法变量-------
- <#assign x = "something">
- ${indexOf("met", x)}
- ${indexOf("foo", x)}
- ------自定义的转换器变量(转换小写为大写,以标签形式展现)----------------
- blah1
- <@upperCase>
- blah2
- blah3
- </@upperCase>
- blah4
- ---------------共享变量的获取,在Configuration中设置---------------
- <@to_upper>
- ${company}
- </@to_upper>
2.代码解析模板文件输出。
- public class FreemarkerLocalTest {
- public static void main(String[] args) throws Exception {
- /* 一般在应用的整个生命周期中你仅需要执行一下代码一次*/
- /* 创建一个合适的configuration */
- Configuration cfg = new Configuration();
- // 设置模板加载的方式
- cfg.setDirectoryForTemplateLoading(
- new File("D:/myspace/freemarker/resource/template"));
- // 方式二(从Web上下文获取)
- // void setServletContextForTemplateLoading(Object servletContext, String path);
- // 设置模板共享变量,所有的模板都可以访问设置的共享变量
- cfg.setSharedVariable("to_upper", new UpperCaseTransform());
- cfg.setSharedVariable("company","FooInc.");
- // 指定模板如何查看数据模型
- cfg.setObjectWrapper(new DefaultObjectWrapper());
- // 如果从多个位置加载模板,可采用以下方式
- /**
- FileTemplateLoader ftl1 = new FileTemplateLoader(new File("/tmp/templates"));
- FileTemplateLoader ftl2 = new FileTemplateLoader(new File("/usr/data/templates"));
- ClassTemplateLoader ctl = new ClassTemplateLoader(getClass(),"");
- TemplateLoader[] loaders = new TemplateLoader[] { ftl1, ftl2,ctl };
- MultiTemplateLoader mtl = new MultiTemplateLoader(loaders);
- cfg.setTemplateLoader(mtl);**/
- /* 而以下代码你通常会在一个应用生命周期中执行多次*/
- /*获取或创建一个模版*/
- Template temp = cfg.getTemplate("freemarkerLocal.ftl");
- /*创建一个数据模型Create a data model */
- Map root = new HashMap();
- root.put("user", "Big Joe");
- Map latest = new HashMap();
- root.put("latestProduct", latest);
- latest.put("url", "products/greenmouse.html");
- latest.put("name", "green mouse");
- // 方法变量,indexOf为自己定义的方法变量
- root.put("indexOf", new IndexOfMethod());
- // 转换器变量
- root.put("upperCase", new UpperCaseTransform());
- /* 合并数据模型和模版*/
- Writer out = new OutputStreamWriter(System.out);
- temp.process(root, out);
- out.flush();
- }
- }
3.自定义的方法变量类IndexOfMethod
- public class IndexOfMethod implements TemplateMethodModel {
- public Object exec(List args) throws TemplateModelException {
- if (args.size() != 2) {
- throw new TemplateModelException("Wrong arguments");
- }
- // 返回第一个字符串首次出现在第二个字符串的位置
- return new SimpleNumber(((String) args.get(1))
- .indexOf((String) args.get(0)));
- }
- }
4.自定义的转换器变量类UpperCaseTransform
- /**
- * 转换器变量,自定义自己的转换器标签
- */
- import freemarker.template.TemplateTransformModel;
- public class UpperCaseTransform implements TemplateTransformModel {
- // 转换器接口方法,将会转换标签之间的内容,首先把标签之间的内容读取到Writer对象中,
- // 再由Writer对象对其中的内容施行转换处理,转换后的内容会再次存储到Writer 中
- public Writer getWriter(Writer out, Map args) {
- return new UpperCaseWriter(out);
- }
- private class UpperCaseWriter extends Writer {
- private Writer out;
- UpperCaseWriter(Writer out) {
- this.out = out;
- }
- public void write(char[] cbuf, int off, int len) throws IOException {
- out.write(new String(cbuf, off, len).toUpperCase());
- }
- public void flush() throws IOException {
- out.flush();
- }
- // 不用调用out.close,到达结束标签close会自动被调用
- public void close() {
- }
- }
- }
二.自动生成代码应用
1.创建模板文件,在/resource/template目录下建立codeModel.ftl文件。
- package com.order.model;
- public class ${class} {
- <#list properties as prop>
- private ${prop.type} ${prop.name};
- </#list>
- <#list properties as prop>
- public ${prop.type} get${prop.name?cap_first}(){
- return ${prop.name};
- }
- public void set${prop.name?cap_first}(${prop.type} ${prop.name}){
- this.${prop.name} = ${prop.name};
- }
- </#list>
- }
2.应用代码生成模板文件。
- public class GenerateCodeTest {
- public static void main(String args[]) throws IOException,
- TemplateException {
- Configuration cfg = new Configuration();
- cfg.setDirectoryForTemplateLoading(new File(
- "D:/myspace/freemarker/resource/template/"));
- cfg.setObjectWrapper(new DefaultObjectWrapper());
- /* 获取模板文件 */
- Template template = cfg.getTemplate("codeModel.ftl");
- /* 模板数据 */
- Map<String, Object> root = new HashMap<String, Object>();
- root.put("class", "Order");
- Collection<Map<String, String>> properties = new HashSet<Map<String, String>>();
- root.put("properties", properties);
- /* 字段1 orderId */
- Map<String, String> orderId = new HashMap<String, String>();
- orderId.put("name", "orderId");
- orderId.put("type", "Long");
- properties.add(orderId);
- /* 字段2 orderName */
- Map<String, String> orderName = new HashMap<String, String>();
- orderName.put("name", "orderName");
- orderName.put("type", "String");
- properties.add(orderName);
- /* 字段3 money */
- Map<String, String> money = new HashMap<String, String>();
- money.put("name", "money");
- money.put("type", "Double");
- properties.add(money);
- /* 生成输出到控制台 */
- Writer out = new OutputStreamWriter(System.out);
- template.process(root, out);
- out.flush();
- /* 生成输出到文件 */
- File fileDir = new File("D:/generateCodeFile");
- // 创建文件夹,不存在则创建
- org.apache.commons.io.FileUtils.forceMkdir(fileDir);
- // 指定生成输出的文件
- File output = new File(fileDir + "/Order.java");
- Writer writer = new FileWriter(output);
- template.process(root, writer);
- writer.close();
- }
- }
三.JSP调用模板文件输出。
1.首先创建模板文件,在WEB-INF/templates目录下建立test.ftl文件。
2.解析模板文件类,传入pageContext参数。
- public class FreemarkerTest {
- public void execute(PageContext pageContext) throws Exception
- {
- Configuration cfg = new Configuration();
- // 设置模板的路径
- cfg.setServletContextForTemplateLoading(pageContext.getServletContext(),
- "WEB-INF/templates");
- Map root = new HashMap();
- root.put("name", "Tom");
- // 获取模板文件
- Template t = cfg.getTemplate("test.ftl");
- Writer out = pageContext.getResponse().getWriter();
- t.process(root, out);
- }
- }
3.创建JSP文件调用输出。
- <%@ page language="java" contentType="text/html; charset=GB2312"
- pageEncoding="GB2312"%>
- <%@page import="com.freemarker.test.FreemarkerTest;"%>
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
- "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=GB2312">
- <title>HelloWorld</title>
- </head>
- <body>
- <%
- FreemarkerTest c1 = new FreemarkerTest();
- c1.execute(pageContext);
- %>
- </body>
- </html>
四.Servlet调用模板文件生成html文件进行页面展示。
1.创建模板文件,在WebRoot/index目录下建立test.ftl文件。
2.创建Servlet文件解析模板文件并生成html文件进行页面输出。
- public class FreemarkerServletTest extends HttpServlet {
- public FreemarkerServletTest() {
- super();
- }
- public void destroy() {
- super.destroy();
- }
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- doPost(request, response);
- }
- public void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- //生成html后的文件
- String path = getServletContext().getRealPath("/") + "index.htm";
- System.out.println(path);
- try {
- freemarker(request, "test.ftl", path, "index");
- } catch (Exception e) {
- e.printStackTrace();
- }
- //跳转到刚生成的html文件中
- request.getRequestDispatcher("/index.htm").forward(request, response);
- }
- /**
- * 生成静态文件
- * @param request
- * @param ftl ftl文件
- * @param html 生成html后的文件
- * @param file 存放ftl文件的路径
- * @throws Exception
- */
- public void freemarker(HttpServletRequest request,String ftl,
- String html,String file) throws Exception {
- Configuration cfg = new Configuration();
- // 设置加载模板的路径
- cfg.setServletContextForTemplateLoading(getServletContext(),"/" + file);
- cfg.setEncoding(Locale.getDefault(), "GB18030");
- //获得模板并设置编码
- Template tep = cfg.getTemplate(ftl);
- tep.setEncoding("GB18303");
- //新建输出,生成html文件
- Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(html),"GB18030"));
- //设置值
- Map map = new HashMap();
- map.put("userName", "wxj");
- map.put("email", "jxauwxj@126.com");
- // 解析并输出
- tep.process(map, out);
- }
- public void init() throws ServletException {
- }
- }
3.web.xml文件进行servlet配置。
- <servlet>
- <servlet-name>FreemarkerServletTest</servlet-name>
- <servlet-class>com.servlet.FreemarkerServletTest</servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>FreemarkerServletTest</servlet-name>
- <url-pattern>/servlet/FreemarkerServletTest</url-pattern>
- </servlet-mapping>
4.页面访问如下Url:
http://localhost:8080/freemarkerWeb/servlet/FreemarkerServletTest
输出结果如下:
同时会在部署环境的目录下生成index.htm文件。
发表评论
-
freemarket学习日志(持续更新)
2012-07-03 17:34 1623实际工作中有用到就现学就卖哈 freemarker ... -
freemarker常见语法大全
2012-06-25 10:33 2647转自:http://yangq.iteye.com/ ... -
Eclipse常用插件(持续更新中)更新地址
2012-05-21 08:31 969SVN Client http://subclipse ... -
验证码识别技术研究
2012-05-09 10:09 2743转载自:http://hi.baidu.com/mrcaptc ... -
Project Lombok—方便实用的annotation工具
2012-05-08 18:13 3643Project Lombok 项目地址:http://proj ... -
用Lombok减少重复代码,很美很简单
2012-05-08 17:56 1178无意中看到这样一个小框架,看完之后,真是不得不顶,很简单 ... -
一步步构建大型网站架构
2012-04-17 08:27 980转自:http://kb.cnblogs.com/pag ... -
大型网站系统架构分析
2012-04-16 11:01 1485最近在讨论研究框架,准备框架的编写和资料。 文章转自:htt ... -
领域模型的概念:失血 贫血 充血 胀血
2012-04-10 10:10 2635转自:http://blog.csdn.net/s ... -
大型网站架构系列之五,缓存策略设计概要
2012-03-25 11:20 1621上篇对疯狂代码缓存配置进行了概要的设计,可能说的有点模糊了,有 ... -
大型网站架构系列之四,多对多关系的以及并发缓存的设计
2012-03-24 12:08 1929多对多关系以及多表查询优化处理 上篇以用户数据表 ... -
大型网站架构系列之三,多对多关系的优化设计
2012-03-24 12:07 1271上篇以用户数据表为例介绍了基本的数据分割方案以及基本的配置 ... -
大型网站架构系列之二,底层架构概论
2012-03-24 12:06 1060首先澄清上篇中关于几个朋友的评论。 上篇疯狂代码介绍的基 ... -
大型网站架构系列之一,前言,不得不考虑的问题
2012-03-24 12:02 914前言:这两天机器坏 ...
相关推荐
压缩包中的Word文件可能展示了如何将FreeMarker模板应用于生成Word文档。FreeMarker可以与其他库(如Apache POI)结合,生成复杂格式的Word文档,这对于报告生成、合同起草等场景非常有用。 3. **FTL文件示例** ...
本主题将深入探讨如何利用Freemarker模板和wkhtmltox工具来实现这一功能。 **Freemarker模板** 是一个强大的Java模板引擎,用于动态生成文本输出,如HTML、XML或PDF。它支持变量替换、控制结构(如if/else)和复杂...
本篇将重点介绍一款名为“基于Freemarker模板的代码生成器工具”,这是一款纯Java实现的工具,利用了Freemarker模板引擎的强大功能。 **一、Freemarker模板引擎** Freemarker是一个开源的模板语言,用于生成动态...
本主题涉及的核心技术是使用Freemarker模板引擎来生成DTO(Data Transfer Object)、DAO(Data Access Object)、RowMapper、BO(Business Object)和服务层代码。这些组件在Spring框架中扮演着重要角色。 1. **...
在本项目中,我们将利用FreeMarker模板语言和Spring Boot后端API接口来实现一个用户列表的查询功能。下面,我将详细讲解这个过程中的关键知识点。 1. **FreeMarker模板**: FreeMarker是一个Java模板引擎,它能够...
本话题主要探讨的是如何利用可视化div布局来生成FreeMarker模板,并结合Spring MVC 3框架进行应用。下面将详细阐述这些概念及其相关知识点。 1. **FreeMarker模板引擎**:FreeMarker是一个开源的Java模板引擎,它...
### FreeMarker模板基本语法 #### 一、FreeMarker概述与基本用法 **FreeMarker**是一种强大的、基于Java的模板引擎,主要用于动态生成HTML页面,但也支持其他类型的文本格式(如XML、JavaScript、电子邮件等)。它...
总结来说,Java FreeMarker模板生成Word动态表格是通过结合FreeMarker模板引擎的灵活性和Apache POI的强大功能,来高效地创建和更新包含动态数据的Word文档,尤其适用于需要大量定制和自动化生成的场景。通过理解并...
本示例关注的是如何使用FreeMarker模板引擎来实现这个功能,并且包含在Word文档中插入图片的能力。FreeMarker是一个强大的、轻量级的模板语言,常用于Java应用中的视图层渲染。 首先,理解FreeMarker的基本概念。...
FreeMarker概述 FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写 FreeMarker被设计用来生成HTML Web页面,特别是基于MVC模式的应用程序 虽然FreeMarker具有一些编程的能力...
Freemarker模板中的`<#list>`指令用于遍历数据集合,`<#if>`、`<#else>`则用于条件判断,而`<@include>`可以包含其他公用部分的模板。 2. **EditPage.ftl**:编辑页面模板,用于展示和修改已有数据。通常会包含表单...
在这个"freemarker模板使用"的讨论中,我们将深入探讨Freemarker的核心概念、语法以及如何在实际项目中进行图片插入。 1. **核心概念**: - **模板(Template)**:Freemarker模板是包含固定文本和变量的文本文件...
步骤二:创建FreeMarker模板 创建一个HTML模板文件,例如`template.ftl`,并定义好所需的结构和样式。模板中可以使用FreeMarker语法 `${}` 来引用数据模型中的变量。 步骤三:准备数据模型 定义一个Java对象或Map来...
FreeMarker是一个强大的、开源的模板引擎,主要用于生成动态HTML、...通过阅读手册,开发者可以深入理解FreeMarker的工作原理,并熟练掌握其使用方法,从而在实际项目中有效地利用FreeMarker模板语言API生成动态内容。
Freemarker模板语言(FTL)是一种简单的标记语言,不包含任何编程结构,如循环或条件语句。这些功能通过内置的指令和表达式来实现。例如,`<#if>`、`<#foreach>`等用于控制流,`${}`用于显示变量的值。 2. **数据...
本篇文章将详细介绍两种设置Freemarker模板路径的方法,帮助开发者更好地理解和应用。 一、FreeMarkerConfigurer配置 FreeMarkerConfigurer是Spring为Freemarker提供的一个配置类,通过它可以设置Freemarker的相关...
**Freemarker模板引擎** Freemarker是一个强大的、开源的模板语言,常用于Java应用中的视图层。它的主要任务是将数据模型与HTML或者其他格式的模板结合,生成最终的输出。Freemarker的设计原则是让模板作者专注于...
这篇名为“初试FreeMarker模板的一些问题”的博客可能涵盖了在学习和使用FreeMarker过程中遇到的基础问题和解决方法。 1. **模板语言基础** FreeMarker使用模板语言来定义如何将数据模型渲染成可读的输出。模板由...
在本教程中,我们将探讨如何利用Freemarker模板来导出Word文档,并实现循环插入图片和表格的功能。这对于需要批量生成定制化报告或者文档的应用场景非常有用。 首先,我们需要了解Freemarker的基本语法。在...
在FreeMarker模板中,特定的变量和指令被大括号${}包围。例如,若模板中有${obj.newsTitle}这样的代码,则在模板被处理时,它会被替换为实际对象obj的newsTitle属性值。因此,模板与具体的数据源关联在一起,模板...