- 浏览: 33740 次
- 性别:
- 来自: 湖南
文章分类
最新评论
FreeMarker是一个用Java编写的模板引擎,既可以在基于MVC的应用程序中作为视图组件,也可以在非Web应用程序中使用,比如用于邮件模板的动态生成、字符串的动态生成等等。FreeMarker模板文件的扩展名为ftl,支持多种模板装载方式:1、从ClassPath路径装载,2、从Web应用程序目录装载,3、字符串变量等。下面将基于freemarker-2.3.10版本详细介绍如何将FreeMarker框架整合到Web系统中。
一、接口类
1、模板渲染接口类 —— 装载模板,用提供的数据渲染模板,返回输出字符串。
public interface TemplateRender { /** * 装载模板,用提供的数据渲染模板,返回输出字符串 * * @param dataModel 数据模型 * @param template 模板 */ public String render(Object dataModel, String template)throws Exception; }
2、字符串模板装载器 —— 来自于一个字符串变量
public class StringTemplateLoader implements TemplateLoader { public void closeTemplateSource(Object templateSource) throws IOException { return; } public Object findTemplateSource(String name) throws IOException { return name; } public long getLastModified(Object templateSource) { return System.currentTimeMillis(); } public Reader getReader(Object templateSource, String encoding) throws IOException { String ftlString = (String)templateSource; return new StringReader(ftlString); } }
二、模板渲染接口类的实现类
1、从ClassPath装载模板的渲染实现类
public class ClassPathTemplateRender implements TemplateRender { private static Configuration config = null; public static ClassPathTemplateRender getInstance(){ return new ClassPathTemplateRender(); } public ClassPathTemplateRender(){ if(config == null){ config = new Configuration(); config.setClassForTemplateLoading(this.getClass(), "/com/jeyo/common/freemarker/template"); //第二个参数指定模板所在的根目录,必须以“/”开头。 try{ config.setSetting("datetime_format", "yyyy-MM-dd HH:mm:ss"); config.setLocale(Locale.CHINA); }catch(Exception ex){ ex.printStackTrace(); } } } public String render(Object dataModel, String ftlFile) throws Exception { StringWriter stringWriter = new StringWriter(); BufferedWriter writer = new BufferedWriter(stringWriter); Template template = config.getTemplate(ftlFile, Locale.CHINA, "UTF-8"); template.process(dataModel,writer); writer.flush(); return stringWriter.toString(); } }
2、从Web应用程序目录装载模板的渲染实现类
public class ContextPathTemplateRender implements TemplateRender { private static Configuration config = null; public static ContextPathTemplateRender getInstance(ServletContext sc){ return new ContextPathTemplateRender(sc); } public ContextPathTemplateRender(ServletContext sc){ if(config == null){ config = new Configuration(); config.setServletContextForTemplateLoading(sc, "/freemarker/template"); //第二个参数指定模板所在的根目录,必须以“/”开头。 try{ config.setSetting("datetime_format", "yyyy-MM-dd HH:mm:ss"); config.setLocale(Locale.CHINA); }catch(Exception ex){ ex.printStackTrace(); } } } public String render(Object dataModel, String ftlFile)throws Exception { StringWriter stringWriter = new StringWriter(); BufferedWriter writer = new BufferedWriter(stringWriter); Template template = config.getTemplate(ftlFile, Locale.CHINA, "UTF-8"); template.process(dataModel, writer); writer.flush(); return stringWriter.toString(); } }
3、从字符串变量装载模板的渲染实现类
public class StringTemplateRender implements TemplateRender { private static Configuration config = null; public static StringTemplateRender getInstance(){ return new StringTemplateRender(); } public StringTemplateRender(){ if(config == null){ config = new Configuration(); config.setTemplateLoader(new StringTemplateLoader()); try{ config.setSetting("datetime_format", "yyyy-MM-dd HH:mm:ss"); config.setLocale(Locale.CHINA); }catch(Exception ex){ ex.printStackTrace(); } } } public String render(Object dataModel, String text) throws Exception { String ret = null; if((dataModel instanceof Map) == false){ throw new IllegalArgumentException("参数dataModel必须为一个Map对象"); } BufferedReader reader = new BufferedReader(new StringReader(text)); Template template = null; try{ template = new Template(null, reader, config, "UTF-8"); }catch(Exception ex){ ex.printStackTrace(); } SimpleHash root = new SimpleHash(); root.putAll((Map)dataModel); try{ StringWriter stringWriter = new StringWriter(); BufferedWriter writer = new BufferedWriter(stringWriter); template.process(root, writer); writer.flush(); ret = stringWriter.toString(); }catch(Exception ex){ ex.printStackTrace(); ret = null; } return ret; } }
三、工具类
public class FtlUtil { public static String renderString(Map dataModel, String text)throws Exception{ String ret = StringTemplateRender.getInstance().render(dataModel, text); return ret; } public static String renderFile(Object dataModel, String ftlFile)throws Exception{ String ret = ClassPathTemplateRender.getInstance().render(dataModel, ftlFile); return ret; } public static String renderFile(ServletContext sc, Object dataModel, String ftlFile)throws Exception{ String ret = ContextPathTemplateRender.getInstance(sc).render(dataModel, ftlFile); return ret; } }
四、代码实例
1、FTL文件 —— test.ftl
${username},您好: ${content} 系统管理员 ${date}
2、从ClassPath路径装载模板
Map dataModel = new HashMap(); dataModel.put("username", "张三"); dataModel.put("content", "您提交的申请我们正在处理中,感谢您的支持!"); dataModel.put("date", commonUtil.formatDate(new java.util.Date(), "yyyy-MM-dd")); String resultStr = FtlUtil.renderFile(dataModel, "test.ftl"); 输出结果: 张三,您好: 您提交的申请我们正在处理中,感谢您的支持! 系统管理员 2008-09-04
3、从字符串变量装载模板
String stringTemplate = "您好!注册已成功,您的用户名为:${username},密码为:${password}。感谢您的支持!"; Map dataModel = new HashMap(); dataModel.put("username", "张三"); dataModel.put("password", "123456"); String resultStr = FtlUtil.renderFile(dataModel, stringTemplate); 输出结果: 您好!注册已成功,您的用户名为:张三,密码为:123456。感谢您的支持!
4、从Web应用程序目录装载模板
参考第2点。
发表评论
-
HttpClient容易忽视的细节——连接关闭
2012-03-02 09:15 612HttpClient client = new HttpCli ... -
HTTPClient的多线程编程
2012-03-02 09:09 1475Axis2的连接主要采用了HttpClient进行与服务器的服 ... -
HttpClient超时区别
2012-03-02 09:07 1070HttpClient 4 设置超时 httpclient 超时 ... -
HttpClient Theading
2012-03-01 10:49 666有技术兴趣的 请加28830308群. 这篇文章概括了怎样在 ... -
HttpClient使用
2012-03-01 10:43 713有技术兴趣的 请加28830308群. HttpClien ... -
线程请求执行,一个多线程程执行HTTP请求的例子。
2012-03-01 10:40 1752package cn.lake.util; import ... -
httpclient 4 下载 文件
2012-03-01 10:38 938import java.io.File; import ja ... -
使用了httpclient实现的上传商品的demo
2012-03-01 10:36 1150package com.taobao.top.sample.u ... -
socket简介
2012-02-07 10:58 679第一步 充分理解Socket ... -
转载socket
2012-02-07 10:57 560对TCP/IP、UDP、Socket编程这些词你不会很陌生吧? ... -
Java的synchronized关键字:同步机制总结
2012-02-07 10:54 570不久前用到了同步,现在回过头来对JAVA中的同步做个总结,以对 ... -
JAVA RMI
2012-02-07 10:53 573Java RMI 指的是远程方法调用 (Remote Meth ... -
JXL生成复杂的EXCEL
2011-12-26 13:52 1376public String ExcelTaskRepo ... -
如何快速的为现有数据库建立数据字典?
2011-12-20 13:55 991大部分项目在验收时都需要向客户提供一份详细的数据字典,而编写数 ... -
在java中获取客户端真实的IP地址
2011-12-20 13:55 552public static String getRemoteA ... -
用JavaMail的API发送邮件
2011-12-20 13:55 5281、MimeMessage的包装类 public c ... -
Commons FTP范例
2011-12-16 15:33 501public class FtpUtil { privat ... -
Java实现的图片生成器
2011-12-16 15:32 518一、本图片生成器具有以下功能特性: 1、可以设置图 ... -
jacob学习总结
2011-12-16 15:27 439JACOB 就是 JAVA-COM Bridge的缩写,提供自 ... -
长短信发送范例
2011-12-16 15:25 687一、关键代码: private synchronized v ...
相关推荐
1. **添加依赖**:在项目的`pom.xml`文件中,需要添加FreeMarker的依赖。这通常会包含FreeMarker的版本号,例如: ```xml <groupId>org.freemarker <artifactId>freemarker <version>2.3.30 ``` 2. **配置...
在本项目"springboot整合freemarker生成静态html的demo.zip"中,我们将探讨如何将SpringBoot框架与FreeMarker模板引擎结合,以实现动态数据驱动的静态HTML页面生成。FreeMarker是一个强大的、开源的模板语言,它允许...
在Struts2中整合Freemarker,主要涉及以下几个关键知识点: 1. **Freemarker模板语言**:Freemarker使用模板语言,由`<#...>`和`${...}`这样的标记组成,用来控制逻辑和显示数据。例如,`<#if ...>`用于条件判断,`...
首先,我们需要在项目的`pom.xml`文件中添加对`spring-boot-starter-freemarker`的依赖: ```xml <groupId>org.springframework.boot <artifactId>spring-boot-starter-freemarker ``` 添加依赖后,Spring ...
SpringMVC是一个强大的Java web应用程序开发...综上所述,这个项目展示了如何在SpringMVC中整合Freemarker,为开发者提供了一个后端服务和动态页面展示的平台。理解并实践这些知识点,将有助于提升Java Web开发能力。
标题“Spring3.1整合FreeMarker2.3.19”指的是在Spring 3.1版本的框架中集成FreeMarker 2.3.19模板引擎的过程和相关知识点。FreeMarker是一个开源的Java库,用于生成动态HTML、XML或其他类型的文本,常用于Web应用...
在项目中提到的"原本带的还有maven 但是被我简化掉了",这表明项目最初是使用Maven作为构建工具的。Maven是一个强大的项目管理和综合工具,它能够自动处理项目的构建、依赖管理和文档生成。不过,由于某种原因,这个...
在“maven+springmvc+mybatis+freemarker”框架整合中,Maven负责管理项目依赖,确保所有组件正确无误地协同工作。 **SpringMVC** SpringMVC是Spring框架的一部分,用于构建Web应用的Model-View-Controller(MVC)...
在IT行业中,Spring框架是Java应用开发的基石,它提供了丰富的功能,包括依赖注入、AOP(面向切面编程)以及各种集成服务。Freemarker则是一个强大的模板引擎,常用于生成HTML或者其他文本格式的文档。JavaMail API...
- 添加依赖:在项目的`pom.xml`或`build.gradle`文件中,添加Freemarker的依赖库。 - 配置Spring:在Spring的配置文件(如`applicationContext.xml`)中,定义`FreemarkerConfigurer` Bean,设置Freemarker的配置...
SSM(Spring、SpringMVC、MyBatis)框架整合是Java Web开发中常见的技术栈,而Freemarker作为一款强大的模板引擎,常用于视图层的渲染。本项目是将Freemarker与SSM结合,并通过Maven进行依赖管理的实例。下面将详细...
在本Demo中,我们将深入探讨如何将FreeMarker模板引擎整合进SSM框架,以及PageHelper分页插件的使用。 首先,让我们来了解一下SSM框架的核心组件: 1. **Spring**:这是一个全面的Java应用框架,提供依赖注入(DI...
《SpringDataJpa整合FreeMarker源码解析》 在当今的软件开发中,Spring Boot、Spring Data JPA和FreeMarker的整合已经成为了构建高效、简洁Web应用的常见选择。本篇将深入探讨如何将这三个强大的工具结合在一起,...
**五、整合FreeMarker与Shiro** 1. 在FreeMarker模板中使用Shiro标签库:在.ftl文件顶部引入Shiro标签库: ```html ${'@org.apache.shiro.web.tags.ShiroTagLibHandler@getTagLibUri()'}"> ${shiro}" as shiro/> ```...
- 模板文件通常存放在项目中的 `WEB-INF/views` 目录下,Spring MVC 会根据视图解析器的配置来寻找这些模板文件。 - 模板文件中可以包含 HTML 结构,以及 FreeMarker 语法,用来动态插入数据。 4. **模型数据绑定...
SSM整合指的是Spring、Spring MVC和MyBatis三个开源框架的集成,这在Java Web开发中是非常常见的一种架构模式。而在这个项目中,开发者进一步引入了FreeMarker模板引擎,使得应用在视图层有了更灵活的表现形式。接...
通过以上知识点的介绍,我们对Struts1.x整合Freemarker有了全面的理解。在实际开发中,这样的整合可以显著提高项目的开发效率和代码质量,降低维护成本。同时,随着技术的发展,虽然Struts1.x已逐渐被Struts2、...
1. **添加依赖**:在项目中添加FreeMarker和Struts2 FreeMarker插件的依赖。 2. **配置Struts2**:在`struts.xml`配置文件中指定FreeMarker作为视图解析器。 3. **模板目录**:设置项目中的FreeMarker模板文件存放...
Springboot是一个基于Java的开源框架,Freemarker是一个流行的模板引擎,而在Springboot中整合Freemarker时,可能会遇到404问题,本文将详细介绍解决方案。 Springboot和Freemarker的整合 在Springboot中整合...