java语言for模板_java版的模板语言

最近心血来潮,开发了一个小工具,为了方便以后定制模板,打算使用模板语言,之前在项目中用过freemark和velocity,对于它们的语法都不喜欢,还是重造个轮子吧,哈哈。

先贴段代码吧:

test

${user.userName}

Hello World!

Hello World!

Hello World!

上面是页面代码, 下面是java代码

public static void main(String[] args)

{

String source = IO.read(new File("debug/test.html"), "UTF-8", 4096);

TemplateCompiler compiler = new TemplateCompiler(source);

System.out.println("source.length: " + source.length());

long t1 = System.currentTimeMillis();

Template template = compiler.compile();

long t2 = System.currentTimeMillis();

System.out.println("compile complete: " + (t2 - t1));

long t3 = System.currentTimeMillis();

for(int i = 0; i < 100; i++)

{

StringWriter writer = new StringWriter();

JspWriter out = new JspWriter(writer);

PageContext pageContext = new PageContext(out);

Map user = new HashMap();

user.put("userName", "xuesong.net");

pageContext.setAttribute("user", user);

template.evaluate(pageContext);

}

long t4 = System.currentTimeMillis();

System.out.println("run time: " + (t4 - t3));

}模板语法采用了jstl语法,是因为我最喜欢jsp的标签语法,简单易用,功能强大无所不能。

因此,采用了完全兼容 jsp标签的方式,用过jstl的对这个语法就不需要学了。支持自定义标签。在性能方面,采用了一次编译,多次运行的方式。

el表达式使用的是ognl。

实现原理:对文档进行编译,编译出一个树形结构的文档,执行过程对每一个节点进行处理,文本节点直接输出,标签节点由具体的java实现进行处理之后决定如何输出。

因此在对整个树形结构进行处理的时候有两种方式,第一种方法是使用递归处理,这种方式最简单,程序易读性也比较强。但是在某些框架下运行可能会对java栈造成比较大的开销。例如在struts下,如果使用了过多的拦截器,页面中又有太多的嵌套,可能很快就会造成StackOverFlow。还有一个缺点就是如果某些标签需要页面执行立即终止,递归操作就需要设置一个局部全局变量,并且处处检查该变量以决定是否立即终止递归。第二种方法,自定义一个栈,将节点压入栈中依次处理,这样递归操作就变成了一个循环操作,如果需要终止处理,只需要简单的break即可。最终要的是即便页面结构很复杂也不会对当前线程的栈造成很大的开销。

目前基本功能已经完成,正在做性能优化。目前的表现有点不太满意,一个50K大小的文档,编译大概需要300毫秒,每次执行大概需要60毫秒。执行已经没有优化的余地了,静态内容的输出基本是纯粹的IO操作,这个是在内存中处理的。动态的内容逻辑是java代码,也不可能优化了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值