8

实际上是否可以在 JSF 中的托管组件之间传递任何数据?如果是,如何实现这一目标?

任何人都可以提供任何样品吗?

4

2 回答 2

14

有几种方法。如果托管 bean 彼此相关,最干净的方法是注入。根据 JSF 版本和 CDI 是否可用,有不同的方法。

CDI

只需使用@Inject.

@Named
@SessionScoped
public class Bean1 {

    // ...
}

@Named
@RequestScoped
public class Bean2 {

    @Inject
    private Bean1 bean1; // No getter/setter needed.
}

其他方式也可以,范围无关紧要,因为 CDI 在幕后注入了proxy

JSF 2.x

使用@ManagedProperty.

@ManagedBean
@SessionScoped
public class Bean1 {

    // ...
}

@ManagedBean
@RequestScoped
public class Bean2 {

    @ManagedProperty("#{bean1}")
    private Bean1 bean1; // Getter/setter required.
}

在这个特定示例中,其他方式是不可能的,因为 JSF 注入的是物理实例而不是代理实例。您只能将相同更广泛范围的 bean 注入特定范围的 bean。

JSF 1.x

<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>

也可以看看:

于 2010-01-24T12:47:14.727 回答
4

要添加到 BalusC 的答案,如果您使用的是依赖注入框架(spring、guice 等),或者如果使用 JSF 2.0,您可以使用以下方式将一个托管 bean 设置为另一个:

@Inject
private Bean2 bean2;

(或基于您的 DI 框架的适当注释)

于 2010-01-24T15:01:50.833 回答