ï»??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲日本一区二区三区在线,欧美区一区二区三区,91精品国产综合久久福利 http://www.aygfsteel.com/caizh2009/category/45999.htmlä¸Žå¤§å®¶å…±åŒæˆé•?/description>zh-cn Fri, 20 Aug 2010 10:00:06 GMT Fri, 20 Aug 2010 10:00:06 GMT 60 Velocity模æ¿(VM)è¯è¨€ä»‹ç» http://www.aygfsteel.com/caizh2009/archive/2010/08/20/329495.htmlž®èœæ¯›æ¯› ž®èœæ¯›æ¯› Fri, 20 Aug 2010 09:57:00 GMT http://www.aygfsteel.com/caizh2009/archive/2010/08/20/329495.html http://www.aygfsteel.com/caizh2009/comments/329495.html http://www.aygfsteel.com/caizh2009/archive/2010/08/20/329495.html#Feedback 0 http://www.aygfsteel.com/caizh2009/comments/commentRss/329495.html http://www.aygfsteel.com/caizh2009/services/trackbacks/329495.html
Velocity是一个基于java的模æ¿å¼•擎(template engineåQ‰ã€‚它å…许ä»ÖM½•äºÞZ»…仅简å•的使用模æ¿è¯è¨€åQˆtemplate languageåQ‰æ¥å¼•用由java代ç 定义的对象ã€?
当Velocity应用于web开呿—¶åQŒç•Œé¢è®¾è®¡äh员å¯ä»¥å’Œjava½E‹åºå¼€å‘ähå‘˜åŒæ¥å¼€å‘一个éµå¾ªMVC架构的web站点åQŒä¹Ÿž®±æ˜¯è¯ß_¼Œ™åµé¢è®¾è®¡äº?
员å¯ä»¥åªå…Ïx³¨™åµé¢çš„æ˜¾½Cºæ•ˆæžœï¼Œè€Œç”±java½E‹åºå¼€å‘äh员关注业务逻辑¾~–ç 。Velocityž®†java代ç 从web™åµé¢ä¸åˆ†¼›Õd‡ºæ¥ï¼Œ˜q™æ ·ä¸ºweb站点的长
期维护æä¾›äº†ä¾¿åˆ©åQŒåŒæ—¶ä¹Ÿä¸ºæˆ‘们在JSPå’ŒPHPä¹‹å¤–åˆæä¾›äº†ä¸€¿Uå¯é€‰çš„æ–ÒŽ¡ˆã€?
Velocityçš„èƒ½åŠ›è¿œä¸æ¢web站点开å‘这个领域,例如åQŒå®ƒå¯ä»¥ä»Žæ¨¡æ¿ï¼ˆtemplateåQ‰äñ”生SQLå’ŒPostScriptã€XMLåQŒå®ƒä¹?
å¯ä»¥è¢«å½“作一个独立工å…äh¥äº§ç”Ÿæºä»£ç 和报告åQŒæˆ–者作为其他系¾lŸçš„集戾l„äšg使用。Velocity也å¯ä»¥äØ“Turbine
web开呿ž¶æž„æä¾›æ¨¡æ¿æœåŠ¡ï¼ˆtemplate
serviceåQ‰ã€‚Velocity+Turbineæä¾›ä¸€ä¸ªæ¨¡æ¿æœåŠ¡çš„æ–¹å¼å…许一个web应用以一个真æ£çš„MVC模型˜q›è¡Œå¼€å‘ã€?
Velocityèƒ½äØ“æˆ‘ä»¬ä½œä»€ä¹ˆï¼Ÿ
The Mud Store Example
å‡è®¾ä½ 是一家专门出售Mud的在¾U¿å•†åº—çš„™åµé¢è®¾è®¡äººå‘˜åQŒè®©æˆ‘们暂且¿U°å®ƒä¸?#8220;在线MUD商店”ã€‚ä½ ä»¬çš„ä¸šåŠ¡å¾ˆæ—ºåQŒå®¢æˆ·ä¸‹äº†å„¿U类型和数é‡çš„mudè®?
å•。他们都是通过输入用户å和密ç åŽæ‰ç™»é™†åˆîC½ 的网站,登陆åŽå°±å…许他们查看订å•òq¶è´ä¹°æ›´å¤šçš„mud。现在,一¿Uéžå¸¸æµè¡Œçš„mudæ£åœ¨æ‰“折销售。å¦å¤–有一
些客戯‚§„律性的è´ä¹°å¦å¤–一¿Uä¹Ÿåœ¨æ‰“æŠ˜ä½†æ˜¯ä¸æ˜¯å¾ˆ‹¹è¡Œçš„Bright Red
MudåQŒç”±äºŽè´ä¹°çš„äººåÆˆä¸å¤šæ‰€ä»¥å®ƒè¢«å®‰¾|®åœ¨™åµé¢çš„è¾¹¾~˜ã€‚所有用æˆïLš„ä¿¡æ¯éƒ½æ˜¯è¢«è·ŸítªåÆˆå˜æ”¾äºŽæ•°æ®åº“ä¸çš„åQŒæ‰€ä»¥æŸå¤©æœ‰ä¸€ä¸ªé—®é¢˜å¯èƒ½ä¼šå†’出æ¥ï¼šä¸ÞZ»€ä¹ˆä¸ä½¿ç”¨
velocityæ¥ä‹É用户更好的æµè§ˆä»–们感兴趣的商å“å‘¢åQ?
Velocity使得web™åµé¢çš„客户化工作éžå¸¸å®ÒŽ˜“。作ä¸ÞZ¸€ä¸ªweb site的设计ähå‘˜ï¼Œä½ å¸Œæœ›æ¯ä¸ªç”¨æˆïL™»é™†æ—¶éƒ½æ‹¥æœ‰è‡ªå·Þqš„™åµé¢ã€?
ä½ ä¼šè§äº†ä¸€äº›å…¬å¸å†…çš„èÊYä»¶å·¥½E‹å¸ˆåQŒä½ å‘现他们æ¯ä¸ªäººéƒ½åŒæ„客户应该拥有å…ähœ‰ä¸ªæ€§åŒ–的信æ¯ã€‚那让我们把软äšg工程师应该作的事情å‘åœ¨ä¸€è¾¹ï¼Œçœ‹ä¸€çœ‹ä½ åº”è¯¥ä½œäº›ä»€ä¹ˆå§ã€?
ä½ å¯èƒ½åœ¨™åµé¢å†…嵌套如下的VTL声明åQ?
<html>
<body>
Hello $customer.Name!
<table>
#foreach( $mud in $nudsOnSpecial )
#if ( $customer.hasPurchased( $mud ) )
<tr><td>$flogger.getPromo( $mud )</td></tr>
#end
#end
</table>
Velocity Template Language(VTL):AN introduction
VTLæ„å‘³ç€æä¾›æœ€½Ž€å•ã€æœ€å®ÒŽ˜“òq¶ä¸”最整æ´çš„æ–¹å¼åˆòq‰™¡µé¢åЍæ€å†…å®V€?
VTL使用referencesæ¥åœ¨web
site内嵌套动æ€å†…容,一个å˜é‡å°±æ˜¯ä¸€¿U类型的reference。å˜é‡æ˜¯æŸç§¾cÕdž‹çš„refreenceåQŒå®ƒå¯ä»¥æŒ‡å‘java代ç ä¸çš„定义åQŒæˆ–者从当å‰
™åµé¢å†…定义的VTL statement得到倹{€‚䏋颿˜¯ä¸€ä¸ªVTL statement的例å,它å¯ä»¥è¢«åµŒå¥—到HTML代ç ä¸ï¼š
#set ( $a = “Velocity” )
和所有的VTL
statementä¸€æ øP¼Œ˜q™ä¸ªstatement以#å—ç¬¦å¼€å§‹åÆˆä¸”åŒ…å«ä¸€ä¸ªdirectiveåQšset。当一个在¾U¿ç”¨æˆ¯‚¯·æ±‚ä½ çš„é¡µé¢æ—¶åQŒVelocity
Templating Enginež®†æŸ¥è¯¢æ•´ä¸ªé¡µé¢ä»¥ä¾¿å‘现所有#å—符åQŒç„¶åŽç¡®å®šå“ªäº›æ˜¯VTL statementåQŒå“ªäº›ä¸éœ€è¦VTL作ä“Q何事情ã€?
åQƒå—½W¦åŽç´§è·Ÿä¸€ä¸ªdirectiveåQšsetæ—Óž¼Œ˜q™ä¸ªset directive使用一个表辑ּåQˆä‹É用括å·å°é—)――一个方½E‹å¼åˆ†é…一个值给å˜é‡ã€‚å˜é‡è¢«åˆ—在左边åQŒè€Œå®ƒçš„倯D¢«åˆ—在匙¾¹åQŒæœ€åŽä»–们之间ä‹É用ï¼å·åˆ†å‰ŒÓ€?
在上é¢çš„例åä¸ï¼Œå˜é‡æ˜?aåQŒè€Œå®ƒçš„值是Velocity。和其他的referencesä¸€æ ·ä»¥$å—符开始,而值æ€ÀL˜¯ä»¥åŒå¼•å·ž®é—。Velocityä¸ä»…有Stringå¯ä»¥è¢«èµ‹å€¼ç»™å˜é‡ã€?
è®îC½ä»¥ä¸‹çš„规则:
使用$å—符开始的references用于得到什么;使用#å—符开始的directives用于作些什么ã€?
Hello Velocity World!
一旦æŸä¸ªå˜é‡è¢«åˆ†é…了一个å€û|¼Œé‚£ä¹ˆä½ å°±å¯ä»¥åœ¨HTMLæ–‡äšgçš„ä“Q何地方引用它。在下é¢çš„例åä¸åQŒä¸€ä¸ªå€ÆD¢«åˆ†é…¾l?fooå˜é‡åQŒåƈ在其åŽè¢«å¼•用ã€?
<html>
<body>
#set ( $foo = “Velocity” )
Hello $foo World!
</body>
</html>
上é¢çš„实现结果是在页é¢ä¸Šæ‰“å°“Hello Velocity WorldåQ?#8221;
ä¸ÞZº†ä½¿åŒ…å«VTL directivesçš„statement更具有å¯è¯ÀL€§ï¼Œæˆ‘ä»¬é¼“åŠ±ä½ åœ¨æ–°è¡Œå¼€å§‹æ¯ä¸ªVTL statementåQŒå°½½Ž¡ä½ 䏿˜¯å¿…é¡»˜q™ä¹ˆä½œã€‚Set directivež®†åœ¨åŽé¢è¯¦ç»†æè¿°ã€?
注释
å•行注释åQ?
## This is a single line comment.
多行注释åQ?
#*
Thus begins a multi-line comment. Online visitors won’t
see this text because the Velocity Templating Engine will
ignore it.
*#
æ–‡æ¡£æ ¼å¼åQ?
#**
This is a VTL comment block and
may be used to store such information
as the document author and versioning
information:
@version 5
@author
*#
References
在VTL䏿œ‰ä¸‰ç§¾cÕdž‹çš„referencesåQšå˜é‡?variables)ã€å±žæ€?properties)ã€æ–¹æ³?methods)。作ä¸ÞZ¸€ä¸ªä‹É
用VTL的页é¢è®¾è®¡è€…ï¼Œä½ å’Œä½ çš„å·¥ç¨‹å¸ˆå¿…™åÕd°±referencesçš„å¿U°è¾¾æˆå…±è¯†ï¼Œä»¥ä¾¿ä½ å¯ä»¥åœ¨ä½ çš„templateä¸ä‹É用它们ã€?
Everything coming to and from a reference被作ä¸ÞZ¸€ä¸ªString对象处ç†ã€‚如果有一个对è±?foo是一个Integer对象åQŒé‚£ä¹ˆVelocityž®†è°ƒç”¨å®ƒçš„toString()æ–ÒŽ³•ž®†è¿™ä¸ªå¯¹è±¡è{åž‹äØ“String¾cÕdž‹ã€?
å˜é‡
æ ¼å¼è¦æ±‚åŒjavaã€?
属�
例ååQ?
$customer.Address
$purchase.Total
$customer.Address有两¿Uå«ä¹‰ã€‚它å¯ä»¥è¡¨ç¤ºåQšæŸ¥æ‰¾hashtable对象customerä¸ä»¥Address为关键å—çš„å€û|¼›ä¹Ÿå¯
以表½Cø™°ƒç”¨customer对象的getAddress()æ–ÒŽ³•ã€‚å½“ä½ çš„™åµé¢è¢«è¯·æ±‚æ—¶åQŒVelocityž®†ç¡®å®šä»¥ä¸Šä¸¤¿Uæ–¹å¼é€‰ç”¨é‚£ç§åQŒç„¶åŽè¿”回适当的倹{€?
æ–ÒŽ³•
一个方法就是被定义在javaä¸çš„一ŒDµä»£ç ,òq¶ä¸”å®ƒæœ‰å®ŒæˆæŸäº›æœ‰ç”¨å·¥ä½œçš„能力,例如一个执行计½Ž—å’Œåˆ¤æ–æ¡äšgæ˜¯å¦æˆç«‹ã€æ»¡‘³ç‰ã€‚方法是一个由$å¼€å§‹åÆˆè·ŸéšVTLæ ‡è¯†½W¦ç»„æˆçš„ReferencesåQŒä¸€èˆ¬è¿˜åŒ…括一个VTLæ–ÒŽ³•体。例如:
$customer.getAddress()
$purchase.getTotal()
$page.setTitle( “My Home Page” )
$person.setAttributes( [“Strange”, “Weird”, “Excited”] )
å‰ä¸¤ä¸ªä¾‹å?customer.getAddress()å’?purchase.getTotal()看è“væ¥æŒºæƒ³ä¸Šé¢çš„属æ€?customer.Address å’?$purchase.Totalã€‚å¦‚æžœä½ è§‰å¾—ä»–ä»¬ä¹‹é—´æœ‰æŸ¿U蔾pÈš„è¯ï¼Œé‚£ä½ 是棼‹®çš„ã€?
VTL属性å¯ä»¥ä½œä¸ºVTLæ–ÒŽ³•的羃写ã€?customer.Address属性和使用$customer.getAddress()æ–ÒŽ³•å…ähœ‰ç›¸åŒçš„æ•ˆæžœã€‚如果å¯èƒ½çš„è¯ä‹Éç”¨å±žæ€§çš„æ–¹å¼æ˜¯æ¯”较åˆç†çš„。属性和æ–ÒŽ³•çš„ä¸åŒç‚¹åœ¨äºŽä½ èƒ½å¤Ÿç»™ä¸€ä¸ªæ–¹æ³•æŒ‡å®šä¸€ä¸ªå‚æ•°åˆ—表ã€?
æ£å¼referenceæ ‡è®°
referenceçš„æ£æ˜¯æ ¼å¼å¦‚下:
${mudSlinger} å˜é‡
${customer.Address} 属�
${purchase.getTotal()} æ–ÒŽ³•
éžæ£æ˜¯æ ¼å¼æ›´è§å¸¸ç”¨ï¼Œä½†æ˜¯æœ‰æ—¶˜q˜æ˜¯ä½¿ç”¨æ£æ˜¯æ ¼å¼æ¯”较适åˆã€‚ä¾‹å¦‚ï¼šä½ å¸Œæœ›é€šè¿‡ä¸€ä¸ªå˜é‡?viceæ¥åЍæ€çš„¾l„织一个嗽W¦ä¸²ã€?
Jack is a $vicemaniac.
本æ¥å˜é‡æ˜?vice现在å´å˜æˆäº†$vicemaniacåQŒè¿™æ ·Veloctiyž®×ƒ¸çŸ¥é“您到底è¦ä»€ä¹ˆäº†ã€‚æ‰€ä»¥ï¼Œåº”è¯¥ä½¿ç”¨æ£æ˜¯æ ¼å¼ä¹¦å†™
Jack is a ${vice}maniac
现在Velocity知é“å˜é‡æ˜?viceè€Œä¸æ˜?vicemaniacã€?
Quiet reference notation
例如åQ?
<input type=”text” name=”email” value=”$email” />
当页é¢çš„form被åˆå§‹åŠ è½½æ—¶åQŒå˜é‡?email˜q˜æ²¡æœ‰å€û|¼Œ˜q™æ—¶ä½ 肯定是希望它能够显½CÞZ¸€ä¸ªblank textæ¥ä»£æ›¿è¾“å‡?#8221;$email”˜q™æ ·çš„å—ŒDüc€‚那么ä‹É用quiet reference notationž®±æ¯”较åˆé€‚ã€?
<input type=”text” name=”email” value=”$!email”/>
˜q™æ ·æ–‡æœ¬æ¡†çš„åˆå§‹å€¼å°±ä¸ä¼šæ˜¯email而是½Iºå€égº†ã€?
æ£å¼å’Œquietæ ¼å¼çš„reference notation也å¯ä¸€åŒä‹É用,åƒä¸‹é¢è¿™æ øP¼š
<input type=”text” name=”email” value=”$!{email}”/>
Getting literal
Velocity使用ç‰ÒŽ®Šå—符$å’?æ¥å¸®åŠ©å®ƒå·¥ä½œåQŒæ‰€ä»¥å¦‚æžœè¦åœ¨template里ä‹É用这些特ŒDŠå—½W¦è¦æ ¼å¤–ž®å¿ƒã€‚本节将讨论$å—符ã€?
è´§å¸å—符
在VTLä¸ä‹Éç”?2.5˜q™æ ·çš„è´§å¸æ ‡è¯†æ˜¯æ²¡æœ‰é—®é¢˜å¾—çš„åQŒVTLä¸ä¼šž®†å®ƒé”™è®¤ä¸ºæ˜¯ä¸€ä¸ªreferenceåQŒå› 为VTLä¸çš„referenceæ€ÀL˜¯ä»¥ä¸€ä¸ªå¤§å†™æˆ–者å°å†™çš„å—æ¯å¼€å§‹ã€?
Escaping valid VTL reference
VTLä¸ä‹Éç”?#8220;"”ä½œäØ“é€ƒé€¸ç¬¦ã€?
例如åQ?
#set( $email = “foo” )
$email
"$email
""$email
"""$email
ž®†render为:
foo
$email
"foo
""$email
如果emailå˜é‡æ²¡æœ‰è¢«å®šä¹‰åˆ™
$email
"$email
""$email
"""$email
ž®†è¢«render为:
$email
"$email
""$email
"""$email
注æ„åQšVTL䏿œªè¢«å®šä¹‰çš„å˜é‡ž®†è¢«è®¤äؓ是一个嗽W¦ä¸²åQŒæ‰€ä»¥ä»¥ä¸‹ä¾‹å:
#set( $foo = “gibbous” )
$moon = $foo
的输出结果是åQ?
$moon = gibbous
Case substitution
çŽ°åœ¨ä½ å·²¾l对referenceæ¯”è¾ƒç†Ÿæ‚‰äº†ï¼Œä½ å¯ä»¥å°†ä»–ä»¬é«˜æ•ˆçš„åº”ç”¨äºŽä½ çš„template了。Velocity利用了很多java规范以方便了设计人员的ä‹É用。例如:
$foo
$foo.getBar()
## is the same as
$foo.Bar
$data.getUser(“jon”)
## is the same as
$data.User(“jon”)
$data.getRequest().getServerName()
# is the same as
$data.Request.ServerName
## is the same as
${data.Request.ServerName}
但是åQŒæ³¨æ„VTLä¸ä¸ä¼šå°†reference解释为对象的实例å˜é‡ã€‚例如:$foo.Namež®†è¢«è§£é‡Šä¸ºFoo对象的getNameåQˆï¼‰æ–ÒŽ³•åQŒè€Œä¸æ˜¯Foo对象的Name实例å˜é‡ã€?
Directives
Referenceå…许设计者ä‹É用动æ€çš„内容åQŒè€Œdirectiveä½¿å¾—ä½ å¯ä»¥åº”用javaä»£ç æ¥æŽ§åˆ¶ä½ 的显½Cºé€»è¾‘åQŒä»Žè€Œè¾¾åˆîC½ 所期望的显½Cºæ•ˆæžœã€?
#set
#set directive被用于设¾|®ä¸€ä¸ªreference的倹{€‚例如:
#set ( $primate = “monkey” )
#set ( $customer.Behavior = $primate )
赋值左侧的åQˆLHSåQ‰å¿…™åÀL˜¯ä¸€ä¸ªå˜é‡æˆ–者属性reference。å³ä¾§ï¼ˆRHSåQ‰å¯ä»¥æ˜¯ä»¥ä¸‹¾cÕdž‹ä¸ä¸€¿U:
l å˜é‡reference
l String literal
l 属性reference
l æ–ÒŽ³•reference
l number literal
l ArrayList
䏋颿˜¯åº”用儿U类型的RHS的例å:
åQƒset ( $monkey = $bill ) ##å˜é‡reference
åQƒset ( $monkey.Friend = “monica” ) ##String literal
åQƒset ( $monkey.Blame = $whitehouse.Leak )##属性reference
åQƒset ( $monkey.Plan = $spindoctor.weave($web) )##æ–ÒŽ³•reference
åQƒset ( $monkey.Number = 123 )##Number literal
åQƒset ( $monkey.Say = [“Not”, $my, “fault”] )##ArrayList
注æ„åQšæœ€åŽä¸€ä¸ªä¾‹åçš„å–å€¼æ–¹æ³•äØ“åQ?monkey.Say.get(0)
RHS也å¯ä»¥æ˜¯ä¸€ä¸ªç®€å•çš„½Ž—术表达å¼ï¼š
#set ( $value = $foo + 1 )
#set ( $value = $bar -1 )
#set ( $value = $foo * $bar )
#set ( $value = $foo / $bar )
å¦‚æžœä½ çš„RHS是一个nullåQŒVTL的处ç†å°†æ¯”较ç‰ÒŽ®ŠåQšå®ƒž®†æŒ‡å‘一个已¾lå˜åœ¨çš„referenceåQŒè¿™å¯¹åˆå¦è€…æ¥è®²å¯èƒ½æ˜¯æ¯”较费解的。例如:
#set ( $resut = $query.criteria(“name”) )
The result of the first query is $result
#set ( $resut = $query.criteria(“address”) )
The result of the second query is $result
如果$query.criteria(“name”)˜q”回一ä¸?#8220;bill”åQŒè€?query.criteria(“address”)˜q”回的是nullåQŒåˆ™æ˜„¡¤ºçš„结果如下:
The result of the first query is bill
The result of the first query is bill
看看下é¢çš„例å:
#set( $criteria = ["name", "address"] )
#foreach( $criterion in $criteria )
#set( $result = $query.criteria($criterion) )
#if( $result )
Query was successful
#end
#end
在上é¢çš„例åä¸ï¼Œ½E‹åºž®†ä¸èƒ½æ™ºèƒ½çš„æ ÒŽ®$resultçš„å€¼å†³å®šæŸ¥è¯¢æ˜¯å¦æˆåŠŸã€‚åœ¨$resultè¢?setåŽï¼ˆadded to the
contextåQ‰ï¼Œå®ƒä¸èƒ½è¢«è®„¡½®å›žnullåQˆremoved from the
contextåQ‰ã€‚打å°çš„¾l“æžœž®†æ˜¾½CÞZ¸¤‹Æ¡æŸ¥è¯¢ç»“果都æˆåŠŸäº†ï¼Œä½†æ˜¯å®žé™…ä¸Šæœ‰ä¸€ä¸ªæŸ¥è¯¢æ˜¯å¤ÞpÓ|çš„ã€?
ä¸ÞZº†è§£å†³ä»¥ä¸Šé—®é¢˜æˆ‘们å¯ä»¥é€šè¿‡é¢„先定义的方å¼ï¼š
#set( $criteria = [“name”, “address”] )
#foreach( $criterion in $criteria )
#set( $result = false )
#set( $result = $query.criteria( $criterion ) )
#if( $result )
Query was successful
#end
#end
String Literals
å½“ä½ ä½¿ç”¨#set directiveåQŒString literalž®é—在一对åŒå¼•å·å†…ã€?
#set ( $directoryRoot = “www” )
#set ( $templateName = “index.vm” )
#set ( $template = “$directoryRoot/$tempateName” )
$template
上题q™æ®µä»£ç çš„è¾“å‡ºç»“æžœäØ“åQšwww/index.vm
但是åQŒå½“string literal被å°è£…在å•引å·å†…æ—Óž¼Œå®ƒå°†ä¸è¢«è§£æžåQ?
#set ( $foo = “bar” )
$foo
#set ( $blargh = ‘$foo’ )
¾l“æžœåQ?
bar
$foo
上题q™ä¸ªç‰ÒŽ€§å¯ä»¥é€šè¿‡ä¿®æ”¹velocity.propertiesæ–‡äšgçš„stringliterals.interpolate = falseçš„å€¼æ¥æ”¹å˜ä¸Šé¢çš„ç‰¹æ€§æ˜¯å¦æœ‰æ•ˆã€?
æ¡äšgè¯å¥
if/elseif/else
当一个web™åµé¢è¢«ç”Ÿæˆæ—¶ä½¿ç”¨Velocityçš?if directriveåQŒå¦‚æžœæ¡ä»¶æˆç«‹çš„è¯å¯ä»¥åœ¨™åµé¢å†…嵌入文å—。例如:
#if ( $foo )
<strong>Velocity!</strong>
#end
上例ä¸çš„æ¡äšgè¯å¥ž®†åœ¨ä»¥ä¸‹ä¸¤ç§æ¡äšg下æˆç«‹ï¼š
l $foo是一个boolean型的å˜é‡åQŒä¸”它的å€égØ“true
l $fooå˜é‡çš„å€ég¸ä¸ºnull
˜q™é‡Œéœ€è¦æ³¨æ„一点:Velocity context仅仅能够包å«å¯¹è±¡åQŒæ‰€ä»¥å½“我们è¯?#8220;boolean”时实际上代表的时一个Boolean对象。å³ä¾¿æŸä¸ªæ–¹æ³•返回的是一个booleanå€û|¼ŒVelocityä¹Ÿä¼šåˆ©ç”¨å†…çœæœºåˆ¶ž®†å®ƒè½¬æ¢ä¸ÞZ¸€ä¸ªBoolean的相åŒå€¹{€?
如果æ¡äšgæˆç«‹åQŒé‚£ä¹?ifå’?end之间的内容将被显½Cºã€?
#elseifå’?elseå…ƒç´ å¯ä»¥å?if一åŒä‹É用。例如:
#if( $foo < 10 )
<strong> Go North </strong>
#elseif( $foo == 10 )
<strong> Go East </strong>
#elseif( $foo == 6 )
<strong> Go South </strong>
#else
<strong> Go West </strong>
#end
注愘q™é‡Œçš„Velocityçš„æ•°å—æ˜¯ä½œäØ“Integeræ¥æ¯”较的――其他类型的对象ž®†ä‹Éå¾—æ¡ä»¶äØ“falseåQŒä½†æ˜¯ä¸Žjavaä¸åŒå®ƒä‹Éç”?#8220;åQï¼”æ¥æ¯”较两个å€û|¼Œè€Œä¸”velocityè¦æ±‚½{‰å·ä¸¤è¾¹çš„值类型相åŒã€?
关系ã€é€»è¾‘˜qç®—½W?
Velocityä¸ä‹É用ç‰åäh“作符判æ–两个å˜é‡çš„å…³¾p…R€‚例如:
#set ( $foo = “deoxyribonucleic acid” )
#set ( $bar = “ribonucleic acid” )
#if ( $foo == $foo )
In this case it’s clear they aren’t equivalent.So…
#else
They are not equivalent and this will be the output.
#end
Velocity有ANDã€ORå’ŒNOT逻辑˜qç®—½W¦ã€‚䏋颿˜¯ä¸€äº›ä¾‹å:
## logical AND
#if( $foo && $bar )
<strong> This AND that </strong>
#end
## logical OR
#if ( $foo || $bar )
<strong>This OR That </strong>
#end
##logical NOT
#if ( !$foo )
<strong> NOT that </strong>
#end
循环
Foreach循环
例ååQ?
<ul>
#foreach ( $product in $allProducts )
<li> $product </li>
#end
</ul>
æ¯æ¬¡å¾ªçޝ$allProductsä¸çš„一个值都会赋¾l?productå˜é‡ã€?
$allProductså¯ä»¥æ˜¯ä¸€ä¸ªVectorã€Hashtable或者Array。分é…ç»™$product的值是一个java对象åQŒåƈ且å¯ä»?
通过å˜é‡è¢«å¼•用。例如:如果$product是一个javaçš„Product¾c»ï¼Œòq¶ä¸”˜q™ä¸ªäº§å“çš„åå—å¯ä»¥é€šè¿‡è°ƒç”¨ä»–çš„getNameåQˆï¼‰æ–ÒŽ³•得到ã€?
现在我们å‡è®¾$allProducts是一个HashtableåQŒå¦‚æžœä½ å¸Œæœ›å¾—åˆ°å®ƒçš„key应该åƒä¸‹é¢è¿™æ øP¼š
<ul>
#foreach ( $key in $allProducts.keySet() )
<li>Key: $key -> Value: $allProducts.get($key) </li>
#end
</ul>
Velocity˜q˜ç‰¹åˆ«æä¾›äº†å¾—到循环‹Æ¡æ•°çš„æ–¹æ³•ï¼Œä»¥ä¾¿ä½ å¯ä»¥åƒä¸‹é¢˜q™æ ·ä½œï¼š
<table>
#foreach ( $customer in $customerList )
<tr><td>$velocityCount</td><td>$customer.Name</td></tr>
#end
</table>
$velocityCountå˜é‡çš„åå—æ˜¯Velocity默认的åå—ï¼Œä½ ä¹Ÿå¯ä»¥é€šè¿‡ä¿®æ”¹velocity.propertiesæ–‡äšgæ¥æ”¹å˜å®ƒã€?
默认情况下,计数ä»?#8220;1”å¼€å§‹ï¼Œä½†æ˜¯ä½ å¯ä»¥åœ¨velocity.properties讄¡½®å®ƒæ˜¯ä»?#8220;1”˜q˜æ˜¯ä»?#8220;0”开始。下é¢å°±æ˜¯æ–‡ä»¶ä¸çš„é…¾|®ï¼š
# Default name of loop counter
# variable reference
directive.foreach.counter.name = velocityCount
# Default starting value of the loop
# counter variable reference
directive.foreach.counter.initial.value = 1
include
#include script elementå…许模æ¿è®¾è®¡è€…引入本地文件。被引入文äšg的内容将ä¸ä¼šé€šè¿‡æ¨¡æ¿å¼•擎被renderã€‚äØ“äº†å®‰å…¨çš„åŽŸå› åQŒè¢«å¼•入的本地文件åªèƒ½åœ¨TEMPLATE_ROOT目录下ã€?
#inclued ( “one.txt” )
如果您需è¦å¼•入多个文ä»Óž¼Œå¯ä»¥ç”¨é€—å·åˆ†éš”ž®Þp¡ŒåQ?
#include ( “one.gif”, “two.txt”, “three.htm” )
在括å·å†…å¯ä»¥æ˜¯æ–‡ä»¶ååQŒä½†æ˜¯æ›´å¤šçš„æ—¶å€™æ˜¯ä½¿ç”¨å˜é‡çš„:
#inclue ( “greetings.txt”, $seasonalstock )
parse
#parse script elementå…许模æ¿è®¾è®¡è€…一个包å«VTL的本地文件。Velocityž®†è§£æžå…¶ä¸çš„VTLòq¶render模æ¿ã€?
#parse( “me.vm” )
ž®±åƒ#includeåQ?parse接å—一个å˜é‡è€Œä¸æ˜¯ä¸€ä¸ªæ¨¡æÑ€‚ä“Q何由#parse指å‘的模æ‰Kƒ½å¿…须包å«åœ¨TEMPLATE_ROOT目录下。与#includeä¸åŒçš„æ˜¯åQ?parseåªèƒ½æŒ‡å®šå•个对象ã€?
ä½ å¯ä»¥é€šè¿‡ä¿®æ”¹velocity.propertiesæ–‡äšgçš„parse_direcive.maxdepthçš„å€¼æ¥æŽ§åˆ¶ä¸€ä¸ªtemplateå¯ä»¥åŒ…å«çš„æœ€å¤?parse的个数――默认值是10ã€?parse是å¯ä»¥é€’归调用的,例如åQšå¦‚æžœdofoo.vm包å«å¦‚下行:
Count down.
#set ( $count = 8 )
#parse ( “parsefoo.vm” )
All done with dofoo.vm!
那么在parsefoo.vm模æ¿ä¸ï¼Œä½ å¯ä»¥åŒ…å«å¦‚下VTLåQ?
$count
#set ( $count = $count – 1 )
#if ( $count > 0 )
#parse( “parsefoo.vm” )
#else
All done with parsefoo.vm!
#end
的显½Cºç»“æžœäØ“åQ?
Count down.
8
7
6
5
4
3
2
1
0
All done with parsefoo.vm!
All done with dofoo.vm!
Stop
#stop script elementå…许模æ¿è®¾è®¡è€…åœæ¢æ‰§è¡Œæ¨¡æ¿å¼•æ“ŽåÆˆ˜q”回。把它应用于debug是很有帮助的ã€?
#stop
Velocimacros
#macro script elementå…许模æ¿è®¾è®¡è€…定义一ŒDµå¯é‡ç”¨çš„VTL template。例如:
#macro ( d )
<tr><td></td></tr>
#end
在上é¢çš„例åä¸Velocimacroè¢«å®šä¹‰äØ“dåQŒç„¶åŽä½ ž®±å¯ä»¥åœ¨ä»ÖM½•VTL directiveä¸ä»¥å¦‚下方å¼è°ƒç”¨å®ƒï¼š
#d()
å½“ä½ çš„template被调用时åQŒVelocityž®†ç”¨<tr><td></td></tr>替æ¢ä¸?d()ã€?
æ¯ä¸ªVelocimacroå¯ä»¥æ‹¥æœ‰ä»ÀL„æ•°é‡çš„傿•°â€•―甚è‡?ä¸ªå‚æ•ŽÍ¼Œè™½ç„¶å®šä¹‰æ—¶å¯ä»¥éšæ„设¾|®å‚æ•°æ•°é‡ï¼Œä½†æ˜¯è°ƒç”¨˜q™ä¸ªVelocimacroæ—¶å¿…™åÀLŒ‡å®šæ£¼‹®çš„傿•°ã€‚䏋颿˜¯ä¸€ä¸ªæ‹¥æœ‰ä¸¤ä¸ªå‚æ•°çš„VelocimacroåQŒä¸€ä¸ªå‚数是colorå¦ä¸€ä¸ªå‚数是arrayåQ?
#macro ( tablerows $color $somelist )
#foreach ( $something in $somelist )
<tr><td bgcolor=$color>$something</td</tr>
#end
#end
调用#tablerows VelocimacroåQ?
#set ( $greatlakes = [ “Superior”, “Michigan”, “Huron”, “Erie”, “Ontario” ] )
#set ( $color = “blue” )
<table>
#tablerows( $color $greatlakes )
</table>
¾l过以上的调用将产生如下的显½Cºç»“果:
<table>
<tr><td bgcolor=” blue”> Superior </td></tr>
<tr><td bgcolor=” blue”> Michigan </td></tr>
<tr><td bgcolor=” blue”> Huron </td></tr>
<tr><td bgcolor=” blue”> Erie </td></tr>
<tr><td bgcolor=” blue”> Ontario </td></tr>
</table>
Velocimacroså¯ä»¥åœ¨Velocity模æ¿å†…实现行内定义(inlineåQ‰ï¼Œä¹Ÿå°±æ„味ç€åŒä¸€ä¸ªweb
site内的其他Velocity模æ¿ä¸å¯ä»¥èŽ·å¾—Velocimacros的定义。定义一个å¯ä»¥è¢«æ‰€æœ‰æ¨¡æ¿å…±äº«çš„Velocimacro昄¡„¶æ˜¯æœ‰å¾ˆå¤šå¥½å¤„
的:它凞®‘äº†åœ¨ä¸€å¤§å †æ¨¡æ¿ä¸é‡å¤å®šä¹‰çš„æ•°é‡ã€èŠ‚çœäº†å·¥ä½œæ—‰™—´ã€å‡ž®‘äº†å‡ºé”™çš„å‡ çŽ‡ã€ä¿è¯äº†å•点修改ã€?
上é¢å®šä¹‰çš?tablerows( $color $list
)Velocimacro被定义在一个Velocimacros模æ¿åº?在velocity.propertiesä¸å®šä¹?里,所以这个macroå¯ä»¥åœ?
ä»ÖM½•规范的模æ¿ä¸è¢«è°ƒç”¨ã€‚它å¯ä»¥è¢«å¤š‹Æ¡åº”ç”¨åÆˆä¸”å¯ä»¥åº”用于ä¸åŒçš„目的。例如下é¢çš„调用åQ?
#set ( $parts = [ “volva”, “stipe”, “annulus”, “gills”, “pileus” ] )
#set ( $cellbgcol = “#CC00FF” )
<table>
#tablerows( $cellbgcol $parts )
</table>
上é¢VTLž®†äñ”生如下的输出åQ?
<table>
<tr><td bgcolor=”#CC00FF”> volva </td</tr>
<tr><td bgcolor=”#CC00FF”> stipe </td</tr>
<tr><td bgcolor=”#CC00FF”> annulus </td</tr>
<tr><td bgcolor=”#CC00FF”> gills </td</tr>
<tr><td bgcolor=”#CC00FF”> pileus </td</tr>
</table>
Velocimacro arguments
Velocimacroå¯ä»¥ä½¿ç”¨ä»¥ä¸‹ä»ÖM½•å…ƒç´ ä½œäØ“å‚æ•°åQ?
l ReferenceåQšä“Q何以$开头的reference
l String literalåQ?
l Number literalåQ?
l IntegerRangeåQš[1….3]或者[$foo….$bar]
l 对象数组åQš[“a”,”b”,”c”]
l booleanå€û|¼štrueã€false
当将一个referenceä½œäØ“å‚æ•°ä¼ 递给Velocimacroæ—Óž¼Œè¯äh³¨æ„referenceä½œäØ“å‚æ•°æ—¶æ˜¯ä»¥åå—的形å¼ä¼ 递的。这ž®±æ„味ç€å‚æ•°
çš„å€¼åœ¨æ¯æ¬¡Velocimacro内执行时æ‰ä¼šè¢«äñ”生。这个特性ä‹Éå¾—ä½ å¯ä»¥ž®†ä¸€ä¸ªæ–¹æ³•è°ƒç”¨ä½œä¸ºå‚æ•îC¼ 递给VelocimacroåQŒè€Œæ¯‹Æ?
Velocimacro执行旉™ƒ½æ˜¯é€šè¿‡˜q™ä¸ªæ–ÒŽ³•调用产生ä¸åŒçš„å€¼æ¥æ‰§è¡Œçš„。例如:
#macro ( callme $a )
$a $a $a
#end
#callme( $foo.bar() )
执行的结果是åQšreference $fooçš„baråQˆï¼‰æ–ÒŽ³•被执行了三次ã€?
å¦‚æžœä½ ä¸éœ€è¦è¿™æ ïLš„ç‰ÒŽ€§å¯ä»¥é€šè¿‡ä»¥ä¸‹æ–ÒŽ³•åQ?
#set ( $myval = $foo.bar() )
#callme ( $myval )
Velocimacro properties
Velocity.propertiesæ–‡äšgä¸çš„æŸå‡ è¡Œèƒ½å¤Ÿä‹ÉVelocimacrosçš„å®žçŽ°æ›´åŠ çµ‹z…R€‚æ³¨æ„æ›´å¤šçš„内容å¯ä»¥çœ‹Developer Guideã€?
Velocity.propertiesæ–‡äšgä¸çš„velocimacro.libraaryåQšä¸€ä¸ªä»¥é€—å·åˆ†éš”的模æ¿åº“列表。默认情况下åQŒvelocity查找唯一的一个库åQšVM_global_library.vmã€‚ä½ å¯ä»¥é€šè¿‡é…ç½®˜q™ä¸ªå±žæ€§æ¥æŒ‡å®šè‡ªå·±çš„æ¨¡æ¿åº“ã€?
Velocity.propertiesæ–‡äšgä¸çš„velocimacro.permissions.allow.inline属性:有两个å¯é€‰çš„
值true或者falseåQŒé€šè¿‡å®ƒå¯ä»¥ç¡®å®šVelocimacros是å¦å¯ä»¥è¢«å®šä¹‰åœ¨regular
template内。默认值是ture――å…许设计者在他们自己的模æ¿ä¸å®šä¹‰Velocimacrosã€?
Velocity.propertiesæ–‡äšgä¸çš„
velocimacro.permissions.allow.inline.replace.global属性有两个å¯é€‰å€¼trueå’?
falseåQŒè¿™ä¸ªå±žæ€§å…è®æ€‹É用者确定inlineçš„Velocimacro定义是å¦å¯ä»¥æ›¿ä»£å…¨å±€Velocimacro定义åQˆæ¯”如在
velocimacro.libraryå±žæ€§ä¸æŒ‡å®šçš„æ–‡ä»¶å†…定义的VelocimacroåQ‰ã€‚默认情况下åQŒæ¤å€égØ“falseã€‚è¿™æ ·å°±é˜ÀL¢æœ¬åœ°
Velocimacro定义覆盖全局定义�
Velocity.propertiesæ–‡äšgä¸çš„
velocimacro.permissions.allow.inline.local.scale属性也是有trueå’Œfalse两个å¯é€?
å€û|¼Œé»˜è®¤æ˜¯false。它的作用是用于¼‹®å®šä½ inline定义的Velocimacros是å¦ä»…仅在被定义的template内å¯è§ã€‚æ¢å¥è¯è¯ß_¼Œå¦‚æžœ˜q™ä¸ª
属性设¾|®äØ“trueåQŒä¸€ä¸ªinline定义的Velocimacrosåªèƒ½åœ¨å®šä¹‰å®ƒçš„template内ä‹Éç”¨ã€‚ä½ å¯ä»¥ä½¿ç”¨æ¤è®¾¾|®å®žçŽîC¸€ä¸ªå¥‡å¦™çš„VMæ•?
门:a template can define a private implementation of the second VM that
will be called by the first VM when invoked by that template. All other
templates are unaffected�
Velocity.propertiesæ–‡äšgä¸çš„velocimacro.context.localscope属性有trueå’Œfalse两个
å¯é€‰å€û|¼Œé»˜è®¤å€égØ“false。当讄¡½®ä¸ºtrueæ—Óž¼Œä»ÖM½•在Velocimacro内通过#set()对contextçš„ä¿®æ”¹è¢«è®¤äØ“æ˜¯é’ˆå¯Òޤ
velocimacro的本地设¾|®ï¼Œè€Œä¸ä¼šæ°¸ä¹…的影å“内容ã€?
Velocity.propertiesæ–‡äšgä¸çš„velocimacro.library.autoreload属性控制Velocimacro
åº“çš„è‡ªåŠ¨åŠ è²ã€‚默认是false。当讄¡½®ä¸ºtureæ—Óž¼Œå¯¹äºŽä¸€ä¸ªVelocimacro的调用将自动‹‚€æŸ¥åŽŸå§‹åº“æ˜¯å¦å‘生了å˜åŒ–,如果å˜åŒ–ž®†é‡æ–°åŠ è½½å®ƒã€‚è¿™
个属性ä‹Éå¾—ä½ å¯ä»¥ä¸ç”¨é‡æ–°å¯åЍservletå®¹å™¨è€Œè¾¾åˆ°é‡æ–°åŠ è½½çš„æ•ˆæžœåQŒå°±åƒä½ 使用regular模æ¿ä¸€æ —÷€‚这个属性å¯ä»¥ä‹Éç”¨çš„å‰æž®±æ˜¯resource
loader¾~“å˜æ˜¯off状æ€ï¼ˆfile.resource.loader.cache = falseåQ‰ã€‚注æ„这个属性实际上是针对开å‘而éžäº§å“çš„ã€?
Velocimacro Trivia
Velocimacro必须被定义在他们被ä‹É用之å‰ã€‚也ž®±æ˜¯è¯ß_¼Œä½ çš„#macro()声明应该出现在ä‹É用Velocimacros之å‰ã€?
ç‰¹åˆ«è¦æ³¨æ„çš„æ˜¯ï¼Œå¦‚æžœä½ è¯•å›?parse()一个包å?macro()的模æÑ€‚å› ä¸?parse()å‘生在è¿è¡ŒæœŸåQŒä½†æ˜¯è§£æžå™¨åœ?
parsetiem军_®šä¸€ä¸ªçœ‹ä¼¼VMå…ƒç´ çš„å…ƒç´ æ˜¯å¦æ˜¯ä¸€ä¸ªVMå…ƒç´ åQŒè¿™æ ?parse()-ing一¾l„VM声明ž®†ä¸æŒ‰ç…§é¢„æœŸçš„æ ·åå·¥ä½œã€‚äØ“äº†å¾—åˆ°é¢„æœŸçš„¾l?
果,åªéœ€è¦ä½ ½Ž€å•的使用velocimacro.library使得Velocity在å¯åŠ¨æ—¶åŠ è²ä½ çš„VMsã€?
Escaping VTL directives
VTL directives can be escaped with “"”åøP¼Œä½¿ç”¨æ–¹å¼è·ŸVTLçš„referenceä½¿ç”¨é€ƒé€¸ç¬¦çš„æ ¼å¼å·®ä¸å¤šã€?
## #include( “a.txt” ) renders as <ontents of a.txt>(注释è¡?
#include( “a.txt” )
## "#include( “a.txt” ) renders as "#include( “a.txt” )
"#include( “a.txt” )
## ""#include ( “a.txt” ) renders as "<contents of a.txt>
""#include( “a.txt” )
在对在一个directive内包å«å¤šä¸ªscriptå…ƒç´ çš„VTL directives使用逃逸符时è¦ç‰¹åˆ«ž®å¿ƒåQˆæ¯”如在一个if-else-end statementå†…ï¼‰ã€‚ä¸‹é¢æ˜¯VTLçš„if-statement的典型应用:
#if ( $jazz )
Vyacheslav Ganelin
#end
如果$jazz是tureåQŒè¾“出将是:
Vyacheslav Ganelin
如果$jazz是falseåQŒå°†æ²¡æœ‰è¾“出。ä‹É用逃逸符ž®†æ”¹å˜è¾“出。考虑一下下é¢çš„æƒ…况åQ?
"#if ( $jazz )
Vyacheslav Ganelin
"#end
çŽ°åœ¨æ— è®º$jazz是true˜q˜æ˜¯falseåQŒè¾“出结果都是:
#if ( $jazz )
Vyacheslav Ganelin
#end
事实上,ç”׃ºŽä½ ä‹É用了逃逸符åQ?jazzæ ÒŽœ¬ž®±æ²¡æœ‰è¢«è§£æžä¸ºboolean型倹{€‚在逃逸符å‰ä‹Éç”¨é€ƒé€¸ç¬¦æ˜¯åˆæ³•çš„åQŒä¾‹å¦‚:
""#if ( $jazz )
Vyacheslav Ganelin
""#end
以上½E‹åºçš„æ˜¾½Cºç»“æžœäØ“åQ?
" Vyacheslav Ganelin
但是如果$jazz为falseåQŒé‚£ä¹ˆå°†æ²¡æœ‰è¾“出。(书上说会没有输出åQŒä½†æ˜¯æˆ‘觉得应该˜q˜æœ‰æœ?#8220;"”å—符被输出。)
VTLåQšFormatting issues
ž®½ç®¡åœ¨æ¤ç”¨æˆ·æ‰‹å†Œä¸VTL通常都开始一个新行,如下所½Cºï¼š
#set ( $imperial = [ “Munetaka”, “Koreyasu”, “Hisakira”, “Morikune” ] )
#foreach ( $shogun in $imperial )
$shogun
#end
但是åƒä¸‹é¢è¿™¿U写法也是å¯ä»¥çš„åQ?
Send me #set($foo = [“$10 and”,”a cake”])#foreach($a in $foo)$a #end please.
上é¢çš„代ç å¯ä»¥è¢«æ”¹å†™ä¸ºï¼š
Send me
#set ( $foo = [“$10 and “,”a cake”] )
#foreach ( $a in $foo )
$a
#end
please.
或�
Send me
#set($foo = [“$10 and “,”a cake”])
#foreach åQ?a in $foo åQ?a
#end please.
˜q™ä¸¤¿U的输出¾l“æž„ž®†ä¸€æ —÷€?
å…¶ä»–ç‰ÒŽ€§å’Œæ‚项
math 在模æ¿ä¸å¯ä»¥ä½¿ç”¨Velocity内å¾çš„算术函敎ͼŒå¦‚ï¼šåŠ ã€å‡ã€ä¹˜ã€é™¤
#set ( $foo = $bar + 3 )
#set ( $foo = $bar - 4 )
#set ( $foo = $bar * 6 )
#set ( $foo = $bar / 2 )
当执行除法时ž®†è¿”回一个Integer¾cÕdž‹çš„结果。而余æ•îC½ å¯ä»¥ä½¿ç”¨%æ¥å¾—刎ͼš
#set ( $foo = $bar % 5 )
在Velocity内ä‹É用数å¦è®¡½Ž—公弿—¶åQŒåªèƒ½ä‹É用åƒ-n,-2,-1,0,1,2,n˜q™æ ·çš„æ•´æ•ŽÍ¼Œè€Œä¸èƒ½ä‹É用其它类型数æ®ã€‚å½“ä¸€ä¸ªéžæ•´åž‹çš„对象被使用时它ž®†è¢«loggedòq¶ä¸”ž®†ä»¥nullä½œäØ“è¾“å‡º¾l“æžœã€?
Range Operator
Range operatorå¯ä»¥è¢«ç”¨äºŽä¸Ž#setå’?foreach statementè”åˆä½¿ç”¨ã€‚对于处ç†ä¸€ä¸ªæ•´åž‹æ•°¾l„它是很有用的,Range operatorå…ähœ‰ä»¥ä¸‹æž„é€ åÅžå¼ï¼š
[n..m]
må’Œn都必™åÀL˜¯æ•´åž‹åQŒè€Œm是å¦å¤§äºŽnåˆ™æ— å…³ç´§è¦ã€‚例å:
First example:
#foreach ( $foo in [1..5] )
$foo
#end
Second example:
#foreach ( $bar in [2..-2] )
$bar
#end
Third example:
#set ( $arr = [0..1] )
#foreach ( $i in $arr )
$i
#end
Fourth example:
[1..3]
上é¢å››ä¸ªä¾‹åçš„è¾“å‡ºç»“æžœäØ“åQ?
First exampleåQ?
1 2 3 4 5
Second exampleåQ?
2 1 0 -1 -2
Third exampleåQ?
0 1
Fourth exampleåQ?
[1..3]
注æ„åQšrange operatoråªåœ¨#setå’?foreach䏿œ‰æ•ˆã€?
Advanced IssueåQšEscaping andåQ?
当一个referenceè¢?#8220;åQ?#8221;分隔æ—Óž¼Œòq¶ä¸”åœ¨å®ƒä¹‹å‰æœ‰é€ƒé€¸ç¬¦æ—Óž¼Œreferencež®†ä»¥ç‰ÒŽ®Šçš„æ–¹å¼å¤„ç†ã€‚注æ„è¿™¿Uæ–¹å¼ä¸Žæ ‡å‡†çš„é€ƒé€¸æ–¹å¼æ—¶ä¸åŒçš„。对照如下:
#set ( $foo = “bar” )
ç‰ÒŽ®Šå½¢å¼ æ ‡å‡†æ ¼å¼
Renderå‰?nbsp; Renderå?nbsp; Renderå‰?nbsp; Renderå?
$"!foo $!foo "$foo "$foo
$"!{foo} $!{foo} "$!foo "$!foo
$""!foo $"!foo "$!{foo} "$!{foo}
$"""!foo $""!foo ""$!{foo} "bar
Velocimacroæ‚è®°
Can I user a directive or another VM as an argument to a VM?
例如åQ?center ( #bold( “hello” ) )
ä¸å¯ä»¥ã€‚一个directiveçš„å‚æ•îC‹É用å¦å¤–一个directive是ä¸åˆæ³•çš„ã€?
但是åQŒè¿˜æ˜¯æœ‰äº›äº‹æƒ…ä½ å¯ä»¥ä½œçš„。最½Ž€å•的方弞®±æ˜¯ä½¿ç”¨åŒå¼•åøP¼š
#set ( $stuff = “#bold( ‘hello’ )” )
#center ( $stuff )
上é¢çš„æ ¼å¼ä¹Ÿå¯ä»¥¾~©å†™ä¸ÞZ¸€è¡Œï¼š
#center ( “#bold( ‘hello’ ) )
è¯äh³¨æ„在下é¢çš„例åä¸å‚数被evaluated在Velocimacro内部åQŒè€Œä¸æ˜¯åœ¨calling level。例å:
#macro ( inner $foo )
inner : $foo
#end
#macro ( outer $foo )
#set ( $bar = “outerlala” )
outer : $foo
#end
#set ( $bar = ‘calltimelala’ )
#outer( “#inner($bar)” )
输出¾l“果为:
outer : inner : outerlala
è®îC½Veloctiyçš„ç‰¹æ€§ï¼šå‚æ•°çš„ä¼ é€’æ˜¯By Name的。例如:
#macro ( foo $color )
<tr bgcolor = $color ><td>Hi</td></tr>
<tr bgcolor = $color ><td>There</td></tr>
#end
#foo ( $bar.rowColor() )
ä»¥ä¸Šä»£ç ž®†å¯¼è‡´rowColor()æ–ÒŽ³•两次调用åQŒè€Œä¸æ˜¯ä¸€‹Æ¡ã€‚äØ“äº†é¿å…è¿™¿U现象的出现åQŒæˆ‘们å¯ä»¥æŒ‰ç…§ä¸‹é¢çš„æ–¹å¼æ‰§è¡ŒåQ?
#set ( $color = $bar.rowColor() )
#foo ( $color )
can I register velocimacros via #parse()?
ç›®å‰åQŒVelocimacros必须在第一‹Æ¡è¢«æ¨¡æ¿è°ƒç”¨å‰è¢«å®šä¹‰ã€‚è¿™ž®±æ„味ç€ä½ çš„#macro()声明应该出现在ä‹É用Velocimacros之å‰ã€?
å¦‚æžœä½ è¯•å›?parse()一个包å?macro()
directive的模æ¿ï¼Œ˜q™ä¸€ç‚ÒŽ˜¯éœ€è¦ç‰¢è®°çš„ã€‚å› ä¸?parse()å‘生在è¿è¡ŒæœŸåQŒä½†æ˜¯è§£æžå™¨åœ¨parsetiem军_®šä¸€ä¸ªçœ‹ä¼¼VMå…ƒç´ çš„å…ƒç´ æ˜¯å¦æ˜¯ä¸€
个VMå…ƒç´ åQŒè¿™æ ?parse()-ing一¾l„VM声明ž®†ä¸æŒ‰ç…§é¢„æœŸçš„æ ·åå·¥ä½œã€‚äØ“äº†å¾—åˆ°é¢„æœŸçš„¾l“æžœåQŒåªéœ€è¦ä½ ½Ž€å•的使用
velocimacro.library使得Velocity在å¯åŠ¨æ—¶åŠ è²ä½ çš„VMsã€?
What is velocimacro autoreloadingåQ?
velocimacro.library.autoreloadæ˜¯ä¸“é—¨äØ“å¼€å‘而éžäº§å“使用的一个属性。æ¤å±žæ€§çš„默认值是falseã€?
String concatenation
å¼€å‘äh员最帔R—®çš„问题是我如何作å—符拼接åQŸåœ¨java䏿˜¯ä½¿ç”¨“åQ?#8221;åäh¥å®Œæˆçš„ã€?
在VTLé‡Œè¦æƒ›_®žçŽ°åŒæ ïLš„åŠŸèƒ½ä½ åªéœ€è¦å°†éœ€è¦è”åˆçš„reference攑ֈ°ä¸€èµ·å°±è¡Œäº†ã€‚例如:
#set ( $size = “Big” )
#set ( $name = “Ben” )
The clock is $size$name.
输出¾l“æžœž®†æ˜¯åQšThe clock is BigBen.。更有趣的情冉|˜¯åQ?
#set ( $size = “Big” )
#set ( $name = “Ben” )
#set ( $clokc = “$size$name” )
The clock is $clock.
ä¸Šä¾‹ä¹Ÿä¼šå¾—åˆ°åŒæ ·çš„结果。最åŽä¸€ä¸ªä¾‹åï¼Œå½“ä½ å¸Œæœ›æ··åˆå›ºå®šå—段åˆîC½ çš„referenceæ—Óž¼Œä½ 需è¦ä‹Éç”¨æ ‡å‡†æ ¼å¼ï¼š
#set ( $size = “Big” )
#set ( $name = “Ben” )
#set ( $clock = “${size}Tall$name” )
The clock is $clock.
输出¾l“果是:The clock is BigTallBen.。ä‹É用这¿Uæ ¼å¼ä¸»è¦æ˜¯ä¸ÞZº†ä½¿å¾—$sizeä¸è¢«è§£é‡Šä¸?sizeTallã€?
]]>
Ö÷Õ¾Ö©Öë³ØÄ£°å£º
ÕÄÆÖÏØ |
ƽÓßÏØ |
ÙñÖÝÊÐ |
ÐÅ·áÏØ |
²ìÑÅÏØ |
¸ÊÂåÏØ |
ÑôÐÂÏØ |
Î÷¹±Çø |
½ÒÑôÊÐ |
·ïɽÊÐ |
±±°²ÊÐ |
ÓÀ¸£ÏØ |
É£ÈÕÏØ |
ÎÚÀÌØÇ°Æì |
ÐËÂ¡ÏØ |
¹ðÑôÏØ |
Ä«ÓñÏØ |
ÁÙ³ÇÏØ |
Ì«¿µÏØ |
»¨Ô«ÏØ |
ºÍÕþÏØ |
¿í³Ç |
аͶû»¢×óÆì |
ʯʨÊÐ |
¿ª½ÏØ |
Æ½Ò£ÏØ |
°×ɽÊÐ |
ƽÏçÏØ |
¿íµé |
½£¸óÏØ |
ÐÂÖ£ÊÐ |
¸ÓÓÜÏØ |
°¢¿ËÌÕÏØ |
ËçµÂÏØ |
çÆÔÆÏØ |
ÕÑËÕÏØ |
½É½ÊÐ |
Á¬ÖÝÊÐ |
ÆÖ½ÏØ |
½ÃÅÊÐ |
ÂåÄÏÏØ |