J2EE Java 2 Enterprise Edition Es el framework oficial de Java para la construcción de aplicaciones empresariales Es una tecnología basada en componentes Ofrece un modelo para el desarrollo de aplicaciones distribuídas multitiered, la habilidad de reusar componentes, intercambio de datos basado en XML, un manejo de transacciones flexible y un modelo de seguridad unificado Las soluciones J2EE no están atadas a productos ni a interfaces de programación de ningún fabricante
Arquitectura J2EE Se ejecuta en la máquina cliente Aplicación Cliente Páginas HTML Dinámicas Client Tier Se ejecuta en el servidor J2EE Servlets Páginas JSP Web Tier Se ejecuta en el servidor J2EE Enterprise Beans Enterprise Beans Business Tier Se ejecuta en el servidor EIS Base de Datos Base de Datos EIS Tier
Componentes J2EE Las aplicaciones J2EE están formadas por componentes. Componentes Clientes Clientes web Applets Aplicaciones Cliente Componentes Web Servlets Páginas JavaServer Pages (JSP) Componentes de Negocios Entreprise Java Beans Session Beans Entity Beans Message Driven Bean
Componentes J2EE El Cliente Web se comunica con el Business Tier a través de servlets o JSP s Web Browser Páginas Web, Applets Aplicaciones Cliente Servlets Web JSP Tier La Aplicación Cliente se comunica con el Business Tier directamente Business Tier J2EE Server
Contenedores J2EE El servidor J2EE provee servicios en forma de Contenedor para cada tipo de componente Los contenedores son la interface entre la componente y la funcionalidad de bajo nivel que soporta a la componente. El contenedor maneja el ciclo de vida de los servlets y EJB, el Pool de conexiones a la bd, Tipos de contenedores Contenedor EJB: maneja la ejecución de los EJB Contenedor Web: maneja la ejecución de servlets y JSP Contenedor de Applets: maneja la ejecución de applets Contenedor de Aplicaciones Cliente Provistos por el Servidor J2EE Provisto por el Web Browser
Arquitectura de una Aplicación Web Servidor HTTP o Contenedor Web Pedido HTTP Navegador Web Respuesta HTTP Servidor Web (HTTP) Servlets Web Tier EIS Tier Datos Client Tier
Servlets Un servlet es un programa Java que se ejecuta en un servidor. Es un servidor chico, especializado. Los usados más comunmente son los servlets HTTP. Un servlet recibe requerimientos HTTP y devuelve resultados como respuestas HTTP. Los servlets tienen un funcionamiento similar a un applet no visual que se ejecuta en el servidor web. Tiene un ciclo de vida similar al del applet. La API de servlets provee clases e interfaces que realizan servicios. El Contenedor de Servlet, evita que el programador deba ocuparse de la conectividad con la red, capturar los pedidos, producir las respuestas, etc. Tomcat es un Contenedor de Servlets.
Servlet Container El Contenedor de Servlet es el encargado de: Capturar los requerimientos HTTP (traduce los requerimientos en objetos que el servlet entiende) Pasar el requerimiento al servlet (HTTPServletRequest) Devolver las respuestas (HTTPServletResponse) Manejar el ciclo de vida del servlet
Ciclo de vida de un Servlet Servlet Container thread thread Crear Pool de therads Instanciar el Servlet Servlet Requerimiento HTTP (R1) Invocar al método init() Inicialización Requerimiento HTTP (R2) Alocar un thread Invocar al método service() Respuesta HTTP (a R1) Respuesta HTTP (a R2) Alocar un thread Shut down del Contenedor Termina el pool de threads Invocar al método service() Ejecución del servicio Ejecución del servicio Invocar al método destroy() Finaliza la ejecución del servlet() Se liberan recursos Servlet Container finaliza
La interface de programación de Servlets Las clases e interfaces para implementar servlets están agrupadas en dos paquetes: javax.servlet: provee la interface básica de servlets, Servlet javax.servlet.http: provee clases derivadas de la interface Servlet y herramientas específicas para atender requerimientos HTTP
La interfaz Servlet Directa ó indirectamente todos los servlets implementan la interfaz javax.servlet.servlet public interface Servlet public void init (ServletConfig config) throws ServletException public void service(servletrequest req, ServletResponse res) throws ServletException, IOException public void destroy() public ServletConfig getservletconfig() public String getservletinfo() Generalmente, para implementar servlets se extienden las clases javax.servlet.genericservlet ó javax.http.httpservlet
Las clases GenericServlet y HttpServlet public abstract class GenericServlet implements Servlet, ServletConfig, Serializable La clase Generic Servlet provee una implementación básica de la interfaz Servlet. Está contenida en el paquete javax.servlet. Es una clase abstracta. Esto se debe a que el método service() es abstracto, por lo tanto cualquier clase que extienda esta clase debe implementar el método service(). public class HttpServlet extends GenericServlet La clase HttpServlet provee una implementación específica para HTTP de la interfaz Servlet. Es la clase que implementan la mayoría de los servlets. Está contenida en el paquete javax.servlet.http. protected void service(httpservletrequest req, HttpServletResponse res) throws ServletException, IOException public void service(servletrequest req, ServletResponse res) throws ServletException, IOException
La interfaz HttpServletRequest public abstract interface HttpServletRequest extends javax.servlet.servletrequest public String getparameter(string key) Devuelve el valor de un parámetro con la clave dada. Si hay múltiples valores para esa parámetro, devuelve el primero. public String[] getparametervalues(string key) Devuelve todos los valores del parámetro con la clave dada (en el caso de un CHECKBOX, devuelve los valores de todos los ítems seleccionados). public Enumaration getparameternames() Devuelve una lista con todos los nombres de los parámetros del requerimiento.
La interfaz HttpServletResponse public abstract interface HttpServletRequest extends javax.servlet.servletresponse public void setcontenttype(string type) Antes de devolver la respuesta, se debe invocar a este método para setear el tipo MIME de la respuesta Http. public PrintWriter getwriter() throws IOException El objeto PrintWriter que devuelve, es usado por el servlet para escribir la respuesta como texto. public ServletOutPutStream getoutputstream() throws IOException El objeto ServletOutPutStream (subclase de java.io.outputstream) es usado para enviar al cliente datos binarios. public void setheader(string name, String value)
Servlet Hola Mundo import javax.servlet.*; import javax.servlet.http.*; Clases Java que proveen el soporte para servlets import java.io.*; Todos los servlets deben implementar la interfaz Servlet para poder funcionar como servlets. Es posible extender la clase HttpServlet. public class HolaMundo extends HttpServlet; { public void doget (HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { res.contenttype( text/html ); PrintWriter out=res.getwriter(); out.println( <HTML> ); out.println( <HEAD> ); out.println( <TITLE> Hola Mundo </TITLE> ); out.println( </HEAD> ); out.println( <BODY> ); out.println( <CENTER> <H1> Hola Mundo! </H1> </CENTER> ); out.println( </BODY> ); out.println( </HTML> ); Se abre un outputsream para devolver los resultados al browser Codificación de la salida } } out.close(); Envío de la respuesta al browser
Ejemplo <HTML> <HEAD> </HEAD> <BODY> <TITLE>Departamento de Informática </TITLE> <FORM ACTION= http://localhost:8080/servlet/soportetecnico METHOD= POST > <CENTER> <H1>Formulario de Pedido de Soporte Técnico </H1> <HR> <BR> <TABLE ALIGN= center WIDTH= 100% CELLSPACING= 2 CELLPADDING= 2 > <TR> <TD ALIGN= right >Nombre: </TD> <TD><INPUT TYPE= Text NAME= txtnombre ALIGN= LEFT SIZE= 15 ></TD> <TD ALIGN= right >Apellido: </TD> <TD><INPUT TYPE= Text NAME= txtapellido ALIGN= LEFT SIZE= 15 ></TD> </TR> <TR><TD ALIGN= right >Email: </TD> <TD><INPUT TYPE= Text NAME= txtmail ALIGN= LEFT SIZE= 25 ></TD> <TD ALIGN= right >Teléfono: </TD> <TD><INPUT TYPE= Text NAME= txttel ALIGN= LEFT SIZE= 15 ></TD></TR> <TR><TD ALIGN= right >Software: </TD> <TD><SELECT NAME= soft SIZE= 1 > <OPTION VALUE= Word >Microsoft Word </OPTION> <OPTION VALUE= Excel >Microsoft Excel </OPTION> <OPTION VALUE= Access >Microsoft Access </OPTION></SELECT></TD> <TD ALIGN= right >Sistema Operativo: </TD> <TD><SELECT NAME= os SIZE= 1 > <OPTION VALUE= 95 >Windows 95 </OPTION> <OPTION VALUE= 98 > Windows 98 </OPTION> <OPTION VALUE= NT > Windows NT </OPTION></SELECT></TD></TR> </TABLE> </CENTER> <BR>Descripción del Problema: <BR><TEXTAREA NAME= txtproblema COLS= 50 ROWS= 4 ></TEXTAREA> <HR> <BR> <CENTER> <INPUT TYPE= Submit NAME= enviar VALUE= Enviar Datos > </CENTER></FORM></BODY></HTML> Formulario HTML
Ejemplo import javax.servlet.*; import javax.servlet.http.*; import java.io.*; import java.util.*; import sun.net.smtp.smtpclient; public class SoporteTecnico extends HttpServlet; { String message, msgfrom, msgto, msgsubject; public void dopost(httpservletrequest req, HttpServletResponse res) throws ServletException, IOException { res.contenttype( text/html ); PrintWriter out=res.getwriter(); Se abre un outputsream para armar la respuesta del browser getparameters(req); Invoca sucesivamente al getparameter() sobre el objeto req y recupera todos los datos del formulario en la variable message if (! sendmail()) { res.senderror(res.sc_internal_server_error, Error de acceso al servidor de correo ); return; }... out.close(); Envía la respuesta al browser } Servlet Reporta un error al browser public void getparameters (HttpServletRequest req) throws ServletException, IOException { StringBuffer tempstringbuffer =new StringBuffer(1024); msgsubject= Requerimiento de soporte técnico ; msgto= claudiaq@info.unlp.edu.ar ; msgfrom=req.getparameter( txtmail ); tempstringbuffer.append( From: ); tempstringbuffer.append(req.getparameter( txtnombre )); tempstringbuffer.append( ); tempstringbuffer.append(req.getparameter( txtapellido )); tempstringbuffer.append( \n );... message=tempstringbuffer.tostring(); } public void sendmail () { PrintStream out; SmtClient send; } } try { send=new SmtClient( info.unlp.edu.ar ); send.from(msgfrom); send.to(msgto); out=send.startmessage(); out.println( From: +msgfrom); out.println(to: +msgto); out.println( Subject: +msgsubject); out.println( \n-----------------------\n ); out.println(message);... out.flush(); out.close(); send.closeserver(); } catch (IOException e) { log ( Error al enviar el mail, e); return false; } return true; Servlet