Servlets y JSP

Una de las partes m�s comunes de una aplicaci�n de comercio electr�nico es un formulario HTML en el que un usuario introduce alguna informaci�n. La informaci�n podr�a ser un nombre de cliente y su direcci�n, una palabra o frase introducida para un motor de b�squeda, o un conjunto de preferencias lanzadas como datos del mercado.

.��Qu� le sucede a los datos del Formulario?

La informaci�n que el usuario introduce en el formulario se almacena en el objeto request, que se env�a desde el cliente al motor JSP. �Qu� sucede luego?

La siguiente figura representa como fluyen los datos entre el cliente y el servidor (al menos cuando usamos la implementaci�n JSP de Sun, otros motores JSP podr�an trabajar de forma diferente.

.��C�mo se pasan los datos entre el cliente y el servidor?

El motor JSP env�a el objeto solicitado a cualquier componente del lado del servidor (JavaBeansTM , servlet, o bean enterprise) que especifica el JSP. El componente maneja la solicitud, posiblemente recuperando datos desde una base de datos u otros datos almacenados, y pasa un objeto respuesta de vuelta la motor JSP, donde los datos se formatean de acuerdo al dise�o de la p�gina HTML. El motor JSP y el servidor Web entonces env�an la p�gina JSP revisada de vuelta al cliente, donde el usuario puede ver el resultado, en el navegador Web. Los protocolos de comunicaci�n usados entre el cliente y el servidor pueden ser HTTP, o cualquier otro protocolo.

Los objetos request y response est�n siempre impl�citamente disponibles para nosotros como autores de ficheros fuentes JSP. El objeto request se explica con m�s detalle m�s adelante en este tutorial.

.��C�mo Crear un Formulario?

Normalmente se define un formulario HTML en un fichero fuente JSP, usando etiquetas JSP para pasar los datos entre el formulario y algun tipo de objeto del lado del servidor (usualmente un Bean). En general, haremos las siguientes cosas en nuestra aplicaci�n JSP:

  1. Empezaremos a escribir un fichero fuente JSP, creando un formulario HTML y d�ndole un nombre a cada elemento.
  2. Escribimos el Bean en un fichero .java, definiendo las propiedades, los m�todos get y set para los nombres de los elementos del formulario (a menos que querramos seleccionar expl�citametne un valor propiedad).
  3. Devolvemos el fichero fuente JSP. A�adimos una etiqueta <jsp:useBean> para crear y asignar un ejemplar del Bean.
  4. A�adimos una etiqueta <jsp:setProperty> para seleccionar propiedades del Bean desde el formulario HTML (el Bean necesita un m�todo set correspondiente).
  5. A�adimos una etiqueta <jsp:getProperty> para recuperar los datos desde el Bean (el Bean necesita un m�todo get correspondiente).
  6. Si necesitamos realizar m�s procesos sobre los datos del usuario, usamos el objeto request desde dentro de un scriptlet.

El ejemplo Hello, User har� estos pasos m�s claros.

.�Una sencilla aplicaci�n "Hello"

El usuario introduce un nombre, y Duke dice Hello!

.�C�digo de Ejemplo

El Banner Duke (dukebanner.html)

<table border="0" width="400" cellspacing="0" 
              cellpadding="0">
<tr>
<td height="150" width="150"> &nbsp; </td>
<td width="250"> &nbsp; </td>
</tr>
<tr>
<td width="150"> &nbsp; </td>
<td align="right" width="250"> 
          <img src="duke.waving.gif"> </td>
</tr>
</table>
<br>

El fichero principal JSP (hellouser.jsp)

<%@ page import="hello.NameHandler" %>

<jsp:useBean id="mybean" scope="page"
          class="hello.NameHandler" />
<jsp:setProperty name="mybean" property="*" />

<html>
<head><title>Hello, User</title></head>
<body bgcolor="#ffffff" background="background.gif">

<%@ include file="dukebanner.html" %>

<table border="0" width="700">
<tr>
<td width="150"> &nbsp; </td>
<td width="550"> 
<h1>My name is Duke. What's yours?</h1>
</td>
</tr>
<tr>
<td width="150" &nbsp; </td>
<td width="550">
<form method="get">
<input type="text" name="username" size="25">
<br>
<input type="submit" value="Submit">
<input type="reset" value="Reset">
</td>
</tr>
</form>
</table>

<%
    if ( request.getParameter("username") != null ) {
%>

<%@ include file="response.jsp" %>

<%
    }
%>

</body>
</html>

El fichero de Respuesta (response.jsp)

<table border="0" width="700">
<tr>
<td width="150"> &nbsp; </td>

<td width="550">

<h1>Hello, <jsp:getProperty name="mybean" 
        property="username" />!
</h1>

</td>
</tr>
</table>

El Bean que Maneja los Datos del Formulario (namehandler.java)

package hello;

public class NameHandler {

    private String username;

    public NameHandler() { 
        username = null;
    }

    public void setUsername( String name ) {
        username = name;
    }

          public String getUsername() { 
        return username;
    }
}

.�Construir el Formulario HTML

Un formulario HTML tiene tres partes principales: las etiquetas de apertura y cierre <form>, los elementos de entrada, y el bot�n Submit que env�a los datos al servidor. En una p�gina normal HTML, la etiqueta de apertura <form> normalmente se parecer� a algo como esto:

<form method=get action=someURL>

En otras aplicaciones web, el atributo action especifica un script CGI u otro programa que procese los datos del usuario. En un fichero JSP, podemos omitir el atributo action si queremos que los datos se env�en al Bean especificado en la etiqueta <jsp:useBean> o especificar otro fichero JSP.

El resto del formulario se construye igual que un formulario est�ndard HTML, con elementos de entrada, un bot�n Submit, y quiz�s un bot�n Reset. Debemos asegurarnos de dar a cada elemento un nombre, como este:

<input type="text" name="username">

.�Usar los M�todos GET y POST

Los m�todos HTTP GET y POST env�an datos al servidor. En una Aplicaci�n JSP, GET y POST env�an los datos a un Bean, servlet, u otro componente del lado del servidor que est� manejando los datos del formulario.

En teor�a, GET es para obtener datos desde el servidor y POST es para env�ar datos. Sin embargo, GET a�ade los datos del formulario (llamada una query string (string de solicitud)) a una URL, en la forma de parejas clave/valor desde el formulario HTML, por ejemplo, name=john. En el String de solicitud las parejas de clave/valor se separ�n por caracterres &, los espacios se convierten en caracteres +, y los caracteres especiales se convierten a sus correspondientes hexadecimales. Como el String de solicitud est� en la URL,la p�gina puede ser a�adida a los bookmarks o env�ada por e-mail con el string de solicitud. Este string normalmente est� limitado a un n�mero relativamente peque�o de caracteres.

Sin embargo, el m�todo POST, pasa los datos de una longitud ilimitada como un cuerpo de solicitud de cabecera HTTP hacia el servidor. El usuario que trabaja en el navegador cliente no puede ver los datos que est�n siendo enviados, por eso la solicitud POST es ideal para enviar datos confidenciales (como el n�mero de una tarjeta de cr�dito) o grandes cantidades de datos al servidor.

.�Escribir el Bean

Si nuestra aplicaci�n usa un Bean, podemos escribir el Bean de acuerdo a los patrones de dise�o explicados en la Especificaci�n del API de JavaBeans, recordamos estos puntos generales:

  • Si usamos una etiqueta <jsp:getProperty> en nuestro fichero fuente JSP, necesitamos el correspondiente m�todo get en el Bean.
  • Si usamos una etiqueta <jsp:setProperty> en nuestro fichero fuente JSP, necesitamos uno o m�s metodos set correspondientes.

Seleccionar las propiedades en unas propiedades obtenidas desde un Bean se explica un poco m�s en la siguiente secci�n:

.�Obtener los Datos desde el Fomulario hacia el Bean

Seleccionar las propiedades en un Bean desde un formulario HTML es una tarea en dos partes:

  • Crear o localizar el ejemplar del Bean con lt;jsp:useBean>
  • Seleccionar los valores de la propiedad en el Bean con <jsp:setProperty>

El primer paso es ejemplarizar o localizar un Bean con una etiqueta <jsp:useBean> antes de seleccionar los valores de las propiedades en el bean. En un fichero fuente JSP, la etiqueta <jsp:useBean> debe aparecer sobre la etiqueta <jsp:setProperty>. La etiqueta <jsp:useBean> primero busca un ejemplar de Bean con unnombre que especifiquemos, pero si no encuentra el Bean, lo ejemplariza. Esto nos permite crear el Bean en un fichero JSP y usarlo en otro, siempre que el Bean tenga un �mbito suficientemente grande.

El segundo paso es seleccionar el valor de la propiedad en el Bean con una etiqueta <jsp:setProperty>. La forma m�s f�cil de usar <jsp:setProperty> es definir propiedades en el Bean que correspondan con los nombres de los elementos del formulario. Tambi�n deber�amos definir los correspondientes m�todos set para cada propiedad. Por ejemplo, si el elemento del formulario se llama username, deber�amos definir una propiedad username u los m�todos getUsername y setUsername en el Bean.

Si usamos nombres diferentes para el elemento del formulario y la propiedad del Bean, todav�a podr�amos seleccioanr el valor de la propiedad con <jsp:setProperty>, pero s�lo podemos seleccionar una valor a la vez.

.�Chequear el Objeto Request

Los datos que el usuario introduce se almacenan en un objeto request, que usualmente implementa javax.servlet.HttpServletRequest (o si nuestra implementaci�n usa un protocolo diferente, otro interface que sea una subclase de javax.servlet.ServletRequest).

Podemos acceder al objeto request directamente desde dentro de un scriptlet. Los scriptlet son fragmentos de c�digo escritos en un lenguaje de scripts y situado dentro de los caracteres <% y %>. En JSP 1.0, debemos usar el lenguaje de programaci�n Java como lenguaje de Script.

Podr�amos encontrar �tiles algunos de estos m�todos para trabajar con objetos request:

M�todo Definido en Trabajo Realizado
getRequest javax.servlet.jsp.PageContext Devuelve el Objeto request actual
getParameterNames javax.servlet.ServletRequest Devuelve los nombres de los par�metros contenidos actualmente en request
getParameterValues javax.servlet.ServletRequest Devuelve los valores de los par�metros contenidos actualmente en request
getParameter javax.servlet.ServletRequest Devuelve el valor de un par�metro su proporcionamos el nombre

Tambi�n podemos encontrar otros m�todos definidos en ServletRequest, HttpServletRequest, o cualquier otra sobclase de ServletRequest que implemente nustra aplicaci�n

El motor JSP siempre usa el objeto request detr�s de la escena, incluso si no la llamamos expl�citamente desde el fichero JSP.

.�Obtener Datos desde el Bean a la P�gina JSP

Una vez que los datos del usuario han siso enviados al Bean, podriamos querer recuperar los datos y mostrarlos en la p�gina JSP. Para hacer esto, usamos la etiqueta <jsp:getProperty>, d�ndole el nombre del Bean y el nombre de la propiedad:

<h1>Hello, <jsp:getProperty name="mybean" 
	property="username"/>!

Los nombres de Beans que usemos en las etiquetas <jsp:useBean>, <jsp:setProperty>, y <jsp:getProperty> deben ser iguales, por ejemplo:

hellouser.jsp:
<jsp:useBean id="mybean" scope="session" 
	class="hello.NameHandler" />
<jsp:setProperty name="mybean" property="*" />


response.jsp:
<h1>Hello, <jsp:getProperty name="mybean" 
	property="username"/>!

En este ejemplo, las etiquetas est�n en dos ficheros, pero los nombres de los Bean son iguales. Si no fuera as�, la implementaci�n de referencia del JSP lanzar� un error.

Las respuesta que el motor JSP devuelve al cliente est� encapsulada en el objeto response impl�cito, que crea el motor JSP.

.��C�mo Ejecutar el Ejemplo

Las instrucciones dadas unsan un path al estilo de Unix, si trabajamos vbajo Windows, usaremos el mismo path pero con el separador apropiado:

  1. Creamos el directorio (o carpeta) ../jswdk-1.0/examples/jsp/tutorial/hellouser.
  2. Situamos los siguientes ficheros en el directorio (o carpeta)../tutorial/hellouser: background.gif, duke.waving.gif, dukebanner.html, hellouser.jsp, y response.jsp.
  3. Creamos el directorio (o carpeta) ../jswdk-1.0/examples/WEB-INF/jsp/beans/hello. Observa que el directorio se lla hello y no hellouser.
  4. Situamos los ficheros NameHandler.java y NameHandler.class en el directorio ../beans/hello.
  5. Arrancamos la implementaci�n de referencia de JSP: cd ../jswdk-1.0 startserver
  6. Abrimos un navegador Web y vamos a http://yourMachineName:8080/examples/jsp/tutorial/hellouser/hellouser.jsp

COMPARTE ESTE ARTÍCULO

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