Usuario:ManuelRomero/modulo TOMCAT

De WikiEducator
Saltar a: navegación, buscar

Aplicaciones Web

Definición de aplicación web
Aplicación informática que se ejecuta en un entorno web
Modelo de ejecución Cliente /Servidor
Necesario un protocolo de comunicación .
Elementos
Cliente: navegador.
Servidor: servidor web
Comunicación: protocolo HTTP

Servidor de aplicaciones

Definición de servidor de aplicaciones
Es un software que proporciona aplicaciones a los equipos o dispositivos cliente,
Es muy frecuente el uso de la red de Internet para realizarlo
Utiliza el protocolo http
Presenta dos diferencias con los servidores web (p.e. apache)
  1. Hace un extensivo del contenido dinámico
  2. De manera muy frecuente realiza integración con bases de datos.

Ventajas de servidor de aplicaciones

centralización y simplicidad en desarrollo de aplicaciones
Las aplicaciones se ensamblan desde bloques que el servidor provee
Integridad de datos y de código
Al actulizar los datos que estás centralizados todos los clientes serán conscientes de ello

Tomcat

Definición
Tomcat es el servidor web (incluye el servidor Apache) que puede gestionar las solicitudes y respuestas http
También es servidor de aplicaciones del proyecto Yakarta contenedor de Servlets y JSP
Especialmente útil para porgramar aplicaciones web usando java
Incluye el compilador Jasper, que compila JSP covirtiéndolas en servlets.

Servlet

Definición
Un servlet es un programa escrito en java
se ejecuta en un servidor
normalmente se utiliza para generar contenido html dinámico.
  • Ejemplo de servlet en java
Código de ejemplo de un Servlet que procesa una petición GET y devuelve una página web HTML sencilla:
package org.pruebas;
 
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
public class HolaMundoServlet extends HttpServlet {
 
    /**
     * Servlet de ejemplo que procesa una petición GET
     * @param request
     * @param response
     * @throws ServletException
     * @throws IOException 
     */
    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        PrintWriter out = response.getWriter();
        out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">");
        out.println("<html>");
        out.println("<head><title>Ejemplo Hola Mundo</title></head>");
        out.println("<body>");
        out.println("<h1>¡Hola Mundo!</h1>");
        out.println("</body></html>");
    }
}
  • Al final del tema al estudiar el despliegue web y analizar el fichero web.xml del servidor de aplicaciones web o contendedor de servlet tomcat probaremos este fichero.

JSP

Definición
JSP es un lenguaje de programación parecido al lenguaje php
Es un código que ejecuta el servidor de aplicaciones web , al lado del servidor en el modelo cliente/servidor
Se puede embeber junto con códgio html
El servidor interpretar JSP de la misma manera en la que interpreta PHP, generando una página html que entrega al claiente
  • Ejemplo sencillo de un jsp
<html>
<body>
<% out.println("Hola mundo"); %>
</body>
</html>

Tomcat contenedor de servlets

  • Tomcat es un contenedor de servlets con un entorno JSP.
  • es un servidor de aplicaciones web pensado para desarrollos con java (no exclusivo para este entorno)
Contenedor de servlets
es un shell de ejecución que maneja e invoca servlets por cuenta del usuario.

Clasificación de contenedores de servlets

Contenedores de servlets stand-alone (independientes)
Estos son una parte integral del servidor web.
Este es el caso en el que se usa un servidor web basado en Java,
Por defecto Tomcat trabaja en este modo, sin embargo, la mayoría de los servidores no están basados en Java.
Contenedores de servlets dentro-de-proceso
En esta configuración del servidor, el contenedor servlets es una combinación
Un plugin para el servidor web
y una implementación de contenedor Java.
El plugin del servidor web abre una JVM (Máquina Virtual Java)
dentro del espacio de direcciones del servidor web
permite que el contenedor Java se ejecute en él.
En el caso de que una petición debiera ejecutar un servlet, el plugin toma el control sobre la petición y lo pasa al contenedor Java (usando JNI).
Un contenedor de este tipo es adecuado para servidores multithread de un sólo proceso
Además este tipo proporciona un buen rendimiento pero está limitado en escalabilidad.
Contenedores de servlets fuera-de-proceso
En este caso la combinación va a ser:
plugin para el servidor web
y una implementación de contenedor Java
Este se ejecuta en una JVM fuera del servidor web.
El plugin del servidor web y el JVM del contenedor Java se comunican
para ello usan algún mecanismo IPC (normalmente sockets TCP/IP).
Si una cierta petición tuviese que ejecutar un servlets, el plugin toma el control sobre la petición y lo pasa al contenedor Java (usando IPCs).
El tiempo de respuesta en este tipo de contenedores no es tan bueno como el anterior
A su favor, obtiene mejores rendimientos en otras cosas (escalabilidad, estabilidad, etc.)

Instalación de Tomcat

  • Necesitamos tener instalado JDK
  • buscamos el paquete java que más nos interese
aptitude search "?provides(java-runtime)"
  • instalamos java-runtime
apt-get install default-jre
  • actualizamos el PATH del sistema en nuestro profile
  • Indicando donde se ubican los binarios que acabamos de instalar
JAVA_HOME=/usr/lib/jvm/java6openjdk/ jre/
PATH=$PATH:$JAVA_HOME/bin
export PATH JAVA_HOME
  • actualizamos las variables de entorno
$ source /etc/profile
o  bien
$ .  /etc/profile
  • Vamos a la web de tomcat y vemos la última version
http://apache.rediris.es/tomcat/

WebTomcat.png

  • Tomamos la última version v7.0.32 y la descargamos
$  wget http://apache.rediris.es/tomcat/tomcat-7/v7.0.32/src/apache-tomcat-7.0.32-src.tar.gz
  • Descomprimimos y desenpaquetamos el fichero
$ tar xvzf apache-tomcat-7.0.32-src.tar.gz 
  • Movemos a una carpeta de destino
$ mv -fv apache-tomcat-7.0.32-src /usr/local
  • Creamos un enlace para referenciar más comodamente el directorio
$ ln -s /usr/local/apache-tomcat-7.0.32-src/ /usr/local/tomcat
  • De este modo tenemos acceso al directorio de tomcat de forma más sencilla

Arranque del sistema

  • Un script llamado catalina gestiona el servicio de Tomcat
  • 'catalina.hs debe recibir en la invocación parámetros start|stop|restart para actuar.
  • También disponemos de un shell que invoca explícitamente a este fichero startup.sh
  • verificamos el funcionamiento escribiendo en la url
http://127.0.0.1:8080
  • Debe aparecernos una página como la que sigue

Archivo:PaginaTomcat.png

Iniciando Tomcat

  • Por defecto tomcat
  1. puerto 8080
  2. directorio ./tomcat/webapps/ROOT
  • Por defecto apache
  1. puerto 80
  2. directorio ./var/www o ./apache/htdocs según como se haya instalado
  • Vamos a hacer que apache escuche todo
  • Lo configuramos como proxy
  • Apache derivará lo que considere a tomcat
  • aplicamos el principio de escalabilidad
    • Si nuestras necesidades crecen ponemos más tomcat en el sistema

Fichero de configuración

/usr/local/tomcat/conf/server.xml

  • Al ser un fichero xml se configura por elementos y atributos
  1. localizamos el elemenot host
  2. modificamos el atributo appBase
 <Host name="localhost" appBase="/var/www"

Apache y Tomcat Colaborando

  • Ahora tenemos en nuestro sistemas dos servicios que responden a solicitudes web, pero son diferentes
  • Debemos otorgar a cada uno su funcionalidad
  • Podemos hacer que convivan juntos de la siguiente manera, la idea es la siguiente
  • Todas las peticiones la recibe el servidor de apache
  1. Si es una solicitud web estática o php la resuelve apache
  2. Si es una solicitud de una aplicación web (jsp, servlet) se la entrega a tomcat para que resuelva el
  • El final es apache el que devuelve la solicitud al cliente
  • Este funcionamiento es totalmente trasparente para el usuario
  • Este escenario también es útil para que apache balancee la carga entre diferentes servidores de aplicaciones web y aligerar el trabajo

Proxy.png

Módulos necesarios

  • Necesitamos que apache incorpore una serie de módulos
  • Cargaremos estos módulos para hacer que sea apache un proxy
  • Para cargar módulos usamos el comando a2enmod apache to enabled module
  • Este comando sirve para cargar módulos nuevos
  • Ya sabemos que apache se gestiona por módulos
  • La lista de módulos que necesitamos son
proxy, proxyf_ajp, proxy_balancer
  • A continuación rearrancamos el sistema
$a2enmod proxy
$a2enmod proxyf_ajp
$a2enmod proxy_balancer
$ /etc/init.d/apache2 restart

Directivas necesarias en epache

Usaremos las siguientes directivas

  1. ProxyPass
  2. ProxyPassReverse
  3. ProxyRequests
  4. ProxyPreserveHost.

ProxyPass

  • Esta directiva tiene dos parámetros
  1. El primero Indicamos las URL que delegamos (/)
  2. El segundo el servidor de aplicaciones que atenderá la solicitud
  3. En nuestro caso especificamos tomcat_cluster que está definido previamente
<Proxy balancer://tomcat_cluster>
Order allow,deny
Allow from all
BalancerMember ajp://localhost:8009
</Proxy>

Conceto del proxy y el protocolo ajp

  • En lugar de usar http para comunicar apache-tomcat usamos ajp
  • Es un protocolo interno, veloz y que usa conexiones TCP persistentes
  • Funciona en el puerto 8009
Proxy balancer://tomcat_cluster
definimos el cluster con nombre tomcat_cluster
BalancerMember ajp://localhost:8009
Se define un miembro a tomcat_cluster
protocolo ajp
IP localhost' o 127.0.0.1
Puerto 8009 que es el que por defecto usa tomcat
ProxyPass / balancer://tomcat_cluster/
"/" y todo lo que cuelgue de ella, sea pasado al cluster del tomcat para que lo procese él.
Order allow,deny
Especifica el orde de asignación de permisos
Primero las especificaciones de permisos allow all'
Posteriormente restricciones especificadas en la opción deny
  • Si en lugar de ajp queremos usar http deberíamos especificar
 http://localhost:8080/ en lugar de  ajp://localhost:8009

Parte para apache, otra para tomcat

  • Queremos que apache devuelva los contenidos estáticos
  • Estas peticiones deben comenzar por /static/
  • Para que lo haga apache el segundo parámetro de esta directiva debe ser una negación !.

Configuración de virtualhost

  • Debemos modificar el fichero de configuración de virtualhost
  • Editamos /etc/apache2/sites-enabled/000-default
  • Añadimos los siguientes elementos
<Proxy balancer://tomcat_cluster>
Order allow,deny
Allow from all
BalancerMember ajp://localhost:8009
</Proxy>
ProxyPreserveHost On
ProxyPass /phpmyadmin/ !
ProxyPass / balancer://tomcat_cluster/
ProxyPassReverse / balancer://tomcat_cluster/

Conceptos de los parámetros

ProxyPreserveHost On
Mantiene la cabecera http host original, en vez de reescribirla.
  • "DocumentRoot" y "<Directory /var/www/>" para que apunten a /var/www/ROOT

Estructura y despliegue de una aplicación web

Conceptos generales



Icon preknowledge.gif

Conocimiento previo

  1. Fichero de configuración de tomcat ./tomcat/conf/server.xml
  2. Directiva para donde buscar los ficheros de las aplicacioes appBase
  3. Por defecto valor de appBase "webapp"



Elementos de una aplicación web
  1. servlets
  2. páginas jsp
  3. ficheros html,imágenes,texto, css,sonitos, fídels, etc
  • La aplicación se crea en un directorio
  • El directorio debe de colgar en el directorio base de tomcat que cuelga en el indicado en appBase
servlets
aplicación java encargada de realizar un servicio específica dentro de un servidor web
La especificación 2.4 define la estructura de directorios para los ficheros de una aplicación web
Aquí puedes ver el fichero completo de la especificación final Archivo:Javaservletspecivication 2 4.pdf
  • Este podría ser un ejemplo sacado de la propia especificación pág 69-70
/index.html
/howto.jsp
/feedback.jsp
/images/banner.gif
/images/jumping.gif
/WEB-INF/web.xml
/WEB-INF/lib/jspbean.jar
/WEB-INF/classes/com/mycorp/servlets/MyServlet.class
/WEB-INF/classes/com/mycorp/util/MyUtils.class
  • los directorios/ficheros en negrita son obligatorios

Estructura de directorios

  • El directorio raiz contendrá el nombre de la aplicación
  • Todos los ficheros que cuelguen de él se pueden servir al cliente menos los que cuelguen de directorios META-INF y WEB-INF
  • Normalmente después de realizar el desarrollo se empaquetarán en un archivo .war
  • Una estructura de directorios almacenará el código necesario para ejecutar la aplicación.
  • Una aplicación web se estructura en tres capas:

EstructuraTresCapas.png

Archivos War

  • WAR Web Applicatio Archive (Archivo de Aplicación Web)
  • Es una forma de empaquetar en un fichero la estructura de directorios que conforman la aplicación web
  • Por lo tanto contendrá
  1. Servlets y JSP
  2. Contendio estático HTML, css, imágenes
  3. Otros recursos web
  • Facilitan enormemente el despliegue web
  • Su estructura ya vista anteriormente
/
Es la carpeta raiz del proyecto
En el se crean más subdirectorios para organizar la información
Los ficheros aquí ubicados serán accesibles por el cliente
Habrá html, js`, css, imágenes, videos, ...
/WEB/INF/
Elementos de la configuración .WAR web.xml
Suelen estar la página de inicio, ubiciación de los servlets, parámetros
/WEB/INF/clases/
Las clases JAVA empleadas en el archivo .WAR
Suelen encontrarse los servlet
/WEB/INF/lib/
Contiene ficheros jar utilizados por la aplicación
Por ejemplo para contectarse a la base de datos

Creación del fichero .WAR

  • Los entornos de desarrollo tipo Eclipse, NetBeans y otro tipo de IDE (JBuilder, JDeveloper) poseen la opción para ello.
  • Otro modo en mediante Ant herramienta open-source que facilita la contrucción de aplicaciones Java

Haciendo un ejemplo sencillo

  • Realizaremos un sencillo ejemplo para ver el proceso de despliegue
  • Nuestra aplicación tendrá
  1. una página html que me pedirá nombre, apellido y edad
    1. Lo presentará como un formulario
  2. Un servlet que procesará dichos datos
    1. En este caso sólo los tomará y me los visualizará en otra página html que el servidor devolverá al cliente
  3. Necesitamos tener instalado e iniciado el contenedor de servlet (tomcat) éste se informará con un fichero 'wweb.xml de todos los servlets disponibles

Archivo:Xml.png

=Estructura de directorios

WebApp ==> 
      DatosUsuario (datos.html)==>
                         WEB-INF (web.xml)==>
                              clases(ProcesaDatos.class)
                               

http://tomcat.apache.org/tomcat-7.0-doc/proxy-howto.html#Apache_2.0_Proxy_Support

Fichero html

<!--Param.html	Lectura de parámetros con formularios + servlets -->
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
  <HEAD><TITLE>Param.html</TITLE></HEAD>
  <BODY BGCOLOR="#CCCCFF">
  <P></P>
  <H2>Introduce tus datos:</H2><BR>
   <%     
   java.util.Date today = new java.util.Date();     
   out.println("Today's date is: "+today);     
   %>  
    <HR></HR>
    <CENTER>
	 <FORM NAME="FORM1" METHOD="POST"
		ACTION="http://localhost:8080/misServlets/ParamServlet">
	   <TABLE BORDER>
		<TR>
		  <TD><B>Nombre:</TD>
		  <TD><INPUT TYPE=TEXTBOX NAME="NOM" SIZE="25" VALUE=""></TD>
		</TR>
		<TR>
		  <TD><B>Edad:</TD>
		  <TD><INPUT TYPE=TEXTBOX NAME="EDA" SIZE="20" VALUE=""></TD>
		</TR>
	   </TABLE>
	   <P></P>
	   <INPUT TYPE=SUBMIT VALUE="Enviar">
	   <HR></HR>
	   Formulario HTML que invocará a un servlet
         </FORM>
      </CENTER>
  </BODY>
</HTML>
<!DOCTYPE HTML>
<html>
  <head>
     <title>Mi primer despliegue web con servlet</title>
  </head>
  <body>
 ...
 
	 <form name="MisDatos" method="POST"
		ACTION="http://localhost:8080/DatosUsuario/ProcesaDatos">
	   <table border>
		<tr>
		  <td><B>Nombre:</td>
		  <td><input type=TEXTBOX name="NOM" size="25" value=""></TD>
...
 
</html>
  • Se ha hecho una tabla y se ha dado un color de fondo para darle más vistosidad
  • Es importante entender el valor del atributo ACTION

El servlet: ProcesaDatos.java

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
 
public class ParamServlet extends HttpServlet {
 
	private static final long serialVersionUID = 1L;
 
	public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
		// Obtenemos un objeto Print Writer para enviar respuesta
		res.setContentType("text/html");
		PrintWriter pw = res.getWriter();
		pw.println("<HTML><HEAD><TITLE>Leyendo parámetros</TITLE></HEAD>");
		pw.println("<BODY BGCOLOR=\"#CCBBAA\">");
		pw.println("<H2>Leyendo parámetros desde un formulario html</H2><P>");
		pw.println("<UL>\n");
		pw.println("Te llamas " + req.getParameter("NOM") + "<BR>");
		pw.println("y tienes "  + req.getParameter("EDA") + " años<BR>");
		pw.println("</BODY></HTML>");
		pw.close();
	}
}

Referencias

Página donde explica el proceso http://elblogdepicodev.blogspot.com.es/2011/02/unir-apache-httpd-y-tomcat-mediante-un.html