45
Desarrollo Web JSF + Spring + Hibernate Jorge Luis Palacio Pineda

Curso de Desarrollo Web 2

Embed Size (px)

DESCRIPTION

Un complemento al anterior para incluir JSF

Citation preview

Page 1: Curso de Desarrollo Web 2

Desarrollo Web

JSF + Spring + Hibernate

Jorge Luis Palacio Pineda

Page 2: Curso de Desarrollo Web 2

Introducción

Este material se usa como complemento al material previamente mostrado con Struts.

El motivo de la presente es actualizar la información para cubrir las versiones actuales de Spring y JSF.

Cubre Spring 2 y JSF 1.2

Page 3: Curso de Desarrollo Web 2

Contenidos Descripción Configuración Descripción del DAO VariableResolver Application y ApplicationFactory Complementando con Hibernate Después de…

Page 4: Curso de Desarrollo Web 2

Contenidos Descripción Configuración Descripción del DAO VariableResolver Application y ApplicationFactory Complementando con Hibernate Después de…

Page 5: Curso de Desarrollo Web 2

Objetivo

Crear un entorno de trabajo que incluya Spring, Struts e Hibernate.

Permitir integrar estas tres tecnologías en una aplicación Web.

Dar la opción a extender la aplicación.

Page 6: Curso de Desarrollo Web 2

Hibernate

Arquitectura

JSF Spring

DAO’s

Services

DB

Page 7: Curso de Desarrollo Web 2

Distribución Física

DB(MySQL)

Servidor WebInternet

Page 8: Curso de Desarrollo Web 2

Software Utilizando

Eclipse 3.3.1 Web Tools Platform 2.0.1 Spring 2.0 JSF RI 1.2 Hibernate 3.2 Tomcat 6.0 Junit 3.8

Page 9: Curso de Desarrollo Web 2

Contenidos

Descripción Configuración Descripción del DAO VariableResolver Application y ApplicationFactory Complementando con Hibernate Después de…

Page 10: Curso de Desarrollo Web 2

Creación de Proyecto

Tomamos un proyecto Web Dinámico regular con el siguiente Facet:JSF 1.2

Dynamic Web Module 2.5 Java 5.0 JavaServer Faces 1.2

Page 11: Curso de Desarrollo Web 2

Registros en web.xml (JSF) <servlet> <servlet-name>Faces Servlet</servlet-name> <servlet-class>

javax.faces.webapp.FacesServlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>/faces/*</url-pattern> </servlet-mapping>

Page 12: Curso de Desarrollo Web 2

Explicación

El servlet registrado permite atender las peticiones.

El filtro nos permite tomar todas las peticiones al subdirectorio virtual /faces/

Las peticiones se reenvían al JSF mismo.

Page 13: Curso de Desarrollo Web 2

Registros en web.xml (Spring) <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <listener> <display-name>Spring Decorator</display-name> <listener-class> com.jlpp.sample.utils.SpringDecorator </listener-class> </listener> <listener> <listener-class>org.springframework.web.context.request.RequestContextListener </listener-class> </listener>

Page 14: Curso de Desarrollo Web 2

Explicación

El componente context-param nos indica donde buscar la configuración Spring.

El primer listener nos dice que carguemos Spring en el entorno.

El segundo listener se utiliza para permitir acceder al App de Spring desde el contexto del servidor.

Page 15: Curso de Desarrollo Web 2

Clase SpringDecorator

Esta clase envia los errores de arranque de Spring a consola.

Se usa para depuración. Guarda una referencia al contexto Spring

para referenciarlo desde otras partes del programa.

Page 16: Curso de Desarrollo Web 2

//Implementación del decorador//Los métodos omitidos deben sobreescribirse con llamadas a cclpublic class SpringDecorator extends ContextLoaderListener {

//Variable encapsulada del entornoprivate ContextLoaderListener cll;

//App Web de Springprivate static WebApplicationContext wac;

public SpringDecorator() {cll = new ContextLoaderListener();

}

//Crea el objeto interno y guarda el WebApppublic void contextInitialized(ServletContextEvent arg0) {

try {cll.contextInitialized(arg0);

wac = WebApplicationContextUtils.getWebApplicationContext(arg0.getServletContext());

} catch(Exception e) {e.printStackTrace();

}}

//Ejemplo de llamada internapublic ContextLoader getContextLoader() {

return cll.getContextLoader();}

public static WebApplicationContext getSpringContext() {return wac;

}}

Page 17: Curso de Desarrollo Web 2

Comentarios

La referencia estática permite leer desde otros objetos el WAC.

El WAC es indispensable para replicar las funcionalidades de Spring a la aplicación original.

El mismo principio de Decorator se aplica a todos los componentes de la solución.

Page 18: Curso de Desarrollo Web 2

Contenidos

Descripción Configuración Descripción del DAO VariableResolver Application y ApplicationFactory Complementando con Hibernate Después de…

Page 19: Curso de Desarrollo Web 2

DAO

Son objetos que abstraen las funcionalidades de acceso a datos.

Permiten abstraer el acceso a datos.

DAOCapa de

Acceso a DatosApp

Page 20: Curso de Desarrollo Web 2

Implementación Básicapublic interface BasicDao { public boolean agregar(Object o); public boolean editar(Object o); public boolean borrar(Object o); //Buscar duplicados antes de agregar public boolean hayRepetido(Object o); //Buscar dependientes antes de borrar public boolean hayDependiente(Object o); public List cargar(); public List cargarUno(Serializable id); public List cargarCondicion(String prop, Object val);}

Page 21: Curso de Desarrollo Web 2

Ejercicio

Generalmente la implementación del BasicDao:Toma como constructor el nombre base de la

clase que maneja. Implementa las operaciones ABC+M de

manera general. Como ejercicio desarrolle la clase

BasicDAO

Page 22: Curso de Desarrollo Web 2

Extendiendo los DAO’s

Podemos extender los DAO’s en caso de ser necesario.

BasicDao

GenericDao SpecialDao

SpecificDao1 SpecificDao2

Métodos extra y operaciones

especializadas, como cargarLibrosDeAutor o un eliminar diferente

podrían estar aqui

Operaciones Triviales colocadas aquí

Page 23: Curso de Desarrollo Web 2

Contenidos

Descripción Configuración Descripción del DAO VariableResolver Application y ApplicationFactory Complementando con Hibernate Después de…

Page 24: Curso de Desarrollo Web 2

VariableResolver

Componente de JSF utilizado desde la versión 1.1

Se encarga de crear las variables necesarias por el EL.

Actualmente se encapsula dentro de un ELResolver.

Page 25: Curso de Desarrollo Web 2

Descripción del VR

Sobreescribes el método de resolución: Primeramente creamos una clase

SpringVariableResolver que extienda VariableResolverImpl.

Y sobrescribiremos el método resolveVariable(FacesContext fc, String var)…

Page 26: Curso de Desarrollo Web 2

Sobreescritura del Método

Recuperaremos el contexto WACWebApplicationContext ac = SpringDecorator.getSpringContext();

Si Spring no sabe manejar el bean, delegamos al VR original

If(!wac.containsBean(var))

return super.resolveVariable(fc, var);

Page 27: Curso de Desarrollo Web 2

Sobreescritura del Método

Posteriormente creamos una sesiónfc.getExternalContext().getSession(true);

Buscamos el Scope apropiadoMap<String, Object> scope = null;if(ac.isPrototype(var)) scope = fc.getExternalContext().getRequestMap();else { if(ac.isSingleton(var)) scope = fc.getExternalContext().getApplicationMap(); else scope = fc.getExternalContext().getSessionMap();}

Page 28: Curso de Desarrollo Web 2

Sobreescritura del Método

Si el scope no es valido terminamosif(scope == null) return null;

Si el scope ya tiene la variable la usamosif(scope.containsKey(var))

return scope.get(var);

En caso contrario lo creamos y regresamosObject o = wac.getBean(var);

scope.put(var, o);

Return o;

Page 29: Curso de Desarrollo Web 2

Implicaciones de la Implementación

El scope se averigua a partir de la forma en que se instancia el bean.Todo objeto que sea un singleton será de

contexto Aplicación.Todo objeto prototype será de contexto

Request.El resto de los objetos será de scope session.

Page 30: Curso de Desarrollo Web 2

Configuración del VR

En el archivo faces-config.xml

<!– Configuración del VariableResolver --><application>

<variable-resolver>com.jlpp.sample.utils.SpringVariableResolver

</variable-resolver></application>

Page 31: Curso de Desarrollo Web 2

Alcance

Sobreescribir el VariableResolver nos permite sobrescribir todas las expresiones de EL.

#{objeto.variable} = Resuelve con el nuevo VariableResolver.

No se pueden crear ni validators, converters.

Page 32: Curso de Desarrollo Web 2

Contenidos

Descripción Configuración Descripción del DAO VariableResolver Application y ApplicationFactory Complementando con Hibernate Después de…

Page 33: Curso de Desarrollo Web 2

Application y ApplicationFactory?

Existe un objeto ApplicationFactory que se encarga de crear los objetos Application.

El objeto Application contiene el VR y otros componentes necesarios del entorno.

Sobrescribiéndoles podemos cambiar el comportamiento normal del Application.

Page 34: Curso de Desarrollo Web 2

Redefinir el Application

Extender la clase Application en SpringApplication.

Declarar una variable interna de tipo Application.

Aplicar un Decorator para todos los métodos.

Es importante declarar un constructor que tome un objeto Application como parámetro.

Page 35: Curso de Desarrollo Web 2

Redefinir los métodos apropiados

Implementar los métodos propios de ApplicationImpl.

Redefinir los métodos adecuadoscreateValidator(String);createComponent(String);createConverter(String);

Page 36: Curso de Desarrollo Web 2

Sobrescribiendo createXXX

El código es simple, tratas de crear el objeto original. Si no es posible creas uno desde Spring.

try { return original.createXXX(nombre);} catch(Exception e) { WebApplicationContext wac =

SpringDecorator.getApplicationContext();

return (ClaseRetorno) wac.getBean(nombre); }

Page 37: Curso de Desarrollo Web 2

Sobrescribir createComponent

Este método tiene una sobrecarga que hay que implementar:

public UIComponent createComponent(ValueBinding bind, FacesContext context, String nombre)

throws FacesException { try { UIComponent uic = (UIComponent) bind.getValue(context); if(uic != null) return uic; uic = interno.createComponent(nombre); return uic; } catch(FacesException fe) { return createComponent(nombre); }}

Page 38: Curso de Desarrollo Web 2

Sobrescribir createConverter

EjercicioExiste una sobrecarga del método que toma

como parámetro un objeto de tipo Class.Por medio del WebApplicationContext

podemos recuperar todos los beans de cierta clase.

Implementar el método createConverter

Page 39: Curso de Desarrollo Web 2

Métodos de Utilería

Creamos un método para crear App’s adecuado. Simplemente intenta regresar el Application,

pero si no es del tipo adecuado crea un nuevo decorador y lo regresa.

public static Application crearApp(Application app) {if(app instanceof SpringApplication)

return app;return new SpringApplication(app);

}

Page 40: Curso de Desarrollo Web 2

Sobrescribir el ApplicationFactory

Cuando redefinimos un ApplicationFactory el entorno JSF nos permite analizar la instancia original.

Usando este principio podemos construir un Decorator del ApplicationFactory normal.

La clase SpringApplicationFactory debe extender de ApplicationFactoryImpl

Page 41: Curso de Desarrollo Web 2

Descripción

Todos los métodos son de un Decorator, excepto getApplication();

Se muestran los constructorespublic Application getApplication() {

return SpringApplication.crearApp(original.getApplication());

}

public SpringApplicationFactory() { ; }public SpringApplicationFactory(ApplicationFactory af) {

super();setApplicationFactory(af);

}

Page 42: Curso de Desarrollo Web 2

Contenidos Descripción Configuración Descripción del DAO VariableResolver Application y ApplicationFactory Complementando con Hibernate Después de…

Page 43: Curso de Desarrollo Web 2

Pegándole Hibernate

El hecho de complementar Hibernate es trivial.

La configuración de los beans determinados se hace mediante Spring.

El material puede encontrarse en anteriores presentaciones.

Page 44: Curso de Desarrollo Web 2

Contenidos Descripción Configuración Descripción del DAO VariableResolver Application y ApplicationFactory Complementando con Hibernate Después de…

Page 45: Curso de Desarrollo Web 2

Después de

Intentenlo, y si tienes dudas o sugerencias pues contactenme:

Jorge Luis Palacio Pineda

[email protected]