Acceso a BBDD mediante un servlet que delega temporalmente el procesamiento de la petición a un segundo servlet que conecta y realiza operaciones con la base de datos.
Usos y desusos de la inteligencia artificial en revistas científicas
Acceso a BBDD mediante un servlet
1. RequestParamExample con Acceso a BBDD mediante un servlet que delega
temporalmente el procesamiento de la petición a un segundo servlet que
conecta y realiza operaciones con la base de datos.
En esta práctica un servlet recoge los datos del formulario y delega
temporalmente el procesamiento de la petición a un segundo servlet que es el
que realiza la conexión y las consultas (insert, select, …) con la base de
datos mydb creada previamente con HSQLDB, la cual contiene la tabla ALUMNO
(NOMBRE,APELLIDOS).
Vamos a extender el servlet RequestParamExample para que realice un acceso a
BBDD en el que inserte una fila con el valor de los parámetros del
formulario.
2. RequestParamExample.java
package pkgServlets;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class RequestParamExample
*/
@WebServlet("/RequestParamExample")
public class RequestParamExample extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public RequestParamExample() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
// TODO Auto-generated method stub
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<body>");
out.println("<head>");
String title = "Ejemplo de parámetros de Request";
out.println("<title>" + title + "</title>");
out.println("</head>");
out.println("<body bgcolor="white">");
out.println("<h3>" + title + "</h3>");
String firstName = request.getParameter("firstname");
String lastName = request.getParameter("lastname");
String paramsInRed = "Parametros en este Request:";
out.println(paramsInRed + "<br>");
String nombre = "Nombre ";
String apellidos = "Apellidos";
String noParams="No hay parámetro, por favor usa alguno";
if (firstName != null || lastName != null){
if(firstName.length()!=0 || lastName.length()!=0){
out.println(nombre);
out.println(" = " + firstName + "<br>");
out.println(apellidos);
out.println(" = " + lastName);
//<EXTENSION>------------------------------------------------------
pintarFormulario(out,nombre,apellidos);
RequestDispatcher rd = request.getRequestDispatcher("/DBServlet");
rd.include(request, response);
//------------------------------------------------------------------
4. public class DBServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
private Connection con;
private PrintWriter out;
public void init(ServletConfig conf) throws ServletException {
super.init(conf);
try {
Class.forName("org.hsqldb.jdbcDriver");
this.con =
DriverManager.getConnection("jdbc:hsqldb:file:C:/J2EE_UNED/hsqldb/lib/mydb", "SA", "");
} catch (Exception e) {
e.printStackTrace();
return;
}
}
public void service(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
res.setContentType("text/html");
try {
out = res.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title> Una demostración de como usar JDBC con un Servlet" +
"</title>");
out.println("</head>");
out.println("<body>");
Statement stmt = con.createStatement();
//<EXTENSION>---------------------------------------------------------------
String firstName = req.getParameter("firstname");
String lastName = req.getParameter("lastname");
String sql = "INSERT INTO Alumno VALUES ('" + firstName + "','" + lastName + "');";
stmt.executeUpdate(sql);
//--------------------------------------------------------------------------
out.println("<H3>");
out.println("Resultados");
out.println("</H3>");
ResultSet rs = stmt.executeQuery("SELECT * FROM Alumno");
out.println("<UL>");
while (rs.next()) {
out.println("<LI>" + rs.getString("Nombre") + "|" +
rs.getString("Apellidos") );
}
out.println("</UL>");
rs.close();
stmt.close();
} catch (SQLException e) {
out.println("Ha habido un error de SQL...");
out.println(e.getMessage());
} catch (IOException e) {
System.err.println("Ha habido una IOException...");
e.printStackTrace();
}
out.println("</body>");
out.println("</html>");
out.close();
}
5. public void destroy() {
try {
con.close();
} catch (SQLException e) {
out.println(e.getMessage());
}
}
}
Resultado de la ejecución…
Al pulsar en el botón “Enviar consulta” se realiza el insert en la bbdd.
Delegar peticiones a otros recursos
RequestDispatcher rd = request.getRequestDispatcher("/DBServlet");
rd.include(request, response);
En el esquema de trabajo típico de los servlets, un servlet recibe una
petición http, ejecuta código ubicado en los métodos de servicio para generar
la respuesta html y la envía al cliente.
En muchas ocasiones, los servlets no generan la respuesta sino que actúan
como gestores de la petición mediante la ejecución de código de control con
instrucciones if condicionales. En función del bloque condicional que se
ejecute se delega la generación de respuesta a otros recursos tales como
páginas html, páginas jsp u otros servlets.
6. La interface javax.servlet.RequestDispatcher contiene dos métodos que
permiten delegar la generación de respuestas a otros recursos.
• El método forward, que permite delegar el procesamiento de la petición
a una página html, jsp u otro servlet.
• El método include, que permite incluir la respuesta generada por uno
de estos recursos en el servlet sobre el que se aplica.
Explicación detallada de ambos métodos:
• void forward(ServletRequest request, ServletResponse response): delega
el procesamiento de la petición al recurso especificado en el
argumento del objeto RequestDispatcher sobre el que se aplica. Toda
respuesta vertida al flujo de salida mediante el objeto out asociada a
líneas anteriores y posteriores a la del método no se considera. El
resto de código, sí.
• void include(ServletRequest request, ServletResponse response): delega
“temporalmente” el procesamiento de la petición al recurso
especificado en el argumento del objeto RequestDispatcher sobre el que
se aplica, incluyendo en el servlet en el que se encuentra definido,
además de la respuesta generada hasta la línea del include, una página
html, jsp o la respuesta html generada por otro servlet. Muy usado
para incorporar encabezados (headers) y pies de página (footers)
comunes a todos los recursos de una aplicación web.
Para poder aplicar estos métodos es necesario obtener un objeto de la
interface RequestDispatcher.
• RequestDispatcher getRequestDispatcher(String
rutaRecursoAlQueSeDelega): se emplea, sobre todo, cuando se desea
delegar en ficheros html o jsps. También sirve para servlets.
javax.servlet
Interface RequestDispatcher
public interface RequestDispatcher
Defines an object that receives requests from the client and sends them to any resource
(such as a servlet, HTML file, or JSP file) on the server. The servlet container creates
the RequestDispatcher object, which is used as a wrapper around a server resource
located at a particular path or given by a particular name.
This interface is intended to wrap servlets, but a servlet container can create
RequestDispatcher objects to wrap any type of resource.
7. Method Summary
void forward(ServletRequest request, ServletResponse response)
Forwards a request from a servlet to another resource (servlet, JSP file, or
HTML file) on the server.
void include(ServletRequest request, ServletResponse response)
Includes the content of a resource (servlet, JSP page, HTML file) in the
response.