¿Qué es un Servlet?
Un servlet de forma intuitiva se puede definir como un programa independiente de plataforma que aporta la misma funcionalidad a la programación en el lado del servidor que tradicionalmente han realizado la interfaz CGI.Con respecto a esta tecnología aporta numerosas ventajas que citaremos a continuación:
•Independencia de la plataforma.(La tan anelada premisa del “write once run
everywhere” aun no totalmente conseguida).Esto proporciona un menor esfuerzo de codificación con respecto a soluciones dependientes del servidor web y de la plataforma como ISAPI o NSAPI.
•Ejecución en paralelo de multiples peticiones por una sola instancia del
servlet.Tradicionalmente en los programas CGI se ejecuta un proceso distintopara cada petición lo que conlleva una gradual degradación del rendimiento y una necesidad de recursos muy elevada.
••Un servlet puede ejecutarse(incido en esto puede no es necesario) en una
sandbox o recinto de seguridad parecido al modelo que se se sigue con los
applets.Debido a esto pueden colocarse servlets en servidores dedicados a hosting sin que la empresa tema por la integridad del servidor y la seguridad de las aplicaciones.
Principales métodos de Servlet
Clases y objetos necesarios
public abstract interface Servlet:
Todos los servlets implementan este interfaz directamente o extendiendo una
clase que lo implemente como HttpServlet. Entre sus métodos están:- init(ServletConfig config): Es el método utilizado para crear una nueva instancia del servlet (análogo al constructor). Este método puede ser sobreescrito para realizar tareas como crear una conexión a una BD que se mantendrá mientras el servlet se mantenga cargado y puede ser utilizada por cada petición. ServletConfig contiene los parámetros de inicialización que entrega el servidor al servlet.
- getServletConfig(): Retorna la configuración dada para la inicialización del servlet.
- service(ServletRequest req, ServletResponse res): Este método es el que se llama cuando se recibe una petición de un cliente y en su implementación normal para HTTP verifica el tipo de solicitud GET, POST, etc. y la redirige a los métodos respectivos. En general no es necesario reimplementar este método.
- destroy(): Este método es llamado por el servidor para indicar que el servlet será destruido. Es llamado sólo una vez y uno debe encargarse de esperar por posibles peticiones en curso.
public abstract interface ServletConfig: Contiene los parámetros que entrega el servidor al servlet para ser inicializado que pueden ser dados por el administrador a través de un archivo de configuración. Entre sus métodos están:
- getInitParameter(String name): Que retorna el valor del parámetro dado en name.
- getServletContext(): Que retorna un objeto ServletContext que guarda la información referente al servidor.
public abstract interface ServletContext: Contiene métodos que sirven para comunicar un servlet con el servidor que lo contiene.
- getMimeType(String file): Retorna el tipo MIME definido en el servidor para el archivo dado.
public abstract class GenericServlet implements Servlet, ServletConfig: Define un servlet genérico independiente del protocolo. Además de implementar alguno de los métodos de las interfaz crea otros:
- log(String msg): Escribe en la consola del servidor el mensaje junto con el nombre del servlet.
public abstract class HttpServlet extends GenericServlet: Es la clase de la cual se debe extender para crear un servlet HTTP. De la clase que extiende obtiene los métodos ya definidos además de los cuales define:
- doGet(HttpServletRequest req, HttpServletResponse resp): Es el método llamado para procesar información que haya sido enviado con el método GET. Este método es llamado concurrentemente para cada cliente por lo que hay que estar atento por posibles variables compartidas que causen problemas.
- doPost(HttpServletRequest req, HttpServletResponse resp): Ídem al anterior pero para el método POST, en general se implementa sólo un método y el otro lo referencia.
public abstract interface ServletRequest: Permite obtener información del cliente que no depende del protocolo, por ejemplo:
- getRemoteAddr(): Retorna la IP del cliente.
- getParameter(String name): Retorna el valor del parámetro name dado por el cliente.
- getInputStream(): Sirve para crear un canal de comunicación para obtener dados binarios.
public abstract interface HttpServletRequest extends ServletRequest: Permite obtener del cliente la información que es dependiente del protocolo, en este caso HTTP. Entre sus métodos están:
- getHeader(String name): Permite obtener el valor de los Headers de HTTP con que fue llamado el servlet.
- getCookies(): Retorna un arreglo que contiene todas las cookies que el cliente envía al servlet.
- getSession(): Retorna la sesión en la cual se encuentra el cliente.
public abstract interface HttpSession: Permite identificar al mismo usuario a través de distintos servlets.En general se implementa guardando una cookie en el cliente la cual es recuperada por el servidor para reasignar su sesión.
- setAttribute(String name, Object value): Permite compartir un objeto cualquiera entre distintos servlets para el mismo usuario. Para obtener el objeto se utiliza setAttribute(name).
- setMaxInactiveInterval(int interval): Permite definir un tiempo máximo para el cual la sesión será válida. Si transcurre ese tiempo y el usuario no ha dado respuesta el servidor borrará la sesión del usuario el cual se convertirá en un cliente recién ingresado.
public abstract interface ServletResponse: Define un objeto para permitir a un servlet enviar una respuesta al cliente.
- setContentType(String type): Permite definir el tipo de respuesta que se le dará al cliente. Si se retornará una página web deberá ser text/html.
- getWriter(): Retorna un objeto Writer para poder enviar respuestas de texto.
- getOutputStream(): Retorna un objeto ServletOutputStream que permite enviar respuestas binarias al cliente.
public abstract interface HttpServletResponse extends ServletResponse: Permite enviar al cliente respuestas específicas del protocolo HTTP.
- addCookie(Cookie cookie): Para definir nuevas cookies en el cliente.
- setHeader(String name, String value): Para definir un header HTTP a enviar al cliente.
- sendRedirect(String location): Envía un mensaje al cliente para redireccionar la respuesta a la dirección señalada.
public abstract interface SingleThreadModel: Esta interfaz no tiene métodos ya que sólo se utiliza para señalar al servidor que el servlet manejará sólo un requerimiento a la vez. Cualquier otra petición concurrente queda encolada. Es la solución simple y poco óptima para eliminar los problemas de concurrencia.
FILTROS
Un filtro de java se encarga de añadir una nueva funcionalidad a la
aplicación colocandose entre el usuario y las páginas .Por ejemplo en
nuestro caso vamos a implementar un sencillo filtro que construye unas
estadisticas sobre cuantas veces se ha visitado cada página.
Java Filter (Construcción)
Definir un filtro en Java es bastante sencillo sobre todo a partir de Servlet 3.0 que nos podemos apoyar en el sistema de anotaciones. Un Filtro implementa la interface Filter de JEE que aporte el método doFilter.Vídeos de como implementar filtros en servlet
JAVA EE: MANEJO DE FILTROS
Curso de Java Web - Sesión Nro.4.2 - Creación y Utilización Filtros
Explique Como puede implementar un filtro.
Dentro de la especificación de Java Servlets, existe un componente llamado filtros. Estos nos ayudan a analizar o transformar las peticiones hechas a las páginas Web, ya sean jsps o servlets. Estos filtros trabajan de forma encadenada, por lo que se puede crear una serie de filtros que van pasando el control de uno al otro.
Formas de mantener el estado del cliente:
Cookie:
Las cookies son pequeños bits de información textual, que un servidor web (o un contenedor de aplicaciones tal como Tomcat) envía a un navegador cliente (tal como firefox) para identificarlo; el navegador luego devuelve en su petición esa cookie (o cookies) cuando visita nuevamente ese sitio web. De esta manera el servidor, a través de una página jsp o servlet, lee las cookies que le envió previamente en una conexión anterior.Esta técnica permite al cliente ciertas ventajas:
Identificar a un usuario durante una sesión de comercio electrónico:
Si alguna vez ha utilizado un carrito de compras (Shopping Cart), habrá notado que cuando selecciona un ítem, lo añade a su carrito. Dado que las conexiones HTTP se cierran después de que cada pagina se envía, cuando el usuario selecciona un nuevo ítem para su carrito, ¿como sabe el sistema de tienda virtual que ese usuario que acaba de conectar de nuevo ya tiene iniciada una compra con uno o mas item en su carrito?… las cookies.
Evitar la autentificación constantemente:
Muchos sitios web grandes, requieren un registro para utilizar sus servicios (Twitter, SlideShare, Facebook, Yahoo! Mail, etc), sería un grave inconveniente, que cada vez que el usuario realiza una acción (cambiar de página por ejemplo) se pregunte constantemente por el usuario y la contraseña a un usuario si ya se ha autentificado al ingresar por primera vez. Las cookies permiten evitar esto.
Personalizar un sitio:
iGoogle es un ejemplo perfecto de la personalización de un sitio. iGoogle, entre otras cosas, usa una cookie para “recordar” que widgets le agregaste, cuantas pestañas tienes, etc…
Publicidad personalizada:
Un motor de búsqueda, como Google, puede mantener una pista de las preferencias de un usuario a lo largo del tiempo, de esta forma, la publicidad que se le muestra a ese usuario, estará enfocada a sus preferencias de búsqueda.
El funcionamiento esquemático de las cookies es el siguiente:
Session:
El los siguientes videos se muestra la utilizacion de este metodo de mantener el estado del cliente
Login con JSP usando sesiones
VIDEO DEL TALLER DE SESIONES Y SERVLET
Formas de subir archivos por medio de la api de Servlets
Subir Archivo con jsp y servlet
Tutorial JSP: Subir archivos al servidor Parte 11
Qué es la Internacionalización.
El problema básico de la internacionalización consiste en conseguir que
nuestro programa muestre los textos en español, en inglés, en frances,
etc en función de quién los esté leyendo. Esto también incluye el
presentar los números con coma decimal o punto, unidades monetarias,
etc, etc.
Si mostramos los textos directamente en código, para cambiar de idioma deberíamos rehacer y recompilar el código. Esto, por supuesto, es bastante engorroso.
La solución que propone java es escribir todos esos textos en un fichero de propiedades, es decir, un fichero de texto que contiene algo parecido a esto para español
saludo=hola
despedida=adios
o a esto en inglés
saludo=hello
despedida=bye
El programa java debe leer el fichero adecuado según el idioma y mostrar los textos que en él se indican, el de saludo y el de despedida en este caso.
Java, con sus clases ResourceBundle y asociadas facilita todas estas tareas, de forma que el ficheor de propiedades adecuado se puede cargar automáticamente en función del idioma elegido para el sistema operativo (windows o el que sea) y se muestran automáticamente los textos en dicho idioma.
Si mostramos los textos directamente en código, para cambiar de idioma deberíamos rehacer y recompilar el código. Esto, por supuesto, es bastante engorroso.
La solución que propone java es escribir todos esos textos en un fichero de propiedades, es decir, un fichero de texto que contiene algo parecido a esto para español
saludo=hola
despedida=adios
o a esto en inglés
saludo=hello
despedida=bye
El programa java debe leer el fichero adecuado según el idioma y mostrar los textos que en él se indican, el de saludo y el de despedida en este caso.
Java, con sus clases ResourceBundle y asociadas facilita todas estas tareas, de forma que el ficheor de propiedades adecuado se puede cargar automáticamente en función del idioma elegido para el sistema operativo (windows o el que sea) y se muestran automáticamente los textos en dicho idioma.
ServletContext
El ServletContext como su nombre indica permite acceder a un Servlet a la información de su Contexto o dicho de otra manera a la información asociada con la propia Aplicación y que es común a todos los Servlets que despleguemos dentro de esa aplicación.Así pues el fabricante del contenedor de Servlet (Tomcat por Ejemplo) suele generar algún objeto que aporta información a nivel del API sobre la propia aplicación web .Este objeto puede ser perfectamente una implementación propietaria del servidor . El objeto ServletContext que pertenece al Standard de JEE y por lo tanto todos los servidores lo incorporan accede a parte de la información de este otro objeto. Información que en muchos casos es critica para los desarrolladores. Vamos a ver un ejemplo en código en el cual usamos el objeto ServletContext para leer una varible global de la aplicación web y que esta declarada en el fichero web.xml
No hay comentarios:
Publicar un comentario