在Velocity模板中调用宏功能

时间:2011-08-02 15:12:09

标签: java apache velocity

我试图找出如何从速度宏调用中返回一个值并将其分配给一个可变的

我的宏功能看起来像这样。它曾经的共同共享宏文件

#macro(getBookListLink, $readingTrackerResult)
   $readingTrackerResult.getBookListLink()
#end

我需要将此宏的结果分配给另一个速度模板文件中的变量

我试过这样的事情

#set($book_list_link = #getBookListLink( $readingTrackerResult ))

但没有奏效。我尝试使用#,$并且在函数getBookListLink前面没有任何内容。但没有任何效果。我不能从宏回来吗?我的宏出了什么问题?

但是,如果我在html文件中单独调用#getBookListLink($ readingTrackerResult)。它工作,我可以将结果打印到UI。但无法分配给变量。

6 个答案:

答案 0 :(得分:27)

宏不是功能;它们用于渲染输出。但是,如果您不介意丢失类型并将结果作为文本...

#set( $book_list_link = "#getBookListLink( $readingTrackerResult )" )

答案 1 :(得分:6)

要删除空格和空白行,请使用多行注释(#* comment *#):

#macro( myMacro $param )#*
  *#the_return_value#*
*##end

答案 2 :(得分:1)

最好是通过“引用”传递外部定义的结果变量,而不是使用“返回值”的字符串限制,例如:

#macro(getBookListLink $inTrackerResult $outBookListLink)
    #if ($outBookListLink)
        #set ($outBookListLink = $inTrackerResult.getBookListLink())
    #end
#end

#set ($myLink = "")
#getBookListLink($myTrackerResult $myLink)
myBookListLink = "$myLink"<br/>

答案 3 :(得分:0)

宏参数可以是对象列表。被调用的宏可以从列表中提取每个对象,进行操作,然后调用者将看到更改。

#macro(call $something)
  #set($swallowOutput = $something)
#end

#macro(doSomething $out)
  #set($list=$out.get(0))
  #call($list.add("hallo-1")
  #call($list.add("hallo-2")
#end

#macro(doMoreComplexStuff)
  #set($myList=[])
  #doSomething([$myList])
  MyList now has $myList.size()) elements: $myList
#end

答案 4 :(得分:0)

再举一个例子来说明原理:

宏定义:

#macro ( getValue $flag )
#if ( $flag )
#set($value = "TRUE" )
#else
#set($value = "FALSE" )
#end
${value}## (ends with a comment to avoid "END-OF-LINE" in the resulting string)
#end

调用:

#set($myval = "#getValue( true )" )

答案 5 :(得分:-1)

或者只是将所有内容写在同一行:

#macro( myMacro $param ) the_return_value #end