Post on 12-Jun-2015
description
transcript
COMPONENTES: PRÁCTICAS
• Enterprise Java Beans (II): Entorno:
• Netbeans
• Sun Application Server
• Web Services.
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
• 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.
• Creamos un nuevo proyecto: ejb01-javabean:
Práctica 1
• En el asistente, elegimos una aplicación Web:
Práctica 1
• Elegimos el nombre ejb01-javabean
Luego NEXT y FINISH
Práctica 1
• Modificamos el archivo:index.jsp
<jsp:useBean id="libro " class="cursoEjb.LibroListenerBean " scope="session " /><%=session.getAttribute ("libro ") + "<br>" %><html><head><title>JavaBeans - Curso EJB </title></head>
<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 {
private String titulo;private String autor;public void setTitulo(String titulo) {
this.titulo = titulo;}public void setAutor(String autor) {
this.autor = autor;}
public String getTitulo() {return titulo;
}public String getAutor() {
return autor;}
public void sessionCreated(HttpSessionEvent se) {}
public void sessionDestroyed(HttpSessionEvent se) {}
}
Práctica 1
• Su ahora ejecutamos la opción “Run”, en un entorno UNIX, obtendremos esto:
• Podemos corregirlo aquí:− Tools
• Options
− Advanced Menu» Eliminamos Mozilla y firefox, y nos quedamos sólo con el browser de
swing.
Práctica 1
• En esta versión de guadalinex, hay un problema con los navegadores basados en Mozilla (mozilla, firefox, galeon, epiphany). Suele ocurrir cuando andamos cortos de RAM.
• Instalamos konqueror:− sudo aptitude install konqueror
• Creamos una configuración de navegador para konqueror, tal como se muestra en la figura siguiente, y la ponemos en primer lugar, indicando que se use esa configuración de forma preferente.
Práctica 1
• Configuración de konqueror:
Práctica 1
• Y en la opción de configuración básica (pinchamos en basic options), debemos tener el selector de navegador a konqueror:
Práctica 1
• Resultados esperados tras un deploy + Run:
PRÁCTICA 2: CREACIÓN DE UN STATELESS EJB
Práctica 2
• Práctica número 2: − Descripción: Creación de un Stateless EJB
• Primera toma de contacto con los EJBs dentro del entorno Netbeans
• Primera toma de contacto con las anotaciones, y cómo pueden facilitarnos la vida.
• 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
• REIVINDIQUEMOS LO SIMPLE:− No hay Xdoclet. − El packaging es automático. − No hay que crear descriptores (el entorno o el contenedor -según el caso- lo hacen
de manera automática)− No hay que crear interfaces HOME como hacíamos en eclipse a través de la
herramienta Xdoclet y la opción PackageSubstitution cuando creamos EJB’s.− Crear EJB con anotaciones es fácil y rápido.− No tenemos la obligación de que los nombres de los Servlets terminen en Servlet, ni
que los nombres de los Beans terminen en Bean.− No hay que crear los métodos ejbActivate y ejbPassivate; el contenedor realiza el
trabajo “sucio”.
Práctica 2
• Primero: Creamos un proyecto de tipo Enterprise:
Práctica 2
• Le pedimos al asistente que cree el módulo WAR y el EJB:
Práctica 2
• Ahora, en el cuadro de proyectos, pulsamos click derecho sobre “ejb02-calculadora-ejb”, y elegimos New=>Session Bean
Práctica 2
• El asistente debe haber dejado lo siguiente:
• El EJB propiamente dicho, es la clase “CalculadoraBean”
• CalculadoraRemote, es un interfaz, ya que los clientes nunca se comunican directamente contra el Bean
• La comunicación directa sólo la tiene el Contenedor, para controlar el Passivate y el Activate.
Práctica 2
• Una vez hecho esto, nos fijamos en la annotationque tenemos justo en la cabecera de la clase:
• Con esa etiqueta, el contenedor se encargaráde crear un EJB sin estado.
• No tenemos tampoco que crear el archivo ejb-jar.xml
• No necesitamos el interfaz home.
• No hay Xdoclets• ¡Fácil!
Práctica 2
• Empezamos a codificar los métodos de la calculadora, y observamos que Netbeans ya nos empieza a mostrar un asistente de ayuda que solicita incorporar esos métodos al interfaz:
(Prestar atención al icono de la bombilla)
Práctica 2
• El resultado final de CalculadoraBean debe ser el que sigue: package ejb02;
import javax.ejb.Stateless;
@Stateless@Stateless@Stateless@Statelesspublic class CalculadoraBean implements ejb02.CalculadoraRemote {
/** Creates a new instance of CalculadoraBean */public CalculadoraBean() {}
public int sumasumasumasuma(int a, int b) {return a+b;
}
public int restarestarestaresta(int a, int b) {return a-b;
}
public int dividedividedividedivide(int a, int b) {if (b == 0) {
throw new IllegalArgumentException("No puedo dividir por 0");}return a / b;
}
public int multiplicamultiplicamultiplicamultiplica(int a, int b) {return a*b;
}
}
Práctica 2
• El resultado final de CalculadoraRemote debe ser el que sigue:
package ejb02;
import javax.ejb.Remote;
@Remote@Remote@Remote@Remotepublic interfaceinterfaceinterfaceinterface CalculadoraRemote {
int multiplica(int a, int b);
int divide(int a, int b);
int resta(int a, int b);
int suma(int a, int b);
}
Práctica 2
• Ahora vamos a crear un servlet. Más adelante crearemos un formulario en el index.jsp que enviará el submit a este servlet, que a su vez, usará al EJB para operar con las operaciones de la calculadora:
Práctica 2
• Seguimos el asistente, tecleando lo siguiente:
Práctica 2
• El código del servlet donde hay cambios es:
• Y además hay que añadir dos imports.
@EJB@EJB@EJB@EJBprivate CalculadoraRemote calcu;
protected void processRequest(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");PrintWriter out = response.getWriter();Integer arg0 = Integer.parseInt(request.getParameter("arg0"));Integer arg1 = Integer.parseInt(request.getParameter("arg1"));
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(arg0calcu.suma(arg0calcu.suma(arg0calcu.suma(arg0,arg1),arg1),arg1),arg1));out.println("</html>");out.close();
}
Práctica 2
• Ahora retocamos el index.jsp que ha creado netbeans en la carpeta “ejb02-calculadora-war/Web Pages ” para que incluya un formulario que envíe dos argumentos numéricos al servlet, que a su vez usa al EJB para los cálculos:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd">
<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Práctica 2</title>
</head><body> <h1>Practica 2 - Curso EJB</h1><form name="formulario" action="ResultadosResultadosResultadosResultados" method="POST">
Introduce dos argumentos numericos, y haremos calculos:<BR><input type="text" name="arg0" value="1" /><input type="text" name="arg1" value="2" /><input type="submit" value="Enviar" name="enviar" />
</form>
</body></html>
Práctica 2
• Para acabar, sólo nos queda testearlo. Para ello, le decimos a Netbeans que ejecute un Run, que es lo mismo que build+deploy+Run.
Práctica 2
• Una vez visto los resultados, cambiar el código necesario para que el proyecto reste y multiplique.
• Objetivo: repetir conceptos y fijar el conocimiento del entorno Netbeans para la generación de proyectos Enterprise Edition.
PRÁCTICA 3: CREACIÓN DE UN STATEFUL EJB
Práctica 3
• Práctica número 3: − Descripción: Creación de un Stateful EJB
• Primera toma de contacto con los EJBs de tipo statefull
− Los stateful beans, además de tener métodos de negocio, tienen variables de estado (variables que tomar valor al instanciar un objeto y usarlo, y que representan un determinado estado del objeto).
• 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
• Primero: creamos una aplicación de tipo Enterprise:
Práctica 3
• En el asistente, comprobamos que los parámetros queden EXACTAMENTE como en la figura:
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
• Continuamos con el asistente, con estos parámetros:
Práctica 3
• Una vez finalizado, navegamos por el árbol de directorios. Netbeans nos ha creado automáticamente la plantilla del Bean y el Interfaz. La renombraremos y ejecutaremos un Refactoring:
<= Teniendo esta selección activa, pulsamos F2, o bien botón derecho, menú, y rename.
Práctica 3
• Ahora observamos que Netbeans nos muestra una nueva subventana, en la que espera confirmación para ejecutar el proceso de refactoring:
Práctica 3
• Cremos ahora una nueva clase tal como en la figura:
Práctica 3
• En el asistente, proporcionamos estos datos:
• Y este código:
package util;
public class LibroExceptionextends Exception {
public LibroException() {
}
public LibroException(Stringmsg) {
super(msg);
}
}
Práctica 3
• Volvemos a crear una nueva clase, esta vezcon estos datos:
• Y este código:package util;
/**** @author jcarlos*/public class IdVerificador {
public IdVerificador() {}
public boolean validar(String id) {boolean result = true;
for (int i = 0; i < id.length(); i++) {if (Character.isDigit(id.charAt(i))
== false) {result = false;
}}
return result;}
}
Práctica 3
• El código del Bean es el siguiente (1/2):
@Stateful@Stateful@Stateful@Statefulpublic class CarroBeanCarroBeanCarroBeanCarroBean implements ejb03.Carro {
/** /** /** /** CreatesCreatesCreatesCreates a a a a newnewnewnew instanceinstanceinstanceinstance ofofofof CarroBeanCarroBeanCarroBeanCarroBean */*/*/*/List<String> contenidos;String IdCliente;String nombreCliente;
public CarroBeanCarroBeanCarroBeanCarroBean() {}
public void inicializarinicializarinicializarinicializar(String persona) throws LibroException {if (persona == null) {
throw new LibroException("No se permite persona con valor Null");
} else {nombreCliente = persona;
}
IdCliente = "0";contenidos = new ArrayList<String>();
}
// // // // ------------> Continua en la siguiente pagina> Continua en la siguiente pagina> Continua en la siguiente pagina> Continua en la siguiente pagina
Práctica 3
public void inicializarinicializarinicializarinicializar(String persona,String id) throws LibroException {if (persona == null) {
throw new LibroException("No esta permitida persona con valor Null");} else {
nombreCliente = persona;}
IdVerificador compruebaId = new IdVerificador();
if (compruebaId.validar(id)) {IdCliente = id;
} else {throw new LibroException("Codigo de ID invalido: " + id);
}
contenidos = new ArrayList<String>();}
// // // // ------------> Continua en la siguiente pagina> Continua en la siguiente pagina> Continua en la siguiente pagina> Continua en la siguiente pagina
• Código del bean (2/3)
Práctica 3
• Código del bean (3/3)public void anadirLibroanadirLibroanadirLibroanadirLibro(String titulo) {
contenidos.add(titulo);}
public void borrarLibroborrarLibroborrarLibroborrarLibro(String titulo) throws LibroException {boolean result = contenidos.remove(titulo);
if (result == false) {throw new LibroException("\"" + titulo + "\" no esta en el carro.");
}}
public List<String> getcontenidosgetcontenidosgetcontenidosgetcontenidos() {return contenidos;
}
@Remove@Remove@Remove@Remove()()()()public void borradoborradoborradoborrado() {
contenidos = null;}
}
Práctica 3
• Se pide lo siguiente en este punto:− Solucionar los problemas de referencias no satisfechas
usando la ayuda de Netbeans (presentará un icono de bombilla para elegir los imports que el entorno crea que necesitamos)
• import java.rmi.RemoteException;• import java.util.ArrayList;• import java.util.List;• import javax.ejb.Remove;• import javax.ejb.Stateful;• import util.IdVerificador;• import util.LibroException;
− Usar el asistente Netbeans para definir los métodos en el interfaz del Bean de forma automática.
Práctica 3
• Nos movemos por el menú de proyectos hasta el cliente del EJB que hemos creado (1/2):
public class ClienteCarroClienteCarroClienteCarroClienteCarro {@EJB@EJB@EJB@EJBprivate static Carro carro;
public ClienteCarroClienteCarroClienteCarroClienteCarro(String[] args) {}
/*** @param args the command line arguments*/
public static void mainmainmainmain(String[] args) {ClienteCarro client = new ClienteCarro(args);client.doTest();
}
public void doTestdoTestdoTestdoTest() {try {
carro.inicializar("Mi carro de la compra", "123");carro.anadirLibro("El nombre de la Rosa");
carro.anadirLibro("La ciudad de la algegria");carro.anadirLibro("La metamorfosis de Kafka");
List<String> bookList = carro.getcontenidos();
// // // // ------------> Continua en la pagina siguiente> Continua en la pagina siguiente> Continua en la pagina siguiente> Continua en la pagina siguiente
Práctica 3
• El código continúa así:bookList = carro.getcontenidos();
Iterator<String> iterator = bookList.iterator();
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.out.println("Borrando \"El resplandor\" del 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
• Se pide, en este caso:
− Resolver las referencias no satisfechas, usando el asistente de Netbeans, y comprobar que no existe ningún aviso de error en el código y ejecutar la aplicación:
Hemos provocado una excepción de manera intencional al borrar un libro inexistente en el carro.
PRÁCTICA 4: CREACIÓN DE UN MESSAGE DRIVEN BEAN
Práctica 4
• 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
• Los proyectos que usan el sistema Java Blue PrintsProject (bp-project) tienen las siguientes ventajas:− Pueden crear proyectos Java basados en la herramienta ANT
− Pueden cargarse y usarse como proyectos nativos en IDE’scomo Netbeans
− Pueden ser ejecutados (y desplegados) desde la línea de comandos
− Permiten que un conjunto de proyectos compartan una misma configuración.
Práctica 4
• Instrucciones de uso de bp-project de un proyecto con código fuente existente− Descargar bp-project y descomprirlo ejecutando el fichero JAR. Este proceso,
genera una nueva carpeta llamada “bp-project-vXX” (llamaremos a este directorio bp-project.home). Nos dirigimos al directorio bp-project.home/bp-project.
− Nos aseguramos de tener ANT instalado. Si no lo tenemos, lo descargamos. − Creamos el proyecto Netbeans si aún no está creado.− Abrimos el fichero build.xml generado por NetBeans y reemplazamos la línea:
<import file="nbproject/build-impl.xml"/> Por:
<property name="bp-project.home" value=“poner el path <bp-project.home>"/><import file="${bp-project.home}/main.xml" />
− Observar que podemos compartir un único directorio bp-project/ entre muchas aplicaciones simplemente copiándolo a un lugar común, y ajustando la línea de import a la carpeta o ubicación que corresponda.
− También será necesario definir una nueva propiedad en el fichero build.xml que defina el tipo de proyecto. Por ejemplo, si es un proyecto Web, tendremos que añadir la siguiente línea a build.xml:Justo antes del import de ${bp-project.home}/main.xml Ponemos:
<property name="is.war.module" value="true"/>
Práctica 4
• Ejemplo de un caso concreto:− Abrimos build.xml y reemplazamos:<import file="nbproject/build-impl.xml"/>
− 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" />
− Nosotros copiaremos la carpeta bp-project al path del proyecto, de modoque esas tres líneas quedarán en dos:
<property name="is.war.module" value="true"/>
<import file="././././bpbpbpbp----project.homeproject.homeproject.homeproject.home/main.xml" />
• En el directorio <bp-project.home> copiamos el ficherobuild.properties.sample a build.properties y corregimos los valores de las propiedades javaee.home, y javaee.server.passwordfile.
Práctica 4
• Instrucciones para proyectos nuevos− Crear la estructura de directories del proyecto siguiendo las
Reglas de proyecto Java BluePrints. Si estamos creando el proyecto con Netbeans, no hay problema, ya que NB sigue esas reglas.
− Copiamos el directorio bp-project/ en el home del directorio del proyecto.
− Creamos un fichero build.xml adecuado para un war, ear o ejb-jar siguiendo los ejemplos que se describen en las siguientes diapositivas.
Práctica 4
• Proyecto EAR (enterprise archive)
<?xml version="1.0"?><project name="bp-web-project" default="default" basedir=".">
<property name="is.ear.moduleis.ear.moduleis.ear.moduleis.ear.module" value="true"/><import file="bp-project/main.xml"/>
</project>
• Proyecto Web
<?xml version="1.0"?><project name="bp-web-project" default="default" basedir=".">
<property name="is.war.moduleis.war.moduleis.war.moduleis.war.module" value="true"/><import file="bp-project/main.xml"/>
</project>
• Proyecto EJB Jar
<?xml version="1.0" encoding="UTF-8"?><project name="hello-ejb" default="default" basedir="." xmlns:ejbjarproject="http://www.netbeans.org/ns/j2ee-ejbjarproject/2">
<property name="is.ejbis.ejbis.ejbis.ejb----jar.modulejar.modulejar.modulejar.module" value="true"/><import file="bp-project/main.xml"/>
</project>
Práctica 4
• Proyecto Java Persistente Unit.
<?xml version="1.0" encoding="UTF-8"?><project name="hello-pu" default="default" basedir=".">
<description>Builds, tests, and runs the project hello-pu.</description><property name="is.jar.moduleis.jar.moduleis.jar.moduleis.jar.module" value="true"/><property name="is.persistenceis.persistenceis.persistenceis.persistence----unit.moduleunit.moduleunit.moduleunit.module" value="true"/><import file="bp-project/main.xml"/>
</project>
• Proyecto Web que depende la la JPU declarada encima d e estas líneas
<?xml version="1.0" encoding="UTF-8"?><project name="hello-servlet" default="default" basedir=".">
<property name="is.war.moduleis.war.moduleis.war.moduleis.war.module" value="true"/>
<!-- This project is dependent on the hello-pu project so it is declaring a dependency --><property name="hello-pu.home" value="${home.dir}/../hello-pu"/>
<!-- extra.classpath property adds to the classpath used for compilation --><property name="extra.classpathextra.classpathextra.classpathextra.classpath" value="${hello-pu.home}/dist/hello-pu.jar"/>
<!-- include the persistence unit in the Web-app --><target name="-post-compile" depends="init">
<copy file="${hello-pu.home}/dist/hello-pu.jar" todir="${build.dir}/web/WEB-INF/lib"/></target>
<!-- Note that this project is sharing the build system with other projects --><import file="bp-project/main.xml"/>
</project>
Práctica 4
• Proyecto Web que depende de una librería de componentes JSF
<?xml version="1.0"?>
<project name="bp-slider-navigator" default="default" basedir=".">
<property name="is.war.moduleis.war.moduleis.war.moduleis.war.module" value="true"/><import file="bp-project/main.xml"/>
<property name="project.uiproject.uiproject.uiproject.ui" value="../../../components/ui"/><property name="reference.ui.jarreference.ui.jarreference.ui.jarreference.ui.jar" value="${project.ui}/dist/ui.jarui.jarui.jarui.jar"/>
<target name="-pre-compile" depends="init"><copy file="${reference.ui.jarreference.ui.jarreference.ui.jarreference.ui.jar}" todir="${build.web.dir}/WEB-INF/lib"/>
</target></project>
Práctica 4
• TARGETs típicos de compilación: Estos son algunos target’s típicos de compilación (build) que estádisponibles automáticamente cuando usamos bp-project: − all : Compila, empaqueta el archive, despliega la aplicación y
ejecuta.− compile : Compila a aplicación.− package-module : Empaqueta el archivo.− default : Compila y empaqueta el archivo.− run : Ejecuta la aplicación− undeploy : repliega la aplicación.− clean : Borra los directories generados, como build y dist
Práctica 4
• Valores de variables en el fichero build.properties (1/3)
Práctica 4
• Valores de variables en el fichero build.properties (1/3)
Práctica 4
• Valores de variables en el fichero build.properties (1/3)
Práctica 4
• Comenzamos la construcción de nuestro proyecto.
• Será un proyecto de tipo Enterprise Application, con un módulo EJB y con un módulo de aplicación que actuarácomo cliente del Message Driven Bean.
• Posteriormente a la ejecución del cliente, chequearemos el fichero de log el Application Server, que se encuentra en el path:
C:\Sun\AppServer\domains\domain1\logs/opt/SUNWApp/domains/domain1/logs
Práctica 4
• Creamos nuestro proyecto Enterprise, llamado ejb04-mensajesimple.
• El path de ese proyecto, debería ser uno de estos:
C:\CursoEJB\proyectos\ejb04-mensajesimple
O en otro caso:
////rootrootrootroot/ejb04/ejb04/ejb04/ejb04----mensajesimplemensajesimplemensajesimplemensajesimple
Práctica 4
• Copiamos la carpeta bp-project ya preparada, y la pegamos en el directorio de nuestro proyecto.
• En el fichero build.xml de nuestro proyecto, abrimos build.xml y reemplazamos:<import file="nbproject/build-impl.xml"/>
− Por:<property name="is.ear.module" value="true"/>
<import file=“./bp-project/main.xml" />
• Lo podemos hacer desde el propio Netbeans o desde fuera.
Práctica 4
• Creamos un nuevo MDB tal como en la figura:
Práctica 4
• Elegimos estos datos en el asistente:
NOTA: en los MDB, Netbeans no añade el sufijo Bean a la clase; hay que ponerlo de forma explícita. No es obligatorio
Práctica 4• El código del MDB debe ser el siguiente:
@MessageDriven(mappedName = "jms/MensajeSimpleBean", activationConfig = {
@ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue")
})
public class MensajeSimpleBean implements MessageListener {
static final Logger logger = Logger.getLogger("SimpleMessageBean");
@Resource
private MessageDrivenContext mdc;
public MensajeSimpleBean() {
}
public void onMessage(MessagemensajeEntrante) {TextMessage msg = null;try {
if (mensajeEntrante instanceofTextMessage) {
msg = (TextMessage) mensajeEntrante;logger.info("BEAN DE MENSAJE:
Mensaje recibido: " + msg.getText());
} else {logger.warning("Mensaje de tipo
erroneo: “ + mensajeEntrante.getClass().getName());
}} catch (JMSException e) {
e.printStackTrace();mdc.setRollbackOnly();
} catch (Throwable te) {te.printStackTrace();
}} }
Práctica 4•El código del cliente, debe ser el siguiente:
public class ClienteMensajeSimple {@Resource(mappedName = "jms/ConnectionFactory")private static ConnectionFactory connectionFactory;@Resource(mappedName = "jms/MensajeSimpleBean")private static Queue queue;public static void main(String[] args) {
Connection connection = null;Session session = null;MessageProducer messageProducer = null;TextMessage message = null;final int NUM_MSGS = 3;try {
connection = connectionFactory.createConnection();session = connection.createSession(false,
Session.AUTO_ACKNOWLEDGE);messageProducer = session.createProducer(queue);message = session.createTextMessage();
for (int i = 0; i < NUM_MSGS; i++) {message.setText("Este es el mensaje numero: " +
(i + 1));System.out.println("Enviando mensaje: " +
message.getText());messageProducer.send(message);
}
System.out.println("Para ver si el bean recibio”+ +“mensajes,");System.out.println(“ mirar en el fichero: “+
“<install>/domains/domain1/logs/server.log.");} catch (JMSException e) {
System.out.println("Se elevo una excepcion: “+ e.toString());
} finally {if (connection != null) {
try {connection.close();
} catch (JMSException e) {}
} // if
System.exit(0);} // finally
} // main
public void onMessage(Message message) {}
} // class
Práctica 4
• Ahora que ya tenemos el código de nuestra aplicación, vamos a preparar el entorno antes de lanzarla.
• Este proyecto, requiere lo siguiente:− Un recurso JMS destination (la cola o ‘queue’)
• Usado en el MDB en la línea:@MessageDriven(mappedName = "jms/MensajeSimpleBean", […]
• Referenciado por el cliente en la línea:@Resource(mappedName = "jms/MensajeSimpleBean")
− Un recurso JMS Connection Factory
• Usado en el cliente, en la línea:@Resource(mappedName = "jms/ConnectionFactory")
• Para crear estos recursos, usaremos al herramienta ANT.
Práctica 4
Una vez más, editaremos nuestro fichero build.xml, para añadir lo siguiente:<target name="createcreatecreatecreate----queuequeuequeuequeue" description="create JMS queue">
<antcall target="create-jms-resource"><param name="jms.restype" value="javax.jms.Queue" /><param name="jms.resource.property" value="Name=PhysicalQueue" /><param name="jms.resource.name" value="jmsjmsjmsjms////MensajeSimpleBeanMensajeSimpleBeanMensajeSimpleBeanMensajeSimpleBean" />
</antcall></target>
<target name="createcreatecreatecreate----cfcfcfcf" description="create JMS connection factory"><antcall target="create-jms-connection-factory">
<param name="jms.restype" value="javax.jms.ConnectionFactoryjavax.jms.ConnectionFactoryjavax.jms.ConnectionFactoryjavax.jms.ConnectionFactory" /><param name="jms.resource.name" value="jms/ConnectionFactory" />
</antcall></target><target name="deletedeletedeletedelete----queuequeuequeuequeue"
description="delete JMS queue"><antcall target="delete-jms-resource">
<param name="jms.resource.name" value="jms/MensajeSimpleBean" /></antcall>
</target>
<target name="deletedeletedeletedelete----cfcfcfcf"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:
– $sudo su– #export PATH=/opt/SUNWapp/lib/ant/bin:/opt/jdk/bin:$PATH– #export JAVA_HOME=/opt/jdk– #ant create-cf– #ant create-queue
• Debemos obtener lo siguiente:
Práctica 4
• Ahora ya estamos listos para lanzar nuestro proyecto (Run):
• Buscamos en los logs, como en la figura:
Práctica 4
• Una vez finalizada la ejecución de la práctica, borramos los recursos connection factory y queue.− #ant delete-cf
− #ant delete-queue
PRÁCTICA 5: CREACIÓN DE UN BEAN DE ENTIDAD
Práctica 5
• 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
• Creamos un nuevo proyecto, de tipo Web Application, y lo llamamos ejb05-jpa
Práctica 5
• La base de datos DERBY se arranca al iniciar Sun App. Server, aunque puede iniciarse de forma independiente desde el menú Tools -> Start Java DB Server.
Práctica 5
• Creamos una nueva unidad de persistencia (I). En netbeans para windows, podríamos hacerlo así:
Práctica 5
• En la versión para linux, tendremos que hacerlo así:
Práctica 5
• Creamos una nueva unidad de persistencia (II)
Práctica 5
• Creamos ahora una nueva Entity Class:
Práctica 5
• Damos a esa esa entity class los siguientes valores:
Práctica 5
• Nos encontramos con un comportamiento por defecto de Netbeans que en este caso, no nos conviene.
Netbeans ha asumido que nuestra intención por defecto va a ser la de otorgar una clave automática y autoincremental para la persistencia de nuestro objeto, pero HEMOS ELEGIDO UN TIPO String, no un tipo numérico.
Práctica 5
• El código fuente de CredencialUsuario debe ser:@Entity
public class CredencialUsuario implements Serializable {
@Id // nombre es la PK de esta entity.
private String nombre;
private String password;
protected CredencialUsuario() {
}
public CredencialUsuario(String nombre, String password) {
if ( (nombre == null || nombre.length() == 0) ||
(password == null || password.length() == 0)) {
throw new IllegalArgumentException("El nombre o la password esta en blanco");
}
this.nombre = nombre;
this.password = password;
}
public boolean esMismaPassword(String password) {
return this.password.equals(password);
}
}
Práctica 5
• Creamos ahora el servlet login:
Práctica 5
• El servlet login debe tener este códigopublic class login extends HttpServlet {
@PersistenceUnit
private EntityManagerFactory emf;
public void service ( HttpServletRequest req , HttpServletResponse resp)
throws ServletException, IOException {
EntityManager em = emf.createEntityManager();
try {
resp.setContentType("text/html");
PrintWriter out = resp.getWriter();
out.println("<HTML> <HEAD> <TITLE> Login correcto " +
"</TITLE> </HEAD> <BODY BGCOLOR=white>");
String nombre = req.getParameter("nombre");
String password = req.getParameter("password");
CredencialUsuario credencial = em.find(CredencialUsuario.class, nombre);
// em.find devuevle null si no encuentra el usuario.
if (credencial != null && credencial.esMismaPassword(password)) {
out.println("Bienvenido " + nombre);
} else {
out.println("Nombre o password erronea.");
}
Práctica 5
out.println("</BODY> </HTML> ");
} finally {
em.close();
}
}
public void init( ServletConfig config) throws ServletException {
super.init(config);
}
}
Práctica 5
• Creamos un nuevo servlet, esta vez, registro:
Práctica 5
• El servlet registro debe tener este código:public class registro extends HttpServlet {
@PersistenceUnit
private EntityManagerFactory emf;
// Inyecta un objeto transacción de usuario.
@Resource
private UserTransaction utx;
public void service (HttpServletRequest req , HttpServletResponse resp)
throws ServletException, IOException {
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();
}
}
public void init( ServletConfig config) throws ServletException {
super.init(config);
}
}
Práctica 5
• Creamos ahora el documento HTML login.html:
Práctica 5
• Login.html debe tener este código:<html>
<head>
<title>Pagina de Login</title>
</head>
<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>
</html>
Práctica 5
• Creamos ahora el documento html registro.html:
Práctica 5
• Registro.html debe tener el siguiente código:<html>
<head>
<title>Pagina de alta de nuevo usuario</title>
</head>
<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>
</html>
Práctica 5
• Por último, sólo nos queda hacer un cambio en el archivo index.jsp que tenemos por defecto. Cambiamos el código a este:
<%String URLRedireccion = "/ejb05-jpa/login.html"; response.sendRedirect(URLRedireccion);
%>
• Por último, hacemos un Run de la aplicación:
Práctica 5
• Debemos obtener lo siguiente:
Práctica 5
• Ahora probamos que no acepta credenciales erróneas; sólo podemos entrar con usuario “paquito” y password“chocolatero”.
Práctica 5
• Probamos también que nos permite acceder con el usuario “paquito” y la password “chocolatero”.
Práctica 5
• ¿Qué esta ocurriendo aquí? Si recordamos los checksen la creación de la unidad de persitencia:
• Existe una característica en Sun Application Server y en Glassfish llamada: Java2DB− Esta característica es permite que el esquema de la base de
datos se cree automáticamente en Derby.
− El nombre de la tabla es en este caso, el mismo que el de la clase entidad, en MAYÚSCULAS: “CREDENCIALUSUARIO ”.
− El nombre de las columnas es el nombre de los atributos de la clase, en MAYÚSCULAS:
• “NOMBRE”
• “PASSWORD”
− Si recordamos el código fuente de la clase:
Práctica 5
Práctica 5
• ¿Cómo podríamos nosotros consultar esa base de datos?
• ¿Disponemos de un entorno amigable para hacerlo?
• Sí, dicha funcionalidad está INTEGRADA en Netbeans.
Práctica 5
• Abrimos el árbol hasta encontrarnos con la situación descrita en la imagen siguiente (usuario “app” password“app”):
Práctica 5
• Ahora abrimos nuevamente el árbol hasta encontrarnos en esta situación:
Práctica 5
• Hemos reutilizado una base de datos que viene incorporada en DERBY para hacer pruebas.
• Ahora vamos a crear nuestra propia base de datos para almacenar la persistencia de nuestros objetos.
• Para ello, nos movemos por los menús de netbeans como en la figura:
Práctica 5
• Proporcionamos estos datos:
NOTA: la ubicación de la BD puede cambiarse para que resida donde queramos (siempre y cuando dispongamos de permisos).
Práctica 5
• Borramos la configuración de unidad de persistencia que hemos creado anteriormente.
Práctica 5
• Creamos una nueva unidad de persistencia:
Práctica 5
• Pero esta vez, creamos además una nueva fuente de datos; la correspondiente a la nueva BD que hemos creado:
Práctica 5
• EL nuevo Data Source debe llevar estos parámetros:
Práctica 5
• AL final, la unidad de persistencia (archivo persistence.xml) debe quedar como muestra la figura:
Práctica 5
• Ejecutamos un Clean an build, seguido de un Run:Ejecutamos la aplicación, y comprobamos en la nueva base de datos si se ha generado la tabla a través de una consulta SQL (opción view data).