Universidad de Murcia
Curso Formacin del PAS
Noviembre 2009
Juan Jos Meroo Snchez
Contenidos I
Desarrolladores sin experiencia en Java EE. Analistas/Jefes de Proyecto inmersos en proyectos Java EE. Cualquier profesional con nimo de conocer Java EE.
Herramientas de Desarrollo
Lenguaje Java
Nociones bsicas de POO. Nociones bsicas de POA. Nociones bsicas de Java y novedades de Java 1.5.
Patrones de Diseo
Contenidos II
Arquitectura Java EE
Modelo de Capas Contenedores y Servicios Java EE Ensamblado y Empaquetado Java EE. Eclipse y Java EE. Tecnologas de la Vista: JSF y Facelets Tecnologas de Control: EJB Tecnologas del Modelo: JPA Servicios WEB: JAXWS Autenticacin Java EE Portlets Un peridico digital con teletipo.
Tecnologas Java EE
I.
Herramientas de Desarrollo
I. Herramientas de Desarrollo
Multitud de Herramientas
Jdeveloper,
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
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.
Configuracin predeterminada de las zonas de trabajo adecuadas para un tipo de tarea concreta: Proyectos Web, Swing, BBDD, etc 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. Window >> Preferences. Podemos ampliar las funcionalidades del IDE segn nuestras necesidades. Help >> Software Updates.
Perspectivas
Vistas
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
I. Herramientas de Desarrollo
Maven.
Incorporar Sin
alguien a un proyecto.
Maven
Instalacin del software. Descarga de fuentes. Descarga de libreras. Configurar la herramienta para compilar y ejecutar.
Con
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.
1. Commit
Desarrollador
Repositorio Subversion
2. Update
I. Herramientas de Desarrollo
Prcticas I
Introduccin a Eclipse Crea un proyecto Java. Crea dos clases. Cambia la perspectiva entre Java y Resource. Perspectivas Modifica las vistas que aparecen en la perspectiva Resource. Elimina la vista Project Explorer. Incluye la vista Navigator y Package Explorer. Incluye la vista Problemas. Restaura el estado original de la perspectiva. Configuracin Modifica aspectos generales del editor, colores, tipos de letra, etc Amplia la funcionalidad de eclipse con algn plugin.
I. Herramientas de Desarrollo
I. Herramientas de Desarrollo
I. Herramientas de Desarrollo
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.
I. Herramientas de Desarrollo
Gestionar Proyectos.
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.
de Diseo
Definicin de propiedades y comportamiento de un tipo. Instancia de una clase, dispone de unas propiedades concretas. Algoritmo asociado a un objeto que se lanza tras recibir un mensaje.
Objeto
Mtodo
Atributo
Mensaje
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());
de Anlisis
Abstraccin
Caractersticas esenciales del objeto.
Ocultacin
Encapsulamiento
Polimorfismo
Herencia
en Java
Figura abstract float area();
Conceptos Bsicos
Aspect
Funcionalidad transversal a implementar. Punto de la ejecucin donde puede conectarse un aspecto. Implementacin del aspecto. Define los aspectos a aplicar en cada Join Point. Permite aadir mtodos o atributos a clases ya existentes.
Join Point
Advice
Pointcut
Introduction
Target
Proxy
Weaving
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.
Plataforma Java
Lenguaje:
Ediciones
Java
ME: Micro Edition. Java SE: Standart Edition. Java EE: Enterprise Edition.
Desarrollo vs Ejecucin
JSDK:
Package,
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};
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 { } }
Multithreading
public class HiloThread implements extends Thread Runnable { { public public private static void Thread void run() t; main(String[] { args) { private String name; for(int i=0;i<15;i++) HiloThread hil=new HiloThread { (); hil.setName(Hilo 1); public HiloThread() HiloThread { t = new hi2= Thread(this); new tryHiloThread { this.sleep(500); } (); hil2.setName(Hilo System.out.println( 2); this.getName()+ en bucle +i); } catch(InterruptedException e) { System.out.println(this.getName()+ se cayo intentando dormir); } public void setName(String HiloThread hi3= n) { new name HiloThread = n; } (); hi3.setName(Hilo 3); } public String getName() hil.start();{hi2.start(); return name; hi3.start(); } } BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); public void run() { try { } for(int i=0;i<15;i++) String { cmd = br.readLine(); while (!cmd.equals("")) { try { this.sleep(500); System.out.println(this.getName()+ en bucle +i); } if (cmd.equals("1")) hil.stop(); catch(InterruptedException e) { System.out.println(this.getName()+ se cayo intentando dormir); } if (cmd.equals("2")) hi2.stop(); } if (cmd.equals("3")) hi3.stop(); cmd = br.readLine(); } } public void start() } catch { t.start(); (Exception } ex) {} } }
Multithreading
public class Productor Consumidor Contenedor extends {extends Thread Thread { { public class ProductorConsumidorTest
Productor produce = {new Productor (c); for int if (!hayDato) value (int i = = 0; 0; i{<try 10;{ i++) wait(); } catch (InterruptedException e) { } } Consumidor consume for hayDato (int i = 0; false i< ;contenedor.put(i); 10; i++) { = new Consumidor (c);
notifyAll(); System.out.println("Productor. value = contenedor.get(); put: " + i); produce.start(); return dato; } try { sleep((int)(Math.random() * get: System.out.println("Consumidor. 100)); "+ } value); catch (InterruptedException e) { } consume.start(); }
} } }
}
Tipos Parametrizados
Vector<String> v = new Vector<String>(); String s = v.elementAt(0); // No requiere casting. Vector<Integer> v = new Vector<Integer>(); v.addElement(30); // No requiere conversin int Integer. Vector<String> v = new Vector<String>(); for (String c: v) System.out.println(c); enum EstadoCivil { soltero, casado, divorciado }; EstadoCivil ec = EstadoCivil.casado; import static java.lang.Math; double raiz = sqrt(1245); public void miFunc(String p1,int args) { for (int i:args) { } } Anotaciones p.e. @Override.
Autoboxing
Bucles Simples
Tipo enum
Import Esttico
Argumentos Variables
Metainformacin
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
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.
public class Noticia { private int codigo; private String contenido; private Date fecha; public class Categoria { private boolean portada; private int codigo; private String titulo; private String nombre; private Categoria categoria; private List<Noticia> noticias; public Noticia() { } public Categoria() { } public int getCodigo() { return this.codigo; } public int getCodigo() { return public void setCodigo(int codigo) { this .codigo = codigo;this } .codigo; } public void this setCodigo( int codigo) { this.codigo = codigo; } public String getContenido() { return .contenido; } public String getNombre() { return= this .nombre; public void setContenido(String contenido) { this.contenido contenido; }} public this void setNombre(String nombre) { this.nombre = nombre; } public Date getFecha() { return .fecha; } public List<Noticia> public void setFecha(Date fecha) { this.fechagetNoticias() = fecha; } { return this.noticias; } public void setNoticias(List<Noticia> noticias) { this.noticias = noticias; } public boolean isPortada() { return this.portada; } public void }setPortada(boolean portada) { this.portada = portada; } public String getTitulo() { return this.titulo; } public void setTitulo(String titulo) { this.titulo = titulo; } public Categoria getCategoria() { return this.categoria; } public void setCategoria(Categoria categoria) { this.categoria = categoria; } }
Definicin:
Esquemas
predefinidos aplicables en diversas situaciones que garantizan ciertas cualidades al diseo obtenido.
porcentaje muy elevado de los problemas a los que nos enfrentamos ya han sido resueltos anteriormente por otras personas.
Motivacin:
Un
Divisin GoF
Patrones
Abstract Factory: Permite crear un builder diferente segn la implementacin de XML disponible. Builder: Simplifica procesos de creacin complejos para un documento.
Divisin GoF
Patrones
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); } }
Divisin GoF
Patrones
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.
Modelo Simplificado
private String link enviado = ""; private boolean = false;
public void link(String l) { @Override = l; public void link update(Observable o, Object arg) { setChanged(); notifyObservers(); String action = ((Cliente)o).getLink(); } // Se pincha un enlace if (action.equals(Index")) { public String getLink() { return link; } System. out.println("Retorno Pgina Index !!"); } else if (action.equals(Send")) { public static void main(String[] args) enviado = {true; System.out.println("Respuesta de Send !!"); Cliente c= new Cliente(); } else if (action.equals(Verify")) { c.addObserver( new Server()); if (enviado) System.out.println("Send ya ejecutado !!"); // Peticin Inicial else System.out.println("Send no ejecutado !!"); c.link(Index"); } // Verifico } c.link(Verify"); // Envio Formulario c.link(Send"); // Verifico c.link(Verify"); }
Modelo Simplificado
public class Control Server implements { Observer { VISTA private Control private control Modelo = new model Control(); = new Modelo(); public class Vista { @Override public Vista doAction(String action) { private public void update(Observable try { String text; o, Object arg) { String return action (Vista) = ((Cliente)o).getLink(); this.getClass().getMethod("do"+action, new Class[]{}).invoke(this,new Object[]{}); public Vista(String t) e) { text Vista } catch vista(Exception = control.doAction(action); { = t; } vista.send(); return new Vista("Error: "+e); public void send() { System.out.println(text); } } } } } } public Vista doIndex() { return new Vista("Retorno Pgina 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; } } }
Inversin de Control
public class SubControl extends Control { public Vista doAction(String action) { try { private Modelo model = new Modelo(); return (Vista)this.getClass().getMethod("do"+action, new Class[]{}).invoke(this,new Object[]{}); }public catch Vista (Exception e) { { doIndex() return new return Vista("Error: "+e); new Vista("Retorno 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."); } }
Inyeccin de Dependencias
public class Server implements Observer { private Control control;
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.
Prcticas
Memento.
Dotar de un sistema de undo/redo a un editor. Es un patrn especfico para este tipo de trabajo.
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. Crear un sistema de actualizaciones automticas en funcin de la variacin de diversos objetos. Es un patrn especfico para este tipo de trabajo.
Decorator.
Observer.
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.
Asegurar la aleatoriedad de dichos nmeros.
Singleton
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.
Contenedores Java EE
Entorno
de ejecucin especfico para un conjunto de objetos de un determinado tipo y con unos fines concretos.
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)
Ensamblado y Empaquetado
Mdulo
EAR
<?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>
Ensamblado y Empaquetado
Mdulo
WEB
El
<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>
Ensamblado y Empaquetado
Mdulo
EJB
<?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>
Servlets
Clase
Init: Ejecutado al cargarse la primera vez. doGet/doPost/do: Ejecutados al recibirse peticiones de cada tipo concreto. Destroy: Ejecutado al finalizar.
Importante:
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.
<%@ page language= "java" contentType= "text/html; charset=ISO-8859-1" public class MiServlet extends HttpServlet { pageEncoding= "ISO-8859-1" %> public MiServlet() { super(); } <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> protected void service(HttpServletRequest request, HttpServletResponse response) <html> throws ServletException, IOException { <head> response.getWriter().println("<html>"); <meta http-equiv= "Content-Type" content="text/html; charset=ISO-8859-1"> response.getWriter().println("<head><title>Ejemplo</title></head>"); <title>Ejemplo</title> response.getWriter().println("<body>Hola "+request.getParameter("nombre")+"</body>"); </head> response.getWriter().println("</html>"); <body> } Hola } <%=request.getParameter("nombre") %>. </body> </html>
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>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" pageEncoding= "ISO-8859-1" %> public class xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee MiTag extends SimpleTagSupport { web-jsptaglibrary_2_0.xsd"> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" <tlib-version>1.0</tlib-version> private String propiedad; <short-name>MTags</short-name> "http://www.w3.org/TR/html4/loose.dtd"> <uri>MisTags</uri> <html> public void setPropiedad(String p) { propiedad = p; } <tag> <head> <name>mitag</name> <meta http-equiv= "Content-Type" content= "text/html; charset=ISO-8859-1"> public void doTag() throws JspException { <tag-class>tag.MiTag</tag-class> <title>Insert titlepageContext here</title> PageContext = (PageContext) getJspContext(); <body-content>empty</body-content> JspWriter out = pageContext.getOut(); </head> <attribute> try { <name>propiedad</name> <body> out.println("Hello World: "+propiedad); <rtexprvalue>true</rtexprvalue> <t:mitag propiedad=Una Propiedad/> } catch (Exception e) { } <required>false</required> }</attribute><t:mitag propiedad=${param[nombre]}/> </body> </tag> </html> } </taglib>
</body> </html>
/WEB-INF/tags/mitag.tag
fichero.jsp * Simple *
<%@ taglib Hola Mundo !!prefix="t" tagdir="/WEB-INF/tags" %> <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding= * Con Parmetros *"ISO-8859-1"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <%@attribute name="color" required="true" %> <html> <font color=${pageScope.color}>Hola Mundo!!</font> <head> theColor = (String) pageContext.getAttribute("color"); %> <%String <meta http-equiv="Content-Type" content= "text/html; charset=ISO-8859-1"> <font color=<%=theColor%>>Hola Mundo!!</font> <title>Insert title here</title> </head> * Con Contenido * <body> <t:mitag/> <%@attribute name="color" required="true" %> <t:mitag color=red/> <font color=${pageScope.color}><jsp:doBody/></font> color=red>Texto</t:mitag> <jsp:doBody<t:mitag var="theBody"/> </body> bc = (String) pageContext.getAttribute("theBody"); %> <%String </html> <font color=${pageScope.color}><%= bc.toUpperCase() %></font>
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.
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(); }
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!"); }
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
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
de JSF:
Librera de Etiquetas.
Etiquetas personalizadas de JSP para dibujar los componentes UI dentro de las pginas JSP.
V. Tecnologas Java EE
peticiones Faces no se limitan a peticinrespuesta, disponen de un ciclo de vida. El ciclo de vida depende del tipo de peticin.
Respuesta No-Faces: Respuesta generada al margen de la fase de renderizar respuesta de faces. Respuesta Faces: Respuesta generada en la fase de renderizar respuesta de faces. Peticin No-Faces: Peticin enviada a un componente no faces. Peticin Faces: Peticin enviada desde una respuesta faces previamente generada.
El
V. Tecnologas Java EE
V. Tecnologas Java EE
V. Tecnologas Java EE
Componentes JSF
Conjunto de clases UIComponent. Representan los componentes. Modelo de renderizado. Forma de visualizar el componente. Modelo de eventos. Forma de manejar los eventos lanzados. Modelo de conversin. Conectar conversores de datos al componente. Modelo de validacin. Forma de registrar validadores para el componente.
V. Tecnologas Java EE
Componentes JSF
<h:dataTable id="noticias" value="#{Noticias.listadoCategoria}" var="noti"> <h:column> <f:facet name="header"><h:outputText value="Titular"/></f:facet> <h:outputText value="#{noti.titulo}" /> </h:column> <h:column> <f:facet name="header"><h:outputText value="Contenido"/></f:facet> <h:outputText value="#{noti.contenido}" /> </h:column> </h:dataTable> --------------------------------------------------------------------------------------------------------------------------------------------------------------<h:form id=NoticiaForm> <h:outputText value="Cdigo:"/> <h:inputText id="codigo" value="#{GestorNoticias.noticia.codigo}" required="true" /><br/> <h:outputText value="Titulo:"/> <h:inputText id="titulo" value="#{GestorNoticias.noticia.titulo}" required="true" /><br/> <h:outputText value="Contenido:"/> <h:inputText id="contenido" value="#{GestorNoticias.noticia.contenido}" required="true" /><br/> <h:outputText value="Fecha:"/> <h:inputText id="fecha" value="#{GestorNoticias.noticia.fecha}" required="true"> <f:convertDateTime pattern="dd/MM/yyyy"/> </h:inputText><br/> <h:outputText value="Portada:"/> <h:selectBooleanCheckbox id="portada" value="#{GestorNoticias.noticia.portada}" required="true" /><br/> <h:outputText value="Categoria:"/> <h:selectOneMenu id="categoria" value="#{GestorNoticias.categoriaId}"> <f:selectItems value="#{GestorNoticias.selectCategorias}" /> </h:selectOneMenu><br/> <h:commandButton value="Guardar" action="#{GestorNoticias.saveNoticia}" /> </h:form>
http://java.sun.com/javaee/javaserverfaces/reference/docs/
http://java.sun.com/javaee/javaserverfaces/1.2/docs/tlddocs/
http://java.sun.com/javaee/javaserverfaces/1.2_MR1/docs/api/index.html
V. Tecnologas Java EE
Faces-Config.xml
Archivo
de configuracin principal.
V. Tecnologas Java EE
public class PhaseListener implements javax.faces.event.PhaseListener { public void afterPhase(PhaseEvent event) { System.out.println("AFTER - "+event.getPhaseId()); } public void beforePhase(PhaseEvent event) { System.out.println("BEFORE - "+event.getPhaseId()); } public PhaseId getPhaseId() { return PhaseId.ANY_PHASE; } }
V. Tecnologas Java EE
Con Objetos
<h:outputText value=Hola Mundo !!"/> <h:outputText value=#{initParam.version}"/> <h:outputText value=#{param[nombre]}"/> Siguen convenciones JavaBean. <h:outputText value="#{managedBeans.propiedad}"/>
<managed-bean> <managed-bean-name>managedBeans</managed-bean-name> <managed-bean-class>mbeans.ManagedBeans</managed-bean-class> <managed-bean-scope>request</managed-bean-scope> <managed-property> <property-name>propiedad</property-name> <value>Hola Mundo !!</value> </managed-property> </managed-bean>
V. Tecnologas Java EE
Componentes
V. Tecnologas Java EE
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
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
Mtodos
Manejadores de Navegacin
Se utiliza en UICommand y UIButton. Retornan una cadena de navegacin.
V. Tecnologas Java EE
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
Navegacin
Conjunto de reglas para seleccionar la siguiente pgina a la que moverse. La seleccin depende de:
Pgina actual. Action ejecutado por el componente que navega. Cadena retornada por el action (outcome).
V. Tecnologas Java EE
<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>
V. Tecnologas Java EE
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
V. Tecnologas Java EE
V. Tecnologas Java EE
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ taglib prefix="f" uri= "http://java.sun.com/jsf/core"%> Internacionalizar i18n <%@ taglib prefix="h" uri="http://java.sun.com/jsf/html"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <application> <html> <locale-config> <managed-bean> <head> public class Adivina { <default-locale>es</default-locale> <managed-bean-name>adivina</managed-bean-name> <%@ language= "java" contentType= pageEncoding="ISO-8859-1"%> <metapage http-equiv= "Content-Type" content="text/html; "text/html; charset=ISO-8859-1" charset=ISO-8859-1"> <supported-locale>en</supported-locale> <managed-bean-class>mbeans.Adivina</managed-bean-class> <%@ taglib prefix= "f" uri= "http://java.sun.com/jsf/core" %> <title>Insert title here</title> private long numeroPensado; </locale-config> <%@ taglib<managed-bean-scope>session</managed-bean-scope> prefix= "h" uri="http://java.sun.com/jsf/html"%> </head> private int numero; <message-bundle>msg.mensajes</message-bundle> <managed-property> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <body> private int minimo; <resource-bundle> <property-name>minimo</property-name> <html> <f:view> private int maximo; <base-name>msg.mensajes</base-name> <value>1</value> <head> <h:outputText rendered="#{adivina.intentado}" value="Lo siento, vuelve a probar !!"/> <var>msg</var> </managed-property> <meta http-equiv= "Content-Type" content= charset=ISO-8859-1" > He pensado un nmero entre"text/html; <h:outputText value="#{adivina.minimo}"/> y public Adivina() { numeroPensado = Math. round (Math.random()*10); } </resource-bundle> <managed-property> <title>Insert title here</title> <h:outputText value="#{adivina.maximo}"/>, adivina !! public int getNumero() { return numero; } </application> <property-name>maximo</property-name> </head> <h:form> public void setNumero( int n) { numero = n; } <value>10</value> <body> <h:messages showDetail= "true" /> var="msg"/> <f:loadBundle basename="msg.mensajes" public int getMinimo() { return minimo;} </managed-property> <f:view> <h:selectOneMenu onchange= "submit()" <h:messages showDetail=true showSummary=true/> public void setMinimo( int minimo) { this.minimo = minimo; } </managed-bean> Has acertado, era el <h:outputText value="#{adivina.numero}"/> !! valueChangeListener="#{adivina.cambiaIdioma}" immediate= "true"> <h:outputText value= "#{msg.titulo}" /> public int getMaximo() { return maximo; } <navigation-rule> </f:view> public void setMaximo( <f:selectItem itemLabel="#{msg.castellano}" itemValue= "es" /> int maximo) {this.maximo = maximo; } <from-view-id>/index.jsp</from-view-id> </body> <f:selectItem itemLabel="#{msg.ingles}" itemValue= "en"/> Archivo public de Propiedades : msg/mensajes.properties , msg/mensajes_en.properties , String adivinar() { return (numeroPensado==numero)? "success:"fail"; } <navigation-case> </html> </h:selectOneMenu> public boolean isIntentado() { return numero!=0; } <from-outcome>success</from-outcome> <h:inputText value="#{adivina.numero}"> public void event) { titulo=Pienso en un cambiaIdioma(ValueChangeEvent nmero entre <to-view-id>/next.jsp</to-view-id> <f:validateDoubleRange minimum="#{adivina.minimo}" maximum="#{adivina.maximo}"/> FacesContext.getCurrentInstance().getViewRoot().setLocale(new Locale((String)event.getNewValue())); </navigation-case> javax.faces.validator.DoubleRangeValidator.NOT_IN_RANGE=Sumario </h:inputText> // Cortocircuito !! <navigation-case> javax.faces.validator.DoubleRangeValidator.NOT_IN_RANGE_detail=Valor fuera de rango {0} - {1}. <h:commandButton value="Prueba" action="#{adivina.adivinar}"/> FacesContext. getCurrentInstance ().renderResponse(); <from-outcome>fail</from-outcome> </h:form> } <to-view-id>/index.jsp</to-view-id> </f:view> } </navigation-case> </body> </navigation-rule> </html>
V. Tecnologas Java EE
Facelets
Complemento ideal para JSF. Definir una plantilla para tu portal y emplearla en todas tus pginas.
<ui:include src=cabecera.xhtml/>
<ui:insert name=body/>
<ui:include src=pie.xhtml/>
V. Tecnologas Java EE
Nota: web.xml y faces-config.xml los modifica eclipse !! reglas Debemos cambiar las vistas y las
del
V. Tecnologas Java EE
<!-- Ya no es necesario modificar faces-config.xml --> <!-- application> <view-handler>com.sun.facelets.FaceletViewHandler</view-handler> </application -->
V. Tecnologas Java EE
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
Tipos de EJB
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
Ciclo de Vida
V. Tecnologas Java EE
Interceptores Siempre que empleamos contenedores IoC y Ciclos de Vida. Posibilidad de emplear AOP.
V. Tecnologas Java EE
@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
V. Tecnologas Java EE
Crea un EJB.
@Stateful public class EjemploB implements EjemploBLocal { double numero; public EjemploB() { System.out.println("Stateful!!!"); numero = Math.floor(Math.random()*10+1); } @Override public String getMensaje() { numero++; return "MensajeB ["+numero+"]"; } }
@Stateless public class Ejemplo implements EjemploLocal { double numero; public Ejemplo() { System.out.println("Stateless!!!"); numero = Math.floor(Math.random()*10+1); } @Override public String getMensaje() { numero++; return "Mensaje ["+numero+"]"; } }
public class JSFBean { @EJB Faces-config.xml public EjemploBLocal ejemplo; -------------------------------------------------------------------------------------public String getMensaje() { return ejemplo.getMensaje(); } <managed-bean> } <managed-bean-name>jSFBean</managed-bean-name> <managed-bean-class>mb.JSFBean</managed-bean-class> <managed-bean-scope>session</managed-bean-scope> </managed-bean> Pgina -------------------------------------------------------------------------------------<h:outputText value="#{jSFBean.mensaje}" />
V. Tecnologas Java EE
Crea un EJB.
V. Tecnologas Java EE
Necesario
V. Tecnologas Java EE
de Persistencia
Transacciones JTA: Empleada en Servidores de Aplicaciones JavaEE Transacciones RESOURCE_LOCAL: Empleada en Aplicaciones C/S.
<?xml version="1.0" encoding="UTF-8"?> <persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0"> <persistence-unit name="defaultPU" transaction-type="JTA"> <provider>org.hibernate.ejb.HibernatePersistence</provider> <jta-data-source>jdbc/NombreDataSource</jta-data-source> <properties> <property name="hibernate.hbm2ddl.auto" value="validate"/> <property name="hibernate.show_sql" value="true"/> <property name="hibernate.format_sql" value="true"/> <property name="hibernate.default_shema" value="NOMBRE"/> <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect"/> <property name="hibernate.transaction.manager_lookup_class value="org.hibernate.transaction.OC4JTransactionManagerLookup"/> <property name="hibernate.query.factory_class value="org.hibernate.hql.classic.ClassicQueryTranslatorFactory" /> <property name="hibernate.transaction.flush_before_completion" value="true"/> <property name="hibernate.cache.provider_class value="org.hibernate.cache.HashtableCacheProvider"/> </properties> </persistence-unit> </persistence>
V. Tecnologas Java EE
de Persistencia
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
V. Tecnologas Java EE
@Entity public class Entidad { @EmbeddedId @AttributeOverrides({ @AttributeOverride(name = "id", column = @Column(name = "ID", nullable = false, precision = 5, scale = 0)), @AttributeOverride(name = "nombre", column = @Column(name = "NOMBRE", nullable = false, length = 50)), }) private EntidadId id; public Entidad() { } // Getters y Setters } @Embedded public class EntidadId { int id; String nombre; public EntidadId() { } public boolean equals(Object o) { /* Comprueba si son iguales */ } public int hashCode() { /* Buenas practicas equals() -> hashCode() */ } }
Clave Compuesta
V. Tecnologas Java EE
Bsicas: Atributos
Atributo Simple
@Entity @Table(name="USUARIOS") public class Usuario { @Id private String nick; @Column(name="PASSWORD", nullable=false) private String pass; @Column(name="E-MAIL", nullable=false) private String mail; @Lob @Basic(fetch=FetchType.LAZY) private byte[] imagen; ... public Usuario() { } // Getters y Setters }
@Entity @Table(name="USUARIOS") public class Usuario { @Id private String nick; @Embedded @AttributeOverrides({ @AttributeOverride(name="codigoPostal",column=@Column(name="COD_POS")), @AttributeOverride(name="direccionPostal",column=@Column(name="DIR_POS")) }) private Direccion direccion; public Usuario() { } // Getters y Setters } @Embeddable public class Direccion implements Serializable { private String direccionPostal; private String ciudad; private int codigoPostal; private String pais; public Direccion() { } public boolean equals(Object o) { /* Comprueba si las dos entidades son iguales */ } public int hashCode() { /* Buenas practicas equals() -> hashCode() */ } // Getters y Setters }
Atributo Compuesto
V. Tecnologas Java EE
@Entity @Table(name="PERFILES") public class Perfil { @Entity @Id @Table(name="USUARIOS") @Column(name="PERFIL_ID") public class Usuario { private int id; @Id CascadeType.PERSIST: Cuando persistamos la entidad todas las ...entidades que private String nick; contenga esta variable sern persistidas tambin. } @Column(name="PASSWORD", nullable= false ) CascadeType.REMOVE : Cuando borremos la entidad todas las entidades que private String pass; @OneToOne contenga esta variable se borrarn del mismo modo. @JoinColumn(name="PERFIL_USUARIO_ID",referencedColumnName="PERFIL_ID", false)que CascadeType.REFRESH: Cuando actualicemos la entidad todasupdatable= las entidades private Perfil perfil; contenga esta variable se actualizarn. private Set<Noticia> noticias = new HashSet<Noticia>(0); CascadeType.MERGE: Cuando hagamos un "merge" de la entidad todas las @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY,mappedBy = "usuario") entidades que contenga esta variable realizarn la misma operacin. public Set<Noticia> getNoticias() { CascadeType.ALL @Entity citadas anteriormente. return this.noticias; : Todas las operaciones @Table(name = "NOTICIA") } public class Noticia implements java.io.Serializable { public void setNoticias(Set<Noticia> noticias) { ... this.noticias = noticias; private Usuario usuario; } @ManyToOne(fetch = FetchType.LAZY) ... @JoinColumn(name = "USUARIO", nullable = false) } @NotNull public Usuario getUsuario() { return this.usuario; } ManyToMany: Muy similar a ManyToOne public void setUsuario(Usuario usuario) { this.usuario = usuario; } pero simtrica en ambas clases. ... ManyToOne }
V. Tecnologas Java EE
@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
create or replace procedure findUsersLike(res out sys_refcursor, str in string) as begin open res for select u.* from users u where u.username like concat(str, '%'); end findUsersLike; @NamedNativeQuery (name = "User.findLike", resultClass = User.class, query = "{call findUsersLike(?,:VAR)}", hints = { @QueryHint(name = "org.hibernate.callable", value = "true"), @QueryHint(name = "org.hibernate.readOnly", value = "true") } ) @org.hibernate.annotations.NamedNativeQuery (name=User.findLike, resultClass = User.class, query = "{call findUsersLike(?,:VAR)}", callable = true, readOnly = true)
V. Tecnologas Java EE
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
V. Tecnologas Java EE
V. Tecnologas Java EE
V. Tecnologas Java EE
<?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>
Servicios WEB
Forma
de interactuar.
Servicios WEB
Buscar
Invocar
Intercambio
de Informacin: SOAP.
Documentos XML.
Las
A partir de un mtodo podemos crear un servicio. A partir de un WSDL podemos crear un cliente.
Servicios WEB
Implementaciones
Usaremos
JAXWS. En FundeWeb se usar CXF, pero el curso se centra en la interaccin y no en las implementaciones.
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.
Autenticacin JAAS
<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>
Autenticacin JAAS
@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>
Prcticas II
Crea
roles en una aplicacin. Aade seguridad a diferentes recursos. Securiza la creacin de noticias en el Diario Digital.
<!-- 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>
Portales y Portlets
Idea
similar a la de los servlets. Componentes configurables y reubicables. Pensados para su uso en portales. Especificacin JSR 168.
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
A. Diario Digital
A. Diario Digital
Prctica Global
Muestra
WEB Module
JSF Application
Web Service
JSF Application
EJB Module
Database
Gracias !