«Карта ValueExpression» компонента JSF - PullRequest
4 голосов
/ 07 октября 2011

Я храню выражения значений в компоненте JSF с тегом f: attribute, например ::

<h:inputText ...>
  <f:attribute name="myId1" value="#{bean.prop1}" />
  <f:attribute name="myId2" value="#{bean.prop2}" />
  <f:attribute name="myId3" value="#{bean.prop3}" />
</h:inputText>

Есть ли способ получить доступ ко всем этим выражениям значения программно? (без знания легенда имен myId1, myId2, ...)

В разделе 9.4.2 спецификации JSF 2.1 говорится, что эти значения хранятся «в карте ValueExpression компонента». Это единственное вхождение термина «Карта ValueExpression» в полной спецификации. Как мне получить доступ к этой карте?

В методе UIcomponent getValueExpression () реализации Jboss / Mojarra карта

getStateHelper().get(UIComponentBase.PropertyKeys.bindings) 

используется для получения выражения single value.

Я думаю, что карта - это супер-набор "Карты ValueExpression"? Могу ли я быть уверен, что все реализации и все унаследованные (стандартные) компоненты используют эту карту для хранения ValueExpressions?

Спасибо.

Ответы [ 3 ]

2 голосов
/ 07 октября 2011

В теории вы сможете увидеть их все по UIComponent#getAttributes():

Map<String, Object> attributes = component.getAttributes();

for (Map.Entry<String, Object> entry : attributes.entrySet()) {
    System.out.printf("name=%s, value=%s%n", entry.getKey(), entry.getValue());
}

Однако, это не работает так, как вы ожидаете. Он возвращает только статические атрибуты. Это, кажется, никогда не будет исправлено / реализовано. См. Также выпуск JSF 636 . Я бы предложил придерживаться атрибутов с предопределенным префиксом и добавочным числовым суффиксом, как вы уже представляли в своем примере. Это также то, что я всегда использовал для передачи дополнительной информации от компонента к пользовательским валидаторам и конвертерам. Вы можете просто собрать их следующим образом:

Map<String, Object> attributes = component.getAttributes();
List<Object> values = new ArrayList<Object>();

for (int i = 1; i < Integer.MAX_VALUE; i++) {
    Object value = attributes.get("myId" + i);
    if (value == null) break;
    values.add(value);
}

System.out.println(values);
1 голос
/ 07 октября 2011

Альтернативой ответу, данному BalusC , может быть использование вложенных фасетов или компонентов UIParameter.Фасеты можно получить в виде карты, используя getFacets , но вам, вероятно, нужно добавить дополнительный UIOutput внутри каждого фасета для доступа к выражению его значения.

Вложенные Доступны параметры UIParameters перебирая дочерние компоненты и проверяя instanceof UIParameter.Параметры UIP имеют параметры name и value и поэтому могут быть легко преобразованы в карту.

Я использовал параметры в пользовательском компоненте, но я не уверен, как реагирует стандартный UIInput, как в вашем примерек этим.

0 голосов
/ 06 ноября 2011

BalusC прав.UIComponent # getAttributes (). Get (name) получает значения из обоих мест - сначала из карты атрибутов, а затем, если не найдено из «карты выражений значений».Чтобы ввести какое-то значение, вы должны вызвать UIComponent # setValueExpression (name, ValueExpression).Если значение является буквальным, оно сохраняется в карте атрибутов, в противном случае в «карте выражений значений».Тогда все в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...