0
Desarrollo Web JSF + Spring + Hibernate Jorge Luis Palacio Pineda
Introducción <ul><li>Este material se usa como complemento al material previamente mostrado con Struts. </li></ul><ul><li>...
Contenidos <ul><li>Descripción </li></ul><ul><li>Configuración </li></ul><ul><li>Descripción del DAO </li></ul><ul><li>Var...
Contenidos <ul><li>Descripción </li></ul><ul><li>Configuración </li></ul><ul><li>Descripción del DAO </li></ul><ul><li>Var...
Objetivo <ul><li>Crear un entorno de trabajo que incluya Spring, Struts e Hibernate. </li></ul><ul><li>Permitir integrar e...
Arquitectura Hibernate JSF Spring DAO’s Services DB
Distribución Física DB (MySQL) Servidor Web Internet
Software Utilizando <ul><li>Eclipse 3.3.1 </li></ul><ul><li>Web Tools Platform 2.0.1 </li></ul><ul><li>Spring 2.0 </li></u...
Contenidos <ul><li>Descripción </li></ul><ul><li>Configuración </li></ul><ul><li>Descripción del DAO </li></ul><ul><li>Var...
Creación de Proyecto <ul><li>Tomamos un proyecto Web Dinámico regular con el siguiente Facet: </li></ul><ul><ul><li>JSF 1....
Registros en web.xml (JSF) <servlet> <servlet-name>Faces Servlet</servlet-name> <servlet-class> javax.faces.webapp.FacesSe...
Explicación <ul><li>El servlet registrado permite atender las peticiones. </li></ul><ul><li>El filtro nos permite tomar to...
Registros en web.xml (Spring) <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applic...
Explicación <ul><li>El componente context-param nos indica donde buscar la configuración Spring. </li></ul><ul><li>El prim...
Clase SpringDecorator <ul><li>Esta clase envia los errores de arranque de Spring a consola. </li></ul><ul><li>Se usa para ...
//Implementación del decorador //Los métodos omitidos deben sobreescribirse con llamadas a ccl public class SpringDecorato...
Comentarios <ul><li>La referencia estática permite leer desde otros objetos el WAC. </li></ul><ul><li>El WAC es indispensa...
Contenidos <ul><li>Descripción </li></ul><ul><li>Configuración </li></ul><ul><li>Descripción del DAO </li></ul><ul><li>Var...
DAO <ul><li>Son objetos que abstraen las funcionalidades de acceso a datos. </li></ul><ul><li>Permiten abstraer el acceso ...
Implementación Básica public interface BasicDao { public boolean agregar(Object o); public boolean editar(Object o); publi...
Ejercicio <ul><li>Generalmente la implementación del BasicDao: </li></ul><ul><ul><li>Toma como constructor el nombre base ...
Extendiendo los DAO’s <ul><li>Podemos extender los DAO’s en caso de ser necesario. </li></ul>BasicDao GenericDao SpecialDa...
Contenidos <ul><li>Descripción </li></ul><ul><li>Configuración </li></ul><ul><li>Descripción del DAO </li></ul><ul><li>Var...
VariableResolver <ul><li>Componente de JSF utilizado desde la versión 1.1 </li></ul><ul><li>Se encarga de crear las variab...
Descripción del VR <ul><li>Sobreescribes el método de resolución: </li></ul><ul><li>Primeramente creamos una clase SpringV...
Sobreescritura del Método <ul><li>Recuperaremos el contexto WAC </li></ul><ul><li>WebApplicationContext ac = SpringDecorat...
Sobreescritura del Método <ul><li>Posteriormente creamos una sesión </li></ul><ul><li>fc.getExternalContext().getSession(t...
Sobreescritura del Método <ul><li>Si el scope no es valido terminamos </li></ul><ul><li>if(scope == null) return null; </l...
Implicaciones de la Implementación <ul><li>El scope se averigua a partir de la forma en que se instancia el bean. </li></u...
Configuración del VR <ul><li>En el archivo faces-config.xml </li></ul><!– Configuración del VariableResolver --> <applicat...
Alcance <ul><li>Sobreescribir el VariableResolver nos permite sobrescribir todas las expresiones de EL. </li></ul><ul><li>...
Contenidos <ul><li>Descripción </li></ul><ul><li>Configuración </li></ul><ul><li>Descripción del DAO </li></ul><ul><li>Var...
Application y ApplicationFactory? <ul><li>Existe un objeto ApplicationFactory que se encarga de crear los objetos Applicat...
Redefinir el Application <ul><li>Extender la clase Application en SpringApplication. </li></ul><ul><li>Declarar una variab...
Redefinir los métodos apropiados <ul><li>Implementar los métodos propios de ApplicationImpl. </li></ul><ul><li>Redefinir l...
Sobrescribiendo createXXX <ul><li>El código es simple, tratas de crear el objeto original. Si no es posible creas uno desd...
Sobrescribir createComponent <ul><li>Este método tiene una sobrecarga que hay que implementar: </li></ul>public UIComponen...
Sobrescribir createConverter <ul><li>Ejercicio </li></ul><ul><ul><li>Existe una sobrecarga del método que toma como paráme...
Métodos de Utilería <ul><li>Creamos un método para crear App’s adecuado. </li></ul><ul><li>Simplemente intenta regresar el...
Sobrescribir el ApplicationFactory <ul><li>Cuando redefinimos un ApplicationFactory el entorno JSF nos permite analizar la...
Descripción <ul><li>Todos los métodos son de un Decorator, excepto getApplication(); </li></ul><ul><li>Se muestran los con...
Contenidos <ul><li>Descripción </li></ul><ul><li>Configuración </li></ul><ul><li>Descripción del DAO </li></ul><ul><li>Var...
Pegándole Hibernate <ul><li>El hecho de complementar Hibernate es trivial. </li></ul><ul><li>La configuración de los beans...
Contenidos <ul><li>Descripción </li></ul><ul><li>Configuración </li></ul><ul><li>Descripción del DAO </li></ul><ul><li>Var...
Después de <ul><li>Intentenlo, y si tienes dudas o sugerencias pues contactenme: </li></ul><ul><li>Jorge Luis Palacio Pine...
Upcoming SlideShare
Loading in...5
×

Curso de Desarrollo Web 2

4,811

Published on

Un complemento al anterior para incluir JSF

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
4,811
On Slideshare
0
From Embeds
0
Number of Embeds
5
Actions
Shares
0
Downloads
211
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Transcript of "Curso de Desarrollo Web 2"

  1. 1. Desarrollo Web JSF + Spring + Hibernate Jorge Luis Palacio Pineda
  2. 2. Introducción <ul><li>Este material se usa como complemento al material previamente mostrado con Struts. </li></ul><ul><li>El motivo de la presente es actualizar la información para cubrir las versiones actuales de Spring y JSF. </li></ul><ul><li>Cubre Spring 2 y JSF 1.2 </li></ul>
  3. 3. Contenidos <ul><li>Descripción </li></ul><ul><li>Configuración </li></ul><ul><li>Descripción del DAO </li></ul><ul><li>VariableResolver </li></ul><ul><li>Application y ApplicationFactory </li></ul><ul><li>Complementando con Hibernate </li></ul><ul><li>Después de… </li></ul>
  4. 4. Contenidos <ul><li>Descripción </li></ul><ul><li>Configuración </li></ul><ul><li>Descripción del DAO </li></ul><ul><li>VariableResolver </li></ul><ul><li>Application y ApplicationFactory </li></ul><ul><li>Complementando con Hibernate </li></ul><ul><li>Después de… </li></ul>
  5. 5. Objetivo <ul><li>Crear un entorno de trabajo que incluya Spring, Struts e Hibernate. </li></ul><ul><li>Permitir integrar estas tres tecnologías en una aplicación Web. </li></ul><ul><li>Dar la opción a extender la aplicación. </li></ul>
  6. 6. Arquitectura Hibernate JSF Spring DAO’s Services DB
  7. 7. Distribución Física DB (MySQL) Servidor Web Internet
  8. 8. Software Utilizando <ul><li>Eclipse 3.3.1 </li></ul><ul><li>Web Tools Platform 2.0.1 </li></ul><ul><li>Spring 2.0 </li></ul><ul><li>JSF RI 1.2 </li></ul><ul><li>Hibernate 3.2 </li></ul><ul><li>Tomcat 6.0 </li></ul><ul><li>Junit 3.8 </li></ul>
  9. 9. Contenidos <ul><li>Descripción </li></ul><ul><li>Configuración </li></ul><ul><li>Descripción del DAO </li></ul><ul><li>VariableResolver </li></ul><ul><li>Application y ApplicationFactory </li></ul><ul><li>Complementando con Hibernate </li></ul><ul><li>Después de… </li></ul>
  10. 10. Creación de Proyecto <ul><li>Tomamos un proyecto Web Dinámico regular con el siguiente Facet: </li></ul><ul><ul><li>JSF 1.2 </li></ul></ul><ul><ul><ul><li>Dynamic Web Module 2.5 </li></ul></ul></ul><ul><ul><ul><li>Java 5.0 </li></ul></ul></ul><ul><ul><ul><li>JavaServer Faces 1.2 </li></ul></ul></ul>
  11. 11. 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>
  12. 12. Explicación <ul><li>El servlet registrado permite atender las peticiones. </li></ul><ul><li>El filtro nos permite tomar todas las peticiones al subdirectorio virtual /faces/ </li></ul><ul><li>Las peticiones se reenvían al JSF mismo. </li></ul>
  13. 13. 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>
  14. 14. Explicación <ul><li>El componente context-param nos indica donde buscar la configuración Spring. </li></ul><ul><li>El primer listener nos dice que carguemos Spring en el entorno. </li></ul><ul><li>El segundo listener se utiliza para permitir acceder al App de Spring desde el contexto del servidor. </li></ul>
  15. 15. Clase SpringDecorator <ul><li>Esta clase envia los errores de arranque de Spring a consola. </li></ul><ul><li>Se usa para depuración. </li></ul><ul><li>Guarda una referencia al contexto Spring para referenciarlo desde otras partes del programa. </li></ul>
  16. 16. //Implementación del decorador //Los métodos omitidos deben sobreescribirse con llamadas a ccl public class SpringDecorator extends ContextLoaderListener { //Variable encapsulada del entorno private ContextLoaderListener cll; //App Web de Spring private static WebApplicationContext wac; public SpringDecorator() { cll = new ContextLoaderListener(); } //Crea el objeto interno y guarda el WebApp public void contextInitialized(ServletContextEvent arg0) { try { cll.contextInitialized(arg0); wac = WebApplicationContextUtils.getWebApplicationContext (arg0.getServletContext()); } catch(Exception e) { e.printStackTrace(); } } //Ejemplo de llamada interna public ContextLoader getContextLoader() { return cll.getContextLoader(); } public static WebApplicationContext getSpringContext() { return wac; } }
  17. 17. Comentarios <ul><li>La referencia estática permite leer desde otros objetos el WAC. </li></ul><ul><li>El WAC es indispensable para replicar las funcionalidades de Spring a la aplicación original. </li></ul><ul><li>El mismo principio de Decorator se aplica a todos los componentes de la solución. </li></ul>
  18. 18. Contenidos <ul><li>Descripción </li></ul><ul><li>Configuración </li></ul><ul><li>Descripción del DAO </li></ul><ul><li>VariableResolver </li></ul><ul><li>Application y ApplicationFactory </li></ul><ul><li>Complementando con Hibernate </li></ul><ul><li>Después de… </li></ul>
  19. 19. DAO <ul><li>Son objetos que abstraen las funcionalidades de acceso a datos. </li></ul><ul><li>Permiten abstraer el acceso a datos. </li></ul>DAO Capa de Acceso a Datos App
  20. 20. Implementación Básica public 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); }
  21. 21. Ejercicio <ul><li>Generalmente la implementación del BasicDao: </li></ul><ul><ul><li>Toma como constructor el nombre base de la clase que maneja. </li></ul></ul><ul><ul><li>Implementa las operaciones ABC+M de manera general. </li></ul></ul><ul><li>Como ejercicio desarrolle la clase BasicDAO </li></ul>
  22. 22. Extendiendo los DAO’s <ul><li>Podemos extender los DAO’s en caso de ser necesario. </li></ul>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í
  23. 23. Contenidos <ul><li>Descripción </li></ul><ul><li>Configuración </li></ul><ul><li>Descripción del DAO </li></ul><ul><li>VariableResolver </li></ul><ul><li>Application y ApplicationFactory </li></ul><ul><li>Complementando con Hibernate </li></ul><ul><li>Después de… </li></ul>
  24. 24. VariableResolver <ul><li>Componente de JSF utilizado desde la versión 1.1 </li></ul><ul><li>Se encarga de crear las variables necesarias por el EL. </li></ul><ul><li>Actualmente se encapsula dentro de un ELResolver. </li></ul>
  25. 25. Descripción del VR <ul><li>Sobreescribes el método de resolución: </li></ul><ul><li>Primeramente creamos una clase SpringVariableResolver que extienda VariableResolverImpl. </li></ul><ul><li>Y sobrescribiremos el método resolveVariable(FacesContext fc, String var)… </li></ul>
  26. 26. Sobreescritura del Método <ul><li>Recuperaremos el contexto WAC </li></ul><ul><li>WebApplicationContext ac = SpringDecorator.getSpringContext(); </li></ul><ul><li>Si Spring no sabe manejar el bean, delegamos al VR original </li></ul><ul><li>If(!wac.containsBean(var)) </li></ul><ul><li>return super.resolveVariable(fc, var); </li></ul>
  27. 27. Sobreescritura del Método <ul><li>Posteriormente creamos una sesión </li></ul><ul><li>fc.getExternalContext().getSession(true); </li></ul><ul><li>Buscamos el Scope apropiado </li></ul><ul><li>Map<String, Object> scope = null; </li></ul><ul><li>if(ac.isPrototype(var)) </li></ul><ul><li>scope = fc.getExternalContext().getRequestMap(); </li></ul><ul><li>else { </li></ul><ul><li>if(ac.isSingleton(var)) </li></ul><ul><li>scope = fc.getExternalContext().getApplicationMap(); </li></ul><ul><li>else </li></ul><ul><li>scope = fc.getExternalContext().getSessionMap(); </li></ul><ul><li>} </li></ul>
  28. 28. Sobreescritura del Método <ul><li>Si el scope no es valido terminamos </li></ul><ul><li>if(scope == null) return null; </li></ul><ul><li>Si el scope ya tiene la variable la usamos </li></ul><ul><li>if(scope.containsKey(var)) </li></ul><ul><li>return scope.get(var); </li></ul><ul><li>En caso contrario lo creamos y regresamos </li></ul><ul><li>Object o = wac.getBean(var); </li></ul><ul><li>scope.put(var, o); </li></ul><ul><li>Return o; </li></ul>
  29. 29. Implicaciones de la Implementación <ul><li>El scope se averigua a partir de la forma en que se instancia el bean. </li></ul><ul><ul><li>Todo objeto que sea un singleton será de contexto Aplicación. </li></ul></ul><ul><ul><li>Todo objeto prototype será de contexto Request. </li></ul></ul><ul><ul><li>El resto de los objetos será de scope session. </li></ul></ul>
  30. 30. Configuración del VR <ul><li>En el archivo faces-config.xml </li></ul><!– Configuración del VariableResolver --> <application> <variable-resolver> com.jlpp.sample.utils.SpringVariableResolver </variable-resolver> </application>
  31. 31. Alcance <ul><li>Sobreescribir el VariableResolver nos permite sobrescribir todas las expresiones de EL. </li></ul><ul><li>#{objeto.variable} = Resuelve con el nuevo VariableResolver. </li></ul><ul><li>No se pueden crear ni validators, converters. </li></ul>
  32. 32. Contenidos <ul><li>Descripción </li></ul><ul><li>Configuración </li></ul><ul><li>Descripción del DAO </li></ul><ul><li>VariableResolver </li></ul><ul><li>Application y ApplicationFactory </li></ul><ul><li>Complementando con Hibernate </li></ul><ul><li>Después de… </li></ul>
  33. 33. Application y ApplicationFactory? <ul><li>Existe un objeto ApplicationFactory que se encarga de crear los objetos Application. </li></ul><ul><li>El objeto Application contiene el VR y otros componentes necesarios del entorno. </li></ul><ul><li>Sobrescribiéndoles podemos cambiar el comportamiento normal del Application. </li></ul>
  34. 34. Redefinir el Application <ul><li>Extender la clase Application en SpringApplication. </li></ul><ul><li>Declarar una variable interna de tipo Application. </li></ul><ul><li>Aplicar un Decorator para todos los métodos. </li></ul><ul><li>Es importante declarar un constructor que tome un objeto Application como parámetro. </li></ul>
  35. 35. Redefinir los métodos apropiados <ul><li>Implementar los métodos propios de ApplicationImpl. </li></ul><ul><li>Redefinir los métodos adecuados </li></ul><ul><ul><li>createValidator(String); </li></ul></ul><ul><ul><li>createComponent(String); </li></ul></ul><ul><ul><li>createConverter(String); </li></ul></ul>
  36. 36. Sobrescribiendo createXXX <ul><li>El código es simple, tratas de crear el objeto original. Si no es posible creas uno desde Spring. </li></ul><ul><li>try { </li></ul><ul><li>return original.createXXX(nombre); </li></ul><ul><li>} catch(Exception e) { </li></ul><ul><li>WebApplicationContext wac = </li></ul><ul><li> SpringDecorator.getApplicationContext(); </li></ul><ul><li>return (ClaseRetorno) wac.getBean(nombre); </li></ul><ul><li>} </li></ul>
  37. 37. Sobrescribir createComponent <ul><li>Este método tiene una sobrecarga que hay que implementar: </li></ul>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); } }
  38. 38. Sobrescribir createConverter <ul><li>Ejercicio </li></ul><ul><ul><li>Existe una sobrecarga del método que toma como parámetro un objeto de tipo Class. </li></ul></ul><ul><ul><li>Por medio del WebApplicationContext podemos recuperar todos los beans de cierta clase. </li></ul></ul><ul><li>Implementar el método createConverter </li></ul>
  39. 39. Métodos de Utilería <ul><li>Creamos un método para crear App’s adecuado. </li></ul><ul><li>Simplemente intenta regresar el Application, pero si no es del tipo adecuado crea un nuevo decorador y lo regresa. </li></ul>public static Application crearApp(Application app) { if(app instanceof SpringApplication) return app; return new SpringApplication(app); }
  40. 40. Sobrescribir el ApplicationFactory <ul><li>Cuando redefinimos un ApplicationFactory el entorno JSF nos permite analizar la instancia original. </li></ul><ul><li>Usando este principio podemos construir un Decorator del ApplicationFactory normal. </li></ul><ul><li>La clase SpringApplicationFactory debe extender de ApplicationFactoryImpl </li></ul>
  41. 41. Descripción <ul><li>Todos los métodos son de un Decorator, excepto getApplication(); </li></ul><ul><li>Se muestran los constructores </li></ul>public Application getApplication() { return SpringApplication.crearApp (original.getApplication()); } public SpringApplicationFactory() { ; } public SpringApplicationFactory(ApplicationFactory af) { super(); setApplicationFactory(af); }
  42. 42. Contenidos <ul><li>Descripción </li></ul><ul><li>Configuración </li></ul><ul><li>Descripción del DAO </li></ul><ul><li>VariableResolver </li></ul><ul><li>Application y ApplicationFactory </li></ul><ul><li>Complementando con Hibernate </li></ul><ul><li>Después de… </li></ul>
  43. 43. Pegándole Hibernate <ul><li>El hecho de complementar Hibernate es trivial. </li></ul><ul><li>La configuración de los beans determinados se hace mediante Spring. </li></ul><ul><li>El material puede encontrarse en anteriores presentaciones. </li></ul>
  44. 44. Contenidos <ul><li>Descripción </li></ul><ul><li>Configuración </li></ul><ul><li>Descripción del DAO </li></ul><ul><li>VariableResolver </li></ul><ul><li>Application y ApplicationFactory </li></ul><ul><li>Complementando con Hibernate </li></ul><ul><li>Después de… </li></ul>
  45. 45. Después de <ul><li>Intentenlo, y si tienes dudas o sugerencias pues contactenme: </li></ul><ul><li>Jorge Luis Palacio Pineda </li></ul><ul><li>[email_address] </li></ul>
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×