Beruflich Dokumente
Kultur Dokumente
Debido también a que se trata de una extensión el paquete debe ser indicado en el
CLASSPATH de la máquina a ejecutar, concretamente los archivos server.jar y
servlet.jar.
¿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:
1 de
Tutorial de Servlets
• Apache 1.1.3
• Microsoft IIS
• WebLogic Tengah
Con respecto a este ultimo cabe destacar que ejecuta servlets de forma nativa sin
necesidad de modulos adicionales.Señalaremos dos modulos de ejecución de servlets
Allaire´s JRun y Yakarta´s Tomcat ambos gratuitos y descargables desde su pagina web
si no es para usos comerciales.
Como dato adicional el JSDK 2.1 incluye una herramienta llamada servletrunner análoga
a appletviewer para la ejecución y depuración de servlet con unas capacidades muy
limitadas por lo que solo se debe usar para comprobar la exactitud del servlet.
Estructura de un servlet
El API Servlet consiste básicamente en dos paquetes:
En estos paquetes se definen todas las clases e interfaces necesarias para la escritura de
applets.De hecho cuando se usen los servlets(y hoy en dia no hay otra utilidad) para
gestionat conexiones http usaremos las clases del paquete javax.servlet.http.
import javax.servlet;
import javax.servlet.*;
import javax.servlet.http.*;
2 de
Tutorial de Servlets
Para dotar de funcionalidad a un servlet se han de redefinir una seria de metodos que
guardan una analogía con los metodos de funcionamiento de un
applet(init(),start(),stop(),destroy()).
Cada vez que se inicia el servlet el servidor web llama a este metodo pasando un
parámetro de la clase ServletConfig que guarda información de la configuración del
servlet y del contexto del servidor web en el que se ejecuta. A traves de ServletConfig
se accede a los parámetros de inicialización del servlet que se establecieron al configurar
el servlet y a traves de la interfaz ServletContext (obtenido a partir del metodo
getServletContext() de ServletConfig)se accede a la información del servidor web.
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;
public class MiServlet extends HttpServlet{
public void init(ServletConfig config){
config.getServletContext().log(“Iniciado MiServlet a las” +new Date());
}
}
En este metodo se han de realizar todas las operaciones unicas en el ciclo de vida del
servlet tal como conexion a BD de forma persistente y otras tareas de inicialización.Dado
que el servlet se carga en memoria al iniciar el sevidor web o al recibir la primera
petición(dependiendo de la configuración) el metodo init() es llamado solo una vez,no
cada vez que se realice una petición.
Este metodo es analogo al metodo init() solo que sera llamado por el servidor web
cuando el servlet esta a punto de ser descargado de memoria(repito e insisto: no cuando
termina una petición).En este metodo se han de realizar las tareas necesarias para
conseguir una finalizacion apropiada como cerrar archivos y flujos de entrada de salida
externos a la petición,cerrar conexiones persistentes a bases de datos...etc etc..
Un punto importante es que se puede llamar a este método cuando todavía esta
ejecutándose alguna petición por lo que podría producirse un fallo del sistema y una
inconsistencia de datos tanto en archivos como en BD. Por eso debe retrasarse la
desaparición del servlet hasta que todas las peticiones hayan sido concluidas(con
respecto a la peticiones que lleguen en ese intervalo el servidor web sencillamente las
desestimará).
En este metodo se encuentra la mayor parte de la funcionalidad del servlet.Cada vez que
se realice una petición se llamará a este metodo pasándole dos parámetros que nos
permite obtener información de la petición y un flujo de salida para escribir la
respuesta.Análogamente tenemos otra serie de metodos que realizan la implementación
3 de
Tutorial de Servlets
de respuesta a metodos de comunicación del protocolo http 1.1 como son GET y
POST.Estos son respectivamente:
Los dos parámetros que recibe service() son esenciales para el funcionamiento del
servlet por lo que pasaremos a verlos con mas profundidad:
HttpServletRequest
HttpServletResponse
Ejemplo de servlet
A continuación realizaremos un sencillo de ejemplo de un servlet que recibirá como
parámetro un nombre y saludará al cliente que realizo la petición. Para ello
construiremos una pagina web con un formulario que nos servirá para enviar la petición
al servlet.
<html>
<head>
4 de
Tutorial de Servlets
<title>Ejemplo de servlet</title>
</head>
<body>
import java.io.*;
import javax.servlets.*;
import javax.servlets.http.*;
5 de
Tutorial de Servlets
/*
* Redefinición del metodo init y configuración de los parámetros de
inicio
*/
public void init(ServletConfig config) throws ServletException {
/*
* Llamada la metodo init() de la superclase.Esto es imprescindible
* para la correcta inicialización del servlet y debe realizarse
* antes que cualquier otra acción
*/
super.init(config);
System.out.println("HolaServlet arrancado a las " + new Date());
}
/*
* Redefinición del metodo destroy sin tareas a realizar en este caso
*/
public void destroy() {
System.out.println("HolaServlet detenido a las " + new Date());
}
/*
* En este caso se ha optado por redefinir el metodo doPost(),
pudiendose
* igualmente haberse optado por redefinir service().Lo que seria
incorrecto
* es redefinir doGet() ya que la peticion se realizará por el método
post
*/
public void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException {
/*
* Se obtiene el valor del parametro enviado
*/
String name = request.getParameter("nombre");
/*
* Se establece el contenido MIME de la respuesta
*/
response.setContentType("text/html");
/*
* Se obtiene un flujo de salida para la respuesta
*/
PrintWriter out;
try {
out = response.getWriter();
}catch (IOException e){
System.out.println("Error en el canal de salida: "+e.toString());
}
/*
*Se escribe la respuesta en HTML estandar
*/
out.println("<html>");
out.println("<head>");
out.println("<title> Respuesta de HolaServlet</title>");
out.println("<head>");
6 de
Tutorial de Servlets
out.println("<body>");
out.println("<h1>¡Funcionó!:El servlet ha generado la pagina</h1>");
out.println("<br>");
out.println("<font color="red">");
out.println("<h2>Hola " + name + "</h2>");
out.println("</font>");
out.println("</body>");
out.println("</html>");
/*
* Se fuerza del volcado del buffer de la salida y se cierra el canal
*/
out.flush();
out.close();
} //fin doPost()
}//fin clase
7 de
Tutorial de Servlets
En la actualidad se encuentran drivers JDBC para todos los sistemas de gestión de bases
de datos mas populares(e incluso podriamos decir existentes) como Informix,Oracle,SQL-
Server,DB2,InterBase, SyBase... y otros productos de indole no comercial como
mSql,mySql y PostGress,etc,...
Aun asi existe un tipo especial de drivers denominados puentes JDBC-ODBC que traducen
las llamadas en JDBC a llamadas en el estandar de comunicación con bases de datos
desarrollado por Microsoft ODBC por lo que en ultimo termino siempre se podrá utilizar
uno de estos drivers ya que la totalidad de los sistemas de gestión de bases de datos
cuentan con un driver de este ultimo tipo.Esto nos lleva a la clasificación de los distintos
drivers que cumplen la especificación JDBC 1.2.
• Driver
8 de
Tutorial de Servlets
Jdbc:<controlador>://<servidor>:<puerto>/<base de datos>
Antes de realizar la conexión con la base de datos se debe haber cargado en
memoria el controlador para lo que se usa el metodo estatico de la clase Class
forName(String).
• Connection
Esta interfaz representa una sesión persistente con la base de datos que es
devuelta por el Driver. Nos permite utilizar transacciones(si el DBMS lo admite)
asi como obtener una interfaz para la ejecución de instrucciones SQL.
• Statement
• ResultSet
Una vez vistas las clases e interfaces para la gestion de consultas JDBC veremos los
pasos a seguir para realizar una consulta a la base de datos.
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Esta sentencia hace que la JVM busque en todas las rutas especificadas por el CLASPATH
la clase correspondiente al driver y la cargue en memoria de tal manera que este lista
para posteriores usos. Seguidamente se debe realizar la conexión con la base de datos:
/*
* Se usa ahora un driver Oracle para acceder a la maquina local y a la
tabla Ejemplo:
*/
String Url = "jdbc:oracle://localhost:8080/Ejemplo";
Connection conn = DriverManager.getConnection(url);
Tambien existen versiones de este ultimo metodo que permiten realizar la conexion con
la BD especificando un nombre de usuario y una contraseña.
Creamos una sentencia para poder interactuar con la BD mediante el uso de SQL:
9 de
Tutorial de Servlets
/*
* La ejecución de la instrucción SQL devuelve resultados
*/
ResultSet rs = stm.executeQuery("SELECT * FROM Ejemplo");
int numRowsUpdated = stm.executeUpdate("INSERT INTO Ejemplo VALUES
(`Pepe`,`Sanchez`,`45598652`)");
/*
* No se sabe si devuelve resultados.Util cuando no se sabe que tipo
* de instruccion SQL se esta ejecutando como cuando el usuario introduce
directamente
* el SQL. Posteriormente si devuelve resultados se recupera con el metodo
getResultSet()
*/
Ahora si disponemos de un objeto Resulset podemos usar sus metodos para desplazarnos
por el de la siguiente manera:
while(rs.next()) {
System.out.print(rs.getString("Nombre")+ "-");
System.out.print(rs.getString("Apellidos")+ "-");
System.out.println(rs.getInt("DNI"));
}
Apellidos
Nombre Dni
<HTML>
<HEAD>
<TITLE>Pagina de introducción de datos</TITLE>
10 de
Tutorial de Servlets
</HEAD>
<BODY>
<H1>INTRODUZCA SUS DATOS</H1>
</BODY>
</HTML>
<BODY>
<H1>INTRODUZCA EL DNI DE LA PERSONA A BUSCAR</H1>
11 de
Tutorial de Servlets
Figura 2.2 Pagina de introducción del DNI para consulta de ese registro
Como se puede observar la aplicación consta de dos servlets que operarán sobre la
misma base de datos Ejemplo.El primero InServlet permitirá introducir datos en la BD
mientras que el segundo OutServlet permitirá realizar consultas basándose en el DNI de
la persona.A continuación se presenta el codigo del primer servlet:
/*
*InServlet.java
*/
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.*;
/*
* En el metodo Init se realizará la conexión a la BD
* por lo que las peticiones no producirán ningun retardo de conexión
12 de
Tutorial de Servlets
*/
public void init(ServletConfig cf) throws ServletException {
super.init(cf);
/*
* En el metodo destroy() una vez que el servlet se esta apagando,
desconectaremos
* de la base de datos
*/
public void destroy() {
super.destroy();
//Llamada al destroy de la superclase
try {
conn.close();
}catch (SQLException e){
Systen.out.println("Imposible cerrar conexion:" + e.getMessage());
}
} //fin destroy()
/*
*Redefinimos el metodo doPost ya que las peticiones se realizaran por
ese metodo
*/
public void doPost(HttpServletRequest request,
HttpServletResponse response) throws
ServletException {
String nombre;
String apellidos;
int dni;
13 de
Tutorial de Servlets
out.println("<HEAD>");
out.println("<TITLE>Registro actualizado</TITLE>");
out.println("</HEAD>");
out.println("<BODY>");
out.println("<H1>Operación realizada con exito</H1>");
out.println("<H3>Actualizadas”+numRowsUpdated + “filas</H3>");
out.println("</BODY>");
out.println("</HTML>");
out.flush();
out.close();
}catch(Exception e){
System.out.println("Error en la actualización" + e.getMessage());
}finally{
try{
stm.close();
}catch(SQLException e){}
}//fin finally
}//fin else
}//fin doPOst()
}//fin servlet
A continuación OutServlet.java
/*
*OutServlet.java
*/
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.*;
14 de
Tutorial de Servlets
try {
conn = DriverManager.getConnection("jdbc:odbc://localhost/Ejemplo");
}catch (SQLException e) {
Systen.out.println("Imposible crear conexion:" + e.getMessage());
}
if (dni == null ) {
PrintWriter out = response.getWriter();
//Devolvemos una pagina de error
out.println("<HTML>");
out.println("<HEAD>");
out.println("<TITLE>Error en la actualización de datos</TITLE>");
out.println("</HEAD>");
out.println("<BODY>");
out.println("<H1>¡¡Va a ser difícil si no pones un DNI
chaval!!</H1>");
out.println("</BODY>");
out.println("</HTML>");
out.flush();
out.close();
} else { // no hay errores
try {
//Creamos una sentencia para la recuperación de valores
Statement stm = conn.createStatement();
ResultSet rs = stm.executeQuery("SELECT * FROM Ejemplos WHERE Dni
="+ dni);
PrintWriter out = response.getWriter();
//Devolvemos una pagina de exito de operación
out.println("<HTML>");
out.println("<HEAD>");
out.println("<TITLE>Datos de la persona solicitada</TITLE>");
out.println("</HEAD>");
out.println("<BODY>");
out.println("<TABLE BORDER=3 WIDTH=75%>");
out.println("<TR>");
out.println("<td width=33%><font color=\"#FF0000\">Nombre</font>
</td>");
out.println("<td width=33%><font color=\"#FF0000\">Apellidos</font>
</td>");
15 de
Tutorial de Servlets
Apéndice
16 de
Tutorial de Servlets
BIBLIOGRAFÍA
17 de