Abr 02 2009

Tomcat (IV): Mi primer Servlet

Categoría: DAD,InformáticaMiguel Angel @ 19:00

Tomcat

En esta entrada vamos a realizar nuestro primer servlet aunque antes es interesante resolver dos preguntas:

  • ¿Qué es un servlet?: una pequeña aplicación que se ejecuta en el servidor.
  • ¿Para que sirve?: realizar la funcionalidad de nuestra aplicación. Esto puede ir desde generar una página hasta controlar el acceso a la misma.

A nivel práctico vamos a reutilizar el formulario creado en la aplicación de la entrada anterior. Cuando se pulse el botón Enviar se ejecutará nuestro servlet.  Este a su vez devolverá una página Web que contenga el texto «Bienvenido, Nombre», donde «nombre» se corresponde con el valor introducido en el formulario.

El primer paso es crear la clase que implementa el servlet. Haremos lo siguiente:

  1. Creamos el paquete ucam.servlets que contendrá todos nuestros servlets. En principio en nuestra aplicación no debe de haber un gran numero de servlets ya que la funcionalidad estará en los modelos del patrón Modelo-Vista-Control.
  2.  

  3. Creamos una nueva clase Control que herede de HttpServlet
  4.  

  5. Sobrescribimos los métodos doPost y doGet. Existen tantos como tipos de métodos hay en el protocolo http.

Tras estos primeros pasos tenemos la siguiente clase:

public class Control extends HttpServlet {
protected void doGet(HttpServletRequest req,
                     HttpServletResponse resp)
throws ServletException, IOException {
//super.doGet(req, resp);
}
protected void doPost(HttpServletRequest req,  
                      HttpServletResponse resp)
throws ServletException, IOException {
//super.doPost(req, resp);
}
}

Lo único que debemos de hacer es comentar las líneas super.doGet(req, resp) y super.doPost(req,resp). A veces se produce un error al arrancar el servidor si no se encuentran comentadas.

Veamos un par de detalles importantes:

  • Hay un método para la petición POST y otro para la GET. Lo que se suele hacer, si no se quiere repetir código, es implementar el doPost e invocarlo desde el doGet.
  •  

  • Ambos reciben dos parámetros, HttpServletRequest y HttpServletResponse. En el objeto request recibimos los parámetros de la petición y en el response tenemos la respuesta del servidor al cliente.

Pues bien, vamos a escribir el código necesario para que nuestro servlet le envíe el código html que visualiza el texto «Bienvenido, nombre» en el cliente.

Lo primero que vamos a hacer es recoger el valor del parámetro «nombre», el cual se encuentra en el objeto req. La sentencia quedaría de la siguiente forma:

String nombre = ((req.getParameter("nombre") != null)
? (req.getParameter("nombre") : "anónimo";

 
De esta forma nos aseguramos que en nombre siempre haya un valor adecuado, bien el parámetro bien el texto «anónimo».

Lo segundo es escribir en la respuesta el código html. En este caso utilizaremos el método getPrintWritter() del objeto resp.

resp.getWriter().println("<html> ... </html>");

 
El string enviado, además de las etiquetas html necesarias quedará de la siguiente forma:

"<html>... Bienvenido, "+ nombre + " ... </html>"

 
También es interesante vaciar el buffer de salida mediante el método flush.

resp.getWriter().flush();

 

¿Cómo se le dice a Tomcat que utilice el servlet?

Muy fácil, haciendo uso del fichero \WEB-INF\web.xml que, como bien sabemos, es donde se encuentran todos los parámetros de configuración de nuestra aplicación. Las etiquetas utilizadas son las que se muestran en el siguiente ejemplo:

<web-app>
  <servlet>
    <servlet-name>Control</servlet-name>
    <servlet-class>ucam.servlets.Control</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>Control</servlet-name>
    <url-pattern>/servlet/Control</url-pattern>
  </servlet-mapping>
</web-app>

 
¿Y que quieren decir cada una de las etiquetas? Con la primera, servlet, se declara un servlet cuyo nombre es Control y que está implementado en la clase ucam.servlets.Control. Con la segunda, servlet-mapping, le estamos diciendo a Tomcat que, cada vez que se cumpla el patron «/servlet/Control» en la url introducida por el usuario, se ejecute el servlet Control.

Etiquetas:

Dejar una respuesta