Динамическая привязка значений компонента JSF - PullRequest
5 голосов
/ 09 февраля 2010

Как мне динамически привязать значение определенного компонента во время выполнения? Например, у меня есть следующий тег компонента

<h:inputText value="#{bean.someProp}" />

В моем случае "# {bean.someProp}" известен только во время выполнения.

Какова лучшая стратегия для реализации этого?

Должен ли я обходить дерево компонентов и устанавливать привязку значений программным способом? Если да, на каком этапе жизненного цикла JSF я должен выполнить обход?

Ответы [ 2 ]

15 голосов
/ 09 февраля 2010

Вы можете связать его со свойством бина Map<String, Object>, где ключ String меньше или больше имени динамического свойства. Вы можете получить доступ к значениям карты в EL следующим образом:

<h:inputText value="#{bean.map.someProp}" />

или

<h:inputText value="#{bean.map['someProp']}" />

, что даже можно сделать более динамично, где someVar фактически разрешается до значения String "someProp":

<h:inputText value="#{bean.map[someVar]}" />

Вам нужно только убедиться, что Map создан во время инициализации компонента, иначе JSF не сможет получить доступ к значениям карты. EL именно не будет создавать «вложенные свойства» для вас. Таким образом, например прямая реализация:

public class Bean {
    private Map<String, Object> map = new HashMap<String, Object>();
}

.. или внутри Конструктора, или @PostConstruct, если хотите.

0 голосов
/ 09 февраля 2010

Другой вариант - вы можете добавить слой абстракции к вашему бину.

public String getDynamicProp() {
   ...Code to determine and return the correct property based on the meta-data...
}

public void setDynamicProp(String input) {
   ...Code to determine and return the correct property based on the meta-data...
}

Тогда вы бы привязали свой JSF напрямую к динамической подпорке:

#{bean.dynamicProp}

Тем не менее, это не будет зависеть от метаданных, как валидаторы и тому подобное, что вы хотели. Однако вы можете программно вызывать проверку и обрабатывать ее самостоятельно.

...