Действительно ли возможно передавать какие-либо данные между управляемыми компонентами в JSF? Если да, то как этого добиться?
Может ли кто-нибудь предоставить образец?
Действительно ли возможно передавать какие-либо данные между управляемыми компонентами в JSF? Если да, то как этого добиться?
Может ли кто-нибудь предоставить образец?
Есть несколько способов. Если управляемые компоненты связаны друг с другом, самым чистым способом будет инъекция. Существуют разные способы в зависимости от версии JSF и доступности CDI.
Просто используйте @Inject
.
@Named
@SessionScoped
public class Bean1 {
// ...
}
@Named
@RequestScoped
public class Bean2 {
@Inject
private Bean1 bean1; // No getter/setter needed.
}
Other way around can also, the scope doesn't matter because CDI injects under the covers a proxy.
Используйте @ManagedProperty
.
@ManagedBean
@SessionScoped
public class Bean1 {
// ...
}
@ManagedBean
@RequestScoped
public class Bean2 {
@ManagedProperty("#{bean1}")
private Bean1 bean1; // Getter/setter required.
}
Other way around is not possible in this specific example because JSF injects the physical instance and not a proxy instance. You can only inject a bean of the same or broader scope into a bean of a particular scope.
Используйте <managed-property>
в faces-config.xml
.
public class Bean1 {
// ...
}
public class Bean2 {
private Bean1 bean1; // Getter/setter required.
}
<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>
Чтобы добавить к ответу BalusC, если вы используете структуру внедрения зависимостей (spring, guice и т. д.) или если используете JSF 2.0, вы можете установить один управляемый компонент в другой, используя только:
@Inject
private Bean2 bean2;
(или соответствующую аннотацию, основанную на вашей структуре DI)