velocity中使用evaluate指令動態解析屬性

iteye_12858發表於2013-04-03
struts2裡有select標籤,可以方便的生成html的select元素.
用velocity以後,怎麼用select標籤呢
第一,可以用#sselect.事實上,在velocity頁面中,可以使用#s的字首來使用struts2的標籤
詳情見[url]http://struts.apache.org/release/2.3.x/docs/velocity-tags.html[/url]
第二,用velocity的巨集來實現自定義元件.
先考慮一個普通java類Bar,有foo和bar兩個屬性,在velocity中訪問這兩個屬性,可以用
$bar.foo
$bar.bar
但是如何能動態指定要訪問的屬性呢?
evaluate指令可以用來在執行時動態解析模板語言.
#set($prop="bar")
#evaluate("\$bar.$prop")
#set($prop="foo")
#evaluate("\$bar.$prop")
其中"\"用來轉義"$"

下面用巨集來組成一個自定義的select元素
#macro (fooList $list $name $listKey $listValue $headerKey $headerValue)
#set($currentValueExpression = "$$name")
#set($currentValue = "#evaluate($currentValueExpression)")
<select name="$name">

#if( $headerKey && $headerValue )
<option value="$headerKey">$headerValue</option>
#end

#foreach( $v in $list )
#set($dynamicValueExpression = "\$v.$listValue")
#set($dynamicKeyExpression = "\$v.$listKey")
#set($dynamicKey = "#evaluate($dynamicKeyExpression)")
<option value="$dynamicKey"
#if( $dynamicKey == $currentValue )
selected="selected"
#end>
#evaluate($dynamicValueExpression)</option>
#end
</select>
#end

這樣來呼叫這個巨集,產生類似於struts2 select標籤的效果
#fooList($barList "currentBarId" "fooId" "fooName")

最後吐槽下velocity的文件,它說呼叫巨集的時候,傳遞的引數個數必須和定義時一致
[quote]
when the Velocimacro is invoked, it must be called with the same number of arguments with which it was defined
[/quote]
那現在如果我硬少幾個引數,照樣能呼叫,也不報錯,那個"must"真是莫大的諷刺....

相關文章