JavaBeans
La idea de JavaBeans surge de una vieja necesidad de la
Ingeniera del Software: contar con componentes re utilizables e
independientes de la plataforma.
El programador que hace el JB no hace nada misterioso,
simplemente define una clase, tratando de encapsular (ocultar) su
implementacin y mostrando al exterior (el programador que usa
el bean) solamente los mtodos y propiedades que son pblicos.
Slo se muestra aquello que forma parte del servicio que el bean
ofrece al exterior.
Este concepto es un elemento esencial del trabajo eficiente en
equipo, colaborar sin que cada ingeniero tenga que repetir el
trabajo que ha realizado otro, sin que tenga que enfrentarse a las
mismas dificultades que ha resuelto otro.
El programador que usa el bean slo debe preocuparse de lo QUE
hace el bean (el servicio que ofrece), no tiene que enfrentarse al
trabajo realizado por el diseador del bean, es decir, le queda
oculta la implementacin (el COMO el bean ofrece el servicio).
La idea va a a ms: donde se ha dicho "equipo" se puede entender
la comunidad global de desarrollo de software; de hecho existen
numerosas empresas que ofrecen/venden beans a otros
desarrolladores.
En el caso de los JavaBeans la idea es que estos componentes
reusables se puedan utilizar en diversos contextos:
desde JavaBeans grficos de capa cliente (controles de
interfaz)
hasta JavaBeans de capa web (normalmente
representan entidades o reglas de negocio).
Los JavaBeans
Existen diferentes tipos de JavaBean, la primera especificacin
(JavaBean grfico) haca referencia a componentes reusables para
la construccin de interfaces grficos de aplicaciones y applets.
Pero existen otros tipos de JavaBeans que representan las
entidades y reglas del negocio. No hay que verlas como un oscuro
misterio de la tecnologa J2EE, simplemente son clases Java
reutilizables que representan elementos del dominio.
JavaBeans en JSP.
Para instanciar las clases del API de Java no hay ms que utilizar
el viejo operador new. Pero las clases que representan entidades y
reglas de negocio se llaman JavaBeans y exigen unas etiquetas
especficas:
<jsp:usebean id="id_del_objeto" scope="page |
request | session | application"
class="paquete...[Link]"
beanName="nombre_del_bean"/>
El id es un nombre identificativo, seleccionado por el
programador.
Adems debemos declarar su alcance o mbito (scope).
Un alcance "request" implica que el bean es accesible
hasta otra JSP que haya sido invocada por medio de
jsp:forwar o jsp:include.
Ejemplo:
<jsp:useBean id="general" scope="page" class="docen_jsp.persona" />
De esta sencilla lnea se puede deducir que al menos debemos
definir en el JavaBean el constructor vaco, que es el que utiliza
el motor JSP en la creacin del objeto.
Existe una segunda sintaxis:
<jsp:usebean id="id_del_objeto" scope="page | request | sesin|application"
class="paquete...[Link]" beanName="nombre_del_bean">
Instrucciones
</jsp:useBean>
En este caso se ejecutan las instrucciones si el bean es
instanciado. Dichas instrucciones pueden ser cualquier contenido
JSP, aunque normalmente consiste en Scriptlets y acciones
setProperty.
JavaBean de ejemplo.
Los mtodos setXXX() y getXXX() son puramente convencionales,
podramos haberlos llamado defXXX() y obtXXX(), sin embargo es
conveniente usar los mtodos setXXX() y getXXX() para propiciar la
interoperabilidad e integracin con software de otros fabricante.
Adems esto facilita el uso de acciones setProperty y getProperty.
public class persona {
private String nombre;
private int edad;
public persona() { }
public persona( String nombre, int edad ) {
[Link] = nombre;
[Link] = edad;
}
public String getNombre() {return nombre; }
public int getEdad() {return edad; }
public void setNombre(String nombre) {[Link] = nombre;}
public void setEdad( int edad ) {[Link] = edad; }
}
La primera pgina. La pgina es sencilla, instancia la clase en la
lnea jsp:usebean y luego la utiliza
<html>
...
<jsp:useBean id="general" scope="page" class="docen_jsp.persona" />
<%
[Link]( "Jos Alberto Venegas Garca");
[Link]( 42 );
%>
<p> Hemos creado una instancia del JavaBean.
La clase se llama <%=[Link]().getName()%>.
El nombre de la instancia es <%=[Link]()%>
y la edad es <%=[Link]()%> aos.</p>
...
Uso de setProperty y getProperty.
En el ejemplo anterior se podan definir y obtener valores de
atributos. Es un primer paso, pero tiene el inconveniente de tener
que utilizar scriptlets para definir valores mediante setXXX(). A
continuacin veremos una forma ms sencilla de realizar el mismo
trabajo: jsp:setProperty se usa en conjuncin con jsp:useBean
para definir valores de propiedades. Las etiquetas jsp:setProperty
y jsp:getProperty nos evitan los scriptlets y se encargan de invocar
a los mtodos setXXX() y getXXX() del JavaBean.
<jsp:setProperty name="id_del_objeto" property="nombre_propiedad"|"*"
param="nombre_parametro_de_request" | value="valor" />
Esta accin puede aplicarse a una propiedad:
<jsp:setProperty name="general" property="nombre" value="<%=tuNombre%>" />
O a todas aquellas propiedades cuyo nombre coincide con
parmetros de la peticin (request), es decir, selecciona los
parmetros que coinciden en nombre con las propiedades y copia
los valores en sus correspondientes propiedades:
<jsp:setProperty name="general" property="*" />
Si queremos solamente extraer el valor de un parmetro (en el siguiente
ejemplo es 'identificacion') y copiarlo a un atributo ('nombre'):
<jsp:setProperty name="general" property="nombre" param="identificacion" />
Con value podemos especificar un valor para la propiedad, pero esta etiqueta
es incompatible con param.
En el siguiente ejemplo se obtiene el nombre de un formulario mediante
[Link]() y se almacena en el Bean:
<%! String tuNombre; %>
<% tuNombre = [Link]( "nombre" ); %>
<jsp:setProperty name="general" property="nombre" value="<%=tuNombre%>" />
Como ya hemos visto, esto se puede hacer de forma ms breve:
<jsp:setProperty name="general" property="nombre" param="nombre" />
Incluso se puede hacer durante la instanciacin:
<jsp:useBean id="general" scope="page" class="docen_jsp.persona">
<jsp:setProperty name="general" property="*" />
</jsp:useBean>
En ocasiones se cree que setProperty o getProperty pueden funcionar
correctamente porque existen sus correspondientes atributos de clase
bean. Esto no es cierto, funcionan porque existen sus correspondientes
mtodos getXXX() y setXXXX() en la clase bean. En el siguiente
ejemplo los mtodos getTipo() y getEsJoven() no tienen su
correspondiente atributo de clase (simplemente porque en este caso
no es necesario):
package persona_datos;
public class Personaje {
private String nombre;
private int edad;
public Personaje() { }
public Personaje( String nombre, int edad ) {
[Link] = nombre;
[Link] = edad;
}
public String getNombre() {return nombre; }
public int getEdad() {return edad; }
public void setNombre( String nombre ) {[Link] = nombre;}
public void setEdad( int edad ) {[Link] = edad; }
public String getTipo() {
if (edad < 40)
return "joven";
return "no joven";
}
public boolean getEsJoven() {
if (edad < 40)
return true;
return false;
}
}
La pgina JSP recibe el nombre y la edad del personaje por medio de
parmetros de la peticin. Utiliza las propiedades 'tipo' y 'esJoven':
<html>
<head>
<title>jsp:useBean</title>
</head>
<body>
<h1>Uso de jsp:useBean coordinado con parmetros de la peticin</h1>
<jsp:useBean id="cientifico" scope="request" class="persona_datos.Personaje">
< jsp:setProperty name="cientifico" property="*"/>
</jsp:useBean>
<p>El cientfico es <jsp:getProperty name="cientifico" property="nombre"/>.
Su edad es <jsp:getProperty name="cientifico" property="edad"/>
</p>.
<p>A continuacin usamos getProperty, sin que haya una propiedad de clase
Bean para soportar los mtodos getTipo() y getEsJoven():
</p>
<ul>
<li>Tipo: <jsp:getProperty name="cientifico" property="tipo"/></li>
<li>Joven?: <jsp:getProperty name="cientifico" property="esJoven"/></li>
</ul>
</body>
</html>