feed twitter facebook LinkedIn facebook

Java » Obtener la IP que invoca al servlet

enero 12, 2008 por Víctor Cuervo 9 Comentarios Imprimir Imprimir

Mediante el siguiente código podremos recuperar la IP del usuario que está realizando la petición sobre el servlet. Dadas todas las circunstancias que pueden rodear a la topología de las redes la IP que obtendremos no tiene porque ser la IP del usuario final, sino que fácilmente podría ser la IP de un proxy intermedio,... Es por ello que el ejemplo hay que utilizarle con fines didácticos y si lo usamos para producción, con un gran cuidado.

La IP de la máquina que invoca es una información que al servlet le llega en la petición, consecuentemente sus métodos doGet y doPost lo tendrán en el objeto HttpServletRequest.

Continue reading Obtener la IP que invoca al servlet...

Java » SingleThreadModel, concurrencia en servlet obsoleta

diciembre 29, 2007 por Víctor Cuervo Sin Comentarios Imprimir Imprimir

Podríamos describir el ciclo de vida de un servlet, someramente, de la siguiente forma

Si el servlet sobre el que se ha realizado una petición no está cargado en el contenedor web, este crea una instancia de la clase servlet, ejecuta su método init y posteriormente dará servicio con alguno de los métodos de servicio: doGet, doPost, doPut,...

Continue reading SingleThreadModel, concurrencia en servlet obsoleta...

Java » Mi primer servlet

diciembre 27, 2007 por Víctor Cuervo Sin Comentarios Imprimir Imprimir

En este ejemplo vamos a desarrollar nuestro primer servlet, el cual nos de como respuesta la frase "Este es mi primer Servlet".

Crear el Servlet

La clase Java que implemente el servlet deberá de extender la clase javax.servlet.HttpServlet.

  1. public class MiPrimerServlet extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
  2. ...
  3. }

Dentro de esta clase tenemos que codificar, al menos, un método. El método doGet. Este método es el que se ejecuta cuando el servlet recibe una petición del tipo GET (las más normales en Internet).

Continue reading Mi primer servlet...

Java » Recibir parametros en un Servlet

diciembre 25, 2007 por Víctor Cuervo 10 Comentarios Imprimir Imprimir

A la hora de enviar información a un servlet tenemos dos formas: mediante el método GET y mediante el método POST. Existen una serie de diferencias entre pasarlos de una forma u otra:

Metodo POST. Este método solo esta accesible desde los formularios. Se envían los parámetros de forma implícita junto a la página, es decir, al pasar los parámetros, nosotros no vemos reflejado en ningún sitio qué parámetros son y cual es su valor.

Método GET. Este método envía los parámetros de forma explicita junto a la página, mostrando en la barra de navegación los parámetros y sus valores. Son esas largas cadenas que aparecen en algunas páginas en nuestra barra de navegación, del estilo: buscar?id=1806&valor=0987&texto=todo&...

Continue reading Recibir parametros en un Servlet...

Java » Redirigir todas las JSP a un Servlet

noviembre 30, 2006 por Víctor Cuervo 5 Comentarios Imprimir Imprimir

Ciertos modelos de arquitectura son participes de evitar el acceso directo a las páginas JSP para poder hacer ciertas validaciones. Esto implica que cada vez que alguien ponga una URL sobre nuestro sitio con *.jsp sea reenviado a un servlet.

Continue reading Redirigir todas las JSP a un Servlet...

Java » Crear un mapping a un servlet

noviembre 14, 2006 por Víctor Cuervo 3 Comentarios Imprimir Imprimir

El proceso de puesta en servicio de un servlet podríamos resumirlo en dos pasos. El primero de ellos es crear el servlet. Para ello implementaremos una clase java que extienda de HttpServlet, la cual implementará la funcionalidad de negocio que estemos resolviendo.

Pero de nada nos sirve el crear un servlet si no lo publicicamos al exterior. Este mecanismo de publicación es lo que se conoce como mapping.

La idea del mapping es la de asociar una URL o un patrón de una URL a un servlet.

Para ello deberemos de configurar el descriptor de despliegue de la aplicación. Este es el fichero que encontramos en /WEB-INF/web.xml

En este fichero necesitaremos de la etiqueta <servlet-mapping>. Esta etiqueta nos permitirá definir un nuevo mapping. Anidado a esta etiqueta encontramos dos: la primera especificará el nombre del servlet sobre el que queremos establecer el mapping <servlet-name>, mientras que la segunda especificará sobre que URL se realiza el mapping <url-pattern>.

<servlet-mapping>
  <servlet-name>MiServlet</servlet-name>
  <url-pattern>/URLDelServlet</url-pattern>
</servlet-mapping>

Con este mapping toda las peticiones que se hagan a la URL http://miservidor/URLDelServet serán procesadas por el Servlet "MiServlet".

Java » Modificar time-out de sesión

noviembre 12, 2006 por Víctor Cuervo 9 Comentarios Imprimir Imprimir

Cuando un usuario realiza una conexión contra una aplicación web se le crea una sesión. La sesión es la identidad que tiene dicho usuario en el servidor hasta que se desconecta.

En la sesión de un usuario se podrá almacenar información que queramos que previva mientras el usuario permanezca conectado a nuestra web.

Y esta última frase es el kit de la cuestión. ¿Cúando sabemos que un usuario se ha desconectado? Pues es difícil, ya que el protocolo HTTP es sin estado y las peticiones vienen y van sin un control. Es por ello que la única forma de saber que un usuario se ha ido es indicando un tiempo de caducidad de la sesión, más conocido como timeout de sesión.

Dependiendo del contenedor de servlets que estemos utilizando, este establecerá el timeout de sesión en un valor u otro atendiendo a unos parámetos de configuración.

Por ejemplo, Tomcat utiliza el fichero /conf/web.xml para configurarla, como podemos ver en estas líneas de código:

<!-- ==== Default Session Configuration ==== -->
<!-- You can set the default session timeout (in minutes) for all newly   -->
<!-- created sessions by modifying the value below.                       -->
<session-config>
<session-timeout>30</session-timeout>
</session-config>

Como vemos, establece 30 minutos como tiempo máximo de inactividad.

Pero cuando creemos una aplicación podemos indicar un tiempo de timeout sobre esta aplicación. Y es que quien no nos dice que nuestra aplicación pueda correr sobre varios contenedores de servlets.

Para configurar el timeout de la sesión de nuestra aplicación deberemos de configurar el descriptor de despliegue de la misma (/WEB-INF/web.xml). Para ello utilizremos la etiqueta < session-config> y anidada a ella <session-timeout>. Vamos, que son las mismas etiquetas que utiliza Tomcat.

Así, el código nos quedaría de la siguiente forma:

<session-config>
<session-timeout>10</session-timeout>
</session-config>

En este caso establecemos el tiempo de timeout a 10 minutos.

Java » Leer parámetros de inicialización de un servlet

noviembre 11, 2006 por Víctor Cuervo 1 Comentario Imprimir Imprimir

En la vida de ejecución de un servlet, este, recuperará información de múltiples sitios. Por ejemplo recibirá en la petición información vía parámetros, recuperará datos de múltiples orígenes: bases de datos, ficheros,…

Uno de los sitios de donde podrá recuperar información son los parámetros de inicialización del servlet.

Cuando creamos un servlet y lo definimos en el descriptor de despliegue, podemos indicarle que el servlet lleva asociado parámetros de inicialización y los valores de dichos parámetros.

El uso de estos parámetros es muy potente, ya que se pueden modificar sus valores, con el fin de obtener un comportamiento diferente del servlet, sin necesidad de recompilar este.

Algunos de los usos de los parámetros de inicialización podrían ser:

  • Tiempos de control de peticiones
  • Nombres de recursos externos a los que acceder: ficheros, bases de datos,…
  • Nivel de log que se quiere aplicar al programa.

Siempre suelen ser cosas relativas a la configuración del servlet.

Lo primero que tenemos que hacer es definir en el descriptor de despliegue (/WEB-INF/web.xml) del servlet:

<servlet>
  <description>Ejemplo ...bla bla bla.</description>
  <display-name>ParametrosInicio</display-name>
  <servlet-name>ParametrosInicio</servlet-name>
  <servlet-class>com.lineadecodigo.ParametrosInicio</servlet-class>
</servlet>

El servlet se define mediante la etiqueta <servlet>. Anidada a esta tenemos dos etiquetas importantes. <servlet-name> será el nombre de referencia del servlet y <servlet-class> será la clase java que implementa dicho servlet.

Los parámetros del servlet

En nuestro ejemplo vamos a definir dos parámetros. El primero será NivelLog que almacenará el tipo de log con el que grabaremos y NumeroPeticiones que nos pasará un indicador de limitación.

<servlet>
  <init-param>
    <description>Nivel de log a aplicar</description>
    <param-name>NivelLog</param-name>
    <param-value>DEBUG</param-value>
  </init-param>
  <init-param>
    <description>Número de peticiones para atender</description>
    <param-name>NumeroPeticiones</param-name>
    <param-value>8</param-value>
  </init-param>
</servlet>

Una vez que hemos definido esto en el descriptor de despliegue, tendremos que acceder a los valores desde el servlet.

Lo más normal es acceder a esta información en el método init(). Si es que la información aplica a todas las peticiones del servlet.

Para recuperar los parámetros tenemos que acceder a el método .getInitParameter(String parámetro) que permite acceder al valor del parámetro pasado como argumento a dicho método.

Así, para recuperar los valores de nuestro ejemplo tendremos el siguiente código:

  1. _nivelLog = getInitParameter("NivelLog");
  2. _numeroPeticiones = Integer.parseInt(getInitParameter("NumeroPeticiones"));

Hay que fijarse que los valores de los parámetros de inicio son devueltos como cadenas de texto. Es por ello que tendremos que hacer el tratamiento necesario para convertirlo en otro tipo de dato.

En nuestro caso convertirlo a entero mediante Integer.parseInt(String cadena).

Tanto _nivelLog como _numeroPeticiones lo hemos definido como atributos generales del servlet para que puedan ser utilizados en todo momento.

Java » Reenviar petición a otro Servlet

noviembre 8, 2006 por Víctor Cuervo 4 Comentarios Imprimir Imprimir

No siempre un Servlet estará codificado para atender a una petición. Sino que muchas veces y por muchos motivos tendrá que reenviar la petición para que la siga procesando otro Servlet.

Uno de estos casos claros es cuando estamos implementando un patrón Controller. Donde ese punto de acceso redirigirá las peticiones a diferentes Servlets.

Para redirigir la petición necesitaremos de una simple línea de código. En esta línea recuperaremos el manejador de uno de los Servlets de la aplicación web y le reenviaremos los objetos petición y respuesta para que los maneje.

Esto lo haremos mediante el método forward(request, response) de RequestDispatcher:

El código nos quedaría de la siguiente forma:

  1. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  2. request.getRequestDispatcher("NombreDelServlet").forward(request, response);
  3. }

Java » Servlet que devuelve XML

noviembre 2, 2006 por Víctor Cuervo 3 Comentarios Imprimir Imprimir

Ahora que los desarrollos se están moviendo a arquitecturas SOA empezamos a ver que nos aparecen servicios por todos los lados. Es cierto que no se habla mucho de cómo se desarrollan dichos servicios, ya que las presentaciones de arquitectura SOA suponen que "estaban ahí".

Supongo que los sistemas legados de hace años ya estaban pensando en SOA y dejando sus interfaces lo más correctos posibles. Que no tenian datos en los interfaces de contrato datos relativos a la pantalla en la que se ejecutaban (esos terminales verde marciano) y que solo devolvían negocio.

Ahora que yo todavía no me he encontrado ningún "servicio del pasado" que solo maneje negocio. Y es por ello que tienes que acabar maleandolo para que deje unos datos lo suficientemente claros cómo para que sean consumidos en un entorno SOA.

En esta evolución nos encontramos que los servicios de los servidores ya no devuelven presentación, sino que ahora, en bastantes casos, devuelven solo negocio. Y qué mejor que utilizar el XML para describir dicho negocio.

Una de las posibilidades en estos casos es ir a un enfoque de Webservices. Posiblemente la más puritna. Si bien, es verdad que, los Webservices todavía no se encuentran en su punto más algido y tienen ciertas cosas que mejorar: velocidad, versionado, transaccionalidad,...

Un enfoque más sencillo es el de montarse un Servlet que nos devuelva un contenido XML.

Para poder hacer esto, lo primero que tenemos que hacer es crearnos una clase que extienda de HttpServlet.

  1. public class RespuestaXML extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {...}

Como todos sabemos los servlets tienen dos métodos para procesar las peticiones, dependiendo de como sean estas (GET o POST). Estos métodos son doGet y doPost. Podemos coger cualquierda de los dos para implementar nuestro ejemplo.

Dentro del método de procesado de la petición lo primero que tenemos que hacer si queremos devolver XML es establecer el tipo de contenido que devolverá elServlet. Para ello utilizamos el método .setContentType del objeto HttpServletResponse.

  1. Response.setContentType("text/xml");

Con esto le estamos diciendo al cliente receptor de la petición que el contenido que le va a llegar en dicha petición es XML.

Una vez tenemos definido el tipo de contenido lo siguiente es volcar contenido XML a la salida. Para ello deberemos de obtener un PrintWriter sobre el objeto HttpServletResponse.

  1. PrintWriter out = response.getWriter();

Y ahora empezar a volcar datos XML sobre la salida...

  1. out.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?><nombre>Linea de Codigo</nombre>");

En nuestro caso solo estamos devolviendo una etiqueta con el nombre de la web.

Es importante en este punto el recordar que los documentos XML empiezan con la siguiente cabecera:

  1. <?xml version="1.0" ?>

Aunque no extrictamente necesaria es buena práctica incluirla antes de nuestro contenido XML.