tpl自定義標簽的設計目標之一是盡量減少配置說明項. 在tpl標簽庫中, 標簽定義格式如下
<標簽庫名稱>
<自定義標簽名 demandArgs="argA, argB"
importVars="varA, varB"
otherArgs="optionalArgA, optionalArgB" localScope="trueOrFalse" >
自定義標簽的內容, 可以是任何tpl代碼
</自定義標簽名>
</標簽庫名稱>
demandArgs中指定調用時必須給定的參數的名稱列表, importVars指定從調用環境中導入的變量的名稱列表,otherArgs指定可選參數的名稱列表. demandArgs, importVars和otherArgs這三者的集合包含了所有該自定義標簽能夠接受的參數. tpl編譯器會檢查這些調用規則是否被滿足. 在運行的時候, 未指定的可選參數會被初始化為null.
在調用時明確的指定的變量值會覆蓋importVars導入的變量值. 例如
<c:set var="varA" value="a" />
<MyLib:自定義標簽名 /> // 根據importVars設定, 在此標簽內varA的值為a
<MyLib:自定義標簽名 varA="b" /> // args設定會覆蓋importVars導入的值,因此在標簽內部 varA的值為b
// 調用標簽完成后, varA的值恢復為a
tpl中的參數聲明方式是非常簡化的,但是它仍然保留了最關鍵的信息:變量名稱. 而在弱類型的Expresison Language中, 變量類型本來就不重要. 與jsp tag中的標簽聲明作個對比.
<tag>
<name>template</name>
<tagclass>edu.thu.web.tags.TemplateTag</tagclass>
<bodycontent>JSP</bodycontent>
<attribute>
<name>src</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
jsp tag這種標簽聲明方式非常冗長, 提供的有效信息密度很低, 而相對于tpl標簽的聲明方式所能夠提供的附加信息也沒有很大的意義. 這種設計上的問題也深深的影響到JSF等派生技術.
localScope參數指定了此自定義標簽是否具有局部變量環境, 如果為true(缺省值), 則調用此標簽的時候會自動進行變量壓棧處理, 在標簽內部無法訪問參數列表之外的變量, 運行中所產生的臨時變量也不會影響到外部環境. tpl中的變量堆棧與webwork的ValueStack機制是有一些差異的. webwork2中的ognl語言在訪問OgnlValueStack中的對象的時候缺省采用的是一種遞歸查找機制, 即在當前環境中找不到對象, 則自動查找上一層環境中的變量. tpl中的標簽結構可以多重嵌套, 產生非常復雜的結構, 所以缺省情況下tpl標簽采用了類似于函數堆棧的設計, 在子標簽中的代碼一般情況下是無法訪問父標簽環境中的變量的(除非指定了localScope參數為true). localScope支持與importVars機制相結合之后, 我們可以實現比OgnlValueStack更加靈活也更加穩健的變量訪問策略.
<標簽庫名稱>
<自定義標簽名 demandArgs="argA, argB"
importVars="varA, varB"
otherArgs="optionalArgA, optionalArgB" localScope="trueOrFalse" >
自定義標簽的內容, 可以是任何tpl代碼
</自定義標簽名>
</標簽庫名稱>
demandArgs中指定調用時必須給定的參數的名稱列表, importVars指定從調用環境中導入的變量的名稱列表,otherArgs指定可選參數的名稱列表. demandArgs, importVars和otherArgs這三者的集合包含了所有該自定義標簽能夠接受的參數. tpl編譯器會檢查這些調用規則是否被滿足. 在運行的時候, 未指定的可選參數會被初始化為null.
在調用時明確的指定的變量值會覆蓋importVars導入的變量值. 例如
<c:set var="varA" value="a" />
<MyLib:自定義標簽名 /> // 根據importVars設定, 在此標簽內varA的值為a
<MyLib:自定義標簽名 varA="b" /> // args設定會覆蓋importVars導入的值,因此在標簽內部 varA的值為b
// 調用標簽完成后, varA的值恢復為a
tpl中的參數聲明方式是非常簡化的,但是它仍然保留了最關鍵的信息:變量名稱. 而在弱類型的Expresison Language中, 變量類型本來就不重要. 與jsp tag中的標簽聲明作個對比.
<tag>
<name>template</name>
<tagclass>edu.thu.web.tags.TemplateTag</tagclass>
<bodycontent>JSP</bodycontent>
<attribute>
<name>src</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
jsp tag這種標簽聲明方式非常冗長, 提供的有效信息密度很低, 而相對于tpl標簽的聲明方式所能夠提供的附加信息也沒有很大的意義. 這種設計上的問題也深深的影響到JSF等派生技術.
localScope參數指定了此自定義標簽是否具有局部變量環境, 如果為true(缺省值), 則調用此標簽的時候會自動進行變量壓棧處理, 在標簽內部無法訪問參數列表之外的變量, 運行中所產生的臨時變量也不會影響到外部環境. tpl中的變量堆棧與webwork的ValueStack機制是有一些差異的. webwork2中的ognl語言在訪問OgnlValueStack中的對象的時候缺省采用的是一種遞歸查找機制, 即在當前環境中找不到對象, 則自動查找上一層環境中的變量. tpl中的標簽結構可以多重嵌套, 產生非常復雜的結構, 所以缺省情況下tpl標簽采用了類似于函數堆棧的設計, 在子標簽中的代碼一般情況下是無法訪問父標簽環境中的變量的(除非指定了localScope參數為true). localScope支持與importVars機制相結合之后, 我們可以實現比OgnlValueStack更加靈活也更加穩健的變量訪問策略.