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