Есть несколько способов. Если управляемые bean-компоненты связаны друг с другом, самым чистым способом будет внедрение управляемых свойств. Предположим, что Bean1 имеет ту же область видимости или более широкую область, чем Bean2. Сначала дайте Bean2 свойство Bean1:
public class Bean2 {
private Bean1 bean1; // +getter +setter.
}
Затем объявите Bean1 в faces-config.xml
как управляемое свойство Bean2:
<managed-bean>
<managed-bean-name>bean1</managed-bean-name>
<managed-bean-class>com.example.Bean1</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
<managed-bean>
<managed-bean-name>bean2</managed-bean-name>
<managed-bean-class>com.example.Bean2</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
<managed-property>
<property-name>bean1</property-name>
<value>#{bean1}</value>
</managed-property>
</managed-bean>
Таким образом, экземпляр bean2
получает мгновенный доступ к экземпляру bean1
.
Если вы по каким-либо причинам не хотите использовать внедрение управляемого свойства, вы также можете получить Application#evaluateExpressionGet()
для доступа к нему программным способом. Вот пример получения Bean1 внутри Bean2:
FacesContext context = FacesContext.getCurrentInstance();
Bean1 bean1 = (Bean1) context.getApplication().evaluateExpressionGet(context, "#{bean1}", Bean1.class);
Однако Bean1 уже должен быть объявлен как управляемый bean bean1
в faces-config.xml
.
Для получения дополнительной информации и подсказок о передаче данных внутри JSF, вы можете найти эту статью полезной.