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…

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<Marker> marcadores;
 
     ... 
     ...
 
     public MapModel getModeloMapa() {
		return modeloMapa;
	}
 
	public void setModeloMapa(MapModel modeloMapa) {
		this.modeloMapa = modeloMapa;
	}
 
	public List<Marker> getMarcadores() {
		return marcadores;
	}
 
	public void setMarcadores(List<Marker> marcadores) {
		this.marcadores = marcadores;
	}
<h:form id="formularioInput">
	<p:panel id="homeInfoPanel">
	    <f:facet name="header">
		<h:outputText value="#{messages['maps.panel.title']}" />
	    </f:facet>
		<h:panelGrid columns="2" cellspacing="10px" columnClasses="alineadoTop,alineadoTop">
			<p:gmap id="map" center="38.022860,-1.174731" zoom="17"	type="HYBRID" model="#{manejadorMapas.modeloMapa}" widgetVar="map"
				style="width:800px;height:400px" streetView="true">
                         ...
                         ...
			</p:gmap>	
		</h:panelGrid>
	</p:panel>
</h:form>

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 Tipos de ámbitos en FundeWeb junto con la guía Elegir el ámbito correcto

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 (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. 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. Documentación

  • fdw2.0/fundeweb2.0/gt/como_se_crea_un_javabean_de_respaldo_en_fundeweb.txt
  • Última modificación: 07/11/2017 10:46
  • (editor externo)