Ответ 1
Прежде всего, независимо от выбора, обе они являются плохой практикой. См. Также Как работает атрибут привязки в JSF? Когда и как его использовать?
Если вам нужно было сделать выбор, привязки компонентов определенно быстрее и дешевле. Это логично понимает, что сканирование дерева, выполняемое UIComponent#findComponent()
, имеет свои последствия для производительности.
В самом деле, поддержка bean, содержащая привязки компонентов, должна быть областью с запросом, но вы можете легко добавить другую область подкачки bean, содержащую в ней бизнес-логику @ManagedProperty
.
Более чистым подходом было бы использовать Map
как держатель всех привязок компонентов. Вам нужно добавить следующую запись в faces-config.xml
:
<managed-bean>
<managed-bean-name>components</managed-bean-name>
<managed-bean-class>java.util.HashMap</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
Это можно просто использовать как
<h:inputSome binding="#{components.input1}" />
<h:inputSome binding="#{components.input2}" />
<h:inputSome binding="#{components.input3}" />
И это можно получить в другом beans как
Map<String, UIComponent> components = (Map<String, UIComponent>) externalContext.getRequestMap().get("components");
Таким образом, вам не нужно беспокоиться о том, чтобы указать отдельные свойства/геттеры/сеттеры. В приведенном выше примере Map
будет содержать три записи с ключами input1
, input2
и input3
, каждый из которых имеет соответствующий экземпляр UIComponent
как значение.
Несвязанный к конкретному вопросу, может быть гораздо более простое решение конкретной проблемы, как вы описали в другом вопросе, чем выполнение проверки в методе действий (что фактически является плохим дизайном). Там я отправил ответ.