You are on page 1of 142

Java y Tecnologías J2EE

Universidad de Murcia
Curso Formación del PAS

Noviembre 2009
Juan José Meroño Sánchez

Contenidos I

Objetivos del Curso

Curso de introducción 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.

Para saber más: FundeWeb.

Herramientas de Desarrollo
 

Nociones básicas de Eclipse. Mención especial a otras herramientas importantes.

Lenguaje Java
 

Nociones básicas de POO. Nociones básicas de POA.  Nociones básicas de Java y novedades de Java 1.5.

Patrones de Diseño
  

Ideas generales de patrones de diseño. Patrones de diseño Web. El Patrón MVC.

Contenidos II

Arquitectura Java EE


 

Modelo de Capas Contenedores y Servicios Java EE Ensamblado y Empaquetado Java EE. Eclipse y Java EE. Tecnologías de la Vista: JSF y Facelets Tecnologías de Control: EJB Tecnologías del Modelo: JPA Servicios WEB: JAXWS Autenticación Java EE Portlets Un periódico digital con teletipo.

Tecnologías Java EE
  

Tecnologías Avanzadas Java EE


El Proyecto del Curso

I.

Herramientas de Desarrollo

I. Herramientas de Desarrollo

Multitud de Herramientas
 Jdeveloper,

NetBeans, IntelliJ, Eclipse,…  La decisión 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.
 No

sólo sirve para desarrollar Java.

I. Herramientas de Desarrollo
1.Menu: Incluye todas las opciones del entorno y algunos iconos de acceso directo a las más 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 más 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 Ejecución: Incluye todo lo necesario para controlar y monitorizar la ejecución de nuestro proyecto.

I. Herramientas de Desarrollo

Terminología de Eclipse

Espacio de Trabajo: Workspace
  

Directorio en el que se almacenan los proyectos y configuraciones específicas. Se puede cambiar de espacio de trabajo de forma sencilla. Recomendación: No tener todos los proyectos en un ET.
Configuración predeterminada de las zonas de trabajo adecuadas para un tipo de tarea concreta: Proyectos Web, Swing, BBDD, etc… Pestañas 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. Window >> Preferences. Podemos ampliar las funcionalidades del IDE según nuestras necesidades. Help >> Software Updates.

Perspectivas

Vistas
  

Configuración y Actualización de Eclipse
  

I. Herramientas de Desarrollo

Subversion.
 Eclipse

incluye su control de versiones local por sesión, pero no es suficiente.  Mediante el plugin “Subclipse”, se incorporan a nuestros proyectos todas las posibilidades del control de versiones.  Importante emplear Subversión 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 metainformación 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  Sin

alguien a un proyecto.

Maven

Instalación del software.  Descarga de fuentes.  Descarga de librerías.  Configurar la herramienta para compilar y ejecutar.
 Con

Maven

Instalación del software.  Descarga de fuentes.  Ejecución de tarea maven.

I. Herramientas de Desarrollo

Hudson.

 

Servidores de integración contínua. Todas las fases de generación de mi proyecto automatizadas. No necesito personas supervisando tareas automáticas.
1. Commit

Desarrollador

Repositorio Subversion

4. Resultados de la Fase de Test

2. Update

3. Rehace el Proyecto con Maven

Servidor de Integración Contínua

I. Herramientas de Desarrollo

Prácticas I
 Introducción 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.  Configuración  Modifica aspectos generales del editor, colores, tipos de letra, etc…  Amplia la funcionalidad de eclipse con algún 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

Prácticas II
 Gestión de Proyectos  Modifica las clases Java: Crea un “Hola Mundo”.  Compara ambas clases.  Incluye tareas pendientes en ambas clases.  Visualiza las tareas pendientes.  Ejecución 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.

II. Lenguaje Java

II. Lenguaje Java

Definición:
“Lenguaje de programación orientado a objetos desarrollado por Sun Microsystems a principios de los años 90. El lenguaje toma mucha de su sintaxis de C y C++, pero tiene un modelo de objetos más simple y elimina herramientas de bajo nivel, que suelen inducir a muchos errores, como la manipulación directa de punteros o memoria.”

II. Lenguaje Java

Programación Orientada a Objetos
 Conceptos  Clase

de Diseño

Definición de propiedades y comportamiento de un tipo. Instancia de una clase, dispone de unas propiedades concretas. Algoritmo asociado a un objeto que se lanza tras recibir un mensaje.

Objeto

Método

Atributo

Contenedor de un tipo de dato asociado a un objeto. Notación punto.
Comunicación dirigida a un objeto. Notación punto.

Mensaje

II. Lenguaje Java

Programación Orientada a Objetos
 Sintaxis

en Java

public class Triangulo { // Propiedades del triángulo public int base; public int altura; // Métodos del triángulo public float area() { return (base*altura)/2; } } // Ejemplo de Uso Triangulo t = new Triangulo(); t.Altura = 10; t.base = 2; System.out.println(“Area: ”+t.area());

II. Lenguaje Java

Programación Orientada a Objetos
 Conceptos

de Análisis

Abstracción
Características esenciales del objeto.

Ocultación

Exponer una interface.
Aumentar la cohesión. Comportamientos diferentes asociados a objetos diferentes pero con igual nombre. Las clases se relacionan a través de una jerarquía.

Encapsulamiento

Polimorfismo

Herencia

II. Lenguaje Java

Programación Orientada a Objetos
 Análisis

en Java
Figura abstract float area();

Triangulo float area();

Cuadrado float area();

II. Lenguaje Java

Programación Orientada a Aspectos

Conceptos Básicos

      

Aspect

Funcionalidad transversal a implementar. Punto de la ejecución donde puede conectarse un aspecto. Implementación del aspecto. Define los aspectos a aplicar en cada Join Point. Permite añadir métodos o atributos a clases ya existentes.

Join Point

Advice

Pointcut

Introduction

Target

Clase a la que se añade el aspecto.
Objeto creado después de aplicar el aspecto. Proceso de aplicar aspectos a los objetos.

Proxy

Weaving

II. Lenguaje Java

Programación Orientada a Aspectos: AspectJ

II. Lenguaje Java

Programación Orientada a Aspectos
 Interceptores

en Java

Una de las formas en las que podemos encontrar este tipo de programación es con los interceptores.  Ciertos objetos disponen de un ciclo de vida.  Interceptando este ciclo podemos añadir funcionalidad sin modificar el código del objeto.  Ejemplo: Auditar los accesos a una aplicación.
Se puede hacer interceptando el ciclo de vida de las sesiones del servidor.  Añadiendo esta funcionalidad en el evento de creación.

II. Lenguaje Java

Plataforma Java
 Lenguaje:

Veremos sus características.  JVM: Máquina virtual.  API: Biblioteca de librerías.

Ediciones
 Java

ME: Micro Edition.  Java SE: Standart Edition.  Java EE: Enterprise Edition.

Desarrollo vs Ejecución
 JSDK:

Kit de desarrollo.  JRE: Kit de runtime.

II. Lenguaje Java

Elementos del Lenguaje
package curso.ejemplos; import curso.interfaces.Dibujable; public class Cuadrado extends Figura implements Dibujable { private int lado; public void dibujar() { … } }

 Package,

Clase  Herencia, Implementación

II. Lenguaje Java

Elementos del Lenguaje
 Variables

Tipos primitivos: char, byte, short, int, long, float, double y boolean.  Objetos y Arrays.  El ámbito marcado por los bloques { … }.  Accesibilidad: public, protected, private.  Ejemplos de declaración:

int x; int y=1;  Clase c; Clase d = new Clase();  int [] array; int [] array = {1,2,3,4};  Clase [] array = new Clase[] {c,d};

II. Lenguaje Java

Elementos del Lenguaje
 Operadores  Aritméticos: +, -, *, /, %  Asignación: =, += , -=, *=, /=, %=.  Incrementales: ++, --.  Relacionales: >, >=, <, <=, ==, !=.  Lógicos: &&, ||, !.  Cadenas: +.  Bits: >>, <<, &, |, ^, ~.  Estructuras de Control  Comentarios: // y /* … */  Bifurcaciones: if (cond) { … } else { … }  Bucles: while (cond) { … }, for (init; cond; inc) { … }

II. Lenguaje Java

Elementos del Lenguaje

Excepciones
 

Control de errores dentro del propio lenguaje. Implícitas: RuntimeException.

Generadas por errores de programación.

Explícitas: Resto de Exception.

El compilador obliga a chequear estas excepciones.

public void ejemplo (String n, String c) throws Exception { try { int num = Integer.parseInt(n); Class.forName(c); } catch (NumberFormatException nfe) { throw nfe; } catch (ClassNotFoundException cnfe) { throw cnfe; } finally { } }

II. Lenguaje Java

Elementos del Lenguaje

Multithreading
 

Capacidad de ejecución en paralelo. Extender Thread o Implementar Runnable.
 

Arranque y Parada. Suspender y Reanudar.

public class HiloThread implements extends Thread Runnable { { public public private static void Thread void run() t; main(String[] { args) { private String name; for(int i=0;i<15;i++) HiloThread hil=new HiloThread { (); hil.setName(”Hilo 1″); public HiloThread() HiloThread { t = new hi2= Thread(this); new tryHiloThread { this.sleep(500); } (); hil2.setName(“Hilo System.out.println( 2”); this.getName()+” en bucle “+i); } catch(InterruptedException e) { System.out.println(this.getName()+” se cayo intentando dormir”); } public void setName(String HiloThread hi3= n) { new name HiloThread = n; } (); hi3.setName(”Hilo 3″); } public String getName() hil.start();{hi2.start(); return name; hi3.start(); } } BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); public void run() { try { } for(int i=0;i<15;i++) String { cmd = br.readLine(); while (!cmd.equals("")) { try { this.sleep(500); System.out.println(this.getName()+” en bucle “+i); } if (cmd.equals("1")) hil.stop(); catch(InterruptedException e) { System.out.println(this.getName()+” se cayo intentando dormir”); } if (cmd.equals("2")) hi2.stop(); } if (cmd.equals("3")) hi3.stop(); cmd = br.readLine(); } } public void start() } catch { t.start(); (Exception } ex) {} } }

II. Lenguaje Java

Elementos del Lenguaje

Multithreading

Comunicación entre hilos.
{
private int Contenedor dato; contenedor;

public class Productor Consumidor Contenedor extends {extends Thread Thread { { public class ProductorConsumidorTest

public static void main(String[] args) {
public Consumidor private Productor boolean hayDato (Contenedor (Contenedor = false c);c) { contenedor { contenedor= = c;c; } } public synchronized void run() { int get() {

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(); }

}

II. Lenguaje Java

Elementos del Lenguaje: Novedades Java 1.5

Tipos Parametrizados
 

Vector<String> v = new Vector<String>(); String s = v.elementAt(0); // No requiere casting. Vector<Integer> v = new Vector<Integer>(); v.addElement(30); // No requiere conversión int – Integer. Vector<String> v = new Vector<String>(); for (String c: v) System.out.println(c); enum EstadoCivil { soltero, casado, divorciado }; EstadoCivil ec = EstadoCivil.casado; import static java.lang.Math; double raiz = sqrt(1245); public void miFunc(String p1,int … args) { for (int i:args) { … } } Anotaciones p.e. @Override.

Autoboxing
 

Bucles Simples

Tipo “enum”
 

Import Estático
 

 

Argumentos Variables

Metainformación

II. Lenguaje Java

Prácticas I
 Crea

un proyecto Java: Calculadora.  Crea una calculadora para las 4 operaciones básicas.  Como interface usaremos los argumentos de entrada.

java Calculadora 3 * 5

 Maneja

las excepciones oportunas.

II. Lenguaje Java

Crea un proyecto Java: Calculadora.
public class Calculator { public class Calculadora { public static enum Operador { suma , resta, multiplica, divide }; public static void main(String[] args) { public static double suma(String a,String b) throws CalculatorError { try { try { return Double.parseDouble(a)+Double.parseDouble(b); } double resultado = 0; catch (Exception ex) { throw new CalculatorError("CalculatorError: "+ex.getMessage()); } switch (Calculator.aOperador(args[1])) { } case suma: public static double resta(String a,String b) throws Exception { resultado = Calculator.suma(args[0],args[2]); break; return Double.parseDouble(a)-Double.parseDouble(b); case resta: } resultado = Calculator.resta(args[0],args[2]); break; public static double multiplica(String a,String b) throws Exception { case multiplica: try { return Double.parseDouble(a)*Double.parseDouble(b); } resultado = Calculator.multiplica(args[0],args[2]); break; catch (Exception ex) { System.out.println("CalculatorError en Multiplica."); throw ex; } case divide: } resultado = Calculator.divide(args[0],args[2]); break; public static double divide(String a,String b) throws NumberFormatException { } try { return Double.parseDouble(a)/Double.parseDouble(b); } System.out.println(args[0]+" "+args[1]+" "+args[2]+" = "+resultado); catch (NumberFormatException nfe) { throw nfe; } } catch (Exception ex) { } ex.printStackTrace(); public static Operador aOperador(String op) throws CalculatorError { } if (op!=null) { } if (op.toLowerCase().equals("mas")) return Operador.suma; if (op.toLowerCase().equals("menos")) return Operador.resta; } if (op.toLowerCase().equals("por")) return Operador.multiplica; if (op.toLowerCase().equals("entre")) return Operador.divide; public class CalculatorError extends Exception { } public CalculatorError(String msg) { super(msg); } throw new CalculatorError("CalculatorError: Operador incorrecto."); } } }

II. Lenguaje Java

Prácticas II: El diario digital.
 La

práctica global del curso consiste en la creación de un Diario Digital.  El Diario es un simple listado de noticias, y cada noticia pertenece a una categoría.  La portada del Diario estará formada por las noticias de última hora (novedades).  Las noticias se componen de un título, una fecha y el contenido.  Crea las clases que creas necesarias y una sencilla interface para testarlas.

II. Lenguaje Java

Prácticas II: El diario digital.

public class Noticia { private int codigo; private String contenido; private Date fecha; public class Categoria { private boolean portada; private int codigo; private String titulo; private String nombre; private Categoria categoria; private List<Noticia> noticias; public Noticia() { } public Categoria() { } public int getCodigo() { return this.codigo; } public int getCodigo() { return public void setCodigo(int codigo) { this .codigo = codigo;this } .codigo; } public void this setCodigo( int codigo) { this.codigo = codigo; } public String getContenido() { return .contenido; } public String getNombre() { return= this .nombre; public void setContenido(String contenido) { this.contenido contenido; }} public this void setNombre(String nombre) { this.nombre = nombre; } public Date getFecha() { return .fecha; } public List<Noticia> public void setFecha(Date fecha) { this.fechagetNoticias() = fecha; } { return this.noticias; } public void setNoticias(List<Noticia> noticias) { this.noticias = noticias; } public boolean isPortada() { return this.portada; } public void }setPortada(boolean portada) { this.portada = portada; } public String getTitulo() { return this.titulo; } public void setTitulo(String titulo) { this.titulo = titulo; } public Categoria getCategoria() { return this.categoria; } public void setCategoria(Categoria categoria) { this.categoria = categoria; } }

III. Patrones de Diseño

III. Patrones de Diseño

Definición:
 “Esquemas

predefinidos aplicables en diversas situaciones que garantizan ciertas cualidades al diseño obtenido.”
porcentaje muy elevado de los problemas a los que nos enfrentamos ya han sido resueltos anteriormente por otras personas.

Motivación:
 Un

“Design Patterns”, Gang of Four, (Erich Gamma,
Richard Helm, Ralph Johnson y John Vlisides)

III. Patrones de Diseño

División GoF
 Patrones

Creacionales: Abstraer el proceso de

creación de los objetos.
Abstract Factory, Builder, Factory Method, Prototype y Singleton.

III. Patrones de Diseño

Abstract Factory: Crear familias de objetos.

DocumentBuilderFactory fac = new DocumentBuilderFactory();

DocumentBuilder builder = fac.newDocumentBuilder(); // Retorna una implementación de Builder Concreto

Builder: Simplificar la creación en si.

DocumentBuilder builder = fac.newDocumentBuilder();

Document doc = builder.newDocument(); // Retorna un documento vacío
Document doc = builder.parse(cadena); // Retorna un documento tras parsear la cadena

 

Abstract Factory: Permite crear un builder diferente según la implementación de XML disponible. Builder: Simplifica procesos de creación complejos para un documento.

III. Patrones de Diseño

División GoF
 Patrones

Estructurales: Combinar objetos para

crear estructuras de mayor tamaño.
Adapter, Bridge, Composite, Decorator, Facade, Flyweight y Proxy.

III. Patrones de Diseño

Decorator: Añadir funcionalidad a un objeto.

JFrame frame = new JFrame(); frame.getComponentPane().add(JLabel(“Un Texto”)); frame.getComponentPane().add(JLabelConBorde(“Un Texto”)); frame.getComponentPane().add(JLabelResizable(“Un Texto”)); … frame.getComponentPane().add(new BorderDecorator(JLabel(“Un Texto”))); frame.getComponentPane().add(new ResizableDecorator(JLabel(“Un Texto”))); frame.getComponentPane().add(new ResizableDecorator(new BorderDecorator(JLabel(“Un Texto”)))); … public class BorderDecorator extends JComponent { protected JComponent child; // decorated component public BorderDecorator(JComponent component) { child = component; this.setLayout(new BorderLayout()); this.add(child);

}
public void paint(Graphics g) { super.paint(g); g.drawRect(0, 0, this.getWidth() - 1, this.getHeight() - 1); } }

III. Patrones de Diseño

División GoF
 Patrones

Comportamiento: Definir interacción

entre objetos reduciendo el acoplamiento.
Chain of Responsability, Command, Interpreter, Iterator, Mediator, Memento, Observer, State, Strategy, Template Method y Visitor.

III. Patrones de Diseño

Observer: Patrón muy empleado.
private int n = 0;

public class ObservableValue extends Observable {

public ObservableValue(int n) { this.n = n; }
public void setValue(int n) { this.n = n; setChanged(); notifyObservers(); } public int getValue() { return n; } } public class TextObserver implements Observer { public void update(Observable obs, Object obj) { System.out.println(((ObservableValue)ov).getValue()); } } public static void main(String[] args) { ObservableValue ov = new ObservableValue(0); TextObserver to = new TextObserver(); ov.addObserver(to); ov.setValue(145); // Este cambio se notifica al Observer }

III. Patrones de Diseño

Patrones Web
 Al

amparo de los patrones de diseño del GoF aparecen otra serie de patrones específicos del mundo Web.

http://java.sun.com/blueprints/corej2eepatterns/Pat terns/index.html

 Se

distribuyen en tres capas: Presentación, Negocio e Integración.  De entre todos los patrones Web existentes el más conocido y empleado es el MVC.

III. Patrones de Diseño

Modelo Vista Control: Descrito en 1979.
 Modelo: Representación específica de la información.  Vista: Representación del modelo en un formato adecuado para que el usuario interactúe.  Control: Responde a la interacción del usuario con la vista provocando cambios en el modelo.

III. Patrones de Diseño

Modelo Simplificado
private String link enviado = ""; private boolean = false;
public void link(String l) { @Override = l; public void link update(Observable o, Object arg) { setChanged(); notifyObservers(); String action = ((Cliente)o).getLink(); } // Se pincha un enlace if (action.equals(“Index")) { public String getLink() { return link; } System. out.println("Retorno Página Index !!"); } else if (action.equals(“Send")) { public static void main(String[] args) enviado = {true; System.out.println("Respuesta de Send !!"); Cliente c= new Cliente(); } else if (action.equals(“Verify")) { c.addObserver( new Server()); if (enviado) System.out.println("Send ya ejecutado !!"); // Petición Inicial else System.out.println("Send no ejecutado !!"); c.link(“Index"); } // Verifico } c.link(“Verify"); // Envio Formulario c.link(“Send"); // Verifico c.link(“Verify"); }

public class Cliente Observable { { public class Serverextends implements Observer

}

}

III. Patrones de Diseño

Modelo Simplificado

public class Control Server implements { Observer { VISTA private Control private control Modelo = new model Control(); = new Modelo(); public class Vista { @Override public Vista doAction(String action) { private public void update(Observable try { String text; o, Object arg) { String return action (Vista) = ((Cliente)o).getLink(); this.getClass().getMethod("do"+action, new Class[]{}).invoke(this,new Object[]{}); public Vista(String t) e) { text Vista } catch vista(Exception = control.doAction(action); { = t; } vista.send(); return new Vista("Error: "+e); public void send() { System.out.println(text); } } } } } } public Vista doIndex() { return new Vista("Retorno Página Index."); }

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; } } }

III. Patrones de Diseño

Modelo Vista Control
 Unidos

a este modelo aparecen otras dos estrategias.
Inversión de Control (IoC)
Empleada en todos los frameworks de desarrollo.  Principio Hollywood: “No me llames, ya te llamo yo”.

Inyección de Dependencias (DI)
Configurar vs Programar.  Simplifica la obtención de recursos comunes.  Utilización de las anotaciones.

III. Patrones de Diseño

Inversión de Control
public class SubControl extends Control { public Vista doAction(String action) { try { private Modelo model = new Modelo(); return (Vista)this.getClass().getMethod("do"+action, new Class[]{}).invoke(this,new Object[]{}); }public catch Vista (Exception e) { { doIndex() return new return Vista("Error: "+e); new Vista("Retorno Página Index."); }} }

public class Control {

}

public Vista doSend() { model.setEnviado(true); return new Vista("Respuesta de Send."); } public Vista doVerify() { if (model.isEnviado()) return new Vista("Send ya ejecutado."); return new Vista("Send no ejecutado."); } }

III. Patrones de Diseño

Inyección de Dependencias
public class Server implements Observer { private Control control;

public Server() { public class Server implements Observer {
// Código que instancia un objeto de la subclase de control @Controlador(name=SubControl) // adecuada para manejar las peticiones de la aplicación private Control control; @Override public void update(Observable o, Object arg) { @Override String action = ((Cliente)o).getLink(); public void update(Observable o, Object arg) { Vista vista = control.doAction(action); String action = ((Cliente)o).getLink(); vista.send(); Vista vista = control.doAction(action); } vista.send(); } } } }

III. Patrones de Diseño

Prácticas
 Repasa

los diferentes patrones del GoF y localiza los más adecuados para estos problemas:
Dotar de un sistema de undo/redo a un editor.  Crear un sistema gestor de ventanas que permita crear ventanas con diferentes características.  Crear un sistema de actualizaciones automáticas en función de la variación de diversos objetos.  Crear números aleatorios permitiendo emplear diversas API‟s de generadores de números aleatorios.  Asegurar la aleatoriedad de dichos números.

III. Patrones de Diseño

Prácticas

Memento.
 

Dotar de un sistema de undo/redo a un editor. Es un patrón específico para este tipo de trabajo.
Crear un sistema gestor de ventanas que permita crear ventanas con diferentes características. De este modo se pueden crear ventanas que mezclen diferentes características sin necesidad de crear todas las combinaciones. Crear un sistema de actualizaciones automáticas en función de la variación de diversos objetos. Es un patrón específico para este tipo de trabajo.

Decorator.
 

Observer.
 

Abstract Factory.
 

Crear números aleatorios permitiendo emplear diversas API‟s de generadores de números aleatorios. Builder puede ser excesivo mejor para tratar de simplificar la construcción.
Asegurar la aleatoriedad de dichos números.

Singleton

IV. Arquitectura Java EE

IV. Arquitectura Java EE

Modelo de Capas
A

medida que evolucionan las aplicaciones Web, surge la necesidad de organizarlas.  Inicialmente se emplean 3 capas.  Actualmente es más adecuado el uso de 4.

IV. Arquitectura Java EE

Contenedores Java EE
 Entorno

de ejecución específico para un conjunto de objetos de un determinado tipo y con unos fines concretos.

IV. Arquitectura Java EE

Servicios Java EE
 Para
      

cada contenedor Java EE proporciona una serie de servicios, como por ejemplo:
Java Transaction API (JTA) Java Persistence API (JPA) Java Message Service (JMS) Java Naming Direct Interface (JNDI) JavaMail Java Beans Active Framework (JAF) Java API for XML Procesing (JAXP) Java EE Connector Arquitecture Java Authentication and Authorization Service (JAAS) Servicios Web (JAXWS)


 

IV. Arquitectura Java EE

Ensamblado y Empaquetado
 Módulo

  

EAR

Contienen una aplicación completa.
/*.war /*.jar /META-INF/application.xml

<?xml version="1.0" encoding="ASCII"?> <application xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:application="http://java.sun.com/xml/ns/javaee/application_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/application_5.xsd" version="5"> <display-name>EjemploEAR</display-name> <module> <web> <web-uri>Ejemplo.war</web-uri> <context-root>Ejemplo</context-root> </web> </module> </application>

IV. Arquitectura Java EE

Ensamblado y Empaquetado
 Módulo

   

WEB

Contienen un módulo web.
/*.* /WEB-INF/web.xml /WEB-INF/classes/*.class /WEB-INF/lib/*.jar Servlets Filters Listeners

Dentro del módulo web:
  

 El

contenido varia mucho en función del tipo de desarrollo utilizado.

IV. Arquitectura Java EE

Ensamblado y Empaquetado: Módulo WEB

<web-app … id="DiarioDigital" version="2.5"> <display-name>DiarioDigital</display-name> <description>DiarioDigital</description> <welcome-file-list> <welcome-file>index.html</welcome-file> </welcome-file-list> <filter> <display-name>RichFaces Filter</display-name> <filter-name>richfaces</filter-name> <filter-class>org.ajax4jsf.Filter</filter-class> </filter> <filter-mapping> <filter-name>richfaces</filter-name> <servlet-name>Faces Servlet</servlet-name> </filter-mapping> <listener><listener-class>com.sun.faces.config.ConfigureListener</listener-class></listener> <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>*.jsf</url-pattern> </servlet-mapping> </web-app>

IV. Arquitectura Java EE

Ensamblado y Empaquetado
 Módulo

 

EJB

Contienen un módulo EJB.
/*.class /META-INF/ejb-jar.xml

El uso de anotaciones simplifica el contenido del descriptor.

<?xml version="1.0" encoding="UTF-8"?> <ejb-jar version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd"> <display-name>SimpleEJB</display-name> </ejb-jar>

IV. Arquitectura Java EE

Servlets
 Clase

Java con un ciclo de vida concreto.

Init: Ejecutado al cargarse la primera vez.  doGet/doPost/do…: Ejecutados al recibirse peticiones de cada tipo concreto.  Destroy: Ejecutado al finalizar.
 Importante:

Se ejecuta en un hilo.  Request/Response/Session.

IV. Arquitectura Java EE

JSP‟s
  

Al estilo de otros lenguajes, escribir código Java dentro de HTML. Se compila y se convierte en un servlet. Maneja los mismos objetos. Custom Tags. Ampliar la sintaxis de HTML.

<%@ page language= "java" contentType= "text/html; charset=ISO-8859-1" public class MiServlet extends HttpServlet { pageEncoding= "ISO-8859-1" %> public MiServlet() { super(); } <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> protected void service(HttpServletRequest request, HttpServletResponse response) <html> throws ServletException, IOException { <head> response.getWriter().println("<html>"); <meta http-equiv= "Content-Type" content="text/html; charset=ISO-8859-1"> response.getWriter().println("<head><title>Ejemplo</title></head>"); <title>Ejemplo</title> response.getWriter().println("<body>Hola "+request.getParameter("nombre")+"</body>"); </head> response.getWriter().println("</html>"); <body> } Hola } <%=request.getParameter("nombre") %>. </body> </html>

IV. Arquitectura Java EE

Custom Tags
package tag; fichero.jsp /WEB-INF/tlds/MiTag.tld import javax.servlet.jsp.tagext.*; <?xml version="1.0" encoding="UTF-8"?> <%@taglib prefix="t" uri="MisTags" %> import javax.servlet.jsp.*; <taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee"

<%@ 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>

IV. Arquitectura Java EE

Custom Tags: Argumentos.
package tag; /WEB-INF/tlds/MiTag.tld fichero.jsp import javax.servlet.jsp.tagext.*; <?xml version="1.0" encoding="UTF-8"?> <%@taglib prefix="t" uri="MisTags" %> import javax.servlet.jsp.*; <taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee"

<%@ 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; <short-name>MTags</short-name> "http://www.w3.org/TR/html4/loose.dtd"> <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 { <name>propiedad</name> <body> 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>

IV. Arquitectura Java EE

Custom Tags: Body
package tag; /WEB-INF/tlds/MiTag.tld import javax.servlet.jsp.tagext.*; fichero.jsp import javax.servlet.jsp.*; <?xml class version="1.0" encoding="UTF-8"?> public MiTag extends SimpleTagSupport { <%@taglib prefix="t" uri="MisTags" <taglib version="2.0" public void doTag() xmlns="http://java.sun.com/xml/ns/j2ee" throws JspException { %> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" <%@ page language= "java" contentType="text/html; charset=ISO-8859-1" JspFragment body = getJspBody(); xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee PageContext pageContext = (PageContext) getJspContext(); web-jsptaglibrary_2_0.xsd"> pageEncoding= "ISO-8859-1" %> JspWriter out html = pageContext.getOut(); <!DOCTYPE PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" <tlib-version>1.0</tlib-version> try { "http://www.w3.org/TR/html4/loose.dtd"> <short-name>MTags</short-name> StringWriter stringWriter = new StringWriter(); <html> <uri>MisTags</uri> StringBuffer buff = stringWriter.getBuffer(); <head> buff.append("<h1>"); <tag> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> body.invoke(stringWriter); <name>mitag</name> buff.append("</h1>"); <title>Insert title here</title> <tag-class>tag.MiTag</tag-class> out.println(stringWriter); </head> </tag> } catch (Exception e) { } <body> } <t:mitag>Texto Interno</t:mitag> } </taglib>

</body> </html>

IV. Arquitectura Java EE

Custom Tags: Simplificado

/WEB-INF/tags/mitag.tag

fichero.jsp * Simple *
<%@ taglib Hola Mundo !!prefix="t" tagdir="/WEB-INF/tags" %> <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding= * Con Parámetros *"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>

IV. Arquitectura Java EE

Prácticas
 Crea

un Server WebLogic11g.  Crea un Dynamic Web Project sobre el servidor.  Añade un Servlet/JSP/CustomTag.  Añade un Filtro.  Añade un Listener.  Añade una página index con un enlace al servlet/jsp.  Incluye la vista “TCP/IP Monitor” y úsala.

IV. Arquitectura Java EE

Crea un Servidor WebLogic.

IV. Arquitectura Java EE

Crea un Dynamic Web Project.

IV. Arquitectura Java EE

Añade un Servlet.

protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ServletOutputStream out = response.getOutputStream(); out.println("<html>"); out.println("<head><title>MiServlet</title></head>"); out.println("<body>"); long numero = 0; HttpSession session = request.getSession(true); if (session.isNew()) { out.println("<h1>Acabo de pensar un número del 1 al 10, adivina cuál es:</h1>"); session.setAttribute("MiNumero", Math.round(Math.random()*10+1)); } else { out.println("<h1>Tengo pensado un número del 1 al 10, adivina cuál es:</h1>"); numero = (Long)session.getAttribute("MiNumero"); } if (request.getParameter("number")!=null) { try { if (Long.parseLong(request.getParameter("number")) == numero) { out.println("<h2>¡ Has Acertado !</h2>"); } else { out.println("<h2>Lo siento, vuelve a intentarlo.</h2>"); } } catch (NumberFormatException nfe) { out.println("<h2>Debes escribir un número.</h2>"); } } out.println("<form method=\"post\">"); out.println("<label>Tu numero:</label><input type=\"text\" name=\"number\"/>"); out.println("</form>"); out.println("</body>"); out.println("</html>"); out.flush(); out.close(); }

IV. Arquitectura Java EE

Añade un Filtro.

int minHour = 0; int maxHour = 24; public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException,ServletException { int hora = Calendar.getInstance().get(Calendar.HOUR_OF_DAY); if (hora>=minHour && hora<=maxHour)chain.doFilter(request, response); else { ServletOutputStream out = res.getOutputStream(); out.println("<html>"); out.println("<head><title>MiServlet</title></head>"); out.println("<body><h1>Sólo juego de "+minHour+" a "+maxHour+".</h1></body>"); out.println("</html>"); out.flush(); out.close(); } } public void init(FilterConfig fConfig) throws ServletException { try { minHour = Integer.parseInt(fConfig.getInitParameter("minimo")); maxHour = Integer.parseInt(fConfig.getInitParameter("maximo")); if (minHour>23 || minHour<0 || maxHour>23 || maxHour<0 || minHour>maxHour) throw new Exception("Hora no válida."); } catch (Exception ex) { System.out.println("Formato Hora Incorrecto!"); }

IV. Arquitectura Java EE

Añade un Listener.

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. Tecnologías Java EE

V. Tecnologías Java EE

Tecnologías Vista: JSF
 Estándar

SUN: Existen muchas alternativas.

Comunidad de desarrollo amplia.  Apoyo tecnológico de las principales compañías.  Adaptación de las mejores ideas de otros.  Lentitud en asimilar nuevas tecnologías.  Modificaciones o mejoras lentas.  Dependencia de implementaciones de terceros.

V. Tecnologías Java EE

Tecnologías Vista: JSF
 Componentes

de JSF:

API + Implementación de Referencia.
Representan componentes UI y manejan su estado, eventos, validaciones, navegación, etc…

Librería de Etiquetas.

Etiquetas personalizadas de JSP para dibujar los componentes UI dentro de las páginas JSP.

V. Tecnologías Java EE

Ciclo de Vida JSF
 Las

peticiones Faces no se limitan a peticiónrespuesta, disponen de un ciclo de vida.  El ciclo de vida depende del tipo de petición.

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. Petición No-Faces: Petición enviada a un componente no faces. Petición Faces: Petición enviada desde una respuesta faces previamente generada.

 El

escenario normal Peticion faces/Respuesta faces.

V. Tecnologías Java EE

Ciclo de Vida JSF

V. Tecnologías Java EE

Ciclo de Vida JSF
 Reconstruir el árbol de componentes.  Se construye el árbol de componentes faces.  Aplicar valores a la petición.  Se asocian a los componentes los nuevos valores desde los parámetros de la petición.  Procesar validaciones.  Se procesan las validaciones para los componentes.  Actualizar los valores del modelo.  Una vez es válido se actualizan los valores del modelo.  Invocar aplicación.  En este punto se manejan los eventos a nivel de aplicación.  Renderizar respuesta.  Por último se dibujan los componentes del árbol.

V. Tecnologías 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 conversión.  Conectar conversores de datos al componente.  Modelo de validación.  Forma de registrar validadores para el componente.

 

Se emplean las etiquetas. RichFaces, ICEFaces: Librerías de etiquetas.

V. Tecnologías 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="Código:"/> <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. Tecnologías Java EE

Faces-Config.xml
 Archivo

de configuración 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>

<param-name>javax.faces.CONFIG_FILES</param-name> <param-value>/WEB-INF/faces-config.xml,/WEB-INF/faces-beans.xml</param-value>  Describe las reglas de navegación. </context-param>
<navigation-rule> <from-view-id>/editar/editar.xhtml</from-view-id> <navigation-case> <from-outcome>nuevaCategoria</from-outcome> <to-view-id>/editar/new/categoria.xhtml</to-view-id> </navigation-case> <navigation-case> <from-outcome>nuevaNoticia</from-outcome> <to-view-id>/editar/new/noticia.xhtml</to-view-id> </navigation-case> </navigation-rule>

V. Tecnologías 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; } }

/WEB-INF/faces-config.xml <lifecycle> <phase-listener>lst.PhaseListener</phase-listener> </lifecycle>

V. Tecnologías Java EE

JSF Paso a Paso
 Mapear Componentes  Mapear Valores Fijos

Con Objetos

<h:outputText value=“Hola Mundo !!"/> <h:outputText value=“#{initParam.version}"/> <h:outputText value=“#{param[„nombre‟]}"/> Siguen convenciones JavaBean. <h:outputText value="#{managedBeans.propiedad}"/>
<managed-bean> <managed-bean-name>managedBeans</managed-bean-name> <managed-bean-class>mbeans.ManagedBeans</managed-bean-class> <managed-bean-scope>request</managed-bean-scope> <managed-property> <property-name>propiedad</property-name> <value>Hola Mundo !!</value> </managed-property> </managed-bean>

Mapear Propiedades del Sistema
 

Mapear Propiedades de un Bean Manejado
 

V. Tecnologías 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. Tecnologías Java EE

JSF Paso a Paso
 Invocar

Métodos

Métodos de Validación
Utilizados sólo 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. Tecnologías Java EE

JSF Paso a Paso
 Invocar

Métodos

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 acción !!"); }

V. Tecnologías Java EE

JSF Paso a Paso
 Invocar

Métodos

Manejadores de Navegación
Se utiliza en UICommand y UIButton.  Retornan una cadena de navegación.

<h:commandLink value="Pincha" action="#{managedBeans.onlyAction}“/> public String onlyAction() { return “success"; }

V. Tecnologías Java EE

JSF Paso a Paso
 Invocar

Métodos

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. Tecnologías Java EE

JSF Paso a Paso
 Controlar

Navegación

Conjunto de reglas para seleccionar la siguiente página a la que moverse.  La selección depende de:
Página actual.  Action ejecutado por el componente que navega.  Cadena retornada por el action (outcome).

Admite patrones en from-view-id.
<navigation-rule> <from-view-id>/logon.jsp</from-view-id> <navigation-case> <from-action>#{LogonForm.logon}</from-action> <from-outcome>success</from-outcome> <to-view-id>/continue.jsp</to-view-id> </navigation-case> </navigation-rule>

V. Tecnologías Java EE

JSF Paso a Paso

Controlar Navegación. Ejemplos.
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" /> Destino continue1.jsp continue2.jsp error.jsp Destino continue3.jsp continue3.jsp error.jsp

<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>

<h:commandButton action=“error" value="Submit" />

V. Tecnologías Java EE

JSF Paso a Paso
 Crear

el adivinador de números JSF.

Crear un bean para calcular el número aleatorio.  El mismo bean puede recoger el número introducido.  Crea el JSP para solicitar el número, valida la entrada con validateLongRange.  Configura la navegación adecuada.

V. Tecnologías Java EE

Crea un Hola Mundo JSF.

V. Tecnologías Java EE

Crea un Hola Mundo JSF.

V. Tecnologías 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> <%@ taglib prefix= "f" uri= "http://java.sun.com/jsf/core" %> <title>Insert title here</title> private long numeroPensado; </locale-config> <%@ taglib<managed-bean-scope>session</managed-bean-scope> prefix= "h" uri="http://java.sun.com/jsf/html"%> </head> private 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 número 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() { return minimo;} </managed-property> <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 número 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>

JSF Paso a Paso
 Crear

el adivinador de números JSF.

V. Tecnologías Java EE

Facelets
 

Complemento ideal para JSF. Definir una plantilla para tu portal y emplearla en todas tus páginas.

<ui:include src=“cabecera.xhtml”/>

<ui:insert name=“body”/>

/pagina.xhtml <ui:composition template=“/plantilla.xhtml”> <ui:include src=“menu.xhtml”/> <ui:define name=“body”> … </ui:define> </ui:composition>

<ui:include src=“pie.xhtml”/>

V. Tecnologías 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>

Añadir la librería Facelets:

Nota: web.xml y faces-config.xml los modifica eclipse !! reglas Debemos cambiar las vistas y las

del

V. Tecnologías 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 Añadir Librerías: </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 más: 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. Tecnologías Java EE

Tecnologías Control: EJB

Dar más servicios a los objetos empleados en las aplicaciones web.  Contenedor específico para desplegar y ejecutar este tipo de objetos.  Posibilidad de compartir lógica a través de estos objetos.  Necesario un Contenedor de EJB. Servidor JEE.

V. Tecnologías Java EE

Tecnologías Control: EJB

Tipos de EJB

Session Beans: Sitos en la lógica de negocio.
 

Stateless: Sin información de estado. Stateful: Mantienen el estado entre peticiones.

Message Driven Beans: Utilizados para invocar métodos de forma asíncrona. Entity Beans: Empleados en la capa de persistencia para representar datos del modelo.

V. Tecnologías Java EE

Tecnologías Control: EJB

Ciclo de Vida

Creación, Destrucción, Pasivación (Stateful).

V. Tecnologías Java EE

Tecnologías 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 Método

V. Tecnologías Java EE

Tecnologías Control: EJB
 Anotaciones.

Forma de simplificar la definición 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. Tecnologías Java EE

Prácticas II
 Crea

un proyecto EJB.  Liga tu proyecto EJB a una aplicación Web.  Emplea los EJB‟s creados desde la aplicación Web.  Crea los EJB necesarios para Diario Digital.

V. Tecnologías Java EE

Crea un proyecto EJB.

V. Tecnologías Java EE

Crea un EJB.
@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+"]"; } }

@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+"]"; } }

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> Página -------------------------------------------------------------------------------------<h:outputText value="#{jSFBean.mensaje}" />

V. Tecnologías Java EE

Crea un EJB.

V. Tecnologías Java EE

Tecnologías Modelo: JPA
 Muchos

proyectos diferentes ORM.
unificar: JPA.

IBatis, Hibernate, JDO, TopLink,…

 Necesario

V. Tecnologías Java EE

Tecnologías 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. Tecnologías Java EE

Tecnologías 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. Tecnologías Java EE

Tecnologías Modelo: JPA
 Ciclo

de Vida: Entity Beans

V. Tecnologías Java EE

Tecnologías Modelo: JPA
 Anotaciones

Básicas: Entidades y Claves
Clave Simple
@Entity @Table(name="USUARIOS") public class Usuario { @Id private String nick; ... public Usuario() { } // Getters y Setters }

@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 Compuesta

V. Tecnologías Java EE

Tecnologías Modelo: JPA
 Anotaciones

Básicas: Atributos
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 }

@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 Compuesto

V. Tecnologías Java EE

Tecnologías 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 serán persistidas también. } @Column(name="PASSWORD", nullable= false ) CascadeType.REMOVE : Cuando borremos la entidad todas las entidades que private String pass; @OneToOne contenga esta variable se borrarán 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 actualizarán. 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 realizarán la misma operación. 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 simétrica en ambas clases. ... ManyToOne }

Anotaciones Básicas: Relaciones OneToOne

V. Tecnologías Java EE

Tecnologías 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. Tecnologías Java EE

Tecnologías 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)

Query query = em.createNamedQuery("User.findLike"); query.setParameter("VAR","lt"); List users = query.getResultList();

V. Tecnologías Java EE

Aplicación Completa: JSF+EJB3+JPA
 Emplear

EJB Session Bean Facade.

V. Tecnologías Java EE

Prácticas 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. Tecnologías Java EE

Crea un ejemplo de Bean de Entidad.

V. Tecnologías Java EE

Crea un ejemplo de Bean de Entidad.

V. Tecnologías Java EE

Crea un ejemplo de Bean de Entidad.

V. Tecnologías 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>

VI. Tecnologías Avanzadas

VI. Tecnologías Avanzadas

Servicios WEB
 Forma

de interactuar.

VI. Tecnologías Avanzadas

Servicios WEB
 Buscar

servicios Web: UDDI.
Servicios Web: WSDL.

Catálogo de Servicios. Descriptor del Servicio.

 Invocar

 Intercambio

de Información: SOAP.

Documentos XML.

 Las
 

herramientas nos simplifican el trabajo.

A partir de un método podemos crear un servicio. A partir de un WSDL podemos crear un cliente.

VI. Tecnologías Avanzadas

Servicios WEB
 Implementaciones

Diversas: Tratan de automatizar la creación de servicios y clientes.
Axis2  JAXWS  CXF

 Usaremos

JAXWS.  En FundeWeb se usará CXF, pero el curso se centra en la interacción y no en las implementaciones.

VI. Tecnologías Avanzadas

Prácticas I
 Crea

un Sencillo Servicio Web.  Pruébalo con el “Web Service Explorer”  Genera un cliente a partir del WSDL.  Crea el Servicio Web “Teletipo”.  Incluye en el Diario Digital las noticias del “Teletipo”.

VI. Tecnologías Avanzadas

Crea un Sencillo Servicio Web.

VI. Tecnologías Avanzadas

Crea un Sencillo Servicio Web.
public class Titulares { @EJB private NoticiasLocal misNoticias; @WebMethod public List<Titular> listTitulares() { ArrayList<Titular> lista = new ArrayList<Titular>(); for (Noticia n:misNoticias.getListadoPortada()) { Titular t = new Titular(); t.setTitulo(n.getTitulo()); t.setFecha(n.getDia()); lista.add(t); } public class Titular implements Serializable { return lista; private String titulo; } private Date fecha; } public String getTitulo() { return titulo; } public void setTitulo(String titulo) { this.titulo = titulo; } public Date getFecha() { return fecha; } public void setFecha(Date fecha) { this.fecha = fecha; } }

http://localhost:7001/DiarioWS/TitularesService?WSDL @WebService http://localhost:7001/wls_utc/?wsdlUrl=http://localhost:7001/DiarioWS/TitularesService?WSDL

VI. Tecnologías Avanzadas

Crea un Sencillo Servicio Web.

public List<Titular> getTitulares() { TitularesService ts = new TitularesService(); return ts.getTitularesPort().listTitulares(); }

VI. Tecnologías Avanzadas

Autenticación JAAS

Java EE permite emplear roles para securizar recursos de una aplicación.

<security-role> <role-name>administrador</role-name> </security-role> <security-role> <role-name>usuario</role-name> </security-role> <orion-application …> ... <jazn provider="XML" location="./jazn-data.xml" default-realm="example.com"> <property name="jaas.username.simple" value="false"/> </jazn> </orion-application> <jazn-data xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://xmlns.oracle.com/oracleas/schema/jazn-data-10_0.xsd" filepath="" OC4J_INSTANCE_ID=""> <jazn-realm> <realm> <name>example.com</name> <users><user><name>admin</name><credentials>!admin</credentials></user></users> <roles> <role><name>administrador</name><members><member><type>user</type><name>admin</name></member></members></role> </roles> </realm> </jazn-realm> </jazn-data>

VI. Tecnologías Avanzadas

Autenticación JAAS

Java EE permite emplear roles para securizar recursos de una aplicación.

@DeclareRoles({"administrador", "usuario"}) public class Ejemplo extends HttpServlet { protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { if (req.isUserInRole("administrador")) { // El usuario Autenticado tiene el rol administrador } } } <security-constraint> <web-resource-collection> <web-resource-name>Permiso Ejemplo</web-resource-name> <url-pattern>/Ejemplo</url-pattern> <http-method>GET</http-method> <http-method>POST</http-method> </web-resource-collection> <auth-constraint> <role-name>administrador</role-name> </auth-constraint> <user-data-constraint> <transport-guarantee>NONE</transport-guarantee> </user-data-constraint> </security-constraint> <!-- LOGIN CONFIGURATION--> <login-config> <auth-method>BASIC</auth-method> </login-config>

VI. Tecnologías Avanzadas

Prácticas II
 Crea

roles en una aplicación.  Añade seguridad a diferentes recursos.  Securiza la creación de noticias en el Diario Digital.

VI. Tecnologías Avanzadas

Crea roles en una aplicación.

<!-- ROLES DE SEGURIDAD --> <security-role> <role-name>redactor</role-name> <wls:security-role-assignment> </security-role> <wls:role-name>redactor</wls:role-name> <security-role> <wls:principal-name>Administrators</wls:principal-name> <role-name>usuario</role-name> </wls:security-role-assignment> </security-role> <wls:security-role-assignment> <security-constraint> <wls:role-name>usuario</wls:role-name> <web-resource-collection> <web-resource-name>Redaccion del Diario</web-resource-name> <wls:principal-name>AppTesters</wls:principal-name> <url-pattern>/editar/*</url-pattern> </wls:security-role-assignment> <http-method>GET</http-method> <http-method>POST</http-method> </web-resource-collection> <auth-constraint> <role-name>redactor</role-name> </auth-constraint> <user-data-constraint> <transport-guarantee>NONE</transport-guarantee> </user-data-constraint> </security-constraint> <!-- LOGIN CONFIGURATION--> <login-config> <auth-method>BASIC</auth-method> </login-config>

VI. Tecnologías Avanzadas

Portales y Portlets
 Idea

similar a la de los servlets.  Componentes configurables y reubicables.  Pensados para su uso en portales.  Especificación JSR 168.

VI. Tecnologías Avanzadas

Portales y Portlets
 Ventajas

Desarrollo independiente y reutilizable.  Personalización dinámica.  Seguridad ante fallos. El fallo de un portlet no afecta al resto del portal.  Adoptado por otras tecnologías. PHP Portlet.

 Inconvenientes

Tecnología relativamente nueva.  Genera portales con poca personalidad.

A. Diario Digital

A. Diario Digital

Práctica Global
 Muestra
WEB Module

las noticias de un diario y un teletipo.
EAR Application
WEB Module

JSF Application

Web Service

JSF Application

EJB Module

Database

¡ Gracias !