Curso de Desarrollo Web 2

  • 4,705 views
Uploaded on

Un complemento al anterior para incluir JSF

Un complemento al anterior para incluir JSF

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
4,705
On Slideshare
0
From Embeds
0
Number of Embeds
4

Actions

Shares
Downloads
204
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Desarrollo Web JSF + Spring + Hibernate Jorge Luis Palacio Pineda
  • 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
  • 3. Contenidos
    • Descripción
    • Configuración
    • Descripción del DAO
    • VariableResolver
    • Application y ApplicationFactory
    • Complementando con Hibernate
    • Después de…
  • 4. Contenidos
    • Descripción
    • Configuración
    • Descripción del DAO
    • VariableResolver
    • Application y ApplicationFactory
    • Complementando con Hibernate
    • Después de…
  • 5. 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.
  • 6. Arquitectura Hibernate JSF Spring DAO’s Services DB
  • 7. Distribución Física DB (MySQL) Servidor Web Internet
  • 8. 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
  • 9. Contenidos
    • Descripción
    • Configuración
    • Descripción del DAO
    • VariableResolver
    • Application y ApplicationFactory
    • Complementando con Hibernate
    • Después de…
  • 10. 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
  • 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. 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.
  • 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. 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.
  • 15. 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.
  • 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. 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.
  • 18. Contenidos
    • Descripción
    • Configuración
    • Descripción del DAO
    • VariableResolver
    • Application y ApplicationFactory
    • Complementando con Hibernate
    • Después de…
  • 19. DAO
    • Son objetos que abstraen las funcionalidades de acceso a datos.
    • Permiten abstraer el acceso a datos.
    DAO Capa de Acceso a Datos App
  • 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. 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
  • 22. 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í
  • 23. Contenidos
    • Descripción
    • Configuración
    • Descripción del DAO
    • VariableResolver
    • Application y ApplicationFactory
    • Complementando con Hibernate
    • Después de…
  • 24. 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.
  • 25. 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)…
  • 26. Sobreescritura del Método
    • Recuperaremos el contexto WAC
    • WebApplicationContext ac = SpringDecorator.getSpringContext();
    • Si Spring no sabe manejar el bean, delegamos al VR original
    • If(!wac.containsBean(var))
    • return super.resolveVariable(fc, var);
  • 27. Sobreescritura del Método
    • Posteriormente creamos una sesión
    • fc.getExternalContext().getSession(true);
    • Buscamos el Scope apropiado
    • Map<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();
    • }
  • 28. Sobreescritura del Método
    • Si el scope no es valido terminamos
    • if(scope == null) return null;
    • Si el scope ya tiene la variable la usamos
    • if(scope.containsKey(var))
    • return scope.get(var);
    • En caso contrario lo creamos y regresamos
    • Object o = wac.getBean(var);
    • scope.put(var, o);
    • Return o;
  • 29. 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.
  • 30. 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>
  • 31. 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.
  • 32. Contenidos
    • Descripción
    • Configuración
    • Descripción del DAO
    • VariableResolver
    • Application y ApplicationFactory
    • Complementando con Hibernate
    • Después de…
  • 33. 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.
  • 34. 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.
  • 35. Redefinir los métodos apropiados
    • Implementar los métodos propios de ApplicationImpl.
    • Redefinir los métodos adecuados
      • createValidator(String);
      • createComponent(String);
      • createConverter(String);
  • 36. 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);
    • }
  • 37. 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); } }
  • 38. Sobrescribir createConverter
    • Ejercicio
      • Existe 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
  • 39. 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); }
  • 40. 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
  • 41. Descripción
    • Todos los métodos son de un Decorator, excepto getApplication();
    • Se muestran los constructores
    public Application getApplication() { return SpringApplication.crearApp (original.getApplication()); } public SpringApplicationFactory() { ; } public SpringApplicationFactory(ApplicationFactory af) { super(); setApplicationFactory(af); }
  • 42. Contenidos
    • Descripción
    • Configuración
    • Descripción del DAO
    • VariableResolver
    • Application y ApplicationFactory
    • Complementando con Hibernate
    • Después de…
  • 43. 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.
  • 44. Contenidos
    • Descripción
    • Configuración
    • Descripción del DAO
    • VariableResolver
    • Application y ApplicationFactory
    • Complementando con Hibernate
    • Después de…
  • 45. Después de
    • Intentenlo, y si tienes dudas o sugerencias pues contactenme:
    • Jorge Luis Palacio Pineda
    • [email_address]