UNIVERSIDAD DE LA REPÚBLICA | FACULTAD DE INGENIERÍA | INSTITUTO DE COMPUTACIÓN Taller de Programación Instructivo de uso de Tomcat 1 UNIVERSIDAD DE LA REPÚBLICA | FACULTAD DE INGENIERÍA | INSTITUTO DE COMPUTACIÓN Índice ÍNDICE ......................................................................................................................................... 2 1 ¿CÓMO HACER UNA APLICACIÓN WEB SOBRE TOMCAT? ................................................... 3 1.1 Lineamientos generales .................................................................................................................. 3 1.1.1 Estructura de directorios de una aplicación Web en Tomcat ............................................. 3 1.1.1.1 Páginas ................................................................................................................................ 3 1.1.1.2 Deployment descriptor ..................................................................................................... 3 1.1.1.3 Servlets y otras clases Java................................................................................................ 3 1.1.1.4 Archivos JAR ...................................................................................................................... 4 1.1.2 Aplicaciones Web fuera del directorio webapps .................................................................. 4 1.2 Compilación de Servlets ................................................................................................................ 4 1.3 Modificación de Servlets ................................................................................................................. 4 1.3.1 Reinicio del servidor ................................................................................................................ 4 1.3.2 Utilización del Manager .......................................................................................................... 5 1.3.3 Configuración para autoreload en un contexto .................................................................... 5 1.4 Archivo de deploy: “web.xml” ...................................................................................................... 5 1.4.1 Tag “display-name” ................................................................................................................. 6 1.4.2 Tag “servlet”.............................................................................................................................. 6 1.4.3 Tag “servlet-mapping” ............................................................................................................ 6 1.4.4 Tag “welcome-file-list” ............................................................................................................ 6 2 EJEMPLO “HELLOWORLD” ...................................................................................................... 7 2.1 inicio.html ........................................................................................................................................ 7 2.2 HelloWorld.java ............................................................................................................................... 7 3 CORRIENDO LA APLICACIÓN CREADA EN FING ................................................................... 8 4 REFERENCIAS ............................................................................................................................ 8 2 UNIVERSIDAD DE LA REPÚBLICA | FACULTAD DE INGENIERÍA | INSTITUTO DE COMPUTACIÓN 1 ¿Cómo hacer una aplicación Web sobre Tomcat? 1.1 Lineamientos generales En un servidor Web pueden residir varias aplicaciones simultáneamente. Cada aplicación Web estará compuesta por páginas HTML, páginas JSP, Servlets, otras clases Java y un archivo XML que tiene parámetros de configuración de la aplicación llamado deployment descriptor. La creación de una nueva aplicación requiere crear una determinada estructura de directorios debajo del directorio webapps del Tomcat, tal como se detalla a continuación. 1.1.1 Estructura de directorios de una aplicación Web en Tomcat A continuación se detalla la estructura de directorios que debe tener una aplicación: Observación: “jakarta-tomcat” es el directorio donde se instaló el Tomcat. 1.1.1.1 Páginas Las páginas HTML y JSP deben colocarse en el directorio “MiAplicacionWeb”. Es posible crear subdirectorios dentro dicho directorio para colocar las páginas, siempre y cuando se referencien correctamente desde las otras páginas y Servlets. 1.1.1.2 Deployment descriptor El archivo de deploy “web.xml” debe colocarse dentro del directorio “WEB-INF” de la aplicación. Observación: El archivo de deploy DEBE llamarse exactamente “web.xml” respetando mayúsculas y minúsculas. Lo mismo para el directorio “WEB-INF”. 1.1.1.3 Servlets y otras clases Java Dentro del directorio “WEB-INF/classes” de la aplicación deben colocarse todos los Servlets compilados y opcionalmente las clases Java utilizadas por los diferentes componentes Web (.class) respetando la estructura de packages. El Tomcat crea un class loader separado para cada aplicación Web haciendo visible así todas las clases que se coloquen dentro de este directorio para dicha aplicación, pero no las de ninguna otra. 3 UNIVERSIDAD DE LA REPÚBLICA | FACULTAD DE INGENIERÍA | INSTITUTO DE COMPUTACIÓN 1.1.1.4 Archivos JAR Cualquier librería que se desee utilizar debe colocarse dentro del directorio “WEB-INF/lib”, el cual también se hace visible gracias al class loader que el Tomcat crea para la aplicación. Observación: Tener en cuenta que cualquier clase referenciada desde la aplicación Web debe estar, o bien en uno de estos directorios, o bien en el CLASSPATH de la máquina donde se levanta el servidor, o bien en el directorio “lib” del Tomcat (por más información referirse a [2]). 1.1.2 Aplicaciones Web fuera del directorio webapps Es posible configurar el servidor Web para que tome aplicaciones de otros directorios además de la opción por defecto que es el directorio webapps como se vio anteriormente. Para lograr esto es necesario crear un archivo XML de nombre a elección dentro el directorio “directorio_tomcat_instalado/conf/Catalina/localhost” (con extensión “xml”). Dicho archivo debe definir un “Contexto” para una aplicación Web particular, que entre otras cosas, definirá el directorio de la misma. A modo de ejemplo: <Context reloadable="true" docBase="/ens/home01/n/nombre.apellido/mywebapps/exampleApp"> </Context> El directorio “/ens/home01/n/nombre.apellido/” representa el directorio base de cada usuario “nombre.apellido”. Esto define una aplicación llamada igual que el nombre del archivo de contexto, que se ubicará en el directorio “~/mywebapps/exampleApp” (el ~ representa el home dir de cada usuario “nombre.apellido”). Esto quiere decir, que para esta aplicación particular, dicho directorio jugará el papel del directorio “MiAplicacionWeb” visto en el punto 1.1.1. Por más información acerca de contextos de aplicación ver [5]. 1.2 Compilación de Servlets Antes de compilar los Servlets debe agregarse al CLASSPATH el archivo “directorio_tomcat_instalado/lib/servlet-api.jar”. Luego se compilan como cualquier otra clase Java con “javac”. La razón de esto, es que las APIs de Java Servlets y Java Server Pages son parte de J2EE (Java 2 Plataform, Enterprise Edition), por lo cual no se encuentran en J2SE (Java 2 Plataform, Standard Edition). El archivo “servlet-api.jar” es una biblioteca que viene con el Tomcat e incluye una implementación de estas APIs. 1.3 Modificación de Servlets Las clases que se encuentran dentro del directorio “WEB-INF/classes” (entre ellas los Servlets) pueden ser modificadas como cualquier otra clase simplemente cambiando los “.class” que allí se encuentren. El problema reside en que el Tomcat debe darse cuenta de que han ocurrido cambios de manera de volver a iniciar la aplicación y hacer visibles dichos cambios. A continuación se presentarán algunas de las distintas formas de lograr esto. 1.3.1 Reinicio del servidor La primera opción que se puede utilizar es simplemente bajar y volver a levantar el servidor. Obviamente, si bien esta es una forma segura de lograr el cometido, es también bastante pesada ya que no sólo se tendrá que reiniciar la aplicación en cuestión sino que también se reiniciará 4 UNIVERSIDAD DE LA REPÚBLICA | FACULTAD DE INGENIERÍA | INSTITUTO DE COMPUTACIÓN todo el resto de las aplicaciones y el servidor, lo cual puede llegar a llevar un tiempo significativo para una etapa de desarrollo. 1.3.2 Utilización del Manager El Tomcat contiene una aplicación denominada “Tomcat Web Application Manager”, que está incluida a partir de las versiones 4.x del mismo, y sirve para controlar el resto de las aplicaciones que residen dentro del servidor Web. Este manager, consta de una interfaz gráfica muy sencilla de usar y que puede ser accedida mediante la URL “http://host_del_tomcat:puerto/manager/html”. Gracias a ella es posible agregar, quitar y reiniciar cualquier aplicación sobre el Tomcat sin tener que bajar y levantar el mismo. De esta forma simplemente se tendría que reiniciar la aplicación a la cual se le hicieron cambios, de manera que el servidor vuelva a cargar las clases actualizadas en memoria. Para poder acceder al “Tomcat Web Application Manager” se debe tener un usuario con los permisos adecuados. Para el manejo de permisos, el Tomcat utiliza un sistema de definición de roles y usuarios. Tanto los roles como los usuarios son definidos en el archivo “directorio_tomcat_instalado/conf/tomcat-users.xml”. Existe un rol predefinido llamado “manager” que es el que permite el acceso al “Tomcat Web Application Manager”. Por más información ver [3]. Observación: El último comando de la lista de comandos de cada aplicación, “Replegar”, elimina físicamente toda la aplicación, por lo tanto se recomienda tener cuidado al utilizar dichas operaciones. 1.3.3 Configuración para autoreload en un contexto Como se vio en el punto 1.1.2, es posible definir contextos de ejecución para las aplicaciones Web. En dicho contexto se puede marcar la aplicación como “reloadable”, lo cual quiere decir que el Tomcat estará atento a posibles cambios en el conjunto de clases que conforman la aplicación Web, y en caso de ocurrir alguno, él mismo se encargará de reiniciar dicha aplicación automáticamente. <Context reloadable="true" docBase="/ens/home01/n/nombre.apellido/mywebapps/exampleApp”> </Context> 1.4 Archivo de deploy: “web.xml” Este archivo XML contiene información de configuración de la aplicación Web. Sirve para que el servidor entienda la configuración de la misma. Veremos aquí un ejemplo con algunos de los tags más utilizados y luego se explicará cada uno de ellos (por más información referirse a [6]). <web-app> <display-name>Hello World</display-name> <servlet> <servlet-name>hello-world</servlet-name> <servlet-class>HelloWorld</servlet-class> </servlet> <servlet-mapping> <servlet-name>hello-world</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> <welcome-file-list> 5 UNIVERSIDAD DE LA REPÚBLICA | FACULTAD DE INGENIERÍA | INSTITUTO DE COMPUTACIÓN <welcome-file>/inicio.html</welcome-file> </welcome-file-list> </web-app> 1.4.1 Tag “display-name” Nombre de la aplicación. Este tag indica el nombre desplegado, por ejemplo, en el “Manager” del Tomcat. 1.4.2 Tag “servlet” Este tag declara un Servlet dándole un nombre para poder referenciarlo, por ejemplo, en el tag ”servlet-mapping”. En “servlet-name” se proporciona el nombre (a libre elección) y en “servlet-class” el nombre completo (incluyendo packages) de la clase Java de ese Servlet. 1.4.3 Tag “servlet-mapping” Este tag indica que patrones de URL que atenderá un Servlet en particular. Dicho patrón se indica en el elemento “url-pattern”. El Servlet se indica en “servlet-name” (definido en el tag “servlet”). El contenido del elemento “url-pattern” puede ser cualquiera de los siguientes: Un string comenzado con “/” Un string comenzado con “/” y terminado con “/*” Un string comenzado con “*.” Descripción Macheo exacto. Machea con según el prefijo definido, sin importar la terminación. Machea contra la terminación definida. Un string conteniendo únicamente el carácter “/” Servlet por defecto, machea si ningún otro mapping es aplicable. Ejemplos /actions /actions/* /actions/concrete/* *.do *.all / Por más información referirse a [6]. 1.4.4 Tag “welcome-file-list” En este tag se indica la página de inicio de la aplicación Web, en este caso “inicio.html”. 6 UNIVERSIDAD DE LA REPÚBLICA | FACULTAD DE INGENIERÍA | INSTITUTO DE COMPUTACIÓN 2 Ejemplo “HelloWorld” En esta sección se presenta un ejemplo de una mini aplicación Web llamada “HelloWorld”. El mismo consta de una página y de un Servlet, además del archivo de deploy mostrado en la sección 1.4. La idea es que el Servlet atienda el pedido HTTP que se genera al apretar el botón etiquetado “Use Servlet” de la página. Lo único que hace luego es devolver una página con el mensaje “Hello World!!”. 2.1 inicio.html <html> <head> <title>Taller de programación: HelloWorld</title> </head> <body> <h1>HelloWorld</h1> <form action="hello" method="POST"> <input type="submit" value="Use Servlet"> </form> </body> </html> Observación: Notar que en el tag “form” el atributo “action” tiene valor “hello” que es justamente lo que se configuró que atendiera el Servlet en el archivo de deploy. 2.2 HelloWorld.java import java.io.PrintWriter; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.ServletException; import java.io.IOException; public class HelloWorld extends HttpServlet{ public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ PrintWriter out = response.getWriter(); out.println("Hello World!!"); } } 7 UNIVERSIDAD DE LA REPÚBLICA | FACULTAD DE INGENIERÍA | INSTITUTO DE COMPUTACIÓN 3 Corriendo la aplicación creada en FIng Esto se basa en el ejemplo “HelloWorld” presentado en el punto 2. 1- Compilar el Servlet “HelloWorld.java” según lo explicado en el punto 1.2. 2- Armar la siguiente estructura de directorios con los archivos indicados dentro del directorio webapps: 3- Levantar el servidor Web Tomcat. 4- Abrir un browser e ir al Manager (“http://host_del_tomcat:puerto/manager/html”) con el usuario “tprog” y password “pass”. “host_del_tomcat” indica donde esta hosteado el Tomcat, generalmente va a ser “localhost” pero en caso de problemas en la sala de maquinas de la Fing puede probar sustituirlo “pcunixZZ.fing.edu.uy”, siendo “ZZ” el número de la máquina donde levantó el Tomcat. 5- Verificar que en la lista de aplicaciones aparezca la aplicación creada “HelloWorld”. En caso contrario, en la sección Install (Desplegar) luego de la lista de aplicaciones, escribir “HelloWorld” en el campo etiquetado “WAR or Directory URL” (“URL de WAR o Directorio”) y hacer submit. De esta forma se instala la aplicación. 6- Abrir un browser e ir a la dirección “http://host_del_tomcat:puerto/HelloWorld”. Notar que la página que aparece inicialmente es “inicio.html” como se indicó en el archivo de deploy. Observación 1: Es importante que SIEMPRE recuerden bajar los Tomcat que levanten en la FIng antes de irse porque de otra manera quedará ejecutándose un proceso pesado inútilmente, que solamente ocupará recursos y dificultará el trabajo del resto de los estudiantes. Observación 2: Hay un conjunto de ejemplos de uso de Servlets y JSP’s en las aplicaciones que vienen con la distribución de Tomcat bajo el nombre “examples”. Observación 3: Cuidar el tamaño de los archivos de log generados en el directorio “logs” en la raíz del Tomcat ya que pueden crecer rápidamente y consumir mucha cuota en disco. 4 Referencias [1] [2] [3] [4] [5] [6] Apache Tomcat http://tomcat.apache.org/ Tomcat – Class Loader HOW-TO http://tomcat.apache.org/tomcat-7.0-doc/class-loader-howto.html Tomcat – Web Application Manager HOW-TO http://tomcat.apache.org/tomcat-7.0-doc/manager-howto.html Tomcat – Server Configuration Reference http://tomcat.apache.org/tomcat-7.0-doc/config/index.html Tomcat – Server Configuration Reference – The Context Container http://tomcat.apache.org/tomcat-7.0-doc/config/context.html Java Servlet 2.5 Specification http://jcp.org/aboutJava/communityprocess/mrel/jsr154/index.html 8