Sei sulla pagina 1di 142

Java y Tecnologas J2EE

Noviembre 2009
Juan Jos Meroo Snchez
Universidad de Murcia
Curso Formacin del PAS
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.
Para saber ms: FundeWeb.
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
Tecnologas Avanzadas Java EE
Servicios WEB: JAXWS
Autenticacin Java EE
Portlets
El Proyecto del Curso
Un peridico digital con teletipo.

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.
No slo sirve para desarrollar Java.
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.
Configuracin y Actualizacin de Eclipse
Window >> Preferences.
Podemos ampliar las funcionalidades del IDE segn nuestras necesidades.
Help >> Software Updates.
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.
Servidor de
Integracin
Contnua
Repositorio
Subversion
Desarrollador
1. Commit
2. Update 4. Resultados
de la Fase de
Test
3. Rehace el Proyecto
con Maven
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.
II. Lenguaje
Java
II. Lenguaje Java
Definicin:
Lenguaje de programacin orientado a objetos desarrollado por
Sun Microsystems a principios de los aos 90. El lenguaje toma
mucha de su sintaxis de C y C++, pero tiene un modelo de
objetos ms simple y elimina herramientas de bajo nivel, que
suelen inducir a muchos errores, como la manipulacin directa de
punteros o memoria.
II. Lenguaje Java
Programacin Orientada a Objetos
Conceptos de Diseo
Clase
Definicin de propiedades y comportamiento de un tipo.
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.
II. Lenguaje Java
Programacin Orientada a Objetos
Sintaxis en Java
public class Triangulo {
// Propiedades del tringulo
public int base;
public int altura;
// Mtodos del tringulo
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
Programacin Orientada a Objetos
Conceptos de Anlisis
Abstraccin
Caractersticas esenciales del objeto.
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.
II. Lenguaje Java
Programacin Orientada a Objetos
Anlisis en Java
Figura
abstract float area();
Triangulo
float area();
Cuadrado
float area();
II. Lenguaje Java
Programacin Orientada a Aspectos
Conceptos Bsicos
Aspect
Funcionalidad transversal a implementar.
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.
II. Lenguaje Java
Programacin Orientada a Aspectos: AspectJ
II. Lenguaje Java
Programacin Orientada a Aspectos
Interceptores en Java
Una de las formas en las que podemos encontrar
este tipo de programacin es con los
interceptores.
Ciertos objetos disponen de un ciclo de vida.
Interceptando este ciclo podemos aadir
funcionalidad sin modificar el cdigo del objeto.
Ejemplo: Auditar los accesos a una aplicacin.
Se puede hacer interceptando el ciclo de vida de las
sesiones del servidor.
Aadiendo esta funcionalidad en el evento de creacin.
II. Lenguaje Java
Plataforma Java
Lenguaje: Veremos sus caractersticas.
JVM: Mquina virtual.
API: Biblioteca de libreras.
Ediciones
Java ME: Micro Edition.
Java SE: Standart Edition.
Java EE: Enterprise Edition.
Desarrollo vs Ejecucin
JSDK: Kit de desarrollo.
JRE: Kit de runtime.
II. Lenguaje Java
Elementos del Lenguaje





Package, Clase
Herencia, Implementacin
package curso.ejemplos;
import curso.interfaces.Dibujable;
public class Cuadrado extends Figura implements Dibujable {
private int lado;
public void dibujar() { }
}
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 declaracin:
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
Aritmticos: +, -, *, /, %
Asignacin: =, += , -=, *=, /=, %=.
Incrementales: ++, --.
Relacionales: >, >=, <, <=, ==, !=.
Lgicos: &&, ||, !.
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.
Implcitas: RuntimeException.
Generadas por errores de programacin.
Explcitas: 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 ejecucin en paralelo.
Extender Thread o Implementar Runnable.
Arranque y Parada.
Suspender y Reanudar.
public class HiloThread extends Thread {
public void run() {
for(int i=0;i<15;i++) {
try { this.sleep(500); System.out.println(this.getName()+ en bucle +i); }
catch(InterruptedException e) { System.out.println(this.getName()+ se cayo intentando dormir); }
}
}
}
public class HiloThread implements Runnable {
private Thread t;
private String name;
public HiloThread() { t = new Thread(this); }
public void setName(String n) { name = n; }
public String getName() { return name; }
public void run() {
for(int i=0;i<15;i++) {
try { this.sleep(500); System.out.println(this.getName()+ en bucle +i); }
catch(InterruptedException e) { System.out.println(this.getName()+ se cayo intentando dormir); }
}
}
public void start() { t.start(); }
}

public static void main(String[] args) {
HiloThread hil=new HiloThread (); hil.setName(Hilo 1);
HiloThread hi2=new HiloThread (); hil2.setName(Hilo 2);
HiloThread hi3=new HiloThread (); hi3.setName(Hilo 3);
hil.start(); hi2.start(); hi3.start();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
try {
String cmd = br.readLine();
while (!cmd.equals("")) {
if (cmd.equals("1")) hil.stop();
if (cmd.equals("2")) hi2.stop();
if (cmd.equals("3")) hi3.stop();
cmd = br.readLine();
}
} catch (Exception ex) {}
}

II. Lenguaje Java
Elementos del Lenguaje
Multithreading
Comunicacin entre hilos.
public class Productor extends Thread {
private Contenedor contenedor;
public Productor (Contenedor c) { contenedor = c; }
public void run() {
for (int i = 0; i < 10; i++) {
contenedor.put(i);
System.out.println("Productor. put: " + i);
try { sleep((int)(Math.random() * 100)); } catch (InterruptedException e) { }
}
}
}
public class Consumidor extends Thread {
private Contenedor contenedor;
public Consumidor (Contenedor c) { contenedor= c; }
public void run() {
int value = 0;
for (int i = 0; i < 10; i++) {
value = contenedor.get();
System.out.println("Consumidor. get: " + value);
}
}
}
public class ProductorConsumidorTest {
public static void main(String[] args) {
Contenedor c = new Contenedor ();
Productor produce = new Productor (c);
Consumidor consume = new Consumidor (c);
produce.start();
consume.start();
}
}
public class Contenedor {
private int dato;
private boolean hayDato = false;
public synchronized int get() {
if (!hayDato) { try { wait(); } catch (InterruptedException e) { } }
hayDato = false;
notifyAll();
return dato;
}
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.
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.
II. Lenguaje Java
Prcticas I
Crea un proyecto Java: Calculadora.
Crea una calculadora para las 4 operaciones
bsicas.
Como interface usaremos los argumentos de
entrada.
java Calculadora 3 * 5
Maneja las excepciones oportunas.
public class CalculatorError extends Exception {
public CalculatorError(String msg) { super(msg); }
}
II. Lenguaje Java
Crea un proyecto Java: Calculadora.
public class Calculadora {

public static void main(String[] args) {
try {
double resultado = 0;
switch (Calculator.aOperador(args[1])) {
case suma:
resultado = Calculator.suma(args[0],args[2]); break;
case resta:
resultado = Calculator.resta(args[0],args[2]); break;
case multiplica:
resultado = Calculator.multiplica(args[0],args[2]); break;
case divide:
resultado = Calculator.divide(args[0],args[2]); break;
}
System.out.println(args[0]+" "+args[1]+" "+args[2]+" = "+resultado);
} catch (Exception ex) {
ex.printStackTrace();
}
}

}
public class Calculator {

public static enum Operador { suma , resta, multiplica, divide };
public static double suma(String a,String b) throws CalculatorError {
try { return Double.parseDouble(a)+Double.parseDouble(b); }
catch (Exception ex) { throw new CalculatorError("CalculatorError: "+ex.getMessage()); }
}
public static double resta(String a,String b) throws Exception {
return Double.parseDouble(a)-Double.parseDouble(b);
}
public static double multiplica(String a,String b) throws Exception {
try { return Double.parseDouble(a)*Double.parseDouble(b); }
catch (Exception ex) { System.out.println("CalculatorError en Multiplica."); throw ex; }
}
public static double divide(String a,String b) throws NumberFormatException {
try { return Double.parseDouble(a)/Double.parseDouble(b); }
catch (NumberFormatException nfe) { throw nfe; }
}
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;
}
throw new CalculatorError("CalculatorError: Operador incorrecto.");
}
}
II. Lenguaje Java
Prcticas II: El diario digital.
La prctica global del curso consiste en la
creacin de un Diario Digital.
El Diario es un simple listado de noticias, y
cada noticia pertenece a una categora.
La portada del Diario estar formada por las
noticias de ltima hora (novedades).
Las noticias se componen de un ttulo, una
fecha y el contenido.
Crea las clases que creas necesarias y una
sencilla interface para testarlas.
II. Lenguaje Java
Prcticas II: El diario digital.
public class Noticia {
private int codigo;
private String contenido;
private Date fecha;
private boolean portada;
private String titulo;
private Categoria categoria;

public Noticia() { }

public int getCodigo() { return this.codigo; }
public void setCodigo(int codigo) { this.codigo = codigo; }
public String getContenido() { return this.contenido; }
public void setContenido(String contenido) { this.contenido = contenido; }
public Date getFecha() { return this.fecha; }
public void setFecha(Date fecha) { this.fecha = fecha; }
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; }
}
public class Categoria {
private int codigo;
private String nombre;
private List<Noticia> noticias;

public Categoria() { }

public int getCodigo() { return this.codigo; }
public void setCodigo(int codigo) { this.codigo = codigo; }
public String getNombre() { return this.nombre; }
public void setNombre(String nombre) { this.nombre = nombre; }
public List<Noticia> getNoticias() { return this.noticias; }
public void setNoticias(List<Noticia> noticias) { this.noticias = noticias; }
}
III. Patrones
de
Diseo
III. Patrones de Diseo
Definicin:
Esquemas predefinidos aplicables en
diversas situaciones que garantizan ciertas
cualidades al diseo obtenido.
Motivacin:
Un porcentaje muy elevado de los problemas
a los que nos enfrentamos ya han sido
resueltos anteriormente por otras personas.
Design Patterns, Gang of Four, (Erich Gamma,
Richard Helm, Ralph J ohnson y J ohn Vlisides)
III. Patrones de Diseo
Divisin GoF
Patrones Creacionales: Abstraer el proceso de
creacin de los objetos.
Abstract Factory, Builder, Factory Method, Prototype y
Singleton.
III. Patrones de Diseo
Abstract Factory: Crear familias de objetos.
DocumentBuilderFactory fac = new DocumentBuilderFactory();
DocumentBuilder builder = fac.newDocumentBuilder(); // Retorna una implementacin de Builder Concreto
Builder: Simplificar la creacin en si.
DocumentBuilder builder = fac.newDocumentBuilder();
Document doc = builder.newDocument(); // Retorna un documento vaco
Document doc = builder.parse(cadena); // Retorna un documento tras parsear la cadena
Abstract Factory: Permite crear un builder diferente segn la
implementacin de XML disponible.
Builder: Simplifica procesos de creacin complejos para un
documento.
III. Patrones de Diseo
Divisin GoF
Patrones Estructurales: Combinar objetos para
crear estructuras de mayor tamao.
Adapter, Bridge, Composite, Decorator, Facade, Flyweight y
Proxy.
III. Patrones de Diseo
Decorator: Aadir 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 Diseo
Divisin GoF
Patrones Comportamiento: Definir interaccin
entre objetos reduciendo el acoplamiento.
Chain of Responsability, Command, Interpreter, Iterator,
Mediator, Memento, Observer, State, Strategy, Template
Method y Visitor.
III. Patrones de Diseo
Observer: Patrn muy empleado.
public class ObservableValue extends Observable {
private int n = 0;
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 Diseo
Patrones Web
Al amparo de los patrones de diseo del GoF
aparecen otra serie de patrones especficos
del mundo Web.
http://java.sun.com/blueprints/corej2eepatterns/Pat
terns/index.html
Se distribuyen en tres capas: Presentacin,
Negocio e Integracin.
De entre todos los patrones Web existentes el
ms conocido y empleado es el MVC.
III. Patrones de Diseo
Modelo Vista Control: Descrito en 1979.
Modelo: Representacin especfica de la informacin.
Vista: Representacin del modelo en un formato adecuado
para que el usuario interacte.
Control: Responde a la interaccin del usuario con la vista
provocando cambios en el modelo.
III. Patrones de Diseo
Modelo Simplificado
public class Cliente extends Observable {

private String link = "";

public void link(String l) {
link = l;
setChanged(); notifyObservers();
}

public String getLink() { return link; }

public static void main(String[] args) {
Cliente c = new Cliente();
c.addObserver(new Server());
// Peticin Inicial
c.link(Index");
// Verifico
c.link(Verify");
// Envio Formulario
c.link(Send");
// Verifico
c.link(Verify");
}
}
public class Server implements Observer {

private boolean enviado = false;

@Override
public void update(Observable o, Object arg) {
String action = ((Cliente)o).getLink();
// Se pincha un enlace
if (action.equals(Index")) {
System.out.println("Retorno Pgina Index !!");
} else if (action.equals(Send")) {
enviado = true; System.out.println("Respuesta de Send !!");
} else if (action.equals(Verify")) {
if (enviado) System.out.println("Send ya ejecutado !!");
else System.out.println("Send no ejecutado !!");
}
}

}

III. Patrones de Diseo
Modelo Simplificado
public class Server implements Observer {

private Control control = new Control();

@Override
public void update(Observable o, Object arg) {
String action = ((Cliente)o).getLink();
Vista vista = control.doAction(action);
vista.send();
}
}
public class Control {

private Modelo model = new Modelo();

public Vista doAction(String action) {
try {
return (Vista)this.getClass().getMethod("do"+action, new Class[]{}).invoke(this,new Object[]{});
} catch (Exception e) {
return new Vista("Error: "+e);
}
}

public Vista doIndex() {
return new Vista("Retorno Pgina Index.");
}

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.");
}

}
VISTA

public class Vista {

private String text;

public Vista(String t) { text = t; }

public void send() { System.out.println(text); }

}



MODELO


public class Modelo {

private boolean enviado = false;

public void setEnviado(boolean enviado) { this.enviado = enviado; }

public boolean isEnviado() { return enviado; }
}

III. Patrones de Diseo
Modelo Vista Control
Unidos a este modelo aparecen otras dos
estrategias.
Inversin de Control (IoC)
Empleada en todos los frameworks de desarrollo.
Principio Hollywood: No me llames, ya te llamo yo.
Inyeccin de Dependencias (DI)
Configurar vs Programar.
Simplifica la obtencin de recursos comunes.
Utilizacin de las anotaciones.
III. Patrones de Diseo
Inversin de Control
public class Control {

public Vista doAction(String action) {
try {
return (Vista)this.getClass().getMethod("do"+action, new Class[]{}).invoke(this,new Object[]{});
} catch (Exception e) {
return new Vista("Error: "+e);
}
}
}
public class SubControl extends Control {

private Modelo model = new Modelo();

public Vista doIndex() {
return new Vista("Retorno Pgina Index.");
}

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 Diseo
Inyeccin de Dependencias
public class Server implements Observer {

private Control control;

public Server() {

// Cdigo que instancia un objeto de la subclase de control
// adecuada para manejar las peticiones de la aplicacin

}

@Override
public void update(Observable o, Object arg) {
String action = ((Cliente)o).getLink();
Vista vista = control.doAction(action);
vista.send();
}
}
public class Server implements Observer {

@Controlador(name=SubControl)
private Control control;

@Override
public void update(Observable o, Object arg) {
String action = ((Cliente)o).getLink();
Vista vista = control.doAction(action);
vista.send();
}
}
III. Patrones de Diseo
Prcticas
Repasa los diferentes patrones del GoF y
localiza los ms 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 caractersticas.
Crear un sistema de actualizaciones automticas
en funcin de la variacin de diversos objetos.
Crear nmeros aleatorios permitiendo emplear
diversas APIs de generadores de nmeros
aleatorios.
Asegurar la aleatoriedad de dichos nmeros.
III. Patrones de Diseo
Prcticas
Memento.
Dotar de un sistema de undo/redo a un editor.
Es un patrn especfico para este tipo de trabajo.
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.
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 ms adecuado el uso de 4.
IV. Arquitectura Java EE
Contenedores Java EE
Entorno de ejecucin especfico 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
Mdulo EAR
Contienen una aplicacin 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
Mdulo WEB
Contienen un mdulo web.
/*.*
/WEB-INF/web.xml
/WEB-INF/classes/*.class
/WEB-INF/lib/*.jar
Dentro del mdulo web:
Servlets
Filters
Listeners
El contenido varia mucho en funcin del tipo de
desarrollo utilizado.
IV. Arquitectura Java EE
Ensamblado y Empaquetado: Mdulo 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
Mdulo EJB
Contienen un mdulo 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
JSPs
Al estilo de otros lenguajes, escribir cdigo Java dentro de
HTML.
Se compila y se convierte en un servlet. Maneja los mismos
objetos.
Custom Tags. Ampliar la sintaxis de HTML.
public class MiServlet extends HttpServlet {
public MiServlet() { super(); }
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.getWriter().println("<html>");
response.getWriter().println("<head><title>Ejemplo</title></head>");
response.getWriter().println("<body>Hola "+request.getParameter("nombre")+"</body>");
response.getWriter().println("</html>");
}
}
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Ejemplo</title>
</head>
<body>
Hola <%=request.getParameter("nombre") %>.
</body>
</html>
IV. Arquitectura Java EE
Custom Tags
package tag;

import javax.servlet.jsp.tagext.*;
import javax.servlet.jsp.*;

public class MiTag extends SimpleTagSupport {

public void doTag() throws JspException {
PageContext pageContext = (PageContext) getJspContext();
JspWriter out = pageContext.getOut();
try {
out.println("Hello World");
} catch (Exception e) { }
}

}
/WEB-INF/tlds/MiTag.tld

<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd">

<tlib-version>1.0</tlib-version>
<short-name>MTags</short-name>
<uri>MisTags</uri>

<tag>
<name>mitag</name>
<tag-class>tag.MiTag</tag-class>
<body-content>empty</body-content>
</tag>

</taglib>
fichero.jsp

<%@taglib prefix="t" uri="MisTags" %>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<t:mitag/>
</body>
</html>
IV. Arquitectura Java EE
Custom Tags: Argumentos.
package tag;

import javax.servlet.jsp.tagext.*;
import javax.servlet.jsp.*;

public class MiTag extends SimpleTagSupport {

private String propiedad;

public void setPropiedad(String p) { propiedad = p; }

public void doTag() throws JspException {
PageContext pageContext = (PageContext) getJspContext();
JspWriter out = pageContext.getOut();
try {
out.println("Hello World: "+propiedad);
} catch (Exception e) { }
}

}
/WEB-INF/tlds/MiTag.tld

<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd">
<tlib-version>1.0</tlib-version>
<short-name>MTags</short-name>
<uri>MisTags</uri>
<tag>
<name>mitag</name>
<tag-class>tag.MiTag</tag-class>
<body-content>empty</body-content>
<attribute>
<name>propiedad</name>
<rtexprvalue>true</rtexprvalue>
<required>false</required>
</attribute>
</tag>
</taglib>
fichero.jsp

<%@taglib prefix="t" uri="MisTags" %>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<t:mitag propiedad=Una Propiedad/>
<t:mitag propiedad=${param[nombre]}/>
</body>
</html>

IV. Arquitectura Java EE
Custom Tags: Body
package tag;
import javax.servlet.jsp.tagext.*;
import javax.servlet.jsp.*;
public class MiTag extends SimpleTagSupport {
public void doTag() throws JspException {
JspFragment body = getJspBody();
PageContext pageContext = (PageContext) getJspContext();
JspWriter out = pageContext.getOut();
try {
StringWriter stringWriter = new StringWriter();
StringBuffer buff = stringWriter.getBuffer();
buff.append("<h1>");
body.invoke(stringWriter);
buff.append("</h1>");
out.println(stringWriter);
} catch (Exception e) { }
}
}
/WEB-INF/tlds/MiTag.tld

<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd">

<tlib-version>1.0</tlib-version>
<short-name>MTags</short-name>
<uri>MisTags</uri>

<tag>
<name>mitag</name>
<tag-class>tag.MiTag</tag-class>
</tag>

</taglib>
fichero.jsp

<%@taglib prefix="t" uri="MisTags" %>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<t:mitag>Texto Interno</t:mitag>
</body>
</html>
IV. Arquitectura Java EE
Custom Tags: Simplificado
/WEB-INF/tags/mitag.tag

* Simple *

Hola Mundo !!

* Con Parmetros *

<%@attribute name="color" required="true" %>
<font color=${pageScope.color}>Hola Mundo!!</font>
<%String theColor = (String) pageContext.getAttribute("color"); %>
<font color=<%=theColor%>>Hola Mundo!!</font>

* Con Contenido *

<%@attribute name="color" required="true" %>
<font color=${pageScope.color}><jsp:doBody/></font>
<jsp:doBody var="theBody"/>
<%String bc = (String) pageContext.getAttribute("theBody"); %>
<font color=${pageScope.color}><%= bc.toUpperCase() %></font>

fichero.jsp

<%@ taglib prefix="t" tagdir="/WEB-INF/tags" %>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<t:mitag/>
<t:mitag color=red/>
<t:mitag color=red>Texto</t:mitag>
</body>
</html>
IV. Arquitectura Java EE
Prcticas
Crea un Server WebLogic11g.
Crea un Dynamic Web Project sobre el
servidor.
Aade un Servlet/JSP/CustomTag.
Aade un Filtro.
Aade un Listener.
Aade una pgina 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
Aade 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 nmero del 1 al 10, adivina cul es:</h1>");
session.setAttribute("MiNumero", Math.round(Math.random()*10+1));
} else {
out.println("<h1>Tengo pensado un nmero del 1 al 10, adivina cul 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 nmero.</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
Aade 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>Slo 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 vlida.");
} catch (Exception ex) {
System.out.println("Formato Hora Incorrecto!");
}
IV. Arquitectura Java EE
Aade 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. 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 peticin-
respuesta, 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.
El escenario normal Peticion faces/Respuesta faces.
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.
Aplicar valores a la peticin.
Se asocian a los componentes los nuevos valores desde los
parmetros de la peticin.
Procesar validaciones.
Se procesan las validaciones para los componentes.
Actualizar los valores del modelo.
Una vez es vlido se actualizan los valores del modelo.
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.
Se emplean las etiquetas.
RichFaces, ICEFaces: Libreras de etiquetas.
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.




Describe las reglas de navegacin.
<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>
</managed-bean>
<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>
<context-param>
<param-name>javax.faces.CONFIG_FILES</param-name>
<param-value>/WEB-INF/faces-config.xml,/WEB-INF/faces-beans.xml</param-value>
</context-param>
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; }
}

/WEB-INF/faces-config.xml
<lifecycle>
<phase-listener>lst.PhaseListener</phase-listener>
</lifecycle>
V. Tecnologas Java EE
JSF Paso a Paso
Mapear Componentes Con Objetos
Mapear Valores Fijos
<h:outputText value=Hola Mundo !!"/>
Mapear Propiedades del Sistema
<h:outputText value=#{initParam.version}"/>
<h:outputText value=#{param[nombre]}"/>
Mapear Propiedades de un Bean Manejado
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>
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).
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. 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 Destino
<h:commandButton action=success" value="Submit" /> continue1.jsp
<h:commandButton action=#{m.acc}" value="Submit" /> continue2.jsp
<h:commandButton action=error" value="Submit" /> error.jsp
Enlace en /pages/otra.jsp Destino
<h:commandButton action=success" value="Submit" /> continue3.jsp
<h:commandButton action=#{m.acc}" value="Submit" /> continue3.jsp
<h:commandButton action=error" value="Submit" /> 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
JSF Paso a Paso
Crear el adivinador de nmeros JSF.
<managed-bean>
<managed-bean-name>adivina</managed-bean-name>
<managed-bean-class>mbeans.Adivina</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
<managed-property>
<property-name>minimo</property-name>
<value>1</value>
</managed-property>
<managed-property>
<property-name>maximo</property-name>
<value>10</value>
</managed-property>
</managed-bean>
<navigation-rule>
<from-view-id>/index.jsp</from-view-id>
<navigation-case>
<from-outcome>success</from-outcome>
<to-view-id>/next.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>fail</from-outcome>
<to-view-id>/index.jsp</to-view-id>
</navigation-case>
</navigation-rule>
public class Adivina {

private long numeroPensado;
private int numero;
private int minimo;
private int maximo;

public Adivina() { numeroPensado = Math.round(Math.random()*10); }
public int getNumero() { return numero; }
public void setNumero(int n) { numero = n; }
public int getMinimo() { return minimo;}
public void setMinimo(int minimo) { this.minimo = minimo; }
public int getMaximo() { return maximo; }
public void setMaximo(int maximo) {this.maximo = maximo; }
public String adivinar() { return (numeroPensado==numero)? "success:"fail"; }
public boolean isIntentado() { return numero!=0; }
public void cambiaIdioma(ValueChangeEvent event) {
FacesContext.getCurrentInstance().getViewRoot().setLocale(new Locale((String)event.getNewValue()));
// Cortocircuito !!
FacesContext.getCurrentInstance().renderResponse();
}
}
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@ 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">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<f:view>
<h:outputText rendered="#{adivina.intentado}" value="Lo siento, vuelve a probar !!"/>
He pensado un nmero entre <h:outputText value="#{adivina.minimo}"/> y
<h:outputText value="#{adivina.maximo}"/>, adivina !!
<h:form>
<h:messages showDetail="true"/>
<h:selectOneMenu onchange="submit()"
valueChangeListener="#{adivina.cambiaIdioma}" immediate="true">
<f:selectItem itemLabel="#{msg.castellano}" itemValue="es"/>
<f:selectItem itemLabel="#{msg.ingles}" itemValue="en"/>
</h:selectOneMenu>
<h:inputText value="#{adivina.numero}">
<f:validateDoubleRange minimum="#{adivina.minimo}" maximum="#{adivina.maximo}"/>
</h:inputText>
<h:commandButton value="Prueba" action="#{adivina.adivinar}"/>
</h:form>
</f:view>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@ 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">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<f:view>
Has acertado, era el <h:outputText value="#{adivina.numero}"/> !!
</f:view>
</body>
</html>
Internacionalizar i18n

<application>
<locale-config>
<default-locale>es</default-locale>
<supported-locale>en</supported-locale>
</locale-config>
<message-bundle>msg.mensajes</message-bundle>
<resource-bundle>
<base-name>msg.mensajes</base-name>
<var>msg</var>
</resource-bundle>
</application>

<f:loadBundle basename="msg.mensajes" var="msg"/>
<h:messages showDetail=true showSummary=true/>
<h:outputText value="#{msg.titulo}"/>

Archivo de Propiedades: msg/mensajes.properties, msg/mensajes_en.properties,

titulo=Pienso en un nmero entre
javax.faces.validator.DoubleRangeValidator.NOT_IN_RANGE=Sumario
javax.faces.validator.DoubleRangeValidator.NOT_IN_RANGE_detail=Valor fuera de rango {0} - {1}.

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:include src=pie.xhtml/>




<ui:include
src=menu.xhtml/>




/pagina.xhtml
<ui:composition template=/plantilla.xhtml>
<ui:define name=body>

</ui:define>
</ui:composition>

<ui:insert name=body/>
V. Tecnologas Java EE
Crea una plantilla facelets.
Aadir la librera Facelets:
jsf-facelets-1.1.15.B1.jar
Nota: web.xml y faces-config.xml los modifica eclipse !!
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"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"
xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core">
<f:view contentType="text/html"/>
<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>
Debemos cambiar las vistas y las reglas del
faces-config.xml los id de las vistas pasan de
.jsp a .xhtml.
V. Tecnologas Java EE
Usar RichFaces.
Para Usar RichFaces Aadir Libreras:
commons-beanutils-1.7.0.jar
commons-digester-1.8.jar
commons-logging-1.1.1.jar
richfaces-api-3.3.1.GA.jar
richfaces-impl-3.3.1.GA.jar
richfaces-ui-3.3.1.GA.jar
Nota: Hay que configurar a mano !!
<!-- RichFaces en web.xml -->
<context-param>
<param-name>org.richfaces.SKIN</param-name>
<param-value>blueSky</param-value>
</context-param>
<!-- RichFaces + Facelets -->
<context-param>
<param-name>org.ajax4jsf.VIEW_HANDLERS</param-name>
<param-value>com.sun.facelets.FaceletViewHandler</param-value>
</context-param>
<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>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<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 -->
<?xml version="1.0" encoding="UTF-8"?>
<html xmlns:a4j="http://richfaces.org/a4j" xmlns:rich="http://richfaces.org/rich">
<body bgcolor="white">

<rich:panel id="panelRoot" >
<rich:spacer height="5" title="Here is a spacer..."/><br />
<rich:separator lineType="beveled" height="8" width="100%" align="center"/>
<rich:separator height="2" lineType="dotted"/><br />
</rich:panel>

</body>
</html>

Y muchos componentes ms: RichFaces Live Demo.
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
public EjemploBLocal ejemplo;
public String getMensaje() { return ejemplo.getMensaje(); }
}
Faces-config.xml
--------------------------------------------------------------------------------------
<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,
Necesario unificar: JPA.
V. Tecnologas Java EE
Tecnologas Modelo: JPA
Contextos de Persistencia
<?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>
Transacciones JTA: Empleada en Servidores de Aplicaciones JavaEE
Transacciones RESOURCE_LOCAL: Empleada en Aplicaciones C/S.
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 Compuesta
@Entity
@Table(name="USUARIOS")
public class Usuario {
@Id
private String nick;
...
public Usuario() { }
// Getters y Setters
}
Clave Simple
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 Compuesto
@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 Simple
V. Tecnologas Java EE
Tecnologas Modelo: JPA
Anotaciones Bsicas: Relaciones
@Entity
@Table(name="USUARIOS")
public class Usuario {
@Id
private String nick;
@Column(name="PASSWORD", nullable=false)
private String pass;
@OneToOne
@JoinColumn(name="PERFIL_USUARIO_ID",referencedColumnName="PERFIL_ID", updatable=false)
private Perfil perfil;
private Set<Noticia> noticias = new HashSet<Noticia>(0);
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY,mappedBy = "usuario")
public Set<Noticia> getNoticias() {
return this.noticias;
}
public void setNoticias(Set<Noticia> noticias) {
this.noticias = noticias;
}
...
}
@Entity
@Table(name="PERFILES")
public class Perfil {
@Id
@Column(name="PERFIL_ID")
private int id;
...
}
@Entity
@Table(name = "NOTICIA")
public class Noticia implements java.io.Serializable {
...
private Usuario usuario;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "USUARIO", nullable = false)
@NotNull
public Usuario getUsuario() { return this.usuario; }
public void setUsuario(Usuario usuario) { this.usuario = usuario; }
...
}
OneToOne
ManyToOne
ManyToMany: Muy similar a ManyToOne
pero simtrica en ambas clases.
CascadeType.PERSIST: Cuando persistamos la entidad todas las entidades que
contenga esta variable sern persistidas tambin.
CascadeType.REMOVE: Cuando borremos la entidad todas las entidades que
contenga esta variable se borrarn del mismo modo.
CascadeType.REFRESH: Cuando actualicemos la entidad todas las entidades que
contenga esta variable se actualizarn.
CascadeType.MERGE: Cuando hagamos un "merge" de la entidad todas las
entidades que contenga esta variable realizarn la misma operacin.
CascadeType.ALL: Todas las operaciones citadas anteriormente.
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)

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

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>
VI. Tecnologas
Avanzadas
VI. Tecnologas Avanzadas
Servicios WEB
Forma de interactuar.
VI. Tecnologas Avanzadas
Servicios WEB
Buscar servicios Web: UDDI.
Catlogo de Servicios.
Invocar Servicios Web: WSDL.
Descriptor del Servicio.
Intercambio de Informacin: SOAP.
Documentos XML.
Las herramientas nos simplifican el trabajo.
A partir de un mtodo podemos crear un servicio.
A partir de un WSDL podemos crear un cliente.
VI. Tecnologas Avanzadas
Servicios WEB
Implementaciones Diversas: Tratan de
automatizar la creacin de servicios y
clientes.
Axis2
JAXWS
CXF
Usaremos JAXWS.
En FundeWeb se usar CXF, pero el curso se
centra en la interaccin y no en las
implementaciones.
VI. Tecnologas Avanzadas
Prcticas I
Crea un Sencillo Servicio Web.
Prubalo 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. Tecnologas Avanzadas
Crea un Sencillo Servicio Web.
VI. Tecnologas Avanzadas
Crea un Sencillo Servicio Web.
@WebService
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);
}
return lista;
}
}
public class Titular implements Serializable {
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
http://localhost:7001/wls_utc/?wsdlUrl=http://localhost:7001/DiarioWS/TitularesService?WSDL
VI. Tecnologas Avanzadas
Crea un Sencillo Servicio Web.
public List<Titular> getTitulares() {
TitularesService ts = new TitularesService();
return ts.getTitularesPort().listTitulares();
}
VI. Tecnologas Avanzadas
Autenticacin JAAS
Java EE permite emplear roles para securizar recursos de una
aplicacin.
<security-role>
<role-name>administrador</role-name>
</security-role>
<security-role>
<role-name>usuario</role-name>
</security-role>
<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>
<orion-application >
...
<jazn provider="XML" location="./jazn-data.xml" default-realm="example.com">
<property name="jaas.username.simple" value="false"/>
</jazn>
</orion-application>
VI. Tecnologas Avanzadas
Autenticacin JAAS
Java EE permite emplear roles para securizar recursos de una
aplicacin.
@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. Tecnologas Avanzadas
Prcticas II
Crea roles en una aplicacin.
Aade seguridad a diferentes recursos.
Securiza la creacin de noticias en el Diario
Digital.
VI. Tecnologas Avanzadas
Crea roles en una aplicacin.
<!-- ROLES DE SEGURIDAD -->
<security-role>
<role-name>redactor</role-name>
</security-role>
<security-role>
<role-name>usuario</role-name>
</security-role>
<security-constraint>
<web-resource-collection>
<web-resource-name>Redaccion del Diario</web-resource-name>
<url-pattern>/editar/*</url-pattern>
<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>
<wls:security-role-assignment>
<wls:role-name>redactor</wls:role-name>
<wls:principal-name>Administrators</wls:principal-name>
</wls:security-role-assignment>
<wls:security-role-assignment>
<wls:role-name>usuario</wls:role-name>
<wls:principal-name>AppTesters</wls:principal-name>
</wls:security-role-assignment>

VI. Tecnologas Avanzadas
Portales y Portlets
Idea similar a la de los servlets.
Componentes configurables y reubicables.
Pensados para su uso en portales.
Especificacin JSR 168.
VI. Tecnologas Avanzadas
Portales y Portlets
Ventajas
Desarrollo independiente y reutilizable.
Personalizacin dinmica.
Seguridad ante fallos. El fallo de un portlet no
afecta al resto del portal.
Adoptado por otras tecnologas. PHP Portlet.
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
EJB Module
WEB Module
Web Service JSF Application
WEB Module
JSF Application

Database
Gracias !

Potrebbero piacerti anche