2010-02-09 4 views
5

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

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

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

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

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

ответ

15

Вы можете связать его с bean-компонентом 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

Хорошо, я понял, что вы имели в виду. Это хорошая идея, за исключением того, что я потеряю все метаданные, определенные в аннотациях в моих сущностях. Это также означает отказ от использования (тега проверки спящего режима из SEAM) и всей другой инфраструктуры, которая зависит от метаданных аннотаций. FYI, я делаю это, чтобы создать структуру, которая реализует шаблон «голый объект» (одна реализация ref - http://www.nakedobjects.org/). В основном он проверяет сущность и автоматически создает связанные таблицы и формы (в данном случае, дерево компонентов). – bungrudi

+0

Urm, ... со второй мыслью, используя этот подход, мне не нужно терять все метаданные аннотаций. Я попробую это и дам вам знать. – bungrudi

+0

Так я и делаю это сейчас. Делая это, я теряю преимущество и должен повторно выполнить проверку в другом месте. Это, однако, тривиально, просто вопрос вызова hibernateValidator.validate (bean). – bungrudi

0

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

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} 

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

Смежные вопросы