ҳ ʫ ֵ Ѵ ־ ѧУ վͼ
ǰλ: ҳ > ̳Ƶ > > >

java版的模板语

2013-02-24 
java版的模板语言?心血来潮Q开发了?工PZ方便以后定制模板Q打

java版的模板语言

    ?心血来潮Q开发了?工PZ方便以后定制模板Q打用模板语a?之前在项目中用过freemark和velocityQ对于它们的语法都不喜欢Q还是重造个轮子吧,哈哈?/p>

    先脓D代码吧Q?/p>

    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<String, Object> user = new HashMap<String, Object>();        user.put("userName", "xuesong.net");        pageContext.setAttribute("user", user);        template.evaluate(pageContext);        }        long t4 = System.currentTimeMillis();        System.out.println("run time: " + (t4 - t3));    }
模板语法采用了jstl语法Q是因ؓ我最喜欢jsp的标{语法,?易用Q功能强大无?能?

因此Q采用了完全兼容 jsp标签的方式,用过jstl的对这个语法׃?学了。支持自定义标签。在性能斚wQ采用了?~译QEơ运行的方式?/p>

el表达式用的是ognl?/p>


实现原理Q对文档进行~译Q编译出?树Şl构的文档,执行过程Ҏ?节点进行处理Q文本节点直接输出,标签节点由具体的java实现进行处理之后n如何输出?/p>

因此在对整个树Şl构进行处理的时候有两方式Q第?Ҏ是用?归夐理,这方式?单,E序易读性也比较强?但是在某些框架下运行可能会对java栈?成比较大的开??例@在struts下,如果使用了过多的拦截器,面中又有太多的嵌MQ可能很快就会?成StackOverFlow。还有一个缺点就是@果某些标{N要页面执行立即终正H递归操作需要设|一个局部全?量,q且处夐?该变量以n是否f即l止递归。第二ҎQ自定义?栈,节点压入栈中依ơ夐理,这样递归操作变成了?循环操作Q@果需要终止夐理,只需要简单的breakn。最l覠的是即便面l构很夙杂也不会对当前线E的栈?成很大的??/p>

目前基本功能已经完成Q正在做性能优化。目前的表现有点不太满意Q一?0K大小的文档,~译大@?300毫Q每ơ执行大概需?0毫。执行已l没有优化的余地了,静?内容的输出基本是Ua的IO操作Q这个是在内存中处理的?动?的内定w?辑是java代码Q也不可能优化了?/p>

ȵ