¿Es realmente posible pasar datos entre componentes gestionados en JSF? Si es así, ¿cómo lograr esto?Pasar datos entre componentes gestionados en JSF
¿Alguien podría proporcionar alguna muestra?
¿Es realmente posible pasar datos entre componentes gestionados en JSF? Si es así, ¿cómo lograr esto?Pasar datos entre componentes gestionados en JSF
¿Alguien podría proporcionar alguna muestra?
Existen varias formas. Si los beans administrados están relacionados entre sí, la forma más limpia sería la inyección de propiedad administrada. Supongamos que Bean1 tiene el mismo alcance o un alcance más amplio que Bean2. En primer lugar dar Bean2 una propiedad Bean1:
public class Bean2 {
private Bean1 bean1; // +getter +setter.
}
declarará Bean1 en faces-config.xml
ser una propiedad administrada 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 esta manera la instancia bean2
tiene acceso instantáneo a la bean1
ejemplo.
Si no desea utilizar la inyección de propiedad administrada por alguna razón, entonces también puede tomar Application#evaluateExpressionGet()
para acceder a ella mediante programación. Aquí está un ejemplo de recuperación de Bean1 dentro Bean2:
FacesContext context = FacesContext.getCurrentInstance();
Bean1 bean1 = (Bean1) context.getApplication().evaluateExpressionGet(context, "#{bean1}", Bean1.class);
El Bean1 debe sin embargo ya se puede declarar como bean gestionado bean1
en faces-config.xml
.
Para obtener más información y sugerencias sobre cómo pasar datos dentro de JSF, puede encontrar que this article es útil.
Para añadir a la respuesta de BalusC, si está utilizando un marco de dependencia de la inyección (primavera, guice, etc.), o si se utiliza JSF 2.0, puede tener un bean gestionado establecido en el otro usando sólo:
@Inject
private Bean2 bean2;
(o la anotación apropiada en función de su marco DI)
Esto funciona en JSF 2.0 en Java EE 6 también. – BalusC
Debe ser @Inject private Bean1 bean1; si esto fuera a ser referenciado en Bean2. (en sincronía con el ejemplo de BalusC) –