Diferencia entre revisiones de «Usuario:ManuelRomero/modulo TOMCAT»

De WikiEducator
Saltar a: navegación, buscar
(El servlet: ProcesaDatos.java=)
(Página reemplazada por '{{:Usuario:ManuelRomero/micursos/Tomcat/nav}} <br>')
 
(21 revisiones intermedias por el mismo usuario no mostrado)
Línea 1: Línea 1:
=Aplicaciones Web =
+
{{:Usuario:ManuelRomero/micursos/Tomcat/nav}}
;Definición de aplicación web
+
<br>
: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''''')
+
#Hace un extensivo del contenido dinámico
+
#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
+
<source lang=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>");
+
    }
+
}
+
</source>
+
*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
+
<source lang=html4strict>
+
<html>
+
<body>
+
<% out.println("Hola mundo"); %>
+
</body>
+
</html>
+
</source>
+
 
+
===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/
+
[[Imagen: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
+
[[Imagen:paginaTomcat.png]]
+
===Iniciando Tomcat===
+
*Por defecto '''''tomcat'''''
+
#puerto '''''8080'''''
+
#directorio ./tomcat/webapps/ROOT
+
*Por defecto '''''apache'''''
+
#puerto '''''80'''''
+
#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''
+
#localizamos el elemenot '''''host'''''
+
#modificamos el atributo '''''appBase'''''
+
<source lang=xml>
+
<Host name="localhost" appBase="/var/www"
+
</source>
+
=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
+
#Si es una solicitud web estática o php la resuelve apache
+
#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
+
[[Archivo: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
+
#ProxyPass
+
#ProxyPassReverse
+
#ProxyRequests
+
#ProxyPreserveHost.
+
===ProxyPass===
+
*Esta directiva tiene dos parámetros
+
#El primero Indicamos las URL que delegamos (/)
+
#El segundo el servidor de aplicaciones que atenderá la solicitud
+
#En nuestro caso especificamos tomcat_cluster  que está definido previamente
+
<source lang=xml>
+
<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
+
;<nowiki>Proxy balancer://tomcat_cluster</nowiki>
+
:definimos el cluster con nombre '''''tomcat_cluster'''''
+
;<nowiki>BalancerMember ajp://localhost:8009</nowiki>
+
: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''
+
;<nowiki>ProxyPass / balancer://tomcat_cluster/</nowiki>
+
:"/" 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
+
 
+
 
+
Para que el servidor web devuelva los contenidos estáticos de la aplicación debemos indicarle a Apache que las peticiones que empiecen por /static/ no las delegue en el servidor de aplicaciones sino que las procese él, esto lo conseguimos con la directiva ProxyPass pero donde pondríamos la dirección del servidor de aplicaciones ponemos un !. En el siguiente ejemplo de configuración para Apache he definido un host virtual basado en nombres.
+
===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
+
<source lang=xml>
+
<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/
+
</source>
+
===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===
+
*Elementos de una aplicación web
+
#servlets
+
#páginas jsp
+
#ficheros html,imágenes,texto, css,sonitos, fídels, etc
+
;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 en negrita serían 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:
+
[[Imagen:EstructuraTresCapas.png ]]
+
===Archivos War===
+
*WAR '''''W'''''eb '''''A'''''pplicatio '''''A'''''rchive ''(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á
+
#Servlets y JSP
+
#Contendio estático HTML, css, imágenes
+
#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á
+
#una página html que me pedirá nombre, apellido y edad
+
##Lo presentará como un formulario
+
#Un servlet que procesará dichos datos
+
##En este caso sólo los tomará y me los visualizará en otra página html que el servidor devolverá al cliente
+
#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===
+
 
+
<!--
+
<!DOCTYPE HTML>
+
<html>
+
  <HEAD><TITLE>Mi primer despliegue web con servlet</TITLE></HEAD>
+
  <BODY BGCOLOR="#CCCCFF">
+
  <P></P>
+
  <H2>Inserta tus datos:</H2><BR>
+
    <HR></HR>
+
    <CENTER>
+
<FORM NAME="FORM1" 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>
+
</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>
+
-->
+
<source lang=html4strict>
+
<!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>
+
</source>
+
*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====
+
 
+
 
+
===Referencias===
+
Página donde explica el proceso
+
http://elblogdepicodev.blogspot.com.es/2011/02/unir-apache-httpd-y-tomcat-mediante-un.html
+

Última revisión de 09:52 24 nov 2012