#java #velocity
#java #скорость
Вопрос:
Возможно ли динамически получать доступ к свойствам с помощью #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 amp;amp; words.length >= 1) {
rval = StringUtils.lowerCase(words[0]);
for(int i = 1; I < words.length; i ) {
rval = StringUtils.capitalize(words[i].toLowerCase());
}
}
return rval;
}
}
Ниже приведен фрагмент того, как я хотел бы отобразить настройки для пользователей, но, похоже, я не могу вызвать средство получения (я получаю следующее, если оцениваю его для получения текста: test.core.model.entities.DefaultUserPreferences@596fde80.mostActiveSortOrder )
#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
Однако мой getter, похоже, никогда не вызывается в настройках. Я добавил каждую из частей в контекст, и у меня не возникает никаких проблем с итерацией по панелям, я просто не могу разобраться с синтаксисом для динамического вызова методов получения в свойствах. Возможно ли это в версии 1.7?
Ответ №1:
Получил это из списка рассылки. В основном evaluate возвращает только строку для отображения вместо возврата значения. Таким образом, директива set требуется внутри вычисляемой строки.
#set($selectName = "${panel.CamelCase}SortColumn")
#set($dynamicProp = '#set( $selectedPreference = ' '$preferences.' $selectName) ' )')
#evaluate($dynamicProp)
После выполнения этих строк я могу затем сравнить значение selectedPreference со значениями, которые я повторяю.
Комментарии:
1. Спасибо. Просматриваю FAQ, который указывает на VelocityTools. wiki.apache.org/velocity/VelocityFAQ