`
peng_jian_ming
  • 浏览: 260154 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

FreeMarker技术

阅读更多
FreeMarker是一个模版引擎,一个基于模版生成文本输出的通用工具,使用纯Java编写。FreeMarker被设计用来生成HTML Web页面,特别是基于MVC模式的应用程序。FreeMarker有一些编成能力,但通常情况下用java程序准备要显示的数据,由FreeMarker生成页面,通过模版显示准备的数据。FreeMarker不是一个Web应用框架,而更适合作为一个Web应用框架的一个组件。FreeMarker与容器无关,它并不知道HTTP或者Servlet,FreeMarker同样可以用于非Web应用环境。FreeMarker更适合Model2的视图组件,同样可以在模版中使用JSP标记库。

FreeMarker的通用目标:能够生成各种文本,HTML、XML、RTF、Java源代码等等;易于嵌入,轻量级、不需要Servlet环境;插件式的模版载入器,可以在任何源载入,如本地文件、数据库等等;按需生成文本,保存到本地文件、作为Email发送、从Web应用程序发送它返回到Web浏览器。

强大的模版语言:所有常用的指令,include、if/elseif/else、循环结构。在模板中创建和改变变量。可以使用复杂的表达式来使用值。命名的宏,可以具有位置参数和嵌套内容。名字空间有助于建立和维护可重用的宏库,或者将一个大的工程分为若干个模块,而不必担心命名的冲突。输出转换块,在嵌套模版片断生成输出时,转换HTML转义、压缩、语法高亮等等。。

通用的数据模型:FreeMarker不是直接反映到java对象,java对象通过插件式封装,以变量的方式在模版中展示。使用抽象的方式表示对象,使其不受技术细节的打扰。

 在模板语言中内建处理典型Web 相关任务(如HTML 转义)的结构
 能够集成到Model2Web 应用框架中作为JSP 的替代
 支持JSP 标记库
 为MVC 模式设计:分离可视化设计和应用程序逻辑;分离页面设计员和程序员

5、智能的国际化和本地化
 字符集智能化(内部使用UNICODE)
 数字格式本地化敏感
 日期和时间格式本地化敏感
 非US 字符集可以用作标识(如变量名)
 多种不同语言的相同模板

6、强大的XML 处理能力
 <#recurse> 和<#visit>指令(2.3 版本)用于递归遍历XML 树
 在模板中清楚和直觉的访问XML 对象模型

FreeMarker是一个Java模版语言,它是 JSP 的绝佳替代方案. FreeMarker在你的action result可能需要在Servlet容器环境以外被载入的情况下是理想选择. 例如,如果你希望在你的应用程序中支持plugins,你可能会乐意使用Freemarker,因为那样的话plugins可以支持将所有的action class和view都打包到一个从classloader进行装载的jar文件里面.
关于FreeMarker的更多信息,请访问FreeMarker网站.

FreeMarker与Velocity非常相似, 它们都是可以在Servlet容器外使用的模版语言. WebWork小组更推荐FreeMarker, 而不是Velocity, 这是因为FreeMarker提供了更好的错误报告, 支持JSP标签, 稍多的功能. 当然, 这两种技术都是代替JSP的很好方案.



快速上手

确认配置好你的项目的classpath中的所有依赖以后, 开始使用FreeMarker就非常简单了. 典型情况下只需要 freemarker.jar. 除它以外, webwork-default.xml已经配置好了将FreeMarker Result映射到你的模版文件. 你现在可以试验一下如下 xwork.xml 配置:

<action name="test" class="com.acme.TestAction">
    <result name="success" type="freemarker">test-success.ftl</result>
</action

然后写好 test-success.ftl:

<html>
<head>
    <title>Hello</title>
</head>
<body>

Hello, ${name}

</body>
</html>

这里 name 是你的action中的一个属性. 这样就可以了! 该文档的余下部分将介绍模版如何被加载, 变量如何解析, tags(标签)也可以使用.

模版加载
Webwork在两个位置查找FreeMarker模版(按顺序):

Web应用程序目录(Web application)
Class path
这个顺序对于在完全编译的jar中提供模版很理想, 但是也同时支持在Web应用程序目录中定义这些模版来覆盖jar中的模版文件. 事实上, 这就是为什么你可以覆盖WebWork中默认的UI tags和Form Tags的原理.
还有, 你可以通过templatePath 上下文变量(context variable)指定一个路径(你的文件系统中的一个目录). 如果指定了该变量, 那么这个目录中的内容将会被优先寻找.
变量解析/决定(Resolution)
在FreeMarker中, 变量将会在多个位置进行寻找, 顺序如下:

值栈(value stack)
action上下文(action context)
Request范围(scope)
Session范围(scope)
Application范围(scope)
内建变量
注意action上下文在value stack后进行搜索. 这意味着你可以引用变量而不必使用标准的符号(#)前缀,不像在JSP中使用ww:property中必须使用的那种语法(译者注:现在在JSP中也可以不用#而访问默认的ValueStack). 这是一个很好的便利特性, 但是小心, 它有时也会把你陷进去. <@ww.url id="url" value="http://www.yahoo.com"/>
Click <a xhref="${url}">here</a>!

Webwork-FreeMarker整合提供的内建变量如下:

Name Description
stack 值栈本身, 方便使用 ${stack.findString('ognl expr')}的方式调用
action 最近执行的action
response HttpServletResponse
res 与response相同
request HttpServletRequest
req 与reqeust相同
session HttpSession
application ServletContext
base request的上下文路径(context path)


标签支持
FreeMarker是很棒的模版语言, 因为它完整的支持标签(tag). 参照WebWork提供的 FreeMarker Tags 文档中的如何使用通用(generic) Tags 部分获取更多信息. 除了那些, 你还可以使用任何的JSP标签(tag), 就像这样:

<#assign mytag=JspTaglibs["/WEB-INF/mytag.tld"]>
<@mytag.tagx attribute1="some ${value}"/>

这里 mytag.tld 是你使用的JSP标签库的定义文件. 注意: 为了使用FreeMarker的这个支持, 你必须开启 web.xml 2.1.x compatibility 文档中的 JSPSupportServlet.

提示和技巧
下面是在使用FreeMarker构建WebWork应用程序时的一些有用的进阶功能.

类型转换与本地化
FreeMarker内置支持日期与数字的格式化. 格式化的规则基于action request的地区信息(locale), locale是通过webwork.properties配置的, 它也可以通过I18n Interceptor进行覆盖. 这种方式一般会完美的满足你的需求, 但是你要记住, 这些格式化信息是通过FreeMarker处理的,而不是通过WebWork的类型转换支持实现.
如果你希望WebWork根据你所指定的类型转换处理格式化, 你不应该使用平常的&{...}语法. 取而代之, 你应该使用property标签. 区别在于property标签特别为OGNL表达式设计, 计算它的值, 然后将结果用你指定的Type Conversion转换为String. 平常使用的${...}语法则会使用FreeMarker的表达式语言(EL), 计算它的值, 然后通过内建的格式化规则转化为String. 这些区别甚微, 但是一定要了解.

扩展
有时你可能需要扩展WebWork提供的FreeMarker支持. 最常见的原因是你希望引入你自己的标签, 就像你扩展WebWork内建标签一样.
如果需扩展, 首先要新建一个继承 com.opensymphony.webwork.views.freemarker.FreemarkerManager 并且重载了相应方法的类. 然后将下面代码添加到webwork.properties:

webwork.freemarker.manager.classname = com.yourcompany.YourFreeMarkerManager

ObjectWrapper设置
如果你熟悉了FreeMarker, 你会发现它的敏感性会带来一些困扰. 最常见的方法就是尝试使用FreeMarker提供的BeanWrapper. 如果你不知道那是什么,别担心. 只要知道这些酒可以了:

WebWorkBeanWrapper继承自默认的FreeMarker BeansWrapper, 提供了基本完全一致的功能, 只是修改了maps处理机制. 一般, FreeMarker有两种操作模式: 一种支持友好的内置的map (?key, ?values, etc),但是只支持String作为key; 或者特殊的内置支持(例如: ?key 返回map的相应方法而不是key), 但是它支持String和String相似的非String作为key. WebWork提供了两种情况下的可选的实现方案.
这种特殊的做法也许会让你迷惑或产生问题. 所以, 你可以将 webwork.properties 中的*webwork.freemarker.wrapper.altMap*设置为false, 允许替换为常规的BeansWrapper逻辑.

语法注释
如果是FreeMarker 2.3.4, 还支持另外的语法. 这种可选的语法在你感觉你使用的IDE(尤其是ItelliJ IDEA)在默认的语法下运行困难时非常有用. 关于这种语法的更多内容, 请阅读这里


1 comment |  Add Comment
分享到:
评论

相关推荐

    FreeMarker技术资料大集合包括宏以及一些列中文开发手册和技术文档

    FreeMarker技术资料大集合包括宏以及一些列中文开发手册和技术文档其中包括:FreeMarker2.3.7_Manual_zh_CN,Freemarker-2.3.16 API,FreeMarker详细讲解,FreeMarker宏和freemarker中文手册。对新手学习freemarker...

    基于SSM框架及Freemarker技术的书评网项目设计源码

    本项目是一款基于SSM框架和Freemarker技术的书评网设计源码,涵盖259个文件,包括75个GIF图像、49个Java源文件、31个XML配置文件、27个JavaScript文件、20个JAR库文件、11个Freemarker模板文件、9个PNG图片文件、8个...

    基于Freemarker技术的一款强大的springboot/springcloud的代码生成器

    【标题】中的“基于Freemarker技术的一款强大的springboot/springcloud的代码生成器”指出,这个工具利用了Freemarker模板引擎,并且是为Spring Boot和Spring Cloud项目设计的。Freemarker是一个动态模板语言,它...

    freemarker 2.3.10架包

    这个“freemarker 2.3.10”压缩包包含了该版本的Freemarker库及相关资源,旨在帮助开发者更便捷地学习和使用Freemarker技术。 Freemarker的核心概念是基于模板的编程模型,它将数据模型与HTML(或其他格式)模板...

    excel 导出 freemarker

    本教程将详细介绍如何使用FreeMarker技术来实现Excel的导出。 一、FreeMarker基础 FreeMarker是一个基于模板的Java库,它允许我们将数据模型与HTML或其他类型的模板结合,生成动态内容。FreeMarker模板语言(FTL)...

    freemarker导出word

    本话题主要探讨如何借助Freemarker技术来实现Word文档的导出,并结合生成二维码图片以及批量生成Word文档的方法。 首先,让我们深入理解Freemarker的工作原理。Freemarker是一个基于模板的语言,它与Java代码分离,...

    freemarker入门文档

    Freemarker是一个强大的、开源的模板引擎,常用于Java应用中的视图层开发,尤其在Web应用程序中。它允许开发者使用简单的标记语言(通常称为Freemarker模板)来分离业务逻辑和显示逻辑,使得前端展示更加灵活且易于...

    freemarker 生成word,支持一个单元格生成多张图片

    本话题聚焦于如何利用FreeMarker技术在一个Word文档的单元格内生成多张图片。 在Java中,生成Word文档通常借助于Apache POI库,而FreeMarker则作为模板引擎,负责数据和模板的结合。Apache POI提供API来操作Word...

    基于jfinal+shiro+layui+freemarker等框架和技术结合maven多模块方式构建开发的一款通用内容发布系统

    《构建通用内容发布系统:深度解析jfinal+shiro+layui+freemarker技术栈》 在当前数字化时代,内容发布系统的建设对于企业、组织和个人来说至关重要,它们为信息传播提供了便捷的平台。本文将深入探讨一款基于...

    FreeMarker技术指南

    模板引擎是一种在Web开发中使用的编程技术,它允许将页面的设计与数据处理分离,使得美工和程序员可以更好地专注于各自的工作内容。在B/S架构的程序设计中,常常涉及到美工和程序员两个角色,他们分别负责页面的视觉...

    简单的(ssh2+freemarker)新闻、产品管理系统

    结合上述标签,我们可以推测这是一个基于SSH2和Freemarker技术实现的新闻和产品管理系统的项目。在这个系统中,开发者可能利用SSH2进行后端服务的安全通信和远程操作,而Freemarker则负责渲染和展示新闻和产品信息。...

    使用FreeMarker生成Html静态文件

    FreeMarker是一个强大的、开源的模板引擎,主要用于生成HTML或者其他类型的文本,尤其在Web...解压并研究这些文件可以帮助你更好地理解和应用FreeMarker技术。记得根据实际情况调整代码和模板,以满足你的具体需求。

    基于SpringBoot和Freemarker的Web应用设计源码

    本源码项目是基于SpringBoot和Freemarker的Web应用设计,...通过该项目,开发者可以学习并实践SpringBoot和Freemarker技术的集成,为后续的Web开发奠定基础。系统界面友好,易于操作,适合用于各类Web应用开发场景。

    基于freemarker等技术实现的代码生成器,支持绝大多数据库[源码].zip

    本文将深入探讨一个基于Freemarker技术的代码生成器,该生成器具有广泛的数据支持,覆盖了大多数数据库。 Freemarker是一个开源的模板引擎,它主要用于生成动态内容,如HTML、XML或其他文本格式。在代码生成器中,...

    非常详尽的freemarker参考手册

    这份"非常详尽的Freemarker参考手册"显然是一份详细的资源,可以帮助开发者深入理解并有效使用Freemarker技术。 Freemarker的核心概念是模板(Template)和数据模型(Data Model)。模板是纯文本文件,其中包含了...

    轻量级Java持久层框架MiniDAO:基于SpringJDBC与FreeMarker的源码实现

    MiniDAO是一个基于SpringJDBC和FreeMarker技术的轻量级Java持久层框架。它以简洁的设计理念实现了SQL的分离和逻辑标签功能,与Mybatis的操作体验相媲美,同时能够无缝集成至Spring Boot项目。 技术构成: - 主要...

    测试模板Freemarker-out.docx

    综合以上信息,我们可以理解这个文档可能是一个在互联网公司内部使用的审批模板,通过FreeMarker技术来动态生成包含审批流程记录的Word文档,并在所有必要的审批完成后,于特定日期(这里是2017年10月1日)发布。...

    FreeMarker导出word

    在本场景中,"FreeMarker导出word" 指的是利用FreeMarker技术来生成Microsoft Word文档。这个过程涉及到将数据模型与预先设计好的FreeMarker模板结合,最终输出为.doc或.docx格式的Word文档。 FreeMarker的工作原理...

Global site tag (gtag.js) - Google Analytics