在JSF中托管组件之间传递数据

问题描述 投票:7回答:2

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

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

jsf parameter-passing managed-bean
2个回答
12
投票

有几种方法。如果托管bean相互关联,则最干净的方法是注入。有不同的方法,具体取决于JSF版本以及CDI是否可用。

CDI

只需使用@Inject

@Named
@SessionScoped
public class Bean1 {

    // ...
}

@Named
@RequestScoped
public class Bean2 {

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

其他方法也可以,范围无关紧要,因为CDI在[C​​0]的掩护下注入。

JSF 2.x

使用proxy

@ManagedProperty

@ManagedBean
@SessionScoped
public class Bean1 {

    // ...
}

在此特定示例中,其他方法是不可能的,因为JSF注入了物理实例而不是代理实例。您只能将samebroader范围的bean注入特定范围的bean。

JSF 1.x

使用@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>
  • Backing beans (@ManagedBean) or CDI Beans (@Named)?
  • How to choose the right bean scope?

4
投票

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

Get JSF managed bean by name in any Servlet related class

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

© www.soinside.com 2019 - 2024. All rights reserved.