freemarker

freemarker源码解读之一--概述

谁说我不能喝 提交于 2019-12-07 08:00:53
最近在思考为如何xsoup添加自定义函数支持,基于这个目的,想起了最常用的模板引擎freemarker。于是down了源码下来,开始浏览一番。本文基于 https://github.com/freemarker/freemarker 上的2.3.20版本。 思考 看源码前,先思考一下,一个模板引擎,到底需要哪些东西?一门模板引擎其实是一个完整的语言,只不过它只具有单纯的输入/输出,不需要考虑其他的功能。 语法解析,转换为AST(抽象语法树) 语义分析,为AST附加上执行语义 上下文环境的注入 内置函数及外部函数支持 其他外围机制(与框架/工具的集成等) 源码结构 打开freemarker的代码,core包里110个类一字排开,还有以下划线开头的“建议不要看”的类,看的人眼花缭乱啊!这一切都是因为Java规范的大师们,设计了一个“包级可见“的概念,大概就是,我写给自己用的代码,不要让你用!这一来,别人用是用不了了,好像看起来也变得很困难了… 还好现在的IDE都很强大,刷刷两下就给重构了,把一些类按照类型挪到多个包里,顿时清爽很多!可惜好多类/方法/字段都是包级可见,为了让这个重构版freemarker没那么多红叉,lz加了好几百个public,写到意识都模糊了…最后把自己的劳动成果共享出来吧: https://github.com/code4craft/freemarker

FreeMarker使用记录

强颜欢笑 提交于 2019-12-07 07:58:48
gt是大于 lt是小于 FreeMarker的模板文件并不比HTML页面复杂多少,FreeMarker模板文件主要由如下4个部分组成: 1,文本:直接输出的部分 2,注释:<#-- ... -->格式部分,不会输出 3,插值:即${...}或#{...}格式的部分,将使用数据模型中的部分替代输出 4,FTL指令:FreeMarker指定,和HTML标记类似,名字前加#予以区分,不会输出 下面是一个FreeMarker模板的例子,包含了以上所说的4个部分 <html><br> <head><br> <title>Welcome!</title><br> </head><br> <body><br> <#-- 注释部分 --><br> <#-- 下面使用插值 --> <h1>Welcome ${user} !</h1><br> <p>We have these animals:<br> <u1><br> <#-- 使用FTL指令 --> <#list animals as being><br> <li>${being.name} for ${being.price} Euros<br> <#list><br> <u1><br> </body><br> </html> 1, FTL指令规则 在FreeMarker中,使用FTL标签来使用指令,FreeMarker有3种FTL标签

Freemarker removeIntrospectionInfo does not work with DCEVM after model hotswap

拥有回忆 提交于 2019-12-07 06:13:40
问题 I am using Freemarker and DCEVM+HotSwapManager agent. This basically allows me to hotswap classes even when adding/removing methods. Everything works like charm until Freemarker uses hotswapped class as model. It's throwing freemarker.ext.beans.InvalidPropertyException: No such bean property on me even though reflection shows that the method is there (checked during debug session). I am using final Method clearInfoMethod = beanWrapper.getClass().getDeclaredMethod("removeIntrospectionInfo",

Spring Freemarker Configuration, Template Not Found

巧了我就是萌 提交于 2019-12-07 04:51:31
问题 I have a Spring/JSF Web application which has a dependency to a module uses Freemarker templates. Here is what i did for integration: I imported the applicationContext-freemarker-module.xml to applicationContext.xml I added the configuration bean to applicationContext-freemarker-module.xml like below. <bean id="freemarkerConfiguration" class="org.springframework.ui.freemarker.FreeMarkerConfigurationFactoryBean"> <property name="templateLoaderPath" value="classpath*:/"/> </bean> I put my

How to evaluate parameter inside Freemarker macro?

。_饼干妹妹 提交于 2019-12-07 03:30:51
问题 Suppose we have a simple Freemarker macro: <#macro myMacro expr> <#local x=1> ${expr} </#local> <#local x=2> ${expr} </#local> </macro> <@myMacro "A"/> gives: A A I need something like <@myMacro "A${x}"/> should give: A1 A2 but it doesn't work as ${x} interpolated before passing into macro. This doesn't work even if I use raw string r"A${x}" as a parameter. I tried to play with ?eval but there is no result yet((( Is it possible to do what I need? 回答1: Do you want to evaluate an expression

In freemarker is it possible to check to see if a file exists before including it?

梦想与她 提交于 2019-12-07 01:43:31
问题 We are trying to build a system in freemarker where extension files can be optionally added to replace blocks of the standard template. We have gotten to this point <#attempt> <#include "extension.ftl"> <#recover> Standard output </#attempt> So - if the extension.ftl file exists it will be used otherwise the part inside of the recover block is output. The problem with this is that freemarker always logs the error that caused the recover block to trigger. So we need one of two things: Don't

Java模版引擎:jsp、freemarker、velocity区别

孤街醉人 提交于 2019-12-06 19:39:04
在java领域,表现层技术主要有三种:jsp、freemarker、velocity。 jsp是大家最熟悉的技术 优点: 1、功能强大,可以写java代码 2、支持jsp标签(jsp tag) 3、支持表达式语言(el) 4、官方标准,用户群广,丰富的第三方jsp标签库 5、性能良好。jsp编译成class文件执行,有很好的性能表现 缺点: jsp没有明显缺点,非要挑点骨头那就是,由于可以编写java代码,如使用不当容易破坏mvc结构。 velocity是较早出现的用于代替jsp的模板语言 优点: 1、不能编写java代码,可以实现严格的mvc分离 2、性能良好,据说比jsp性能还要好些 3、使用表达式语言,据说jsp的表达式语言就是学velocity的 缺点: 1、不是官方标准 2、用户群体和第三方标签库没有jsp多。 3、对jsp标签支持不够好 freemarker 优点: 1、不能编写java代码,可以实现严格的mvc分离 2、性能非常不错 3、对jsp标签支持良好 4、内置大量常用功能,使用非常方便 5、宏定义(类似jsp标签)非常方便 6、使用表达式语言 缺点: 1、不是官方标准 2、用户群体和第三方标签库没有jsp多 选择freemarker的原因: 1、性能。velocity应该是最好的,其次是jsp,普通的页面freemarker性能最差

freemarker template for loop statement

青春壹個敷衍的年華 提交于 2019-12-06 18:51:49
问题 I want to create for statement in freemarker template. I am reading howto http://freemarker.sourceforge.net/ but there is just list. How can i create for statement or foreach. parameter.put("size", size); I want to create in freemarker template for statement like for (int number = 1; number <= size; number++) { 回答1: From the Freemarker manual you can do: <#assign x=3> <#list 1..x as i> ${i} </#list> Edit: Beware, if x is 0 (or less), it will count backwards. So you mostly want 1 ..< x , which

freemarker页面如何获取jsp中的request.getContexPath

懵懂的女人 提交于 2019-12-06 17:13:37
1.当controller的requestMapping()只有一级目录时(相对于项目名后多一级目录),该controller跳转的页面中引入js时的相对路径就是webapp 此时可以直接 <script src="static/bootstrap-3.3.4/js/bootstrap.min.js"></script> 路径static是webapp下的一级目录。否则(如controller的requestMapping()中为(“xxx/xxx”)),需使用相对路径。 2. freemarker获取系统相对路径(webapp)方式 spring-mvc.xml 中配置 <!-- FreeMarker视图解析 如返回userinfo。。在这里配置后缀名ftl和视图解析器。。 --> <bean id="viewResolverFtl" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.freemarker.FreeMarkerView" /> <property name="suffix" value=".ftl" />

freemarker(二) 常用内置函数

我怕爱的太早我们不能终老 提交于 2019-12-06 15:21:38
freemarker 常用内置函数 1。在模板里边 变量引用使用: ${a}, 如果给<#macro aa tmp=a > 这不需要 $, 可以给模板注入一些自定义的函数 ,这个比较常用. ======================= 接下来 将网上一些 内置函数 记录下来 一、Sequence的内置函数 1.sequence?first 返回sequence的第一个值。 2.sequence?last 返回sequence的最后一个值。 3.sequence?reverse 将sequence的现有顺序反转,即倒序排序 4.sequence?size 返回sequence的大小 5.sequence?sort 将sequence中的对象转化为字符串后顺序排序 6.sequence?sort_by(value) 按sequence中对象的属性value进行排序 注意:Sequence不能为null 二、Hash的内置函数 1.hash?keys 返回hash里的所有key,返回结果为sequence 2.hash?values 返回hash里的所有value,返回结果为sequence 三、操作字符串函数 1.substring(start,end)从一个字符串中截取子串 start:截取子串开始的索引,start必须大于等于0,小于等于end end: 截取子串的长度