Los servlets son objetos de negocio, escritos en Java, que residen en el servidor de aplicaciones.
Pueden recibir peticiones de un muchos clientes y generar respuestas (pueden generar documentos HTML, XML, texto plano…).
Una misma instancia de un servlet puede ejecutarse de manera concurrente para satisfacer peticiones solapadas en el tiempo.
Como vemos en la siguiente imagen, el servlet recoge la petición (request) y emite la respuesta (response).

CARACTERÍSTICAS DE LOS SERVLETS
- Son independientes del servidor utilizado y de su sistema
- Los servlets pueden llamar a otros servlets. De esta forma se puede distribuir de forma más eficiente el trabajo a realizar. Por ejemplo, se podría tener un servlet encargado de la interacción con los clientes y que llamara a otro servlet para que a su vez se encargara de la comunicación con una base de datos. De igual forma, los servlets permiten redireccionar peticiones de servicios a otros servlets (en la misma máquina o en una máquina remota).
- Los servlets pueden obtener fácilmente información acerca del cliente (la permitida por el protocolo HTTP), tal como su dirección IP, el puerto que se utiliza en la llamada, el método utilizado (GET, POST, …),
- Permiten además la utilización de cookies y sesiones, de forma que se puede guardar información específica acerca de un usuario
- Los servlets pueden actuar como enlace entre el cliente y una o varias bases de datos en arquitecturas cliente-servidor de tres.
- Pueden realizar tareas de proxy para un applet. Debido a las restricciones de seguridad, un applet no puede acceder directamente por ejemplo a un servidor de datos localizado en cualquier máquina remota, pero el servlet sí puede hacerlo de su parte.
- Al igual que los programas CGI, los servlets permiten la generación dinámica de código HTML dentro de una propia página HTML. Así, pueden emplearse servlets para la creación de contadores, banners, etc.
API DE DESARROLLO DE SERVLETS
Oracle proporciona un conjunto de clases Java para el desarrollo de servlets.
Este API se encuentra diseñado como una extensión del JDK. Consta de dos paquetes javax.servlet y javax.servlet.http. Este último es una particularización del primero para el caso del protocolo HTTP, que es el más utilizado. Mediante este diseño lo que se consigue es que se mantenga abierta la posibilidad de implementar servlets para otros protocolos existentes (FTP, POP, SMTP).
Una clase Java se dice que es un HTTPServlet, si hereda de la clase javax.servlet.http.HttpServlet y su entorno de ejecución es un servidor HTTP.
En realidad una clase que herede de javax.servlet.GenericServlet ya se considera un servlet, pero lo más común es que trabajemos con HttpServlet.

El paquete javax.servlet define los siguientes elementos:
- Interfaz Servlet
- Interfaz ServletRequest
- Interfaz ServletResponse
- Interfaz ServletConfig
- Interfaz ServletContext
- Clase GenericServlet
INTERFAZ SERVLETREQUEST
Este interfaz encapsula la petición de servicio de un cliente. Define una serie de métodos tendentes a obtener información del servidor, solicitante y solicitud.
Los métodos más importantes son:
- int getContentLength() Devuelve el tamaño de la petición del cliente o -1 si es desconocido.
- String getContentType() Devuelve el tipo de contenido MIME de la petición o null si éste es
- String getProtocol() Devuelve el protocolo y la versión de la petición como un String en la forma <protocolo>/<versión mayor>.<versión menor>
- String getScheme() Devuelve el tipo de esquema de la URL de la petición: http, https, ftp…
- String getServerName() Devuelve el nombre del host del servidor que recibió la petición..
- int getServerPort() Devuelve el número del puerto en el que fue recibida la petición.
- String getRemoteAddr() Devuelve la dirección IP del ordenador que realizó la petición.
- String getRemoteHost() Devuelve el nombre completo del ordenador que realizó la petición.
- String getParameter(String) Devuelve un String que contiene el valor del parámetro especificado, o null si dicho parámetro no existe. Sólo debe emplearse cuando se está seguro de que el parámetro tiene un único valor.
- String[] getParameterValues(String) Devuelve los valores del parámetro especificado en forma de un array de Strings, o null si el parámetro no existe. Útil cuando un parámetro puede tener más de un
- Enumeration getParameterNames() Devuelve una enumeración en forma de String de los parámetros encapsulados en la petición. No devuelve nada si el InputStream está vacío.
INTERFAZ SERVLETRESPONSE
Esta interfaz es utilizada por un servlet para enviar información al solicitante de una petición.
Los métodos más importantes son:
- ServletOutputStream getOutputStream() Permite obtener un ServletOutputStream para enviar datos
- PrintWriter getWriter() Permite obtener un PrintWriter para enviar caracteres.
- setContentType(String) Establece el tipo MIME de la (“text/html”)
- setContentLength(int) Establece el tamaño de la respuesta
SERVLETRESPONSE
Esta interfaz es utilizada por un servlet para enviar información al solicitante de una petición.
Los métodos más importantes son:
- ServletOutputStream getOutputStream() Permite obtener un ServletOutputStream para enviar datos.
- PrintWriter getWriter() Permite obtener un PrintWriter para enviar caracteres.
- setContentType(String) Establece el tipo MIME de la (“text/html”).
- setContentLength(int) Establece el tamaño de la respuesta.
INTERFAZ SERVLETCONFIG
La utiliza un servidor para pasar información sobre la configuración a un servlet. Sus métodos los utiliza el Servlet para recuperar esta información, por ejemplo los parámetros iniciales del servlet. Un servlet puede recuperar el objeto de esta interfaz a través del método getServletConfig().
Los métodos más importantes son:
- String getInitParameter(String) permite obtener el valor de un parámetro inicial, el nombre de este parámetro se especifica como argumento del método.
- Enumeration getInitParameterNames() permite obtener todos los nombres de los parámetros
INTERFAZ SERVLETCONTEXT
Define el entorno en que se ejecuta el servlet. Proporciona métodos que utilizan los servlets para acceder a información sobre el entorno.
La información acerca del servidor está disponible en todo momento a través de un objeto de la interface ServletContext. Un servlet puede obtener dicho objeto mediante el método getServletContext() aplicable a un objeto ServletConfig.
Los métodos más importantes son:
- Object getAttribute(String) Devuelve información acerca de determinados atributos del tipo clave/valor del servidor. Es propio de cada servidor.
- String getMimeType(String) Devuelve el tipo MIME de un determinado
- public abstract String getRealPath(String) Traduce una ruta de acceso virtual a la ruta relativa al lugar donde se encuentra el directorio raíz de páginas HTML
- String getServerInfo() Devuelve el nombre y la versión del servicio de red en el que está siendo ejecutado el
CICLO DE VIDA DE UN SERVLET
En un GenericServlet tenemos los siguientes métodos para gestionar su ciclo de vida. Al ser los servlets componentes manejados por el contenedor web estos métodos serán invocados por él.

El método init lo invoca el contenedor de servlets, una sola vez; resulta útil para inicializar recursos que serán necesarios en la ejecución del servlet (abrir ficheros, conectar bases de datos, establecer comunicaciones, etc.).
El método destroy se invoca cuando el servlet va a ser descargado del servidor; en su interior se debería programar la liberación de recursos utilizados en el método init.
El método service realiza el trabajo “cotidiano” del servlet: dar respuesta a las distintas peticiones de los clientes. Cada vez que un cliente realiza una petición (GET, POST, etc.) el contenedor invoca al método service.
En un HttpServlet los métodos de ciclo de vida son los siguientes:

Como podemos comprobar el método service se desglosa en dos:
- goGet(); capturará las peticiones enviadas a través del método
- doPost(); capturará las peticiones enviadas a través del método
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
@WebServlet("/GBitacoras") public class GBitacoras extends HttpServlet { private static final long serialVersionUID = 1L; public void Destroy(){ } protected void init(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { switch (request.getParameter("opcion")) { case "1": nuevoBitacoras(request, response); break; case "2": borrarBitacoras(request, response); break; case "3": buscarBitacoras(request, response); break; default: System.out.println("Opcion no valida"); } } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse * response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub response.getWriter().append("Served at: ").append(request.getContextPath()); response.setContentType("text/htmlUTF-8"); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse * response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub inicio(request, response); } } |
Una vez que tenemos el servlet creado el siguiente paso es mapearlo a través de anotaciones.
MAPEO DEL SERVLET A TRAVÉS DE ANOTACIONES
Este es método de mapeo mas utilizado, consiste en incluir las anotaciones en el propio Servlet
|
1 2 3 4 5 6 7 8 |
/** * Servlet implementation class GNave */ @WebServlet("/GNave") @MultipartConfig public class GNave extends HttpServlet { private static final long serialVersionUID = 1L; private static final String UPLOAD_DIR = "fotos"; |
ATRIBUTOS
A veces será necesario pasar cierto objeto de un servlet a una página JSP. Existe una forma de hacerlo, que es encapsular el objeto que deseamos pasar en el objeto request.
|
1 2 3 4 |
String nombre = request.getParameter("nombre"); String capitan = request.getParameter("capitan"); String matricula = request.getParameter("matricula"); String tipo = request.getParameter("tipo"); |
El recurso destino, en este caso un jsp, utiliza los objetos request y response como si la petición hubiese sido realizada directamente sobre ella.
Nosotros podemos incluir dentro del request tantos objetos como deseemos que la aplicación destino sea capaz de recoger.
La instrucciones clave para realizar este proceso están recogidas como métodos propios del request, estos métodos son:
- setAttribute(String, Object), para guardar un objeto (Object) en el request, con un identificador, clave (String).
- getAttribute(String), para recuperar el objeto guardado con un identificador (String).
LANZAMIENTO DE SOLICITUDES
El lanzamiento de solicitudes permite a un servlet lanzar una solicitud a otro servlet, página JSP o página HTML, que será la responsable de cualquier procesamiento posterior y de generar la respuesta.
El API Java Servlet tiene una interfaz especial llamada javax.servlet.RequestDispatcher para este propósito.
Esta interfaz tiene dos métodos que le permiten delegar el procesamiento de solicitudes-respuestas en otro recurso, después de que el servlet llamante haya finalizado cualquier procesamiento preliminar: El método forward() y el método include().
- El método forward(); permite reenviar la solicitud a otro servlet o página JSP, o a un archivo HTML en el servidor; este recurso acepta la responsabilidad de producir la
|
1 2 |
public void forward(ServletRequest request, ServletResponse response) throws ServletException, java.io.IOException |
Difiere de HttpServetResponse.sendRedirect(), que redirige la petición con la ayuda del navegador