实际上是否可以在 JSF 中的托管组件之间传递任何数据?如果是,如何实现这一目标?
任何人都可以提供任何样品吗?
有几种方法。如果托管 bean 彼此相关,最干净的方法是注入。根据 JSF 版本和 CDI 是否可用,有不同的方法。
只需使用@Inject
.
@Named
@SessionScoped
public class Bean1 {
// ...
}
@Named
@RequestScoped
public class Bean2 {
@Inject
private Bean1 bean1; // No getter/setter needed.
}
其他方式也可以,范围无关紧要,因为 CDI 在幕后注入了proxy。
使用@ManagedProperty
.
@ManagedBean
@SessionScoped
public class Bean1 {
// ...
}
@ManagedBean
@RequestScoped
public class Bean2 {
@ManagedProperty("#{bean1}")
private Bean1 bean1; // Getter/setter required.
}
在这个特定示例中,其他方式是不可能的,因为 JSF 注入的是物理实例而不是代理实例。您只能将相同或更广泛范围的 bean 注入特定范围的 bean。
<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 设置为另一个:
@Inject
private Bean2 bean2;
(或基于您的 DI 框架的适当注释)