12. J2EE Java 2 Enterprise Edition 316 12. J2EE Java 2 Enterprise Edition define el estándar para el desarrollo de aplicaciones distribuidas en arquitecturas cliente/servidor. Construido sobre la plataforma de Java 2, añade a J2SE la funcionalidad para soportar componentes Enterprise JavaBeans, Java Servlet API, Java Server Pages y XML. David Contreras Bárcena 317
12. J2EE Las aplicaciones J2EE están basadas en componentes: Clientes web, aplicaciones o applets. Componentes web en el servidor: Servlets y JSP. Componentes de negocio en el servidor: EJB. El resto de la documentación se centrará en el desarrollo de componentes web: Servlets y JSP. David Contreras Bárcena 318 12. Servlets Se trata de una tecnología server-side que describe el procesamiento de peticiones y la generación de respuestas desde y hacia un cliente web. Un servlet es una aplicación java, que se ejecuta en un servidor web, capaz de generar una página html como salida. Es la solución JAVA a la programación CGI. Servlets vs. CGI: Eficiencia: Sólo se carga en memoria una copia del programa. Para cada petición se lanza un thread. Potencia: Capaz de dialogar con el Web Server. Portabilidad. David Contreras Bárcena 319
12. Servlets Las peticiones de la página HTML las recoge el Servlet a través de un objeto HttpServletRequest. La página HTML generada como salida, se envía al cliente a través de un objeto HttpServletResponse. El proceso de recogida de los parámetros de entrada (1) y la generación de la página HTML de salida (3) es propio J2EE. El procesamiento (2) puede entenderse como código J2SE. Cliente NAVEGADOR Página HTML Parámetros entrada 1 Página HTML 3 request response SERVLET Servidor WEB Procesamiento 2 David Contreras Bárcena 320 12. Servlets - Estructura Básica import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class MiServlet extends HttpServlet { public void dopost(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException { 1 } 2 String s1 = request.getparameter( nombre ); String s2 = s1.touppercase(); PrintWriter out = response.getwriter(); out.println( <HTML>HOLA, + s2 + </HTML> ); 3 } public void doget(httpservletrequest request,... { this.dopost(request, response); } David Contreras Bárcena 321
12. Servlets - Ejemplo Como la salida de un Servlet es una página HTML, hay que familiarizarse con la estructura básica de una página HTML. <HTML> </HTML> <HEAD> </HEAD> <BODY> </BODY> <TITLE>Mi Servlet</TITLE> <H1>Ejemplo de Servlet</H1> public void dopost(...) { PrintWriter out = response.getwriter(); out.println("<html><head><title>mi Servlet</TITLE></HEAD>); out.println("<body><h1>ejemplo de Servlet</H1></BODY></HTML>"); } David Contreras Bárcena 322 12. JSP (Java Server Pages) JSP es una tecnología server-side que describe el procesamiento de peticiones y la generación de respuestas. Tecnología de script (código embebido en páginas HTML) interpretado en el instante de la solicitud de la página. Todo JSP tiene una conversión en Servlet, por lo que la primera vez que se solicita una página JSP, se compila, y las restantes únicamente se ejecuta. Características: Clara separación entre contenidos estáticos (HTML) y dinámicos (basado en JAVA). Reutilización de componentes y de librerías de etiquetas. Todo código JSP tiene su equivalencia en código XML. En una página JSP pueden convivir las siguientes tecnologías: HTML, DHTML, XML, XHTML, JavaBeans, JAVA,... David Contreras Bárcena 323
12. JSP (Java Server Pages) Desde un punto de vista práctico, las páginas JSP son páginas HTML con código dinámico basado en JAVA. Este código debe especificarse entre etiquetas especiales. La extensión del nuevo fichero resultante debe ser jsp. <P>Hoy hace un <% if (Math.random() < 0.5) { <P>Hoy hace un buen/mal día</p> index.html out.println( buen"); } else { out.println( mal"); } %> día</p> index.jsp David Contreras Bárcena 324 12. JSP (Java Server Pages) Principales etiquetas que delimitan el código embebido: Elemento Expresión Scriptlet Declaración Directiva page Directiva include Comentarios Sináxis <% =expresión %> <% código %> <%! código %> <%@ page atributo= valor %> <%@ include file= url %> <%-- comentarios --%> Equivalente XML <jsp:expresion> <jsp:scriptlet> <jsp:declaration> <jsp:directive.page atributo= valor > <jsp:directive.include file= url > David Contreras Bárcena 325
12. JSP (Java Server Pages) Se puede acceder directamente a las ocurrencias siguientes, ya que están predefinidos por la VM. Objetos predefinidos y clases a las que pertenecen: request (HttpServletRequest) response (HttpServletResponse) out (PrintWriter) session (HttpSession) application (ServletContext) config (ServletConfig) pagecontext (PageContext) <h1>info del cliente</h1><hr> <br>maquina Remota: <%= request.getremotehost() %> <br>protocolo: <%= request.getprotocol() %> <br>metodo: <%= request.getparameter( nombre )%> David Contreras Bárcena 326 12. JSP (Java Server Pages) Atributos de la directiva page: Directiva page <%@ page atributo= valor %> <jsp:directive.page atributo= valor > import="paquete.clase" contenttype="mime-type" isthreadsafe="true false" session="true false" buffer="sizekb none" autoflush="true false" extends=" paquete.clase " info="message" errorpage="url" iserrorpage="true false" language="java" <%@ page import = "java.util.*" %> Fecha: <%= new Date() %> David Contreras Bárcena 327
12. JSP (Java Server Pages) <%@ <%@ page page info= Ejemplo info= Ejemplo de de JSP" JSP" %> %> <%@ <%@ page page import import = "java.util.arraylist" %> %> <html><head></head><body> <% <% Persona Persona p = new new Persona( luis ); Persona( luis ); %> %> <b>persona: <b>persona: </b> </b> <%= <%= p.tostring() p.tostring() %> %> <HR> <HR> <% <% ArrayList ArrayList al al = new new ArrayList ArrayList (); (); al.add("elemento al.add("elemento 1"); 1"); al.add("elemento al.add("elemento 2"); 2"); al.add("elemento al.add("elemento 3"); 3"); out.println("<ol>"); for(int for(int i=0;i<al.size();i++) out.println("<li>" + al.get(i)); al.get(i)); out.println("</ol>"); %> %> <body></html> <body></html> David Contreras Bárcena 328 12. Servidores Para que un servidor web pueda ejecutar servlets y JSP s necesita un contenedor de éstos, compatible con las especificaciones de SUN. La diferencia entre un contenedor web y un servidor de aplicaciones, es que el primero sólo permite la ejecución de Servlets y JSP s, mientras que el segundo, además, permite ejecutar EJB (Enterprise Java Beans), cumpliendo con toda la especificación de J2EE. David Contreras Bárcena 329
12. Implementaciones J2EE Contenedores de servlets/jsp s: Tomcat (Apache Foundation): Implementación de referencia de las especificaciones de Sun.. Jetty. Contenedores de EJB: OpenEJB. Servidores de aplicaciones (J2EE): Sun Java System Application Server Platform. Incluído en la J2EE. JOnAS: Java (TM) Open Application Server. BEA WebLogic. IBM WebSphere. Oracle 9i Application Server. JBoss. (Gratuito) Sybase EAServer Application Server. Borland App Server. Orion. David Contreras Bárcena 330 12. Desarrollo de aplicaciones web con TOMCAT Para el desarrollo de estos Servlets/JSP utilizaremos el contenedor TOMCAT. Acerca de TOMCAT: Ficheros de configuración Archivos WAR Despliegue de aplicaciones David Contreras Bárcena 331
12. Ficheros de configuración context.xml Define parámetros del contexto de la aplicación web. Como se verá más adelante, toda URL especifica los siguientes elementos: http://nombreservidor/nombreaplicacionweb/index.html PROTOCOLO SERVIDOR APLICACIÓN CONTENIDO URI: Identificador Universal de Recursos URL: Localizador Universal de Recursos Permite indicar, entre otras, el nombre de la aplicación web a utilizar en la URL del navegador: http://servidor.com/webapp. David Contreras Bárcena 332 12. Ficheros de configuración web.xml - Deployment Descriptor Fichero utilizado por Tomcat al desplegar la aplicación para la configuración de la aplicación web y para establecer los vínculos necesarios para la ejecución de servlets. Generado automáticamente por todos los IDEs J2EE. Su configuración es muy importante a la hora de invocar programas Java desde la URL. Crea un alias sobre el nombre de la clase del Servlet Define el identificador en la URL para ejecutar el servlet Duración de las sesiones Ficheros de inicio de la aplicación web David Contreras Bárcena 333
12. Ficheros de configuración <welcome-file-list> - página por defecto: Permite cargar una página html o programa Java por defecto al acceder a nuestra aplicación. Al hacer referencia a la URL de nuestra aplicación desde el navegador, http://servidor.com/webapp, se cargará la página index.jsp si existe. Si no, se cargarán las siguientes de la lista. Sería equivalente, por lo tanto, a escribir la URL http://servidor.com/webapp/index.jsp <session-config> - configuración de las sesiones: Permite determinar la caducidad de las sesiones. Pasado el tiempo especificado, expirará. (No se verá en el curso) David Contreras Bárcena 334 12. Ficheros de configuración <servlet> - configuración de los servlets: Permite crear alias sobre el nombre de cada servlet. Muy práctico para evitar hacer referencia al paquete donde se encuentra la clase. Se podrá utilizar la URL http://servidor.com/webapp/app en lugar de escribir http://servidor.com/webapp/obj.app <servlet-mapping> - asociación servlet-url: Permite crear alias sobre la URL del servlet, de esta forma se indica la ruta que permite llegar al servlet. Con la URL http://servidor.com/webapp/app se ejecutará el servlet, aunque no se encuentre físicamente en el directorio raiz del servidor. Si no se crea el mapping, habría que utilizar la URL http://servidor.com/webapp/servlet/app David Contreras Bárcena 335
12. Creación de un fichero WAR Las aplicaciones web se distribuyen en un único fichero comprimido con extensión war (Web ARchive). Se basan en un sistema de compresión ZIP y se crean igual que los JAR. Todos los IDE s J2EE pueden crear estos ficheros de forma automática. Para crearlos manualmente, hay que crear una estructura de directorios (se explica más adelante) y comprimirlo en un fichero ZIP, que se renombrará a WAR, o utilizar la herramienta jar.exe. David Contreras Bárcena 336 12. Utilizando un IDE J2EE (NetBeans) Seleccionando un Proyecto Web, se trabará con la API del J2SE + la especificación de Servlets, En propiedades del proyecto se puede habilitar la opción de generación del WAR. El fichero resultante se almacenará en el directorio dist. En el directorio build se encontrará toda la estructura de directorios que debe tener el archivo war, para su creación manual. src: Fuentes Java. web: páginas html y JSP. ESTRUCTURA DE DIRECTORIOS GENERADA POR NETBEANS David Contreras Bárcena 337
12. Utilizando un IDE J2SE (JCreator) Se deberá modificar el perfil de compilación y añadir la API de la especificación de Servlets, que se encuentrea en el fichero servlet-api.jar. La API la encontremos en el directorio lib de tomcat. Para la generación del fichero WAR, seguir los pasos siguientes. David Contreras Bárcena 338 12. Estructura de un WAR WebApp: Directorio de la Aplicación. Páginas HTML y JSP. Cualquier contenido añadido (imágenes, docs, ) con su correspondiente estructura de directorios. META-INF: context.xml: Información del contexto de la aplicación web. classes: Estructura de paquetes con todas las clases (servlet y el resto). Ej: La clase App se encuentra en el paquete obj. WEB-INF: web.xml: deployment descriptor de la aplicación. Se comprimirá en el fichero ZIP el contenido del directorio WebApp sin incluir a éste. El nombre del fichero, debe coincidir con el de la aplicación. Posteriormente, el fichero ZIP, se debe renombrar a WAR. David Contreras Bárcena 339
12. Despliegue de una aplicación web Para instalar una aplicación web en el contenedor de servlets Tomcat, basta con colocar el fichero WAR en el directorio webapps. El fichero WAR debe tener el nombre de la aplicación web. David Contreras Bárcena 340 12. Despliegue de una aplicación web Una vez copiado el fichero WAR, se deberá iniciará el servidor TOMCAT (script startup.bat) En el arranque del servidor, el fichero WAR se desplegará (descomprimirá) y se tomará toda la información del fichero deployment descriptor: web.xml. A partir de este momento, se podrá visualizar todo el contenido de la aplicación web en el nuevo directorio creado. David Contreras Bárcena 341
12. Despliegue de una aplicación web Se puede verificar el contenido del directorio. Para hacer referencia a la aplicación habrá que utilizar la URL: http://localhost:8080/appweb El número de puerto puede variar con la utilización de algunos IDE s. David Contreras Bárcena 342