Professional Documents
Culture Documents
WEB MASTER
Empresa POKY
Contenidos I
Objetivos del Curso
Curso de introduccin al mundo de Java EE. Dirigido a:
Desarrolladores sin experiencia en Java EE. Analistas/Jefes de Proyecto inmersos en proyectos Java EE. Cualquier profesional con nimo de conocer Java EE.
Herramientas de Desarrollo
Nociones bsicas de Eclipse. Mencin especial a otras herramientas importantes.
Lenguaje Java
Nociones bsicas de POO. Nociones bsicas de POA. Nociones bsicas de Java y novedades de Java 1.5.
Patrones de Diseo
Ideas generales de patrones de diseo. Patrones de diseo Web. El Patrn MVC.
Contenidos II
Arquitectura Java EE
Modelo de Capas Contenedores y Servicios Java EE Ensamblado y Empaquetado Java EE. Eclipse y Java EE.
Tecnologas Java EE
Tecnologas de la Vista: JSF y Facelets Tecnologas de Control: EJB Tecnologas del Modelo: JPA
I.
Herramientas de Desarrollo
I. Herramientas de Desarrollo
Multitud de Herramientas
Jdeveloper, NetBeans, IntelliJ, Eclipse, La decisin es clara: Eclipse.
Modular y ampliable mediante plugins. Muy utilizada y en constante desarrollo. En realidad todas las citadas tienen gran calidad. Es la que se emplea en FundeWeb.
I. Herramientas de Desarrollo
1.Menu: Incluye todas las opciones del entorno y algunos iconos de acceso directo a las ms empleadas. 2.Perspectiva: Permite alternar entre las diferentes perspectivas que haya abiertas. 3.Control Proyecto: Permite controlar el contenido del proyecto, los archivos que lo componen. 4.Editor: La zona ms amplia para editar el contenido de los archivos ya sea visualmente o en modo texto. 5.Propiedades: Utilizada en muchas ocasiones para editar propiedades del archivo editado. 6.Control Ejecucin: Incluye todo lo necesario para controlar y monitorizar la ejecucin de nuestro proyecto.
I. Herramientas de Desarrollo
Terminologa de Eclipse
Espacio de Trabajo: Workspace
Directorio en el que se almacenan los proyectos y configuraciones especficas. Se puede cambiar de espacio de trabajo de forma sencilla. Recomendacin: No tener todos los proyectos en un ET.
Perspectivas
Configuracin predeterminada de las zonas de trabajo adecuadas para un tipo de tarea concreta: Proyectos Web, Swing, BBDD, etc
Vistas
Pestaas que se ubican en las zonas de trabajo y que permiten hacer tareas concretas: Editor, Console, Navigator, Server, Artefactos de desarrollo: Vistas que nos ayudan a editar el proyecto. Artefactos de runtime: Vistas que nos ayudan a monitorizar y testar el proyecto.
I. Herramientas de Desarrollo
Subversion.
Eclipse incluye su control de versiones local por sesin, pero no es suficiente. Mediante el plugin Subclipse, se incorporan a nuestros proyectos todas las posibilidades del control de versiones. Importante emplear Subversin de forma correcta:
Liberar versiones. Emplear comentarios adecuados. Crear ramas.
I. Herramientas de Desarrollo
Maven.
Gestor de proyectos. Forma de compartir el conocimiento de la metainformacin de un proyecto.
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.um.atica</groupId> <artifactId>Prueba_Maven</artifactId> <name>Prueba_Maven</name> <version>0.0.1-SNAPSHOT</version> <description>Ejemplo de archivo POM de Maven.</description> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.4</version> <scope>test</scope> </dependency> </dependencies> </project>
I. Herramientas de Desarrollo
Maven.
Incorporar alguien a un proyecto. Sin Maven
Instalacin del software. Descarga de fuentes. Descarga de libreras. Configurar la herramienta para compilar y ejecutar.
Con Maven
Instalacin del software. Descarga de fuentes. Ejecucin de tarea maven.
I. Herramientas de Desarrollo
Hudson.
Servidores de integracin contnua. Todas las fases de generacin de mi proyecto automatizadas. No necesito personas supervisando tareas automticas.
Desarrollador
1. Commit
Repositorio Subversion
2. Update
I. Herramientas de Desarrollo
Prcticas I
Introduccin a Eclipse
Crea un proyecto Java. Crea dos clases. Cambia la perspectiva entre Java y Resource.
Perspectivas
Modifica las vistas que aparecen en la perspectiva Resource. Elimina la vista Project Explorer. Incluye la vista Navigator y Package Explorer. Incluye la vista Problemas. Restaura el estado original de la perspectiva.
Configuracin
Modifica aspectos generales del editor, colores, tipos de letra, etc Amplia la funcionalidad de eclipse con algn plugin.
I. Herramientas de Desarrollo
Crea un proyecto Java.
I. Herramientas de Desarrollo
Crea dos clases Java.
I. Herramientas de Desarrollo
Instalar un Plugin: Subversion.
I. Herramientas de Desarrollo
Prcticas II
Gestin de Proyectos
Modifica las clases Java: Crea un Hola Mundo. Compara ambas clases. Incluye tareas pendientes en ambas clases. Visualiza las tareas pendientes.
Ejecucin de Proyectos
Ejecuta alguna de las clases creadas. Incluye puntos de ruptura. Observa las posibilidades del Debug.
Compartir Proyectos
Comparte tu proyecto en un repositorio. Descarga un proyecto desde el repositorio.
I. Herramientas de Desarrollo
Gestionar Proyectos.
Objeto
Instancia de una clase, dispone de unas propiedades concretas.
Mtodo
Algoritmo asociado a un objeto que se lanza tras recibir un mensaje.
Atributo
Contenedor de un tipo de dato asociado a un objeto. Notacin punto.
Mensaje
Comunicacin dirigida a un objeto. Notacin punto.
Ocultacin
Exponer una interface.
Encapsulamiento
Aumentar la cohesin.
Polimorfismo
Comportamientos diferentes asociados a objetos diferentes pero con igual nombre.
Herencia
Las clases se relacionan a travs de una jerarqua.
Join Point
Punto de la ejecucin donde puede conectarse un aspecto.
Advice
Implementacin del aspecto.
Pointcut
Define los aspectos a aplicar en cada Join Point.
Introduction
Permite aadir mtodos o atributos a clases ya existentes.
Target
Clase a la que se aade el aspecto.
Proxy
Objeto creado despus de aplicar el aspecto.
Weaving
Proceso de aplicar aspectos a los objetos.
Ediciones
Java ME: Micro Edition. Java SE: Standart Edition. Java EE: Enterprise Edition.
Desarrollo vs Ejecucin
JSDK: Kit de desarrollo. JRE: Kit de runtime.
Estructuras de Control
Comentarios: // y /* */ Bifurcaciones: if (cond) { } else { } Bucles: while (cond) { }, for (init; cond; inc) { }
Contenedor c = new Contenedor (); Productor produce = {new Productor (c); for int if (!hayDato) value (int i = = 0; 0; i{<try 10;{ i++) wait(); } catch (InterruptedException e) { } } Consumidor consume for hayDato (int i = 0; false i< ;contenedor.put(i); 10; i++) { = new Consumidor (c);
notifyAll(); System.out.println("Productor. value = contenedor.get(); put: " + i); produce.start(); return dato; try { sleep((int)(Math.random() * get: System.out.println("Consumidor. 100)); "+ } value); catch (InterruptedException e) { } consume.start();
} } }
}
} public synchronized void put(int valor) { if (hayDato) { try { wait(); } catch (InterruptedException e) { } } dato = valor; hayDato = true; notifyAll(); } }
Autoboxing
Vector<Integer> v = new Vector<Integer>(); v.addElement(30); // No requiere conversin int Integer.
Bucles Simples
Vector<String> v = new Vector<String>(); for (String c: v) System.out.println(c);
Tipo enum
enum EstadoCivil { soltero, casado, divorciado }; EstadoCivil ec = EstadoCivil.casado;
Import Esttico
import static java.lang.Math; double raiz = sqrt(1245);
Argumentos Variables
public void miFunc(String p1,int args) { for (int i:args) { } }
Metainformacin
Anotaciones p.e. @Override.
Motivacin:
Un porcentaje muy elevado de los problemas a los que nos enfrentamos ya han sido resueltos anteriormente por otras personas.
Abstract Factory: Permite crear un builder diferente segn la implementacin de XML disponible. Builder: Simplifica procesos de creacin complejos para un documento.
Se distribuyen en tres capas: Presentacin, Negocio e Integracin. De entre todos los patrones Web existentes el ms conocido y empleado es el MVC.
MODELO
public Vista doSend() { model.setEnviado(true); return new Vista("Respuesta de Send."); public class Modelo { } private boolean enviado = false; public Vista doVerify() { if (model.isEnviado()) return new Vista("Send ya ejecutado."); public void setEnviado( boolean enviado) { this .enviado = enviado; } return new Vista("Send no ejecutado."); } public boolean isEnviado() { return enviado; } } }
Decorator.
Crear un sistema gestor de ventanas que permita crear ventanas con diferentes caractersticas. De este modo se pueden crear ventanas que mezclen diferentes caractersticas sin necesidad de crear todas las combinaciones.
Observer.
Crear un sistema de actualizaciones automticas en funcin de la variacin de diversos objetos. Es un patrn especfico para este tipo de trabajo.
Abstract Factory.
Crear nmeros aleatorios permitiendo emplear diversas APIs de generadores de nmeros aleatorios. Builder puede ser excesivo mejor para tratar de simplificar la construccin.
Singleton
Asegurar la aleatoriedad de dichos nmeros.
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" pageEncoding= "ISO-8859-1" %> public class xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee MiTag extends SimpleTagSupport { web-jsptaglibrary_2_0.xsd"> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" public void doTag() throws JspException { "http://www.w3.org/TR/html4/loose.dtd"> <tlib-version>1.0</tlib-version> PageContext pageContext = (PageContext) getJspContext(); <html> <short-name>MTags</short-name> JspWriter out = pageContext.getOut(); <uri>MisTags</uri> <head> try { <metaout.println("Hello http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> World"); <tag> <title>Insert title here</title> } catch (Exception e) { } <name>mitag</name> </head> } <tag-class>tag.MiTag</tag-class> <body> <body-content>empty</body-content> }</tag> <t:mitag/> </body> </taglib> </html>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" pageEncoding= "ISO-8859-1" %> public class xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee MiTag extends SimpleTagSupport { web-jsptaglibrary_2_0.xsd"> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" <tlib-version>1.0</tlib-version> private String propiedad; "http://www.w3.org/TR/html4/loose.dtd"> <short-name>MTags</short-name> <uri>MisTags</uri> <html> public void setPropiedad(String p) { propiedad = p; } <tag> <head> <name>mitag</name> <meta http-equiv= "Content-Type" content= "text/html; charset=ISO-8859-1"> public void doTag() throws JspException { <tag-class>tag.MiTag</tag-class> <title>Insert titlepageContext here</title> PageContext = (PageContext) getJspContext(); <body-content>empty</body-content> JspWriter out = pageContext.getOut(); </head> <attribute> try { <body> <name>propiedad</name> out.println("Hello World: "+propiedad); <rtexprvalue>true</rtexprvalue> <t:mitag propiedad=Una Propiedad/> } catch (Exception e) { } <required>false</required> }</attribute><t:mitag propiedad=${param[nombre]}/> </body> </tag> </html> } </taglib>
</body> </html>
fichero.jsp * Simple *
<%@ taglib Hola Mundo !!prefix="t" tagdir="/WEB-INF/tags" %> <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding= * Con Parmetros *"ISO-8859-1"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <%@attribute name="color" required="true" %> <html> <font color=${pageScope.color}>Hola Mundo!!</font> <head> theColor = (String) pageContext.getAttribute("color"); %> <%String <meta http-equiv="Content-Type" content= "text/html; charset=ISO-8859-1"> <font color=<%=theColor%>>Hola Mundo!!</font> <title>Insert title here</title> </head> * Con Contenido * <body> <t:mitag/> <%@attribute name="color" required="true" %> <t:mitag color=red/> <font color=${pageScope.color}><jsp:doBody/></font> color=red>Texto</t:mitag> <jsp:doBody<t:mitag var="theBody"/> </body> bc = (String) pageContext.getAttribute("theBody"); %> <%String </html> <font color=${pageScope.color}><%= bc.toUpperCase() %></font>
public void attributeRemoved(HttpSessionBindingEvent arg0) { } public void attributeAdded(HttpSessionBindingEvent arg0) { System.out.println("Acaba de Pensarse en el: "+arg0.getSession().getAttribute("MiNumero")); } public void attributeReplaced(HttpSessionBindingEvent arg0) { }
V. Tecnologas Java EE
V. Tecnologas Java EE
Tecnologas Vista: JSF
Estndar SUN: Existen muchas alternativas.
Comunidad de desarrollo amplia. Apoyo tecnolgico de las principales compaas. Adaptacin de las mejores ideas de otros. Lentitud en asimilar nuevas tecnologas. Modificaciones o mejoras lentas. Dependencia de implementaciones de terceros.
V. Tecnologas Java EE
Tecnologas Vista: JSF
Componentes de JSF:
API + Implementacin de Referencia.
Representan componentes UI y manejan su estado, eventos, validaciones, navegacin, etc
Librera de Etiquetas.
Etiquetas personalizadas de JSP para dibujar los componentes UI dentro de las pginas JSP.
V. Tecnologas Java EE
Ciclo de Vida JSF
Las peticiones Faces no se limitan a peticinrespuesta, disponen de un ciclo de vida. El ciclo de vida depende del tipo de peticin.
Respuesta No-Faces: Respuesta generada al margen de la fase de renderizar respuesta de faces. Respuesta Faces: Respuesta generada en la fase de renderizar respuesta de faces. Peticin No-Faces: Peticin enviada a un componente no faces. Peticin Faces: Peticin enviada desde una respuesta faces previamente generada.
V. Tecnologas Java EE
Ciclo de Vida JSF
V. Tecnologas Java EE
Ciclo de Vida JSF
Reconstruir el rbol de componentes.
Se construye el rbol de componentes faces.
Procesar validaciones.
Se procesan las validaciones para los componentes.
Invocar aplicacin.
En este punto se manejan los eventos a nivel de aplicacin.
Renderizar respuesta.
Por ltimo se dibujan los componentes del rbol.
V. Tecnologas Java EE
Componentes JSF
Conjunto de clases UIComponent.
Representan los componentes.
Modelo de renderizado.
Forma de visualizar el componente.
Modelo de eventos.
Forma de manejar los eventos lanzados.
Modelo de conversin.
Conectar conversores de datos al componente.
Modelo de validacin.
Forma de registrar validadores para el componente.
V. Tecnologas Java EE
Componentes JSF
<h:dataTable id="noticias" value="#{Noticias.listadoCategoria}" var="noti"> <h:column> <f:facet name="header"><h:outputText value="Titular"/></f:facet> <h:outputText value="#{noti.titulo}" /> </h:column> <h:column> <f:facet name="header"><h:outputText value="Contenido"/></f:facet> <h:outputText value="#{noti.contenido}" /> </h:column> </h:dataTable> --------------------------------------------------------------------------------------------------------------------------------------------------------------<h:form id=NoticiaForm> <h:outputText value="Cdigo:"/> <h:inputText id="codigo" value="#{GestorNoticias.noticia.codigo}" required="true" /><br/> <h:outputText value="Titulo:"/> <h:inputText id="titulo" value="#{GestorNoticias.noticia.titulo}" required="true" /><br/> <h:outputText value="Contenido:"/> <h:inputText id="contenido" value="#{GestorNoticias.noticia.contenido}" required="true" /><br/> <h:outputText value="Fecha:"/> <h:inputText id="fecha" value="#{GestorNoticias.noticia.fecha}" required="true"> <f:convertDateTime pattern="dd/MM/yyyy"/> </h:inputText><br/> <h:outputText value="Portada:"/> <h:selectBooleanCheckbox id="portada" value="#{GestorNoticias.noticia.portada}" required="true" /><br/> <h:outputText value="Categoria:"/> <h:selectOneMenu id="categoria" value="#{GestorNoticias.categoriaId}"> <f:selectItems value="#{GestorNoticias.selectCategorias}" /> </h:selectOneMenu><br/> <h:commandButton value="Guardar" action="#{GestorNoticias.saveNoticia}" /> </h:form>
http://java.sun.com/javaee/javaserverfaces/reference/docs/
http://java.sun.com/javaee/javaserverfaces/1.2/docs/tlddocs/
http://java.sun.com/javaee/javaserverfaces/1.2_MR1/docs/api/index.html
V. Tecnologas Java EE
Faces-Config.xml
Archivo de configuracin principal.
Describe los bean manejados.
<managed-bean> <description>Noticiero</description> <managed-bean-name>GestorNoticias</managed-bean-name> <managed-bean-class>web.GestorNoticias</managed-bean-class> <managed-bean-scope>application/session/request/none</managed-bean-scope> <context-param> </managed-bean>
V. Tecnologas Java EE
JSF Paso a Paso
Ciclo de Vida
Podemos crear un Listener.
Escucha la fase indicada en getPhaseId.
public class PhaseListener implements javax.faces.event.PhaseListener { public void afterPhase(PhaseEvent event) { System.out.println("AFTER - "+event.getPhaseId()); } public void beforePhase(PhaseEvent event) { System.out.println("BEFORE - "+event.getPhaseId()); } public PhaseId getPhaseId() { return PhaseId.ANY_PHASE; } }
V. Tecnologas Java EE
JSF Paso a Paso
Mapear Componentes Con Objetos
Mapear Valores Fijos
<h:outputText value=Hola Mundo !!"/>
V. Tecnologas Java EE
JSF Paso a Paso
Mapear Componentes
Mapear Componentes Completos Backing Beans
<h:outputText binding="#{managedBeans.component}"/>
package mbeans; import javax.faces.component.UIOutput; public class ManagedBeans { private UIOutput component; public void setComponent(UIOutput ui) { component = ui; component.setValue("Hola Mundito !!"); } public UIOutput getComponent() { return component; } }
V. Tecnologas Java EE
JSF Paso a Paso
Invocar Mtodos
Mtodos de Validacin
Utilizados slo en UIInput. Reciben el FacesContext y el componente a validar y su valor.
<h:messages/> <h:inputText validator="#{managedBeans.validateEmail}"/>
public void validateEmail(FacesContext ctx, UIComponent cmp, Object obj) { String email = (String)obj; if (email.indexOf("@")<0) { ((UIInput)cmp).setValid(false); ctx.addMessage(cmp.getClientId(ctx), new FacesMessage("Mail Incorrecto", "")); } else ((UIInput)cmp).setValid(true); }
V. Tecnologas Java EE
JSF Paso a Paso
Invocar Mtodos
Manejadores de Acciones
Se utiliza en UICommand y UIButton. Reciben el evento.
<h:commandButton value="Pulsa" actionListener="#{managedBeans.ejecutaAccion}/> public void ejecutaAccion(ActionEvent ev) { System.out.println("Se ejecuta la accin !!"); }
V. Tecnologas Java EE
JSF Paso a Paso
Invocar Mtodos
Manejadores de Navegacin
Se utiliza en UICommand y UIButton. Retornan una cadena de navegacin.
<h:commandLink value="Pincha" action="#{managedBeans.onlyAction}/> public String onlyAction() { return success"; }
V. Tecnologas Java EE
JSF Paso a Paso
Invocar Mtodos
Manejadores de Cambios
Capturar cambios sobre componentes UIInput.
<h:selectBooleanCheckbox valueChangeListener="#{managedBeans.changeColor}" onchange="submit()"/> public void changeColor(ValueChangeEvent event) { boolean flag = ((Boolean)event.getNewValue()).booleanValue(); System.out.println("Check: "+flag); }
V. Tecnologas Java EE
JSF Paso a Paso
Controlar Navegacin
Conjunto de reglas para seleccionar la siguiente pgina a la que moverse. La seleccin depende de:
Pgina actual. Action ejecutado por el componente que navega. Cadena retornada por el action (outcome).
V. Tecnologas Java EE
JSF Paso a Paso
Controlar Navegacin. Ejemplos.
<navigation-rule> <from-view-id>/pages/logon.jsp</from-view-id> <navigation-case> <from-outcome>success</from-outcome> <to-view-id>/continue1.jsp</to-view-id> </navigation-case> <navigation-case> <from-action>#{m.acc}</from-action> <from-outcome>success</from-outcome> <to-view-id>/continue2.jsp</to-view-id> </navigation-case> </navigation-rule> <navigation-rule> <from-view-id>/pages/*</from-view-id> <navigation-case> <from-outcome>success</from-outcome> <to-view-id>/continue3.jsp</to-view-id> </navigation-case> </navigation-rule> <navigation-rule> <navigation-case> <from-outcome>error</from-outcome> <to-view-id>/error.jsp</to-view-id> </navigation-case> </navigation-rule> Enlace en /pages/logon.jsp <h:commandButton action=success" value="Submit" /> <h:commandButton action=#{m.acc}" value="Submit" /> <h:commandButton action=error" value="Submit" /> Enlace en /pages/otra.jsp <h:commandButton action=success" value="Submit" /> <h:commandButton action=#{m.acc}" value="Submit" /> <h:commandButton action=error" value="Submit" /> Destino continue1.jsp continue2.jsp error.jsp Destino continue3.jsp continue3.jsp error.jsp
V. Tecnologas Java EE
JSF Paso a Paso
Crear el adivinador de nmeros JSF.
Crear un bean para calcular el nmero aleatorio. El mismo bean puede recoger el nmero introducido. Crea el JSP para solicitar el nmero, valida la entrada con validateLongRange. Configura la navegacin adecuada.
V. Tecnologas Java EE
Crea un Hola Mundo JSF.
V. Tecnologas Java EE
Crea un Hola Mundo JSF.
V. Tecnologas Java EE
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ taglib prefix="f" uri= "http://java.sun.com/jsf/core"%> Internacionalizar i18n <%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <application> <html> <locale-config> <managed-bean> <head> public class Adivina { <default-locale>es</default-locale> <managed-bean-name>adivina</managed-bean-name> <%@ language= "java" contentType= pageEncoding="ISO-8859-1"%> <metapage http-equiv= "Content-Type" content="text/html; "text/html; charset=ISO-8859-1" charset=ISO-8859-1"> <supported-locale>en</supported-locale> <managed-bean-class>mbeans.Adivina</managed-bean-class> <%@ taglibprivate prefix= "f" uri= "http://java.sun.com/jsf/core"%> <title>Insert title here</title> long numeroPensado; </locale-config> <managed-bean-scope>session</managed-bean-scope> <%@ taglibprivate prefix="h" uri="http://java.sun.com/jsf/html"%> </head> int numero; <message-bundle>msg.mensajes</message-bundle> <managed-property> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <body> private int minimo; <resource-bundle> <property-name>minimo</property-name> <html> <f:view> private int maximo; <base-name>msg.mensajes</base-name> <value>1</value> <head> <h:outputText rendered="#{adivina.intentado}" value="Lo siento, vuelve a probar !!"/> <var>msg</var> </managed-property> <meta http-equiv= "Content-Type" content= charset=ISO-8859-1" > He pensado un nmero entre"text/html; <h:outputText value="#{adivina.minimo}"/> y public Adivina() { numeroPensado = Math. round (Math.random()*10); } </resource-bundle> <managed-property> <title>Insert title here</title> <h:outputText value="#{adivina.maximo}"/>, adivina !! public int getNumero() { return numero; } </application> <property-name>maximo</property-name> </head> <h:form> public void setNumero( int n) { numero = n; } <value>10</value> <body> <h:messages showDetail= "true"/> var="msg"/> <f:loadBundle basename="msg.mensajes" public int getMinimo() { </managed-property> return minimo;} <f:view> <h:selectOneMenu onchange= "submit()" <h:messages showDetail=true showSummary=true/> public void setMinimo( int minimo) { this.minimo = minimo; } </managed-bean> Has acertado, era el <h:outputText value="#{adivina.numero}"/> !! valueChangeListener="#{adivina.cambiaIdioma}" immediate= "true"> <h:outputText value= "#{msg.titulo}" /> public int getMaximo() { return maximo; } <navigation-rule> </f:view> public void setMaximo( <f:selectItem itemLabel="#{msg.castellano}" itemValue= "es"/> int maximo) {this.maximo = maximo; } <from-view-id>/index.jsp</from-view-id> </body> <f:selectItem itemLabel="#{msg.ingles}" itemValue= "en"/> Archivo public de Propiedades : msg/mensajes.properties , msg/mensajes_en.properties , String adivinar() { return (numeroPensado==numero)? "success:"fail"; } <navigation-case> </html> </h:selectOneMenu> public boolean isIntentado() { return numero!=0; } <from-outcome>success</from-outcome> <h:inputText value="#{adivina.numero}"> public void event) { titulo=Pienso en un cambiaIdioma(ValueChangeEvent nmero entre <to-view-id>/next.jsp</to-view-id> <f:validateDoubleRange minimum="#{adivina.minimo}" maximum="#{adivina.maximo}"/> FacesContext. getCurrentInstance ().getViewRoot().setLocale( new Locale((String)event.getNewValue())); </navigation-case> javax.faces.validator.DoubleRangeValidator.NOT_IN_RANGE=Sumario </h:inputText> // Cortocircuito !! <navigation-case> javax.faces.validator.DoubleRangeValidator.NOT_IN_RANGE_detail=Valor fuera de rango {0} - {1}. <h:commandButton value="Prueba" action="#{adivina.adivinar}"/> FacesContext. getCurrentInstance ().renderResponse(); <from-outcome>fail</from-outcome> </h:form> } <to-view-id>/index.jsp</to-view-id> </f:view> } </navigation-case> </body> </navigation-rule> </html>
V. Tecnologas Java EE
Facelets
Complemento ideal para JSF. Definir una plantilla para tu portal y emplearla en todas tus pginas.
<ui:include src=cabecera.xhtml/> <ui:insert name=body/>
<ui:include src=pie.xhtml/>
V. Tecnologas Java EE
Crea una plantilla facelets.
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" jsf-facelets-1.1.15.B1.jar "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" > <html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" faces-config.xml los id de las vistas pasan >de xmlns:h="http://java.sun.com/jsf/html" xmlns:f= "http://java.sun.com/jsf/core" <f:view contentType= /> .jsp "text/html" a .xhtml. <head> <meta http-equiv="Content-Type" content="text/xhtml+xml; charset=UTF-8" /> <title>Simple JSF</title> <link href="stylesheet/theme.css" rel="stylesheet" type="text/css" /> </head> <body> <div id="content"> <div id="header"><ui:include src="header.xhtml" /></div> <div id="menu" style="float:left;width:200px;"><ui:include src="menu.xhtml" /></div> <div id="body" style="float:left;"><ui:insert name="body" >Default Content</ui:insert></div> <div id="footer"><ui:include src="footer.xhtml" /></div> </div> </body> </html>
Nota: web.xml y faces-config.xml los modifica eclipse !! reglas Debemos cambiar las vistas y las
del
V. Tecnologas Java EE
Usar RichFaces. <!-- RichFaces en web.xml -->
<context-param> <param-name>org.richfaces.SKIN</param-name> <param-value>blueSky</param-value> Para Usar RichFaces Aadir Libreras: </context-param> <!-- RichFaces + Facelets --> commons-beanutils-1.7.0.jar <context-param> <?xml version="1.0" encoding="UTF-8"?> <param-name>org.ajax4jsf.VIEW_HANDLERS</param-name> commons-digester-1.8.jar <html xmlns: a4j="http://richfaces.org/a4j" xmlns:rich="http://richfaces.org/rich"> <param-value>com.sun.facelets.FaceletViewHandler</param-value> <body bgcolor="white"> </context-param> commons-logging-1.1.1.jar <filter> <rich:panel id="panelRoot" > <display-name>RichFaces Filter</display-name> richfaces-api-3.3.1.GA.jar <rich:spacer height="5" title="Here is a spacer..."/><br /> <filter-name>richfaces</filter-name> <rich:separator lineType="beveled" height="8" width="100%" align="center"/> <filter-class>org.ajax4jsf.Filter</filter-class> richfaces-impl-3.3.1.GA.jar <rich:separator height="2" lineType="dotted"/><br /> </filter> </rich:panel> <filter-mapping> richfaces-ui-3.3.1.GA.jar <filter-name>richfaces</filter-name> </body> Servlet</servlet-name> Nota : Hay que configurar <servlet-name>Faces a mano !! </html> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> Y muchos componentes ms: RichFaces Live Demo. <dispatcher>INCLUDE</dispatcher> </filter-mapping> <listener> <listener-class>com.sun.faces.config.ConfigureListener</listener-class> </listener> <!-- Ya no es necesario modificar faces-config.xml --> <!-- application> <view-handler>com.sun.facelets.FaceletViewHandler</view-handler> </application -->
V. Tecnologas Java EE
Tecnologas Control: EJB
Dar ms servicios a los objetos empleados en las aplicaciones web. Contenedor especfico para desplegar y ejecutar este tipo de objetos. Posibilidad de compartir lgica a travs de estos objetos. Necesario un Contenedor de EJB. Servidor JEE.
V. Tecnologas Java EE
Tecnologas Control: EJB
Tipos de EJB
Session Beans: Sitos en la lgica de negocio.
Stateless: Sin informacin de estado. Stateful: Mantienen el estado entre peticiones.
Message Driven Beans: Utilizados para invocar mtodos de forma asncrona. Entity Beans: Empleados en la capa de persistencia para representar datos del modelo.
V. Tecnologas Java EE
Tecnologas Control: EJB
Ciclo de Vida
Creacin, Destruccin, Pasivacin (Stateful).
V. Tecnologas Java EE
Tecnologas Control: EJB
Callbacks
Siempre que tenemos un ciclo de vida. Posibilidad de emplear AOP.
@PostConstruct @PreDestroy @PreActivate @PostActivate
Interceptores
Siempre que empleamos contenedores IoC y Ciclos de Vida. Posibilidad de emplear AOP.
Default Clase Mtodo
V. Tecnologas Java EE
Tecnologas Control: EJB
Anotaciones.
Forma de simplificar la definicin del EJB.
@Stateful @Stateless
@Stateless public class PlaceBidBean implements PlaceBid { @Interceptors(ActionBazaarLogger.class) public void addBid(Bid bid) { ... } } public class ActionBazaarLogger { @AroundInvoke public Object logMethodEntry(InvocationContext invocationContext) throws Exception { System.out.println(Entering: + invocationContext.getMethod().getName()); return invocationContext.proceed(); } }
V. Tecnologas Java EE
Prcticas II
Crea un proyecto EJB. Liga tu proyecto EJB a una aplicacin Web. Emplea los EJBs creados desde la aplicacin Web. Crea los EJB necesarios para Diario Digital.
V. Tecnologas Java EE
Crea un proyecto EJB.
V. Tecnologas Java EE
Crea un EJB.
@Stateless public class Ejemplo implements EjemploLocal { double numero; public Ejemplo() { System.out.println("Stateless!!!"); numero = Math.floor(Math.random()*10+1); } @Override public String getMensaje() { numero++; return "Mensaje ["+numero+"]"; } } @Stateful public class EjemploB implements EjemploBLocal { double numero; public EjemploB() { System.out.println("Stateful!!!"); numero = Math.floor(Math.random()*10+1); } @Override public String getMensaje() { numero++; return "MensajeB ["+numero+"]"; } }
public class JSFBean { @EJB Faces-config.xml public EjemploBLocal ejemplo; -------------------------------------------------------------------------------------public String getMensaje() { return ejemplo.getMensaje(); } <managed-bean> } <managed-bean-name>jSFBean</managed-bean-name> <managed-bean-class>mb.JSFBean</managed-bean-class> <managed-bean-scope>session</managed-bean-scope> </managed-bean> Pgina -------------------------------------------------------------------------------------<h:outputText value="#{jSFBean.mensaje}" />
V. Tecnologas Java EE
Crea un EJB.
V. Tecnologas Java EE
Tecnologas Modelo: JPA
Muchos proyectos diferentes ORM.
IBatis, Hibernate, JDO, TopLink,
V. Tecnologas Java EE
Tecnologas Modelo: JPA
Contextos de Persistencia
Transacciones JTA: Empleada en Servidores de Aplicaciones JavaEE Transacciones RESOURCE_LOCAL: Empleada en Aplicaciones C/S.
<?xml version="1.0" encoding="UTF-8"?> <persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0"> <persistence-unit name="defaultPU" transaction-type="JTA"> <provider>org.hibernate.ejb.HibernatePersistence</provider> <jta-data-source>jdbc/NombreDataSource</jta-data-source> <properties> <property name="hibernate.hbm2ddl.auto" value="validate"/> <property name="hibernate.show_sql" value="true"/> <property name="hibernate.format_sql" value="true"/> <property name="hibernate.default_shema" value="NOMBRE"/> <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect"/> <property name="hibernate.transaction.manager_lookup_class value="org.hibernate.transaction.OC4JTransactionManagerLookup"/> <property name="hibernate.query.factory_class value="org.hibernate.hql.classic.ClassicQueryTranslatorFactory" /> <property name="hibernate.transaction.flush_before_completion" value="true"/> <property name="hibernate.cache.provider_class value="org.hibernate.cache.HashtableCacheProvider"/> </properties> </persistence-unit> </persistence>
V. Tecnologas Java EE
Tecnologas Modelo: JPA
Empleo de Persistencia
Declarar un EntityManager ligado a la Unidad que necesites.
public @Stateful class NoticiasBean implements Noticias,Serializable { @PersistenceContext(unitName="diarioPU") protected EntityManager entityManager; private List<Noticia> listado; public List<Noticia> getListado() { listado = entityManager.createQuery("from noticias.Noticia noti").getResultList(); return listado; } public void nuevaNoticia(Noticia not) { entityManager.persist(not); } }
V. Tecnologas Java EE
Tecnologas Modelo: JPA
Ciclo de Vida: Entity Beans
V. Tecnologas Java EE
Tecnologas Modelo: JPA
Anotaciones Bsicas: Entidades y Claves
@Entity public class Entidad { @EmbeddedId @AttributeOverrides({ @AttributeOverride(name = "id", column = @Column(name = "ID", nullable = false, precision = 5, scale = 0)), @AttributeOverride(name = "nombre", column = @Column(name = "NOMBRE", nullable = false, length = 50)), }) private EntidadId id; public Entidad() { } // Getters y Setters } @Embedded public class EntidadId { int id; String nombre; public EntidadId() { } public boolean equals(Object o) { /* Comprueba si son iguales */ } public int hashCode() { /* Buenas practicas equals() -> hashCode() */ } }
Clave Simple
@Entity @Table(name="USUARIOS") public class Usuario { @Id private String nick; ... public Usuario() { } // Getters y Setters }
Clave Compuesta
V. Tecnologas Java EE
Tecnologas Modelo: JPA
Anotaciones Bsicas: Atributos
@Entity @Table(name="USUARIOS") public class Usuario { @Id private String nick; @Embedded @AttributeOverrides({ @AttributeOverride(name="codigoPostal",column=@Column(name="COD_POS")), @AttributeOverride(name="direccionPostal",column=@Column(name="DIR_POS")) }) private Direccion direccion; public Usuario() { } // Getters y Setters } @Embeddable public class Direccion implements Serializable { private String direccionPostal; private String ciudad; private int codigoPostal; private String pais; public Direccion() { } public boolean equals(Object o) { /* Comprueba si las dos entidades son iguales */ } public int hashCode() { /* Buenas practicas equals() -> hashCode() */ } // Getters y Setters }
Atributo Simple
@Entity @Table(name="USUARIOS") public class Usuario { @Id private String nick; @Column(name="PASSWORD", nullable=false) private String pass; @Column(name="E-MAIL", nullable=false) private String mail; @Lob @Basic(fetch=FetchType.LAZY) private byte[] imagen; ... public Usuario() { } // Getters y Setters }
Atributo Compuesto
V. Tecnologas Java EE
Tecnologas Modelo: JPA
@Entity @Table(name="PERFILES") public class Perfil { @Entity @Id @Table(name="USUARIOS") @Column(name="PERFIL_ID") public class Usuario { private int id; @Id CascadeType.PERSIST : Cuando persistamos la entidad todas las ...entidades que private String nick; contenga esta variable sern persistidas tambin. } @Column(name="PASSWORD", nullable= false ) CascadeType.REMOVE : Cuando borremos la entidad todas las entidades que private String pass; @OneToOne contenga esta variable se borrarn del mismo modo. @JoinColumn(name="PERFIL_USUARIO_ID",referencedColumnName="PERFIL_ID", false)que CascadeType.REFRESH: Cuando actualicemos la entidad todasupdatable= las entidades private Perfil perfil; contenga esta variable se actualizarn. private Set<Noticia> noticias = new HashSet<Noticia>(0); CascadeType.MERGE: Cuando hagamos un "merge" de la entidad todas las @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY,mappedBy = "usuario") entidades que contenga esta variable realizarn la misma operacin. public Set<Noticia> getNoticias() { CascadeType.ALL @Entity citadas anteriormente. return this.noticias; : Todas las operaciones @Table(name = "NOTICIA") } public class Noticia implements java.io.Serializable { public void setNoticias(Set<Noticia> noticias) { ... this.noticias = noticias; private Usuario usuario; } @ManyToOne(fetch = FetchType.LAZY) ... @JoinColumn(name = "USUARIO", nullable = false) } @NotNull public Usuario getUsuario() { return this.usuario; } ManyToMany: Muy similar a ManyToOne public void setUsuario(Usuario usuario) { this.usuario = usuario; } pero simtrica en ambas clases. ... ManyToOne }
V. Tecnologas Java EE
Tecnologas Modelo: JPA
Anotaciones Avanzadas: Querys Personalizadas
@NamedNativeQuery ( name="nativeResult", query="SELECT USUARIO_ID,NOMBRE,APELLIDOS FROM USUARIOS WHERE USUARIO_ID= 123", resultSetMapping = "usuarioNamedMapping") @SqlResultSetMapping ( name="usuarioNamedMapping", entities = { @EntityResult ( entityClass = mi.clase.Usuario.class, fields = {@FieldResult ( name="usuarioId", column="USUARIO_ID"), @FieldResult ( name="nombre", column="NOMBRE"), @FieldResult ( name="apellidos", column="APELLIDOS") }) })
V. Tecnologas Java EE
Tecnologas Modelo: JPA
Anotaciones Avanzadas: Procedimientos Almacenados
create or replace procedure findUsersLike(res out sys_refcursor, str in string) as begin open res for select u.* from users u where u.username like concat(str, '%'); end findUsersLike; @NamedNativeQuery (name = "User.findLike", resultClass = User.class, query = "{call findUsersLike(?,:VAR)}", hints = { @QueryHint(name = "org.hibernate.callable", value = "true"), @QueryHint(name = "org.hibernate.readOnly", value = "true") } ) @org.hibernate.annotations.NamedNativeQuery (name=User.findLike, resultClass = User.class, query = "{call findUsersLike(?,:VAR)}", callable = true, readOnly = true)
V. Tecnologas Java EE
Aplicacin Completa: JSF+EJB3+JPA
Emplear EJB Session Bean Facade.
V. Tecnologas Java EE
Prcticas III
Crea un ejemplo de Bean de Entidad. Incluye atributos de diferentes tipos. Relaciona varias entidades. Convierte los objetos del Diario Digital en entidades JPA para dotarlas de persistencia.
V. Tecnologas Java EE
Crea un ejemplo de Bean de Entidad.
V. Tecnologas Java EE
Crea un ejemplo de Bean de Entidad.
V. Tecnologas Java EE
Crea un ejemplo de Bean de Entidad.
V. Tecnologas Java EE
Crea un ejemplo de Bean de Entidad.
<?xml version="1.0" encoding="UTF-8"?> <persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"> <persistence-unit name="DiarioJPA" transaction-type="JTA"> <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> <jta-data-source>DiarioDataSource</jta-data-source> <non-jta-data-source>DiarioDataSource</non-jta-data-source> <class>data.Categoria</class> <class>data.Noticia</class> <properties> <property name="eclipselink.target-server" value="WebLogic_10"/> <property name="eclipselink.logging.level" value="FINEST"/> </properties> </persistence-unit> </persistence>
Usaremos JAXWS. En FundeWeb se usar CXF, pero el curso se centra en la interaccin y no en las implementaciones.
Inconvenientes
Tecnologa relativamente nueva. Genera portales con poca personalidad.
A. Diario Digital
A. Diario Digital
Prctica Global
Muestra las noticias de un diario y un teletipo.
EAR Application
WEB Module WEB Module
JSF Application
Web Service
JSF Application
EJB Module
Database
Gracias !