Servlets y JSP

Las JavaServer Pages (JSP) nos permiten separar la parte din�mica de nuestras p�ginas Web del HTML est�tico. Simplemente escribimos el HTML regular de la forma normal, usando cualquier herramienta de construcci�n de paginas Web que usemos normalmente. Encerramos el c�digo de las partes din�micas en unas etiquetas especiales, la mayor�a de las cuales empiezan con "<%" y terminan con "%>". Por ejemplo, aqu� tenemos una secci�n de una p�gina JSP que resulta en algo as� como "Thanks for ordering Core Web Programming" para una URL como http://host/OrderConfirmation.jsp?title=Core+Web+Programming:

Thanks for ordering 
<I><%= request.getParameter("title") %></I>

Normalmente daremos a nuestro fichero una extensi�n .jsp, y normalmente lo instalaremos en el mismo sitio que una p�gina Web normal. Aunque lo que escribamos frecuentemente se parezca a un fichero HTML normal en vez de un servelt, detr�s de la escena, la p�gina JSP se convierte en un servlet normal, donde el HTML est�tico simplemente se imprime en el stream de salida est�ndard asociado con el m�todo service del servlet. Esto normalmente s�lo se hace la primera vez que se solicita la p�gina, y los desarrolladores pueden solicitar la p�gina ellos mismos cuando la instalan si quieren estar seguros de que el primer usuario real no tenga un retardo moment�neo cuando la p�gina JSP sea traducida a un servlet y el servlet sea compilado y cargado. Observa tambi�n, que muchos servidores Web nos permiten definir alias para que una URL que parece apuntar a un fichero HTML realmente apunte a un servelt o a una p�gina JSP.

Adem�s de el HTML normal, hay tres tipos de construcciones JSP que embeberemos en una p�gina: elementos de script, directivas y acciones. Los elementos de script nos permiten especificar c�digo Java que se convertir� en parte del servlet resultante, las directivas nos permiten controlar la estructura general del servlet, y las acciones nos permiten especificar componentes que deber�an ser usuados, y de otro modo controlar el comportamiento del motor JSP. Para simplificar los elementos de script, tenemos acceso a un n�mero de variables predefinidas como request del fragmento de c�digo anterior.

Nota: este tutorial cubre la versi�n 1.0 de la especificaci�n JSP 1.0.

.�2. Sumario de S�ntaxis

Elemento JSP S�ntaxis Interpretaci�n Notas
Expresi�n JSP <%= expression %>; La Expresi�n es evaluada y situada en la salida. El equivalente XML es <jsp:expression> expression </jsp:expression>. Las variables predefinidas son request, response, out, session, application, config, y pageContext.
Scriptlet JSP <% code %>; El c�digo se inserta en el m�todo service. El equivalente XML es: <jsp:scriptlet> code </jsp:scriptlet>.
Declaraci�n JSP <%! code %> El c�digo se inserta en el cuerpo de la clase del servlet, fuera del m�todo service. El equivalente XML es: <jsp:declaration> code </jsp:declaration>.
Directiva page JSP <%@ page att="val" %> Dirige al motor servlet sobre la configuraci�n general. El equivalente XML es: <jsp:directive.page�att="val"\>. Los atributos legales son (con los valores por defecto en negrita):
  • import="package.class"
  • contentType="MIME-Type"
  • isThreadSafe="true|false"
  • session="true|false"
  • buffer="sizekb|none"
  • autoflush="true|false"
  • extends="package.class"
  • info="message"
  • errorPage="url"
  • isErrorPage="true|false"
  • language="java"
Directiva include JSP <%@ include file="url" %> Un fichero del sistema local se incluir� cuando la p�gina se traduzca a un Servlet. El equivalente XML es: <jsp:directive.include ��file="url"\>. La URL debe ser relativa. Usamos la acci�n jsp:include para incluir un fichero en el momento de la petici�n en vez del momento de la traduci�n.
Comentario JSP <%-- comment --%> Comentario ignorado cuando se traduce la p�gina JSP en un servlet. Si queremos un comentario en el HTML resultante, usamos la s�ntaxis de comentario normal del HTML <--�comment�-->.
Acci�n jsp:include <jsp:include page="relative URL" flush="true"/> Incluye un fichero en el momento en que la p�gina es solicitada. Aviso: en algunos servidores, el fichero incluido debe ser un fichero HTML o JSP, seg�n determine el servidor (normalmente basado en la extensi�n del fichero).
Acci�n jsp:useBean <jsp:useBean&nbsp;att=val*/> <jsp:useBean&nbsp;att=val*> ... </jsp:useBean> Encuentra o construye un Java Bean. Los posibles atributos son:
  • id="name"
  • scope="page|request|session|application"
  • class="package.class"
  • type="package.class"
  • beanName="package.class"
Acci�n jsp:setProperty <jsp:setProperty att=val*/> Selecciona las propiedades del bean, bien directamenteo o designando el valor que viene desde un par�metro de la petici�n. Los atributos legales son:
  • name="beanName"
  • property="propertyName|*"
  • param="parameterName"
  • value="val"
Acci�n jsp:getProperty <jsp:getProperty name="propertyName" value="val"/> Recupera y saca las propiedades del Bean.
Acci�n jsp:forward <jsp:forward page="relative URL"/> Reenv�a la petici�n a otra p�gina.
Acci�n jsp:plugin <jsp:plugin attribute="value"*> ... </jsp:plugin> Genera etiquetas OBJECT o EMBED, apropiadas al tipo de navegador, pidiendo que se ejecute un applet usando el Java Plugin.

.�3. Plantilla de Texto: HTML est�tico

En muchos casos, un gran porcentaje de nuestras p�ginas JSP consistir� en HTML est�tico, conocido como plantilla de texto. En casi todos lo aspectos, este HTML se parece al HTML normal, sigue la mismas reglas de s�ntaxis, y simplemente "pasa a trav�s" del cliente por el servlet creado para manejar la p�gina. No s�lo el aspecto del HTML es normal, puede ser creado con cualquier herramienta que usemos para generar p�ginas Web. Por ejemplo, yo he usado Homesite de Allaire, para la mayor�a de las p�ginas de este tutorial.

La �nica excepci�n a la regla de que "la plantilla de texto se pasa tal y como es" es que, si queremos tener "<%" en la salida, necesitamos poner "<\%" en la plantilla de texto.

.�4. Elementos de Script JSP

Los elementos de script nos permiten insertar c�digo Java dentro del servlet que se generar� desde la p�gina JSP actual. Hay tres formas:

  1. Expresiones de la forma <%=�expresi�n�%> que son evaluadas e insertadas en la salida.
  2. Scriptlets de la forma <%�codido�%> que se insertan dentro del m�todo service del servlet, y
  3. Declaraciones de la forma <%!�codigo�%> que se insertan en el cuerpo de la clase del servlet, fuera de cualquier m�todo existente.

.�4.1 Expresiones JSP

Una expresi�n JSP se usa para insertar valores Java directamente en la salida. Tiene la siguiente forma:

<%= expresi�n Java %>

La expresi�n Java es evaluada, convertida a un string, e insertada en la p�gina. Esta evaluaci�n se realiza durante la ejecuci�n (cuando se solicita la p�gina) y as� tiene total acceso a la informaci�n sobre la solicitud. Por ejemplo, esto muestra la fecha y hora en que se solicit� la p�gina:

Current time: <%= new java.util.Date() %>

Para simplificar estas expresiones, hay un gran n�mero de variables predefinidas que podemos usar. Estos objetos impl�citos se describen m�s adelante con m�s detalle, pero para el prop�sito de las expresiones, los m�s importantes son:

  • request, el HttpServletRequest;
  • response, el HttpServletResponse;
  • session, el HttpSession asociado con el request (si existe), y
  • out, el PrintWriter (una versi�n con buffer del tipo JspWriter) usada para env�ar la salida al cliente.

Aqu� tenemos un ejemplo:

Your hostname: <%= request.getRemoteHost() %>

Finalmente, observa que los autores de XML pueden usar una s�ntaxis alternativa para las expresiones JSP:

<jsp:expression>
Expresi�n Java
</jsp:expression>

Recuerda que los elementos XML, al contrario que los del HTML, son sensibles a las may�sculas; por eso aseg�rate de usar min�sculas.

.�4.2 Scriptlets JSP

Si queremos hacer algo m�s complejo que insertar una simple expresi�n, los scriptlets JSP nos permiten insertar c�digo arbitrario dentro del m�todo servlet que ser� construido al generar la p�gina. Los Scriptlets tienen la siguiente forma:

<% C�digo Java  %>

Los Scriptlets tienen acceso a las mismas variables predefinidas que las expresiones. Por eso, por ejemplo, si queremos que la salida aparezca en la p�gina resultante, tenemos que usar la variable out:

<% 
String queryData = request.getQueryString();
out.println("Attached GET data: " + queryData); 
%>

Observa que el c�digo dentro de un scriptlet se insertar� exactamente como est� escrito, y cualquier HTML est�tico (plantilla de texto) anterior o posterior al scriptlet se convierte en sentencias print. Esto significa que los scriptlets no necesitan completar las sentencias Java, y los bloques abiertos pueden afectar al HTML est�tico fuera de los scriplets. Por ejemplo, el siguiente fragmento JSP, contiene una mezcla de texto y scritplets:

<% if (Math.random() < 0.5) { %>
Have a <B>nice</B> day!
<% } else { %>
Have a <B>lousy</B> day!
<% } %>

que se convertir� en algo como esto:a

if (Math.random() < 0.5) { 
  out.println("Have a <B>nice</B> day!");
} else { 
  out.println("Have a <B>lousy</B> day!");
}

Si queremos usar los caracteres "%>" dentro de un scriptlet, debemos poner "%\>". Finalmente, observa que el equivalente XML de <%�C�digo�%> es

<jsp:scriptlet>
C�digo
</jsp:scriptlet>

.�4.3 Declaraciones JSP

Una declaration JSP nos permite definir m�todos o campos que ser�n insertados dentro del cuerpo principal de la clase servlet (fuera del m�todo service que procesa la petici�n). Tienen la siguiente forma:

<%! C�digo Java%>

Como las declaraciones no generan ninguna salida, normalmente se usan en conjunci�n con expresiones JSP o escriptlets. Por ejemplo, aqu� tenemos un fragmento de JSP que imprime el n�mero de veces que se ha solicitado la p�gina actual desde que el servidor se arranc� (o la clase del servelt se modific� o se recarg�):

<%! private int accessCount = 0; %>
Accesses to page since server reboot: 
<%= ++accessCount %>

Como con los scriptlet, si queremos usar los caracteres "%>", ponemos "%\>". Finalmente, observa que el equivalente XML de <%!�C�digo�%> es:

<jsp:declaration>
C�digo
</jsp:declaration>

.�5. Directivas JSP

Una directiva JSP afecta a la estructura general de la clase servlet. Normalmente tienen la siguiente forma:

<%@ directive attribute="value" %>

Sin embargo, tambi�n podemos combinar m�ltiples selecciones de atributos para una sola directiva, de esta forma:

<%@ directive attribute1="value1" 
              attribute2="value2"
              ...
              attributeN="valueN" %>

Hay dos tipos principales de directivas: page, que nos permite hacer cosas como importar clases, personalizar la superclase del servlet, etc. e include, que nos permite insertar un fichero dentro de la clase servlet en el momento que el fichero JSP es traducido a un servlet. La especificaci�n tambi�n menciona la directiva taglib, que no est� soportada en JSP 1.0, pero se pretende que permita que los autores de JSP definan sus propias etiquetas. Se espera que sea una de las principales contribuciones a JSP 1.1.

.�5.1 La directiva page

La directiva page nos permite definir uno o m�s de los siguientes atributos sensibles a las may�sculas:

  • import="package.class" o import="package.class1,...,package.classN". Esto nos permite especificar los paquetes que deber�an ser importados. Por ejemplo:

    <%@ page import="java.util.*" %> El atributo import es el �nico que puede aparecer m�ltiples veces.

  • contentType="MIME-Type" o contentType="MIME-Type; charset=Character-Set" Esto especifica el tipo MIME de la salida. El valor por defecto es text/html. Por ejemplo, la directiva: <%@ page contentType="text/plain" %> tiene el mismo valor que el scriptlet <% response.setContentType("text/plain"); %>
  • isThreadSafe="true|false". Un valor de true (por defecto) indica un procesamiento del servlet normal, donde m�ltiples peticiones pueden procesarse simult�neamente con un s�lo ejemplar del servlet, bajo la suposici�n que del autor sincroniza las variables de ejemplar. Un valor de false indica que el servlet deber�a implementar SingleThreadModel, con peticiones enviadas serialmente o con peticiones simult�neas siendo entregadas por ejemplares separados del servelt.
  • session="true|false". Un valor de true (por defecto) indica que la variable predefinida session (del tipo HttpSession) deber�a unirse a la sesi�n existente si existe una, si no existe se deber�a crear una nueva sesi�n para unirla. Un valor de false indica que no se usar�n sesiones, y los intentos de acceder a la variable session resultar�n en errores en el momento en que la p�gina JSP sea traducida a un servlet.
  • buffer="sizekb|none". Esto especifica el tama�o del buffer para el JspWriter out. El valor por defecto es espec�fico del servidor, deber�a ser de al menos 8kb.
  • autoflush="true|false". Un valor de true (por defecto) indica que el buffer deber�a desacargase cuando est� lleno. Un valor de false, raramente utilizado, indica que se debe lanzar una excepci�n cuando el buffe se sobrecargue. Un valor de false es ilegal cuando usamos buffer="none".
  • extends="package.class". Esto indica la superclase del servlet que se va a generar. Debemos usarla con extrema precauci�n, ya que el servidor podr�a utilizar una superclase personalizada.
  • info="message". Define un string que puede usarse para ser recuperado mediante el m�todo getServletInfo.
  • errorPage="url". Especifica una p�gina JSP que se deber�a procesar si se lanzar� cualquier Throwable pero no fuera capturado en la p�gina actual.
  • isErrorPage="true|false". Indica si la p�gina actual act�a o no como p�gina de error de otra p�gina JSP. El valor por defecto es false.
  • language="java". En algunos momentos, esto est� pensado para especificar el lenguaje a utilizar. Por ahora, no debemos precuparnos por �l ya que java es tanto el valor por defecto como la �nica opci�n legal.

La s�ntaxis XML para definir directivas es:

<jsp:directive.TipoDirectiva atributo=valor />

Por ejemplo, el equivalente XML de:

<%@ page import="java.util.*" %>

es:

<jsp:directive.page import="java.util.*" />

.�5.2 La directiva include JSP

Esta directiva nos permite incluir ficheros en el momento en que la p�gina JSP es traducida a un servlet. La directiva se parece a esto:

<%@ include file="url relativa" %>

La URL especificada normalmente se interpreta como relativa a la p�gina JSP a la que se refiere, pero, al igual que las URLs relativas en general, podemos decirle al sistema que interpreta la URL reltativa al directorio home del servidor Web empezando la URL con una barra invertida. Los contenidos del fichero incluido son analizados como texto normal JSP, y as� pueden incluir HTML est�tico, elementos de script, directivas y acciones.

Por ejemplo, muchas sites incluyen una peque�a barra de navegaci�n en cada p�gina. Debido a los problemas con los marcos HTML, esto normalmente se implementa mediante una peque�a tabla que cruza la parte superior de la p�gina o el lado izquierdo, con el HTML repetido para cada p�gina de la site. La directiva include es una forma natural de hacer esto, ahorrando a los desarroladores el mantenimiento engorroso de copiar realmente el HTML en cada fichero separado. Aqu� tenemos un c�digo representativo:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>Servlet Tutorial: JavaServer Pages (JSP) 1.0</TITLE>
<META NAME="author" CONTENT="[email protected]">
<META NAME="keywords" CONTENT="...">
<META NAME="description" CONTENT="...">
<LINK REL=STYLESHEET
      HREF="Site-Styles.css"
      TYPE="text/css">
</HEAD>

<BODY>
<%@ include file="/navbar.html" %>

<!-- Part specific to this page ... -->

</BODY>
</HTML>

Observa que como la directiva include inserta los ficheros en el momento en que la p�gina es traducida, si la barra de navegaci�n cambia, necesitamos re-traducir todas las p�ginas JSP que la refieren. Esto es un buen compromiso en una situaci�n como esta, ya que las barras de navegaci�n no cambian frecuentemente, y queremos que el proceso de inclusi�n sea tan eficiente como sea posible. Si, sin embargo, los ficheros incluidos cambian de forma m�s frecuente, podr�amos usar la acci�n jsp:include en su lugar. Esto incluye el fichero en el momento en que se solicita la p�gina JSP, como se describe en la secci�n 8.

.�6. Ejemplo: Usar Elementos de Script y Directivas

Aqu� tenemos un sencillo ejemplo que muestra el uso de expresiones, scriptlets, declaraciones y directivas JSP. Tambi�n puedes descargar el c�digo fuente

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>Using JavaServer Pages</TITLE>

<META NAME="author" CONTENT="Marty Hall -- [email protected]">
<META NAME="keywords"
      CONTENT="JSP,JavaServer Pages,servlets">
<META NAME="description"
      CONTENT="A quick example of the four main JSP tags.">
<LINK REL=STYLESHEET
      HREF="My-Style-Sheet.css"
      TYPE="text/css">
</HEAD>

<BODY BGCOLOR="#FDF5E6" TEXT="#000000" LINK="#0000EE"
      VLINK="#551A8B" ALINK="#FF0000">

<CENTER>
<table BORDER=5 BGCOLOR="#EF8429">
  <TR><TH CLASS="TITLE">
      Using JavaServer Pages</table>
</CENTER>
<P>

Some dynamic content created using various JSP mechanisms:
<UL>
  <LI><B>Expression.</B><BR>
      Your hostname: <%= request.getRemoteHost() %>.
  <LI><B>Scriptlet.</B><BR>
      <% out.println("Attached GET data: " +
                     request.getQueryString()); %>
  <LI><B>Declaration (plus expression).</B><BR>
      <%! private int accessCount = 0; %>
      Accesses to page since server reboot: <%= ++accessCount %>
  <LI><B>Directive (plus expression).</B><BR>
      <%@ page import = "java.util.*" %>
      Current date: <%= new Date() %>
</UL>


</BODY>
</HTML>

Aqu� tenemos un resultado t�pico:

.�7. Variables Predefinidas

Para simplififar el c�digo en expresiones y scriplets JSP, tenemos ocho variables definidas autom�ticamente, algunas veces llamadas objetos impl�citos. Las variables disponibles son: request, response, out, session, application, config, pageContext, y page.

.�7.1 request

Este es el HttpServletRequest asociado con la petici�n, y nos permite mirar los par�metros de la petici�n (mediante getParameter), el tipo de petici�n (GET, POST, HEAD, etc.), y las cabeceras HTTP entrantes (cookies, Referer, etc.). Estrictamente hablando, se permite que la petici�n sea una subclase de ServletRequest distinta de HttpServletRequest, si el protocolo de la petici�n es distinto del HTTP. Esto casi nunca se lleva a la pr�ctica.

.�7.2 response

Este es el HttpServletResponse asociado con la respuesta al cliente. Observa que, como el stream de salida (ver out m�s abajo) tiene un buffer, es legal seleccionar los c�digos de estado y cabeceras de respuesta, aunque no est� permitido en los servlets normales una vez que la salida ha sido env�ada al cliente.

.�7.3 out

Este es el PrintWriter usado para env�ar la salida al cliente. Sin embargo, para poder hacer �til el objeto response (ver la secci�n anterior), esta es una versi�n con buffer de PrintWriter llamada JspWriter. Observa que podemos ajustar el tama�o del buffer, o incluso desactivar el buffer, usando el atributo buffer de la directiva page. Esto se explic� en la Secci�n 5. Tambi�n observa que out se usa casi exclusivamente en scriptlets ya que las expresiones JSP obtienen un lugar en el stream de salida, y por eso raramente se refieren expl�citamente a out.

.�7.4 session

Este es el objeto HttpSession asociado con la petici�n. Recuerda que las sesiones se crean autom�ticamente, por esto esta variable se une incluso si no hubiera una sesi�n de referencia entrante. La �nica excepci�n es usar el atributo session de la directiva page (ver la Secci�n 5) para desactivar las sesiones, en cuyo caso los intentos de referenciar la variable session causar�n un error en el momento de traducir la p�gina JSP a un servlet.

.�7.5 application

Este es el ServletContext obtenido mediante getServletConfig().getContext().

.�7.6 config

Este es el objeto ServletConfig para esta p�gina.

.�7.7 pageContext

JSP presenta una nueva clase llamada PageContext para encapsular caracter�sticas de uso espec�ficas del servidor como JspWriters de alto rendimiento. La idea es que, si tenemos acceso a ellas a trav�s de esta clase en vez directamente, nuestro c�digo seguir� funcionando en motores servlet/JSP "normales".

.�7.8 page

Esto es s�lo un sin�nimo de this, y no es muy �til en Java. Fue creado como situaci�n para el d�a que el los lenguajes de script puedan incluir otros lenguajes distintos de Java.

.�8. Accciones

Las acciones JSP usan construcciones de s�ntaxis XML para controlar el comportamiento del motor de Servlets. Podemos insertar un fichero din�micamente, reutilizar componentes JavaBeans, reenviar al usuario a otra p�gina, o generar HTML para el plug-in Java. Las acciones disponibles incluyen:

Recuerda que, como en XML, los nombre de elementos y atributos son sensibles a las may�sculas.

.�8.1 Acci�n jsp:include

Esta acci�n nos permite insertar ficheros en una p�gina que est� siendo generada. La s�ntaxis se parece a esto:

<jsp:include page="relative URL" flush="true" />

Al contrario que la directiva include, que inserta el fichero en el momento de la conversi�n de la p�gina JSP a un Servlet, esta acci�n inserta el fichero en el momento en que la p�gina es solicitada. Esto se paga un poco en la eficiencia, e imposiblita a la p�gina incluida de contener c�digo JSP general (no puede seleccionar cabeceras HTTP, por ejemplo), pero se obtiene una significante flexibilidad. Por ejemplo, aqu� tenemos una p�gina JSP que inserta cuatro puntos diferentes dentro de una p�gina Web "What's New?". Cada vez que cambian las l�neas de cabeceras, los autores s�lo tienen que actualizar los cuatro ficheros, pero pueden dejar como estaba la p�gina JSP principal.

.�WhatsNew.jsp

Tambi�n puedes descargar el c�digo fuente.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>What's New</TITLE>
<LINK REL=STYLESHEET
      HREF="My-Style-Sheet.css"
      TYPE="text/css">
</HEAD>

<BODY BGCOLOR="#FDF5E6" TEXT="#000000" LINK="#0000EE"
      VLINK="#551A8B" ALINK="#FF0000">

<CENTER>
<table BORDER=5 BGCOLOR="#EF8429">
  <TR><TH CLASS="TITLE">
      What's New at JspNews.com</table>
</CENTER>
<P>

Here is a summary of our four most recent news stories:
<OL>
  <LI><jsp:include page="news/Item1.html" flush="true"/>
  <LI><jsp:include page="news/Item2.html" flush="true"/>
  <LI><jsp:include page="news/Item3.html" flush="true"/>
  <LI><jsp:include page="news/Item4.html" flush="true"/>
</OL>
</BODY>
</HTML>

Aqu� tenemos un resultado t�pico:

.�8.2 Acci�n jsp:useBean

Esta acci�n nos permite cargar y utilizar un JavaBean en la p�gina JSP. Esta es una capacidad muy �til porque nos permite utilizar la reusabilidad de las clases Java sin sacrificar la conveniencia de a�adir JSP sobre servlets solitarios. El s�ntaxis m�s simple para especificar que se deber�a usar un Bean es:

<jsp:useBean id="name" class="package.class" />

Esto normalmente significa "ejemplariza un objeto de la clase especificada por class, y unelo a una variable con el nombre especificado por id". Sin embargo, tambi�n podemos especifar un atributo scope que hace que ese Bean se asocie con m�s de una s�la p�gina. En este caso, es �til obtener referencias a los beans existentes, y la acci�n jsp:useBean especifica que se ejemplarizar� un nuevo objeto si no existe uno con el el mismo nombre y �mbito.

Ahora, una vez que tenemos un bean, podemos modificar sus propiedades mediante jsp:setProperty, o usando un scriptlet y llamando a un m�todo expl�citamente sobre el objeto con el nombre de la variable especificada anteriormente mediante el atributo id. Recuerda que con los beans, cuando decimos "este bean tiene una propiedad del tipo X llamada foo", realmente queremos decir "Esta clase tiene un m�todo getFoo que devuelve algo del tipo X, y otro m�todo llamado setFoo que toma un X como un argumento". La acci�n jsp:setProperty se describe con m�s detalle en la siguiente secci�n, pero ahora observemos que podemos suministrar un valor expl�cito, dando un atributo param para decir que el valor est� derivado del par�metro de la petici�n nombrado, o s�lo lista las propiedades para indicar que el valor deber�a derivarse de los par�metros de la petici�n con el mismo nombre que la propiedad. Leemos las propiedades existentes en una expresi�n o scriptlet JSP llamando al m�todo getXxx, o m�s comunmente, usando la acci�n jsp:getProperty.

Observa que la clase especificada por el bean debe estar en el path normal del servidor, no en la parte reservada que obtiene la recarga autom�tica cuando se modifican. Por ejemplo, en el Java Web Server, �l y todas las clases que usa deben ir en el directorio classes o estar en un fichero JAR en el directorio lib, no en el directorio servlets.

Aqu� tenemos un ejemplo muy sencillo que carga un bean y selecciona y obtiene un sencillo par�metro String.

.�BeanTest.jsp

Tambi�n puedes descargar el c�digo fuente.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>Reusing JavaBeans in JSP</TITLE>
<LINK REL=STYLESHEET
      HREF="My-Style-Sheet.css"
      TYPE="text/css">
</HEAD>

<BODY>

<CENTER>
<table BORDER=5>
  <TR><TH CLASS="TITLE">
      Reusing JavaBeans in JSP</table>
</CENTER>
<P>

<jsp:useBean id="test" class="hall.SimpleBean" />
<jsp:setProperty name="test" 
                 property="message" 
                 value="Hello WWW" />
             
<H1>Message: <I>
<jsp:getProperty name="test" property="message" />
</I></H1>
             
</BODY>
</HTML>

.�SimpleBean.java

Aqu� est� el c�digo fuente usado para el Bean usado en la p�gina BeanTest. Tambi�n puedes descargar el c�digo fuente.

package hall;

public class SimpleBean {
  private String message = "No message specified";

  public String getMessage() {
    return(message);
  }

  public void setMessage(String message) {
    this.message = message;
  }
}

Aqu� tenemos un resultado t�pico:

.�8.3 M�s detalles de jsp:useBean

La forma m�s sencilla de usar un Bean es usar:

<jsp:useBean�id="name"�class="package.class"�/>

para cargar el Bean, luego usar jsp:setProperty y jsp:getProperty para modificar y recuperar propiedades del bean. Sin embargo, tenemos dos opciones. Primero, podemos usar un formato de contenedor, llamado:

<jsp:useBean ...> 
Body 
</jsp:useBean>

Para indicar que la porci�n Body s�lo se deber�a ejecutar cuando el bean es ejemplarizado por primera vez, no cuando un bean existente se encuentre y se utilice. Como se explica abajo, los bean pueden ser compartidos, por eso no todas las sentencias jsp:useBean resultan en la ejemplarizaci�n de un Bean. Segundo, adem�s de id y class, hay otros tres atributos que podemos usar: scope, type, y beanName.

Atributo Uso
id Da un nombre a la variable que referenciar� el bean. Se usar� un objeto bean anterior en lugar de ejemplarizar uno nuevo si se puede encontrar uno con el mismo id y scope.
class Designa el nombre completo del paquete del bean.
scope Indica el contexto en el que el bean deber�a estar disponible. Hay cuatro posibles valores: page, request, session, y application. El valor por defecto, page, indica que el bean estar� s�lo disponible para la p�gina actual (almacenado en el PageContext de la p�gina actual). Un valor de request indica que el bean s�lo est� disponible para la petici�n actual del cliente (almacenado en el objeto ServletRequest). Un valor de session indica que el objeto est� disponible para todas las p�ginas durante el tiempo de vida de la HttpSession actual. Finalmente, un valor de application indica que est� disponible para todas las p�ginas que compartan el mismo ServletContext. La raz�n de la importancia del �mbito es que una entrada jsp:useBean s�lo resultar� en la ejemplarizaci�n de un nuevo objeto si no hab�a objetos anteriores con el mismo id y scope. De otra forma, se usar�n los objetos existentes, y cualquier elemento jsp:setParameter u otras entradas entre las etiquetas de inicio jsp:useBean y la etiqueta de final, ser�n ignoradas.
type Especifica el tipo de la variable a la que se referir� el objeto. Este debe corresponder con el nombre de la clase o ser una superclase o un interface que implemente la clase. Recuerda que el nombre de la variable se designa mediante el atributo id.
beanName Da el nombre del bean, como lo suministrar�amos en el m�todo instantiate de Beans. Esta permitido suministrar un type y un beanName, y omitir el atributo class.

.�8.4 Acci�n jsp:setProperty

Usamos jsp:setProperty para obtener valores de propiedades de los beans que se han referenciado anteriormente. Podemos hacer esto en dos contextos. Primero, podemos usar antes jsp:setProperty, pero fuera de un elemento jsp:useBean, de esta forma:

<jsp:useBean id="myName" ... />
...
<jsp:setProperty name="myName" 
                 property="someProperty" ... />

En este caso, el jsp:setProperty se ejecuta sin importar si se ha ejemplarizado un nuevo bean o se ha encontrado uno ya existente. Un segundo contexto en el que jsp:setProperty puede aparecer dentro del cuerpo de un elemento jsp:useBean, de esta forma:

<jsp:useBean id="myName" ... >
��...
��<jsp:setProperty name="myName" 
                   property="someProperty" ... />
</jsp:useBean>

Aqu�, el jsp:setProperty s�lo se ejecuta si se ha ejemplarizado un nuevo objeto, no si se encontr� uno ya existente.

Aqu� tenemos los cuatro atributos posibles de jsp:setProperty:

Atributo Uso
name Este atibuto requerido designa el bean cuya propiedad va a ser seleccionada. El elemento jsp:useBean debe aparecer antes del elemento jsp:setProperty.
property Este atributo requerido indica la propiedad que queremos seleccionar. Sin embargo, hay un caso especial: un valor de "*" significa que todos los par�metros de la petici�n cuyos nombres correspondan con nombres de propiedades del Bean ser�n pasados a los m�todos de selecci�n apropiados.
value Este atributo opcional especifica el valor para la propiedad. Los valores string son convertidos autom�ticamente a n�meros, boolean, Boolean, byte, Byte, char, y Character mediante el m�todo est�ndard valueOf en la fuente o la clase envolvente. Por ejemplo, un valor de "true" para una propiedad boolean o Boolean ser� convertido mediante Boolean.valueOf, y un valor de "42" para una propiedad int o Integer ser� convertido con Integer.valueOf. No podemos usar value y param juntos, pero si est� permitido no usar ninguna.
param Este par�metro opcional designa el par�metro de la petici�n del que se deber�a derivar la propiedad. Si la petici�n actual no tiene dicho par�metro, no se hace nada: el sistema no pasa null al m�todo seleccionador de la propiedad. As�, podemos dejar que el bean suministre los valores por defecto, sobreescribiendolos s�lo cuando el par�metro dice que lo haga. Por ejemplo, el siguiente c�digo dice "selecciona el valor de la propiedad numberOfItems a cualquier valor que tenga el per�metro numItems de la petici�n, si existe dicho par�metro, si no existe no se hace nada"
<jsp:setProperty name="orderBean"
                 property="numberOfItems"
                 param="numItems" />

Si omitimos tanto value como param, es lo mismo que si suministramos un nombre de par�metro que corresponde con el nombre de una propiedad. Podremos tomar esta idea de automaticidad usando el par�metro de la petici�n cuyo nombre corresponde con la propiedad suministrada un nombre de propiedad de "*" y omitir tanto value como param. En este caso, el servidor itera sobre las propiedades disponibles y los par�metros de la petici�n, correspondiendo aquellas con nombres id�nticos.

Aqu� tenemos un ejemplo que usa un bean para crear una tabla de n�meros primos. Si hay un par�metro llamado numDigits en los datos de la petici�n, se pasa dentro del bean a la propiedad numDigits. Al igual que en numPrimes.

.�JspPrimes.jsp

Para descargar el c�digo JSP, pulsa con el bot�n derecho sobre el enlace.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>Reusing JavaBeans in JSP</TITLE>
<LINK REL=STYLESHEET
      HREF="My-Style-Sheet.css"
      TYPE="text/css">
</HEAD>

<BODY>

<CENTER>
<table BORDER=5>
  <TR><TH CLASS="TITLE">
      Reusing JavaBeans in JSP</table>
</CENTER>
<P>

<jsp:useBean id="primetable" class="hall.NumberedPrimes" />
<jsp:setProperty name="primetable" property="numDigits" />
<jsp:setProperty name="primetable" property="numPrimes" />

Some <jsp:getProperty name="primetable" property="numDigits" /> 
digit primes: 
<jsp:getProperty name="primetable" property="numberedList" />

</BODY>
</HTML>

Aqu� tenemos un resultado t�pico:

.�8.5 Acci�n jsp:getProperty

Este elemento recupera el valor de una propiedad del bean, lo convierte a un string, e inserta el valor en la salida. Los dos atributos requeridos son name, el nombre de un bean referenciado anteriormente mediante jsp:useBean, y property, la propiedad cuyo valor deber�a ser insertado. Aqu� tenemos un ejemplo:

<jsp:useBean id="itemBean" ... />
...
<UL>
  <LI>Number of items: 
      <jsp:getProperty name="itemBean" property="numItems" />
  <LI>Cost of each:
      <jsp:getProperty name="itemBean" property="unitCost" />
</UL>

.�8.6 Acci�n jsp:forward

Esta acci�n nos permite reenviar la petici�n a otra p�gina. Tiene un s�lo atributo, page, que deber�a consistir en una URL relativa. Este podr�a ser un valor est�tico, o podr�a ser calculado en el momento de la petici�n, como en estos dos ejemplo:

<jsp:forward page="/utils/errorReporter.jsp" />
<jsp:forward page="<%= someJavaExpression %>" />

.�8.7 Acci�n jsp:plugin

Esta acci�n nos permite insertar un elemento OBJECT o EMBED espec�fico del navegador para especificar que el navegador deber�a ejecutar un applet usando el Plug-in Java.

.�9. Convenciones de Comentarios y Caracteres de Escape

Hay un peque�o n�mero de construcciones especiales que podemos usar en varios casos para insertar comentarios o caracteres que de otra forma ser�an tratados especialmente:

S�ntaxis Prop�sito
<%-- comment --%>
Un comentario JSP. Ignorado por el traductor JSP-a-scriptlet. Cualquier elemento de script, directivas o acciones embebidas son ignorados.
<!-- comment -->
Un comentario HTML. Se pasa al HTML resultante. Cualquier elemento de script, directivas o acciones embebidas se ejecutan normalmente.
<\%
Usado en plantillas de texto (HTML est�tico) donde realmente queremos "<%".
>
%\>
Usado en elementos de script donde realmente queremos "%>".
\'
Una sola comilla en un atributo que usa comillas simples. Sin embargo, recuerda que podemos usar comillas dobles o simples, y que otros tipos de comillas ser�n caracteres regulares.
\"
Una doble comilla un un atributo que usa comillas dobles. Sin embargo, recuerda que podemos usar comillas dobles o simples, y que otros tipos de comillas ser�n caracteres regulares.
%\>
%> en un atributo.
<\%
<% en un atributo.

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP
ARTÍCULO ANTERIOR