beetl模板引擎的好玩的地方

Beetl2.x即將發佈,性能,功能上已經很是卓越了,這裏介紹一下beetl的好玩的地方,使用者能夠定製beetl不少特性 html

1 自定義控制語句定界符: java

開發者能夠根據本身喜好定義<% %>做爲控制語句定界符號,也能夠定義<?  ?> 或者<!--#  -->等等,取決於你的喜愛,有些開發者甚至定義出@ +回車的定界符號,以下: express


@ for(user in userList){
<span> ${user.name}
........
@}



2 安全輸出


模板常碰到變量爲空或者變量不存在的狀況,beetl能夠加入!輕易解決這種問題 安全


${user.name!}
${user.age!"未知"}



固然,若是你以爲加整個模板處處充滿了!(其餘有安全輸出的模板引擎)都很麻煩,能夠用beetl的指令



<%
  directive safe_output_open;
%>
${user.name}
${user.name}
${user.name}${user.name}${user.name}${user.name}



3 動態修改代碼


beetl2.0引入了相似java字節碼修改器的概念,提供簡單易懂的方法能讓你修改beetl「字節碼」,所以能完成不少有趣功能,好比 xss


  • demo版本每一個頁面尾部自動輸出公司版權信息
  • 模板頁面統計功能
  • 模板片斷分析統計
  • 動態修改模板腳本

好比一個常見需求,爲了防止xss攻擊,須要把字符串輸出的作一下過濾,而其餘輸出不須要過濾,通常狀況,採用beetl或者使用其餘模板引擎,均可以加入一個格式化函數,如: ide


${user.name,xss}



(xss是一個格式化函數)


可是,實際上也能夠動態修改PlaceholderST來爲全部字符串輸出的語句自動加上一個過濾,代碼以下: 函數


public MyTemplateProbe extends BasicProgramOptProbe{

protected void addMore(StatementParser parser)
{
   parser.addListener(PlaceholderST.class,new PlaceholderSTChange())
}
}



parser.addListener 指示模板探針在分析語法樹的時候,碰到PlaceholderSt.class,通知PlaceholderStChange ,這個類能夠負責用新的實現來代替模板引擎默認的實現


以下代碼片斷: 性能


public class PlaceholderStChange implements Listener{

@Override
	public Object onEvent(Event e)
	{
		Stack stack = (Stack) e.getEventTaget();
		PlaceholderSt o = (PlaceholderSt)stack.peek();
              if(o.expression.type==String.class) o.format = xssFormat;
        }
}



statck保存了從root到此節點全部通過的節點,所以stack.peek 能夠取出當前節點,你能夠修改此節點,也能夠返回一個全新的節點。這個例子,咱們修改了PlaceHolderSt , 若是他的輸出類型爲String,咱們將加上xss檢測



4 不須要申明類型的強類型模板引擎 測試

beetl是個強類型模板引擎,從而保證了性能最大化,IDE的重構支持,屬性提示等,但他又是不須要像其餘模板引擎那樣必須申明類型。beetl假設用戶老是像模板引擎裏傳入同一類型的對象,如: spa

<%
 var na = user.name;
%>



當用戶渲染模板的時候,傳入template.bind("user",new User());
beetl就能認爲user類型是User.class, 而na則是getName的類型。


beetl不用顯示指定類型,從而在提升性能的時候簡化了模板開發。固然,你也能夠指定類型,好比:


<%
/*
*@type User me,List<User> list
*/

for(user in List){

%>



儘管不須要@type申明類型,但申明類型仍是有好處的,好比更加容易維護,若是ide支持,還能夠屬性提示,重構支持。


5 beetl是腳本加標籤的混合
基本上,beetl開創了腳本式的模板引擎,但有趣的地方,他實際上支持標籤,好比:

<%
var salary = getAll();
%>

<#selection values = "${salary}" id="id" value="name" #/>


對於標籤控來講,這再合適不過了,對於CMS系統,這也很是好


6 獨特的語法

儘管beetl避免生僻的,非人類直觀的語法,但仍是引入了少許新語法,創造新語法這不值得beetl開發者驕傲,但這些新語法有時候對開發有好處。如for-elsefor

<%
for(user in userList){
  println(user.name);
}elsefor{
  println("no data");
}
%>



7 功能和性能。

  儘管功能和性能不能算beetl好玩的地方,但光好玩,不實用也不行。以下是基準的性能測試,可讓有興趣的朋友更加確信beetl是個好的的選擇:

相關文章
相關標籤/搜索