ADF tips: Cómo enlazar componentes de vista a un Managed Bean
10/12/2014 -
En este tip explicaremos una forma alternativa con la que acceder a componentes JSF desde un managed bean. La forma más común es añadir un objeto UIComponent como atributo de nuestro bean, con sus accessors correspondientes y enlazar el componente en la página con este atributo. Esta es la vía que JDeveloper nos da por defecto para acceder a componentes JSF desde un bean:
1
|
binding="#{myBeanScope.MyBean.myRichcomponentName}" |
1
2
3
4
5
6
7
8
9
|
UIComponent myRichComponentName; public void setMyRichComponentName(UIComponent myRichComponentName){ this .myRichComponentName = myRichComponentName; } public UIComponent getMyRichComponentName(){ return myRichComponentName; } |
Esta opción nos puede ocasionar varios problemas. El primero de ellos es que estos objetos no son Serializables, con lo que en entornos de alta disponibilidad obtendremos errores. Otra contra es que el consumo de memoria es elevado, además de que el árbol JSF no será liberado completamente tras su uso y estos objetos perdurarán en memoria más tiempo del que realmente necesitamos.
Llegados a este punto podemos decir que la forma estándar no es del todo óptima, pero… ¿qué otras opciones tenemos?
Existe la posibilidad de utilizar Component Reference de Apache Trinidad (ver detalles de la API), mediante el cual no almacenaremos el componente JSF sino que guardaremos una referencia de acceso directo al componente del árbol JSF. Con esto el consumo de memoria bajará considerablemente y no tendremos objetos en memoria que no necesitemos. Tendríamos que sustituir el código anterior por algo similar a esto:
1
|
binding="#{myBeanScope.MyBean.myRichcomponentName}" |
1
2
3
4
5
6
7
8
9
|
private ComponentReference myRichComponentName; public UIComponent getMyRichComponentName(){ return myRichComponentName == null ? null : myRichComponentName.getComponent(); } public void setMyRichComponentName(UIComponent myRichComponentName) { myRichComponentName = ComponentReference.newUIComponentReference(myRichComponentName); } |
La parte negativa de este tip es que no podemos configurar JDeveloper para que automáticamente haga uso del componente. Pero gracias al uso de plantillas de código podemos aplicarlo sin tener que recordar las líneas exactas.
El uso de plantillas de código en JDeveloper lo comentaremos en un próximo ADF tip.