JSP. 20 Servlets
Un servlet es un componente o clase Java que
genera contenido web dinámico. El contenedor web carga, ejecuta y
administra el servlet, siguiendo el siguiente proceso:
- El cliente envía una solicitud al contenedor.
- En caso de que el servlet no esté cargado, el contenedor lo carga. Una vez cargado permanece cargado hasta que el contenedor decide descargarlo o se cierra el propio contenedor.
- El contenedor envía la información de la solicitud al servlet, creando un nuevo hilo por cada solicitud a ejecutar.
- El servlet procesa la solicitud, construye la respuesta y la devuelve al contenedor.
- El contenedor envía la respuesta al cliente.
Creación de un servlet:
- New File → Categories: Web, File Types: Servlet. Click Next.
- Class Name: nombre de la clase servlet, Package: paquete donde se creará. Click Next.
- Información del servlet a crear:
- Add information to Deployment descriptor: no seleccionarla, no añadimos el servlet al archivo de de configuración web.xml, de momento no se hará uso de el.
- Class Name: nombre de la clase Java a crear.
- Servlet Name: nombre del servlet.
- URL Pattern(s): dirección URL por la que acceder al servlet.
- Click Finish.
Ejemplo, servlet creado siguiendo los pasos
anteriores:
package
com.me.jsp.servlets;import
java.io.IOException;import
java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet(name = "servlet1", urlPatterns = {"/servlet1"})
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet(name = "servlet1", urlPatterns = {"/servlet1"})
public
class
Servlet1
extends
HttpServlet {
/**
* Processes requests for both HTTP * <code>GET</code> and * <code>POST</code> methods.
*
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
try {
/* TODO output your page here. You may use following sample code. */
out.println("<!DOCTYPE html>");
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet Servlet1</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Servlet Servlet1 at " + request.getContextPath() + "</h1>");
out.println("</body>");
out.println("</html>");
} finally {
out.close();
}
}
/**
* Handles the HTTP * <code>GET</code> and
*
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
processRequest(request, response);
}
/**
* Handles the HTTP * <code>POST</code> methods.
*
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
processRequest(request, response);
}
/**
* Returns a short description of the servlet.
*
* @return a String containing servlet description
*/
@Override
public String getServletInfo() {
return "Short description";
}
}
/**
* Processes requests for both HTTP * <code>GET</code> and * <code>POST</code> methods.
*
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
try {
/* TODO output your page here. You may use following sample code. */
out.println("<!DOCTYPE html>");
out.println("<html>");
out.println("<head>");
out.println("<title>Servlet Servlet1</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>Servlet Servlet1 at " + request.getContextPath() + "</h1>");
out.println("</body>");
out.println("</html>");
} finally {
out.close();
}
}
/**
* Handles the HTTP * <code>GET</code> and
*
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
processRequest(request, response);
}
/**
* Handles the HTTP * <code>POST</code> methods.
*
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
processRequest(request, response);
}
/**
* Returns a short description of the servlet.
*
* @return a String containing servlet description
*/
@Override
public String getServletInfo() {
return "Short description";
}
}
Lo
primero relevante que vemos es la anotación que precede a la clase
@WebServlet(name =
"servlet1",
urlPatterns = {"/servlet1"}),
esta anotación nos permite configurar un servlet sin necesidad de
hacer uso del archivo web.xml.
Esta anotación posee varios atributos:
- name: es el nombre del servlet, indicado en el paso 3→c visto anteriormente en creación de un servlet.
- urlPatterns: los patrones URL para poder acceder al servlet, se pueden indicar varios separados por comas, indicado en el paso 3→d.
El servlet hereda de la clase
javax.servlet.http.HttpServlet y
sobrescribe los métodos doGet,
doPost,
getServletInfo:
- doGet(): se invoca para procesar solicitudes HTTP GET.
- doPost(): se invoca para procesar solicitudes HTTP POST.
- getServletInfo(): devuelve una descripción breve del servlet.
doGet y doPost
poseen dos parámetros:
- La petición del cliente, que se guarda en un objeto HttpServletRequest.
- La respuesta al cliente, que se guarda en un objeto HttpServletResponse.
En nuestro servlet doGet
y doPost llaman al método
processRequest, que procesará los
dos tipos de peticiones. El método processRequest
construye una respuesta HTML
response.setContentType("text/html;charset=UTF-8");
Obtiene el objeto que puede enviar texto al
cliente:
PrintWriter out =
response.getWriter();
Construye la respuesta:
out.println("");
out.println("");
out.println("");
...
Una forma de invocar el servlet sería:
<form name="form11" action="servlet1" method="POST">
<input type="submit" value="Servlet simple" />
</form>
<input type="submit" value="Servlet simple" />
</form>
La URL del navegador sería:
http://localhost:8084/CursoJSP/servlet1
Y el resultado en el navegador es el siguiente
texto en grande y negrita: Servlet Servlet1 at /CursoJSP
Construir webs de esta forma es poco agradable, ya
que el código HTML debe ir dentro de cadenas y no se puede hacer uso
de programas de diseño web visual. La mejor manera de diseñar en la
web es seguir la arquitectura MVC (Model View Controller). Una de las
funciones de un servlet es la de hacer de controlador dentro de una
aplicación web, ya que dispone de todas las prestaciones Java. Un
servlet controlador actúa en función de la solicitud de un cliente,
se comunica con otros servlets y puede hacer uso de archivos de
recursos, bases de datos, etc.
La arquitectura MVC se divide en componentes de
información (modelo) y componentes de presentación (vista),
manejados por el controlador.
- Modelo: Contiene la parte central de la funcionalidad. Representa el estado de la aplicación.
- Vista: Es la forma en la que se presentan los datos al usuario. Puede acceder a los datos del modelo, pero no modificarlos.
- Controlador: Reacciona a las entradas introducidas del usuario. Gestiona el modelo, toma decisiones y notifica a la vista los cambios efectuados en el modelo.
Objeto resquest
El objeto
HttpServletRequest
contiene la funcionalidad necesaria para acceder a los datos de la
petición:
Método
|
Descripción
|
getParameter()
|
obtener el valor de un
parámetro.
|
getParemeterValues()
|
obtener todos los
valores de un parámetro, se utiliza si el parámetro posee más
de un valor (select multiselección).
|
Objeto response
HttpServletResponse
contiene la funcionalidad necesaria para enviar una respuesta:
Método
|
Descripción
|
sendRedirect()
|
redirige el cliente a
la dirección URL indicada.
|
sendError()
|
envía un mensaje de
error al cliente utilizando para ello el estado de código actual
o un mensaje descriptivo opcional.
|
Comentarios
Publicar un comentario