====== Creación de Beans de respaldo ======
Un bean de respaldo es una clase Java que se comunica con uno o varios formularios de la capa de la vista. Esta clase Java recoge la información introducida en dichos formularios y la procesa, lanzándolos a la capa de la lógica de aplicación para que sean procesados. A su vez comparte estos datos con la capa de la vista para que se muestren al usuario y es la encargada de realizar las tareas de validación y control de los datos introducidos. De igual forma implementa comportamientos de la vista para determinar condiciones para mostrar campos, calcular el contenido de otros, habilitar/deshabilitar etc...
===== Creación del Bean =====
Para crear un Bean de respaldo debemos hacer uso de la anotación **//@Name//** proporcionada por Seam, la cual habilita nuestra clase Java para ser inyectada en otros contextos. Esto permitirá que, mediante expresiones EL en la capa de la vista se acceda a nuestro Bean de respaldo a través del nombre dado en la anotación @Name.
@Name("manejadorMapas")
@Scope(ScopeType.CONVERSATION)
public class ManejadorMapas implements Serializable{
private MapModel modeloMapa;
private List marcadores;
...
...
public MapModel getModeloMapa() {
return modeloMapa;
}
public void setModeloMapa(MapModel modeloMapa) {
this.modeloMapa = modeloMapa;
}
public List getMarcadores() {
return marcadores;
}
public void setMarcadores(List marcadores) {
this.marcadores = marcadores;
}
...
...
Del código anterior debemos tener en cuenta:
* **@Name**: Esta anotación hace que Seam sea capaz de buscar e inyectar esta clase Java convertida a Bean done sea necesario, para ello esta anotación debe ir completada con un nombre para localizarlo. Normalmente es el mismo nombre de la clase con la primera letra en minúscula.
* Todas **las propiedades** que queremos que sean accesibles en la parte de la vista, **han de tener un método get/set** para que Seam sea capaz de insertar y recuperar los valores de las propiedades (salvo en las propiedades booleanas que los métodos serán **set** e **is**).
* Los métodos del Bean de respaldo que se quieran poder ejecutar desde la vista han de ser públicos.
* En la parte de la vista para acceder a cualquier propiedad o método, se debe **crear una expresión EL** **#{ ... }**, dentro de la expresión EL debemos invocar a la propiedad o la clase poniendo el nombre de nuestro Bean anotado en la etiqueta //@Name//, y el nombre del método o propiedad. Ej: model="#{manejadorMapas.modeloMapa}"
* Si un método tiene parámetros de entrada se le pueden añadir dentro de la expresion EL. Ej: model="#{manejadorMapas.hazAlgo('Texto')}".
* Los Beans **deben tener un constructor vacío** para que Seam sea capaz de crearlo si no existe.
En este punto, nuestra clase Java, ya es un Bean de respaldo y puede ser accedido desde cualquier vista e inyectado en otros Beans, si hiciera falta. Ahora es turno de especificar la vida de este Bean. Para ello utilizaremos la anotación **//@Scope//** donde especificaremos el ámbito de este Bean. La información necesaria sobre los ámbitos podemos consultarla en la entrada de la wiki [[fdw2.0:fundeweb2.0:gt:tipos_de_ambitos_en_fundeweb|Tipos de ámbitos en FundeWeb]] junto con la guía [[fdw2.0:fundeweb2.0:gt:elegir_el_ambito_correcto|Elegir el ámbito correcto]]
===== Anotaciones en nuestro Java Bean =====
Una vez conocemos cómo crear un Bean de respaldo vamos a comentar las anotaciones más importantes que se pueden utilizar con ellos.
==== Anotaciones en el encabezado del bean ====
Son anotaciones que se especifican encima de la definición de la clase ([[http://docs.jboss.org/seam/2.3.1.Final/reference/html/annotations.html#d0e25208|Documentación]]):
@Install
@AutoCreate
@Startup
public class ManejadorMapas implements Serializable { ... }
* **@AutoCreate**: Fuerza la creación del componente si no existe.
* **@Startup**: Sólo aplicable a componentes con scope SESSION o APPLICATION. Fuerza que este componente se cree cuando la aplicación o la sesión arrancan. Sus propiedades son:
* **depends**: Un listado de los componentes de los que depende este para inicializarlos antes que él.
* **@Install**: Define cuando un componente se crea o no. Esta anotación está concebida para cuando tenemos componentes con el mismo nombre y que en tiempo de despliegue se elija cual se tendrá en cuenta en la aplicación. Sus propiedades son:
* **classDependencies**: Indica que el componente será instalado sólo cuando las clases en esta lista estén cargadas.
* **debug**: Indica si este componente es de debug.
* **dependencies**: Indica que este componente será instalado después de que los componentes en esta lista estén cargados.
* **genericDependencies**: Similar a dependencies, solo que recibe una lista de clases en vez de identificadores.
* **precedence**: En caso de conflicto de nombres indica la precedencia de este componente. El componente con mayor precedencia se instalará.
* **value**: Indica si este componente es el que se debe instalar por defecto.
==== Anotaciones en propiedades del Bean ====
=== Anotaciones para la Biyeccion ===
Se especifican en la definición de las propiedades y métodos //get/set// de la clase. [[http://docs.jboss.org/seam/2.3.1.Final/reference/html/annotations.html#d0e25465|Documentación]].
@In
private ServicioPersistenciaAnuncios servicioAnuncios;
@In(create = true)
private ServicioPersistenciaAnuncios servicioAnuncios;
@In(create = true, value = "servicioPersistenciaAnuncios")
private ServicioPersistenciaAnuncios servicioAnuncios;
* **@In**: Inyecta un componente Seam o el resultado de una expresión EL dentro de otro componente Seam. Nos permite decirle a Seam que busque e inserte el Bean que buscamos en nuestra clase. Sus propiedades son:
* **create**: Le indica a Seam que si la clase que queremos inyectar no existe la cree.
* **value**: Permite especificar el nombre del Bean que buscamos.
* **required**: Obliga a que el objeto que se pretende inyectar exista.
* **scope**: Indica en qué ámbito queremos que Seam busque el Bean.
Por defecto (sino se especifica la propiedad //value//) la anotación //@In// busca un componente Seam de nombre igual al de la propiedad en sus contextos en el siguiente orden: MethodContext, EventContext, PageContext, ConversationContext, SessionContext, BusinessProcessContext y ApplicationContext. No obstante mediante la propiedad //scope// podemos mejorar dicha búsqueda. También se puede utilizar en un método //set//.
@Out
private ServicioPersistenciaAnuncios servicioAnuncios;
@Out(value = "servicioPersistenciaAnuncios")
private ServicioPersistenciaAnuncios servicioAnuncios;
@Out(value = "servicioPersistenciaAnuncios", scope = ScopeType.CONVERSATION)
private ServicioPersistenciaAnuncios servicioAnuncios;
* **@Out**: Outyecta (crea una variable de contexto) con el valor almacenado en la propiedad.
* **value**: Permite especificar el nombre de la variable de contexto.
* **required**: Obliga a que el objeto que se pretende outyectar no tenga valor //null//.
* **scope**: Indica en qué ámbito donde se crea la variable de contexto. Por defecto, la misma que el componente que la contiene.
Por defecto (sino se especifica la propiedad //value//) la anotación //@Out// crea la variable de contexto de nombre igual al de la propiedad. También se puede utilizar en un método //get//.
==== Anotaciones en métodos del bean ====
Se especifican en los métodos de la clase
@PostConstruct
public void inicializaBuscador() {
this.nombreAnuncio = "";
this.descAnuncio = "";
this.fechaAnuncio = null;
}
=== Anotaciones del Estándar para inicialización y destrucción ===
* **@PostConstruct**: Situada en un método publico y //void// de nuestro Bean, se utiliza para indicar que ese método se ejecute inmediatamente después del constructor del Bean con el fin de inicializarlo, y tener disponible los elementos inyectados por el contenedor.
* **@PreDestroy**: Esta anotación la situaremos en un método publico y //void// de nuestro Bean y realizará las tareas que queremos que se ejecuten justo antes de que nuestro Bean sea eliminado de la aplicación y marcado para que el recolector Java lo elimine de memoria.
=== Anotaciones de JBoss Seam para inicialización y destrucción ===
* **@Create**: Situada en un método publico y //void// de nuestro Bean, se utiliza para indicar que ese método se ejecute inmediatamente después del constructor (y del método anotado con //@PostConstruct//) del Bean con el fin de inicializarlo, y tener disponible los elementos inyectados por el contenedor y por JBoss Seam (utilizando //@In//, //@Out//, etc.). Es la alternativa de JBoss Seam a la anotación //@PostConstruct//.
* **@Destroy**: Esta anotación la situaremos en un método publico y //void// de nuestro Bean y realizará las tareas que queremos que se ejecuten justo antes de que nuestro Bean sea eliminado de la aplicación y marcado para que el recolector Java lo elimine de memoria. Es la alternativa de JBoss Seam a la anotación //@PreDestroy//.
Si quieres utilizar los componentes inyectados mediante la anotación //@In//, tienes que utilizar la anotación **//@Create//**. [[http://docs.jboss.org/seam/2.3.1.Final/reference/html/annotations.html#d0e25691|Documentación]]