2011-06-06 78 views
4

是否有可能通過使用#evaluate動態訪問屬性?我爲此提前致歉,但其中大部分只是示例代碼,以充分說明我的問題。速度動態屬性訪問

我有一個偏好類,看起來像這樣:

public class DefaultUserPreferences implements Preferences { 
    //Getters and setters left off for "brevity…" 
    private Panel defaultPanel; 
    private OrderByColumn mostActiveSortOrder; 
    private OrderByColumn recentlyModifiedAccountsSortColumn; 
} 

每種類型的僅僅是一個自定義枚舉。

public enum OrderByColumn { 
    NAME, 
    LAST_ACTIVITY, 
    GROUP 
} 

public enum Panel { 
    MOST_ACTIVE, 
    RECENTLY_MODIFIED; 

    public String getCamelCase() { 
     String[] words = StringUtils.split(this.name(), "_"); 
     String rval = StringUtils.EMPTY; 
     if (words != null && words.length >= 1) { 
      rval = StringUtils.lowerCase(words[0]); 
      for(int i = 1; I < words.length; i++) { 
       rval += StringUtils.capitalize(words[i].toLowerCase()); 
      } 
     } 
     return rval; 
    } 
} 

下面是我想如何顯示的喜好給用戶一個片段,但我似乎無法得到被稱爲吸氣劑(我碰到下面的,如果我評價它得到文本:[email protected]iveSortOrder)

#for ($panel in $Panels) 
    ## The names here are correct 
    #set($selectName = ${panel.CamelCase}SortColumn) 
    #set($dynamicProperty = $preferences.$selectName) 
    <tr> 
     <td>$panel</td> 
     <td> 
      <select name="$selectName"> 
       #for($option in $OrderByColumn) 
        <option value="$option" #if($option == #evaluate($dynamicProperty) selected="selected" #end>$option</option> 
       #end 
     </td> 
    </tr> 
#end 

但是我吸似乎從來沒有對喜好來進行調用。我已經將每個部分都添加到了上下文中,並且沒有任何問題迭代到Panel上,我似乎無法讓語法動態調用屬性上的getter。這可能在1.7嗎?

回答

6

收到此郵件列表。基本上評估只返回一個字符串顯示,而不是返回一個值。因此set字符串在被評估字符串中是必需的。

#set($selectName = "${panel.CamelCase}SortColumn") 
#set($dynamicProp = '#set($selectedPreference = ' + '$preferences.' + $selectName) + ')') 
#evaluate($dynamicProp) 

隨着這些行的運行,我可能會檢查selectedPreference的值與我正在迭代的值。

+0

謝謝。查看指向VelocityTools的FAQ。 http://wiki.apache.org/velocity/VelocityFAQ – Snekse 2012-10-12 18:01:06