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代碼,也不可能優化了。
總結
以上是生活随笔為你收集整理的java语言for模板_java版的模板语言的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java list 替换 多线程_Jav
- 下一篇: java 线程池 中断_如何中断(int