Introducción a las JavaServer Pages
(Enero de 2005)
Introducción
Las JSP son desde un punto de vista funcional semejantes a servlets: se convierte la página JSP
en un servlet la primera vez que la página es invocada. Por ello en ocasiones nos referimos
a ellas como páginas que generan 'dinámicamente' servlets. Esta primera vez el contenedor,
compila, carga en memoria y ejecuta el servlet (debido a esta acumulación de tareas lo normal es
que la primera ejecución sea un poco lenta y, por ello, es realizada por el programador).
En algunos contenedores se precompila el servlet. Sea cual sea el tipo de
contenedor utilizado, al final se accede a un servlet.
Un servlet esta realizado integramente en Java y su salida es un objeto que tiene el formato
solicitado por el cliente (HTML, XML, etc.). Una JSP se escribe en código Java
y en directivas específicas que se mezclan con código HTML. Ventajas de las
JSP:
- Los servlets exigen un mayor conocimiento de Java. Con JSP tenemos una tecnología
orientada a la presentación, en donde los creadores de HTML se pueden sentir más a gusto que
con el "puro Java". No tenemos que tener múltiples llamadas al método println para generar
HTML. Se escribe HTML de forma natural y cómoda.
- El programador puede modificar las páginas JSP y el contenedor JSP las recompila y recarga
en memoria la primera vez que las invocamos. El programador no tiene que compilar
(al igual que ocurre con el HTML).
- El despliegue es as sencillo que en el caso de servlets. No hay necesidad de web.xml.
Al igual que los servlets contamos con métodos estándar que son invocados por el sistema Java y pueden sobreescribirse:
- jspInit(), idéntico al init() de un servlet, se invoca antes de la primera petición.
- jspDestroy(), idéntico al destroy() de un servlet, se invoca antes de la descarga de la memoría del
servidor (por ejemplo, por una parada de servicio). Pero, al igual que un
servlet, no es llamado en caso de caída abrupta (apagón) del
servidor. Libera recursos, como por ejemplo, una conexión a una base de datos.
Seamos cuidadosos a la hora de situar los archivos .jsp, para evitar el efecto jungla o maraña. Normalmente
se colocan junto con las páginas HTML. Pero si la JSP llama a un servlet hay
quien la coloca en el directorio de los servlets (WEB-INF/classes/paquete/clase.class). Lo que es evidente es que no deben colocarse en el directorio
WEB-INF (que queda oculto para el cliente).
Etiquetas
Las etiquetas JSP tienen diferentes categorías:
- Comentarios: <%-- mi comentario --%>
- Declaraciones: se utiliza para declarar variables de
tipos simples, objetos y métodos. Ejemplo: <%! int contador = 0; %>. La sintaxis es puro Java y se
continua con la vieja regla de "declarar antes de usar".
- Expresiones: al procesar la página la salida es el valor de la expresión delimitada por
<%= %>, por ejemplo podemos insertar la expresión dentro de una línea HTML típica:
<p>La cuenta es: <%=contador%> </p>
<p>El cuadrado de la cuenta es: <%=cuadrado( contador )%> </p> <%-- Llamada a método --%>
Scriptlets: un conjunto de instrucciones Java. Formato: <% scriptlet %>. Ejemplo:
<%! int base = 5, altura = 7 ; %>
<% base * altura / 2.0;
new java.util.Date(); %>
<BR> Hola HTML
<% System.out.println( "de regreso a scriplets" );
base + altura; %>
Directivas: su sintaxis general es <%@ directiva {atributo ="valor"} %> dónde la
directiva debe tener al menos un atributo:
- Directivas page: en función del atributo utilizado sirven para la configuración
general: importar clases, definir tipo MIME, etc.
<%@ page import="paquete.clase" %>
<%@ page contentType="tipo MIME" %>
Para contentType los valores por defecto son contentType="text/html; charset=iso-8859-1".
Algunos atributos:
- import="package.*,clase.class" Sirve para importar paquetes y clases.
- session="true|false" Por defecto es true. Indica si mantiene atributos de
sesión para la página.
- isThreadSafe="true|false" Por defecto es true. Si es true cada petición corre
en un hilo y por tanto el procesador maneja las peticiones de forma
asíncrona ("simultáneamente"). Con false se gestionan las peticiones
en un hilo (una por una).
- info="text" Información de la página a la que se puede acceder a través del método Servlet.getServletInfo()
- errorPage="pagina_error". Página que manejará las excepciones.
- isErrorPage="true|false". Indica si es una página que manejará errores.
Ejemplos:
<%@ page import=”com.myco.*” buffer=”26k” errorPage=”/oops.jsp”%>
Para reenviar una excepción a una página tiene: <%@ page errorPage="07_errorPage.jsp"%>
En la página de error (07_errorPage.jsp) tenemos una forma de capturar el error por
medio del objeto implícito "exception":
<%@ page isErrorPage="true" %>
<html>
<head><title>Ejemplo de errorPage</title></head>
<body>
<h1>Se ha producido un error</h1>
<p>Error: <%= exception %>
</body>
</html>
Esta página capta las excepciones. No capta los errores debidos a fallos de enlace (URL).
Directivas include: se inserta un fichero en el lugar de la directiva.
Matiz: se inserta el fichero, no su valor o resultado. Utiles, entre otras cosas,
para insertar código HTML o JSP que se repite. La URL debe ser relativa. Ejemplo:
<%@ include file="cabecera.html" %>
Directivas Taglib: indica la referencia a la librería de etiquetas definidas
por el programador (etiquetas personalizadas). El motor JSP utiliza esta
librería para saber como interpretar las etiquetas personalizadas de la página JSP.Ejemplo:
<%@ taglib uri="URI_de_librería" prefix="prefijo_de_etiquetas" %>
URI es el descriptor único de la librería. No tiene valor por defecto. Si no se especifica
aparece una excepción. El prefijo es el prefijo en la expresión prefijo:etiqueta, que sirve
para definir la etiqueta personalizada. Cuando el motor de JSP se encuentra en la página
con la expresión prefijo_de_etiquetas:etiqueta, entonces se dirige a la librería señalada
en URI para interpretar la etiqueta. Las etiquetas personalizadas son importantes en el
manejo de JSP.
Acciones: realizan una tarea en el momento en que se solicita la página. Sirven para
acceder a beans, etc. La acción de inclusión, a diferencia de la directiva de inclusión, implica la
sustitución por el valor o resultado del archivo en el momento de la petición. Ejemplo:
<jsp:include page="también una URL relativa" flush="true"/>
Otra acción es jsp:forward, que tiene el mismo comportamiento que javax.servlet.RequestDispatcher. Su
sintaxis admite (o no) parámetros. La ejecución de la página invocante se detiene para resolver el
forward. Sintaxis:
<jsp:forward page="también una URL relativa">
<jsp:param name="nombre_parametro" value="valor" />
</jsp:forward pag>
Objetos implícitos
El motor JSP nos ofrece instancias de un conjunto de clases. Son objetos ya establecidos,
que no tenemos más que usar (no hay que instanciarlos). Deben utilizarse dentro del código Java.
Algunos objetos implícitos:
- request: la petición del cliente, del tipo HttpServletRequest.
- response: la respuesta, del tipo HttpServletResponse.
- pageContext: objeto del tipo javax.servlet.jsp.PageContext y tiene alcance "page"
- session: objeto el tipo HttpSession.
- application: representa el contexto del servlet, es del tipo javax.servlet.ServletContext
y tiene alcance de aplicación.
- out: el objeto que representa la salida de texto por pantalla.
- config: objeto del tipo ServletConfig
- page: referencia a la propia página. Se usa como alternativa al objeto this
Ejemplo:
<%
String strParam = request.getParameter("nombre_del_parametro");
out.println( strParam );
%>
Volver al índice