groovy的SimpleTemplateEngine实现了模板功能,类似于jsp。那就分析groovy是如何实现模板的。
使用模板
Template template = new SimpleTemplateEngine().createTemplate(
new StringReader("<% // This is a comment that will be filtered from output %>\n" +
"Hello <%out.println(name);%> !")
);
final StringWriter sw = new StringWriter();
template.make([name:'bloodwolf_china').writeTo(sw);
println sw.toString();
看看SimpleTemplateEngine类
public Template createTemplate(Reader reader) throws CompilationFailedException, IOException {
SimpleTemplate template = new SimpleTemplate();
String script = template.parse(reader);
template.script = groovyShell.parse(script, "SimpleTemplateScript" + counter++ + ".groovy");
return template;
}
这儿做了三件事
1、创建了一个SimpleTemplate对象
2、解析模板,主要是把<%=exp%>转为groovy的内置表达式${exp},把非<%code%>转为调用out.print(内容)函数,<%code%>中的就是groovy代码了。这样就把整个模板解析为一段代码。如
引用
Hello <%out.println(name);%> !
变成
out.print("Hello ");
out.println(name);
out.print(" !");
3、用groovyShell获取一个Script对象
Script对象只一个支持普通groovy对象,利用了Groovy的特性
实现 getProperty(String property)方法,从参数绑定对象中获取属性,这样脚本中就能获取绑定参数。
public abstract class Script extends GroovyObjectSupport {
private Binding binding;
public Object getProperty(String property) {
try {
return binding.getVariable(property);
} catch (MissingPropertyException e) {
return super.getProperty(property);
}
}
public abstract Object run();
}
groovyShell把一段代码组装成一个GroovyCodeSource对象,然后调用GroovyClassLoader,CompilationUnit把CodeSource编译成一个Script对象,run()方法中执行的即是out.print(模板内容)这段代码。
在看看如何输出模板内容的
private static class SimpleTemplate implements Template {
protected Script script;
public Writable make() {
return make(null);
}
public Writable make(final Map map) {
return new Writable() {
/**
* Write the template document with the set binding applied to the writer.
*
* @see groovy.lang.Writable#writeTo(java.io.Writer)
*/
public Writer writeTo(Writer writer) {
Binding binding;
if (map == null)
binding = new Binding();
else
binding = new Binding(map);
Script scriptObject = InvokerHelper.createScript(script.getClass(), binding);
PrintWriter pw = new PrintWriter(writer);
scriptObject.setProperty("out", pw);
scriptObject.run();
pw.flush();
return writer;
}
/**
* Convert the template and binding into a result String.
*
* @see java.lang.Object#toString()
*/
public String toString() {
StringWriter sw = new StringWriter();
writeTo(sw);
return sw.toString();
}
};
}
}
很清楚了,调用make方法,创建一个Script对象,绑定参数binding = new Binding(map)。
创建一个PrintWriter,绑定为out参数,而模板解析的代码中的out.print(内容)就有着落了。
所以:
- Groovy的模板是通过编译,生成Java类,然后调用方法实现的
- 使用模板机制注意要缓存Script对象或Template对象,否则每次调用都会编译生成一个新的Java类,导致内存溢出/泄露
分享到:
相关推荐
groovy模板
[Groovy入门]第十讲.使用模板引擎开发界面
scala erlang groovy python 原理 比较 分析
通过groovy自定义函数实现提取明细表字段至主表字段,同时根据表单上的字段进行计算,将计算结果在字段上显示;致远、groovy
groovy脚本实现对数据库的增删改查,groovy脚本不需要编译,十分实用
Play1使用groovy模板作为渲染引擎,而Play2使用Scala模板。在Play1时期,Japid作为groovy的替代品,非常受欢迎。而在Play官方使用Scala替换groovy后,性能虽然有所提高,但是限于Scala编译器的性能,仍然远不如Play2...
Java 开发 2_0 通过 CouchDB 和 Groovy 的 RESTClient 实现 REST
在groovy中实现DSL领域特定语言的技术。 版权声明: 本系列文章是从原著《Groovy For Domain-Specific Languages》(原作者: Fergal Dearle)中翻译而来,从中加入了一些本人自己的读书笔记和理解。本系列文章不为...
groovy 一个不错的文档 实现dsl
SoapUI插件实现import groovy功能
Groovy语言。 里面详细介绍了一些很有意思的方法。
Groovy介绍 什么是Groovy Groovy基本语法 Groovy正则 Java调用Groovy Groovy模板 Groovy应用
SoapUI插件实现import groovy功能 V2 http://blog.csdn.net/wwwqjpcom/article/details/51592896 更新的地方主要是不再在java.io.tmpdir目录下产生临时groovy文件
apache-groovy-3.0.8.zip apache官网的groovy3.0.8版本,希望大家多多下载,apache-groovy-3.0.8.zip apache官网的groovy3.0.8版本,希望大家多多下载,apache-groovy-3.0.8.zip apache官网的groovy3.0.8版本,希望...
赠送jar包:groovy-3.0.9.jar; 赠送原API文档:groovy-3.0.9-javadoc.jar; 赠送源代码:groovy-3.0.9-sources.jar; 赠送Maven依赖信息文件:groovy-3.0.9.pom; 包含翻译后的API文档:groovy-3.0.9-javadoc-API...
groovy入门经典,groovyeclipse 插件
1、eclipse安装groovy的插件。 2、创建java project。 3、把groovy-all-2.1.9.jar,加入classpath。 4、编写hello.groovy脚本文件,并在java代码中调用脚本文件 ...
Making Java Groovy is a practical handbook for developers who want to blend Groovy into their day to day work with Java It starts by introducing the key differences between Java and Groovy and how you...
Groovy语言可以用作应用程序的“黏合剂”,而不必实现复杂的数据结构和算法。 与Java代码比较起来,Groovy语言的另一个主要优势是,Groovy代码编写量相对小些。在一般情况下,Java代码过于复杂,难于理解和维护。...
Java调用Groovy,实时动态加载数据库groovy脚本,java读取mongoDB的groovy脚本,加载实时运行,热部署