Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
• Problema
− Un cambio en la implementación del modelo implica recompilación de toda la
aplicación y reinstalación en los clientes.
» Cambios de drivers de acceso a BD
• Solución:
− Modelo en servidor intermedio
» Un cambio en la implementación del modelo sólo afecta al servidor.
− Clientes standalone
» Sólo disponen de la interfaz gráfica
• Tipos de EJB:
− Beans de sesión: representa una conversación temporal con un cliente. Cuando el cliente
finaliza su ejecución, el bean de sesión y sus datos desaparecen.
− Java Persistence API / Beans de entidad: representa datos persistentes almacenados en una
fila de una tabla/relación de una base de datos. Si el cliente termina o si se apaga el servidor,
los servicios subyacentes de aseguran de grabar el bean.
• La nueva Java Persistence API ha simplificado la persistencia de los entity beans. Los nuevos entity
objects son POJOs que proporcionan una vista orientada a objetos de los datos almacenados en una
base de datos.
− Beans dirigidos por mensajes: combina las características de un bean de sesión y de un
oyente de Java Message Service (JMS), permitiendo que un componente de negocio reciba
asíncronamente mensajes JMS.
• Capa del sistema de información empresarial (EIS): La capa del sistema de información
empresarial maneja el software del sistema de información empresarial como ERP's,
BD, etc. Las aplicaciones J2EE pueden necesitar acceder a estas aplicaciones, pEj.
para acceder a sus BD.
Definiciones
• Empaquetado: Para desplegar una aplicación JEE, se empaquetan los
componentes en ficheros especiales que contienen los ficheros de las clases
relevantes y los descriptores de despliegue XML
− Estos descriptores de despliegue contienen información específica de componentes
empaquetados y son un mecanismo para configurar el comportamiento de la aplica-
ción en el momento del ensamble o del despliegue.
Contenedor
Cliente EJBs
(HTML, (Sun App Serv,
JavaScrip Glassfish,
t, Petición HTTP
Contenedor JBoss, …)
Applets, Servidor Servlets /JSP
PDF, etc) Web
(MSIE, Respuesta HTTP
(Sun App. Serv,
(HTML+ JavaScript Base de Datos
NSN, (Apache) Glassfish,
PDF, ZIP, etc.) (Oracle)
Java Tomcat…) Clases,
PlugIn JavaBeans,
Acrobat SQLJs sobre
Reader) una JVM
(Sun App. S.,
Glassfish…)
BLOQUE II
Contenido
Desarrollo fácil de Enterprise Applications (EA)
Empaquetado de aplicaciones JEE5
Líneas de desarrollo de software EJB
Stateless Session Beans
Stateful Session Beans
Message Driven Beans
EJB2.1 vs EJB3
Java Persistence API (entities)
Desarrollo fácil de EAs
• Beneficios de EJB
− Simplifican el desarrollo de aplicaciones grandes y/o
distribuídas. Razones:
• El contenedor proporciona servicios a nivel de sistema a los enterpise
beans, por lo que el desarrollador puede dedicarse a resolver
problemas de negocio. Ejemplo de esos servicios: la gestión de
transacciones y las autorizaciones de seguridad.
• Como los EJBs (y no los clientes) contienen la lógica de negocio de la
aplicación, el programador de la capa cliente, puede dedicarse a
mejorar la presentación hacia el cliente. Esto permite construir clientes
ligeros, lo cual es especialmente interesante para dispositivos móviles.
• Al ser los EJBs componentes portables, pueden construirse nuevas
aplicaciones ensamblando Beans existentes.
Líneas de desarrollo EJB
• Ejemplo:
@Resource(name=”myDB”, type=javax.sql.DataSource)
@Stateful public class ShoppingCartBean implements ShoppingCart {
@Resource SessionContext ctx;
public Collection startToShop (String productName) {
...
DataSource productDB =(DataSource)ctx.lookup(“myDB”);
Connection conn = myDB.getConnection();
...
}
...
}
El recurso MyDB es buscado en
tiempo de ejecución, lo que permite
a una aplicación decidir a qué
recursos acceder dependiendo de la
disponibilidad o por ejemplo, de
parámetros de QoS
Líneas de desarrollo EJB: Compatibilidad y migración
team = value;
}
}
Java Persistence API
@Id // Every entity must have an identity. public void setName(String name) {
public String getId() { this.name = name;
return id; }
}
public void setId(String id) { @OneToMany(mappedBy="department")
this.id = id; public Set<Employee> getEmployees() {
} return employees;
}
public String getName() {
return name; public void setEmployees(Set<Employee> employees) {
} this.employees = employees;
}
public void setName(String name) { }
this.name = name;
}
Java Persistence API
@Remote
public interface HRMS {
Employee createEmployee(String empName, String departmentName);
}
BLOQUE III: PRÁCTICAS DEL CURSO
Práctica 1
• Práctica número 1:
− Descripción: Creación de un JavaBean
− Objetivos:
• Primera toma de contacto con Netbeans como IDE
• Primera toma de contacto con Sun Application Server 9 como Servidor
de Aplicaciones
• Primera toma de contacto con Colinux modificado como entorno virtual
avanzado del curso.
− Entorno gráfico con NX
• Conocer las características principales de un JavaBean, para entender
a diferenciar los casos en los que es conveniente usar JavaBeans, y
cuándo usar EJB’s.
Práctica 1
• Arrancamos Netbeans.
<body>
<b>Guardamos los datos...</b><p>
<jsp:setProperty name="libro" property="titulo" value="Avanced JavaServer Pages" />
<jsp:setProperty name="libro" property="autor" value="David M. Geary" />
<b>Recuperamos los datos...</b><br>
<jsp:getProperty name="libro" property="titulo" /><br>
<jsp:getProperty name="libro" property="autor" /><br>
</body>
</html>
Práctica 1
• Creamos una nueva clase Java: cursoEjb.LibroListenerBean
package cursoEjb;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
/**
*
* @author jcarlos
*/
public class LibroListenerBean implements
HttpSessionListener {
public String getTitulo() {
private String titulo;
return titulo;
private String autor;
public void setTitulo(String titulo) { }
this.titulo = titulo; public String getAutor() {
} return autor;
public void setAutor(String autor) { }
this.autor = autor;
}
public void sessionCreated(HttpSessionEvent
se) {
}
• Práctica número 2:
− Descripción: Creación de un Stateless EJB
• Primera toma de contacto con los EJBs
• Primera toma de contacto con las anotaciones.
• Construcción de un EJB simple, que realice las funciones de una
calculadora.
• Será una aplicación que tenga un Servlet que haga la llamada al EJB
Práctica 2
@Stateless
public class CalculadoraBean implements ejb02.CalculadoraRemote {
}
Práctica 2
import javax.ejb.Remote;
@Remote
public interface CalculadoraRemote {
int multiplica(int a, int b);
}
Práctica 2
import javax.ejb.EJB;
import ejb02.CalculadoraRemote;
public class Resultados extends HttpServlet {
@EJB
private CalculadoraRemote calcu;
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet que suma dos argumentos</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Servlet que suma dos argumentos</h1>");
out.println("</body>");
out.println("La suma de: "+arg0+" Y: "+arg1+" es: "+calcu.suma(arg0,arg1));
out.println("</html>");
out.close();
}
Práctica 2
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Práctica 2</title>
</head>
<body>
</body>
</html>
Práctica 2
• Práctica número 3:
− Descripción: Creación de un Stateful EJB
• Primera toma de contacto con los EJBs de tipo statefull
• Construcción de un EJB simple, que realice las funciones de una mini-
carrito de la compra (en este caso, de libros).
• Será una aplicación que tenga una aplicación de consola que haga la
llamada al EJB
Práctica 3
• Una vez de
pulsemos Finish,
desplegamos el
árbol de proyectos y
pulsamos click
derecho sobre
ejb03-carro-ejb tal
como en la figura:
Práctica 3
public LibroException(String
msg) {
super(msg);
}
}
Práctica 3
• Volvemos a crear una • Y este código:
package util;
public IdVerificador() {
}
return result;
}
}
Práctica 3
IdCliente = "0";
contenidos = new ArrayList<String>();
}
if (compruebaId.validar(id)) {
IdCliente = id;
} else {
throw new LibroException("Codigo de ID invalido: " + id);
}
if (result == false) {
throw new LibroException("\"" + titulo + "\" no esta en el carro.");
}
}
@Remove()
public void borrado() {
contenidos = null;
}
}
Práctica 3
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
ClienteCarro client = new ClienteCarro(args);
client.doTest();
}
while (iterator.hasNext()) {
String titulo = iterator.next();
System.out.println("Obteniendo titulo del libro del carro: " + titulo);
}
System.out.println("Borrando \"El nombre de la Rosa\" from carro.");
carro.borrarLibro("El nombre de la Rosa");
System.exit(0);
} catch (LibroException ex) {
System.err.println("Se elevo una LibroException: " + ex.getMessage());
System.exit(1);
} catch (Exception ex) {
System.err.println("Se elevo una excepcion inesperada");
ex.printStackTrace();
System.exit(1);
}
}
}
Práctica 3
• Práctica número 4:
− Descripción: Creación de un Message Driven Bean y conocer
usando el sistema pb-project (Java Blue Prints Project).
− Objetivos:
• Primera toma de contacto con los MDB
• Primera toma de contacto con el sistema pb-project
• Conocer las características principales de un MDB, para entender
cuándo puede compensarnos el usarlo.
Práctica 4
− Por:
<property name="is.war.module" value="true"/>
<property name="bp-project.home" value="path de <bp-project.home>"/>
<import file="${bp-project.home}/main.xml" />
• Proyecto Web
<?xml version="1.0"?>
<project name="bp-web-project" default="default" basedir=".">
<property name="is.war.module" value="true"/>
<import file="bp-project/main.xml"/>
</project>
C:\Sun\AppServer\domains\domain1\logs
/opt/SUNWApp/domains/domain1/logs
Práctica 4
C:\CursoEJB\proyectos\ejb04-mensajesimple
/opt/cursoejb/proyectos/ejb04-mensajesimple
Práctica 4
− Por:
<property name="is.ear.module" value="true"/>
<import file=“./bp-project/main.xml" />
<target name="delete-cf"
description="delete JMS connection factory">
<antcall target="delete-jms-resource">
<param name="jms.resource.name" value="jms/ConnectionFactory" />
</antcall>
</target>
Práctica 4
• Abrimos una shell, y desde la
carpeta de nuestro proyecto,
ejecutamos:
– ant create-cf
– ant create-queue
• Debemos obtener
lo siguiente:
Práctica 4
• Práctica número 5:
− Descripción: Creación de un bean de entidad, y primer
acercamiento a la base de datos derby para la función de
almacén de datos.
− Objetivos:
• Primera toma de contacto con los entity beans.
• Primera toma de contacto con derby
• Conocer las características principales de un entity bean.
Práctica 5
protected CredencialUsuario() {
}
}
Práctica 5
try {
// Comenzamos una transaccion porque usamos un Entity Manager JTA.
utx.begin();
} catch (Exception e) {
throw new ServletException(e);
}
EntityManager em = emf.createEntityManager();
try {
resp.setContentType("text/html");
PrintWriter out = resp.getWriter();
out.println("<HTML> <HEAD> <TITLE>Registro de nuevo usuario " +
"</TITLE> </HEAD> <BODY BGCOLOR=white>");
Práctica 5
String nombre = req.getParameter("nombre");
String password = req.getParameter("password");
CredencialUsuario credencial = new CredencialUsuario(nombre, password);
// em.persist hace que el objeto se vuelva persistente.
em.persist(credencial);
out.println("Se ha creado correctamente el nuevo usuario. " +
"Haz click <A HREF=\"login.html\"> aqui </A> para logarte.");
out.println("</BODY> </HTML> ");
utx.commit();
} catch (Exception e) {
try {
utx.rollback();
} catch (Exception ee) {
// Excepcion
}
throw new ServletException(e);
} finally {
em.close();
}
}
<body>
<form method="post" action="login">
<p>Nombre de Usuario: <input type="text" name="nombre" size="10"> </p>
<p>Password: <input type="password" name="password" size="10"> </p>
<br>
<p>
<input type="submit" value="login"/>
<A href="registro.html"> Nuevo usuario? </A>
</form>
</body>
Práctica 5
<body>
<form method="post" action="registro">
<p>Nombre de Usuario: <input type="text" name="nombre" size="10">
</p>
<p>Password: <input type="password" name="password" size="10"> </p>
<br>
<p>
<input type="submit" value="registro"/>
<input type="reset" value="cancelar"/>
</form>
</body>
Práctica 5
<%
response.sendRedirect(URLRedireccion);
%>