freemarker简介_动力节点Java学院整理
freemarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯java编写
freemarker被设计用来生成html web页面,特别是基于mvc模式的应用程序
虽然freemarker具有一些编程的能力,但通常由java程序准备要显示的数据,由freemarker生成页面,通过模板显示准备的数据。
freemarker不是一个web应用框架,而适合作为web应用框架一个组件
freemarker与容器无关,因为它并不知道http或servlet;freemarker同样可以应用于非web应用程序环境
freemarker更适合作为model2框架(如struts)的视图组件,你也可以在模板中使用jsp标记库
freemarker是免费的
1、通用目标
能够生成各种文本:html、xml、rtf、java源代码等等
易于嵌入到你的产品中:轻量级;不需要servlet环境
插件式模板载入器:可以从任何源载入模板,如本地文件、数据库等等
你可以按你所需生成文本:保存到本地文件;作为email发送;从web应用程序发送它返回给web浏览器
2、强大的模板语言
所有常用的指令:include、if/elseif/else、循环结构
在模板中创建和改变变量
几乎在任何地方都可以使用复杂表达式来指定值
命名的宏,可以具有位置参数和嵌套内容
名字空间有助于建立和维护可重用的宏库,或者将一个大工程分成模块,而不必担心名字冲突
输出转换块:在嵌套模板片段生成输出时,转换html转义、压缩、语法高亮等等;你可以定义自己的转换
3、通用数据模型
freemarker不是直接反射到java对象,java对象通过插件式对象封装,以变量方式在模板中显示
你可以使用抽象(接口)方式表示对象(javabean、xml文档、sql查询结果集等等),告诉模板开发者使用方法,使其不受技术细节的打扰
4、为web准备
- 在模板语言中内建处理典型web相关任务(如html转义)的结构
- 能够集成到model2 web应用框架中作为jsp的替代
- 支持jsp标记库
- 为mvc模式设计:分离可视化设计和应用程序逻辑;分离页面设计员和程序员
5、智能的国际化和本地化
- 字符集智能化(内部使用unicode)
- 数字格式本地化敏感
- 日期和时间格式本地化敏感
- 非us字符集可以用作标识(如变量名)
- 多种不同语言的相同模板
6、强大的xml处理能力
<#recurse> 和<#visit>指令(2.3版本)用于递归遍历xml树
在模板中清楚和直觉的访问xml对象模型
helloworld
新建一个web工程,下载(我使用的是freemarker-2.3.20)freemarker并导入freemarker.jar,在web-inf下新建文件夹templates用于存放模版文件
在templates下新建test.ftl,这是示例模版文件。内容就是html内容,里面带有一个标记符,用于将来进行变量替换,内容如下:
<html> <head> <title>freemarker测试</title> </head> <body> <h1>${message},${name}</h1> </body> </html>
新建一个servlet,用于请求设置变量,并处理模版的输出:
package com.test.servlet; import java.io.ioexception; import java.io.writer; import java.util.hashmap; import java.util.map; import javax.servlet.servletexception; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; import freemarker.template.configuration; import freemarker.template.template; import freemarker.template.templateexception; @suppresswarnings("serial") public class hellofreemarkerservlet extends httpservlet { // 负责管理freemarker模板的configuration实例 private configuration cfg = null; public void init() throws servletexception { // 创建一个freemarker实例 cfg = new configuration(); // 指定freemarker模板文件的位置 cfgsetservletcontextfortemplateloading(getservletcontext(), "/web-inf/templates"); } @suppresswarnings("unchecked") public void dopost(httpservletrequest request, httpservletresponse response) throws servletexception, ioexception { // 建立数据模型 map root = new hashmap(); root.put("message", "hello world"); root.put("name", "java小强"); // 获取模板文件 template t = cfg.gettemplate("test.ftl"); // 使用模板文件的charset作为本页面的charset // 使用text/html mime-type responsesetcontenttype("text/html; charset=" + tgetencoding()); writer out = response.getwriter(); // 合并数据模型和模板,并将结果输出到out中 try { tprocess(root, out); // 往模板里写数据 } catch (templateexception e) { e.printstacktrace(); } } public void doget(httpservletrequest request, httpservletresponse response) throws servletexception, ioexception { dopost(request, response); } public void destroy() { super.destroy(); } }
注意要在你的web.xml中配置该servlet:
<?xml version="1.0" encoding="utf-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xsi:schemalocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <servlet> <servlet-name>hello</servlet-name> <servlet-class> com.test.servlet.hellofreemarkerservlet </servlet-class> </servlet> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
为了方便测试,访问工程直接跳转到servlet,对主页index.jsp做一个简单修改:
<%@ page language="java" import="java.util.*" pageencoding="utf-8"%> <% string path = request.getcontextpath(); string basepath = request.getscheme()+"://"+request.getservername() +":"+request.getserverport()+path+"/"; %> <html> <body> <% string mypath = "hello"; response.sendredirect(basepath + mypath); %> </body> </html>
上一篇: mybatis分页及模糊查询功能实现
推荐阅读
-
使用jaxp进行dom解析_动力节点Java学院整理
-
Java NIO:浅析IO模型_动力节点Java学院整理
-
Java synchronized关键_动力节点Java学院整理
-
Sax解析xml_动力节点Java学院整理
-
Java interrupt()方法使用注意_动力节点Java学院整理
-
interrupt()和线程终止方式_动力节点Java学院整理
-
约定优于配置_动力节点Java学院整理
-
Java 可视化垃圾回收_动力节点Java学院整理
-
web.xml中servlet, bean, filter, listenr 加载顺序_动力节点Java学院整理
-
Log4j详细使用教程_动力节点Java学院整理