<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Mundo Geek &#187; servlets</title>
	<atom:link href="http://mundogeek.net/etiqueta/servlets/feed/" rel="self" type="application/rss+xml" />
	<link>http://mundogeek.net</link>
	<description>Mundo geek, bitácora sobre todo lo geek: software, gadgets, tecnología, internet, ...</description>
	<lastBuildDate>Wed, 08 Feb 2012 16:09:25 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Servlets</title>
		<link>http://mundogeek.net/archivos/2007/01/26/servlets/</link>
		<comments>http://mundogeek.net/archivos/2007/01/26/servlets/#comments</comments>
		<pubDate>Fri, 26 Jan 2007 09:30:13 +0000</pubDate>
		<dc:creator>Zootropo</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[desarrollo]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[programacion]]></category>
		<category><![CDATA[servlets]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://mundogeek.net/archivos/2007/01/26/servlets/</guid>
		<description><![CDATA[Los servlets son una tecnología hermana de los JSP, como ya comentamos en el artículo sobre estos últimos. Un servlet no es más que una clase que implementa la interfaz Servlet (que se encuentra dentro del paquete javax.servlet, como todas las clases e interfaces que comentaremos) o que extiende de la clase GenericServlet, que proporciona [...]]]></description>
			<content:encoded><![CDATA[<p>Los servlets son una tecnología hermana de los JSP, como ya comentamos <a href="http://mundogeek.net/archivos/2007/01/25/jsp-javaserver-pages/" title=" JSP: JavaServer Pages">en el artículo sobre estos últimos</a>.</p>
<p>Un servlet no es más que una clase que implementa la interfaz <code>Servlet</code> (que se encuentra dentro del paquete <code>javax.servlet</code>, como todas las clases e interfaces que comentaremos) o que extiende de la clase <code>GenericServlet</code>, que proporciona una implementación por defecto para los métodos definidos en la primera. <code>GenericServlet</code> es independiente del protocolo utilizado, si nuestro servlet sólo va a usar HTTP podemos heredar de la clase <code>HttpServlet</code>.</p>
<p>Para escribir un servlet que extienda <code>GenericServlet</code> tendremos que sobre escribir el método abstracto <code>service()</code> y añadir ahí el código que queramos que se ejecute cuando se llame al servlet. En el caso de <code>HttpServlet</code> la implementación por defecto del método <code>service</code> comprueba si la petición recibida era de tipo POST (los parámetros se pasan en la cabecera del mensaje) o de tipo GET (los parámetros están en la URL, luego son visibles para todo el mundo), y llama a los métodos <code>doPost</code> o <code>doGet</code> dependiendo de esto.<span id="more-969"></span></p>
<p>Tanto <code>doGet</code> como <code>doPost</code> reciben como parámetros objetos de tipo <code>HttpServletRequest</code> y <code>HttpServletResponse</code>.</p>
<p>De la clase <code>HttpServletRequest</code> nos interesa el método <code>getParameter(String nombreParametro)</code>, que devuelve el valor del parámetro de nombre nombreParametro. Por ejemplo, si visitáramos la URL http://localhost:8080/ejemplo/hola?nombre=Raul&#038;apellido=Gonzalez (vemos que es una petición GET, porque los parámetros se pasan en la URL) el servlet hola podría llamar a <code>getParameter("nombre")</code> para obtener el nombre o <code>getParameter("apellido")</code> para obtener el apellido.</p>
<p>De <code>HttpServletRequest</code> también nos interesa el método <code>getSession(boolean crear)</code>, que nos devuelve un objeto de tipo <code>HttpSession</code> y cuyo parámetro indica si debería crearse una sesión o no para ese usuario en caso de que no exista ya. Una sesión es el mecanismo por el cual podemos identificar una serie de iteraciones de un cliente con nuestra aplicación, y guardar y obtener valores que se mantengan para ese usuario durante las distintas peticiones que haga durante la sesión. En castellano:</p>
<ol>
<li>Un usuario pide una de nuestras páginas JSP o uno de nuestros servlets, por ejemplo la página de login.</li>
<li>Se crea una cookie (también se pueden usar otros métodos) en el navegador del usuario, con un identificador aleatorio.</li>
<li>Ahora, en nuestro JSP o servlet podemos guardar valores cualquiera que podrán ser vistos por las demás páginas JSP o servlets de nuestra aplicación que visite el usuario. Por ejemplo guardamos el nombre de usuario que ha introducido.</li>
<li>Si el usuario visita otra de nuestras páginas podemos obtener el valor que guardamos en la sesión. Por ejemplo, podemos obtener el nombre de usuario que guardamos e imprimirlo en la parte superior de la página con un &#8220;Bienvenido Zootropo&#8221;.</li>
</ol>
<p>El método de <code>HttpSession</code> que se utiliza para guardar objetos en la sesión es <code>setAttribute(String nombre, Object objeto)</code> y el método que se utiliza para obtener los objetos que guardamos, <code>getAttribute(String nombre)</code>. No obstante hay que tener en cuenta que los objetos que guardamos en la sesión deben ser serializables (implementar <code>Serializable</code>).</p>
<p>Un concepto similar al de las sesiones sería el de contexto de Servlet. Este permite guardar y recuperar valores, pero estos valores serán comunes para todos los usuarios de la aplicación. Se representa por un objeto <code>ServletContext</code> que obtenemos a partir del método <code>getServletContext()</code> de <code>GenericServlet</code> y tiene métodos <code>getAttribute</code> y <code>setAttribute</code> al estilo de la sesión.</p>
<p>De la clase <code>HttpServletResponse</code> nos interesa el método <code>getWriter()</code>, que devuelve un objeto de tipo <code>PrintWriter</code> con el que escribir en el navegador usando el método <code>println(String texto)</code> y <code>sendRedirect(String url)</code>, que permite enviar al navegador una instrucción de redirección a la página que deseemos.</p>
<p>Similar a <code>sendRedirect</code> es el método <code>forward(HttpServletRequest request, HttpServletResponse response)</code> de la clase <code>RequestDispatcher</code>, que se diferencia en que es más rápido, porque se trata a nivel de servidor, pero no permite redireccionar a URLs externas a la aplicación. El objeto <code>RequestDispatcher</code> se obtiene a partir del request mediante el método <code>getRequestDispatcher(String url)</code>.</p>
<p>Tanto <code>sendRedirect</code> como <code>forward</code> no hacen más que redirecciones, es decir, su objetivo no es el de escribir parte del documento y delegar después el resto a otro servlet; ese es el cometido del método <code>include</code> de <code>RequestDispatcher</code>.</p>
<p>Otros métodos de <code>HttpServlet</code> son <code>init()</code>, que se lanza al iniciar el servlet, y <code>destroy()</code>, que se lanza cuando se destruye. Hay que tener en cuenta que, dado que el proceso de creación de un servlet es muy costoso en tiempo, no se crea un nuevo servlet para cada petición del cliente (y evidentemente tampoco se destruye cuando se termina de procesar), lo cual implica, entre otras cosas, que <code>init()</code> y <code>destroy()</code> sólo se llaman una vez y que hay que andar con pies de plomo a la hora de usar variables de instancia dado que pueden provocar problemas de concurrencia. Esto también es así en el caso de los JSP, que como ya dijimos, no son más que servlets al fin y al cabo.</p>
<p>La forma de un servlet típico entonces sería algo así:</p>
<blockquote><p><code>
<pre>
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class MiServlet extends HttpServlet {
  public void init() throws ServletException {
    // Inicio
  }

  public void doGet(HttpServletRequest request, HttpServletResponse response)	throws ServletException, IOException {
    String nombre = request.getParameter("nombre");
    res.setContentType("text/html");
    PrintWriter out = response.getWriter();
    out.println("<html><body>Hola" + nombre + "</body></html>");
    out.close();
  }

  public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    try{
      doGet(request, response);
    }catch (Exception e){
      e.printStackTrace();
    }
  }

  public void destroy() {
    // Fin
  }
}</pre>
<p></code></p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://mundogeek.net/archivos/2007/01/26/servlets/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
		<item>
		<title>Apache y Tomcat en Windows</title>
		<link>http://mundogeek.net/archivos/2006/04/04/apache-y-tomcat-en-windows/</link>
		<comments>http://mundogeek.net/archivos/2006/04/04/apache-y-tomcat-en-windows/#comments</comments>
		<pubDate>Tue, 04 Apr 2006 11:44:44 +0000</pubDate>
		<dc:creator>Zootropo</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[jakarta]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[jsp]]></category>
		<category><![CDATA[servlets]]></category>
		<category><![CDATA[tomcat]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://mundogeek.net/archivos/2006/04/04/apache-y-tomcat-en-windows/</guid>
		<description><![CDATA[Apache y Tomcat en Linux La instalación de Apache y Tomcat en Windows no tiene mayor complicación, basta con ejecutar los instaladores que podemos encontrar en sus respectivas webs (Apache / Tomcat). La instalación del módulo conector tampoco tiene misterio, y es similar a lo que ya vimos en Linux. El conector puede descargarse en [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://mundogeek.net/archivos/2006/04/03/apache-y-tomcat-en-linux/" title="Apache y Tomcat en Linux"><img src="http://mundogeek.net/browsers/linux.png" alt="Apache y Tomcat en Linux"/> Apache y Tomcat en Linux</a></p>
<p>La instalación de Apache y Tomcat en Windows no tiene mayor complicación, basta con ejecutar los instaladores que podemos encontrar en sus respectivas webs (<a href="http://httpd.apache.org/download.cgi" title="Apache">Apache</a> / <a href="http://tomcat.apache.org/download-55.cgi" title="Tomcat">Tomcat</a>). La instalación del módulo conector tampoco tiene misterio, y es similar a <a href="http://mundogeek.net/archivos/2006/04/03/apache-y-tomcat-en-linux/" title="Apache y Tomcat en Linux">lo que ya vimos en Linux</a>.</p>
<p>El conector puede <a href="http://tomcat.apache.org/download-connectors.cgi" title="Conector mod_jk">descargarse en la misma web de Tomcat</a>; no tenemos más que seleccionar el mirror a utilizar, la versión binaria de mod_jk (JK 1.2 Binary Releases) y descargar el archivo .so correspondiente a la versión de Apache que instalamos.</p>
<p>Copiaremos este archivo en la carpeta modules de Apache, renombrándolo como mod_jk.dll</p>
<p>La configuración es casi calcada a la de Linux. Crearemos un archivo workers.properties en la carpeta conf de Apache con el siguiente contenido:<span id="more-774"></span></p>
<blockquote><p><code>workers.tomcat_home=<em>Directorio en que instalamos Tomcat</em><br />
workers.java_home=<em>Directorio en que instalamos el JDK</em><br />
ps=\<br />
worker.list=default</p>
<p>worker.default.port=8009<br />
worker.default.host=localhost<br />
worker.default.type=ajp13<br />
worker.default.lbfactor=1</code></p></blockquote>
<p>Y editamos el archivo de configuración de Apache (httpd.conf en la carpeta conf) para que se cargue el módulo al iniciar el servidor. En la sección LoadModules añadimos:</p>
<blockquote><p><code>LoadModule jk_module modules/mod_jk.so</code></p></blockquote>
<p>Y al final del archivo:</p>
<blockquote><p><code>JkWorkersFile "conf/workers.properties"<br />
JkLogFile "logs/mod_jk.log"<br />
JkLogLevel warn</p>
<p>JkMount /servlets-examples default<br />
JkMount /servlets-examples/* default</code></p></blockquote>
<p>JkMount es la línea que indica a Apache que solicitudes reenviar a Tomcat. En este caso llamaremos a Tomcat siempre que se intente acceder a cualquier archivo del directorio servlets-examples, donde se guardan algunos ejemplos para demostrar el uso de Servlets, utilizando el protocolo definido por “default”.</p>
<p>Por último iniciamos Tomcat y Apache. Al introducir la URL http://localhost deberíamos ver la web de bienvenida de Apache, al introducir http://localhost:8080 la de Tomcat, y con http://localhost/servlets-examples Apache enviará la petición a Tomcat. </p>
]]></content:encoded>
			<wfw:commentRss>http://mundogeek.net/archivos/2006/04/04/apache-y-tomcat-en-windows/feed/</wfw:commentRss>
		<slash:comments>66</slash:comments>
		</item>
		<item>
		<title>Apache y Tomcat en Linux</title>
		<link>http://mundogeek.net/archivos/2006/04/03/apache-y-tomcat-en-linux/</link>
		<comments>http://mundogeek.net/archivos/2006/04/03/apache-y-tomcat-en-linux/#comments</comments>
		<pubDate>Mon, 03 Apr 2006 10:24:58 +0000</pubDate>
		<dc:creator>Zootropo</dc:creator>
				<category><![CDATA[General]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[jakarta]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[jsp]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[servlets]]></category>
		<category><![CDATA[tomcat]]></category>

		<guid isPermaLink="false">http://mundogeek.net/archivos/2006/04/03/apache-y-tomcat-en-linux/</guid>
		<description><![CDATA[Apache y Tomcat en Windows Tomcat es un contenedor de servlets (es lo que necesitamos para ejecutar JSP y Servlets) creado por la fundación Apache dentro del proyecto Jakarta. Aunque se puede utilizar como servidor web no está tan optimizado como el servidor web de la misma fundación, Apache. El siguiente tutorial tiene como objetivo [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://mundogeek.net/archivos/2006/04/04/apache-y-tomcat-en-windows/" title="Apache y Tomcat en Windows"><img src="http://mundogeek.net/browsers/windows.png" alt="Apache y Tomcat en Windows"/> Apache y Tomcat en Windows</a></p>
<p>Tomcat es un contenedor de servlets (es lo que necesitamos para ejecutar JSP y Servlets) creado por la fundación Apache dentro del proyecto Jakarta. Aunque se puede utilizar como servidor web no está tan optimizado como el servidor web de la misma fundación, Apache. El siguiente tutorial tiene como objetivo mostrar cómo lograr que las peticiones a Apache se redirijan a Tomcat utilizando un conector (en este caso jk). A lo largo del tutorial se compilarán los paquetes a partir del código fuente, en lugar de utilizar precompilados, por lo que debería poder seguirse facilmente utilizando cualquier distribución.</p>
<h3>Instalación del JDK</h3>
<p>Evidentemente lo primero que necesitamos para desarrollar en Java es instalar el kit de desarrollo (JDK) que podemos <a href="http://java.sun.com/j2se/1.5.0/download.jsp" title="J2SE 1.5.0">descargar desde la web de Sun</a>. A la hora de escribir este tutorial la última versión es la 5.0 Update 6. Utilizaremos la versión autoextraible (Linux self-extracting file) en lugar del paquete RPM.<span id="more-773"></span></p>
<blockquote><p><code>su<br />
<em>Introducir contraseña de root</em><br />
cp -p jdk-1_5_0_06-linux-i586.bin /usr/local<br />
cd /usr/local<br />
chmod +x jdk-1_5_0_06-linux-i586.bin<br />
./jdk-1_5_0_06-linux-i586.bin<br />
rm jdk-1_5_0_06-linux-i586.bin<br />
</code></p></blockquote>
<p>Esto extraerá el contenido del archivo en una nueva carpeta jdk1.5.0_06 en /usr/local. Ahora basta crear la variable de entorno para indicar dónde está instalado el JDK y añadir a la variable PATH el directorio en el que se encuentran los binarios para poder ejecutarlos desde cualquier sitio. Para ello abrimos el archivo /etc/profile con nuestro editor favorito (como root) y añadimos las siguientes líneas al final:</p>
<blockquote><p><code>JAVA_HOME=/usr/local/jdk1.5.0_06<br />
PATH=$PATH:$JAVA_HOME/bin<br />
export PATH JAVA_HOME</code></p></blockquote>
<p>Actualizamos las variables de entorno:</p>
<blockquote><p><code>source /etc/profile</code></p></blockquote>
<p>Si todo ha salido bien al escribir <code>javac -version</code> deberíamos obtener el número de versión del compilador de Java. En el caso de que algo halla salido mal el sistema nos informará de que no encontró ningún ejecutable con ese nombre.</p>
<h3>Compilar e instalar Apache</h3>
<p><a href="http://httpd.apache.org/download.cgi" title="Servidor web Apache">Descargamos</a> el código fuente de la aplicación desde la web de la fundación. Descomprimimos, compilamos e instalamos:</p>
<blockquote><p><code>cp -p httpd-2.2.0.tar.gz /usr/local/src/<br />
cd /usr/local/src<br />
tar xvzf httpd-2.2.0.tar.gz<br />
rm httpd-2.2.0.tar.gz<br />
cd /usr/local/src/httpd-2.2.0<br />
./configure --prefix=/usr/local/apache --enable-module=most --enable-mods-shared=most<br />
make<br />
make install</code></p></blockquote>
<p>Con esto habremos instalado Apache en /usr/local/apache. Vamos a probar la configuración por defecto y a intentar iniciar el servidor:</p>
<blockquote><p><code>/usr/local/apache/bin/apachectl configtest<br />
/usr/local/apache/bin/apachectl start<br />
</code></p></blockquote>
<p>Si todo ha funcionado correctamente deberíamos poder abrir la URL http://localhost en un navegador y ver la página de bienvenida de Apache.</p>
<p>Detengamos Apache hasta que instalemos Tomcat y el conector:</p>
<blockquote><p><code>/usr/local/apache/bin/apachectl stop</code></p></blockquote>
<h3>Compilar e instalar Tomcat</h3>
<p><a href="http://tomcat.apache.org/" title="Tomcat">Descargamos</a> la aplicación desde su web. En este caso no tenemos más que descomprimir el archivo en el directorio que queramos, ya que se trata de una aplicación Java.</p>
<blockquote><p><code>cp -p apache-tomcat-5.5.16.tar.gz /usr/local/<br />
cd /usr/local<br />
tar xvzf apache-tomcat-5.5.16.tar.gz<br />
rm apache-tomcat-5.5.16.tar.gz<br />
</code></p></blockquote>
<p>De nuevo vamos a editar /etc/profile para añadir la variable de entorno CATALINA_HOME:</p>
<blockquote><p><code>CATALINA_HOME=/usr/local/apache-tomcat-5.5.16<br />
export CATALINA_HOME</code></p></blockquote>
<p>Y actualizamos:</p>
<blockquote><p><code>source /etc/profile</code></p></blockquote>
<p>Por último ejecutamos el script de iniciación de tomcat:</p>
<blockquote><p><code>/usr/local/apache-tomcat-5.5.16/bin/startup.sh</code></p></blockquote>
<p>Deberías ver la página de bienvenida de Tomcat introduciendo la URL http://localhost:8080 en un navegador.</p>
<p>Por ahora vamos a parar Tomcat</p>
<blockquote><p><code>/usr/local/apache-tomcat-5.5.16/bin/shutdown.sh</code></p></blockquote>
<p>En este momento tenemos instalados ambos servidores que correrían de forma independiente, con Apache escuchando en el puerto 80 y Tomcat escuchando en el 8080.</p>
<h3>Compilar e instalar el conector JK</h3>
<p>Existen dos versiones del conector, JK y JK2. Aunque parezca raro la versión que nos interesa instalar es la primera, ya que la segunda está descontinuada. El código fuente se puede <a href="http://tomcat.apache.org/download-connectors.cgi" title="Conector jk">descargar</a> desde la web de Tomcat.</p>
<p>Vamos a compilar el módulo mod_jk.so (debería colocarlo en la carpeta de módulos del servidor Apache):</p>
<blockquote><p><code><br />
cp -p jakarta-tomcat-connectors-1.2.15-src.tar.gz /usr/local/src/<br />
cd /usr/local/src<br />
tar xvzf jakarta-tomcat-connectors-1.2.15-src.tar.gz<br />
rm jakarta-tomcat-connectors-1.2.15-src.tar.gz<br />
cd jakarta-tomcat-connectors-1.2.15-src/jk/native/<br />
./buildconf.sh<br />
./configure --with-apxs=/usr/local/apache/bin/apxs<br />
make<br />
make install</code></p></blockquote>
<p>Y ahora sólo falta configurarlo. Creamos un nuevo archivo workers.properties en /usr/local/apache/conf con el siguiente contenido:</p>
<blockquote><p><code><br />
workers.tomcat_home=/usr/local/apache-tomcat-5.5.16/<br />
workers.java_home=$JAVA_HOME<br />
ps=/<br />
worker.list=default</p>
<p>worker.default.port=8009<br />
worker.default.host=localhost<br />
worker.default.type=ajp13<br />
worker.default.lbfactor=1<br />
</code></p></blockquote>
<p>Editamos el archivo de configuración de Apache (/usr/local/apache/conf/httpd.conf) para cargar el módulo. En la sección LoadModules añadimos:</p>
<blockquote><p><code>LoadModule jk_module modules/mod_jk.so</code></p></blockquote>
<p>Y al final del archivo:</p>
<blockquote><p><code>JkWorkersFile "conf/workers.properties"<br />
JkLogFile "logs/mod_jk.log"<br />
JkLogLevel warn</p>
<p>JkMount /jsp-examples default<br />
JkMount /jsp-examples/* default</code></p></blockquote>
<p>JkMount es la línea que indica a Apache que solicitudes reenviar a Tomcat. En este caso llamaremos a Tomcat siempre que se intente acceder a cualquier archivo del directorio jsp-examples, donde se guardan algunos ejemplos para demostrar el uso de JSP, utilizando el protocolo definido por &#8220;default&#8221;. También podríamos haber utilizado algo del estilo *.jsp para ejecutar Tomcat sólo en el caso de que los archivos terminaran con esta extensión.</p>
<p>Por último iniciamos Apache y Tomcat:</p>
<blockquote><p><code>/usr/local/apache-tomcat-5.5.16/bin/startup.sh<br />
/usr/local/apache/bin/apachectl start<br />
</code></p></blockquote>
<p>Al introducir la URL http://localhost deberíamos ver la web de bienvenida de Apache, al introducir http://localhost:8080 la de Tomcat, y con http://localhost/jsp-examples Apache enviará la petición a Tomcat.</p>
]]></content:encoded>
			<wfw:commentRss>http://mundogeek.net/archivos/2006/04/03/apache-y-tomcat-en-linux/feed/</wfw:commentRss>
		<slash:comments>111</slash:comments>
		</item>
	</channel>
</rss>

