博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java模板引擎解析原理_groovy 模板引擎实现原理分析
阅读量:5300 次
发布时间:2019-06-14

本文共 2672 字,大约阅读时间需要 8 分钟。

[jetbrick-template 是一个新一代 Java 模板引擎,具有高性能和高扩展性。 适合于动态 HTML 页面输出或者代码生成,可替代 JSP 页面或者 Velocity 等模板。 指令和 Velocit

groovy的SimpleTemplateEngine实现了模板功能,类似于jsp。那就分析groovy是如何实现模板的。

使用模板

Template template = new SimpleTemplateEngine().createTemplate(

new StringReader("\n" +

"Hello !")

);

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、解析模板,主要是把转为groovy的内置表达式${exp},把非转为调用out.print(内容)函数,中的就是groovy代码了。这样就把整个模板解析为一段代码。如 引用 Hello ! 变成

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对象,[             Groovy探索之闭包 七  使用闭包来实现模板方法模式  我们知道,很多的设计模式都是通过增加接口来达到解耦的目的,使得代码的扩展性大大增强。其中,模板方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探索之闭包 七 使用闭包来实现模板方法模式 我们知道,很多的设计模式都是通

转载地址:http://ladqv.baihongyu.com/

你可能感兴趣的文章
SQL Server中利用正则表达式替换字符串
查看>>
POJ 1015 Jury Compromise(双塔dp)
查看>>
UIScrollView,UICollectionView 和UITableView的属性和方法
查看>>
2018/12/08 L1-040 最佳情侣身高差 Java
查看>>
Python 的一些方法
查看>>
unix系统编程小结(一)------文件I/O
查看>>
windows下创建文件夹链接
查看>>
ArcGIS server Manager配置map服务
查看>>
.htaccess 详解
查看>>
设计原则与软件设计
查看>>
2018-2019-1 20165309 20165312 20165330 实验一 开发环境的熟悉
查看>>
Java 内存溢出(java.lang.OutOfMemoryError)的常见情况和处理方式总结
查看>>
android操作sdcard中的多媒体文件(二)——音乐列表的更新
查看>>
vector使用方法 ...
查看>>
JavaScript-10(JavaScript事件)
查看>>
网络编程 -- RPC实现原理 -- NIO单线程
查看>>
Java Annotation 应用 -- 导出Excel表格
查看>>
JavaScript 动态显示当前时间
查看>>
常用的 Http ContentType 对照表
查看>>
DVD系统
查看>>