Guía de Cliente Servidor Codigo

Embed Size (px)

Citation preview

  • 8/18/2019 Guía de Cliente Servidor Codigo

    1/38

    GUÍA DE CLIENTE SERVIDOR

    Programación paso a paso.

    CONCEPTOS PREVIOS.

    Generación de páginas en forma dinámica utilizando Apache Tomcat®.

    El servidor Tomcat es una aplicación web basada en ava creada para e!ecutar servlets "páginas #P$ siendo la implementación o%cial de referencia de las especi%caciones #ervlet &.' " ava#erver Pages (.&.

     Java Servelt.  )os servlets son ob!etos *ue corren dentro " fuera del conte+to deun contenedor de servlets ,e!-  Tomcat " e+tienden su funcionalidad.

    )a palabra servlet  deriva de otra anterior$ applet $ *ue se refer/a a pe*ue0os programas *ue see!ecutan en el conte+to de un navegador web. Por contraposición$ un servlet  es un programa*ue se e!ecuta en un servidor.

    El uso más com1n de los servlets es generar todas páginas web de forma dinámica a partir delos parámetros de la petición *ue env/e el navegador web.

    Aspectos técncos2n servlet es un ob!eto *ue se e!ecuta en un servidor o contenedor EE$ especialmentedise0ado para ofrecer contenido dinámico desde un servidor web$ generalmente 3T4). 5trasopciones *ue permiten generar contenido dinámico son los lengua!es A#P$ P3P$  #P ,un casoespecial de servlet$ 6ub" " P"thon. 7orman parte de EE ,ava Enterprise Edition$ *ue es unaampliación de #E ,ava #tandard Edition.

    2n servlet  implementa la interfaz  !ava+.servlet.#ervlet o hereda alguna de las clases másconvenientes para un protocolo espec/%co ,e!- !ava+.servlet.3ttp#ervlet. Al implementar esta

    interfaz el servlet es capaz de interpretar los ob!etos detipo 3ttp#ervlet6e*uest " 3ttp#ervlet6esponse *uienes contienen la información de la página*ue invocó al servlet .

    Entre el servidor de aplicaciones ,o web content " el servlet  e+iste un contrato *ue determinacómo han de interactuar. )a especi%cación de 8ste se encuentra en los #6 ,ava #peci%cation6e*uests del 9P , ava 9ommunit" Process.

    :escriptor de despliegueEl descriptor de despliegue es un archivo *ue se localiza en el directorio ;E?7 " sellama web.+ml. En 8l es donde se controla el comportamiento de los #ervlet " páginas #P.

    E!emplo sencillo de un :escriptor de despliegue

    !"#$l version@(.B encoding@2T7=C"%!&e'(app  version@'.B  +mlns@[email protected]'.orgD&BB(D4)#chema=instance  

    +si-schema)ocation@http-DD!ava.sun.comD+mlDnsD!avaeehttp-DD!ava.sun.comD+mlDnsD!avaeeDweb=appF'FB.+sd%  !servlet%  !servlet(na$e%3ola4undo#ervlet!)servlet(na$e%  !servlet(class%org.pruebas.3ola4undo#ervlet!)servlet(class%  !)servlet%  !servlet($appn*%  !servlet(na$e%3ola4undo#ervlet!)servlet(na$e%  !+rl(pattern%D3ola4undo#ervlet!)+rl(pattern%  !)servlet($appn*%

      !sesson(con,*%  !sesson(t$eo+t%'B!)sesson(t$eo+t%  !)sesson(con,*%

    (

    http://es.wikipedia.org/w/index.php?title=Contenedor_de_servlets&action=edit&redlink=1http://es.wikipedia.org/w/index.php?title=Contenedor_de_servlets&action=edit&redlink=1http://es.wikipedia.org/wiki/Tomcathttp://es.wikipedia.org/wiki/Tomcathttp://es.wikipedia.org/wiki/Applethttp://es.wikipedia.org/wiki/Java_EEhttp://es.wikipedia.org/wiki/HTMLhttp://es.wikipedia.org/wiki/Active_Server_Pageshttp://es.wikipedia.org/wiki/PHPhttp://es.wikipedia.org/wiki/PHPhttp://es.wikipedia.org/wiki/PHPhttp://es.wikipedia.org/wiki/JavaServer_Pageshttp://es.wikipedia.org/wiki/JavaServer_Pageshttp://es.wikipedia.org/wiki/Rubyhttp://es.wikipedia.org/wiki/Pythonhttp://es.wikipedia.org/wiki/Java_EEhttp://es.wikipedia.org/wiki/Java_SEhttp://es.wikipedia.org/wiki/Interfaz_(Java)http://java.sun.com/j2ee/1.4/docs/api/javax/servlet/package-summary.htmlhttp://es.wikipedia.org/wiki/Java_Community_Processhttp://es.wikipedia.org/wiki/Descriptor_de_desplieguehttp://es.wikipedia.org/wiki/JSPhttp://es.wikipedia.org/wiki/JSPhttp://es.wikipedia.org/wiki/Tomcathttp://es.wikipedia.org/wiki/Applethttp://es.wikipedia.org/wiki/Java_EEhttp://es.wikipedia.org/wiki/HTMLhttp://es.wikipedia.org/wiki/Active_Server_Pageshttp://es.wikipedia.org/wiki/PHPhttp://es.wikipedia.org/wiki/JavaServer_Pageshttp://es.wikipedia.org/wiki/Rubyhttp://es.wikipedia.org/wiki/Pythonhttp://es.wikipedia.org/wiki/Java_EEhttp://es.wikipedia.org/wiki/Java_SEhttp://es.wikipedia.org/wiki/Interfaz_(Java)http://java.sun.com/j2ee/1.4/docs/api/javax/servlet/package-summary.htmlhttp://es.wikipedia.org/wiki/Java_Community_Processhttp://es.wikipedia.org/wiki/Descriptor_de_desplieguehttp://es.wikipedia.org/wiki/JSPhttp://es.wikipedia.org/w/index.php?title=Contenedor_de_servlets&action=edit&redlink=1

  • 8/18/2019 Guía de Cliente Servidor Codigo

    2/38

    !)&e'(app%

    Cclo -e v-aEl ciclo de vida de un #ervlet se divide en los siguientes puntos-El cliente solicita una petición a un servidor v/a 26).El servidor recibe la petición.#i es la primera$ se utiliza el motor de #ervlets para cargarlo " se llama al m8todo init,.#i "a está iniciado$ cual*uier petición se convierte en un nuevo hilo. 2n #ervlet puede mane!ar

    m1ltiples peticiones de clientes.#e llama al m8todo service, para procesar la petición devolviendo el resultado al cliente.9uando se apaga el motor de un #ervlet se llama al m8todo destro",$ *ue lo destru"e " liberalos recursos abiertos.

    Clases o'/etos necesarosPodemos crear un #ervlet haciendo uso del pa*uete  !ava+.servlet.

    Inter0ace 1ttpServletRe2+est#igue este enlace para ver su de%nición detallada ,eningl8s- http-DD!ava.sun.comD!&eeDsdF(.'DtechdocsDapiD!ava+DservletDhttpD3ttp#ervlet6e*uest.html

    Inter0ace 1ttpServletResponse#igue este enlace para ver su especi%cación detallada ,eningl8s- http-DD!ava.sun.comD!&eeDsdF(.'DtechdocsDapiD!ava+DservletDhttpD3ttp#ervlet6esponse.html

    3ene,cos -e +tl4ar Servlets en l+*ar -e CGI#on más e%cientes " utilizan menos recursos. 9G> utiliza un nuevo proceso por cada petición.En cambio en los #ervlets sólo e+iste una copia cargada en la má*uina virtual " por cadapetición se inicia un hilo$ lo cual reduce el uso de memoria del servidor " el tiempo derespuesta. Tienen persistencia$ por lo *ue siguen vivos una vez terminada la petición.

    E/e$plo9ódigo de e!emplo de un #ervlet *ue procesa una petición GET " devuelve una páginaweb 3T4) sencilla-pac5a*e org.pruebasH $port  !ava.io.>5E+ceptionH$port  !ava.io.Print;riterH$port  !ava+.servlet.#ervletE+ceptionH$port  !ava+.servlet.http.3ttp#ervletH$port  !ava+.servlet.http.3ttp#ervlet6e*uestH$port  !ava+.servlet.http.3ttp#ervlet6esponseH p+'lc class 3ola4undo#ervlet e#ten-s 3ttp#ervlet I

      /**

      * Servlet de ejemplo que procesa una petición GET   * @param request   * @param response  * @throws ServletException  * @throws IOException

    */   J5verride  p+'lc  vo-  doGet,3ttp#ervlet6e*uest re*uest$ 3ttp#ervlet6esponse response  t6ro&s#ervletE+ception$ >5E+ception I  Print;riter out @ response.get;riter,H  out.println,KL:59TMPE 3T4) P29 78=DD;'9DD:T: 3T4) N.B TransitionalDDE?78OH  out.println,KhtmlOH  out.println,KheadOKtitleOE!emplo 3ola 4undoKDtitleOKDheadOH  out.println,Kbod"OH

    &

    http://es.wikipedia.org/wiki/URLhttp://es.wikipedia.org/wiki/Paquete_Javahttp://es.wikipedia.org/wiki/Paquete_Javahttp://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/servlet/http/HttpServletRequest.htmlhttp://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/servlet/http/HttpServletRequest.htmlhttp://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/servlet/http/HttpServletResponse.htmlhttp://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/servlet/http/HttpServletResponse.htmlhttp://es.wikipedia.org/wiki/CGIhttp://es.wikipedia.org/wiki/M%C3%A1quina_virtual_Javahttp://es.wikipedia.org/wiki/Hypertext_Transfer_Protocolhttp://es.wikipedia.org/wiki/HTMLhttp://es.wikipedia.org/wiki/HTMLhttp://es.wikipedia.org/wiki/URLhttp://es.wikipedia.org/wiki/Paquete_Javahttp://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/servlet/http/HttpServletRequest.htmlhttp://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/servlet/http/HttpServletRequest.htmlhttp://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/servlet/http/HttpServletResponse.htmlhttp://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/servlet/http/HttpServletResponse.htmlhttp://es.wikipedia.org/wiki/CGIhttp://es.wikipedia.org/wiki/M%C3%A1quina_virtual_Javahttp://es.wikipedia.org/wiki/Hypertext_Transfer_Protocolhttp://es.wikipedia.org/wiki/HTML

  • 8/18/2019 Guía de Cliente Servidor Codigo

    3/38

      out.println,Kh(O3ola 4undoLKDh(OH  out.println,KDbod"OKDhtmlOH  QQ

    DI9ERENCIAS ESTRE LAS TECNOLOGIAS CGI : SERVLET)a tecnolog/a #ervlet proporciona las mismas venta!as del lengua!e ava en cuanto aportabilidad ,Rwrite once$ run an"whereS " seguridad$ "a *ue un #ervlet es una clase de ava

    igual *ue cual*uier otra$ " por tanto tiene en ese sentido todas las caracter/sticas del lengua!e$Esto es algo de lo *ue carecen los programas 9G>$ "a *ue ha" *ue compilarlos para el sistemaoperativo del servidor " no disponen en muchos casos de t8cnicas de comprobación dinámicade errores en tiempo de e!ecución.5tra de las principales venta!as de los #ervlets con respecto a los programas 9G>$ es la delrendimiento " esto a pesar de *ue !ava no es un lengua!e particularmente rápido$ 4ientras *uees necesario cargar los programas 9G> tantas veces como peticiones del servicio e+istan porparte de los clientes$ los #ervlets$ una vez *ue son llamados por primera vez$ *uedan activosen la memoria del servidor hasta *ue el programa *ue controla el servidor los desactiva. :eesta manera se minimiza en gran medida el tiempo de respuesta.Además$ los #ervlets se bene%cian de la gran capacidad de ava para e!ecutar m8todos enordenadores remotos$ para conectar bases de datos$ para la seguridad de la información$ ect.#e podr/a decir *ue las clases estándar de ava ofrecen resueltos muchos problemas *ue conotros lengua!es tiene *ue resolver el programador.

     Java EE. Java Plat0or$; Enterprse E-ton o Java EE ,anteriormente conocido como ava & Platform$Enterprise Edition o &EE hasta la versión (.N$ es una plataforma de programaciónparte dela Plataforma avapara desarrollar " e!ecutar software de aplicaciones en el lengua!e deprogramación ava con ar*uitectura de ? capas distribuidas " *ue se apo"a ampliamente encomponentes de software modulares e!ecutándose sobre un servidor de aplicaciones. )aplataforma ava EE está de%nida por una especifcación. #imilar a otras especi%cacionesdel ava 9ommunit" Process$ ava EE es tambi8n considerada informalmente como un estándardebido a *ue los proveedores deben cumplir ciertos re*uisitos de conformidad para declarar*ue sus productos son conormes a Java EEH estandarizado por The ava 9ommunit" Process D

     9P. ava EE tiene varias especi%caciones de AP>$ tales como :$ e=mail$ 4#$ #ervicios;eb$ 4)$ etc " de%ne cómo coordinarlos. ava EE tambi8n con%gura algunas especi%caciones1nicas para ava EE para componentes. Estas inclu"en Enterprise ava

  • 8/18/2019 Guía de Cliente Servidor Codigo

    4/38

    #l API J$%& se presenta como una colección de inter'aces Java ( m)todos de gestión de manejadores de

    cone*ión +acia cada modelo espec'ico de base de datos" -n manejador de cone*iones +acia un modelo de

    base de datos en particular es un conjunto de clases queimplementan las inter'aces Java ( que utilizan los

    m)todos de registro para declarar los tipos de localizadores a base de datos . -/!0 que pueden manejar"

    Para utilizar una base de datos particular, el usuario ejecuta su programa junto con la biblioteca de cone*ión

    apropiada al modelo de su base de datos, ( accede a ella estableciendo una cone*ión, para ello provee el

    localizador a la base de datos ( los parámetros de cone*ión espec'icos" A partir de all puede realizar concualquier tipo de tareas con la base de datos a las que tenga permiso consulta, actualización, creación,

    modi'icación ( borrado de tablas, ejecución de procedimientos almacenados en la base de datos, etc"

    Pa2+ete /ava.s2l

     :A2.5bligar a *ue ciertas clases utilicen los mismos m8todos ,nombres " parámetros.Establecer relaciones entre clases *ue no est8n relacionadas.

    Uso ava proporciona dos palabras reservadas para traba!ar con interfaces- interface e implements.Para declarar una interfaz se utiliza-

      modi%cadorFacceso nter0ace ?ombre>nterfaz I  ....  Q

    N

    http://es.wikipedia.org/wiki/Interfaz_(Java)http://es.wikipedia.org/w/index.php?title=Implementaci%C3%B3n_de_interfaz_Java&action=edit&redlink=1http://es.wikipedia.org/w/index.php?title=Implementaci%C3%B3n_de_interfaz_Java&action=edit&redlink=1http://es.wikipedia.org/wiki/URLhttp://es.wikipedia.org/wiki/Procedimientos_almacenadoshttp://es.wikipedia.org/wiki/Base_de_datoshttp://es.wikipedia.org/wiki/Base_de_datoshttp://es.wikipedia.org/wiki/Base_de_datoshttp://es.wikipedia.org/wiki/Base_de_datoshttp://es.wikipedia.org/w/index.php?title=SQL_Access_Group&action=edit&redlink=1http://es.wikipedia.org/wiki/Sistema_de_gesti%C3%B3n_de_bases_de_datoshttp://es.wikipedia.org/wiki/Sistema_de_gesti%C3%B3n_de_bases_de_datoshttp://es.wikipedia.org/wiki/Sistema_de_gesti%C3%B3n_de_bases_de_datoshttp://es.wikipedia.org/w/index.php?title=SAG_(Base_de_datos)&action=edit&redlink=1http://es.wikipedia.org/wiki/SQLhttp://es.wikipedia.org/wiki/Base_de_datoshttp://es.wikipedia.org/wiki/Base_de_datoshttp://es.wikipedia.org/wiki/DSNhttp://es.wikipedia.org/wiki/Java_Database_Connectivityhttp://es.wikipedia.org/wiki/Interfaz_de_programaci%C3%B3n_de_aplicacioneshttp://es.wikipedia.org/wiki/Interfaz_de_programaci%C3%B3n_de_aplicacioneshttp://es.wikipedia.org/wiki/Interfaz_de_programaci%C3%B3n_de_aplicacioneshttp://es.wikipedia.org/wiki/Java_(lenguaje_de_programaci%C3%B3n)http://es.wikipedia.org/wiki/Java_(lenguaje_de_programaci%C3%B3n)http://es.wikipedia.org/wiki/Java_(lenguaje_de_programaci%C3%B3n)http://es.wikipedia.org/wiki/Java_(lenguaje_de_programaci%C3%B3n)http://es.wikipedia.org/wiki/Interfaz_(Java)http://es.wikipedia.org/w/index.php?title=Implementaci%C3%B3n_de_interfaz_Java&action=edit&redlink=1http://es.wikipedia.org/wiki/URLhttp://es.wikipedia.org/wiki/Procedimientos_almacenadoshttp://es.wikipedia.org/wiki/Base_de_datoshttp://es.wikipedia.org/wiki/Base_de_datoshttp://es.wikipedia.org/wiki/Base_de_datoshttp://es.wikipedia.org/wiki/Base_de_datoshttp://es.wikipedia.org/w/index.php?title=SQL_Access_Group&action=edit&redlink=1http://es.wikipedia.org/wiki/Sistema_de_gesti%C3%B3n_de_bases_de_datoshttp://es.wikipedia.org/wiki/Sistema_de_gesti%C3%B3n_de_bases_de_datoshttp://es.wikipedia.org/w/index.php?title=SAG_(Base_de_datos)&action=edit&redlink=1http://es.wikipedia.org/wiki/SQLhttp://es.wikipedia.org/wiki/Base_de_datoshttp://es.wikipedia.org/wiki/Base_de_datoshttp://es.wikipedia.org/wiki/DSNhttp://es.wikipedia.org/wiki/Java_Database_Connectivityhttp://es.wikipedia.org/wiki/Interfaz_de_programaci%C3%B3n_de_aplicacioneshttp://es.wikipedia.org/wiki/Interfaz_de_programaci%C3%B3n_de_aplicacioneshttp://es.wikipedia.org/wiki/Java_(lenguaje_de_programaci%C3%B3n)http://es.wikipedia.org/wiki/Java_(lenguaje_de_programaci%C3%B3n)http://es.wikipedia.org/wiki/Java_(lenguaje_de_programaci%C3%B3n)

  • 8/18/2019 Guía de Cliente Servidor Codigo

    5/38

    modifcador_acceso puede ser public o no e+istir$ siendo entonces por defecto pacage. )osatributos *ue de%namos en el cuerpo de la interfaz serán atributos de tipo constante en lasclases en las *ue se implemente.Para implementarla en una clase$ se utiliza la forma-  modi%cadorFacceso ?ombre9lase $ple$ents ?ombre>nterfaz( X$ ?ombre>nterfaz&Y2na clase puede implementar varias interfaces$ separando los nombres por comas.

    E!emplo

    :e%nición de una interfaz-  nter0ace ?ave I   //public static fnal int VIDA = 1! por defnición todos los atributos de una interace son p"blicos # est$ticos   // por ese motivo es redundante aun%ue si se escribe no genera ning"n tipo de error  

    ,nal nt Z>:A @ (BBH 

    p+'lc a'stract vo- moverPosicion ,nt +$ nt "H  p+'lc a'stract vo- disparar,H  .....  Q2so de la interfaz de%nida-  p+'lc class ?aveugador $ple$ents ?ave I  p+'lc vo- moverPosicion ,nt +$ nt "I   //Implementación del m&todo  Q 

    p+'lc vo- disparar,I   //Implementación del m&todo  Q 

    .....  QIntro-+cc>n a los Servlets

    )os #ervlets son módulos *ue e+tienden los servidores orientados a petición=respuesta$ comolos servidores web compatibles con ava. Por e!emplo$ un servlet podr/a ser responsable detomar los datos de un formulario de entrada de pedidos en 3T4) " aplicarle la lógica denegocios utilizada para actualizar la base de datos de pedidos de la compa0ia.

    )os #ervlets son para los servidores lo *ue los applets son para los navegadores. #in embargo$al contrario *ue los applets$ los servlets no tienen interface grá%co de usuario.)os servelts pueden ser incluidos en muchos servidores diferentes por*ue el AP> #ervlet$ el *uese utiliza para escribir #ervlets$ no asume nada sobre el entorno o protocolo del servidor. )osservlets se están utilizando ampliamente dentro de servidores 3TTPH muchos servidores ;ebsoportan el AP> #ervlet.

    ESTRUCTURA 3?SICA DE UN SERVLETA*u/ tenemos un servlet básico *ue mane!a peticiones GET. )as peticiones GET$ para a*uellos*ue no estemos familiarizados con 3TTP$ son peticiones hechas por el navegador cuando elusuario teclea una 26) en la l/nea de direcciones$ sigue un enlace desde una página ;eb$ orellena un formulario *ue no especi%ca un 4ET35:. )os #ervlets tambi8n pueden mane!arpeticiones P5#T mu" fácilmente$ *ue son generadas cuando alguien crea un formulario 3T4)*ue especi%ca 4ET35:@P5#T. )os discutiremos en una sección posterior.

    import !ava.io.UHimport !ava+.servlet.UHimport !ava+.servlet.http.UH

    [

    http://jserv.javasoft.com/products/java-server/servlets/environments.htmlhttp://jserv.javasoft.com/products/java-server/servlets/environments.htmlhttp://jserv.javasoft.com/products/java-server/servlets/environments.htmlhttp://jserv.javasoft.com/products/java-server/servlets/environments.html

  • 8/18/2019 Guía de Cliente Servidor Codigo

    6/38

    public class #ome#ervlet e+tends 3ttp#ervlet I  public void doGet,3ttp#ervlet6e*uest re*uest$  3ttp#ervlet6esponse response  throws #ervletE+ception$ >5E+ception I 

    DD 2se re*uest to read incoming 3TTP headers ,e.g. cooies  DD and 3T4) form data ,e.g. data the user entered and submitted 

    DD 2se response to specif" the 3TTP response line and headers  DD ,e.g. specif"ing the content t"pe$ setting cooies. 

    Print;riter out @ response.get;riter,H  DD 2se out to send content to browser  QQ,:escarga  la plantlla -e c>-*o 0+ente == pulsa con el botón derecho del ratón

    sobre el enlace o mant8n pulsada la tecla #3>7T mientras pulsas sobre el enlace.import !ava.io.UHimport !ava+.servlet.UHimport !ava+.servlet.http.UH

    public class #ome#ervlet e+tends 3ttp#ervlet I  public void doGet,3ttp#ervlet6e*uest re*uest$  3ttp#ervlet6esponse response  throws #ervletE+ception$ >5E+ception I 

    DD 2se re*uest to read incoming 3TTP headers ,e.g. cooies  DD and 3T4) form data ,e.g. data the user entered and submitted 

    DD 2se response to specif" the 3TTP response line and headers  DD ,e.g. specif"ing the content t"pe$ setting cooies.

      Print;riter out @ response.get;riter,H  DD 2se out to send content to browser  QQ

    Para ser un servlet$ una clase deber/a e+tender 1ttpServlet " sobreescribir doGet o doPost ,oambos$ dependiendo de si los datos están siendo enviados mediante GET o P5#T. Estosm8todos toman dos argumentos- un 1ttpServletRe2+est  " un 1ttpServletResponse.El 3ttp#ervlet6e*uest tiene m8todos *ue nos permiten encontrar información entrante comodatos de un 7564$ cabeceras de petici\n 3TTP$ etc. El 3ttp#ervlet6esponse tiene m8todos *uenos permiten especi%car l/neas de respuesta 3TTP ,&BB$ NBN$ etc.$ cabeceras de respuesta,9ontent=T"pe$ #et=9ooie$ etc.$ "$ todav/a más importante$ nos permiten obtener

    un Prnt@rter usado para env/ar la salida de vuelta al cliente. Para servlets sencillos$ lama"or/a del esfuerzo se gasta en sentencias println *ue generan la página deseada.5bservamos *uedoGet " doPost lanzan dos e+cepciones$ por eso es necesario incluirlas en ladeclaración. Tambi8n observamos *ue tenemos *ue importar las clases de lospa*uetes !ava.io ,paraPrint;riter$ etc.$ !ava+.servlet ,para 3ttp#ervlet$ etc.$" !ava+.servlet.http,para 3ttp#ervlet6e*uest " 3ttp#ervlet6esponse. 7inalmente$ observamos*ue doGet "doPost son llamados por el m8todo service$ " algunas veces *ueremossobreescribir directamente el m8todo service$ por e!emplo$ para un servlet *ue mane!e tantopeticionesGET como P5#T.

     2n #encillo #ervlet *ue Genera Te+to ?ormal

    A*u/ tenemos un servlet *ue sólo genera te+to normal. )a siguiente sección mostrará el casomás usual donde se generará 3T4).

    ]

    http://www.programacion.com/cursos_descargas/servlets_jsp/servlets_jsp/SomeServlet.javahttp://java.sun.com/products/servlet/2.2/javadoc/javax/servlet/http/HttpServlet.htmlhttp://java.sun.com/products/servlet/2.2/javadoc/javax/servlet/http/HttpServletRequest.htmlhttp://java.sun.com/products/servlet/2.2/javadoc/javax/servlet/http/HttpServletRequest.htmlhttp://java.sun.com/products/servlet/2.2/javadoc/javax/servlet/http/HttpServletResponse.htmlhttp://java.sun.com/products/servlet/2.2/javadoc/javax/servlet/http/HttpServletResponse.htmlhttp://java.sun.com/products/jdk/1.2/docs/api/java/io/PrintWriter.htmlhttp://java.sun.com/products/jdk/1.2/docs/api/java/io/PrintWriter.htmlhttp://www.programacion.com/cursos_descargas/servlets_jsp/servlets_jsp/SomeServlet.javahttp://java.sun.com/products/servlet/2.2/javadoc/javax/servlet/http/HttpServlet.htmlhttp://java.sun.com/products/servlet/2.2/javadoc/javax/servlet/http/HttpServletRequest.htmlhttp://java.sun.com/products/servlet/2.2/javadoc/javax/servlet/http/HttpServletResponse.htmlhttp://java.sun.com/products/jdk/1.2/docs/api/java/io/PrintWriter.html

  • 8/18/2019 Guía de Cliente Servidor Codigo

    7/38

     3ello;orld.!ava

    pacage hallH

    import !ava.io.UHimport !ava+.servlet.UHimport !ava+.servlet.http.UH

    public class 3ello;orld e+tends 3ttp#ervlet I

      public void doGet,3ttp#ervlet6e*uest re*uest$ 3ttp#ervlet6esponse response  throws #ervletE+ception$ >5E+ception I

      Print;riter out @ response.get;riter,H  out.println,3ello ;orldH  QQ

    COPILAR E INSTALAR EL SERVLET:ebemos observar *ue los detalles espec/%cos para instalar servlets varian de servidor en

    servidor. )os e!emplos se han probado sobre ava ;eb #erver ,;# &.B$ donde se espera *uelos servlets est8n en un directorio llamado servlets en el árbol de instalación del ;#. #inembargo$ hemos situado este servlet en un pa*uete separado ,6all para evitar con^ictos conotros servlets del servidorH *uerrás hacer lo mismo si usas un servidor ;eb *ue es usado porotras personas " no tiene buena estructura para servlets virtuales para evitarautomáticamente estos con îctos. As/$ HelloWorld.java realmente va en un sudirectoriollamado hall en el directorio servlets. 5bserva *ue la con%guración de la ma"or/a de losservidores$ " los e!emplos de este turtorial tambi8n se han probado usando

  • 8/18/2019 Guía de Cliente Servidor Codigo

    8/38

    de los servidores nos permiten de%nir alias para nuestros servlets$ para *ue un servlet puedaser invocado mediante 6ttpB))6ost)an(pat6)an(,le.6t$l.

     Un Servlet 2+e Genera 1TL)a ma"or/a de los #ervlets generan 3T4)$ no te+to normal como el e!emplo anterior. Para haceresto$ necesitamos dos pasos adicionales$ decirle al navegador *ue estámos devolviendo 3T4)." modi%car la sentencia println para construir una página ;eb legal. El primer paso se hacecon%gurando la cabecera de respuesta 9ontent=T"pe. En general$ las cabeceras de respuesta secon%guran mendiante el m8todo setHeader de HttpServletResponse $ pero seleccionar el tipo

    de contenido es una tarea mu" com1n " por eso tiene un m8todo especialsetContentType sólopara este propósito. 5bserva *ue necesitamos con%gurar las cabeceras de respuesta antes$ dedevolver alg1n contenido mediante PrintWriter. A*u/ ha" un e!emplo-

     1ello@@@./ava Tambi8n puedes descargar  El C>-*o 0+ente.

    pacage hallH

    import !ava.io.UHimport !ava+.servlet.UHimport !ava+.servlet.http.UH

    public class 3ello;;; e+tends 3ttp#ervlet I  public void doGet,3ttp#ervlet6e*uest re*uest$  3ttp#ervlet6esponse response  throws #ervletE+ception$ >5E+ception I  response.set9ontentT"pe,te+tDhtmlH  Print;riter out @ response.get;riter,H  out.println,KL:59TMPE 3T4) P29 _=DD;'9DD:T: 3T4) N.B   TransitionalDDE?_O_n   K3T4)O_n   K3EA:OKT>T)EO3ello ;;;KDT>T)EOKD3EA:O_n   K

  • 8/18/2019 Guía de Cliente Servidor Codigo

    9/38

    partes de la página ;eb *ue no cambian ,DOCTYPE " HEAD " *ue podr/a bene%ciarnos elincluirlas en un %chero de utilidades.)a l/nea DOCTYPE es t8cnicamente re*uerida por la especi%cación 3T4)$ " aun*ue la ma"or/ade los navegadores ;eb la ignoran$ es mu" 1til cuando se env/an páginas a validadores deformato 3T4). Estos validadores comparan la s/nta+is 34T) de las páginas comparándolas conla especi%cación formal del 3T4)$ " usan la l/nea DOCTYPE para determinar la versión de 3T4)con la *ue comparar.En muchas páginas web$ la l/nea HEAD no contiene nada más *ue el TITLE$ aun*ue los

    desarrolladores avanzados podr/an *uerer incluir eti*uetas META " ho!as de estilo. Pero para elcaso sencillo$ crearemos un m8todo *ue crea un t/tulo " devuelve las entradas DOCTYPE$ HEAD$" TITLE como salida. A*u/ está el código-

     ServletUtltes./ava Tambi8n puedes descargar  El C>-*o 0+ente.

    pacage hallH

    public class #ervlet2tilities I  public static %nal #tring :59TMPE @

      KL:59TMPE 3T4) P29 _=DD;'9DD:T: 3T4) N.B TransitionalDDE?_OH  public static #tring head;ithTitle,#tring title I  return,:59TMPE _n   K3T4)O_n   K3EA:OKT>T)EO title KDT>T)EOKD3EA:O_nH  Q DD 5ther utilities will be shown later...

    Q 3ello;;;&.!ava

     Tambi8n puedes descargar  El C>-*o 0+ente.

    A*u/ tenemos una nueva versión de la clase HelloWWW *ue usa estopacage hallH

    import !ava.io.UHimport !ava+.servlet.UHimport !ava+.servlet.http.UH

    public class 3ello;;;& e+tends 3ttp#ervlet I  public void doGet,3ttp#ervlet6e*uest re*uest$  3ttp#ervlet6esponse response

      throws #ervletE+ception$ >5E+ception I  response.set9ontentT"pe,te+tDhtmlH  Print;riter out @ response.get;riter,H  out.println,#ervlet2tilities.head;ithTitle,3ello ;;;   K

  • 8/18/2019 Guía de Cliente Servidor Codigo

    10/38

    Metodo POST" #ste m)todo solo esta accesible desde los 'ormularios" Se envan los parámetros de 'orma

    implcita junto a la página, es decir, al pasar los parámetros, nosotros no vemos re'lejado en ning5n sitio qu)

    parámetros son ( cual es su valor"

    Método GET" #ste m)todo enva los parámetros de 'orma e*plicita junto a la página, mostrando en la barra

    de navegación los parámetros ( sus valores" Son esas largas cadenas que aparecen en algunas páginas en

    nuestra barra de navegación, del estilo buscar6id7189:;valor79

  • 8/18/2019 Guía de Cliente Servidor Codigo

    11/38

    $entro del Servlet +a( dos m)todos importantes doet ( doPost" #stos m)todos son los que atienden las

    peticiones P4S3 ( #3 de la página, respectivamente"

    p2)li" "lass Re"i)irPara*etros e0tends java0.servlet.http.HttpServlet i*ple*entsjava0.servlet.Servlet 7

    prote"ted void do6et9HttpServletRe:2est re:2est; HttpServletResponse

    response< thro=s ServletE0"eption; IOE0"eption 7...8prote"ted void doPost9HttpServletRe:2est re:2est; HttpServletResponse

    response< thro=s ServletE0"eption; IOE0"eption 7...8

    8

     Ambos m)todos reciben como parámetros los datos de la petición ttpServlet/equest ( el 'lujo de la salida

    de respuesta ttpServlet/esponse"

    Podemos codi'icar los dos m)todos para +acer cosas di'erentes si viene una petición P4S3 u otra #3" 4

    bien, como en nuestro caso, encaminar una petición a la otra para tratarlas de una misma 'orma"

    prote"ted void do6et9HttpServletRe:2est re:2est; HttpServletResponse response<thro=s ServletE0"eption; IOE0"eption 7

    doPost9re:2est;response8

    Para recibir los parámetros nos vamos a apo(ar en el objeto ttpServlet/equest ( en concreto en el m)todo

    "getParameter.0" #n este m)todo indicaremos el nombre del parámetro que queremos recuperar"

    Strin% para*etro1 - re:2est.%etPara*eter9te0to1Strin% para*etro' - re:2est.%etPara*eter9te0to'

    #n este caso los parámetros se llaman te*to1 ( te*to2"

    !o siguiente que +aremos será montar la respuesta" A+ora nos apo(aremos en el objeto

    ttpServlet/esponse" Bediante el m)todo "getFriter.0 obtendremos el stream de salida" #sto lo manejamos

    mediante el objeto PrintFriter"

    PrintWriter o2t>o2t - response.%etWriter9

     Antes de empezar a volcar te*to en el 'lujo de salida tenemos que indicar el tipo de contenido que se vuelca"

    #n este caso es Dte*tG+tmlD" #s lo que se denomina content@t(pe"

    response.setContentType9te0t!ht*l

     A+ora solo quedará el ir volcando in'ormación mediante m)todos "println.0" #l cual tiene como parámetro el

    te*to a volcar a la página"

    o2t.println9+ht*l/

    ((

  • 8/18/2019 Guía de Cliente Servidor Codigo

    12/38

    o2t.println9+head/+title/Enviar para*etros a 2n Servlet+!title/+!head/o2t.println9+)ody/o2t.println9+h1/Enviar para*etros a 2n Servlet+!h1/o2t.println9La pri*era pala)ra pasada "o*o par?*etro es +stron%/ @ para*etro1@ +!stron%/+)r/o2t.println9La se%2nda pala)ra pasada "o*o par?*etro es +stron%/ @ para*etro'@ +!stron%/

    o2t.println9+!)ody/+!ht*l/

    Java  Crear un mapping a un servletEl proceso de puesta en servicio de un servlet podr/amos resumirlo en dos pasos. El primero deellos es crear el servlet. Para ello implementaremos una clase !ava *ue e+tiendade 3ttp#ervlet$ la cual implementará la funcionalidad de negocio *ue estemos resolviendo.Pero de nada nos sirve el crear un servlet si no lo publicicamos al e+terior. Este mecanismo depublicación es lo *ue se conoce como mapping.)a idea del mapping es la de asociar una 26) o un patrón de una 26) a un servlet.Para ello deberemos de con%gurar el descriptor de despliegue de la aplicación. Este es el%chero *ue encontramos en D;E?7Dweb.+ml

    En este %chero necesitaremos de la eti*ueta Kservlet=mappingO. Esta eti*ueta nos permitiráde%nir un nuevo mapping. Anidado a esta eti*ueta encontramos dos- la primera especi%cará elnombre del servlet sobre el *ue *ueremos establecer el mapping Kservlet=nameO$ mientras*ue la segunda especi%cará sobre *ue 26) se realiza el mapping Kurl=patternO.+servlet*appin%/  +servletna*e/MiServlet+!servletna*e/  +2rlpattern/!BRLDelServlet+!2rlpattern/+!servlet*appin%/

    9on este mapping toda las peticiones *ue se hagan a la 26) http-DDmiservidorD26):el#ervetserán procesadas por el #ervlet 4i#ervlet.

    K+ml version@(.B encoding@2T7=COKweb=app id@;ebAppF>: version@&.N +mlns@http-DD!ava.sun.comD+mlDnsD!&ee [email protected]'.orgD&BB(D4)#chema=instance  +si-schema)ocation@http-DD!ava.sun.comD+mlDnsD!&ee http-DD!ava.sun.comD+mlDnsD!&eeDweb=appF&FN.+sdO  Kdispla"=nameO  lineadecodigoFservletKDdispla"=nameO  KservletO  KdescriptionO  #ervlet *ue devuelve un 4)KDdescriptionO  Kdispla"=nameO  6espuesta4)KDdispla"=nameO  Kservlet=nameO6espuesta4)KDservlet=nameO  Kservlet=classO  com.lineadecodigo.!ava.servlet.6espuesta4)KDservlet=classO  KDservletO  KservletO  KdescriptionO  #ervlet *ue accede a la cabecera http =7orwarded=7orKDdescriptionO  Kdispla"=nameO  5btener7orwarded7orKDdispla"=nameO  Kservlet=nameO5btener7orwarded7orKDservlet=nameO  Kservlet=classO  com.lineadecodigo.!ava.servlet.5btener7orwarded7orKDservlet=classO  KDservletO  KservletO  KdescriptionO  KDdescriptionO  Kdispla"=nameO#ervlet7orwardKDdispla"=nameO  Kservlet=nameO#ervlet7orwardKDservlet=nameO

      Kservlet=classO  com.lineadecodigo.!ava.servlet.#ervlet7orwardKDservlet=classO  KDservletO

    (&

    http://lineadecodigo.com/categoria/java/http://lineadecodigo.com/java/crear-un-mapping-a-un-servlet/http://www.manualweb.net/java-ee/introduccion-a-los-servlets/http://www.manualweb.net/java-ee/introduccion-a-los-servlets/http://w3api.com/wiki/Java:HttpServlethttp://www.manualweb.net/java-ee/introduccion-a-los-servlets/http://www.manualweb.net/java-ee/introduccion-a-los-servlets/http://www.manualweb.net/java-ee/introduccion-a-los-servlets/http://lineadecodigo.com/categoria/java/http://lineadecodigo.com/java/crear-un-mapping-a-un-servlet/http://www.manualweb.net/java-ee/introduccion-a-los-servlets/http://www.manualweb.net/java-ee/introduccion-a-los-servlets/http://w3api.com/wiki/Java:HttpServlethttp://www.manualweb.net/java-ee/introduccion-a-los-servlets/http://www.manualweb.net/java-ee/introduccion-a-los-servlets/

  • 8/18/2019 Guía de Cliente Servidor Codigo

    13/38

      KservletO  KdescriptionO  KDdescriptionO  Kdispla"=nameO4iPrimer#ervletKDdispla"=nameO  Kservlet=nameO4iPrimer#ervletKDservlet=nameO  Kservlet=classO  com.lineadecodigo.!ava.servlet.4iPrimer#ervletKDservlet=classO  KDservletO  KservletO

      KdescriptionO  KDdescriptionO  Kdispla"=nameOParametros>nicioKDdispla"=nameO  Kservlet=nameOParametros>nicioKDservlet=nameO  Kservlet=classO  com.lineadecodigo.!ava.servlet.Parametros>nicioKDservlet=classO  Kinit=paramO  KdescriptionO  ?ivel al *ue establecemos los logsKDdescriptionO  Kparam=nameO?ivel)ogKDparam=nameO  Kparam=valueO:EnicioKDservlet=nameO  Kurl=patternODParametros>nicioKDurl=patternO  KDservlet=mappingO  Kwelcome=%le=listO  Kwelcome=%leOinde+.htmlKDwelcome=%leO  Kwelcome=%leOinde+.htmKDwelcome=%leO

      Kwelcome=%leOinde+.!spKDwelcome=%leO  Kwelcome=%leOdefault.htmlKDwelcome=%leO  Kwelcome=%leOdefault.htmKDwelcome=%leO  Kwelcome=%leOdefault.!spKDwelcome=%leO  KDwelcome=%le=listO  Ksession=con%gO  Ksession=timeoutO(BKDsession=timeoutO  KDsession=con%gOKDweb=appO

    Java  Mi primer servlet

    #n este ejemplo vamos a desarrollar nuestro primer servlet, el cual nos de como respuesta la 'rase D#ste es

    mi primer ServletD"

    &rear el Servlet

    ('

    http://lineadecodigo.com/categoria/java/http://lineadecodigo.com/java/mi-primer-servlet/http://lineadecodigo.com/categoria/java/http://lineadecodigo.com/java/mi-primer-servlet/

  • 8/18/2019 Guía de Cliente Servidor Codigo

    14/38

    !a clase Java que implemente el servlet deberá de e*tender la clase java*"servlet"ttpServlet"

    1.   public class MiPri*erServlet extends java0.servlet.http.HttpServlet 

    implements java0.servlet.Servlet 7

    '. ...

    . 8

    $entro de esta clase tenemos que codi'icar, al menos, un m)todo" #l m)todo doet" #ste m)todo es el que

    se ejecuta cuando el servlet recibe una petición del tipo #3 .las más normales en Internet0"

    p2)li" "lass MiPri*erServlet e0tends java0.servlet.http.HttpServlet i*ple*entsjava0.servlet.Servlet 7

    prote"ted void do6et9HttpServletRe:2est re:2est; HttpServletResponse

    response< thro=s ServletE0"eption; IOE0"eption 7...8

    8

    #l m)todo doet recibe dos parámetros ttpServlet/equest ( ttpServlet/esponse" #stos dos parámetros

    representan el stream de petición ( el stream de respuesta" H ambos llevan los datos intrnsecos a la

    petición o respuesta"

    Por ejemplo, si la petición viene con parámetros, estos los encontraremos en el objeto ttpServlet/equest"

    $e igual manera, si queremos establecer el tipo de contenido de respuesta, lo podremos +acer manipulando

    el objeto ttpServlet/esponse"

    Para nuestro ejemplo de Bi primer servlet, vamos a centrarnos en el objeto ttpServlet/esponse" H es que

    lo que vamos a realizar será un volcado de datos sobre el 'lujo de salida"

    !o primero que +aremos será el de'inir una clase PrintFriter a la que asociar el 'lujo de salida"

    1.   PrintWriter o2t>

    '. o2t - response.%etWriter9

    -na vez establecida esta relación, lo primero que +aremos será indicar el tipo de contenido que queremos

    volcar" #n este caso, será una página Ceb" #s por ello que el contenido será te*tG+tml" #n otros casos

    podremos devolver otros mime@t(pes como imagesGjpeg para las imágenes JP# o applicationG*@gzip

    para los 'ic+eros KIP"

    response.setContentType9te0t!ht*l

     A+ora solo nos quedará ir invocando al m)todo "println con el te*to que con'orme la página Ceb"

    (N

    http://w3api.com/wiki/Java:PrintWriterhttp://w3api.com/wiki/Java:PrintWriter

  • 8/18/2019 Guía de Cliente Servidor Codigo

    15/38

    o2t.println9+ht*l/o2t.println9+head/+title/Mi Pri*er Servlet +!title/+!head/o2t.println9+)ody/o2t.println9+h1/Este es *i Pri*er Servlet+!h1/o2t.println9+!)ody/+!ht*l/

    &omo se puede ver en el código, se vuelcan todas las etiquetas que con'orman la página Ceb 3B!,

    %4$H, 3I3!#,L ( nuestro te*to"

    &on'igurar el descriptor de despliegue

    -na vez desarrollado ( compilado nuestro servlet, tendremos que con'igurar el descriptor de despliegue"

    #ste es el 'ic+ero Ceb"*ml" $ic+o 'ic+ero indicará los servlets que +a( desplegados en nuestra aplicación

    Ceb ( bajo que -/! van a atender las peticiones"

    3endremos que de'inir dos etiquetas" !a primera es la etiqueta servlet" #sta etiqueta sirve para de'inir el

    servlet" 3iene las siguientes etiquetas anidadas

    o description, descripción del servlet

    o display-name, nome del servlet

    o servlet-class, clase del servlet" &on el nombre del paquete por delante"

    +servlet/

      +des"ription/Mi pri*er Servlet+!des"ription/  +displayna*e/ MiPri*erServlet+!displayna*e/  +servletna*e/MiPri*erServlet+!servletna*e/  +servlet"lass/ a2la*)ra."o*.lineade"odi%o.j'ee.servlets.MiPri*erServlet+!servlet"lass/+!servlet/

    -na vez de'inido el servlet, solo nos quedará realizar la asociación entre la -/! que atenderá las peticiones

    del servlet ( el servlet de'inido" #sto lo +acemos mediante la etiqueta servlet@mapping"

    #n ella encontramos dos etiquetas anidadas

    o servlet-name, que es el nombre de'inido anteriormente"

    o url-pattern, que es el patrón de -/! al que atenderá las petciones" #n nuestro caso será

    GBiPrimerServlet"

    +servlet*appin%/  +servletna*e/MiPri*erServlet+!servletna*e/  +2rlpattern/!MiPri*erServlet+!2rlpattern/+!servlet*appin%/

    ([

  • 8/18/2019 Guía de Cliente Servidor Codigo

    16/38

    $e esta manera, una vez desplegada la aplicación en un contenedor Ceb, podremos acceder al servlet de la

    siguiente manera

    http!!servidor#$#$!no*)re&app&=e)!MiPri*erServlet

    pacage aulambra.com.lineadecodigo.!&ee.servletsH

    DUU U J%le 4iPrimer#ervlet.!ava U Jversion (.( U Jauthor )inea de 9odigo ,http-DDlineadecodigo.com U Jdate &=diciembre=&BB U Jurl http-DDlineadecodigo.comD&BBD(&D&Dmi=primer=servletD U Jdescription 9omo construir " desplegar tu primer servletUD

    import !ava.io.>5E+ceptionHimport !ava.io.Print;riterHimport !ava+.servlet.#ervletE+ceptionHimport !ava+.servlet.http.3ttp#ervlet6e*uestH

    import !ava+.servlet.http.3ttp#ervlet6esponseH

     public class 4iPrimer#ervlet e+tends !ava+.servlet.http.3ttp#ervlet implements !ava+.servlet.#ervlet I

    private static %nal long serialZersion2>: @ ()H

    public 4iPrimer#ervlet, Isuper,H

    Q

    protected void doGet,3ttp#ervlet6e*uest re*uest$ 3ttp#ervlet6esponse responsethrows #ervletE+ception$ >5E+ception I

      Print;riter outH  out @ response.get;riter,H

      response.set9ontentT"pe,te+tDhtmlH

      out.println,KhtmlOH  out.println,KheadOKtitleO4i Primer #ervlet KDtitleOKDheadOH  out.println,Kbod"OH  out.println,Kh(OEste es mi Primer #ervletKDh(OH  out.println,KbrOKbrOKhrOH  out.println,ArtiacuteHculo disponible en- Ka href@OKDaOKbrDOKa

    [email protected] title@)inea de 9odigoOlineadecodigo.comKDaOH  out.println,KDbod"OKDhtmlOHQ

    DU ,non=ava=doc U Jsee !ava+.servlet.http.3ttp#ervletdoPost,3ttp#ervlet6e*uest re*uest$

    3ttp#ervlet6esponse response UDprotected void doPost,3ttp#ervlet6e*uest re*uest$ 3ttp#ervlet6esponse response

    throws #ervletE+ception$ >5E+ception IdoGet,re*uest$responseH

    QQ

    Java  eenviar petici!n a otro Servlet

    (]

    http://lineadecodigo.com/categoria/java/http://lineadecodigo.com/java/reenviar-peticion-a-otro-servlet/http://lineadecodigo.com/categoria/java/http://lineadecodigo.com/java/reenviar-peticion-a-otro-servlet/

  • 8/18/2019 Guía de Cliente Servidor Codigo

    17/38

    ?o siempre un Servlet estará codi'icado para atender a una petición" Sino que muc+as veces ( por muc+os

    motivos tendrá que reenviar la petición para que la siga procesando otro Servlet"

    -no de estos casos claros es cuando estamos implementando un patrón &ontroller" $onde ese punto de

    acceso redirigirá las peticiones a di'erentes Servlets"

    Para redirigir la petición necesitaremos de una simple lnea de código" #n esta lnea recuperaremos el

    manejador de uno de los Servlets de la aplicación Ceb ( le reenviaremos los objetos petición ( respuesta

    para que los maneje"

    #sto lo +aremos mediante el m)todo 'orCard.request, response0 de /equest$ispatc+er 

    #l código nos quedara de la siguiente 'orma

     protected  void do6et9HttpServletRe:2est re:2est; HttpServletResponse response

  • 8/18/2019 Guía de Cliente Servidor Codigo

    18/38

     U Jurl http-DDlineadecodigo.comD&BBD(&D&[Drecibir=parametros=en=un=servletD U Jdescription #ervlet *ue procesa una petición de parámetros via P5#T " GETUD

    import !ava.io.>5E+ceptionHimport !ava.io.Print;riterHimport !ava+.servlet.#ervletE+ceptionHimport !ava+.servlet.http.3ttp#ervlet6e*uestH

    import !ava+.servlet.http.3ttp#ervlet6esponseH

     public class 6ecibirParametros e+tends !ava+.servlet.http.3ttp#ervlet implements !ava+.servlet.#ervlet I 

    DUU UUD

    private static %nal long serialZersion2>: @ ()H

    public 6ecibirParametros, Isuper,H

    Q

    protected void doGet,3ttp#ervlet6e*uest re*uest$ 3ttp#ervlet6esponse responsethrows #ervletE+ception$ >5E+ception I

    doPost,re*uest$responseHQ

    protected void doPost,3ttp#ervlet6e*uest re*uest$ 3ttp#ervlet6esponse responsethrows #ervletE+ception$ >5E+ception I

    DD9apturamos los parámetros#tring parametro( @ re*uest.getParameter,te+to(H#tring parametro& @ re*uest.getParameter,te+to&H

     Print;riter outHout @ response.get;riter,H response.set9ontentT"pe,te+tDhtmlH out.println,KhtmlOHout.println,KheadOKtitleOEnviar parametros a un #ervletKDtitleOKDheadOHout.println,Kbod"OHout.println,Kh(OEnviar parametros a un #ervletKDh(OHout.println,)a primera palabra pasada como paraacuteHmetro es KstrongO

    parametro( KDstrongOKbrOHout.println,)a segunda palabra pasada como paraacuteHmetro es KstrongO

    parametro& KDstrongOKbrOHout.println,KhrOHout.println,Ka href@inde+.htmlO>ndice de e!emplosKDaO Ka

    [email protected] parametrosKDaOHout.println,KDbod"OKDhtmlOH

    QQJava  O"tener la #P $ue invoca al servlet

    Bediante el siguiente código podremos recuperar la IP del usuario que está realizando la petición sobre elservlet" $adas todas las circunstancias que pueden rodear a la topologa de las redes la IP que

    obtendremos no tiene porque ser la IP del usuario 'inal, sino que 'ácilmente podra ser la IP de un pro*(intermedio,""" #s por ello que el ejemplo +a( que utilizarle con 'ines didácticos ( si lo usamos paraproducción, con un gran cuidado"

    (C

    http://lineadecodigo.com/categoria/java/http://lineadecodigo.com/java/obtener-la-ip-que-invoca-al-servlet/http://lineadecodigo.com/categoria/java/http://lineadecodigo.com/java/obtener-la-ip-que-invoca-al-servlet/

  • 8/18/2019 Guía de Cliente Servidor Codigo

    19/38

    !a IP de la máquina que invoca es una in'ormación que al servlet le llega en la petición, consecuentementesus m)todos doet ( doPost lo tendrán en el objeto ttpServlet/equest"!os m)todos que nos permiten recuperar la in'ormación de la IP ( el nombre de la máquina peticionaria songet/emoteost.0 ( get/emoteAddr.0" Simplemente les invocamos sobre el m)todo ttpServlet/equest"Strn* ip @ n+llH  // I' del clienteStrn* host @ n+llH  // (ost del cliente ip @ re*uest.get6emoteAddr,H

    host @ re*uest.get6emote3ost,H-na vez obtenida la in'ormación, simplemente tendremos que devolverla por respuesta" Para ello nosapo(amos sobre los objetos PrintFriter ( ttpServlet/esponse"Neamos el códigoPrnt@rter out @ response.get;riter,Hresponse.set9ontentT"pe,te+tDhtmlH out.println,KhtmlOKheadOKtitleO5btener >P del clienteKDtitleOKDheadOKbod"OHout.println,KstrongO5btener la >P del cliente KDstrongOHout.println,)a ip del cliente es   ip KbrOHout.println,El host del cliente es   hostHout.println,KDbod"OKDhtmlOH

    Java  %eer par&metros de iniciali'aci!n de un servlet ,http-DDmanuales.dgsca.unam.m+DwebdinaDescribiendo.htm#n la vida de ejecución de un servlet, este, recuperará in'ormación de m5ltiples sitios" Por ejemplo recibiráen la petición in'ormación va parámetros, recuperará datos de m5ltiples orgenes bases de datos, 'ic+eros,L-no de los sitios de donde podrá recuperar in'ormación son los parámetros de inicialización del servlet"&uando creamos un servlet ( lo de'inimos en el descriptor de despliegue, podemos indicarle queel servletlleva asociado parámetros de inicialización ( los valores de dic+os parámetros"#l uso de estos parámetros es mu( potente, (a que se pueden modi'icar sus valores, con el 'in de obtenerun comportamiento di'erente del servlet, sin necesidad de recompilar este" Algunos de los usos de los parámetros de inicialización podran ser3iempos de control de peticiones?ombres de recursos e*ternos a los que acceder 'ic+eros, bases de datos,L?ivel de log que se quiere aplicar al programa"LSiempre suelen ser cosas relativas a la con'iguración del servlet"!o primero que tenemos que +acer es de'inir en el descriptor de despliegue .GF#%@I?GCeb"*ml0 del servletKservletO  KdescriptionOE!emplo ...bla bla bla.KDdescriptionO  Kdispla"=nameOParametros>nicioKDdispla"=nameO Kservlet=nameOParametros>nicioKDservlet=nameO  Kservlet=classOcom.lineadecodigo.Parametros>nicioKDservlet=classOKDservletO#l servlet se de'ine mediante la etiqueta QservletR" Anidada a esta tenemos dos etiquetas importantes"Qservlet@nameR será el nombre de re'erencia del servlet ( Qservlet@classR será la clase java que implementa

    dic+o servlet"!os parámetros del servlet#n nuestro ejemplo vamos a de'inir dos parámetros" #l primero será ?ivel!og que almacenará el tipo de logcon el que grabaremos ( ?umeroPeticiones que nos pasará un indicador de limitación"KservletO  Kinit=paramO  KdescriptionO?ivel de log a aplicarKDdescriptionO  Kparam=nameO?ivel)ogKDparam=nameO  Kparam=valueO:E

  • 8/18/2019 Guía de Cliente Servidor Codigo

    20/38

    -na vez que +emos de'inido esto en el descriptor de despliegue, tendremos que acceder a los valoresdesde el servlet"!o más normal es acceder a esta in'ormación en el m)todo init.0" Si es que la in'ormación aplica a todas laspeticiones del servlet"Para recuperar los parámetros tenemos que acceder a el m)todo "getInitParameter.String parámetro0 quepermite acceder al valor del parámetro pasado como argumento a dic+o m)todo" As, para recuperar los valores de nuestro ejemplo tendremos el siguiente código Fnivel)og @ get>nitParameter,?ivel)ogH

     FnumeroPeticiones @ Inte*er.parse>nt,get>nitParameter,?umeroPeticionesHa( que 'ijarse que los valores de los parámetros de inicio son devueltos como cadenas de te*to" #s porello que tendremos que +acer el tratamiento necesario para convertirlo en otro tipo de dato"#n nuestro caso convertirlo a entero mediante Integer"parseInt.String cadena0"3anto Enivel!og como EnumeroPeticiones lo +emos de'inido como atributos generales del  servlet para quepuedan ser utilizados en todo momento"

    pacage com.lineadecodigo. !ava.servletH

    DUU U J%le Parametros>nicio.!ava U Jversion (.B U Jauthor )inea de 9odigo ,http-DDlineadecodigo.com U Jdate &]=marzo=&B((

     U Jurl http-DDlineadecodigo.comD!avaDleer=parametros=de=inicializacion=de=un=servletD U Jdescription #ervlet *ue obtiene los parámetros del %chero de con%guración UD

    import !ava.io.>5E+ceptionHimport !ava.io.Print;riterHimport !ava+.servlet.#ervlet9on%gHimport !ava+.servlet.#ervletE+ceptionHimport !ava+.servlet.http.3ttp#ervletHimport !ava+.servlet.http.3ttp#ervlet6e*uestHimport !ava+.servlet.http.3ttp#ervlet6esponseH

    public class Parametros>nicio e+tends 3ttp#ervlet I  private static %nal long serialZersion2>: @ ()H  private #tring Fnivel)ogH  private int FnumeroPeticionesH

      public Parametros>nicio, I  super,H 

    protected void doGet,3ttp#ervlet6e*uest re*uest$ 3ttp#ervlet6esponse response throws #ervletE+ception$ >5E+ception I

      Print;riter outH  out @ response.get;riter,H

      response.set9ontentT"pe,te+tDhtmlH 

    out.println,KhtmlOH  out.println,KheadOKtitleOZalor parametros inicializaciónKDtitleOKDheadOH  out.println,Kbod"OH  out.println,Kh(OZalor parametros inicializaciónKDh(OH  out.println,?ivel )og-   Fnivel)og  KbrDOH  out.println,?umero Peticiones-   FnumeroPeticionesH  out.println,KbrOKbrOKhrOH  out.println,ArtiacuteHculo disponible en- Ka href@OKDaOKbrDOKa

    [email protected]!avaDleer=parametros=de=inicializacion=de=un=servletDtitle@)inea de 9odigoOhttp-DDlineadecodigo.comD!avaDleer=parametros=de=inicializacion=de=un=servletDKDaOH

    &B

    http://www.manualweb.net/java-ee/introduccion-a-los-servlets/http://w3api.com/wiki/Java:Servlet.init()http://w3api.com/wiki/Java:Servlet.init()http://www.manualweb.net/java-ee/introduccion-a-los-servlets/http://w3api.com/wiki/Java:ServletConfig.getInitParameter()http://w3api.com/wiki/Java:Integerhttp://w3api.com/wiki/Java:Integerhttp://w3api.com/wiki/Java:Integer.parseInt()http://www.manualweb.net/java-ee/introduccion-a-los-servlets/http://www.manualweb.net/java-ee/introduccion-a-los-servlets/http://www.manualweb.net/java-ee/introduccion-a-los-servlets/http://w3api.com/wiki/Java:Servlet.init()http://www.manualweb.net/java-ee/introduccion-a-los-servlets/http://w3api.com/wiki/Java:ServletConfig.getInitParameter()http://w3api.com/wiki/Java:Integerhttp://w3api.com/wiki/Java:Integer.parseInt()http://www.manualweb.net/java-ee/introduccion-a-los-servlets/

  • 8/18/2019 Guía de Cliente Servidor Codigo

    21/38

      out.println,KDbod"OKDhtmlOH  Q 

    protected void doPost,3ttp#ervlet6e*uest re*uest$ 3ttp#ervlet6esponse response throws #ervletE+ception$ >5E+ception I  doGet,re*uest$responseH  Q 

    public void init,#ervlet9on%g con%gI  tr"I  Fnivel)og @ con%g.get>nitParameter,?ivel)ogH 

     FnumeroPeticiones @ >nteger.parse>nt,con%g.get>nitParameter,?umeroPeticionesH  Q catch,?ullPointerE+ception npeI  npe.print#tacTrace,H  Q  Q

    Q

    F+é es JSP" ava #erver Pages ,#P es una tecnolog/a *ue nos permite mezclar 3T4) estático con 3T4)generado dinámicamente. 4uchas páginas ;eb *ue están construidas con programas 9G> soncasi estáticas$ con la parte dinámica limitada a mu" pocas localizaciones. Pero muchasvariaciones 9G>$ inclu"endo los servlets$ hacen *ue generemos la página completa mediantenuestro programa$ incluso aun*ue la ma"or/a de ella sea siempre lo mismo. #P nos permitecrear dos partes de forma separada. A*u/ tenemos un e!emplo-

    KL:59TMPE 3T4) P29 =DD;'9DD:T: 3T4) N.B TransitionalDDE?OK3T4)OK3EA:OKT>T)EO;elcome to 5ur #toreKDT>T)EOKD3EA:OK$ realmente está dise0ado para inclusiones sencillas$ no para programas reales*ue usen formularios de datos$ hagan cone+iones a bases de datos$ etc.

    9ontra ava#cript. ava#cript puede general 3T4) dinámicamente en el cliente. Este unacapacidad 1til$ pero sólo mane!a situaciones donde la información dinámica está basada en elentorno del cliente. 9on la e+cepción de las cooies$ el 3TTP " el envió de formularios no están

    &(

  • 8/18/2019 Guía de Cliente Servidor Codigo

    22/38

    disponibles con ava#cript. M$ como se e!ecuta en el cliente$ ava#cript no puede acceder a losrecursos en el lado del servidor$ como bases de datos$ catálogos$ información de precios$ etc.

    UN SENCILLO SERVLET9uando se trata a %n de cuentas$ un servlet es una clase ava$ " usted "a debe saber cómoescribir una clase ava-4"9lass?ame public class ID D ... propiedades " m8todos ... QPero no cual*uier clase va a hacer. #ervlets para su uso en la ;eb debe ser subclases de

    la !ava+.servlet.http.3ttp#ervlet clase$ *ue está integrada en cada servidor web *ue soporteservlets.Aun*ue los servidores diferentes pueden implementar esta clase de otra manera$ laspropiedades " m8todos *ue apo"an están dictadas por la especi%cación de servlets de ava . Alescribir estas l/neas$ la versión &.& es la 1ltima versión de la especi%cación$ aun*ue la versión&.' se encuentra en la fase de pro"ecto %nal. )a documentación *ue conforma la especi%cacióninclu"e una referencia de todas las clases *ue #ervlet servidores compatibles debenproporcionar.Por lo tanto la creación de un servlet es tan simple como crear una subclase de 3ttp#ervlet -import !ava.io. UH !ava+.servlet importación U$. importación !ava+.servlet.http UH. 4"#ervletpublic class 3ttp#ervlet ID D ... propiedades " m8todos ... Q Tenga en cuenta *ue estamos importando los trespa*uetes !ava.io $ !ava+.servlet " !ava+.servlet.http en el anterior. !ava+.servlet.http contieneel 3ttp#ervlet clase *ue estamos ampliando$ mientras *ue !ava+.servlet contiene una serie declases relacionado con el traba!o con #ervlets " !ava.io contiene todas las clases estándar de ava para llevar a cabo la entrada " salida. :ado *ue la gran ma"or/a de los #ervlets hacer usode las clases en los dos 1ltimos pa*uetes$ lo me!or es simplemente incluir la derecha del palo$as/ *ue no se olvide despu8s.2n servlet debe proporcionar al menos un m8todo *ue se utiliza por el servidor web paramane!ar las peticiones. El nombre del m8todo ,s depende del tipo de petición *ue *ueremosmane!ar. 2na petición 3TTP GET es la forma más simple de solicitud de la página$ " se produce"a sea como resultado de *ue el usuario escribe una dirección 26) o hacer clic en unenlace. Para permitir *ue el servlet mane!ar peticiones GET$ debe proporcionar un m8todollamado doGet de la siguiente manera-public void doGet ,3ttp#ervlet6e*uest re*$ 3ttp#ervlet6esponse 6#P lanza #ervletE+ception$>5E+ception ID D ... gestionar las peticiones GETQ

    9omo puede ver$ doGet debe ser un p1blico m8todo *ue no devuelve nada , void $ " toma dosparámetros-2n 3ttp#ervlet6e*uest ob!eto ,esta clase es parte de la !ava+.servlet.http pa*uete$ *ue en ele!emplo anterior *ue le asignamos a una variable llamada re* .2n 3ttp#ervlet6esponse ob!eto ,tambi8n en !ava+.servlet.http $ *ue le asignamos a la 6#P .9uando se invoca este m8todo$ el 3ttp#ervlet6e*uest , 6EV  se pasa como parámetro será unob!eto *ue proporciona acceso a toda la información relacionada con la solicitud del e+plorador*ue dio origen a este servlet. 2tilizando varios m8todos de 3ttp#ervlet6e*uest $ usted puedeencontrar cosas como la dirección >P del navegador solicitante$ o de los valores enviados en lacadena de consulta 26) ,por e!emplo$inde+.html nombre @ valor . 4ientras tanto$el 3ttp#ervlet6esponse , 6#P  representa la respuesta *ue se env/a al navegador. Este es elob!eto *ue nos permite enviar el código 3T4) de vuelta al navegador$ por e!emplo. Pero másen re* " el 6#P en un momento.

    #i usted está preocupado acerca de la lanza #ervletE+ception$ >5E+ception parte de ladeclaración de la función$ no se. ?o hemos cubierto esto en cual*uiera de los art/culosanteriores de esta serie$ pero en realidad es bastante simple. Todo esto hace es indicar lostipos de e#cepcones ,errores *ue pueden ocurrir como resultado de llamar a estem8todo. En este caso$ cuando el servidor ;eb llama al m8todo doGet la función con el %n deprocesar una petición GET$ debe estar preparado para el hecho de *ue un#ervletE+ception ouna >5E+ception puede ocurrir$ " *ue debe mane!ar estos errores con gracia. #i bien esto suenahorrible$ lo *ue realmente hace nuestro traba!o más fácil. 2na e+cepción >5E+ception $ pore!emplo$ podr/a ocurrir si el navegador de >nternet se cerró antes de *ue termine la descargade la respuesta de nuestro servlet se va a enviar. Pero desde el doGet función se declara de talmanera *ue puede lanzar ,causa >5E+ception s$ no tiene *ue preocuparse por estos errores$"a *ue el servidor ;eb a mane!ar para nosotros cuando se produzcanLAhora$ en este e!emplo$ vamos a hacer *ue nuestro servlet enviar una simple página 3T4) al

    navegador en respuesta a su solicitud. A*u/ está el código completo para el doGet m8todo-public void doGet ,3ttp#ervlet6e*uest re*$ 3ttp#ervlet6esponse 6#P lanza #ervletE+ception$>5E+ception Irsp.set9ontentT"pe ,te+t D htmlH Print;riter a cabo rsp.get;riter @ ,H

    &&

    http://java.sun.com/products/servlet/download.html#specshttp://java.sun.com/products/servlet/2.2/javadoc/index.htmlhttp://java.sun.com/products/servlet/2.2/javadoc/index.htmlhttp://java.sun.com/products/servlet/download.html#specshttp://java.sun.com/products/servlet/2.2/javadoc/index.html

  • 8/18/2019 Guía de Cliente Servidor Codigo

    23/38

    out.println ,KhtmlOH out.println , KheadO KtitleO #ervlet simple KD titleO KD headOHout.println ,Kbod"OH out.println ,L KpO Este es un #ervlet simple KD pO H out.println ,KDbod"O KD htmlOHQ:e nuevo$ esto no es tan complicado como puede parecer a primera vista. :emos un paso atrav8s del cuerpo de este m8todo una l/nea a la vez-rsp.set9ontentT"pe ,te+t D htmlHEn esta l/nea$ estamos llamando a la set9ontentT"pe m8todo de la 6#P variable ,*ue como serecordará contiene un 3ttp#ervlet6esponse ob!eto. Este m8todo establece el 3TTP 9ontent=

     T"pe de la cabecerate+t D html H tipo 4>4E$ *ue indica al navegador ;eb de esperar *ue unapágina ;eb 3T4). 9ual*uier #ervlet *ue genera una página ;eb debe comenzar porestablecer este tipo de contenido. :el mismo modo$ un servlet *ue genera un archivo de te+to*ue establezca el tipo de contenido a te+t D plain $ " un servlet *ue genera un archivo G>7usar/a image D gif .Print;riter a cabo rsp.get;riter @ ,HAhora bien$ como vamos a generar una página web$ vamos a *uerer enviar código 3T4) en ele+plorador ;eb. El código 3T4) es simplemente te+to plano$ " el estándar de ava E D # declase para la salida de datos de te+to sin formato es !ava.io.Print;riter . En esta l/nea$ sedeclara una variable llamada a cabopara almacenar un Print;riter ,recordemos *ue hemosimportado de la !ava.io pa*uete$ as/ *ue podemos referirnos a esta clase directamente sin darsu nombre completo. Para obtener un Print;riterob!eto *ue está con%gurado para el te+to desalida como la respuesta al navegador ;eb$ simplemente llame a la get;riter m8todo de 6#P $*ue contiene nuestro ob!eto de respuesta$ " asignar el valor devuelto a nuestronuevo cabo variable.out.println ,KhtmlOHEl resto de la doGet m8todo simplemente utiliza el Print;riter , a  para la salida de código3T4) en el navegador. Al igual *ue en los programas de e!emplo en los art/culos anteriores$ endonde pudimos salida de te+to a la pantalla con #"stem.out.println , #"stem.out es tambi8nun Print;riter $ se puede dar salida a las l/neas de te+to en el navegador ;eb conel println m8todo de nuestra a ob!eto. 6ecordemos *ue println se inicia automáticamente unanueva l/nea al %nal de la cadena *ue se le dice a la salida. #i no desea iniciar una nueva l/neaen el código 3T4)$ puede utilizar la impresión m8todo en lugar de println .:escargue la plena 4"#ervlet.!ava archivo o escriba a cabo a partir de los listados anteriores "guárdelo en alg1n lugar conveniente en su e*uipo ,"o uso un directorio llamado 9- _ ava:ev $

    por e!emplo. A continuación$ veremos cómo compilar e implementar un servlet.COPILACIN DE UN SERVLET Todos los programas de ava *ue hemos visto hasta ahora eran mu" fácil de compilar. Pordesgracia$ si se intenta compilar el 4"#ervlet.!ava archivo *ue se produce en la secciónanterior$ obtendrá una serie de mensa!es de error bastante feo-:- _ !avadevO !avac 4"#ervlet.!ava 4"#ervlet.!ava- &- !ava+.servlet pa*uete no e+iste !ava+.servlet import UH 4"#ervlet.!ava-. '- pa*uete !ava+.servlet.http no e+iste !ava+.servletde importación. http UH 4"#ervlet.!ava-. [- no se puede resolver el s/mbolo s/mbolo- ubicaciónde la clase 3ttp#ervlet- 4"#ervlet 4"#ervlet clase public class 3ttp#ervlet I ...Ahora$ la me!or táctica me parece la hora de abordar los errores de compilación es mirar loserrores enumerados en la parte superior primero$ "a *ue los errores de hecho podr/a ser lacausa de algunos de los errores de otros *ue están apareciendo más aba!o. En este caso$ por

    e!emplo$ los cuatro no puede resolver el s/mbolo errores es mu" probable *ue vea en realidadson el resultado de los dos pa*uete no e+iste errores en la parte superior. 4irando más decerca$ te darás cuenta de *ue el compilador se está as%+iando a las dos deimportación comandos *ue se utilizan para importarlos !ava+.servlet " !ava+.servlet.http pa*uetes. :ado *ue no puede importar los pa*uetes$ novamos a poder utilizar cual*uiera de las clases *ue residen en ellos$ " resulta *ue todos los nopuede resolver el s/mbolo los errores se re%eren a lugares en los *ue estamos tratando dehacer as/.jPor *u8 no puedo encontrar esos dos pa*uetes Pues bien$ estos dos pa*uetes *ue no son enrealidad construida en ava$ como !ava.io es. En cambio$ vienen con el servidor ;eb #ervlet concapacidad ,por e!emplo Tomcat. As/ *ue antes de *ue el compilador de ava será capaz decompilar el servlet$ necesitamos hacerle saber dónde encontrar las clases de estos dospa*uetes.

    )os cursos re*ueridos normalmente se almacenan en un archivo llamado servlet.!ar . )aubicación e+acta de este archivo depende del software de servidor ;eb en particular *ue ustedutilice$ pero en el caso de Tomcat se puede encontrar en el lib subdirectorio del directorio de

    &'

    http://www.webmasterbase.com/examples/servlets/MyServlet.javahttp://www.webmasterbase.com/examples/servlets/MyServlet.java

  • 8/18/2019 Guía de Cliente Servidor Codigo

    24/38

    instalación de Tomcat principal ,por e!emplo$ d- _ Archivos de programa _ Apache Group _ !aarta= tomcat='.&.' _ lib _ servlet.!ar . Para el compilador de ava para poder compilarservlets$ es necesario a0adir este archivo a su ava r+ta -e clase . Por defecto$ ava busca laclases en el directorio actual , .  solamente. Por lo tanto$ . es la ruta de la clase pordefecto. #i cambia la ruta de clase para incluir el servlet.!ar archivo ,d-. _ ... _ lib _servlet.!ar en ;indows$ .. -D usr D .. D lib D servlet.!ar en el 2ni+$ entonces el servlet deber/acompilar bien.Puede especi%car una ruta de clase *ue se utiliza cuando se e!ecuta !avac.e+e de la siguiente

    manera-:- .$ d- _ Archivos de programa _ Apache Group _ !aarta=tomcat='.&.' _ lib _ servlet.!ar _ !avadevO !avac=classpath 4"#ervlet.!ava5bviamente$ el camino hacia la servlet.!ar puede ser mu" largo " doloroso de escribir cada vez*ue *ueremos compilar un servlet. 9omo alternativa$ puede establecer una variable de entornollamada9)A##PAT3 a su ruta de la clase deseada. Esta decisión es el mismo *ue hacerel 9A4>?5 medio ambiente en el sistema operativo *ue est8 utilizando ,las instrucciones parael a!uste de la 62TA variable de entorno en varios sistemas operativos se proporcionan en lasinstrucciones de instalación para el :k si los necesita.Para establecer temporalmenteel 9)A##PAT3 variable de entorno en ;indows$ puede utilizar el #ET de comandos en els/mbolo del sistema 4#=:5# de comandos-d-. _ !avadevO #ET 9)A##PAT3 @$ d- _ Archivos de programa _ Apache Group _ !aarta=tomcat='.&.' _ lib _ servlet.!ar d- _ !avadevO !avac 4"#ervlet.!ava9ual*uiera *ue sea la forma de ir sobre la con%guración de la ruta de clase$ ahora deber/a sercapaz de compilar con 8+ito 4"#ervlet.!ava para obtener 4"#ervlet.class ,o descargarlo a*u/  .:E#P)>EG2E :E 2? #E6Z)ETEn su con%guración predeterminada$ Tomcat espera *ue se colo*ue en los servletscompilados webapps _ 655T _ ;E?7 _ classes subdirectorio del directorio de instalación de Tomcat para desplegarlas. 9oloca el compilado 4"#ervlet.class archivo en ese directorio$entonces ,suponiendo *ue Tomcat se está e!ecutando en el e*uipo local decarga http-DDlocalhost-CBCBDservletD4"#ervlet . #i has hecho todo bien$ deber/as ver una página;eb mu" similar a esta-

    #i tienes instalado Apache Tomcat parainteractuar con usar modF! $ tambi8n debe ser capaz de ver el servletcon http-DDlocalhostDservletD4"#ervlet ,ohttp-DDlocalhost-CBBBDservletD4"#ervlet si hacon%gurado Apache para e!ecutar en el puerto CBBB.

    )a ma"or/a de las veces$ eso es todo lo *ue necesita hacer para implementar un servletL 3a"algunas situaciones$ sin embargo$ el lugar donde *uiere hacer su #ervlet disponible en unadirección diferente. 2n caso com1n es cuando se asigna un nombre de pa*uete a unservlet. Por e!emplo$ consideremos *u8 pasar/a si se coloca el 4"#ervlet clase delpa*uete com.sitepoint.web mediante la adición de la l/neapa*uete de com.sitepoint.webHa la parte superior de la 4"#ervlet.!ava archivo. Para implementar el 4"#ervlet.class archivo$*ue la colocar/a en webapps _ 655T _ ;E?7 _ classes _ com _ #itePoint _ web ,recordemos*ue la ubicación de la clase. archivos deben re^e!ar sus nombres de pa*uetes$ " cargarlo consu plena nombre completo de clase, http-DDlocalhost-CBCBDservletDcom.sitepoint.web.4"#ervlet . Ma se trata de una 26) bastantefeo$ " las cosas pueden ser mucho más comple!a con el pa*uete de registro o de nombres declase.

    Por esta razón$ es posible *ue desee asignar un nombre alternativo a su #ervlet. Esto se hacecon elweb.+ml archivo en el directorio ;E?7 directorio ,por e!emplo$ webapps _ 655T _ ;E?7 _ web.+ml . Este es un archivo 4) *ue permite con%gurar los servlets se han

    &N

    http://www.webmasterbase.com/examples/servlets/MyServlet.classhttp://www.webmasterbase.com/examples/servlets/MyServlet.class

  • 8/18/2019 Guía de Cliente Servidor Codigo

    25/38

    implementado. :ado *ue los archivos 4) son te+to plano$ sólo tiene *ue abrirlo en el #5=CC[W=(OL = D D #un4icros"stems$ >nc. D D :T: ;eb Application &.& D D E? http-DD !ava.sun.comD!&eeDdtdsDweb=appF&F&.dtd O Kweb=appO KD web=appO4ediante la adición de eti*uetas entre Kweb=appO " KD aplicación web=O $ usted puedeagregar información de con%guración de los servlets. A*u/ es cómo asignar el nombre de mi

    a 4"#ervlet -Kweb=appO KservletO Kservlet=nameO mi KD servlet=nameO Kservlet=classO 4"#ervlet KDservlet=classO KD servletO KD web=appO#i guarda los cambios mencionados$ a continuación$ cierre " reinicie Tomcat$ usted será capazde acceder a su servlet como http-DDlocalhost-CBCBDservletDm" . Esto puede no parecer grancosa$ pero cuando el nombre de su #ervlet de clase es de &[ caracteres de longitud " estáprofundamente anidado en un pa*uete$ se le aprecian la posibilidad de darle un nombrebonito$ corto.Asignar un nombre a su #ervlet tambi8n le permite usar ese nombre para especi%car losparámetros de con%guración adicionales para el servlet. El Kservlet=mappingO eti*ueta$ pore!emplo$ le permite mapear nuestro servlet a cual*uier dirección 26) o el patrón de 26) en elservidor-Kweb=appO KservletO Kservlet=nameO mi KD servlet=nameO Kservlet=classO 4"#ervlet KDservlet=classO KD servletO Kservlet=mappingO Kservlet=nameO mi KD servlet =nameO Kurl=patternO D m".html KD url=patternO KD servlet=mappingO KD web=appOEl código anterior le permitirá acceder a servlet como http-DDlocalhost-CBCBDm".html =escondiendo por completo el hecho de *ue usted está utilizando un #ervlet enabsolutoL Tambi8n puede especi%car un Kurl=patternO con un carácter comod/n$ como D mi U D $*ue utilizar/a el #ervlet para mostrar cual*uier 26) *ue se iniciócon http-DDlocalhost-CBCBDm"D $ o U. bla $ *ue se asignar/a todas las solicitudes de nombres dearchivos *ue terminan en . bla$ a su #ervlet. :esde el 3ttp#ervlet6e*uest ob!eto *ue el servletrecibe le permite a su #ervlet e+aminar la dirección 26) *ue se solicita$ *ue posiblementepodr/a asignar un #ervlet solo D U " se mane!ar todas las peticiones en su sitio web$ el env/o derespuestas diferentes en función de la dirección 26) solicitadaL#i usted tiene Apache con%gurado como el servidor web principal con modF! para reenviar las

    solicitudes de #ervlets " ava#erver Pages ,#P de Tomcat$ usted encontrará *ue Kurl=patternO no funciona como se esperaba. Esto es as/ por*ue$ por defecto$ Apache sólo enviarálas solicitudes de archivos *ue terminan en . !sp o archivos en el D servlet a Tomcat directoriopara su procesamiento. Para reenviar los patrones de 26) adicionales a Tomcat$ debe utilizarel 4ount directiva en el archivo de con%guración de Apache.Aseg1rese de hacer esto despu8sde la l/nea en la *ue incluir Tomcat modF!.conf auto= archivo ,*ue se carga el módulonecesario para 4ount a traba!ar. . Por e!emplo$ al mapa D mi D U bla ,todos bla. los archivosde la mi D directorio de Tomcat$ debe agregar lo siguiente- 4ount D mi D U.

  • 8/18/2019 Guía de Cliente Servidor Codigo

    26/38

    Para nuestro #ervlet primera dinámica$ vamos a mostrar la fecha " la hora actuales delservidor. A*u/ está el código del servlet , Time.!ava -import !ava.io. UH importación !ava+.servlet U$. importación !ava+.servlet.http U$. importación !ava.util.:ateH Tiempo public class 3ttp#ervlet Ipublic void doGet ,3ttp#ervlet6e*uest re*$3ttp#ervlet6esponse 6#P lanza #ervletE+ception$ >5E+ception Irsp.set9ontentT"pe ,te+t DhtmlH Print;riter a cabo rsp.get;riter @ ,H 7echa de ho" @ new :ate ,H D D )a fecha D horaactual out.println ,KhtmlOH out.println ,Time 9hec KheadO KtitleO KD titleO KD headOHout.println ,Kbod"OH out.println ,KpO )a hora es- ahora K D pO H out.println , KD

    bod"O KD htmlO HQQ9on todo$ este servlet es mu" similar a 4"#ervlet . Echemos un vistazo a lo *ue ha" de nuevo-la importación !ava.util.:ateH>mportamos integrado de ava 7echa de la clase de !ava.util pa*uete. 2sted puede leer acercade esta clase en la documentación del AP> de ava$ si eres curioso acerca de sus propiedades "m8todos.7echa de ho" @ new :ate ,H D D )a fecha D hora actual9reamos una nueva variable llamada ahora " almacenar una nueva 7echa de ob!etos enella. 9uando un ob!eto :ate se crea$ contiene la fecha " la hora en *ue fue creado$ " losmostrará cuando se imprime como parte de una cadena -out.println ,KpO )a hora es- ahora KD pOH9ompilar el archivo ,o descargar Time.class  e implementarlo como se muestra en la secciónanterior.Ahora$ cuando se carga http-DDlocalhost-CBCBDservletDTime verás una página como esta-

    3aga clic en Actualizar un par de veces

    en su navegador " ver la página cambia cada vez.6E#24E? M 6E926#5# PA6A )A )E9T26AEn este art/culo$ hemos aprendido los conceptos básicos de ava #ervlets- pe*ue0os programasde ava *ue se e!ecutan dentro de su servidor web " tramitar las solicitudes del navegador "volver generadas dinámicamente páginas ;eb en respuesta. 3emos visto cómo escribir$compilar " desplegar un servlet simple utilizando m8todos estándar soportados por todos losservidores web habilitados para #ervlet.7inalmente$ vimos un e!emplo un poco más comple!o*ue muestra la hora actual cada vez *ue se carga.3a" mucho más para #ervlets de lo *ue vimos a*u/L En la Parte &$ vamos a ver cómo utilizarel3ttp#ervlet6e*uest ob!eto para procesar los env/os de formularios con un servlet. Tambi8nveremos en el3ttp#ervlet6esponse ob!eto para ver *u8 más es capaz de hacer. Por 1ltimo$vamos a aprender algunos trucos más *ue pueden ser utilizados en el web.+ml para a%nar los#ervlets instalados en nuestro servidor web.

    EJEPLOS DE SERVLET.Ejemplo sencillo servlet

    2n sencillo e!emplo de un servletX!avaYimport !ava+.servlet.#ervletE+ceptionHimport !ava+.servlet.http.3ttp#ervletHimport !ava+.servlet.http.3ttp#ervlet6e*uestHimport !ava+.servlet.http.3ttp#ervlet6esponseHimport !ava.io.>5E+ceptionHimport !ava.io.Print;riterHpublic class 3ello;orld#ervlet e+tends 3ttp#ervletIprotected void doGet,3ttp#ervlet6e*uest http#ervlet6e*uest$3ttp#ervlet6esponse http#ervlet6esponsethrows #ervletE+ception$ >5E+ception I

    &]

    http://www.webmasterbase.com/examples/servlets/Time.javahttp://www.webmasterbase.com/examples/servlets/Time.classhttp://www.novacreations.net/27-ejemplo-sencillo-servlet/http://www.webmasterbase.com/examples/servlets/Time.javahttp://www.webmasterbase.com/examples/servlets/Time.classhttp://www.novacreations.net/27-ejemplo-sencillo-servlet/

  • 8/18/2019 Guía de Cliente Servidor Codigo

    27/38

    http#ervlet6esponse.set9ontentT"pe,Rte+tDplainSHPrint;riter out @ http#ervlet6esponse.get;riter,Hout.println,R3ello ;orldLSHout.close,HQQXD!avaY

    ESCRI3IENDO UN SERVLET SIPLEEn seguida se proporcionan los pasos necesarios para hacer funcionar sin problemas un#ervlet$ " realizar un primer análisis de su estructura básica.Para comenzar$ escribiremos un e!emplo sencillo *ue nos va a servir para entender la formabásica de un servlet. El e!emplo consiste en una forma 3T4) en la *ue e+istirá un campo deentrada$ con los correspondientes botones )ubmit  " *eset  t/picos de cual*uier formulario deentrada de datos.A oprimir sobre el botón #ubmit se producirá la e!ecución del #ervlet en el servidor$ *ueprocesará la información recibida$ " mostrará como resultado una página 3T4) con el te+tointroducido con anterioridad.9ódigo 3T4)KhtmlOKheadOKtitleOE!emplo de un #ervlet simpleKDtitleOKDheadOKbod"OKform action@http-DDservidor-CBCBDservletD#ervlet#imple method@P5#TOK5E+ceptionI#ervlet5utput#tream salida @ res.get5utput#tream,Hres.set9ontentT"pe,te+tDhtmlH#tring cadena @ re*.getParameter,TET5Hsalida.println ,KpO:atos capturados - cadena KDpOHQQ 

    )os datos enviados desde la forma son recibidos por el servlet *ue fue invocado por la misma.El código !ava del servlet es el siguiente-Para este primer e!emplo$ el código necesario fue m/nimo$ lo cual es una prueba de la enormepotencia " simplicidad *ue se deriva de la utilización de los #ervlets.

    En el programa destaca principalmente la utilización de lospa*uetes !ava+.servlet.U " !ava+.servlet.http.U$ " la cláusula e+tends *ue de%ne el programacomo una e+tensión de 3ttp#ervlet. El archivo *ue contiene el #ervlet lo

    &

  • 8/18/2019 Guía de Cliente Servidor Codigo

    28/38

    llamaremos )ervlet)imple+-ava. 2na vez *ue ha sido compilado$ usando -avac $ almacenaremosel archivo .class resultante en el directorio Dservlets dentro del directorio donde ha"amosinstalado el servidor de servlets.:escripción del código:entro del código !ava se observa el m8todo principal$ el m8todo service$ el cual esimplementado hasta por el servlet más simple. Este m8todo se encarga de procesar la peticióndel cliente$ " utiliza dos parámetros$ uno de petición " otro de respuesta-En el caso particular del protocolo http se utilizan interfaces

    de 3ttp#ervlet6e*uest " 3ttp#ervlet6esponserespectivamente. Estos parámetros encapsulanlos datos *ue son mandados tanto desde el cliente$ como desde el servidor. :e hecho$normalmente se utilizan m8todos de entrada para recuperar datos desde el cliente$ " m8todosde salida para responder. ?osotros utilizamos #ervlet5utput#teram para responder al cliente.Para recuperar los datos *ue nos manda el cliente$ utilizamos el m8todo getParameter.7inalmente$ utilizando elstream de salida le mandamos la respuesta al cliente.6ealmente$ el programa es mu" sencillo$ pero la funcionalidad mu" alta.E!ecución de los servlets9omo se muestra en la forma html el servlet es invocado como la acción a llevara cabo. Elservlet es habilitado por la utiler/a servletrunner *ue es un programa encargado de probar "e!ecutar los servlets.El servletrunner habilita un puerto por defecto$ el CBCB$ en el servidor de web *ue se est8utilizando para e!ecutar al servlet. Para invocar entonces al servlet debemos emplear el url conla siguiente forma-http-DDnombreFservidor-CBCBDservletDnombreFservletnombreFservidor :irección del host *ue alberga al servidor de web-CBCB Puerto asignado por defecto por el servletrunnerDservlet :irectorio virtual donde residirán los servletsnombreFservlet ?ombre del programa *ue identi%ca al servletEntonces$ la e!ecución de servlet e!emplo aparece mostrada en la %gura ($ *ue es la formahtml *ue recibe la captura del te+to.

    )a e!ecución del servlet arro!a la siguiente salida en el navegador como resultado. Zer 7igura7igura (. 7ormahtml parallamar al

    servlet )ervlet)imple

    En la sección de compilación " e!ecución de servlets creamos un servletllamado 1ola+n-o./ava cu"o código fuente era el siguiente-$port /ava#.servlet.H$port /ava#.servlet.6ttp.H$port /ava.o.H

    p+'lc class 1ola+n-o e#ten-s 1ttpServlet

      p+'lc vo- nt

  • 8/18/2019 Guía de Cliente Servidor Codigo

    29/38

      K

      p+'lc vo- servce

  • 8/18/2019 Guía de Cliente Servidor Codigo

    30/38

      o+t.prntln

  • 8/18/2019 Guía de Cliente Servidor Codigo

    31/38

      Prnt@rter o+t res.*et@rter

  • 8/18/2019 Guía de Cliente Servidor Codigo

    32/38

      t6ro&s ServletE#cepton; IOE#cepton   res.setContentTpe

  • 8/18/2019 Guía de Cliente Servidor Codigo

    33/38

      !6%9or$+laro!)6%  !0or$ $et6o-8POST8 acton8)t+toral)servlet)Para$etros8%  No$'reB !INPUT T:PE8TET8 NAE8no$'re8%!3R%  Pr$er Apell-oB!INPUT T:PE8TET8 NAE8apell-o8%!3R%  Se*+n-o Apell-oB!INPUT T:PE8TET8 NAE8apell-o8%!3R%  !6r%  Correo electroncoB !INPUT T:PE8TET8 NAE8e$al8%!3R%  ClaveB !INPUT T:PE8PASS@ORD8 NAE8clave8%!3R%

      !6r%  Co$entaroB !TETAREA NAE8co$enta8 RO@S COLSQ%  !)TETAREA%!3R%  !6r%  Se#oB!3R%

    !INPUT T:PE8RADIO8 NAE8se#o8 VALUE86o$'re8%1o$'re!3R%  !INPUT T:PE8RADIO8 NAE8se#o8 VALUE8$+/er8%+/er!3R%

      Areas -e nterésB!'r%  !SELECT NAE8ntereses8 ULTIPLE%

      !OPTION%In0or$atca!)OPTION%  !OPTION%Derec6o!)OPTION%

    !OPTION%ate$atcas!)OPTION%!OPTION%9sca!)OPTION%!OPTION%+sca!)OPTION%

      !)SELECT%

      !center%!np+t tpe8s+'$t8 val+e8Envar8%!)center%  !)0or$%!)'o-%!)6t$l%Zeamos primero un servlet *ue conociendo de antemano los distintos parámetros *ue va arecibir los va"a mostrando en una página 3T4). El servlet lo llamaremosPara$etros./ava "su código es-$port /ava#.servlet.H

    $port /ava#.servlet.6ttp.H$port /ava.o.H

    p+'lc class Para$etros e#ten-s 1ttpServlet

      p+'lc vo- nt

  • 8/18/2019 Guía de Cliente Servidor Codigo

    34/38

  • 8/18/2019 Guía de Cliente Servidor Codigo

    35/38

    ))S tene $s -e +n s>lo valor; los $ostra$os  0or

  • 8/18/2019 Guía de Cliente Servidor Codigo

    36/38

    7inalmente$ nos permite seleccionar el o los framewors a utilizar ,#pring$ #truts$ #7$ etc. ?oseleccionamos nada pues$ por ahora$ para este e!empo$ no vale la pena.?et

  • 8/18/2019 Guía de Cliente Servidor Codigo

    37/38

    :ados el nombre del servlet " el pa*uete$ hacemos clic sobre 9ns6.7inalizado esto$ automáticamente crea una clase con el nombre de servlet dado ,#ervletF3olapara nosotros$ *ue hereda de 1ttpServlet. Además rede%ne ,override algunos m8todos,-oGet; -oPost; *etServletIn0o " los rellena con un poco de código. Además$ crea unm8todo processRe2+est ,invocado desde los m8todos doGet " doPost para procesar losformularios *ue llegan por los m8todos GET " P5#T.?osotros$ en este e!emplo$ nos limitaremos completar con unas pocas l/neas ,pues la ma"or/ala completó automáticamente el ?eti*port java.io.>i*port java0.servlet.>i*port java0.servlet.http.>

     public class Servlet&Hola extends HttpServlet 7 

    /**

    * Processes requests for both HTTP GET and POST

    methods.

      * @param request servet request

      * @param response servet response

      */ 

       protected  void pro"essRe:2est9HttpServletRe:2est re:2est;HttpServletResponse response<  throws ServletE0"eption; IOException 7  response.setContentType9te0t!ht*l>"harset-BT#  PrintWriter o2t - response.%etWriter9  try 7  /*

    TO!O output "our pa#e here

      */ 

      o2t.println9+ht*l/  o2t.println9+head/  o2t.println9+title/Servlet Servlet&Hola+!title/

    o2t.println9+!head/  o2t.println9+)ody/  o2t.println9+p/  o2t.println9Hola +stron%/ @re:2est.%etPara*eter9no*)re

  • 8/18/2019 Guía de Cliente Servidor Codigo

    38/38

      * @param request servet request

      * @param response servet response

      */ 

       protected  void do6et9HttpServletRe:2est re:2est; HttpServletResponseresponse<  throws ServletE0"eption; IOException 7  pro"essRe:2est9re:2est; response  8

      /*** Handes the HTTP POST method.

      * @param request servet request

      * @param response servet response

      */ 

       protected  void doPost9HttpServletRe:2est re:2est; HttpServletResponseresponse<  throws ServletE0"eption; IOException 7  pro"essRe:2est9re:2est; response  8  /**

    * +eturns a short descr$pt$on of the servet.

      */ 

       public String %etServletIn,o9