Posted on 2005-11-27 20:32
canonical 閱讀(1117)
評(píng)論(0) 編輯 收藏 所屬分類:
Witrix開發(fā)平臺(tái)
tpl自定義標(biāo)簽的設(shè)計(jì)目標(biāo)之一是盡量減少配置說明項(xiàng). 在tpl標(biāo)簽庫中, 標(biāo)簽定義格式如下
<標(biāo)簽庫名稱>
<自定義標(biāo)簽名 demandArgs="argA, argB"
importVars="varA, varB"
otherArgs="optionalArgA, optionalArgB" localScope="trueOrFalse" >
自定義標(biāo)簽的內(nèi)容, 可以是任何tpl代碼
</自定義標(biāo)簽名>
</標(biāo)簽庫名稱>
demandArgs中指定調(diào)用時(shí)必須給定的參數(shù)的名稱列表,
importVars指定從調(diào)用環(huán)境中導(dǎo)入的變量的名稱列表,otherArgs指定可選參數(shù)的名稱列表. demandArgs,
importVars和otherArgs這三者的集合包含了所有該自定義標(biāo)簽?zāi)軌蚪邮艿膮?shù). tpl編譯器會(huì)檢查這些調(diào)用規(guī)則是否被滿足.
在運(yùn)行的時(shí)候, 未指定的可選參數(shù)會(huì)被初始化為null.
在調(diào)用時(shí)明確的指定的變量值會(huì)覆蓋importVars導(dǎo)入的變量值. 例如
<c:set var="varA" value="a" />
<MyLib:自定義標(biāo)簽名 /> // 根據(jù)importVars設(shè)定, 在此標(biāo)簽內(nèi)varA的值為a
<MyLib:自定義標(biāo)簽名 varA="b" /> // args設(shè)定會(huì)覆蓋importVars導(dǎo)入的值,因此在標(biāo)簽內(nèi)部 varA的值為b
// 調(diào)用標(biāo)簽完成后, varA的值恢復(fù)為a
tpl中的參數(shù)聲明方式是非常簡(jiǎn)化的,但是它仍然保留了最關(guān)鍵的信息:變量名稱. 而在弱類型的Expresison Language中, 變量類型本來就不重要. 與jsp tag中的標(biāo)簽聲明作個(gè)對(duì)比.
<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這種標(biāo)簽聲明方式非常冗長, 提供的有效信息密度很低, 而相對(duì)于tpl標(biāo)簽的聲明方式所能夠提供的附加信息也沒有很大的意義. 這種設(shè)計(jì)上的問題也深深的影響到JSF等派生技術(shù).
localScope參數(shù)指定了此自定義標(biāo)簽是否具有局部變量環(huán)境, 如果為true(缺省值),
則調(diào)用此標(biāo)簽的時(shí)候會(huì)自動(dòng)進(jìn)行變量壓棧處理, 在標(biāo)簽內(nèi)部無法訪問參數(shù)列表之外的變量, 運(yùn)行中所產(chǎn)生的臨時(shí)變量也不會(huì)影響到外部環(huán)境.
tpl中的變量堆棧與webwork的ValueStack機(jī)制是有一些差異的.
webwork2中的ognl語言在訪問OgnlValueStack中的對(duì)象的時(shí)候缺省采用的是一種遞歸查找機(jī)制, 即在當(dāng)前環(huán)境中找不到對(duì)象,
則自動(dòng)查找上一層環(huán)境中的變量. tpl中的標(biāo)簽結(jié)構(gòu)可以多重嵌套, 產(chǎn)生非常復(fù)雜的結(jié)構(gòu), 所以缺省情況下tpl標(biāo)簽采用了類似于函數(shù)堆棧的設(shè)計(jì),
在子標(biāo)簽中的代碼一般情況下是無法訪問父標(biāo)簽環(huán)境中的變量的(除非指定了localScope參數(shù)為true).
localScope支持與importVars機(jī)制相結(jié)合之后, 我們可以實(shí)現(xiàn)比OgnlValueStack更加靈活也更加穩(wěn)健的變量訪問策略.