Java Server Pages

Recomendar esta página Ver en PDF Imprimir esta página
Wiki de astronomía.
Todo el poder de la Wikipedia y toda la esencia de la astronomía

Java Server Pages

De Wikipedia, la enciclopedia libre

JavaServer Pages (JSP) es una tecnología Java que permite generar contenido dinámico para web, en forma de documentos HTML, XML o de otro tipo.

Esta tecnología es un desarrollo de la compañía Sun Microsystems. La Especificación JSP 1.2 la primera que ser liberó y en la actualidad está disponible la Especificación JSP 2.1.

Las JSP’s permiten la utilización de código Java mediante scripts. Además es posible utilizar algunas acciones JSP predefinidas mediante etiquetas. Estas etiquetas pueden ser enriquecidas mediante la utilización de Librerías de Etiquetas (TagLibs o Tag Libraries) externas e incluso personalizadas.

Microsoft, la más directa competencia de Sun, ha visto en esta estrategia de Sun una amenaza, lo que le ha llevado a que su plataforma .NET incluya su lenguaje de scripts ASP.NET que permite ser integrado con clases .NET (ya estén hechas en C++, VisualBasic o C#) del mismo modo que jsp se integra con clases Java.

Tabla de contenidos

[editar] Arquitectura

Desde el punto de vista de arquitectura, podríamos situar esta tecnología como una capa superior a las Servlets dentro de nuestra aplicación, ya que extiende la Especificación Servlet 2.1. Ambas tecnologías fueron desarrolladas originalmente por Sun Microsystem.

El funcionamiento general de la tecnología JSP es que el Servidor de Aplicaciones interpreta el código contenido en la página JSP para construir un Servlet, cuya salida será un documento estático (típicamente HTML) que se presentará en la pantalla del Navegador del usuario.

 JSP -> Servidor Aplicaciones (Servlets) -> Cliente (Navegador)

A su vez, es posible enriquecer este lenguaje de etiquetas. Para ello debemos extender la capa de alto nivel JSP mediante la implementación de Librerías de Etiquetas (Tags Libraries). Un ejemplo de estas librerías son las propocionadas por Sun bajo la denominación de JSTL o las distribuidas por Apache junto con el Framework de Struts.

 TagLibs -> JSP -> Servidor Aplicaciones (Servlets) -> Cliente (Navegador)

JSP no se puede considerar un script al 100%, ya que antes de ejecutarse el Servidor de Aplicaciones compila el contenido del documento JSP (script y etiquetas) y genera una clase Servlet. Por lo tanto, se puede decir que aunque este proceso sea transparente para el programador no deja de ser una tecnología compilada.

La principal ventaja de JSP frente a otros lenguajes es que permite integrarse con clases Java (.class) lo que permite separar en niveles las aplicaciones web, almacenando en clases java las partes que consumen más recursos (así como las que requieren más seguridad) y dejando la parte encargada de formatear el documento HTML en el archivo JSP. La idea fundamental detrás de este criterio es el de separar la lógica del negocio de la presentación de la información.

Independientemente de la certeza de la aseveración, Java es conocido por ser un lenguaje muy portable (su lema publicitario reza: escríbelo una vez, córrelo donde sea) y sumado a las capacidades de JSP se hace una combinación muy atractiva. ___

Los servlets y Java Server Pages (JSPs) son dos métodos de creación de páginas web dinámicas en servidor usando el lenguaje Java. En ese sentido son similares a otros métodos o lenguajes tales como el PHP, los CGIs (common gateway interface), programas que generan páginas web en el servidor, o los ASP (Active Server Pages), un método específico de Microsoft. Sin embargo, se diferencian de ellos en otras cosas.

Para empezar, los JSPs y servlets se ejecutan en una máquina virtual Java, lo cual permite que, en principio, se puedan usar en cualquier tipo de ordenador, siempre que exista una máquina virtual Java para él. Cada servlet (o JSP, a partir de ahora lo usaremos de forma indistinta) se ejecuta en su propia hebra, es decir, en su propio contexto; pero no se comienza a ejecutar cada vez que recibe una petición, sino que persiste de una petición a la siguiente, de forma que no se pierde tiempo en invocarlo (cargar programa + intérprete). Su persistencia le permite también hacer una serie de cosas de forma más eficiente: conexión a bases de datos y manejo de sesiones, por ejemplo.

Los JSPs son en realidad servlets: un JSP se compila a un programa en Java la primera vez que se invoca, y del programa en Java se crea una clase que se empieza a ejecutar en el servidor como un servlet. La principal diferencia entre los servlets y los JSPs es el enfoque de la programación: un JSP es una página Web con etiquetas especiales y código Java incrustado, mientras que un servlet es un programa que recibe peticiones y genera a partir de ellas una página web

[editar] Ejemplo de Documento JSP

Ejemplo de código de una página JSP:

<%@ page errorPage="myerror.jsp" %>
<%@ page import="com.foo.bar" %>


<%! int serverInstanceVariable = 1;%>
...
<% int localStackBasedVariable = 1; %>

...

Ejemplo de una compilación o “Salida” JSP:

package jsp_servlet;
import java.util.*;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
import com.foo.bar; //importado como resultado de <%@ page import="com.foo.bar" %>
import ...
class _myservlet implements javax.servlet.Servlet, javax.servlet.jsp.HttpJspPage {
    //insertado como
    //resultado de <%! int serverInstanceVariable = 1;%>
    int serverInstanceVariable = 1; 
    ...
    public void _jspService( javax.servlet.http.HttpServletRequest request,
                             javax.servlet.http.HttpServletResponse response )
      throws javax.servlet.ServletException,
             java.io.IOException
    {
        javax.servlet.ServletConfig config = ...;//obtener la configuración del servlet
        Object page = this;
        PageContext pageContext = ...;//obtener el contexto de la pagina para esta petición 
        javax.servlet.jsp.JspWriter out = pageContext.getOut();
        HttpSession session = request.getSession( true );
        ...

Para ejecutar las páginas JSP, se necesita un servidor Web con un contenedor Web que cumpla con las especificaciones de JSP y de Servlet. Tomcat 5 es una completa implementación de referencia para las especificaciones Java Servlet 2.2 y JSP 1.1.

[editar] Sintaxis

[editar] Variables Implícitas

Las páginas JSP incluyen ciertas variables privilegiadas sin necesidad de declararlas ni configurarlas:

Variable Clase
pageContext javax.servlet.jsp.PageContext
request javax.servlet.http.HttpServletRequet
response javax.servlet.http.HttpServletResponse
session javax.servlet.http.HttpSession
config javax.servlet.ServletConfig
application javax.servlet.ServletContext
out javax.servlet.jsp.JspWriter
page java.lang.Object
exception java.lang.Exception

[editar] Directivas

Son instrucciones al JSP Runtime: no producen una salida visible al usuario sino que configura cómo se ejecutará la página JSP.

Su sintáxis sería:

 <%@ directiva atributo="valor" %>

Las directivas disponibles son:

  • include, incluye estáticamente el contenido de un fichero para generar la servlet mediante el atributo file.
 <%@ include file="cabecera.html" %>
  • taglib, importa librerías de etiquetas (Tag Libraries)
 <%@ taglib uri="/tags/struts-html" prefix="html" %>
  • page, especifica parámetros relacionados con la página a procesar.

Atributo Sintaxis Utilización
import <%@ page import="class; class" %> Importa clases y paquetes Java para ser utilizadas dentro del fichero JSP.
session <%@ page session="false" %> Especifica si utiliza los datos contenidos en sesión; por defecto “true”.
contentType <%@ page contentType="class; class" %> Especifica el tipo MIME del objeto “response”; por defecto “text/html; charset=ISO-8859-1”.
buffer <%@ page buffer="12KB" %> Buffer utilizado por el objeto writer “out”; puede tomar el valor de “none”; por defecto “8KB”.
errorPage <%@ page errorPage="/path_to_error_page" %> Especifíca la ruta de la página de error que será invocada en caso de producirse una excepción durante la ejecución de este fichero JSP.
isErrorPage <%@ page isErrorPage="true" %> Determina si este fichero JSP es una página que maneja excepciones. Únicamente a este tipo de páginas pueden acceder a la variable impícita “exception”, que contiene la excepción que provocó la llamada a la página de error.

[editar] Scriptlets

Nos permite declarar variables, funciones y datos estáticos.

 <%! int maxAlumnosClase = 30; %>

Las scriptles son partes de código Java incrustadas entre los elementos estáticos de la página.

 <% ... código Java ... %>

Las expresiones se evalúan dentro de la servlet. No deben acabar en “;”.

 <%= maxAlumnosClase + 1%>

El siguiente ejemplo podría como título de la página el atributo “titulo” contenido en el objeto request:

 <%
   String titulo = "";
   if (request.getAttribute("titulo") != null) {
     titulo = (String) request.getAttribute ("titulo");
   }
 %>
 ...
 <%=titulo%>
 ....

[editar] Etiquetas

Etiquetas JSP para simplificar el código y dar mayor funcionalidad.

Desarrollar sitios web utilizando etiquetas presenta ciertas ventajas como:

  • facilitar el aprendizaje.
  • facilitar el mantenimiento.
  • fomentar la modularidad y la reutilización.
  • simplificar el código y reducir el número de lineas necesarias.

Su sintaxis sería:

 <%@ taglib uri="/taglib/lycka" prefix="lycka" %>
 ...
 
 ...

A la hora de generar el código Java de la Servlet, esta etiqueta hola será interpretada por el Servidor de Aplicaciones como perteneciente a la librería de etiquetas (Tag Library) lycka. Esta librería estará identificada en el fichero descriptor de nuestra aplicación (web.xml) con el nombre de recurso (URI) /taglib/lycka.

 /taglib/lycka
 /WEB-INF/tags/lycka.tld

Una implementación de este fichero descriptor, /WEB-INF/tags/lycka.tld podría ser:

 
 http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
 
 
   1.0
   1.1
   simp
   http://www.hachisvertas.net/jcs/taglibs/lycka
   A simple sample tag library
 
   
     hola
     org.lcyka.taglibs.miEtiqueta
     empty
     Alaba la belleza de mi gata.
   
 

Y por fin, el servidor de aplicaciones sustituirá la etiqueta por su código Java asociado, org.lcyka.taglibs.miEtiqueta:

 package org.lcyka.taglibs;
 import ...;
 public class miEtiqueta extends TagSupport {
   public int doStart {
     try {
       pageContext.getOut.print("Mi gata es preciosa");
     } catch (IOException ioe) {
     }
     return SKIP_BODY;
   }

Y finalmente el navegador mostraría:

 Mi gata es preciosa

[editar] Etiquetas JSP

Son las etiquetas pertenecientes a la especificación JSP. Proporcionan una funcionalidad básica.

Un primer grupo de etiquetas proporciona funcionalidad a nivel de la página de una manera muy simple:

  • , redirige la request a otra URL
  • , incluye el texto de un fichero dentro de la página
  • , descarga un plugin de Java (una applet o un Bean).

Un segundo grupo permite manipular componentes JavaBean sin conocimientos de Java.

  • , permite manipular un Bean (si no existe, se creará el Bean), especificando su ámbito (scope), la clase y el tipo.
  • , obtiene la propiedad especificada de un bean previamente declarado y la escribe en el objeto response.
  • , establece el valor de una propiedad de un bean previamente declarado.

[editar] Etiquetas JSTL

Son proporcinadas por Sun dentro de la distribución de JSTL.

  • core, iteraciones, condicionales, manipulación de URL y otras funciones generales.
  • xml, para la manipulación de XML y para XML-Transformation.
  • sql, para gestionar conexiones a bases de datos.
  • i18n, para la internacionalización y formateo de las cadenas de caracteres como cifras.

[editar] Etiquetas Struts TagLib

Distribuidas por Apache para funcionar junto con el Framework de Struts.

  • Bean
  • HTML
  • Logic
  • Nested

[editar] Etiquetas personalizadas

Anteriormente hemos visto un ejemplo para crear una etiqueta personalizada almacenada en nuestra propia librería de etiquetas.

Para desarrollar etiquetas personalizadas, utilizaremos la API de las librerías de etiquetas (Tag Libraries).

La API de las Servlet de Java es:

 javax.servlet.*

La API de JSP extiende de esta API,

 javax.servlet.jsp.*

Finalmente, la API de las librerías de etiquetas (Tag Libraries) extiende de esta última,

 javax.servlet.jsp.tagext.*

Lo más relevante de esta API son:

  • Los interfaces
    • Tag, que todas las etiquetas deben implementar.
    • BodyTag, extiende a la anterior y define métodos adicionales para inspeccionar el cuerpo de una etiqueta.
  • Las clases
    • BodyContent, un manejador (handler) para leer y escribir en el cuerpo de una etiqueta.
    • BodyTagSupport, que implementa el interfaz BodyTag.
    • TagAttributeInfo, para obtener la información de los atributos de la etiqueta declarados en el TLD.
    • TagData, que contiene los valores de los atributos.
    • TagExtraInfo, para especificar información extra de una etiqueta, como las variables que introduce en el código o los atributos que serán validados.
    • TagInfo, basado en la información de la TLD.
    • TagLibraryInfo, representa la información de una TLD.
    • TagSupport, implementa el interfaz Tag.
    • VariableInfo, contiene información como el tipo y ámbito de las variables creadas o modificadas por la etiqueta.

Podemos encontrar una descripción más detallada en http://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/servlet/jsp/tagext/package-summary.html

Otro ejemplo de etiqueta podría ser el siguiente código Java:

 package org.lycka.taglibs;
 import ...;
 public class LowerCaseTag extends BodyTagSupport {
   public int doAfterBody() throws JspException {
     try {
       BodyContent body = getBodyContent();
       JspWriter writer = body.getEnclosingWriter();
       String bodyString = body.getString();
       if ( bodyString != null ) {
         writer.print( bodyString.toLowerCase());
       }
     } catch(IOException ioe) {
       throw new JspException("Error: IOException while writing to the user");
     }
     return SKIP_BODY;
   }
 }

Al encontrar el inicio de la etiqueta, el runtime primero se invocará el método doStart() una vez instanciada la clase. Puede devolver uno de los siguientes valores:

  • SKIP_BODY, no procesa el contenido del cuerpo de la etiqueta.
  • EVAL_BODY_INCLUDE , evalúa el cuerpo de la etiqueta.
  • EVAL_BODY_TAG , evalúa el cuerpo de la etiqueta y lanza el resultado a otro stream almacenado en una propiedad de la etiqueta.

El método doAfterBody() después de procesar el cuerpo de la etiqueta.

Finalmente se invocará el método doEndTag(). Puede devolver:

  • EVAL_PAGE, para seguir procesando la página JSP
  • SKIP_PAGE, para dejar de procesar la página JSP, para por ejemplo redirigir la página

Declarado en el descriptor de la librería como

 
   lowercase
   org.lycka.taglibs.LowerCaseTag
   JSP
   Put body in lowercase.
 

Utilizado en la página JSP

 <%@ taglib uri="/taglib/lycka" prefix="lycka" %>
 ...
 Mi Gata es TAN Preciosa.

Y su salida sería

 mi gata es tan preciosa.

[editar] Enlaces externos

Scroll to Top