Tomcat, Servlet y JSP    tomcat.png


Contenido


INTRODUCCIÓN



En una transacción web participan dos actores: Navegador y Servidor.

El navegador es un programa que permite a los usuarios obtener la información de sitios WEB. Traduce los datos HTML obtenidos del servidor a una forma que los usuarios puedan entender.

El servidor es el responsable de buscar la información solicitada por el usuario a través del navegador, empacarla y transmitirla en código HTML

En un comienzo el manejo de información contenido en los servidores era estático. Luego el sistema se complejizo, creando teconologías que permiten soportar contenido dinámico. Ejemplo de contenido dinámico es: carritos de compra y motores de búsqueda.

Para dar soporte al contenido dinámico en los servidores, la solución que se plantea es ejecutar programas en el servidor para generar la información en código HTML que luego es enviada al navegador.

En la Figura 1, se muestra la forma en que se responde a una consulta de contenido dinamico en un servidor.

modelo_cgi.png
FIGURA 1: Transacción WEB de contenido dinamico

CGI es Common Gateway Interface. Corresponde al mecanismo por el cual el servidor y el programa que ejecuta el código HTML se comunican. Es denominación común a los programas que se ejcutan en el lado del servidor.
Inconvenientes de los CGI:
Para los 3 primeros puntos se implemente FastCGI y para el segundo servlets que se verá mas adelante.
Subir



TOMCAT


Es un servidor WEB y contenedor de servlets y JSP programado en java desarrollado por Apache Software Foundation bajo el projecto Apache Jakarta. Implementa las especificaciones de Servlets y JSP. Además incluye un servidor HTTP.

Un contenedor de servlets consiste esencialmente de una aplicación servidor que hace de host e interactúa con los java servlets. El contenedor controla el servlets que esta corriendo dentro del servidor web y es responsable de retransmitir las peticiones y respuestas que le hacen al servlet. Tiene la función de mapear la dirección URL a un servlet en particular y asegurarse que el proceso de requerimientos de direcciones tenga los permisos adecuados.

En la Figura 2 se muestra el comportamiento de Tomcat.
tomcat_engine.png
Figura 2: Comportamiento de Tomcat frente a peticiones.

Tomcat incluye al compilador jasper, que compila JSP convirtiendolas en servlets. Es un proyecto open source. La última version corresponde a la 6.x

Subir

Requerimientos

Es necesario tener el kit JDK 5.0 instalado en el sistema. No es suficiente tener instalado sólo el JRE, puesto que en éste no viene Jasper.

Dependiendo de la version de Tomcat empleada es el soporte que se tiene para las versiones de  servlet y JSP. En la Tabla 1 se muestra el soporte de servlet y jsp por parte de tomcar segun su version

Tabla1:Soporte de tomcat para servlet y Jsp
Servlet/JSP Spec Apache Tomcat version
2.5/2.1
6.x
2.4/2.0 5.5.20
2.3/1.2 4.1.34
2.2/1.1 3.3.2

Para la presentación se usará tomcat 6.x el cual soporta Servlet 2.5 y Jsp 2.1. Tomcat 6.x viene incluido en Netbeans 5.5, que será utilizado para presentar los ejemplos.

Subir

¿Como instalar y ejecutar tomcat en UNIX?

Una forma es decargarlo de la página oficial de tomcat -> download tomcat 6.x y luego descomprimirlo. Por último se debe modificar el archivo .bashrc  en la consola para setear la variable de entorno JAVA_HOME o JRE_HOME definitivamente, esto se hace incluyendo la linea:

export JAVA_HOME=/donde_se_encuentra_jdk_instalado/:$JAVA_HOME

El otro modo es agregar a los repositorios(como root):
deb http://apt.leapster.org/tomcat ./
deb-src http://apt.leapster.org/tomcat ./
 en nuestro caso se deben agregar en: /etc/apt/sources.list
Luego:
  •  apt-get update
  • apt-cache search tomcat
  • apt-get install tomcatxxx

En el directorio apache-tomcat-6.0.2/bin se puede ejecutar ./catalina.sh start ó ./startup.sh para iniciar tomcat

Para verificar el fucionamiento del servidor basta con iniciar un navegador y conectarse a http://localhost:8080

Subir




SERVLET


La palabra servlet deriva de otra anterior,applet, que se refiere a pequeños programas escritos en Java que se ejecutan en el contexto de un navegador web. Por contraposición, un servlet es un programa que se ejecuta en un servidor.

El uso más común de los servlets es generar páginas web de forma dinámica a partir de los parámetros de la petición que envíe el navegador web.

Subir

Aspectos técnicos

Un servlet es un objeto que se ejecuta en un servidor o contenedor J2EE, fue especialmente diseñado para ofrecer contenido dinámico desde un servidor web, generalmente es HTML. Otras opciones que permiten generar contenido dinámico son con los lenguajes ASP, PHP, JSP(un caso especial de servlet) y  Python.

Los servlets forman parte de J2EE (Java 2 Enterprise Edition), que es una ampliación de J2SE (Java 2 Standard Edition).

Un servlet es un objeto Java que implementa la interfaz javax.servlet.Servlet o hereda alguna de las clases más convenientes para un protocolo específico (ej: javax.servlet.HttpServlet). Los servlet HTTP son las más comúnmente usados.

Subir

Servlet y el Contenedor

El Contenedor es el encargado de la creación, acceso y destrucción de los Servlets, controla su ciclo de vida.
El contenedor web es el responsable de:

El Servlet por su parte debe:

Subir


JavaServer Pages(JSP)


Generalidades de JSP



Permite combinar código HTML estático con código generado en un mismo fichero.

Ventajas:
  1. Separación de datos estáticos/dinámicos
  2. Independencia de formato/plataforma
  3. Separación entre desarrolladores y diseñadores de contenidos.
JSP vs ASP. Respuesta de Sun a ASP.
JSP vs Servlet. Los JSP son interpretados en Servlet. JSP es una extensión de los servlets.

JSP 1.1
      java.servlet.jsp
      Java.servlet.jsp.tagext
A los archivos generados le damos extensión .jsp. JSP representa un nivel mayor de abstracción que JSP.

Los 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 y encerramos el código de las partes dinámicas en unas etiquetas especiales, la mayoría de las cuales empiezan con "<%" y terminan con "%>".
Aunque el código parezca más bien HTML, el servidor lo traduce a un servlet en la primera petición.

Una página JSP contiene:
¿Si Servlet maneja contenido dinámico porque usar JSP?
Subir

Ejecución de las páginas JSP


Todo se inicia con la URL en un navegador Web. El servidor reconoce la extensión JSP y de inmediato la consulta es traspasada al contenedor JSP. El servidor Web debe tener acceso a un contenedor de páginas JSP pero no  necesariamente estar integrada en el servidor (Jakarta Tomcat).

Una vez identificada la página JSP se procede a traducirla a un servlet equivalente. Ya generado el servlet equivalente el contenedor JSP lo invoca para que se ejcute y devuelva al cliente la respuesta correspondiente. El proceso de traducción tiene lugar la primera vez que se invoca a la página JSP o cuando esta sufre algún cambio.

Una vez que se ha ejecutado una página JSP su servlet permanece cargado en memoria (mayor rendimiento). Todo el proceso de traducción y compilación es completamente transparente al usuario navegador Web. La traducción de una página JSP lo lleva a cabo un servlet especial que se encuentra en el contenedor JSP, y recibe el nombre de page compiler. Todo código HTML estático se traduce en cadenas(Objetos String) de Java, que se escribirán en el flujo de salida del servlet sin realizar ninguna modificación. Una vez terminado el proceso de compilación, el page compiler llama al compilador de java para que compile el código fuente del servlet generado. Luego se ejecuta el .class generado y devuelve la respuesta correspondiente al usuario.

En la Figura 4 se muestra el esquema de ejecución de una pagina JSP. En la Figura 5 se muestra la estructura del contenedor Tomcat.
jsp_behavior.png
Figura 4: Esquema de ejecución de una página JSP

tomcat2.png
Figura 5: Estructura del contenedor Tomcat

Subir

Detección de una página JSP actualizada


Cuando el compilador de páginas detecta una petición de una página JSP comprueba la fecha y hora de modificación de la página y la compara con el servlet equivalente para verificar si se ha producida una modificación en la página. Si no se encuentra el servlet equivalente es porque la página ha sido ejecutada por primera vez. Pero si el servlet si existe pero la hora y fecha no coinciden entonces es porque la página JSP ha sido modificada.

Subir

Elementos dinámicos de JSP

Directivas

Establecen valores globales. No muestran salida a cliente. Permiten incluir código java en la página como declarar objetos, instanciarlos, declarar métodos,etc.


Sintaxís:
<%@nombreDirectiva atributo1=”valor1”...atributon=”valorn”%>

Directivas
page

Declaraciones

Código java utilizados para declarar variables y métodos propios dentro de la página <%! %>.

Ej: <%! private Integer edad=new Integer("0");
private String nombre;
private String domicilio;%>

Scriptlets

 
Código ejecutado cuando se efectua una petición. <% %> (mismo que ASP). Pueden usar cualquier código java válido

Ej: <%Date fecha=new Date();
out.println("La fecha actual y hora es: "+fecha);%>

otro:

<%Calendar fecha = Calendar.getInstance();
int hora=fecha.get(Calendar.HOUR_OF_DAY);
if (hora==0) hora=24;
if (hora<=14){%>
<h1>Buenos días</h1>
<%}else if(hora>14&&hora<21){%>
<h1>Buenas tardes</h1>
<%}else{%>
<%}%>

Expresiones

Notación especial para scriptlet que devuelve un resultado a la respuesta al usuario. <%= %> (mismo ASP)

Ej: La fecha y hora actual es: <i><b><%=new Date()%></b></i>

Comentarios

<%-- --%>

Acciones
Etiquetas especificas de JSP que afectan el comportamiento de la página y la respuesta enviada al usuario
Son acciones estándar que todo contenedor JSP debe proveer
<jsp: accion>

Objetos implícitos o integrados

Se suelen utilizar en scriptlets o expresiones, no necesitan ser declarados o instanciados.
Similar a servlets.
Implementan interfaz como HttpServletRequest o HttpServletResponse.

obejtosintegrados
Subir

Ejemplos JSP


Primer Ejemplo: Comparando con el Servlet que produciría el mismo resultado
<%@ page language="Java"%>
<html>
    <head>
        <title>Hola mundo con JSP</title>
    </head>
    <body>
        <%--Esto es un comentario--%>
        <div align="center">
            <b><%out.println("Hola Mundo");%></b>
        </div>
     </body>
</html>
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
   public class ServletHolaMundo extends HttpServlet {
     public void doGet(HttpServletRequest request, HttpServletResponse response)
       throws IOException, ServletException{
       response.setContentType("text/html");
       PrintWriter out = response.getWriter();
       out.println("<html>"+
       "<head><title>Hola Mundo con un servlet</title></head>"+
       "<body><div align='center'><b>Hola Mundo </b></div>"+
       "</body></html>"
       );
     }
   public void doPost(HttpServletRequest request, HttpServletResponse response)
    throws IOException, ServletException{
      doGet(request,response);
    }
}




Otro Ejemplo:
<%@ page language="Java“ import="java.util.*"%>
<html>
    <head>
        <title>Hola mundo con JSP</title>
    </head>
    <%--Esto es un comentario--%>
    <body>
        <div align="center">
            <b>
            <%!String nombre;%>
            <%nombre=request.getParameter("nombre");
            if (nombre!=null)
                out.println("Hola "+nombre);
            else
                out.println("Hola Mundo");%>
            <br>La fecha y hora actuales son:</b><i><%=new Date()%></i>
        </div>
    </body>
</html>


Los ejemplos realizados en NetBeans se pueden descargar en el siguiente enlace -> Descargar
Subir

Paquete javax.servlet.jsp


HttpJspPage

Este es el interfaz que una clase generada por el procesador de páginas JSP debe implementar si se trata de utilizar el protocolo http. Este interfaz posee solamente el método _jspService(), que será generado de forma automática por el contenedor de servlets a la hora de generar el servlet correspondiente a una página JSP.

JspPage

Este interfaz es el interfaz padre de HttpJspPage, y también debe ser implementado por la clase generada a partir de una página JSP. Este interfaz posee los métodos jspInit(), para realizar procesos de inicialización, y jspDestroy() para realizar labores de limpieza y liberación de recursos. Estos dos métodos puede ser implementados por el desarrollador de páginas JSP, sin embargo el método jspService() del interfaz hijo nunca debe ser implementado por el desarrollador (o diseñador) de páginas JSP, sólo puede encontrarse en el servlet generado de forma automática.

JspEngineInfo

Se trata de una clase abstracta que ofrece información relativa al contenedor de páginas JSP que se está utilizando. Posee un único método llamado getSpecificationVersion(), que devuelve el número de especificación del API JavaServer Pages implementado por el contenedor de páginas JSP.

JspFactory

Clase abstracta que define una serie de métodos disponibles para una página JSP en tiempo de ejecución, que permiten crear instancias de varios interfaces y clases utilizadas para soportar la especificación JSP.

JspWriter

Clase abstracta que emula parte de la funcionalidad ofrecida por las clases java.io.BufferedWriter y java.io.PrintWriter. Se utilizará para enviar contenido a la respuesta del cliente. Esta clase hereda de la clase java.io.Writer.

PageContext

Una instancia de esta clase ofrece acceso a todos los contenidos asociados con una página JSP, ofrece acceso a ciertos atributos de la página, así como una capa de abstracción sobre los detalles de implementación.

JspException

Una excepción genérica que será lanzada por el contenedor de páginas JSP.

JspTagException

Excepción que será lanzada por un manejador de etiquetas para indicar un error. El manejador o gestor de etiquetas es una clase especial que se utiliza dentro del mecanismo de etiquetas personalizadas de JSP, que se verá con más detalle en el momento oportuno.

Subir



Referencias

Subir



Contacto


Para dudas o cualquier cosa enviar correo a: dgonza [@] elo.utfsm.cl ó

Subir