2010-01-24 6 views

Répondre

11

Il existe plusieurs façons. Si les beans gérés sont liés les uns aux autres, la méthode la plus propre serait l'injection de propriété gérée. Supposons que Bean1 a la même portée ou une portée plus large que Bean2. Tout d'abord donner Bean2 une propriété Bean1:

public class Bean2 { 
    private Bean1 bean1; // +getter +setter. 
} 

déclarera alors Bean1 dans faces-config.xml être une propriété gérée de Bean2:

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

De cette façon, l'instance bean2 a un accès instantané à l'instance bean1.

Si vous ne souhaitez pas utiliser l'injection de propriétés gérées pour certaines raisons, vous pouvez également saisir Application#evaluateExpressionGet() pour y accéder par programmation. Voici un exemple de récupérer Bean1 à l'intérieur Bean2:

FacesContext context = FacesContext.getCurrentInstance(); 
Bean1 bean1 = (Bean1) context.getApplication().evaluateExpressionGet(context, "#{bean1}", Bean1.class); 

Le Bean1 doit cependant être déjà déclarée comme gérée par le bean bean1 dans faces-config.xml.

Pour plus d'informations et de conseils sur la transmission de données à l'intérieur de JSF, vous pouvez trouver this article utile.

4

Pour ajouter à la réponse de BalusC, si vous utilisez un cadre d'injection de dépendance (printemps, Guice, etc.), ou si vous utilisez JSF 2.0, vous pouvez avoir un bean géré mis dans l'autre en utilisant seulement:

@Inject 
private Bean2 bean2; 

(ou l'annotation appropriée en fonction de votre cadre de DI)

+0

Cela fonctionne dans JSF 2.0 sur Java EE 6 ainsi. – BalusC

+0

Doit être @Inject private Bean1 bean1; si cela devait être référencé dans Bean2. (en phase avec l'exemple de BalusC) –

Questions connexes