Inicio » Informática profesional. » Programación » Curso de Java Servidor » Delegar peticiones a otros recursos

Curso de Java Servidor

Delegar peticiones a otros recursos

En el esquema de trabajo típico de los servlets, un servlet recibe una petición http, ejecuta código ubicado en los métodos de servicio para generar la respuesta html y la envía al cliente.

En muchas ocasiones, los servlets no generan la respuesta sino que actúan como gestores de la petición mediante la ejecución de código de control con instrucciones if condicionales. En función del bloque condicional que se ejecute se delega la generación de respuesta a otros recursos tales como páginas html, páginas jsp u otros servlets.

La interface javax.servlet.RequestDispatcher contiene dos métodos que permiten delegar la generación de respuestas a otros recursos.

  • El método forward, que permite delegar el procesamiento de la petición a una página html, jsp u otro servlet.
  • El método include, que permite incluir la respuesta generada por uno de estos recursos en el servlet sobre el que se aplica

Explicación detallada de ambos métodos:

  • void forward(ServletRequest request, ServletResponse response): delega el procesamiento de la petición al recurso especificado en el argumento del objeto RequestDispatcher sobre el que se aplica. Toda respuesta vertida al flujo de salida mediante el objeto out asociada a líneas anteriores y posteriores a la del método no se considera. El resto de código, sí.
  • void include(ServletRequest request, ServletResponse response): delega “temporalmente” el procesamiento de la petición al recurso especificado en el argumento del objeto RequestDispatcher sobre el que se aplica, incluyendo en el servlet en el que se encuentra definido, además de la respuesta generada hasta la línea del include, una página html, jsp o la respuesta html generada por otro servlet. Muy usado para incorporar encabezados (headers) y pies de página (footers) comunes a todos los recursos de una aplicación web.

Para poder aplicar estos métodos es necesario obtener un objeto de la interface RequestDispatcher.

Se consigue de dos posibles formas:

Para poder aplicar estos métodos es necesario obtener un objeto de la interface RequestDispatcher.

Se consigue de dos posibles formas:

  • Mediante los métodos de la interface javax.servlet.ServletContext
  • RequestDispatcher getRequestDispatcher(String rutaRecursoAlQueSeDelega): se emplea, sobre todo, cuando se desea delegar en ficheros html o jsps. También sirve para servlets.
  • RequestDispatcher getNamedDispatcher(String nombreServletAlQueSeDelegaEnDescriptor): habitualmente usado para delegar en otro servlet. Debe especificarse el nombre o alias que se le ha asignado al servlet en el descriptor de despliegue de la aplicación

Para poder aplicar estos métodos es necesario obtener un objeto de la interface ServletContext. Antes de explicar cómo se obtiene conviene explicar el significado de contexto en el ámbito de las aplicaciones web. Se explica en el siguiente apartado

  • Mediante el método de la interface javax.servlet.ServletRequest
  • RequestDispatcher getRequestDispatcher(String rutaRecursoAlQueSeDelega): se emplea, sobre todo, cuando se desea delegar en ficheros html o jsps

Inscríbete ahora y accede a 3 unidades gratis

Evalua el curso de Java Servidor y accede a las 3 unidades gratis con acceso completo al aula virtual donde podrás disfrutar de la inestimable ayuda del tutor y una gran variedad de recursos como videotutoriales, ejercicios resueltos, foros, enlaces, bibliografía, etc....


Obtención del contexto

Un contexto está asociado a un objeto ServletContext, que está contenido en un objeto ServletConfig. Es utilizado para compartir datos entre todos los servlets y jsps de una aplicación. Proporciona al programador:

  • Un contenedor virtual para almacenar objetos a los que pueden acceder todos los servlets y jsps de una misma aplicación web. En este sentido, se emplea para pasar datos de un servlet a otro. Es importante resaltar que hay un contexto por cada aplicación web.
  • Interfaces que permiten comunicarse con el entorno de ejecución de la aplicación web, es decir, con el contenedor web, por ejemplo, para obtener el tipo MIME de un fichero, para escribir en un fichero log del servidor, para obtener un objeto RequestDispatcher usado para delegar en otros recursos el procesamiento de la petición, para conocer la ruta asociada al directorio raíz de una aplicación web, etc. Consultar la API.

¿Cómo se obtiene el contexto de una aplicación web?

Mediante el método ServletContext getServletContext() de la interface ServletConfig o mediante getServletContext () de GenericServlet. Se obtiene un contexto vacío, todavía no contiene elementos.

¿Cómo se agregan atributos al contexto de una aplicación web?

Mediante el método de la interface javax.servlet.ServletContext void setAttribute(String clave, Object valor). Se asigna una clave y un valor asociado a la misma. La clave debe ser una String y el valor un Object.

¿Cómo se obtienen atributos del contexto de una aplicación web?

Mediante el método de esta misma interface Object getAttribute(String clave).

NOTA: etiquetas típicas empleadas en el descriptor de despliegue y relacionadas con el contexto son:

<context-param> <param-name> y <param-value>

.

Ejemplo: se creará una aplicación web con un directorio raíz asociado de nombre RequestDispatcherEjemplo. Su estructura de directorios será

Descarga del war de la aplicación:

http://teleformacion.fer.es/general/prt/c/javaser/3/RequestDispatcherEjemplo.war

A continuación, ubicarlo en tomcat_home\webapps y levantar Tomcat.

Para ver el código de sus componentes, se recuerda el proceso a seguir:

Siendo JavaServidor el espacio de trabajo actual

  • Menú Project/Insert Project into Workspace y se selecciona el fichero jcp correspondiente a la aplicación desplegada, en este caso, tomcat_home\webapps\RequestDispatcherEjemplo\RequestDispatcherEjemplo.jcp

Inicio de la aplicación:

http://localhost:8080/RequestDispatcherEjemplo/fecha

Ahora conviene realizar el ejercicio 2 del tema

NOTA IMPORTANTE:

Además de en el contexto de una aplicación web, existen otros objetos utilizados para compartir datos entre todos los servlets de una aplicación. Ordenados de menor a mayor alcance son los siguientes:

  • En la petición o request (objeto HttpServletRequest y alcance request).

Los datos suelen ser específicos de cada petición y se mantienen durante la vida de la misma (tiempo que tarda el thread asociado a la petición en ejecutar el método de servicio del servlet). Muy empleado cuando los datos tienen que compartirse entre dos servlets ligados por un forward(..) o include(..).

Para introducir y obtener datos, se emplean los métodos de javax.servlet.ServletRequest void setAttribute(String clave, Object valor) y Object getAttribute(String clave) respectivamente.

Hubiera sido lo más óptimo para el ejercicio 2, que acaba de realizarse. Ver código en

http://www10.brinkster.com/trilcejf/ServletRequestDispatcher.txt y http://www10.brinkster.com/trilcejf/ServletDelegado.txt

  • En una sesión (objeto HttpSession y alcance sesión).

Los datos suelen ser específicos de cada petición y persistentes hasta que la sesión se mantenga activa (el tiempo de vida de una sesión la controla el programador mediante métodos adecuados de HttpSession. Se estudiarán más adelante).

Para introducir y obtener datos, se emplean los métodos de javax.servlet.http.HttpSession void setAttribute(String clave, Object valor) y Object getAttribute(String clave) respectivamente.

Ejemplo: el carrito de compra que a cada usuario se le asigna para almacenar sus adquisiciones en una aplicación de comercio electrónico.

  • En el contexto de la aplicación (objeto ServletContext y alcance aplicación).

Los datos suelen ser comunes a todas las peticiones y accesibles desde todos los servlets y JSPs de la aplicación. Se mantienen hasta que se elimine el contexto (ocurre cuando la aplicación queda fuera de servicio, por ejemplo, al tumbar el servidor, sobrepasar un tiempo límite de inactividad del servlet, o si el servidor está trabajando con insuficiente memoria.

Ejemplo de datos típicos ubicados en el contexto son el driver de conexión a una BD, el url de la BD a la que van a conectarse todos los usuarios, el nombre de usuario y la contraseña de la anterior BD, etc.

¿Qué criterios deben aplicarse para saber cúal usar?

Básicamente dos:

  • El tiempo durante el que se necesitan los datos.
  • Los recursos que necesiten acceder a los mismos.

Por regla general, se empleará aquel objeto cuyo alcance sea menor (request).

Esquema de las características asociadas a los objetos empleados para compartir datos y recursos entre componentes de una aplicación web:

¿Qué significa que un objeto sea thread-safe o de hilo seguro?

Que sólo un hilo va a poder trabajar con dicho objeto. Si otro hilo intenta acceder al mismo, éste debe esperar a que finalice la ejecución del hilo que está trabajando en la actualidad con el objeto.

¿Qué debe hacerse para convertir un objeto de hilo no seguro en seguro?

Programarlo con bloques sincronizados.

Ejemplo:

De este modo se asegura que el atributo de contexto “saludo” es de hilo seguro y que la salida provocada por la ejecución de este bloque será Hola.

Si, desde otro servlet de la aplicación, un hilo asociado a otro cliente intentara ejecutar estas líneas

debería esperar a que finalizara la ejecución del hilo que actualmente está ejecutando el bloque sincronizado para poder machacar el atributo “saludo”.

Resumen:

Los atributos de tipo request y las variables locales de los métodos de servicio son thread-safe o de hilo seguro.

Las variables de instancia, los atributos de contexto y los atributos de sesión no son thread-safe. Para que los atributos sean, deben programarse dentro de un bloque sincronizado.

Eventos relacionados con los objetos contexto de aplicación, petición y sesión

Elemento a agregar en el descriptor de despliegue, colgando directamente de <web-app>:

<listener>

  <listener-class>nombreClase</listener-class>

</listener>


Inscríbete ahora y accede a 3 unidades gratis

Evalua el curso de Java Servidor y accede a las 3 unidades gratis con acceso completo al aula virtual donde podrás disfrutar de la inestimable ayuda del tutor y una gran variedad de recursos como videotutoriales, ejercicios resueltos, foros, enlaces, bibliografía, etc....


Si desea obtener un acceso sin restricciones a los contenidos del curso de Java Servidor y disfrutar de todas las herramientas del aula virtual (Videos explicativos streaming, acceso a los foros, chat, ejercicios resueltos, la ayuda del tutor, audioconferencia, estudio de grabación, test y actividades de autoevaluación, etc...) puede inscribirse completamente gratis y comenzar a realizar de forma inmediata el curso.