Abr 08 2009

Tomcat (VI): Directivas JSP y paso de atributos

Categoría: DAD,ProgramaciónMiguel Angel @ 22:45

TomcatDespués de hacer una breve introducción a las JSP vamos a trabajar las directivas de páginas y el paso de atributos entre el servlet Control y la JSP. Así que, vamos por partes…

Directivas JSP

Como ya se comentó, una página JSP se «compila» para generar un fichero .java y este, cada vez que se ejecuta, crea la página html deseada. Pero, ¿podemos añadir información «extra» antes de compilar? Evidentemente la respuesta es sí. Y lo haremos mediante el uso de lo que se denomina directiva.

Como no es objetivo de esta entrada explicar una a una todas las directivas, aquí os dejo un enlace donde están todas. Veamos dos ejemplos de uso:

  • Utilizar clases Java

En Java existen dos opciones a la hora de declarar una variable:

Poner el nombre completo: java.util.Vector miVector = new java.util.Vector();

Importar la clase Vector: import java.util.Vector;

De igual forma sucede en las páginas JSP. Podemos crear la variable directamente <% java.util.Vector miVector … %> o importar la clase para su uso en cualquier parte de la página JSP. Para lo cual hacemos uso de la directiva import.

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

Se pueden incluir varias clases separándolas por comas.

  • Incluir otras JSP

Por norma general, aunque esto va por modas, una página html suele tener un encabezado y un cuerpo. Lo interesante sería no tener que escribir en cada página JSP el código de la cabecera. Entre otros motivos porque, si se tiene que modificar el código de esta, entonces habrá que hacerlo en todas las páginas. Para agilizar y mejorar la eficiencia de este proceso existe la directiva import. Con ella podemos incluir desde una página html hasta otra JSP.

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

Paso de parámetros Servlet-JSP

En el ejemplo que estamos desarrollando toda la lógica de la aplicación se encuentra en las clases Java. Mientras que las páginas JSP se han dejado como parte de la lógica de presentación (la vista en el patrón Modelo-Vista-Control).

Pero, si la lógica de aplicación está en las clases Java ¿cómo puedo pasar información desde estas hasta las JSPs? Muy fácil: haciendo uso de atributos.

Si en la clase ucam.servlets.Control modificamos el código del método doPost para que, antes de redirigir a la jsp, incluya este fragmento

Vector lineas = new Vector();
lineas.add("Primera linea");
lineas.add("Segunda linea");
req.setAttribute("LINEAS", lineas);

Y en la JSP (inicio.jsp) ponemos este otro donde se quieran mostrar las líneas:

java.util.Vector atr =
      (java.util.Vector)request.getAttribute("LINEAS");
for (int i = 0 ; i < atr.size() ; i++)
out.println((String)atr.elementAt(i)+"<br/>");

Estaremos pasando información desde el servlet Control a la JSP haciendo uso del atributo LINEAS; que es un objeto de la clase Vector. Puedes probarlo invocando el servlet. ¿No te acuerdas como? Creo que deberías repasar las entradas anteriores :-).

¿Podemos pasar un objeto de una clase que hayamos creado nosotros (Factura, Usuario, etc)? Por supuesto que sí!!! es una clase no??

Un consejo, para nombrar los atributos es mejor utilizar constantes. Por ejemplo, en el servlet pondríamos:

public class Control extends HttpServlet{
   public static final String LINEAS = "LINEAS"

la utilizaríamos de esta forma:

req.setAttribute(Control.LINEAS, lineas);

y en la JSP la recuperaríamos así:

java.util.Vector atr = (java.util.Vector) request.getAttribute(
               ucam.servlets.Control.LINEAS );

¿Que hemos ganado con eso? Pues que si recuperamos el atributo en distintas JSP y en algun momento queremos cambiarle el nombre no tendremos que hacerlo en todas ellas; solamente en el servlet Control.

Por cierto, recuerda que se pueden obviar los nombres completos de las clases haciendo uso de la directiva import:

<%page import="java.util.Vector, ucam.servlets.Control" %>
<HTML>...
<% Vector atr = (Vector) request.getAttribute(Control.LINEAS);

Etiquetas: ,

2 Respuestas a “Tomcat (VI): Directivas JSP y paso de atributos”

  1. sebas dice:

    Quisiera saber si se puede hacer lo contrario, es decir que desde una clase de java puedas usar una variable de jsp instanciando la clase… Gracias

  2. Miguel Angel dice:

    pues la verdad es que desconozco si se puede hacer. ¿Para que quieres hacerlo?

Dejar una respuesta