You are on page 1of 109

COMPONENTES: PRCTICAS

Enterprise Java Beans (II): Entorno:


Netbeans
Sun Application Server
Web Services.

Prctica 1

Prctica nmero 1:
Descripcin: Creacin 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 caractersticas principales de un JavaBean, para entender

a diferenciar los casos en los que es conveniente usar JavaBeans, y


cundo usar EJBs.

Prctica 1

Arrancamos Netbeans.
Creamos un nuevo proyecto: ejb01-javabean:

Prctica 1

En el asistente, elegimos una aplicacin Web:

Prctica 1

Elegimos el nombre ejb01-javabean

Luego NEXT y FINISH

Prctica 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>

Prctica 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) {
}
}

Prctica 1

Su ahora ejecutamos la opcin Run, en un entorno


UNIX, obtendremos esto:

Podemos corregirlo aqu:


Tools
Options

Advanced Menu
Eliminamos Mozilla y firefox, y nos quedamos slo con el browser de
swing.

Prctica 1

En esta versin 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 configuracin de navegador para
konqueror, tal como se muestra en la figura siguiente, y
la ponemos en primer lugar, indicando que se use esa
configuracin de forma preferente.

Prctica 1

Configuracin de konqueror:

Prctica 1

Y en la opcin de configuracin bsica (pinchamos en


basic options), debemos tener el selector de navegador
a konqueror:

Prctica 1

Resultados esperados tras un deploy + Run:

PRCTICA 2: CREACIN DE UN STATELESS EJB

Prctica 2

Prctica nmero 2:
Descripcin: Creacin de un Stateless EJB

Primera toma de contacto con los EJBs dentro del entorno Netbeans
Primera toma de contacto con las anotaciones, y cmo pueden facilitarnos la
vida.
Construccin de un EJB simple, que realice las funciones de una calculadora.
Ser una aplicacin que tenga un Servlet que haga la llamada al EJB

REIVINDIQUEMOS LO SIMPLE:

No hay Xdoclet.
El packaging es automtico.
No hay que crear descriptores (el entorno o el contenedor -segn el caso- lo hacen
de manera automtica)
No hay que crear interfaces HOME como hacamos en eclipse a travs de la
herramienta Xdoclet y la opcin PackageSubstitution cuando creamos EJBs.
Crear EJB con anotaciones es fcil y rpido.
No tenemos la obligacin 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 mtodos ejbActivate y ejbPassivate; el contenedor realiza el
trabajo sucio.

Prctica 2

Primero: Creamos un proyecto de tipo Enterprise:

Prctica 2

Le pedimos al asistente que cree el mdulo WAR y el


EJB:

Prctica 2

Ahora, en el cuadro de proyectos, pulsamos click derecho sobre


ejb02-calculadora-ejb, y elegimos New=>Session Bean

Prctica 2

El asistente debe haber El EJB propiamente dicho, es


dejado lo siguiente:
la clase CalculadoraBean
CalculadoraRemote, es un
interfaz, ya que los clientes
nunca se comunican
directamente contra el Bean
La comunicacin directa slo
la tiene el Contenedor, para
controlar el Passivate y el
Activate.

Prctica 2

Una vez hecho esto, nos Con esa etiqueta, el


contenedor se encargar
fijamos en la annotation
de crear un EJB sin
que tenemos justo en la
estado.
cabecera de la clase:
No tenemos tampoco
que crear el archivo
ejb-jar.xml
No necesitamos el
interfaz home.
No hay Xdoclets
Fcil!

Prctica 2

Empezamos a codificar los mtodos de la calculadora, y


observamos que Netbeans ya nos empieza a mostrar
un asistente de ayuda que solicita incorporar esos
mtodos al interfaz:

(Prestar atencin al icono de la bombilla)

Prctica 2

El resultado final de CalculadoraBean debe ser el que


sigue:
package ejb02;

import javax.ejb.Stateless;

@Stateless
public class CalculadoraBean implements ejb02.CalculadoraRemote {
/** Creates a new instance of CalculadoraBean */
public CalculadoraBean() {
}
public int suma(int
a, int b) {
suma
return a+b;
}
public int resta(int
a, int b) {
resta
return a-b;
}
public int divide(int
a, int b) {
divide
if (b == 0) {
throw new IllegalArgumentException("No puedo dividir por 0");
}
return a / b;
}
public int multiplica(int
a, int b) {
multiplica
return a*b;
}
}

Prctica 2

El resultado final de CalculadoraRemote debe ser el


que sigue:
package ejb02;
import javax.ejb.Remote;
@Remote
public interface 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);
}

Prctica 2

Ahora vamos a crear un servlet. Ms 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:

Prctica 2

Seguimos el asistente, tecleando lo siguiente:

Prctica 2

El cdigo del servlet donde hay cambios es:


@EJB
private 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(arg0
calcu.suma(arg0,arg1)
calcu.suma(arg0,arg1));
,arg1)
out.println("</html>");
out.close();
}

Y adems hay que aadir dos imports.

Prctica 2

Ahora retocamos el index.jsp que ha creado netbeans en la


carpeta ejb02-calculadora-war/Web Pages para que incluya
un formulario que enve dos argumentos numricos al servlet,
que a su vez usa al EJB para los clculos:
<!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>Prctica 2</title>
</head>
<body>
<h1>Practica 2 - Curso EJB</h1>
<form name="formulario" action="Resultados
Resultados"
Resultados 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>

Prctica 2

Para acabar, slo nos queda testearlo. Para ello, le decimos a


Netbeans que ejecute un Run, que es lo mismo que
build+deploy+Run.

Prctica 2

Una vez visto los resultados, cambiar el cdigo


necesario para que el proyecto reste y multiplique.
Objetivo: repetir conceptos y fijar el conocimiento del
entorno Netbeans para la generacin de proyectos
Enterprise Edition.

PRCTICA 3: CREACIN DE UN STATEFUL EJB

Prctica 3

Prctica nmero 3:
Descripcin: Creacin de un Stateful EJB
Primera toma de contacto con los EJBs de tipo statefull

Los stateful beans, adems de tener mtodos de negocio, tienen variables


de estado (variables que tomar valor al instanciar un objeto y usarlo, y que
representan un determinado estado del objeto).

Construccin de un EJB simple, que realice las funciones de una mini-

carrito de la compra (en este caso, de libros).


Ser una aplicacin que tenga una aplicacin de consola que haga la

llamada al EJB

Prctica 3

Primero: creamos una aplicacin de tipo Enterprise:

Prctica 3

En el asistente, comprobamos que los parmetros


queden EXACTAMENTE como en la figura:

Prctica 3

Una vez de
pulsemos Finish,
desplegamos el
rbol de proyectos y
pulsamos click
derecho sobre
ejb03-carro-ejb tal
como en la figura:

Prctica 3

Continuamos con el asistente, con estos parmetros:

Prctica 3

Una vez finalizado, navegamos por el rbol de directorios.


Netbeans nos ha creado automticamente la plantilla del Bean y
el Interfaz. La renombraremos y ejecutaremos un Refactoring:
<= Teniendo esta seleccin activa,
pulsamos F2, o bien botn
derecho, men, y rename.

Prctica 3

Ahora observamos que Netbeans nos muestra una nueva


subventana, en la que espera confirmacin para ejecutar el proceso
de refactoring:

Prctica 3

Cremos ahora una nueva clase tal como en la figura:

Prctica 3

En el asistente,
proporcionamos estos
datos:

Y este cdigo:
package util;

public class LibroException


extends Exception {
public LibroException() {
}
public LibroException(String
msg) {
super(msg);
}
}

Prctica 3

Volvemos a crear una


nueva clase, esta vez
con estos datos:

Y este cdigo:

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;
}
}

Prctica 3

El cdigo del
Bean es el
siguiente
(1/2):

@Stateful
public class CarroBean implements ejb03.Carro {
/** Creates a new instance of CarroBean */
List<String> contenidos;
String IdCliente;
String nombreCliente;
public CarroBean()
{
CarroBean
}
persona) throws LibroException {
public void inicializar(String
inicializar
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

Prctica 3

Cdigo del bean (2/3)


public void inicializar(String
persona,String id) throws LibroException {
inicializar
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

Prctica 3

Cdigo del bean (3/3)


public void anadirLibro(String
titulo) {
anadirLibro
contenidos.add(titulo);
}
public void borrarLibro(String
titulo) throws LibroException {
borrarLibro
boolean result = contenidos.remove(titulo);
if (result == false) {
throw new LibroException("\"" + titulo + "\" no esta en el carro.");
}
}
public List<String> getcontenidos()
{
getcontenidos
return contenidos;
}
@Remove()
@Remove()
public void borrado()
{
borrado
contenidos = null;
}
}

Prctica 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 mtodos en el


interfaz del Bean de forma automtica.

Prctica 3

Nos movemos por el men de proyectos hasta el cliente


del EJB que hemos creado (1/2):
public class ClienteCarro {
@EJB
private static Carro carro;
public ClienteCarro(String[]
args) {
ClienteCarro
}
/**
* @param args the command line arguments
*/
public static void main(String[]
args) {
main
ClienteCarro client = new ClienteCarro(args);
client.doTest();
}
public void doTest()
{
doTest
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

Prctica 3

El cdigo contina 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);
}
}
}

Prctica 3

Se pide, en este caso:


Resolver las referencias no satisfechas, usando el asistente
de Netbeans, y comprobar que no existe ningn aviso de
error en el cdigo y ejecutar la aplicacin:
Hemos provocado una excepcin de manera
intencional al borrar un libro inexistente en el
carro.

PRCTICA 4: CREACIN DE UN MESSAGE DRIVEN BEAN

Prctica 4

Prctica nmero 4:
Descripcin: Creacin 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 caractersticas principales de un MDB, para entender

cundo puede compensarnos el usarlo.

Prctica 4

Los proyectos que usan el sistema Java Blue Prints


Project (bp-project) tienen las siguientes ventajas:
Pueden crear proyectos Java basados en la herramienta ANT
Pueden cargarse y usarse como proyectos nativos en IDEs
como Netbeans
Pueden ser ejecutados (y desplegados) desde la lnea de
comandos
Permiten que un conjunto de proyectos compartan una misma
configuracin.

Prctica 4

Instrucciones de uso de bp-project de un proyecto con cdigo


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 an no est creado.
Abrimos el fichero build.xml generado por NetBeans y reemplazamos la lnea:
<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 copindolo a un lugar comn, y ajustando la lnea de


import a la carpeta o ubicacin que corresponda.
Tambin 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
aadir la siguiente lnea a build.xml:
Justo antes del import de ${bp-project.home}/main.xml Ponemos:
<property name="is.war.module" value="true"/>

Prctica 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 modo


que esas tres lneas quedarn en dos:

<property name="is.war.module" value="true"/>


./bp
bpproject.home/main.xml" />
<import file="./
./
bp
-project.home

En el directorio <bp-project.home> copiamos el fichero


build.properties.sample a build.properties y corregimos los valores de
las propiedades javaee.home, y javaee.server.passwordfile.

Prctica 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.

Prctica 4

Proyecto EAR (enterprise archive)


<?xml version="1.0"?>
<project name="bp-web-project" default="default" basedir=".">
<property name="is.ear.module
is.ear.module"
is.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.module
is.war.module"
is.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">
is.ejb<property name="is.ejb
is.ejb-jar.module"
jar.module value="true"/>
<import file="bp-project/main.xml"/>
</project>

Prctica 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.module
is.jar.module"
is.jar.module value="true"/>
<property name="is.persistence
is.persistenceis.persistence-unit.module"
unit.module value="true"/>
<import file="bp-project/main.xml"/>
</project>

Proyecto Web que depende la la JPU declarada encima de estas lneas


<?xml version="1.0" encoding="UTF-8"?>
<project name="hello-servlet" default="default" basedir=".">
is.war.module"
<property name="is.war.module
is.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.classpath
extra.classpath"
extra.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>

Prctica 4

Proyecto Web que depende de una librera de


componentes JSF
<?xml version="1.0"?>
<project name="bp-slider-navigator" default="default" basedir=".">
<property name="is.war.module
is.war.module"
is.war.module value="true"/>
<import file="bp-project/main.xml"/>
<property name="project.ui
project.ui"
project.ui value="../../../components/ui"/>
<property name="reference.ui.jar
reference.ui.jar"
ui.jar"/>
reference.ui.jar value="${project.ui}/dist/ui.jar
ui.jar
<target name="-pre-compile" depends="init">
<copy file="${reference.ui.jar
reference.ui.jar}"
todir="${build.web.dir}/WEB-INF/lib"/>
reference.ui.jar
</target>
</project>

Prctica 4

TARGETs tpicos de compilacin: Estos son algunos


targets tpicos de compilacin (build) que est
disponibles automticamente cuando usamos
bp-project:
all: Compila, empaqueta el archive, despliega la aplicacin y
ejecuta.
compile: Compila a aplicacin.
package-module: Empaqueta el archivo.
default: Compila y empaqueta el archivo.
run: Ejecuta la aplicacin
undeploy: repliega la aplicacin.
clean: Borra los directories generados, como build y dist

Prctica 4

Valores de variables en el fichero build.properties (1/3)

Prctica 4

Valores de variables en el fichero build.properties (1/3)

Prctica 4

Valores de variables en el fichero build.properties (1/3)

Prctica 4

Comenzamos la construccin de nuestro proyecto.


Ser un proyecto de tipo Enterprise Application, con un
mdulo EJB y con un mdulo de aplicacin que actuar
como cliente del Message Driven Bean.
Posteriormente a la ejecucin 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

Prctica 4

Creamos nuestro proyecto


Enterprise, llamado
ejb04-mensajesimple.
El path de ese proyecto,
debera ser uno de estos:

C:\CursoEJB\proyectos\ejb04-mensajesimple
O en otro caso:
/root/ejb04
root/ejb04/ejb04-mensajesimple

Prctica 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.

Prctica 4

Creamos un nuevo MDB tal como en la figura:

Prctica 4

Elegimos estos datos en el asistente:

NOTA: en los MDB, Netbeans no aade el sufijo Bean a


la clase; hay que ponerlo de forma explcita. No es
obligatorio

El cdigo del MDB debe ser el siguiente:

Prctica 4

@MessageDriven(mappedName = "jms/MensajeSimpleBean", activationConfig = {


@ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Autoacknowledge"),
@ActivationConfigProperty(propertyName = "destinationType", propertyValue =
"javax.jms.Queue")
public void onMessage(Message
})
mensajeEntrante) {
public class MensajeSimpleBean implements MessageListener {
TextMessage msg = null;
static final Logger logger =
try {
Logger.getLogger("SimpleMessageBean");
if (mensajeEntrante instanceof
@Resource
TextMessage) {
private MessageDrivenContext mdc;
msg = (TextMessage) mensajeEntrante;
public MensajeSimpleBean() {
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();
}

}
}

Prctica 4
El cdigo del cliente, debe ser el siguiente:
public class ClienteMensajeSimple {
System.out.println("Para ver si el bean recibio+
+mensajes,");
@Resource(mappedName = "jms/ConnectionFactory")
System.out.println( mirar en el fichero: +
private static ConnectionFactory connectionFactory;
@Resource(mappedName = "jms/MensajeSimpleBean")
<install>/domains/domain1/logs/server.log.");
private static Queue queue;
} catch (JMSException e) {
public static void main(String[] args) {
System.out.println("Se elevo una excepcion: +
Connection connection = null;
e.toString());
Session session = null;
} finally {
MessageProducer messageProducer = null;
if (connection != null) {
TextMessage message = null;
try {
final int NUM_MSGS = 3;
connection.close();
try {
} catch (JMSException e) {
connection = connectionFactory.createConnection();
}
session = connection.createSession(false,
} // if
Session.AUTO_ACKNOWLEDGE);
messageProducer = session.createProducer(queue);
System.exit(0);
message = session.createTextMessage();
} // finally
} // main
for (int i = 0; i < NUM_MSGS; i++) {
message.setText("Este es el mensaje numero: " +public void onMessage(Message message) {
(i + 1));
}
System.out.println("Enviando mensaje: " +
}
// class
message.getText());
messageProducer.send(message);
}

Prctica 4

Ahora que ya tenemos el cdigo de nuestra aplicacin, 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 lnea:


@MessageDriven(mappedName = "jms/MensajeSimpleBean", []

Referenciado por el cliente en la lnea:


@Resource(mappedName = "jms/MensajeSimpleBean")

Un recurso JMS Connection Factory

Usado en el cliente, en la lnea:


@Resource(mappedName = "jms/ConnectionFactory")

Para crear estos recursos, usaremos al herramienta ANT.

Prctica 4
Una vez ms, editaremos nuestro fichero build.xml, para aadir lo siguiente:

<target name="create
createcreate-queue"
queue 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="jms
jms/
jms/MensajeSimpleBean"
MensajeSimpleBean />
</antcall>
</target>

<target name="create
createcreate-cf"
cf description="create JMS connection factory">
<antcall target="create-jms-connection-factory">
<param name="jms.restype" value="javax.jms.ConnectionFactory
javax.jms.ConnectionFactory"
javax.jms.ConnectionFactory />
<param name="jms.resource.name" value="jms/ConnectionFactory" />
</antcall>
</target>
<target name="delete
deletedelete-queue"
queue
description="delete JMS queue">
<antcall target="delete-jms-resource">
<param name="jms.resource.name" value="jms/MensajeSimpleBean" />
</antcall>
</target>
deletecf"
<target name="delete
delete
-cf
description="delete JMS connection factory">
<antcall target="delete-jms-resource">
<param name="jms.resource.name" value="jms/ConnectionFactory" />
</antcall>
</target>

Prctica 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:

Prctica 4

Ahora ya estamos listos para lanzar nuestro proyecto


(Run):

Buscamos en los logs, como en la figura:

Prctica 4

Una vez finalizada la ejecucin de la prctica, borramos


los recursos connection factory y queue.
#ant delete-cf
#ant delete-queue

PRCTICA 5: CREACIN DE UN BEAN DE ENTIDAD

Prctica 5

Prctica nmero 5:
Descripcin: Creacin de un bean de entidad, y primer
acercamiento a la base de datos derby para la funcin de
almacn de datos.
Objetivos:
Primera toma de contacto con los entity beans.
Primera toma de contacto con derby
Conocer las caractersticas principales de un entity bean.

Prctica 5

Creamos un nuevo proyecto, de tipo Web Application, y


lo llamamos ejb05-jpa

Prctica 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.

Prctica 5

Creamos una nueva unidad de persistencia (I). En


netbeans para windows, podramos hacerlo as:

Prctica 5

En la versin para linux, tendremos que hacerlo as:

Prctica 5

Creamos una nueva unidad de persistencia (II)

Prctica 5

Creamos ahora una nueva Entity Class:

Prctica 5

Damos a esa esa entity class los siguientes valores:

Prctica 5

Nos encontramos con un comportamiento por defecto


de Netbeans que en este caso, no nos conviene.
Netbeans ha asumido
que nuestra intencin
por defecto va a ser la
de otorgar una clave
automtica y
autoincremental para la
persistencia de nuestro
objeto, pero HEMOS
ELEGIDO UN TIPO
String, no un tipo
numrico.

Prctica 5

El cdigo 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);
}
}

Prctica 5

Creamos ahora el servlet login:

Prctica 5

El servlet login debe tener este cdigo


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

Prctica 5

out.println("</BODY> </HTML> ");


} finally {
em.close();
}
}
public void

init( ServletConfig config) throws ServletException {

super.init(config);
}
}

Prctica 5

Creamos un nuevo servlet, esta vez, registro:

Prctica 5

El servlet registro debe tener este cdigo:


public class registro extends HttpServlet {
@PersistenceUnit
private EntityManagerFactory emf;

// Inyecta un objeto transaccin 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>");

Prctica 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);
}
}

Prctica 5

Creamos ahora el documento HTML login.html:

Prctica 5

Login.html debe tener este cdigo:


<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>

Prctica 5

Creamos ahora el documento html registro.html:

Prctica 5

Registro.html debe tener el siguiente cdigo:


<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>

Prctica 5

Por ltimo, slo nos queda hacer un cambio en el


archivo index.jsp que tenemos por defecto. Cambiamos
el cdigo a este:
<%
String URLRedireccion = "/ejb05-jpa/login.html";
response.sendRedirect(URLRedireccion);
%>
Por ltimo, hacemos un Run de la aplicacin:

Prctica 5

Debemos obtener lo siguiente:

Prctica 5

Ahora probamos que no acepta credenciales errneas;


slo podemos entrar con usuario paquito y password
chocolatero.

Prctica 5

Probamos tambin que nos permite acceder con el


usuario paquito y la password chocolatero.

Prctica 5

Qu esta ocurriendo aqu? Si recordamos los checks


en la creacin de la unidad de persitencia:

Prctica 5

Existe una caracterstica en Sun Application Server y en


Glassfish llamada: Java2DB
Esta caracterstica es permite que el esquema de la base de
datos se cree automticamente en Derby.
El nombre de la tabla es en este caso, el mismo que el de la
clase entidad, en MAYSCULAS: CREDENCIALUSUARIO.
El nombre de las columnas es el nombre de los atributos de la
clase, en MAYSCULAS:
NOMBRE
PASSWORD

Si recordamos el
cdigo fuente de
la clase:

Prctica 5

Cmo podramos nosotros consultar esa base de datos?


Disponemos de un entorno amigable para hacerlo?
S, dicha funcionalidad est INTEGRADA en Netbeans.

Prctica 5

Abrimos el rbol hasta encontrarnos con la situacin


descrita en la imagen siguiente (usuario app password
app):

Prctica 5

Ahora abrimos nuevamente el rbol hasta encontrarnos


en esta situacin:

Prctica 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 mens de
netbeans como en
la figura:

Prctica 5

Proporcionamos estos datos:


NOTA: la ubicacin de la BD
puede cambiarse para que
resida donde queramos
(siempre y cuando
dispongamos de permisos).

Prctica 5

Borramos la configuracin de unidad de persistencia


que hemos creado anteriormente.

Prctica 5

Creamos una nueva unidad de persistencia:

Prctica 5

Pero esta vez, creamos adems una nueva fuente de


datos; la correspondiente a la nueva BD que hemos
creado:

Prctica 5

EL nuevo Data Source debe llevar estos parmetros:

Prctica 5

AL final, la unidad de persistencia (archivo


persistence.xml) debe quedar como muestra la figura:

Prctica 5

Ejecutamos un Clean an build, seguido de un Run:


Ejecutamos la aplicacin, y comprobamos
en la nueva base de datos si se ha
generado la tabla a travs de una
consulta SQL (opcin view data).

You might also like