java语言for模板_java版的模板语言
最近心血來潮,開發(fā)了一個小工具,為了方便以后定制模板,打算使用模板語言,之前在項(xiàng)目中用過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語法,是因?yàn)槲易钕矚gjsp的標(biāo)簽語法,簡單易用,功能強(qiáng)大無所不能。
因此,采用了完全兼容 jsp標(biāo)簽的方式,用過jstl的對這個語法就不需要學(xué)了。支持自定義標(biāo)簽。在性能方面,采用了一次編譯,多次運(yùn)行的方式。
el表達(dá)式使用的是ognl。
實(shí)現(xiàn)原理:對文檔進(jìn)行編譯,編譯出一個樹形結(jié)構(gòu)的文檔,執(zhí)行過程對每一個節(jié)點(diǎn)進(jìn)行處理,文本節(jié)點(diǎn)直接輸出,標(biāo)簽節(jié)點(diǎn)由具體的java實(shí)現(xiàn)進(jìn)行處理之后決定如何輸出。
因此在對整個樹形結(jié)構(gòu)進(jìn)行處理的時候有兩種方式,第一種方法是使用遞歸處理,這種方式最簡單,程序易讀性也比較強(qiáng)。但是在某些框架下運(yùn)行可能會對java棧造成比較大的開銷。例如在struts下,如果使用了過多的攔截器,頁面中又有太多的嵌套,可能很快就會造成StackOverFlow。還有一個缺點(diǎn)就是如果某些標(biāo)簽需要頁面執(zhí)行立即終止,遞歸操作就需要設(shè)置一個局部全局變量,并且處處檢查該變量以決定是否立即終止遞歸。第二種方法,自定義一個棧,將節(jié)點(diǎn)壓入棧中依次處理,這樣遞歸操作就變成了一個循環(huán)操作,如果需要終止處理,只需要簡單的break即可。最終要的是即便頁面結(jié)構(gòu)很復(fù)雜也不會對當(dāng)前線程的棧造成很大的開銷。
目前基本功能已經(jīng)完成,正在做性能優(yōu)化。目前的表現(xiàn)有點(diǎn)不太滿意,一個50K大小的文檔,編譯大概需要300毫秒,每次執(zhí)行大概需要60毫秒。執(zhí)行已經(jīng)沒有優(yōu)化的余地了,靜態(tài)內(nèi)容的輸出基本是純粹的IO操作,這個是在內(nèi)存中處理的。動態(tài)的內(nèi)容邏輯是java代碼,也不可能優(yōu)化了。
總結(jié)
以上是生活随笔為你收集整理的java语言for模板_java版的模板语言的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java list 替换 多线程_Jav
- 下一篇: java线程 教程_Java多线程系列教