Download Curso Java y Tecnologías J2EE – Power point
Document related concepts
no text concepts found
Transcript
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:
Nociones básicas de Eclipse.
Mención especial a otras herramientas importantes.
Lenguaje Java
Para saber más: FundeWeb.
Herramientas de Desarrollo
Desarrolladores sin experiencia en Java EE.
Analistas/Jefes de Proyecto inmersos en proyectos Java EE.
Cualquier profesional con ánimo de conocer Java EE.
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
Tecnologías Java EE
Tecnologías de la Vista: JSF y Facelets
Tecnologías de Control: EJB
Tecnologías del Modelo: JPA
Tecnologías Avanzadas Java EE
Modelo de Capas
Contenedores y Servicios Java EE
Ensamblado y Empaquetado Java EE.
Eclipse y Java EE.
Servicios WEB: JAXWS
Autenticación Java EE
Portlets
El Proyecto del Curso
Un periódico digital con teletipo.
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
Perspectivas
Configuración predeterminada de las zonas de trabajo adecuadas para un
tipo de tarea concreta: Proyectos Web, Swing, BBDD, etc…
Vistas
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.
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.
Configuración y Actualización de Eclipse
Window >> Preferences.
Podemos ampliar las funcionalidades del IDE según nuestras necesidades.
Help >> Software Updates.
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.
Repositorio
Subversion
Desarrollador
1. Commit
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
Algoritmo asociado a un objeto que se lanza tras recibir un
mensaje.
Atributo
Instancia de una clase, dispone de unas propiedades
concretas.
Método
Definición de propiedades y comportamiento de un tipo.
Objeto
de Diseño
Contenedor de un tipo de dato asociado a un objeto. Notación
punto.
Mensaje
Comunicación dirigida a un objeto. Notación punto.
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
Abstracción
Aumentar la cohesión.
Polimorfismo
Exponer una interface.
Encapsulamiento
Características esenciales del objeto.
Ocultación
de Análisis
Comportamientos diferentes asociados a objetos diferentes
pero con igual nombre.
Herencia
Las clases se relacionan a través de una jerarquía.
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
Join Point
Clase a la que se añade el aspecto.
Proxy
Permite añadir métodos o atributos a clases ya existentes.
Target
Define los aspectos a aplicar en cada Join Point.
Introduction
Implementación del aspecto.
Pointcut
Punto de la ejecución donde puede conectarse un aspecto.
Advice
Funcionalidad transversal a implementar.
Objeto creado después de aplicar el aspecto.
Weaving
Proceso de aplicar aspectos a los objetos.
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=new
Thread(this);
try HiloThread
{ this.sleep(500);
}
(); hil2.setName(“Hilo
System.out.println(this.getName()+”
2”);
en bucle “+i); }
catch(InterruptedException e) { System.out.println(this.getName()+” se cayo intentando dormir”); }
public void setName(String
HiloThread hi3=new
n) { 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.
public
Productor
Consumidor
Contenedor
extends
{extends
Thread
Thread
{ {
publicclass
class
ProductorConsumidorTest
{
private int
Contenedor
dato;
contenedor;
public static void main(String[] args) {
public Consumidor
private
Productor
boolean hayDato
(Contenedor
(Contenedor
= false;
c) c)
{ contenedor
{ contenedor=
= c;c;
} }
Contenedor c = new Contenedor ();
public synchronized
void run() {
int get() {
Productor
produce
= {new
Productor (c);
for(!hayDato)
int
if
value
(int i == 0;
0; i{<try
10;{ i++)
wait();
} catch (InterruptedException e) { } }
Consumidor
for
hayDato
(int i = 0;
false;
i <consume
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
Autoboxing
import static java.lang.Math;
double raiz = sqrt(1245);
Argumentos Variables
enum EstadoCivil { soltero, casado, divorciado };
EstadoCivil ec = EstadoCivil.casado;
Import Estático
Vector<String> v = new Vector<String>();
for (String c: v) System.out.println(c);
Tipo “enum”
Vector<Integer> v = new Vector<Integer>();
v.addElement(30); // No requiere conversión int – Integer.
Bucles Simples
Vector<String> v = new Vector<String>();
String s = v.elementAt(0); // No requiere casting.
public void miFunc(String p1,int … args) { for (int i:args) { … } }
Metainformación
Anotaciones p.e. @Override.
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; }
int{ this.codigo
getCodigo()={ return
}
public void setCodigo(intpublic
codigo)
codigo;this.codigo;
}
public
void this.contenido;
setCodigo(int codigo)
{ this.codigo = codigo; }
public String getContenido()
{ return
}
public String
getNombre()
{ return=this.nombre;
public void setContenido(String
contenido)
{ this.contenido
contenido; } }
public this.fecha;
void setNombre(String
nombre) { this.nombre = nombre; }
public Date getFecha() { return
}
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.”
Motivación:
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 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.
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 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
public
Observable
{ {
publicclass
classCliente
Serverextends
implements
Observer
private String link = "";
private boolean enviado = false;
}
}
public
void link(String l) {
@Override
= l;
public void link
update(Observable
o, Object arg) {
setChanged();
String action =notifyObservers();
((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)= {true; System.out.println("Respuesta de Send !!");
enviado
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");
}
III. Patrones de Diseño
Modelo Simplificado
public
Server implements
{
Observer {
VISTAclass Control
private Control
private
control
Modelo
= new
model
Control();
= new Modelo();
public class Vista {
@Override public Vista doAction(String action) {
public voidprivate
update(Observable
try { String text; o, Object arg) {
String
return
action
(Vista)this.getClass().getMethod("do"+action,
= ((Cliente)o).getLink();
new Class[]{}).invoke(this,new Object[]{});
public
Vista(String
t)
{
text
=
t;
}
Vista
} catch
vista(Exception
= control.doAction(action);
e) {
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 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 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.
Decorator.
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.
Abstract Factory.
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.
Observer.
Dotar de un sistema de undo/redo a un editor.
Es un patrón específico para este tipo de trabajo.
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.
Singleton
Asegurar la aleatoriedad de dichos números.
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
Contienen un módulo web.
/*.*
/WEB-INF/web.xml
/WEB-INF/classes/*.class
/WEB-INF/lib/*.jar
Dentro del módulo web:
El
WEB
Servlets
Filters
Listeners
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
Contienen un módulo EJB.
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
PUBLIC
"-//W3C//DTD HTML 4.01
Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
protectedhtml
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) getJspContext();
PageContext
<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”/>
}<required>false</required>
catch (Exception e) { }
}</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"
<taglib
version="2.0"
public void doTag() xmlns="http://java.sun.com/xml/ns/j2ee"
throwsuri="MisTags"
JspException { %>
<%@
pagexmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
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!!prefix="t" tagdir="/WEB-INF/tags" %>
Hola
Mundo
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
* Con
Parámetros *
<!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;
<font
color=“<%=theColor%>”>Hola
Mundo!!</font>charset=ISO-8859-1">
<title>Insert title here</title>
</head>
* Con
Contenido *
<body>
<%@attribute<t:mitag/>
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
API + Implementación de Referencia.
de JSF:
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.
El
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.
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
<h:outputText value=“Hola Mundo !!"/>
Mapear Propiedades del Sistema
Con Objetos
<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. 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.
<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. 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
JSF Paso a Paso
<%@ 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="text/html;
<metapage
http-equiv="Content-Type"
content="text/html; charset=ISO-8859-1"
charset=ISO-8859-1">pageEncoding="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> content="text/html; charset=ISO-8859-1">
<meta http-equiv="Content-Type"
He pensado
número entre <h:outputText
value="#{adivina.minimo}"/>
y
public
Adivina()un{ numeroPensado
= Math.round(Math.random()*10);
}
</resource-bundle>
<title>Insert<managed-property>
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"/>
<f:loadBundle
basename="msg.mensajes"
var="msg"/>
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(int
<f:selectItemmaximo)
itemLabel="#{msg.castellano}"
{this.maximo = maximo;itemValue="es"/>
}
<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}">
publicen
void
event) {
titulo=Pienso
un cambiaIdioma(ValueChangeEvent
número
entre
<to-view-id>/next.jsp</to-view-id>
<f:validateDoubleRange
minimum="#{adivina.minimo}"
FacesContext.getCurrentInstance().getViewRoot().setLocale(newmaximum="#{adivina.maximo}"/>
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>
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.
Añadir la librería 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" >
Nota: web.xml
y faces-config.xml
modifica
eclipse
Debemos
cambiarloslas
vistas
y las!! reglas
del
<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="text/html"/>
.jsp 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>
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.
@Stateless
public class Ejemplo implements EjemploLocal {
double numero;
public Ejemplo() {
System.out.println("Stateless!!!");
numero = Math.floor(Math.random()*10+1);
}
@Override
public String getMensaje() {
numero++;
return "Mensaje ["+numero+"]";
}
}
@Stateful
public class EjemploB implements EjemploBLocal {
double numero;
public EjemploB() {
System.out.println("Stateful!!!");
numero = Math.floor(Math.random()*10+1);
}
@Override
public String getMensaje() {
numero++;
return "MensajeB ["+numero+"]";
}
}
public class JSFBean {
@EJB
Faces-config.xml
public EjemploBLocal ejemplo;
-------------------------------------------------------------------------------------public String getMensaje() { return ejemplo.getMensaje(); } <managed-bean>
}
<managed-bean-name>jSFBean</managed-bean-name>
<managed-bean-class>mb.JSFBean</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
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.
IBatis, Hibernate, JDO, TopLink,…
Necesario
unificar: JPA.
V. Tecnologías Java EE
Tecnologías 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. 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
@Entity
public class Entidad {
@EmbeddedId
@AttributeOverrides({
@AttributeOverride(name = "id", column = @Column(name = "ID",
nullable = false, precision = 5, scale = 0)),
@AttributeOverride(name = "nombre", column = @Column(name =
"NOMBRE", nullable = false, length = 50)),
})
private EntidadId id;
public Entidad() { }
// Getters y Setters
}
@Embedded
public class EntidadId {
int id;
String nombre;
public EntidadId() { }
public boolean equals(Object o) { /* Comprueba si son iguales */ }
public int hashCode() { /* Buenas practicas equals() -> hashCode() */ }
}
Clave Simple
@Entity
@Table(name="USUARIOS")
public class Usuario {
@Id
private String nick;
...
public Usuario() { }
// Getters y Setters
}
Clave Compuesta
V. Tecnologías Java EE
Tecnologías Modelo: JPA
Anotaciones
Básicas: Atributos
@Entity
@Table(name="USUARIOS")
public class Usuario {
@Id
private String nick;
@Embedded
@AttributeOverrides({
@AttributeOverride(name="codigoPostal",column=@Column(name="COD_POS")),
@AttributeOverride(name="direccionPostal",column=@Column(name="DIR_POS"))
})
private Direccion direccion;
public Usuario() { }
// Getters y Setters
}
@Embeddable
public class Direccion implements Serializable {
private String direccionPostal;
private String ciudad;
private int codigoPostal;
private String pais;
public Direccion() { }
public boolean equals(Object o) { /* Comprueba si las dos entidades son iguales */ }
public int hashCode() { /* Buenas practicas equals() -> hashCode() */ }
// Getters y Setters
}
Atributo Simple
@Entity
@Table(name="USUARIOS")
public class Usuario {
@Id
private String nick;
@Column(name="PASSWORD", nullable=false)
private String pass;
@Column(name="E-MAIL", nullable=false)
private String mail;
@Lob
@Basic(fetch=FetchType.LAZY)
private byte[] imagen;
...
public Usuario() { }
// Getters y Setters
}
Atributo Compuesto
V. 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",
CascadeType.REFRESH: Cuando actualicemos la entidad todasupdatable=false)
las entidades que
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:
Todas las operaciones
@Entity citadas anteriormente.
return this.noticias;
@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
Catálogo de Servicios.
Invocar
servicios Web: UDDI.
Servicios Web: WSDL.
Descriptor del Servicio.
Intercambio
Documentos XML.
Las
de Información: SOAP.
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.
http://localhost:7001/DiarioWS/TitularesService?WSDL
@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);
}
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/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
las noticias de un diario y un teletipo.
EAR Application
WEB Module
WEB Module
JSF Application
EJB Module
Web Service
JSF Application
Database
¡ Gracias !