Podemos usar la tecnolog�a JavaBeans� para poner un JavaBean entre una p�gina JSP y el bean de sesi�n CalcBean para obtener una mejor separaci�n "Model, View, Controller (MVC)". MVC es un patr�n de dise�o que consiste en tres tipos de objetos. El Modelo proporciona la l�gica de negocio de la aplicac�n, la Vista es la presentaci�n en pantalla, y el Controlador es un objeto que maneja lo que sucede cuando el usuario interact�a con la Vista. Un patr�n de dise�o describe un problema recurrente y sus soluciones cuando la soluci�n no es siempre exactamente la misma para cada recurrencia.
La lecci�n sobre Tecnolog�a JSP se configur� para que las p�ginas HTML y JSP proporcionaran la presentaci�n en pantalla (Vista) y manejar lo que sucedia cuando el usuario interact�a con los datos (Controlador). Los beans de entidad y de sesi�n ( BonusBean y CalcBean) son los objetos de la aplicaci�n o Modelo.
Esta lecci�n usa una p�gina JSP para la presentaci�n en pantalla (View), un JavaBean para manejar lo que sucede cuando el usuario interact�a con la vista (Controlador), y los beans de entidad y de sesi�n para los objetos de aplicaci�n (Modelo). Separando el Controlador de la Vista permite al JavaBean servir como una envoltura para el bean de sesi�n y ofrece un ejemplo mucho m�s claro de la separaci�n MVC. Una aplicaci�n que usa patrones de dise�o es mucho m�s sencilla de actualizar, mantener y manejar.
�Sobre el Ejemplo
En la Lecci�n anterior, el interface de usuario de la aplicaci�n consiste en una p�gina HTML con un formulario HTML. El formulario llama a la p�gina JSP cuando el usuario pulsa el bot�n Submit de la p�gina HTML.
Otra forma de crear el interface de usuario es con una p�gina JSP que incluya el formulario HTML, scriptlets JSP, y etiquetas espec�ficas JSP para interact�ar con el JavaBean. Cuando se carga la p�gina JSP, se muestra el formulario HTML y se ejecutan los escriptlets y las etiquetas especificas JSP para interactuar con el JavaBean. Como todav�a no se han suministrado datos, la pantalla se parecer� a la de la siguiente figura:

Cuando el usuario introduce alg�n dato y pulsa el bot�n Submit, se vuelve a mostrar el formulario HTML, y se ejecutan de nuevo los scriptlets y las etiquetas especificas JSP con los datos suministrados. La pantalla se parecer�a algo a la de la siguiente figura. Esto es porque el par�metro ACTION del formulario HTML de bonus.jsp se llama a s� mismo de forma recursiva.

Si el usuario introduce el mismo n�mero de la seguridad social, se devuelve un error de clave duplicada y se muestra sobre la p�gina JSP como se muestra en la siguiente figura:

�Crear bonus.jsp
El c�digo de bonus.jsp es bastante sencillo poque el c�digo que busca el bean de sesi�n y calcula el bono est� ahora en el JavaBean. La primera parte del fichero contiene el c�digo HTML para crear el formulario. El c�digo para pasar los datos del formulario HTML al JavaBean est� en la segunda parte del fichero. Abajo podemos ver el fichero bonus.jsp completo:
<HTML>
<BODY BGCOLOR = "WHITE">
<HEAD>
<TITLE>Bonus Calculation</TITLE>
</HEAD>
<BLOCKQUOTE>
<H3>Bonus Calculation</H3>
<!--ACTION parameter calls this page-->
<FORM METHOD="GET" ACTION="bonus.jsp">
<P>
Enter social security Number:
<P>
<INPUT TYPE="TEXT" NAME="SOCSEC"></INPUT>
<P>
Enter Multiplier:
<P>
<INPUT TYPE="TEXT" NAME="MULTIPLIER"></INPUT>
<P>
<INPUT TYPE="SUBMIT" VALUE="Submit">
<INPUT TYPE="RESET">
</FORM>
<!--Scriptlet and JavaBeans Tags start here -->
<jsp:useBean id = "jbonus" class = "JBonusBean"/>
<%! String sMult, ssec; %>
<%
sMult = request.getParameter("MULTIPLIER");
ssec = request.getParameter("SOCSEC");
%>
<jsp:setProperty name = "jbonus" property="strMult"
value="<%=sMult%>"/>
<jsp:setProperty name = "jbonus" property="socsec"
value="<%=ssec%>"/>
Social security number retrieved:
<jsp:getProperty name="jbonus" property="socsec"/>
<P>
Bonus Amount retrieved:
<jsp:getProperty name="jbonus" property="bonusAmt"/>
<P>
Error messages:
<jsp:getProperty name = "jbonus" property="message"/>
</BLOCKQUOTE>
</BODY>
</HTML>
�Especificar el JavaBean
La siguiente etiqueta HTML especifica el JavaBean que se esta utilizando en este ejemplo. El par�metro id define un alias para usarlo como referencia al JavaBean, y el par�metro class especifica la clase JavaBean. En este ejemplo el id es jbonus y el class es JBonusBean.
<jsp:useBean id = "jbonus" class = "JBonusBean"/>
�Obtener los Datos
Los siguientes scriptlets JSP recuperan los datos suministrados por el usuario desde los campos del formulario HTML. El multiplicador se almacena en la variable sMult String, y el n�mero de la seguridad social en la variable ssec String.
<%! String sMult, ssec; %>
<%
sMult = request.getParameter("MULTIPLIER");
ssec = request.getParameter("SOCSEC");
%>
�Pasar los Datos al JavaBean
Las siguientes etiquetas HTML configuran dos propiedades del JavaBean. Una propiedad es un campo privado de la clase JavaBean. La primera l�nea usa la etiqueta jsp:setProperty para configurar el campo strMult en la clase JBonusBean (con el alias jbonus id) al valor almacenado en la variable sMult. La segunda l�nea realiza una operaci�n similar para el campo socsec de la clase JBonusBean.
<jsp:setProperty name = "jbonus" property="strMult" value="<%=sMult%>"/> <jsp:setProperty name = "jbonus" property="socsec" value="<%=ssec%>"/>
La expresi�n value="<%=ssec%>" env�a el dato contenido en la variable ssec al campo socsec del JavaBean.
�Recuperar los Datos desde el JavaBean
Recuperar los datos desde el JavaBean es similar a envi�rselos. Usamos la etiqueta jsp:getProperty e indicamos la propiedad (campo privado) cuyo dato queremos obtener. La siguiente etiqueta getProperty obtiene el dato almacenado en el campo privado socsec de la clase JBonusBean (con el alias jbonus id ).
Social security number retrieved: <jsp:getProperty name="jbonus" property="socsec"/>
Las siguientes etiquetas realizan operaciones similares para los campos bonusAmt y message de la clase JBonusBean.
<P> Bonus Amount retrieved: <jsp:getProperty name="jbonus" property="bonusAmt"/> <P> Error messages: <jsp:getProperty name = "jbonus" property="message"/>
�Crear la Clase JavaBean
Una clase JavaBeans� (o bean para acortar) se parece a cualquier clase normal del lenguaje Java�. Pero para ser un bean, una clase JavaBean debe seguir un conjunto de sencillas convenciones de nombres y dise�o explicados en la especificaci�n JavaBeans. Como los Beans cumplen la especifiaci�n JavaBean, pueden ser accedidos y manejados por otros programas y herramientas que cumplan las mismas convenciones.
En la secci�n Crear bonus.jsp, se utilizar�n etiquetas HTML y scriptlets JSP para obtener y seleccionar los datos privados de la clase JBonusBean. Esto es posible porque la clase JBonusBean sigue las convenciones de nombrado y dise�o de JavaBeans.
Esta secci�n describe el c�digo de JBonusBean y nos ofrece una sencilla presentaci�n de la tecnolog�a JavaBeans cuando se usa con p�ginas JSP.
Aqu� tenemos la clase JBonusBean completa.
import javax.naming.*;
import javax.rmi.PortableRemoteObject;
import Beans.*;
public class JBonusBean {
private String strMult, socsec, message;
private double bonusAmt;
CalcHome homecalc;
public JBonusBean() {
try{
InitialContext ctx = new InitialContext();
Object objref = ctx.lookup("calcs");
homecalc = (CalcHome)
PortableRemoteObject.narrow(
objref, CalcHome.class);
} catch (javax.naming.NamingException e) {
e.printStackTrace();
}
}
public double getBonusAmt() {
if(strMult != null){
Integer integerMult = new Integer(strMult);
int multiplier = integerMult.intValue();
try {
double bonus = 100.00;
Calc theCalculation = homecalc.create();
Bonus theBonus = theCalculation.calcBonus(
multiplier, bonus, socsec);
Bonus record = theCalculation.getRecord(
socsec);
bonusAmt = record.getBonus();
socsec = record.getSocSec();
} catch (javax.ejb.DuplicateKeyException e) {
message = e.getMessage();
} catch (javax.ejb.CreateException e) {
e.printStackTrace();
} catch (java.rmi.RemoteException e) {
e.printStackTrace();
}
return this.bonusAmt;
} else {
this.bonusAmt = 0;
this.message = "None.";
return this.bonusAmt;
}
}
public String getMessage(){
return this.message;
}
public String getSocsec(){
return this.socsec;
}
public String getStrMult(){
return this.strMult;
}
public void setSocsec(String socsec) {
this.socsec = socsec;
}
public void setStrMult(String strMult) {
this.strMult = strMult;
}
}
�Propiedades del Bean
Las propiedades definen los datos que un JavaBean pone a disposici�n de otros programas o herramientas a trav�s de m�todos get o set. Los datos podr�an hacer cosas como definir la apariencia o el comportamiento del JavaBean, o utilizarse para alg�n c�lculo, etc. Las propiedades realmente son campos privados de la clase que siempre deber�an ser privados y s�lo accesibles a trav�s de m�todos set y get.
El siguiente segmento de c�digo muestra las propiedades privadas de la clase JBonusBean. Esta clase tiene un correspondiente m�todo get<property> para cada campo y sus correspondientes m�todos set<property> para los campos strMult y socsec.
public class JBonusBean {
private String strMult, socsec, message;
private double bonusAmt;
�Constructor
El constructor JBonusBean busca el bean de sesi�n.
public JBonusBean() {
try{
InitialContext ctx = new InitialContext();
Object objref = ctx.lookup("calcs");
homecalc = (CalcHome)
PortableRemoteObject.narrow(
objref, CalcHome.class);
} catch (javax.naming.NamingException e) {
e.printStackTrace();
}
}
�M�todos Set
JBonusBean tiene dos m�todos set (m�todos precedidos por la palabra set). Estos m�todos seleccionan propiedades (campos privados) con valores especificados. Los dos m�todos set son setSocsec y setStrMult para seleccionar los campos privados socsec y strMult (propiedades JavaBean) .
En este ejemplo, los valores usados para las propiedades socsec y strMult vienen de las etiquetas setProperty name de la p�gina JSP. El servidor J2EE usa la informaci�n suministrada en la siguiente etiqueta setProperty name para localizar el correspondiente m�todo set en JBonusBean (con el alias jbonus id ):
<jsp:setProperty name = "jbonus" property="strMult" value="<%=sMult%>"/> <jsp:setProperty name = "jbonus" property="socsec" value="<%=ssec%>"/>
En la clase JBonusBean, los m�todos set<property> siguen las convenciones de nombrado para que el servidor J2EE pueda mapear las etiquetas setProperty name del fichero JSP a los m�todos set<property> correctos para pasar los datos desde la p�gina JSP al JavaBean.
Con los m�todos set, el nombre de m�todo consiste en la palabra set y el nombre de la propiedad. El nombre de la propiedad es el nombre de uno de los campos privados de JBonusBean. Mientras que los nombres de campos por convenci�n empiezan siempre con una letra min�scula, la segunda palabra de un nombre de m�todo siempre empieza con una m�yuscula. Por eso, para seleccionar el campo privado socsec, el nombre del m�todo es setSocsec. El servidor J2EE mapea la may�scula de Socsec en el nombre del m�todo a la min�scula socsec del campo. Los m�todos set no tienen valor de retorno y tienen un argumento del tipo apropiado.
public void setSocsec(String socsec) {
this.socsec = socsec;
}
public void setStrMult(String strMult) {
this.strMult = strMult;
}
�M�todos Get
JBonusBean tiene cuatro m�todos get (m�todos precedidos por la palabra get ). Los m�todos Get obtienen y devuelven un valor de propiedad (valores de campos privados). Los cuatro m�todos get son getBonusAmt, getMessage, getSocsec, y getStrMult para devolver datos desde los campos privados bonusAmt, message , socsec , y strMult (propiedades JavaBean).
En este ejemplo, los valores usados para seleccionar los campos bonusAmt y message vienen desde el m�todo getBonusAmt. La p�gina JSP recupera los datos de las propiedades de JBonusBean usando las siguientes etiquetas getProperty name. La p�gina JSP s�lo recupera los valores que le interesan, por eso podr�amos observar que aunque hay una propiedad en JBonusBean para el multiplicador (el campo strMult), este valor no es recuperado por la p�gina JSP.
Social security number retrieved: <jsp:getProperty name="jbonus" property="socsec"/> <P> Bonus Amount retrieved: <jsp:getProperty name="jbonus" property="bonusAmt"/> <P> Error messages: <jsp:getProperty name = "jbonus" property="message"/>
Los m�todos Get siguen las mismas convenciones de nombres que los m�todos Set por eso la p�gina JSP puede recuperar los datos del JBonusBean. Los m�todos Get siempre tienen un valor de retorno y no tienen argumentos. Podr�amos observar que aunque el m�todo getBonusAmt seleccciona valores de propiedades, realmente no necesita devolver ning�n valor en este ejemplo, devuelve this.bonusAmt para evitar un error en tiempo de ejecuci�n del servidor J2EE.
El m�todo getBonusAmt usa una sentencia if-else para manejar el caso cuando no se suministra ning�n valor strMult. Cuando la p�gina JSP se carga por primera vez, el usuario final no ha suministrado ning�n dato, pero todas las etiquetas y scriptlets de la p�gina son ejecutados de cualquier forma. En este caso, el valor de la propiedad strMult pasada a JBonusBean es null, lo que resulta en un multiplicador nulo y un valor nulo de bonusAmt. Ocurre un error de servidor cuando la p�gina JSP obtiene e intenta mostrar el valor null de bonusAmt. Para evitar este error, bonusAmt se selecciona a cero en el caso de que se reciba un valor null desde la p�gina JSP.
public double getBonusAmt() {
if(strMult != null){
Integer integerMult = new Integer(strMult);
int multiplier = integerMult.intValue();
try {
double bonus = 100.00;
Calc theCalculation = homecalc.create();
Bonus theBonus = theCalculation.calcBonus(
multiplier, bonus, socsec);
Bonus record = theCalculation.getRecord(
socsec);
bonusAmt = record.getBonus();
socsec = record.getSocSec();
} catch (javax.ejb.DuplicateKeyException e) {
message = e.getMessage();
} catch (javax.ejb.CreateException e) {
e.printStackTrace();
} catch (java.rmi.RemoteException e) {
e.printStackTrace();
}
return this.bonusAmt;
} else {
this.bonusAmt = 0;
this.message = "None.";
return this.bonusAmt;
}
}
public String getMessage(){
return this.message;
}
public String getSocsec(){
return this.socsec;
}
public String getStrMult(){
return this.strMult;
}
public void setSocsec(String socsec) {
this.socsec = socsec;
}
public void setStrMult(String strMult) {
this.strMult = strMult;
}
�Arrancar la Plataforma y las Herramientas
Para ejecutar este ejemplo, necesitamos arrancar el servidor J2EE, la herramienta Deploy, y la base de datos Cloudscape. En diferentes ventanas, tecleamos los siguientes comandos:
j2ee -verbose deploytool cloudscape -start
Si esto no funciona, tecleamos esto desde el directorio J2EE:
Unix
j2sdkee1.2.1/bin/j2ee -verbose j2sdkee1.2.1/bin/deploytool j2sdkee1.2.1/bin/cloudscape -start
Windows
j2sdkee1.2.1\bin\j2ee -verbose j2sdkee1.2.1\bin\deploytool j2sdkee1.2.1\bin\cloudscape -start
�Eliminar el Fichero WAR
Como se ha a�adido una p�gina JSP al componente Web, tenemos que borrar el fichero WAR de las lecciones anteriores y crear uno nuevo con la p�gina JSP.
Local Applications:
- Pulsar el icono 2BeansApp para poder ver los componentes de nuestra aplicaci�n.
- Seleccionamos BonusWar para que se ilumine.
- Seleccionamos Delete desde el men� Edit.
�Crear el Nuevo Fichero WAR
Men� File:
- Seleccionamos New Web Component
Introduction:
- Leemos y pulsamos Next .
War File General Properties :
- Especificamos BonusWar para el nombre de display.
- Pulsamos Add
- Vamos al directorio ClientCode y a�adimos Bonus.jsp,
- Pulsamos Next
- Vamos al directorio ClientCode y a�adimos JBonusBean.class
- Pulsamos Finish .
Propiedades Generales del Fichero War:
- Pulsamos Next.
Elegir el tipo de Componente: .
- Seleccionamos Describe a JSP.
- Pulsamos Next.
Propiedades generales del Componente:
- Ponemos Bonus.jsp como nombre de fichero JSP.
- Ponemos BonusJSP como nombre de display.
- Pulsamos Finish .
Ventana Inspecting:
- Seleccionamos Web Context
- Especificamos JSPRoot.
�Verificar y Desplegar la Aplicaci�n J2EE
Antes de desplegar la aplicaci�n, es una buena idea ejecutar el verificador. El verificador mostrar� los errores en los componentes de la aplicaci�n como m�todos inexistentes que el compilador no captura.
Verificar:
- Con 2BeansApp seleccionado, elegimos Verifier desde el men� Tools.
- En el di�logo que aparece, pulsamos OK. La ventana deber�a decir que no hay ning�n fallo.
- Cerramos la ventana del verificador porque ahora estamos listos para desplegar la aplicaci�n.
| Nota: En la versi�n 1.2.1 del software podr�amos obtener un error tests app.WebURI. Esto significa que la herramienta DeployTool no puso la extensi�n .war al fichero WAR durante su creacci�n. Es un error menor y la aplicaci�n J2EE se despliega sin problemas. |
Desplegar:
- Desde el men� Tools, elegimos Deploy Application. Se mostrar� una caja de di�logo Deploy BonusApp.
- Verificar que la selecci�n de Target Server es un host local o el nombre de un host donde se est� ejecutando el servidor J2EE.
| Nota: No marcamos la caja "Return Client Jar". El �nico momento en que debemos chequear esta caja es cuando usamos persistencia controlada por el bean o desplegamos una aplicaci�n solitaria para el programa cliente. Este ejemplo usa un servlet y una p�gina HTML por lo que no debe est�r marcada. Esta caja crea un fichero JAR con toda la informaci�n de despliegue necesaria para una aplicaci�n solitaria. |
- Pulsamos Next .
- Nos aseguramos de que los nombres JNDI muestran calcs para CalcBean y bonus para BonusBean. Si no es as�, tecleamos los nombres JNDI nosotros mismos, y pulsamos la tecla Return.
- Pulsamos Next. Nos aseguramos de que el nombre Context Root muestra JSPRoot. Si no es as�, lo tecleamos nosotros mismos y pulsamos la tecla Return.
- Pulsamos Next .
- Pulsamos Finish para empezar el despliegue. Se mostrar� una caja de di�logo que mostrar� el estado de la operaci�n de despliegue.
- Cuando se haya completado, las tres barras de la izquierda se habr�n sombreado completamente, como se ve en la siguiente figura. Cuando esto suceda pulsamos OK.

�Ejecutar la Aplicaci�n J2EE
El servidor web se ejecuta por defecto en el puerto 8000. Para abrir la p�gina bonus.html apuntamos nuestro navegador a http://localhost:8000/JSPRoot/bonus.html, que es d�nde la herramienta de despliegue puso el fichero HTML.
- Rellenamos un n�mero de la seguridad social y un multiplicador.
- Pulsamos el bot�n Submit. Bonus.jsp procesa nuestros datos y devuelve una p�gina HTML con el bono calculado.
Bonus Calculation Social Security number retrieved: 777777777 Bonus Amount Retrieved: 200.0
Si hemos suministrado dos veces el mismo n�mero de la seguridad social, veremos algo similar a esto:
Bonus Calculation Soc Sec passed in: 777777777 Multiplier passed in: 2 Error: Duplicate primary key
�C�digo Fuente de los Ejemplos
Aqu� tienes un fichero Zip con los ficheros fuente de los ejemplos de esta p�gina:
fuentes_L5.zip