Servlets Intermedio
Hay otras características de los servlets, de las cuales normalmente se saca
poco partido, que nos pueden ser muy útiles.
- Acceso a propiedades a través de JNDI.
- Incluir un servlet dentro de otro.
- Uso de cookies en servlets.
Accesos a propiedades a través de JNDI
Como
por ejemplo el uso de constantes o literales definidas en el propio descriptor web.xml
y que hacen innecesario el uso de ficheros de propiedades adicionales
Desde nuestros servlets podemos, con esta simple sentencia, recuperar los
valores.
Creamos el servlet de prueba
Modificamos nuestro código para realizar mostrar los datos introducidos.
import javax.servlet.*; public class servletJNDI extends HttpServlet { public void init(ServletConfig config) throws ServletException { } public void destroy() { } protected void processRequest(HttpServletRequest request, HttpServletResponse response) String autor = «»; try autor = (String)ctx.lookup(«java:comp/env/misapps/autor»); out.println(«<html>»); protected void doGet(HttpServletRequest request, HttpServletResponse response) protected void doPost(HttpServletRequest request, HttpServletResponse response) |
Y la página resultante sería
Include Servlet
Quien a programado utilizando ASP, JSP o PHP, esta acostumbrado a crear una
plantilla que a su ver incluye a otras. Un ejemplo puede ser meter la cabecera
de nuestro Web (o un menú) en una plantilla y que este sea incluida por muchas
otras, de modo que cuando tengamos que realizar algún cambio, solo se tenga que
realizar en un punto.
El código es bastante sencillo:
getServletConfig().getServletContext().getRequestDispatcher(«/servlet/contador«).include(request, response); |
Vamos a introducir un contador en nuestros servlets de un modo sencillo. Tened
en cuenta que esto es un ejemplo … en un entorno multi-máquina virtual,
debería ser construido de otro modo.
Nuestro servlet utilizará un fichero llamado contadores.txt
para almacenar los contadores, cada N peticiones.
Estos contadores, son almacenado en una tabla Hashtable tablaContadores
/* * * Created on June 28, 2003, 7:25 PM */ import javax.servlet.*; import javax.servlet.http.*; import java.util.*; import java.io.*; /** public void init(ServletConfig config) throws ServletException try boolean escribirContadores() FileOutputStream ficheroEscritura = new return true;
public void destroy() protected int recuperaContador(String nombreContador) if(objetoTemporal != null) tablaContadores.put(nombreContador,new Integer(contador)); usosContador++; return contador;
protected void processRequest(HttpServletRequest request, HttpServletResponse response) { Object atributoPasado = if(atributoPasado == null) String nombreContador = atributoPasado.toString(); out.println(«El contador es: » + contadorNuevo); /** Handles the HTTP <code>GET</code> method. /** Handles the HTTP <code>POST</code> method. /** Returns a short description of the servlet. } |
Ahora debemos añadir en el servlet principal el código
necesario para incluir nuestro servlet contador.
Partimos del ejemplo servletJNDI (más arriba en este
documento)
protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, java.io.IOException { response.setContentType(«text/html»); java.io.PrintWriter out = response.getWriter(); String autor = «»; try autor = (String)ctx.lookup(«java:comp/env/misapps/autor»); } out.println(«<html>»); request.setAttribute («contadorservlet», «servletJNDI»); out.println(«<br>No olvide visitarnos en <a href=\»www.adictosaltrabajo.com\»>www.adictosaltrabajo.com</a>»); |
Y el resultado es …..
Uso de cookies
Un cookie es un valor que se arrastra en cada una de las
peticiones, a través de las cabeceras HTTP sin necesidad de que hagamos nada.
Cuando nos conectamos a un servidor, nomalmente se usa un cookie
para simular una sesión entre el cliente y el servidor, ya que el protocolo
HTTP no es orientado a conexión y cada petición no recuerda nada de la
anterior.
Los datos que viajan por la cookie suelen ser una información
que solo sabe interpretar el servidor ……
Por distintos motivos, se desaconseja el uso e cookies en los
sistemas aunque si no nos queda más remedio …. podemos usarlos tal y como
podemos ver en el siguiente ejemplo.
protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, java.io.IOException { response.setContentType(«text/html»); java.io.PrintWriter out = response.getWriter(); out.println(«<html>»); response.addCookie(new Cookie(«cookiepersonal»,»1234″)); out.println(«</center>»); out.close(); } |
Podemos monitorizar la petición y comprobar el cookie generado View->HTTP
Monitor
Si simulamos la navegación desde una consola telnet, desde la
linea de comando arrancamos la aplicación
Simulamos la petición que haría un navegador. Podemos ver como
en la cabecera viene el cookie.
Set-Cookie: cookiepersonal=1234
Para recuperar el valor:
protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, java.io.IOException { response.setContentType(«text/html»); java.io.PrintWriter out = response.getWriter(); out.println(«<html>»); Cookie arrayCookies[] = request.getCookies(); out.close(); |
Podemos comprobar que leemos fácilmente el valor del
cookie en nuestro servlet