实际上是否可以在JSF中的托管组件之间传递任何数据?如果是,如何实现?
任何人都可以提供样品吗?
有几种方法。如果托管bean相互关联,则最干净的方法是注入。有不同的方法,具体取决于JSF版本以及CDI是否可用。
只需使用@Inject
。
@Named
@SessionScoped
public class Bean1 {
// ...
}
@Named
@RequestScoped
public class Bean2 {
@Inject
private Bean1 bean1; // No getter/setter needed.
}
其他方法也可以,范围无关紧要,因为CDI在[C0]的掩护下注入。
使用proxy。
@ManagedProperty
@ManagedBean
@SessionScoped
public class Bean1 {
// ...
}
在此特定示例中,其他方法是不可能的,因为JSF注入了物理实例而不是代理实例。您只能将same或broader范围的bean注入特定范围的bean。
使用@ManagedBean
@RequestScoped
public class Bean2 {
@ManagedProperty("#{bean1}")
private Bean1 bean1; // Getter/setter required.
}
中的<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,则可以使用以下方法将一个托管bean设置为另一个托管bean:
Get JSF managed bean by name in any Servlet related class
(或基于您的DI框架的适当注释)