SlideShare uma empresa Scribd logo
1 de 43
Baixar para ler offline
Desarrollo de aplicaciones Java para la Web
                                    José Ramón Méndez Reboredo
                  Departamento de Informática – Universidad de Vigo
Servlets: Introducción
    Fueron introducidos por Sun en 1996 como pequeñas aplicaciones
●

    Java para añadir funcionalidad dinámica a los servidores web.
    Todos los servlets asociados con un servidor se ejecutan dentro de
●

    un proceso simple. Cada vez que llega una petición, la JVM (Java
    Virtual Machine) crea un hilo Java para manejar la petición,
    reduciendo así la sobrecarga del sistema
    Una desventaja de esta aproximación es que el contenido (estático y
●

    dinámico) de la página HTML generada, reside en el código fuente
    del servlet. Como consecuencia cualquier cambio estático en la
    página (cambio de una URL de un enlace o una imagen), requiere la
    intervención del programador y la recompilación del servlet.
    Se escriben utilizando la API Servlet (que se distribuye como una
●

    extensión estándar del JDK 1.2 y posteriores, sin formar parte del
    núcleo de la plataforma Java).
    El lunes 3 de noviembre de 2006 Java pasó a ser software libre y se
●

    distribuye bajo licencia GNU GPL v.2
Contenedor de componentes de vista
    El primer paso es descargar el software que implementa las
●

    especificaciones Java Servlet 2.4 y Java Server Pages 2.0. Se puede
    obtener una versión gratuita, conocida como Tomcat @ Jakarta en
    http://jakarta.apache.org/tomcat/.
    En la dirección http://java.sun.com/products/servlet/industry.html se
●

    muestra un listado completo de servidores Web que soportan el API
    Servlet.
    Para trabajar con servlets es necesario importar el paquete
●

    javax.servlet.
    El método service() implementa el manejo real de la solicitud y
●

    respuesta del servlet. El servidor web invoca a este método cuando
    se solicita la URL del servlet. El servidor pasa los argumentos
    ServletRequest y ServletResponse al servlet.
Servlet para generar una fecha
import javax.servlet.*;
import java.util.*;
import java.io.*;

public class TimeServlet extends GenericServlet
{
       public String getServletInfo()
       {
       return quot;Time Servletquot;;
       }

         public void service(ServletRequest peticion, ServletResponse respuesta)
     throws ServletException, IOException
         {
         String fecha = new Date().toString();

        PrintStream outputStream = new PrintStream(respuesta.getOutputStream());
        outputStream.println(fecha);
        }
};
Servlet para generar una fecha
import javax.servlet.*;
import java.util.*;
import java.io.*;

public class TimeServlet extends GenericServlet
{
       public String getServletInfo()
       {
       return quot;Time Servletquot;;
       }

         public void service(ServletRequest peticion, ServletResponse respuesta)
     throws ServletException, IOException
         {
         String fecha = new Date().toString();

        PrintStream outputStream = new PrintStream(respuesta.getOutputStream());
        outputStream.println(fecha);
        }
};
EchoRequest Servlet
<FORM action=quot;servlet/EchoRequest.classquot; method=quot;POSTquot;>
 <P>NOMBRE: <BR> <INPUT type=quot;textquot; name=quot;Nombrequot;>
 <P>E-MAIL: <BR> <INPUT type=quot;passwordquot; name=quot;Emailquot;>
 <P>TIPO DE INSCRIPCIÓN: <BR>
          <INPUT type=quot;radioquot; name=quot;Inscripcionquot; value=quot;Normalquot;> Normal <BR>
          <INPUT type=quot;radioquot; name=quot;Inscripcionquot; value=quot;Estudiantequot;> Estudiante <BR>
          <INPUT type=quot;radioquot; name=quot;Inscripcionquot; value=quot;Socio de ATIquot;> Socio de ATI
 <P>TIPO DE COMUNICACIÓN: <BR>
          <INPUT type=quot;checkbox quot; name=quot;TIPO_1quot; value=quot;paperquot;> Artículo <BR>
          <INPUT type=quot;checkbox quot; name=quot;TIPO_2quot; value=quot;posterquot;> Poster <BR>
          <INPUT type=quot;checkbox quot; name=quot;TIPO_3quot; value=quot;demoquot;> Demo Comercial
 <P>ORGANIZACIÓN: <BR> <INPUT type=quot;textquot; name=quot;Organizacionquot;>
 <P>PAÍS: <BR>
         <SELECT size=quot;5quot; name=quot;Paisquot;>
              <OPTION>ESPAÑA</OPTION>               <OPTION>PORTUGAL</OPTION>
              <OPTION>FRANCIA</OPTION>              <OPTION>ALEMANIA</OPTION>
              <OPTION>ITALIA</OPTION>               <OPTION>REINO UNIDO</OPTION>
              <OPTION>EEUU</OPTION>                <OPTION>AFRICA</OPTION>
         </SELECT>

<P><INPUT type=quot;submitquot; value=quot;Realizar Inscripciónquot;>
    <INPUT type=quot;resetquot; value=quot;Borrarquot;>
</FORM>
EchoRequest Servlet
import javax.servlet.*;
import java.util.*;
import java.io.*;

public class EchoRequest extends GenericServlet {
         public String getServletInfo(){ return quot;Echo Request Servletquot;; }

        public void service(ServletRequest peticion, ServletResponse respuesta) throws
           ServletException, IOException {
        respuesta.setContentType(quot;text/plainquot;);
        PrintStream outputStream = new PrintStream(respuesta.getOutputStream());
        outputStream.print(quot;Servidor: quot; + peticion.getServerName() + quot;:quot;+ peticion.getServerPort());
        outputStream.print(quot;Cliente: quot; + peticion.getRemoteHost() + quot; quot; + peticion.getRemoteAddr());
        outputStream.println(quot;Protocolo: quot; + peticion.getProtocol());

         Enumeration params = peticion.getParameterNames();
         if (params != null) {
               while (params.hasMoreElements())        {
                    String parametro = (String) params.nextElement();
                    String valor = peticion.getParameter(parametro);
                    outputStream.println(parametro + quot; = quot; + valor);
               }
         }
         }
};
EchoRequest Servlet
import javax.servlet.*;
import java.util.*;
import java.io.*;

public class EchoRequest extends GenericServlet {
         public String getServletInfo(){ return quot;Echo Request Servletquot;; }

        public void service(ServletRequest peticion, ServletResponse respuesta) throws
           ServletException, IOException {
        respuesta.setContentType(quot;text/plainquot;);
        PrintStream outputStream = new PrintStream(respuesta.getOutputStream());
        outputStream.print(quot;Servidor: quot; + peticion.getServerName() + quot;:quot;+ peticion.getServerPort());
        outputStream.print(quot;Cliente: quot; + peticion.getRemoteHost() + quot; quot; + peticion.getRemoteAddr());
        outputStream.println(quot;Protocolo: quot; + peticion.getProtocol());

         Enumeration params = peticion.getParameterNames();
         if (params != null) {
               while (params.hasMoreElements())        {
                    String parametro = (String) params.nextElement();
                    String valor = peticion.getParameter(parametro);
                    outputStream.println(parametro + quot; = quot; + valor);
               }
         }
         }
};
Cabeceras de solicitud
    Cuando un cliente HTTP (por ejemplo, un navegador) envía una
●

    petición, es necesario que suministre una línea de petición
    (normalmente GET o POST). Es posible también enviar un número
    de cabeceras que acompañan a la petición y que son opcionales
    excepto Content-Length, que es requerida sólo para peticiones
    POST. La Tabla 1 muestra las cabeceras más comunes que pueden
    estar presentes en una petición HTTP.
       Cabecera HTTP                                                                 Significado
               Accept             Tipos MIME que prefiere el navegador.
            Accept-Charset        Conjunto de caracteres que espera el navegador.
           Accept-Encoding        Tipos de codificación de datos (como gzip) para que el navegador sepa cómo decodificarlos. Los servlets pueden
                                  comprobar explícitamente el soporte para gzip y devolver páginas HTML comprimidas con gzip para navegadores que
                                  las soportan, seleccionando la cabecera de respuesta Content-Encoding para indicar que están comprimidas con gzip.
                                  En muchos casos, esto puede reducir el tiempo de descarga por un factor de cinco o diez.
           Accept-Language        Idioma que está esperando el navegador, en el caso de que el servidor tenga versiones en más de un idioma.
            Authorization         Información de autorización, usualmente en respuesta a una cabecera www-Authenticate enviada desde el servidor.
             Connection           ¿Se usan conexiones persistentes?. Si un servlet recupera un valor Keep-Alive de esta cabecera, u obtiene una línea de
                                  petición con HTTP 1.1 (donde las conexiones son persistentes por defecto), es posible ahorrar un tiempo considerable
                                  en el envío de páginas web que incluyen muchas piezas pequeñas (imágenes o applets). Para hacer esto, es necesario
                                  enviar una cabecera Content-Length en la respuesta, escribiendo en un ByteArrayOutputStream, y preguntando por el
                                  tamaño antes de escribir la salida.
            Content-Length        En mensajes POST especifica el número de datos que se han añadido.
               Cookie             Manejo de Cookies. (se explica porteriormente).
                From              Especifica la dirección de correo electrónico del usuario que realiza la petición. Sólo es usado por aceleradores web, no
                                  por clientes personalizados ni por navegadores.
                 Host             Host y puerto escuchado en la URL original
           If-Modified-Since      Sólo devuelve documentos más nuevos que el especificado, de otra forma se envía una respuesta 304 “Not Modified”
                                  response.
               Pragma             El valor no-cache indica que el servidor debería devolver un documento nuevo, incluso si es un proxy con una copia
                                  local.
               Referer            URL de la página que contiene el enlace que el usuario siguió para obtener la página actual.
             User-Agent           Especifica el tipo de navegador. Útil cuando el servlet está devolviendo contenido específico para un navegador.
       UA-Pixels, UA-Color, UA-   Cabeceras no estándar enviadas por algunas versiones de Internet Explorer, indicando el tamaño de la pantalla, la
            OS, UA-CPU            profundidad del color, el sistema operativo, y el tipo de CPU usada por el sistema del navegador.
Ejemplo
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class RequestHeader extends HttpServlet {
  public void doGet(HttpServletRequest peticion, HttpServletResponse respuesta) throws IOException,
   ServletException {
       respuesta.setContentType(quot;text/htmlquot;);
       PrintWriter out = respuesta.getWriter();
         out.println(quot;<HTML><HEAD><TITLE>Página genereda por el servlet RequestHeader” +
         “</TITLE><HEAD>quot;);
        out.println(quot;<BODY BGCOLOR=quot;WHITEquot; TEXT=quot;BLACKquot;>quot;);
        out.println(quot;<H1>MOSTRANDO LAS CABECERAS ENVIADAS POR EL CLIENTE</H1>quot;);
        out.println(quot;<P>Request Method: quot; + peticion.getMethod() + quot;<BR>quot;);
        out.println(quot;Request URI: quot; + peticion.getRequestURI() + quot;<BR>quot;);
        out.println(quot;Request Protocol: quot; + peticion.getProtocol() + quot;<BR>quot;);
        out.println(quot;<P><table border=quot;1quot;>quot;);

        Enumeration e = peticion.getHeaderNames();
          while (e.hasMoreElements())       {
              String nombre = (String)e.nextElement();
              String valor = peticion.getHeader(nombre);
              out.println(quot;<tr><td>quot; + nombre + quot;</td><td>quot; + valor + quot;</td></tr>quot;);
        }
        out.println(quot;</table></BODY></HTML>quot;);
    }
}
Ejemplo
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class RequestHeader extends HttpServlet {
  public void doGet(HttpServletRequest peticion, HttpServletResponse respuesta) throws IOException,
   ServletException {
       respuesta.setContentType(quot;text/htmlquot;);
       PrintWriter out = respuesta.getWriter();
         out.println(quot;<HTML><HEAD><TITLE>Página genereda por el servlet RequestHeader” +
         “</TITLE><HEAD>quot;);
        out.println(quot;<BODY BGCOLOR=quot;WHITEquot; TEXT=quot;BLACKquot;>quot;);
        out.println(quot;<H1>MOSTRANDO LAS CABECERAS ENVIADAS POR EL CLIENTE</H1>quot;);
        out.println(quot;<P>Request Method: quot; + peticion.getMethod() + quot;<BR>quot;);
        out.println(quot;Request URI: quot; + peticion.getRequestURI() + quot;<BR>quot;);
        out.println(quot;Request Protocol: quot; + peticion.getProtocol() + quot;<BR>quot;);
        out.println(quot;<P><table border=quot;1quot;>quot;);

        Enumeration e = peticion.getHeaderNames();
          while (e.hasMoreElements())       {
              String nombre = (String)e.nextElement();
              String valor = peticion.getHeader(nombre);
              out.println(quot;<tr><td>quot; + nombre + quot;</td><td>quot; + valor + quot;</td></tr>quot;);
        }
        out.println(quot;</table></BODY></HTML>quot;);
    }
}
Manejo de sesiones / Session Tracking
    Una sesión es una conexión continuada de un mismo navegador a un
●

    servidor web durante un intervalo prefijado de tiempo. Este tiempo
    depende habitualmente del servidor, aunque a partir de la versión 2.1
    de la API Servlet puede establecerse mediante el método
    setMaxInactiveInterval(int) de la interfaz HttpSession. Esta interfaz es
    la que proporciona los métodos necesarios para mantener sesiones.
    La forma de obtener una sesión es mediante el método
●

    getSession(boolean) de un objeto HttpServletRequest. Si el
    parámetro es true se crea una sesión nueva si es necesario, mientras
    que si es false, el método devolverá la sesión actual.
    Una vez que se tiene un objeto HttpSession, es posible mantener una
●

    colección de pares nombre/valor, de forma que pueda almacenarse
    todo tipo de información sobre la sesión. Este valor puede ser
    cualquier objeto de la clase Object que se desee. La forma de añadir
    valores a la sesión es mediante el método putValue(String, Object) de
    la interfaz HttpSession, y la de obtenerlos mediante el método
    getValue(String) del mismo objeto.
Manejo de Sesiones (Sessión Tracking)
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class SetSession extends HttpServlet {

    public void service(HttpServletRequest peticion, HttpServletResponse respuesta) throws IOException, ServletException {
      respuesta.setContentType(quot;text/htmlquot;);
      PrintWriter out = respuesta.getWriter();
      out.println(quot;<H3>Ejemplo de Sesiones</H3>quot;);

        HttpSession session = peticion.getSession(true); // Se crea la sesion si es necesario
        Date created = new Date(session.getCreationTime()); // Visualizar informacion de la sesion
        Date accessed = new Date(session.getLastAccessedTime());
        out.println(quot;<hr>quot;); out.println(quot;<b>ID:</b> quot; + session.getId() + quot;<br>quot;);
        out.println(quot;<b>Fecha de creación:</b> quot; + created + quot;<br>quot;);
        out.println(quot;<b>Fecha de último acceso:</b> quot; + accessed + quot;<br>quot;); out.println(quot;<hr><p>quot;);

        String nombreDato = peticion.getParameter(quot;NombreDatoquot;); // Se guarda la información
        if (nombreDato != null && nombreDato.length() > 0) {
              String valorDato = peticion.getParameter(quot;ValorDatoquot;);
              session.setAttribute(nombreDato, valorDato);
        }
        out.println(quot;<b><i>Los siguientes datos están en tu sesión:</b></i><br>quot;);
        // Visualizar objetos contenidos en la sesion actual
        Enumeration e = session.getAttributeNames();
        while (e.hasMoreElements()) {
              String nombre = (String)e.nextElement();
              String valor = session.getAttribute(nombre).toString();
              out.println(nombre + quot; = quot; + valor + quot;<BR>quot;);
        }
    }
}
Manejo de Sesiones (Sessión Tracking)
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class SetSession extends HttpServlet {

    public void service(HttpServletRequest peticion, HttpServletResponse respuesta) throws IOException, ServletException {
      respuesta.setContentType(quot;text/htmlquot;);
      PrintWriter out = respuesta.getWriter();
      out.println(quot;<H3>Ejemplo de Sesiones</H3>quot;);

        HttpSession session = peticion.getSession(true); // Se crea la sesion si es necesario
        Date created = new Date(session.getCreationTime()); // Visualizar informacion de la sesion
        Date accessed = new Date(session.getLastAccessedTime());
        out.println(quot;<hr>quot;); out.println(quot;<b>ID:</b> quot; + session.getId() + quot;<br>quot;);
        out.println(quot;<b>Fecha de creación:</b> quot; + created + quot;<br>quot;);
        out.println(quot;<b>Fecha de último acceso:</b> quot; + accessed + quot;<br>quot;); out.println(quot;<hr><p>quot;);

        String nombreDato = peticion.getParameter(quot;NombreDatoquot;); // Se guarda la información
        if (nombreDato != null && nombreDato.length() > 0) {
              String valorDato = peticion.getParameter(quot;ValorDatoquot;);
              session.setAttribute(nombreDato, valorDato);
        }
        out.println(quot;<b><i>Los siguientes datos están en tu sesión:</b></i><br>quot;);
        // Visualizar objetos contenidos en la sesion actual
        Enumeration e = session.getAttributeNames();
        while (e.hasMoreElements()) {
              String nombre = (String)e.nextElement();
              String valor = session.getAttribute(nombre).toString();
              out.println(nombre + quot; = quot; + valor + quot;<BR>quot;);
        }
    }
}
Y si no hay cookies entonces reescritura de URLs
    A pesar de que la mayoría de los navegadores más extendidos
●

    soportan las cookies en la actualidad, para poder emplear sesiones
    con clientes que, o bien no soportan cookies o bien las rechazan,
    debe utilizarse la reescritura de URL’s.
    Para emplear está técnica lo que se hace es incluir el código
●

    identificativo de la sesión (sessionId) en la URL de la petición. Los
    métodos que se encargan de reescribir la URL si fuera necesario son
    encodeURL() y encodeRedirectURL(). El primero de ellos lee un
    String que representa una URL y si fuera necesario la reescribe
    añadiendo el identificativo de la sesión, dejándolo inalterado en caso
    contrario. El segundo realiza lo mismo sólo que con URL’s de
    redirección, es decir, permite reenviar la petición del cliente a otra
    URL.
Reescritura de URLs
// ... continuación del código anterior

     // Visualizar objetos contenidos en la sesion actual
     Enumeration e = session.getAttributeNames();
     int contValores = 1;
     while (e.hasMoreElements())
     {
        ++contValores;
        String nombre = (String)e.nextElement();
        String valor = session.getAttribute(nombre).toString();
        out.println(nombre + quot; = quot; + valor + quot;<BR>quot;);
     }

    out.print(quot;<p><a href=quot;quot;);
    out.print(respuesta.encodeURL( quot;SetSession?NombreDato=nombrequot; +
                                contValores + quot;&ValorDato=valorquot; +
  contValores));
    out.println(quot;quot; >URL encoded </a>quot;);
  }
Subir ficheros al servidor
<HTML>
<HEAD>
<TITLE></TITLE>
</HEAD>
<BODY>
  <CENTER>
  <FORM method=quot;POSTquot; enctype='multipart/form-data' action=quot;UploadFicheroquot;>
      Por favor, seleccione el trayecto del fichero a cargar
  <BR><INPUT type=quot;filequot; name=quot;ficheroquot;>
  <INPUT type=quot;submitquot;>
</FORM>
</CENTER>
</BODY>
</HTML>
Subir ficheros al servidor
<HTML>
<HEAD>
<TITLE></TITLE>
</HEAD>
<BODY>
  <CENTER>
  <FORM method=quot;POSTquot; enctype='multipart/form-data' action=quot;UploadFicheroquot;>
      Por favor, seleccione el trayecto del fichero a cargar
  <BR><INPUT type=quot;filequot; name=quot;ficheroquot;>
  <INPUT type=quot;submitquot;>
</FORM>
</CENTER>
</BODY>
</HTML>
A continuación, se debe que crear un servlet que sea capaz de
●

    procesar la respuesta. Para facilitar la labor se pueden emplear las
    clases que proporciona un subproducto de Apache llamado fileupload
    (http://jakarta.apache.org/commons/fileupload/). Se descarga el
    fichero jar correspondiente y se incluye en el classpath. Para el
    funcionamiento correcto de esta clase será necesario incluir,también
    incluir en el classpath la implementación de Yakarta commons IO que
    se puede descargar de http://jakarta.apache.org/commons/io/
●
import java.io.*;
import java.net.*;
import javax.servlet.*;
import javax.servlet.http.*;

import org.apache.commons.fileupload.*;
import java.util.*;
/**
 * Subir ficheros al servidor
 * @author José Ramón Méndez Reboredo
 * @version 1.0
 */
public class UploadFichero extends HttpServlet {

       /** Handles the HTTP <code>POST</code> method.
        * @param request servlet request
        * @param response servlet response
        */
       protected void doPost(HttpServletRequest request, HttpServletResponse response)
       throws ServletException, IOException {
           response.setContentType(quot;text/htmlquot;);
           PrintWriter out = response.getWriter();
           out.println(quot;<html><head><title>Servlet</title></head><body>quot;);
           procesaFicheros(request,out);
           out.println(quot;</body> </html>quot;);
           out.close();
       }
....
public boolean procesaFicheros(HttpServletRequest req, PrintWriter out ) {
      try {
         DiskFileUpload fu = new DiskFileUpload(); // objeto que es capaz de parsear la perición
         fu.setSizeMax(1024*1024*8); // máximo numero de bytes 8 MB
         fu.setSizeThreshold(4096); // tamaño por encima del cual los ficheros son escritos en disco
         fu.setRepositoryPath(quot;/tmpquot;); // directorio en el que se escribirán los ficheros con tamaño
                                            // superior al soportado en memoria
         List fileItems = fu.parseRequest(req); // ordenamos procesar los ficheros
         if(fileItems == null) { return false; }
         out.print(quot;<br>El número de ficheros subidos es: quot; + fileItems.size());

          Iterator i = fileItems.iterator();// Iteramos por cada fichero
          FileItem actual = null;
          while (i.hasNext()) {
             actual = (FileItem)i.next();
             String fileName = actual.getName();
             out.println(quot;<br>Nos han subido el ficheroquot; + fileName);

              File fichero = new File(fileName); //construimos un objeto file para la ruta completa
              fichero = new File(quot;c:ficherossubidosquot; + fichero.getName()); //obtener el nombre

              actual.write(fichero); // escribimos el fichero colgando del nuevo path
          }

        } catch(Exception e) { return false; }
        return true;
    }
}
Generar imágenes desde servlets
    Para codificar la imagen (Objeto Image), se puede usar la clase
●

    GifEncoder que se puede descargar gratuitamente de
    http://www.acme.com/java/software/Acme.JPM.Encoders.GifEncoder.
    html.
    GifEncoder permite codificar imágenes en formato GIF.
●


    De la misma forma, se podría emplear las clases JPEGCodec,
●

    JPEGEncodeParam y JPEGImageEncoder del paquete
    com.sun.image.codec.jpeg que se distribuye con el propio JavaSE.
     Es importante recordar que si se escoge esta opción el tipo de
●

    respuesta del servlet será “image/jpeg” y que no es necesario
    descargar ningún software adicional.
Generar imágenes desde Servlets
 protected void processRequest(HttpServletRequest req, HttpServletResponse res)
  throws ServletException, java.io.IOException {
    ServletOutputStream bufferSalida = res.getOutputStream();
    Graphics contextoGrafico=null;
    try {
        // Construir un contexto de gráficos mediante una buffered image
        int w = 200; int h = 50;
        BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_3BYTE_BGR);
        contextoGrafico=image.getGraphics();
        contextoGrafico.setFont(new Font(quot;Arialquot;, Font.BOLD | Font.ITALIC, 20));
        contextoGrafico.draw3DRect(0,0,w-1,h-1,true);

        Date ahora = new Date();
        SimpleDateFormat formateador = new SimpleDateFormat(quot;dd-MM-yyyy HH:mmquot;);
        contextoGrafico.drawString(formateador.format(ahora), 20, 30);

        // Encode the off screen graphics into a JPEG and send it to the client
        res.setContentType(quot;image/jpegquot;);
        JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(bufferSalida);
        JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(image);
        param.setQuality(1.0f, false); encoder.setJPEGEncodeParam(param);
        encoder.encode(image);

          bufferSalida.flush(); bufferSalida.close();
     } finally { if (contextoGrafico != null) contextoGrafico.dispose(); }
 }
Generar imágenes desde Servlets
 protected void processRequest(HttpServletRequest req, HttpServletResponse res)
  throws ServletException, java.io.IOException {
    ServletOutputStream bufferSalida = res.getOutputStream();
    Graphics contextoGrafico=null;
    try {
        // Construir un contexto de gráficos mediante una buffered image
        int w = 200; int h = 50;
        BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_3BYTE_BGR);
        contextoGrafico=image.getGraphics();
        contextoGrafico.setFont(new Font(quot;Arialquot;, Font.BOLD | Font.ITALIC, 20));
        contextoGrafico.draw3DRect(0,0,w-1,h-1,true);

        Date ahora = new Date();
        SimpleDateFormat formateador = new SimpleDateFormat(quot;dd-MM-yyyy HH:mmquot;);
        contextoGrafico.drawString(formateador.format(ahora), 20, 30);

        // Encode the off screen graphics into a JPEG and send it to the client
        res.setContentType(quot;image/jpegquot;);
        JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(bufferSalida);
        JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(image);
        param.setQuality(1.0f, false); encoder.setJPEGEncodeParam(param);
        encoder.encode(image);

          bufferSalida.flush(); bufferSalida.close();
     } finally { if (contextoGrafico != null) contextoGrafico.dispose(); }
 }
Generar imágenes desde Servlets
 protected void processRequest(HttpServletRequest req, HttpServletResponse res)
  throws ServletException, java.io.IOException {
    ServletOutputStream bufferSalida = res.getOutputStream();
    Graphics contextoGrafico=null;
    try {
        // Construir un contexto de gráficos mediante una buffered image
        int w = 200; int h = 50;
        BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_3BYTE_BGR);
        contextoGrafico=image.getGraphics();
        contextoGrafico.setFont(new Font(quot;Arialquot;, Font.BOLD | Font.ITALIC, 20));
        contextoGrafico.draw3DRect(0,0,w-1,h-1,true);

        Date ahora = new Date();
        SimpleDateFormat formateador = new SimpleDateFormat(quot;dd-MM-yyyy HH:mmquot;);
        contextoGrafico.drawString(formateador.format(ahora), 20, 30);

        // Encode the off screen graphics into a JPEG and send it to the client
        res.setContentType(quot;image/jpegquot;);
        JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(bufferSalida);
        JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(image);
        param.setQuality(1.0f, false); encoder.setJPEGEncodeParam(param);
        encoder.encode(image);

          bufferSalida.flush(); bufferSalida.close();
     } finally { if (contextoGrafico != null) contextoGrafico.dispose(); }
 }
JSP
    JSP es una tecnología basada en Java que simplifica el proceso de
●

    desarrollo de sitios web dinámicos. Las Java Server Pages son
    ficheros de texto (normalmente con extensión .jsp) que sustituyen a
    las páginas HTML tradicionales. Los ficheros JSP contienen etiquetas
    HTML y código embebido que permite al diseñador de la página web
    acceder a datos desde código Java que se ejecuta en el servidor.
    Es una tecnología híbrida basada en template systems. Al igual que
●

    ASP, SSJS y PHP puede incorporar scripts para añadir código Java
    directamente a las páginas .jsp, pero también implementa, al estilo de
    ColdFusion, un conjunto de etiquetas que interaccionan con los
    objetos Java del servidor, sin la necesidad de aparezca código fuente
    en la página.
    JSP se implementa utilizando la tecnología Servlet. Cuando un
●

    servidor web recibe una petición de una página .jsp, la redirecciona a
    un proceso especial dedicado a manejar la ejecución de servlets
    (servlet container).
Directivas JSP
Establecer atributos de la página:

<HTML>
<HEAD>
      <TITLE>La primera página con JSP</TITLE>
</HEAD>

<BODY BGCOLOR=quot;#FFFFFFquot;>

<%@ page info=”Probando JSP.” %>
<%@ page language=”java” %>
<%@ page contentType=”text/plain; charset=ISO-8859-1” %>
<%@ page import=”java.util.*, java.awt.*” %>
<%@ page session=”false” %>
<%@ page buffer=”12kb” %>
<%@ page autoFlush=”true” %>
<%@ page isThreadSafe=”false” %>
<%@ page errorPage=”/webdev/misc/error.jsp” %>
<%@ page isErrorPage=”false” %>

Hola mundo!
</BODY>
</HTML>
Directivas JSP
    <%@ include file=”localURL” %>
●


    Permite incluir el contenido de otra página .html o .jsp. El fichero es
●

    identificado mediante una URL y la directiva tiene el efecto de
    remplazarse a sí misma con el contenido del archivo especificado.
    Puede ser utilizada para incluir cabeceras y pies de páginas comunes
    a un desarrollo dado.
    <%@ taglib uri=”tagLibraryURI” prefix=”tagPrefix” %>
●


    Esta directiva se utiliza para notificar al contenedor JSP que la página
●

    utilizará una o más librerías de etiquetas personalizadas. Una librería
    de etiquetas es una colección de etiquetas personalizadas, que
    pueden ser utilizadas para extender la funcionalidad básica de JSP.
    El valor del atributo uri indica la localizacion del TLD (Tag Library
●

    Descriptor), mientras que el atributo prefix especifica el identificador
    del espacio de nombres en XML que será anexado a todas la
    etiquetas de esa librería que se utilicen en la página .jsp.
    Por razones de seguridad, la especificación JSP permite utilizar
●

    solamente TLD’s del sistema de archivos local.
Declaraciones globales
    Las declaraciones se usan para definir variables y métodos
●

    específicos para una página .jsp. Las variables y los métodos
    declarados son accesibles por cualquier otro elemento de script de la
    página, aunque estén codificados antes que la propia declaración. La
    sintaxis es:
    <%! declaracion (es) %>
●




     <%! public long factorial (long numero) {
       if (numero == 0) return 1;
       else return numero * factorial(numero – 1);
     } %>


<%! private int x = 0, y = 0; private String unidad=”cm”; %>
Declaraciones globales
    Un uso importante de la declaración de métodos es el manejo de
●

    eventos relacionados con la inicialización y destrucción de la página
    .jsp. La inicialización ocurre la primera vez que el contenedor JSP
    recibe una petición de una página .jsp concreta. La destrucción
    ocurre cuando el contenedor JSP descarga la clase de memoria o
    cuando el contenedor JSP se reinicia.
    Estos eventos se pueden controlar sobreescribiendo dos métodos
●

    que son llamados automáticamente: jspInit() y jspDestroy(). Su
    codificación es opcional.


<%! public void jspInit () {
     // El código de inicialización iría aquí.
  }
  public void jspDestroy() {
     // El código de finalización iría aquí.
  }
%>
Expresiones y Scriptlets
    <%= expresión %>
●


    Las expresiones están ligadas a la generación de contenidos. Se
●

    pueden utilizar para imprimir valores de variables o resultados de la
    ejecución de algún método. Todo resultado de una expresión es
    convertido a un String antes de ser añadido a la salida de la página.
    Las expresiones no terminan con un punto y coma (;).
    <% scriptlet %>
●


    Los scriptlets pueden contener cualquier tipo de sentencias Java,
●

    pudiendo dejar abiertos uno o más bloques de sentencias que
    deberán ser cerradas en etiquetas de scritplets posteriores.
Ejemplo: factorial
<!-- factorialestry.jsp -->

<HTML><HEAD>
      <TITLE>La segunda página con JSP</TITLE>
</HEAD>
<BODY BGCOLOR=quot;#FFFFFFquot;>

<%! public long factorial (long numero) throws IllegalArgumentException
 {
        if ((numero < 0) || (numero > 20))
              throw new IllegalArgumentException(quot;Fuera de Rangoquot;);

          if (numero == 0) return 1;
          else return numero * factorial(numero - 1);
 } %>

<% try {
        long resultado = factorial (x); %>
        <p align=center> <%= x %>! = <%= resultado %></p>
<% } catch (IllegalArgumentException e) { %>
        <p>El argumento para calcular el factorial esta fuera de rango.</p>
<% } %>

</BODY>
</HTML>
Comentarios
    <!-- comentario HTML -->
●


    <%-- comentario JSP --%>
●


    <% /* comentario de scriptlet */ %>
●


    <% // comentario de scriptlet %>
●
Acciones
    <jsp:forward page=”localURL” />
●


    Se usa para transferir el control de una página .jsp a otra localización.
●

    Cualquier código generado hasta el momento se descarta, y el
    procesado de la petición se inicia en la nueva página. El navegador
    cliente sigue mostrando la URL de la página .jsp inicial.
    <jsp:include page=”localURL” flush=”true” />
●


    Proporciona una forma sencilla de incluir contenido generado por otro
●

    documento local en la salida de la página actual. En contraposición
    con la etiqueta forward, include transfiere el control temporalmente.
Objetos implícitos
    Objetos implícitos
●




            Objeto               Clase o Interfaz                             Descripción
          page          javax.servlet.jsp.HttpJspPage            Instancia del servlet de la página .jsp.
          config        javax.servlet.ServletConfig              Datos de configuración del servlet.
          request       javax.servlet.http.HttpServletRequest    Petición. Parámetros incluidos.
          response      javax.servlet.http.HttpServletResponse   Respuesta.
          out           javax.servlet.jsp.JspWriter              Stream de salida para el contenido de la
                                                                 página.
          session       javax.servlet.http.HttpSession           Datos específicos de la sesión de usuario.
          application   javax.servlet.ServletContext             Datos compartidos por todas las páginas.
          pageContext   javax.servlet.jsp.PageContext            Contexto para la ejecución de las páginas.
          exception     java.lang.Throwable                      Excepción o error no capturado.
Factoriales
<!-- factoriales.jsp -->
<HTML>
<HEAD>
         <TITLE>Cálculo de factoriales con JSP</TITLE>
</HEAD>

<BODY BGCOLOR=quot;#FFFFFFquot;>

<%! public long factorial (long numero)
 {
      if (numero == 0) return 1;
      else return numero * factorial(numero - 1);
 } %>

<H1>TABLA DE FACTORIALES</H1>
<table border=quot;1quot;>
<tr><th><i>x</i></th><th><i>x</i>!</th></tr>
<% for (long x = 0; x <=20; ++x) { %>
   <tr><td><%= x %></td><td><%= factorial (x) %></td></tr>
<% } %>
</table>

</BODY>
</HTML>
Factoriales
<!-- factoriales.jsp -->
<HTML>
<HEAD>
         <TITLE>Cálculo de factoriales con JSP</TITLE>
</HEAD>

<BODY BGCOLOR=quot;#FFFFFFquot;>

<%! public long factorial (long numero)
 {
      if (numero == 0) return 1;
      else return numero * factorial(numero - 1);
 } %>

<H1>TABLA DE FACTORIALES</H1>
<table border=quot;1quot;>
<tr><th><i>x</i></th><th><i>x</i>!</th></tr>
<% for (long x = 0; x <=20; ++x) { %>
   <tr><td><%= x %></td><td><%= factorial (x) %></td></tr>
<% } %>
</table>

</BODY>
</HTML>
Excepciones
<!-- factorialestry.jsp -->
<HTML><HEAD>
<TITLE>Cálculo de factoriales con JSP y manejo de excepciones</TITLE>
</HEAD>
<BODY BGCOLOR=quot;#FFFFFFquot;>
<%! int x = 21; %>
<%! public long factorial (long numero) throws IllegalArgumentException
 {
            if ((numero < 0) || (numero > 20))
                  throw new IllegalArgumentException(quot;Fuera de Rangoquot;);
           if (numero == 0) return 1;
         else return numero * factorial(numero - 1);
 } %>

<% try {
    long resultado = factorial (x); %>
    <p align=center> <%= x %>! = <%= resultado %></p>
<% } catch (IllegalArgumentException e) { %>
    <p>El argumento para calcular el factorial esta fuera de rango.</p>
<% } %>

</BODY>
Tendencias actuales
    Modelo Vista Controlador (MVC) es un patrón de arquitectura de
●

    software que separa los datos de una aplicación, la interfaz de
    usuario, y la lógica de control en tres componentes distintos. El patrón
    MVC se emplea frecuentemente en aplicaciones web, donde la vista
    es la página HTML ó XHTML. En web se usa el conocido MVC Model
    2
    Actualmente:
●
Tendencias actuales
    Ventajas
●


         No es necesario reescribir las vistas
     –

         Las acciones se programan una sola vez
     –

         Acciones que se pueden ejecutar sobre los datos y vistas se definen de
     –
         forma independiente garantizando una mayor independencia de los
         componentes del software
         Las acciones sobre los datos se pueden reutilizar fácilmente para
     –
         construir otro tipo de aplicaciones (Como por ejemplo Swing con el API
         Action)
    Actualmente la persistencia de datos se implementa mediante
●

    tecnologías ORM ó, en algunos casos application scafolding.
         ORM implica que los objetos se mapean automáticamente a una base
     –
         de datos (a veces es necesario decir cómo se almacenan los atributos
         en ficheros de configuración). Ejemplos: Hibernate que actualmente
         implementa la Java Persistent API (Extremadamente fácil de manejar)
         Application scafolding significa generar código de forma automática a
     –
         partir de una base de datos. No esta tan flexible como ORM.
Hibernate
package es.ei.uvigo;
@Entity
@Table( name=“users” )
public class User implements Serializable{
  private String username;

    @Id
    @Column(name = quot;usernamequot;, nullable = false)
    private String username;

    @Column(nullable = false, length = 50, unique = true)
    private String clave;

    public String getUsername(){
      return username;
    }
    public String getClave(){
      return clave;
    }
    public void setUsername(String username){
      this.username=username;
    }
    public void setClave(String clave){
      this.clave=clave;
    }
}
Fichero de configuración
<persistence> <!-- Colocalo en el directorio META-INF del fichero .jar y llámalo persistence.xml -->
  <persistence-unit name=quot;manager1quot; transaction-type=quot;RESOURCE_LOCALquot;>
   <class>es.ei.uvigo.User</class>
   <class>es.ei.uvigo.Cars</class>
   <!-- enumera todas las clases persistentes -->
   <properties>
     <property name=quot;hibernate.dialectquot; value=quot;org.hibernate.dialect.HSQLDialectquot;/>
     <property name=quot;hibernate.connection.driver_classquot; value=quot;org.hsqldb.jdbcDriverquot;/>
     <property name=quot;hibernate.connection.usernamequot; value=quot;saquot;/>
     <property name=quot;hibernate.connection.passwordquot; value=quot;quot;/>
     <property name=quot;hibernate.connection.urlquot; value=quot;jdbc:hsqldb:.quot;/>
     <property name=quot;hibernate.max_fetch_depthquot; value=quot;3quot;/>

     <!-- cache configuration -->
     <property name=quot;hibernate.ejb.classcache.org.hibernate.ejb.test.Itemquot; value=quot;read-writequot;/>
     <property name=quot;hibernate.ejb.collectioncache.org.hibernate.ejb.test.Item.distributorsquot;
      value=quot;read-write, RegionNamequot;/>

    </properties>
  </persistence-unit>
</persistence>
Hibernate
// Use persistence.xml configuration
EntityManagerFactory
   emf = Persistence.createEntityManagerFactory(quot;manager1quot;);
// Retrieve an application managed entity manager
EntityManager em = emf.createEntityManager();

   User u=new User();
   u.setUsername(“moncho”);
   u.setClave(“xjmon764d”);
   em.persist(u);


em.close();
emf.close(); //close at application end

Mais conteúdo relacionado

Mais procurados

Introducción a los lenguajes de programación de la plataforma Web 2.0: Ajax
Introducción a los lenguajes de programación de la plataforma Web 2.0: AjaxIntroducción a los lenguajes de programación de la plataforma Web 2.0: Ajax
Introducción a los lenguajes de programación de la plataforma Web 2.0: AjaxDavid Arango
 
Curso Java Avanzado 1 IntroduccióN Al Desarrollo Web
Curso Java Avanzado   1 IntroduccióN Al Desarrollo WebCurso Java Avanzado   1 IntroduccióN Al Desarrollo Web
Curso Java Avanzado 1 IntroduccióN Al Desarrollo WebEmilio Aviles Avila
 
Semana 1 tecnologias web
Semana 1   tecnologias webSemana 1   tecnologias web
Semana 1 tecnologias webINFOVIC
 
Desarrollando un API con REST
Desarrollando un API con RESTDesarrollando un API con REST
Desarrollando un API con RESTAlex Puig
 
Desarrollo de Aplicaciones Web II - Sesión 02 - Conceptos Generales e Introdu...
Desarrollo de Aplicaciones Web II - Sesión 02 - Conceptos Generales e Introdu...Desarrollo de Aplicaciones Web II - Sesión 02 - Conceptos Generales e Introdu...
Desarrollo de Aplicaciones Web II - Sesión 02 - Conceptos Generales e Introdu...Didier Granados
 
4. Curso Java JSP (Java Server Pages) - Curso 2005-2006
4. Curso Java JSP (Java Server Pages) - Curso 2005-20064. Curso Java JSP (Java Server Pages) - Curso 2005-2006
4. Curso Java JSP (Java Server Pages) - Curso 2005-2006Samuel Marrero
 
Introducción al desarrollo de aplicaciones web en Java
Introducción al desarrollo de aplicaciones web en JavaIntroducción al desarrollo de aplicaciones web en Java
Introducción al desarrollo de aplicaciones web en JavaEudris Cabrera
 
Servicios web java php-perl-google
Servicios web java php-perl-googleServicios web java php-perl-google
Servicios web java php-perl-googleJosue Hernandez
 
Bases de Datos en Java - Intro a JDBC
Bases de Datos en Java - Intro a JDBCBases de Datos en Java - Intro a JDBC
Bases de Datos en Java - Intro a JDBCCarlos Hernando
 
Web services restful con JAX-RS
Web services restful con JAX-RSWeb services restful con JAX-RS
Web services restful con JAX-RSVortexbird
 
Servicio web
Servicio web Servicio web
Servicio web Yael67
 
Curso Java Avanzado 3 4 Js Ps Con Java Beans
Curso Java Avanzado   3 4 Js Ps Con Java BeansCurso Java Avanzado   3 4 Js Ps Con Java Beans
Curso Java Avanzado 3 4 Js Ps Con Java BeansEmilio Aviles Avila
 
Java WebServices JaxWS - JaxRs
Java WebServices JaxWS - JaxRsJava WebServices JaxWS - JaxRs
Java WebServices JaxWS - JaxRsHernan Rengifo
 

Mais procurados (20)

Introducción a los lenguajes de programación de la plataforma Web 2.0: Ajax
Introducción a los lenguajes de programación de la plataforma Web 2.0: AjaxIntroducción a los lenguajes de programación de la plataforma Web 2.0: Ajax
Introducción a los lenguajes de programación de la plataforma Web 2.0: Ajax
 
AJAX EN CURSO PHP
AJAX EN CURSO PHPAJAX EN CURSO PHP
AJAX EN CURSO PHP
 
Tutorial - REST con java (JAX-RS 2.0)
Tutorial - REST con java (JAX-RS 2.0)Tutorial - REST con java (JAX-RS 2.0)
Tutorial - REST con java (JAX-RS 2.0)
 
Curso Java Avanzado 1 IntroduccióN Al Desarrollo Web
Curso Java Avanzado   1 IntroduccióN Al Desarrollo WebCurso Java Avanzado   1 IntroduccióN Al Desarrollo Web
Curso Java Avanzado 1 IntroduccióN Al Desarrollo Web
 
AJAX
AJAXAJAX
AJAX
 
Semana 1 tecnologias web
Semana 1   tecnologias webSemana 1   tecnologias web
Semana 1 tecnologias web
 
introduccion a Ajax
introduccion a Ajaxintroduccion a Ajax
introduccion a Ajax
 
Desarrollando un API con REST
Desarrollando un API con RESTDesarrollando un API con REST
Desarrollando un API con REST
 
Desarrollo de Aplicaciones Web II - Sesión 02 - Conceptos Generales e Introdu...
Desarrollo de Aplicaciones Web II - Sesión 02 - Conceptos Generales e Introdu...Desarrollo de Aplicaciones Web II - Sesión 02 - Conceptos Generales e Introdu...
Desarrollo de Aplicaciones Web II - Sesión 02 - Conceptos Generales e Introdu...
 
4. Curso Java JSP (Java Server Pages) - Curso 2005-2006
4. Curso Java JSP (Java Server Pages) - Curso 2005-20064. Curso Java JSP (Java Server Pages) - Curso 2005-2006
4. Curso Java JSP (Java Server Pages) - Curso 2005-2006
 
Desarrollo web
Desarrollo webDesarrollo web
Desarrollo web
 
Introducción al desarrollo de aplicaciones web en Java
Introducción al desarrollo de aplicaciones web en JavaIntroducción al desarrollo de aplicaciones web en Java
Introducción al desarrollo de aplicaciones web en Java
 
Servicios web java php-perl-google
Servicios web java php-perl-googleServicios web java php-perl-google
Servicios web java php-perl-google
 
Bases de Datos en Java - Intro a JDBC
Bases de Datos en Java - Intro a JDBCBases de Datos en Java - Intro a JDBC
Bases de Datos en Java - Intro a JDBC
 
Web services restful con JAX-RS
Web services restful con JAX-RSWeb services restful con JAX-RS
Web services restful con JAX-RS
 
Asp.net
Asp.netAsp.net
Asp.net
 
Servicio web
Servicio web Servicio web
Servicio web
 
Curso Java Avanzado 3 4 Js Ps Con Java Beans
Curso Java Avanzado   3 4 Js Ps Con Java BeansCurso Java Avanzado   3 4 Js Ps Con Java Beans
Curso Java Avanzado 3 4 Js Ps Con Java Beans
 
Java WebServices JaxWS - JaxRs
Java WebServices JaxWS - JaxRsJava WebServices JaxWS - JaxRs
Java WebServices JaxWS - JaxRs
 
Web Services JAX-RS RESTful y SOAP
Web Services JAX-RS RESTful y SOAPWeb Services JAX-RS RESTful y SOAP
Web Services JAX-RS RESTful y SOAP
 

Destaque (20)

Patxielinventor
PatxielinventorPatxielinventor
Patxielinventor
 
Exercicis nivell lllindar 1. Acollida Serreta.吴双龙Març 2013
Exercicis nivell lllindar 1. Acollida Serreta.吴双龙Març 2013Exercicis nivell lllindar 1. Acollida Serreta.吴双龙Març 2013
Exercicis nivell lllindar 1. Acollida Serreta.吴双龙Març 2013
 
Insolitos
InsolitosInsolitos
Insolitos
 
57439 Chateo2
57439 Chateo257439 Chateo2
57439 Chateo2
 
Politica
PoliticaPolitica
Politica
 
I Seminario Educacion & Turismo
I Seminario Educacion & TurismoI Seminario Educacion & Turismo
I Seminario Educacion & Turismo
 
Marco teorico
Marco teoricoMarco teorico
Marco teorico
 
150528 - FFBB Infos 048
150528 - FFBB Infos 048150528 - FFBB Infos 048
150528 - FFBB Infos 048
 
Certificados R Davies 2016
Certificados R Davies 2016Certificados R Davies 2016
Certificados R Davies 2016
 
El temps en la justicia de menors. M.Ferrer, M.Capdevila, M.Blanch
El temps en la justicia de menors. M.Ferrer, M.Capdevila, M.BlanchEl temps en la justicia de menors. M.Ferrer, M.Capdevila, M.Blanch
El temps en la justicia de menors. M.Ferrer, M.Capdevila, M.Blanch
 
caras raras
caras rarascaras raras
caras raras
 
Iman Maleki Pinturas
Iman Maleki PinturasIman Maleki Pinturas
Iman Maleki Pinturas
 
esc 16
esc 16esc 16
esc 16
 
Anunciosdeayer
AnunciosdeayerAnunciosdeayer
Anunciosdeayer
 
Juergade Mujere
Juergade MujereJuergade Mujere
Juergade Mujere
 
Visita Al Ginecologo 2518
Visita Al Ginecologo 2518Visita Al Ginecologo 2518
Visita Al Ginecologo 2518
 
Sms Certificado
Sms CertificadoSms Certificado
Sms Certificado
 
Ferrari
FerrariFerrari
Ferrari
 
TORMENTA TROPICAL “LARRY”
TORMENTA TROPICAL “LARRY”TORMENTA TROPICAL “LARRY”
TORMENTA TROPICAL “LARRY”
 
Lectura digitales4
Lectura digitales4Lectura digitales4
Lectura digitales4
 

Semelhante a Programación web con JSP

Semelhante a Programación web con JSP (20)

Presentación1
Presentación1Presentación1
Presentación1
 
Tema servlets
Tema servletsTema servlets
Tema servlets
 
Tema servlets
Tema servletsTema servlets
Tema servlets
 
Tema servlets
Tema servletsTema servlets
Tema servlets
 
Tema servlets
Tema servletsTema servlets
Tema servlets
 
Servicios web Extendido_error perl
Servicios web Extendido_error perlServicios web Extendido_error perl
Servicios web Extendido_error perl
 
Acceso a BBDD mediante un servlet
Acceso a BBDD mediante un servletAcceso a BBDD mediante un servlet
Acceso a BBDD mediante un servlet
 
Ajax
AjaxAjax
Ajax
 
2. Java Servlets (J2EE) - Curso 2005-2006
2. Java Servlets (J2EE) - Curso 2005-20062. Java Servlets (J2EE) - Curso 2005-2006
2. Java Servlets (J2EE) - Curso 2005-2006
 
Curso de php
Curso de phpCurso de php
Curso de php
 
Programación web 1er dept
Programación web 1er deptProgramación web 1er dept
Programación web 1er dept
 
Dce2 introduccion asp.net primeras 20
Dce2 introduccion asp.net primeras 20Dce2 introduccion asp.net primeras 20
Dce2 introduccion asp.net primeras 20
 
Servicios web
Servicios webServicios web
Servicios web
 
Explicación del código del Servlet HolaMundo
Explicación del código del Servlet HolaMundoExplicación del código del Servlet HolaMundo
Explicación del código del Servlet HolaMundo
 
Intro a ASP.NET
Intro a ASP.NETIntro a ASP.NET
Intro a ASP.NET
 
Desarrollo aplicaciones distribuidas sockets
Desarrollo aplicaciones distribuidas socketsDesarrollo aplicaciones distribuidas sockets
Desarrollo aplicaciones distribuidas sockets
 
Socket
SocketSocket
Socket
 
Servicios web en php, perl, java
Servicios web en php, perl, javaServicios web en php, perl, java
Servicios web en php, perl, java
 
Servicios web
Servicios webServicios web
Servicios web
 
Clase 5 AJAX - Desarrollo de aplicaciones móviles
Clase 5  AJAX - Desarrollo de aplicaciones móvilesClase 5  AJAX - Desarrollo de aplicaciones móviles
Clase 5 AJAX - Desarrollo de aplicaciones móviles
 

Mais de ousli07

Comunidade Blogaliza
Comunidade BlogalizaComunidade Blogaliza
Comunidade Blogalizaousli07
 
Dev con Joomla componentes modulos plugins
Dev con Joomla componentes modulos pluginsDev con Joomla componentes modulos plugins
Dev con Joomla componentes modulos pluginsousli07
 
Perspectivas de la realidad desde los medios de comunicacion frente los medio...
Perspectivas de la realidad desde los medios de comunicacion frente los medio...Perspectivas de la realidad desde los medios de comunicacion frente los medio...
Perspectivas de la realidad desde los medios de comunicacion frente los medio...ousli07
 
Directrices migratorias
Directrices migratoriasDirectrices migratorias
Directrices migratoriasousli07
 
Aplicación docente del software libre
Aplicación docente del software libreAplicación docente del software libre
Aplicación docente del software libreousli07
 
Webs Dinámicas, web nos centros educativos baseadas en Software Libre
Webs Dinámicas, web nos centros educativos baseadas en Software LibreWebs Dinámicas, web nos centros educativos baseadas en Software Libre
Webs Dinámicas, web nos centros educativos baseadas en Software Libreousli07
 
O software libre para a xestión da rede educativa máis grande do mundo
O software libre para a xestión da rede educativa máis grande do mundoO software libre para a xestión da rede educativa máis grande do mundo
O software libre para a xestión da rede educativa máis grande do mundoousli07
 
Iniciativa EducaMadrid - MadridLinux.
Iniciativa EducaMadrid - MadridLinux.Iniciativa EducaMadrid - MadridLinux.
Iniciativa EducaMadrid - MadridLinux.ousli07
 
Software Libre e terminais lixeiros en aulas: TCOS
Software Libre e terminais lixeiros en aulas: TCOSSoftware Libre e terminais lixeiros en aulas: TCOS
Software Libre e terminais lixeiros en aulas: TCOSousli07
 
Impulso al Software Libre desde la Junta de Andalucia
Impulso al Software Libre desde la Junta de AndaluciaImpulso al Software Libre desde la Junta de Andalucia
Impulso al Software Libre desde la Junta de Andaluciaousli07
 
Formando ao futuro profesional en Software Libre
Formando ao futuro profesional en Software LibreFormando ao futuro profesional en Software Libre
Formando ao futuro profesional en Software Libreousli07
 
Forja Universitaria de RedIRIS
Forja Universitaria de RedIRISForja Universitaria de RedIRIS
Forja Universitaria de RedIRISousli07
 
A Galipedia, libre e colaborativa, tamén para a aprendizaxe e o ensino
 A Galipedia, libre e colaborativa, tamén para a aprendizaxe e o ensino A Galipedia, libre e colaborativa, tamén para a aprendizaxe e o ensino
A Galipedia, libre e colaborativa, tamén para a aprendizaxe e o ensinoousli07
 
Software Libre e accesibilidade ás novas tecnoloxías, posibilitando a ensinan...
Software Libre e accesibilidade ás novas tecnoloxías, posibilitando a ensinan...Software Libre e accesibilidade ás novas tecnoloxías, posibilitando a ensinan...
Software Libre e accesibilidade ás novas tecnoloxías, posibilitando a ensinan...ousli07
 
Aula Cesga, un campus virtual basado en Software Libre
Aula Cesga, un campus virtual basado en Software LibreAula Cesga, un campus virtual basado en Software Libre
Aula Cesga, un campus virtual basado en Software Libreousli07
 
Presentacion Rede DSI
Presentacion Rede DSIPresentacion Rede DSI
Presentacion Rede DSIousli07
 
Docencia Redes con Open Source
Docencia Redes con Open SourceDocencia Redes con Open Source
Docencia Redes con Open Sourceousli07
 
Sistema y soporte informático en un centro educativo basado en software libre
Sistema y soporte informático en un centro educativo basado en software libreSistema y soporte informático en un centro educativo basado en software libre
Sistema y soporte informático en un centro educativo basado en software libreousli07
 
Acercamiento al Software Libre
Acercamiento al Software LibreAcercamiento al Software Libre
Acercamiento al Software Libreousli07
 

Mais de ousli07 (20)

Comunidade Blogaliza
Comunidade BlogalizaComunidade Blogaliza
Comunidade Blogaliza
 
Dev con Joomla componentes modulos plugins
Dev con Joomla componentes modulos pluginsDev con Joomla componentes modulos plugins
Dev con Joomla componentes modulos plugins
 
Perspectivas de la realidad desde los medios de comunicacion frente los medio...
Perspectivas de la realidad desde los medios de comunicacion frente los medio...Perspectivas de la realidad desde los medios de comunicacion frente los medio...
Perspectivas de la realidad desde los medios de comunicacion frente los medio...
 
Directrices migratorias
Directrices migratoriasDirectrices migratorias
Directrices migratorias
 
Aplicación docente del software libre
Aplicación docente del software libreAplicación docente del software libre
Aplicación docente del software libre
 
Webs Dinámicas, web nos centros educativos baseadas en Software Libre
Webs Dinámicas, web nos centros educativos baseadas en Software LibreWebs Dinámicas, web nos centros educativos baseadas en Software Libre
Webs Dinámicas, web nos centros educativos baseadas en Software Libre
 
O software libre para a xestión da rede educativa máis grande do mundo
O software libre para a xestión da rede educativa máis grande do mundoO software libre para a xestión da rede educativa máis grande do mundo
O software libre para a xestión da rede educativa máis grande do mundo
 
Iniciativa EducaMadrid - MadridLinux.
Iniciativa EducaMadrid - MadridLinux.Iniciativa EducaMadrid - MadridLinux.
Iniciativa EducaMadrid - MadridLinux.
 
Magasi
MagasiMagasi
Magasi
 
Software Libre e terminais lixeiros en aulas: TCOS
Software Libre e terminais lixeiros en aulas: TCOSSoftware Libre e terminais lixeiros en aulas: TCOS
Software Libre e terminais lixeiros en aulas: TCOS
 
Impulso al Software Libre desde la Junta de Andalucia
Impulso al Software Libre desde la Junta de AndaluciaImpulso al Software Libre desde la Junta de Andalucia
Impulso al Software Libre desde la Junta de Andalucia
 
Formando ao futuro profesional en Software Libre
Formando ao futuro profesional en Software LibreFormando ao futuro profesional en Software Libre
Formando ao futuro profesional en Software Libre
 
Forja Universitaria de RedIRIS
Forja Universitaria de RedIRISForja Universitaria de RedIRIS
Forja Universitaria de RedIRIS
 
A Galipedia, libre e colaborativa, tamén para a aprendizaxe e o ensino
 A Galipedia, libre e colaborativa, tamén para a aprendizaxe e o ensino A Galipedia, libre e colaborativa, tamén para a aprendizaxe e o ensino
A Galipedia, libre e colaborativa, tamén para a aprendizaxe e o ensino
 
Software Libre e accesibilidade ás novas tecnoloxías, posibilitando a ensinan...
Software Libre e accesibilidade ás novas tecnoloxías, posibilitando a ensinan...Software Libre e accesibilidade ás novas tecnoloxías, posibilitando a ensinan...
Software Libre e accesibilidade ás novas tecnoloxías, posibilitando a ensinan...
 
Aula Cesga, un campus virtual basado en Software Libre
Aula Cesga, un campus virtual basado en Software LibreAula Cesga, un campus virtual basado en Software Libre
Aula Cesga, un campus virtual basado en Software Libre
 
Presentacion Rede DSI
Presentacion Rede DSIPresentacion Rede DSI
Presentacion Rede DSI
 
Docencia Redes con Open Source
Docencia Redes con Open SourceDocencia Redes con Open Source
Docencia Redes con Open Source
 
Sistema y soporte informático en un centro educativo basado en software libre
Sistema y soporte informático en un centro educativo basado en software libreSistema y soporte informático en un centro educativo basado en software libre
Sistema y soporte informático en un centro educativo basado en software libre
 
Acercamiento al Software Libre
Acercamiento al Software LibreAcercamiento al Software Libre
Acercamiento al Software Libre
 

Último

Los mejores simuladores de circuitos electrónicos.pdf
Los mejores simuladores de circuitos electrónicos.pdfLos mejores simuladores de circuitos electrónicos.pdf
Los mejores simuladores de circuitos electrónicos.pdfodalistar77
 
La tablet trabajo en grupo del grado 9-2
La tablet trabajo en grupo del grado 9-2La tablet trabajo en grupo del grado 9-2
La tablet trabajo en grupo del grado 9-2montoyagabriela340
 
Carta de Premio y Excel angeline 11-2pdf
Carta de Premio y Excel angeline 11-2pdfCarta de Premio y Excel angeline 11-2pdf
Carta de Premio y Excel angeline 11-2pdfangelinebocanegra1
 
De Código a Ejecución: El Papel Fundamental del MSIL en .NET
De Código a Ejecución: El Papel Fundamental del MSIL en .NETDe Código a Ejecución: El Papel Fundamental del MSIL en .NET
De Código a Ejecución: El Papel Fundamental del MSIL en .NETGermán Küber
 
Actividad 14: Diseño de Algoritmos Paralelos Actividad 14: Diseño de Algoritm...
Actividad 14: Diseño de Algoritmos Paralelos Actividad 14: Diseño de Algoritm...Actividad 14: Diseño de Algoritmos Paralelos Actividad 14: Diseño de Algoritm...
Actividad 14: Diseño de Algoritmos Paralelos Actividad 14: Diseño de Algoritm...RaymondCode
 
Tecnológia 2024.docx.Tecnológia 2024.docx.
Tecnológia 2024.docx.Tecnológia 2024.docx.Tecnológia 2024.docx.Tecnológia 2024.docx.
Tecnológia 2024.docx.Tecnológia 2024.docx.marianarodriguezc797
 
Inteligencia artificial dentro de la contabilidad
Inteligencia artificial dentro de la contabilidadInteligencia artificial dentro de la contabilidad
Inteligencia artificial dentro de la contabilidaddanik1023m
 
Matriz de integración de tecnologías- Paola Carvajal.docx
Matriz de integración de tecnologías- Paola Carvajal.docxMatriz de integración de tecnologías- Paola Carvajal.docx
Matriz de integración de tecnologías- Paola Carvajal.docxPaolaCarolinaCarvaja
 
VIDEOS DE APOYO.docx E
VIDEOS DE APOYO.docx                                  EVIDEOS DE APOYO.docx                                  E
VIDEOS DE APOYO.docx Emialexsolar
 
Inmersión global en ciberseguridad e IA en la conferencia RSA.pdf
Inmersión global en ciberseguridad e IA en la conferencia RSA.pdfInmersión global en ciberseguridad e IA en la conferencia RSA.pdf
Inmersión global en ciberseguridad e IA en la conferencia RSA.pdfOBr.global
 
PRESENTACION DEL TEMA LOS MEJORES SIMULADORES DE CIRCUITOS ELCTRONICOS
PRESENTACION DEL TEMA LOS MEJORES SIMULADORES DE CIRCUITOS ELCTRONICOSPRESENTACION DEL TEMA LOS MEJORES SIMULADORES DE CIRCUITOS ELCTRONICOS
PRESENTACION DEL TEMA LOS MEJORES SIMULADORES DE CIRCUITOS ELCTRONICOSLincangoKevin
 
Presentación - Diseño de Algoritmos Paralelos - Grupo 2.pdf
Presentación - Diseño de Algoritmos Paralelos - Grupo 2.pdfPresentación - Diseño de Algoritmos Paralelos - Grupo 2.pdf
Presentación - Diseño de Algoritmos Paralelos - Grupo 2.pdfymiranda2
 
Análisis de artefactos tecnologicos .pdf
Análisis de artefactos tecnologicos .pdfAnálisis de artefactos tecnologicos .pdf
Análisis de artefactos tecnologicos .pdfcastrodanna185
 
El diseño de Algoritmos Paralelos.pdf - analisis de algortimos
El diseño de Algoritmos Paralelos.pdf - analisis de algortimosEl diseño de Algoritmos Paralelos.pdf - analisis de algortimos
El diseño de Algoritmos Paralelos.pdf - analisis de algortimosLCristinaForchue
 
Actividad 1-PRESENTACIÓN ANIMADA.pptxPreservación y conservación de los docum...
Actividad 1-PRESENTACIÓN ANIMADA.pptxPreservación y conservación de los docum...Actividad 1-PRESENTACIÓN ANIMADA.pptxPreservación y conservación de los docum...
Actividad 1-PRESENTACIÓN ANIMADA.pptxPreservación y conservación de los docum...OLGAMILENAMONTAEZNIO
 
Actividad 14_ Diseño de Algoritmos Paralelos.pdf
Actividad 14_ Diseño de Algoritmos Paralelos.pdfActividad 14_ Diseño de Algoritmos Paralelos.pdf
Actividad 14_ Diseño de Algoritmos Paralelos.pdfalejandrogomezescoto
 
La Electricidad y La Electrónica.pdf....
La Electricidad y La Electrónica.pdf....La Electricidad y La Electrónica.pdf....
La Electricidad y La Electrónica.pdf....Aaron Betancourt
 
TENDENCIAS DE IA Explorando el futuro de la tecnologia.pdf
TENDENCIAS DE IA Explorando el futuro de la tecnologia.pdfTENDENCIAS DE IA Explorando el futuro de la tecnologia.pdf
TENDENCIAS DE IA Explorando el futuro de la tecnologia.pdfJoseAlejandroPerezBa
 

Último (20)

Los mejores simuladores de circuitos electrónicos.pdf
Los mejores simuladores de circuitos electrónicos.pdfLos mejores simuladores de circuitos electrónicos.pdf
Los mejores simuladores de circuitos electrónicos.pdf
 
La tablet trabajo en grupo del grado 9-2
La tablet trabajo en grupo del grado 9-2La tablet trabajo en grupo del grado 9-2
La tablet trabajo en grupo del grado 9-2
 
Carta de Premio y Excel angeline 11-2pdf
Carta de Premio y Excel angeline 11-2pdfCarta de Premio y Excel angeline 11-2pdf
Carta de Premio y Excel angeline 11-2pdf
 
De Código a Ejecución: El Papel Fundamental del MSIL en .NET
De Código a Ejecución: El Papel Fundamental del MSIL en .NETDe Código a Ejecución: El Papel Fundamental del MSIL en .NET
De Código a Ejecución: El Papel Fundamental del MSIL en .NET
 
Actividad 14: Diseño de Algoritmos Paralelos Actividad 14: Diseño de Algoritm...
Actividad 14: Diseño de Algoritmos Paralelos Actividad 14: Diseño de Algoritm...Actividad 14: Diseño de Algoritmos Paralelos Actividad 14: Diseño de Algoritm...
Actividad 14: Diseño de Algoritmos Paralelos Actividad 14: Diseño de Algoritm...
 
Tecnológia 2024.docx.Tecnológia 2024.docx.
Tecnológia 2024.docx.Tecnológia 2024.docx.Tecnológia 2024.docx.Tecnológia 2024.docx.
Tecnológia 2024.docx.Tecnológia 2024.docx.
 
BEDEC Proyecto y obra , novedades 2024 - Xavier Folch
BEDEC Proyecto y obra , novedades 2024 - Xavier FolchBEDEC Proyecto y obra , novedades 2024 - Xavier Folch
BEDEC Proyecto y obra , novedades 2024 - Xavier Folch
 
Inteligencia artificial dentro de la contabilidad
Inteligencia artificial dentro de la contabilidadInteligencia artificial dentro de la contabilidad
Inteligencia artificial dentro de la contabilidad
 
BEDEC Sostenibilidad, novedades 2024 - Laura Silva
BEDEC Sostenibilidad, novedades 2024 - Laura SilvaBEDEC Sostenibilidad, novedades 2024 - Laura Silva
BEDEC Sostenibilidad, novedades 2024 - Laura Silva
 
Matriz de integración de tecnologías- Paola Carvajal.docx
Matriz de integración de tecnologías- Paola Carvajal.docxMatriz de integración de tecnologías- Paola Carvajal.docx
Matriz de integración de tecnologías- Paola Carvajal.docx
 
VIDEOS DE APOYO.docx E
VIDEOS DE APOYO.docx                                  EVIDEOS DE APOYO.docx                                  E
VIDEOS DE APOYO.docx E
 
Inmersión global en ciberseguridad e IA en la conferencia RSA.pdf
Inmersión global en ciberseguridad e IA en la conferencia RSA.pdfInmersión global en ciberseguridad e IA en la conferencia RSA.pdf
Inmersión global en ciberseguridad e IA en la conferencia RSA.pdf
 
PRESENTACION DEL TEMA LOS MEJORES SIMULADORES DE CIRCUITOS ELCTRONICOS
PRESENTACION DEL TEMA LOS MEJORES SIMULADORES DE CIRCUITOS ELCTRONICOSPRESENTACION DEL TEMA LOS MEJORES SIMULADORES DE CIRCUITOS ELCTRONICOS
PRESENTACION DEL TEMA LOS MEJORES SIMULADORES DE CIRCUITOS ELCTRONICOS
 
Presentación - Diseño de Algoritmos Paralelos - Grupo 2.pdf
Presentación - Diseño de Algoritmos Paralelos - Grupo 2.pdfPresentación - Diseño de Algoritmos Paralelos - Grupo 2.pdf
Presentación - Diseño de Algoritmos Paralelos - Grupo 2.pdf
 
Análisis de artefactos tecnologicos .pdf
Análisis de artefactos tecnologicos .pdfAnálisis de artefactos tecnologicos .pdf
Análisis de artefactos tecnologicos .pdf
 
El diseño de Algoritmos Paralelos.pdf - analisis de algortimos
El diseño de Algoritmos Paralelos.pdf - analisis de algortimosEl diseño de Algoritmos Paralelos.pdf - analisis de algortimos
El diseño de Algoritmos Paralelos.pdf - analisis de algortimos
 
Actividad 1-PRESENTACIÓN ANIMADA.pptxPreservación y conservación de los docum...
Actividad 1-PRESENTACIÓN ANIMADA.pptxPreservación y conservación de los docum...Actividad 1-PRESENTACIÓN ANIMADA.pptxPreservación y conservación de los docum...
Actividad 1-PRESENTACIÓN ANIMADA.pptxPreservación y conservación de los docum...
 
Actividad 14_ Diseño de Algoritmos Paralelos.pdf
Actividad 14_ Diseño de Algoritmos Paralelos.pdfActividad 14_ Diseño de Algoritmos Paralelos.pdf
Actividad 14_ Diseño de Algoritmos Paralelos.pdf
 
La Electricidad y La Electrónica.pdf....
La Electricidad y La Electrónica.pdf....La Electricidad y La Electrónica.pdf....
La Electricidad y La Electrónica.pdf....
 
TENDENCIAS DE IA Explorando el futuro de la tecnologia.pdf
TENDENCIAS DE IA Explorando el futuro de la tecnologia.pdfTENDENCIAS DE IA Explorando el futuro de la tecnologia.pdf
TENDENCIAS DE IA Explorando el futuro de la tecnologia.pdf
 

Programación web con JSP

  • 1. Desarrollo de aplicaciones Java para la Web José Ramón Méndez Reboredo Departamento de Informática – Universidad de Vigo
  • 2. Servlets: Introducción Fueron introducidos por Sun en 1996 como pequeñas aplicaciones ● Java para añadir funcionalidad dinámica a los servidores web. Todos los servlets asociados con un servidor se ejecutan dentro de ● un proceso simple. Cada vez que llega una petición, la JVM (Java Virtual Machine) crea un hilo Java para manejar la petición, reduciendo así la sobrecarga del sistema Una desventaja de esta aproximación es que el contenido (estático y ● dinámico) de la página HTML generada, reside en el código fuente del servlet. Como consecuencia cualquier cambio estático en la página (cambio de una URL de un enlace o una imagen), requiere la intervención del programador y la recompilación del servlet. Se escriben utilizando la API Servlet (que se distribuye como una ● extensión estándar del JDK 1.2 y posteriores, sin formar parte del núcleo de la plataforma Java). El lunes 3 de noviembre de 2006 Java pasó a ser software libre y se ● distribuye bajo licencia GNU GPL v.2
  • 3. Contenedor de componentes de vista El primer paso es descargar el software que implementa las ● especificaciones Java Servlet 2.4 y Java Server Pages 2.0. Se puede obtener una versión gratuita, conocida como Tomcat @ Jakarta en http://jakarta.apache.org/tomcat/. En la dirección http://java.sun.com/products/servlet/industry.html se ● muestra un listado completo de servidores Web que soportan el API Servlet. Para trabajar con servlets es necesario importar el paquete ● javax.servlet. El método service() implementa el manejo real de la solicitud y ● respuesta del servlet. El servidor web invoca a este método cuando se solicita la URL del servlet. El servidor pasa los argumentos ServletRequest y ServletResponse al servlet.
  • 4. Servlet para generar una fecha import javax.servlet.*; import java.util.*; import java.io.*; public class TimeServlet extends GenericServlet { public String getServletInfo() { return quot;Time Servletquot;; } public void service(ServletRequest peticion, ServletResponse respuesta) throws ServletException, IOException { String fecha = new Date().toString(); PrintStream outputStream = new PrintStream(respuesta.getOutputStream()); outputStream.println(fecha); } };
  • 5. Servlet para generar una fecha import javax.servlet.*; import java.util.*; import java.io.*; public class TimeServlet extends GenericServlet { public String getServletInfo() { return quot;Time Servletquot;; } public void service(ServletRequest peticion, ServletResponse respuesta) throws ServletException, IOException { String fecha = new Date().toString(); PrintStream outputStream = new PrintStream(respuesta.getOutputStream()); outputStream.println(fecha); } };
  • 6. EchoRequest Servlet <FORM action=quot;servlet/EchoRequest.classquot; method=quot;POSTquot;> <P>NOMBRE: <BR> <INPUT type=quot;textquot; name=quot;Nombrequot;> <P>E-MAIL: <BR> <INPUT type=quot;passwordquot; name=quot;Emailquot;> <P>TIPO DE INSCRIPCIÓN: <BR> <INPUT type=quot;radioquot; name=quot;Inscripcionquot; value=quot;Normalquot;> Normal <BR> <INPUT type=quot;radioquot; name=quot;Inscripcionquot; value=quot;Estudiantequot;> Estudiante <BR> <INPUT type=quot;radioquot; name=quot;Inscripcionquot; value=quot;Socio de ATIquot;> Socio de ATI <P>TIPO DE COMUNICACIÓN: <BR> <INPUT type=quot;checkbox quot; name=quot;TIPO_1quot; value=quot;paperquot;> Artículo <BR> <INPUT type=quot;checkbox quot; name=quot;TIPO_2quot; value=quot;posterquot;> Poster <BR> <INPUT type=quot;checkbox quot; name=quot;TIPO_3quot; value=quot;demoquot;> Demo Comercial <P>ORGANIZACIÓN: <BR> <INPUT type=quot;textquot; name=quot;Organizacionquot;> <P>PAÍS: <BR> <SELECT size=quot;5quot; name=quot;Paisquot;> <OPTION>ESPAÑA</OPTION> <OPTION>PORTUGAL</OPTION> <OPTION>FRANCIA</OPTION> <OPTION>ALEMANIA</OPTION> <OPTION>ITALIA</OPTION> <OPTION>REINO UNIDO</OPTION> <OPTION>EEUU</OPTION> <OPTION>AFRICA</OPTION> </SELECT> <P><INPUT type=quot;submitquot; value=quot;Realizar Inscripciónquot;> <INPUT type=quot;resetquot; value=quot;Borrarquot;> </FORM>
  • 7. EchoRequest Servlet import javax.servlet.*; import java.util.*; import java.io.*; public class EchoRequest extends GenericServlet { public String getServletInfo(){ return quot;Echo Request Servletquot;; } public void service(ServletRequest peticion, ServletResponse respuesta) throws ServletException, IOException { respuesta.setContentType(quot;text/plainquot;); PrintStream outputStream = new PrintStream(respuesta.getOutputStream()); outputStream.print(quot;Servidor: quot; + peticion.getServerName() + quot;:quot;+ peticion.getServerPort()); outputStream.print(quot;Cliente: quot; + peticion.getRemoteHost() + quot; quot; + peticion.getRemoteAddr()); outputStream.println(quot;Protocolo: quot; + peticion.getProtocol()); Enumeration params = peticion.getParameterNames(); if (params != null) { while (params.hasMoreElements()) { String parametro = (String) params.nextElement(); String valor = peticion.getParameter(parametro); outputStream.println(parametro + quot; = quot; + valor); } } } };
  • 8. EchoRequest Servlet import javax.servlet.*; import java.util.*; import java.io.*; public class EchoRequest extends GenericServlet { public String getServletInfo(){ return quot;Echo Request Servletquot;; } public void service(ServletRequest peticion, ServletResponse respuesta) throws ServletException, IOException { respuesta.setContentType(quot;text/plainquot;); PrintStream outputStream = new PrintStream(respuesta.getOutputStream()); outputStream.print(quot;Servidor: quot; + peticion.getServerName() + quot;:quot;+ peticion.getServerPort()); outputStream.print(quot;Cliente: quot; + peticion.getRemoteHost() + quot; quot; + peticion.getRemoteAddr()); outputStream.println(quot;Protocolo: quot; + peticion.getProtocol()); Enumeration params = peticion.getParameterNames(); if (params != null) { while (params.hasMoreElements()) { String parametro = (String) params.nextElement(); String valor = peticion.getParameter(parametro); outputStream.println(parametro + quot; = quot; + valor); } } } };
  • 9. Cabeceras de solicitud Cuando un cliente HTTP (por ejemplo, un navegador) envía una ● petición, es necesario que suministre una línea de petición (normalmente GET o POST). Es posible también enviar un número de cabeceras que acompañan a la petición y que son opcionales excepto Content-Length, que es requerida sólo para peticiones POST. La Tabla 1 muestra las cabeceras más comunes que pueden estar presentes en una petición HTTP. Cabecera HTTP Significado Accept Tipos MIME que prefiere el navegador. Accept-Charset Conjunto de caracteres que espera el navegador. Accept-Encoding Tipos de codificación de datos (como gzip) para que el navegador sepa cómo decodificarlos. Los servlets pueden comprobar explícitamente el soporte para gzip y devolver páginas HTML comprimidas con gzip para navegadores que las soportan, seleccionando la cabecera de respuesta Content-Encoding para indicar que están comprimidas con gzip. En muchos casos, esto puede reducir el tiempo de descarga por un factor de cinco o diez. Accept-Language Idioma que está esperando el navegador, en el caso de que el servidor tenga versiones en más de un idioma. Authorization Información de autorización, usualmente en respuesta a una cabecera www-Authenticate enviada desde el servidor. Connection ¿Se usan conexiones persistentes?. Si un servlet recupera un valor Keep-Alive de esta cabecera, u obtiene una línea de petición con HTTP 1.1 (donde las conexiones son persistentes por defecto), es posible ahorrar un tiempo considerable en el envío de páginas web que incluyen muchas piezas pequeñas (imágenes o applets). Para hacer esto, es necesario enviar una cabecera Content-Length en la respuesta, escribiendo en un ByteArrayOutputStream, y preguntando por el tamaño antes de escribir la salida. Content-Length En mensajes POST especifica el número de datos que se han añadido. Cookie Manejo de Cookies. (se explica porteriormente). From Especifica la dirección de correo electrónico del usuario que realiza la petición. Sólo es usado por aceleradores web, no por clientes personalizados ni por navegadores. Host Host y puerto escuchado en la URL original If-Modified-Since Sólo devuelve documentos más nuevos que el especificado, de otra forma se envía una respuesta 304 “Not Modified” response. Pragma El valor no-cache indica que el servidor debería devolver un documento nuevo, incluso si es un proxy con una copia local. Referer URL de la página que contiene el enlace que el usuario siguió para obtener la página actual. User-Agent Especifica el tipo de navegador. Útil cuando el servlet está devolviendo contenido específico para un navegador. UA-Pixels, UA-Color, UA- Cabeceras no estándar enviadas por algunas versiones de Internet Explorer, indicando el tamaño de la pantalla, la OS, UA-CPU profundidad del color, el sistema operativo, y el tipo de CPU usada por el sistema del navegador.
  • 10. Ejemplo import java.io.*; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; public class RequestHeader extends HttpServlet { public void doGet(HttpServletRequest peticion, HttpServletResponse respuesta) throws IOException, ServletException { respuesta.setContentType(quot;text/htmlquot;); PrintWriter out = respuesta.getWriter(); out.println(quot;<HTML><HEAD><TITLE>Página genereda por el servlet RequestHeader” + “</TITLE><HEAD>quot;); out.println(quot;<BODY BGCOLOR=quot;WHITEquot; TEXT=quot;BLACKquot;>quot;); out.println(quot;<H1>MOSTRANDO LAS CABECERAS ENVIADAS POR EL CLIENTE</H1>quot;); out.println(quot;<P>Request Method: quot; + peticion.getMethod() + quot;<BR>quot;); out.println(quot;Request URI: quot; + peticion.getRequestURI() + quot;<BR>quot;); out.println(quot;Request Protocol: quot; + peticion.getProtocol() + quot;<BR>quot;); out.println(quot;<P><table border=quot;1quot;>quot;); Enumeration e = peticion.getHeaderNames(); while (e.hasMoreElements()) { String nombre = (String)e.nextElement(); String valor = peticion.getHeader(nombre); out.println(quot;<tr><td>quot; + nombre + quot;</td><td>quot; + valor + quot;</td></tr>quot;); } out.println(quot;</table></BODY></HTML>quot;); } }
  • 11. Ejemplo import java.io.*; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; public class RequestHeader extends HttpServlet { public void doGet(HttpServletRequest peticion, HttpServletResponse respuesta) throws IOException, ServletException { respuesta.setContentType(quot;text/htmlquot;); PrintWriter out = respuesta.getWriter(); out.println(quot;<HTML><HEAD><TITLE>Página genereda por el servlet RequestHeader” + “</TITLE><HEAD>quot;); out.println(quot;<BODY BGCOLOR=quot;WHITEquot; TEXT=quot;BLACKquot;>quot;); out.println(quot;<H1>MOSTRANDO LAS CABECERAS ENVIADAS POR EL CLIENTE</H1>quot;); out.println(quot;<P>Request Method: quot; + peticion.getMethod() + quot;<BR>quot;); out.println(quot;Request URI: quot; + peticion.getRequestURI() + quot;<BR>quot;); out.println(quot;Request Protocol: quot; + peticion.getProtocol() + quot;<BR>quot;); out.println(quot;<P><table border=quot;1quot;>quot;); Enumeration e = peticion.getHeaderNames(); while (e.hasMoreElements()) { String nombre = (String)e.nextElement(); String valor = peticion.getHeader(nombre); out.println(quot;<tr><td>quot; + nombre + quot;</td><td>quot; + valor + quot;</td></tr>quot;); } out.println(quot;</table></BODY></HTML>quot;); } }
  • 12. Manejo de sesiones / Session Tracking Una sesión es una conexión continuada de un mismo navegador a un ● servidor web durante un intervalo prefijado de tiempo. Este tiempo depende habitualmente del servidor, aunque a partir de la versión 2.1 de la API Servlet puede establecerse mediante el método setMaxInactiveInterval(int) de la interfaz HttpSession. Esta interfaz es la que proporciona los métodos necesarios para mantener sesiones. La forma de obtener una sesión es mediante el método ● getSession(boolean) de un objeto HttpServletRequest. Si el parámetro es true se crea una sesión nueva si es necesario, mientras que si es false, el método devolverá la sesión actual. Una vez que se tiene un objeto HttpSession, es posible mantener una ● colección de pares nombre/valor, de forma que pueda almacenarse todo tipo de información sobre la sesión. Este valor puede ser cualquier objeto de la clase Object que se desee. La forma de añadir valores a la sesión es mediante el método putValue(String, Object) de la interfaz HttpSession, y la de obtenerlos mediante el método getValue(String) del mismo objeto.
  • 13. Manejo de Sesiones (Sessión Tracking) import java.io.*; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; public class SetSession extends HttpServlet { public void service(HttpServletRequest peticion, HttpServletResponse respuesta) throws IOException, ServletException { respuesta.setContentType(quot;text/htmlquot;); PrintWriter out = respuesta.getWriter(); out.println(quot;<H3>Ejemplo de Sesiones</H3>quot;); HttpSession session = peticion.getSession(true); // Se crea la sesion si es necesario Date created = new Date(session.getCreationTime()); // Visualizar informacion de la sesion Date accessed = new Date(session.getLastAccessedTime()); out.println(quot;<hr>quot;); out.println(quot;<b>ID:</b> quot; + session.getId() + quot;<br>quot;); out.println(quot;<b>Fecha de creación:</b> quot; + created + quot;<br>quot;); out.println(quot;<b>Fecha de último acceso:</b> quot; + accessed + quot;<br>quot;); out.println(quot;<hr><p>quot;); String nombreDato = peticion.getParameter(quot;NombreDatoquot;); // Se guarda la información if (nombreDato != null && nombreDato.length() > 0) { String valorDato = peticion.getParameter(quot;ValorDatoquot;); session.setAttribute(nombreDato, valorDato); } out.println(quot;<b><i>Los siguientes datos están en tu sesión:</b></i><br>quot;); // Visualizar objetos contenidos en la sesion actual Enumeration e = session.getAttributeNames(); while (e.hasMoreElements()) { String nombre = (String)e.nextElement(); String valor = session.getAttribute(nombre).toString(); out.println(nombre + quot; = quot; + valor + quot;<BR>quot;); } } }
  • 14. Manejo de Sesiones (Sessión Tracking) import java.io.*; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; public class SetSession extends HttpServlet { public void service(HttpServletRequest peticion, HttpServletResponse respuesta) throws IOException, ServletException { respuesta.setContentType(quot;text/htmlquot;); PrintWriter out = respuesta.getWriter(); out.println(quot;<H3>Ejemplo de Sesiones</H3>quot;); HttpSession session = peticion.getSession(true); // Se crea la sesion si es necesario Date created = new Date(session.getCreationTime()); // Visualizar informacion de la sesion Date accessed = new Date(session.getLastAccessedTime()); out.println(quot;<hr>quot;); out.println(quot;<b>ID:</b> quot; + session.getId() + quot;<br>quot;); out.println(quot;<b>Fecha de creación:</b> quot; + created + quot;<br>quot;); out.println(quot;<b>Fecha de último acceso:</b> quot; + accessed + quot;<br>quot;); out.println(quot;<hr><p>quot;); String nombreDato = peticion.getParameter(quot;NombreDatoquot;); // Se guarda la información if (nombreDato != null && nombreDato.length() > 0) { String valorDato = peticion.getParameter(quot;ValorDatoquot;); session.setAttribute(nombreDato, valorDato); } out.println(quot;<b><i>Los siguientes datos están en tu sesión:</b></i><br>quot;); // Visualizar objetos contenidos en la sesion actual Enumeration e = session.getAttributeNames(); while (e.hasMoreElements()) { String nombre = (String)e.nextElement(); String valor = session.getAttribute(nombre).toString(); out.println(nombre + quot; = quot; + valor + quot;<BR>quot;); } } }
  • 15. Y si no hay cookies entonces reescritura de URLs A pesar de que la mayoría de los navegadores más extendidos ● soportan las cookies en la actualidad, para poder emplear sesiones con clientes que, o bien no soportan cookies o bien las rechazan, debe utilizarse la reescritura de URL’s. Para emplear está técnica lo que se hace es incluir el código ● identificativo de la sesión (sessionId) en la URL de la petición. Los métodos que se encargan de reescribir la URL si fuera necesario son encodeURL() y encodeRedirectURL(). El primero de ellos lee un String que representa una URL y si fuera necesario la reescribe añadiendo el identificativo de la sesión, dejándolo inalterado en caso contrario. El segundo realiza lo mismo sólo que con URL’s de redirección, es decir, permite reenviar la petición del cliente a otra URL.
  • 16. Reescritura de URLs // ... continuación del código anterior // Visualizar objetos contenidos en la sesion actual Enumeration e = session.getAttributeNames(); int contValores = 1; while (e.hasMoreElements()) { ++contValores; String nombre = (String)e.nextElement(); String valor = session.getAttribute(nombre).toString(); out.println(nombre + quot; = quot; + valor + quot;<BR>quot;); } out.print(quot;<p><a href=quot;quot;); out.print(respuesta.encodeURL( quot;SetSession?NombreDato=nombrequot; + contValores + quot;&ValorDato=valorquot; + contValores)); out.println(quot;quot; >URL encoded </a>quot;); }
  • 17. Subir ficheros al servidor <HTML> <HEAD> <TITLE></TITLE> </HEAD> <BODY> <CENTER> <FORM method=quot;POSTquot; enctype='multipart/form-data' action=quot;UploadFicheroquot;> Por favor, seleccione el trayecto del fichero a cargar <BR><INPUT type=quot;filequot; name=quot;ficheroquot;> <INPUT type=quot;submitquot;> </FORM> </CENTER> </BODY> </HTML>
  • 18. Subir ficheros al servidor <HTML> <HEAD> <TITLE></TITLE> </HEAD> <BODY> <CENTER> <FORM method=quot;POSTquot; enctype='multipart/form-data' action=quot;UploadFicheroquot;> Por favor, seleccione el trayecto del fichero a cargar <BR><INPUT type=quot;filequot; name=quot;ficheroquot;> <INPUT type=quot;submitquot;> </FORM> </CENTER> </BODY> </HTML>
  • 19. A continuación, se debe que crear un servlet que sea capaz de ● procesar la respuesta. Para facilitar la labor se pueden emplear las clases que proporciona un subproducto de Apache llamado fileupload (http://jakarta.apache.org/commons/fileupload/). Se descarga el fichero jar correspondiente y se incluye en el classpath. Para el funcionamiento correcto de esta clase será necesario incluir,también incluir en el classpath la implementación de Yakarta commons IO que se puede descargar de http://jakarta.apache.org/commons/io/ ●
  • 20. import java.io.*; import java.net.*; import javax.servlet.*; import javax.servlet.http.*; import org.apache.commons.fileupload.*; import java.util.*; /** * Subir ficheros al servidor * @author José Ramón Méndez Reboredo * @version 1.0 */ public class UploadFichero extends HttpServlet { /** Handles the HTTP <code>POST</code> method. * @param request servlet request * @param response servlet response */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType(quot;text/htmlquot;); PrintWriter out = response.getWriter(); out.println(quot;<html><head><title>Servlet</title></head><body>quot;); procesaFicheros(request,out); out.println(quot;</body> </html>quot;); out.close(); } ....
  • 21. public boolean procesaFicheros(HttpServletRequest req, PrintWriter out ) { try { DiskFileUpload fu = new DiskFileUpload(); // objeto que es capaz de parsear la perición fu.setSizeMax(1024*1024*8); // máximo numero de bytes 8 MB fu.setSizeThreshold(4096); // tamaño por encima del cual los ficheros son escritos en disco fu.setRepositoryPath(quot;/tmpquot;); // directorio en el que se escribirán los ficheros con tamaño // superior al soportado en memoria List fileItems = fu.parseRequest(req); // ordenamos procesar los ficheros if(fileItems == null) { return false; } out.print(quot;<br>El número de ficheros subidos es: quot; + fileItems.size()); Iterator i = fileItems.iterator();// Iteramos por cada fichero FileItem actual = null; while (i.hasNext()) { actual = (FileItem)i.next(); String fileName = actual.getName(); out.println(quot;<br>Nos han subido el ficheroquot; + fileName); File fichero = new File(fileName); //construimos un objeto file para la ruta completa fichero = new File(quot;c:ficherossubidosquot; + fichero.getName()); //obtener el nombre actual.write(fichero); // escribimos el fichero colgando del nuevo path } } catch(Exception e) { return false; } return true; } }
  • 22. Generar imágenes desde servlets Para codificar la imagen (Objeto Image), se puede usar la clase ● GifEncoder que se puede descargar gratuitamente de http://www.acme.com/java/software/Acme.JPM.Encoders.GifEncoder. html. GifEncoder permite codificar imágenes en formato GIF. ● De la misma forma, se podría emplear las clases JPEGCodec, ● JPEGEncodeParam y JPEGImageEncoder del paquete com.sun.image.codec.jpeg que se distribuye con el propio JavaSE. Es importante recordar que si se escoge esta opción el tipo de ● respuesta del servlet será “image/jpeg” y que no es necesario descargar ningún software adicional.
  • 23. Generar imágenes desde Servlets protected void processRequest(HttpServletRequest req, HttpServletResponse res) throws ServletException, java.io.IOException { ServletOutputStream bufferSalida = res.getOutputStream(); Graphics contextoGrafico=null; try { // Construir un contexto de gráficos mediante una buffered image int w = 200; int h = 50; BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_3BYTE_BGR); contextoGrafico=image.getGraphics(); contextoGrafico.setFont(new Font(quot;Arialquot;, Font.BOLD | Font.ITALIC, 20)); contextoGrafico.draw3DRect(0,0,w-1,h-1,true); Date ahora = new Date(); SimpleDateFormat formateador = new SimpleDateFormat(quot;dd-MM-yyyy HH:mmquot;); contextoGrafico.drawString(formateador.format(ahora), 20, 30); // Encode the off screen graphics into a JPEG and send it to the client res.setContentType(quot;image/jpegquot;); JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(bufferSalida); JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(image); param.setQuality(1.0f, false); encoder.setJPEGEncodeParam(param); encoder.encode(image); bufferSalida.flush(); bufferSalida.close(); } finally { if (contextoGrafico != null) contextoGrafico.dispose(); } }
  • 24. Generar imágenes desde Servlets protected void processRequest(HttpServletRequest req, HttpServletResponse res) throws ServletException, java.io.IOException { ServletOutputStream bufferSalida = res.getOutputStream(); Graphics contextoGrafico=null; try { // Construir un contexto de gráficos mediante una buffered image int w = 200; int h = 50; BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_3BYTE_BGR); contextoGrafico=image.getGraphics(); contextoGrafico.setFont(new Font(quot;Arialquot;, Font.BOLD | Font.ITALIC, 20)); contextoGrafico.draw3DRect(0,0,w-1,h-1,true); Date ahora = new Date(); SimpleDateFormat formateador = new SimpleDateFormat(quot;dd-MM-yyyy HH:mmquot;); contextoGrafico.drawString(formateador.format(ahora), 20, 30); // Encode the off screen graphics into a JPEG and send it to the client res.setContentType(quot;image/jpegquot;); JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(bufferSalida); JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(image); param.setQuality(1.0f, false); encoder.setJPEGEncodeParam(param); encoder.encode(image); bufferSalida.flush(); bufferSalida.close(); } finally { if (contextoGrafico != null) contextoGrafico.dispose(); } }
  • 25. Generar imágenes desde Servlets protected void processRequest(HttpServletRequest req, HttpServletResponse res) throws ServletException, java.io.IOException { ServletOutputStream bufferSalida = res.getOutputStream(); Graphics contextoGrafico=null; try { // Construir un contexto de gráficos mediante una buffered image int w = 200; int h = 50; BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_3BYTE_BGR); contextoGrafico=image.getGraphics(); contextoGrafico.setFont(new Font(quot;Arialquot;, Font.BOLD | Font.ITALIC, 20)); contextoGrafico.draw3DRect(0,0,w-1,h-1,true); Date ahora = new Date(); SimpleDateFormat formateador = new SimpleDateFormat(quot;dd-MM-yyyy HH:mmquot;); contextoGrafico.drawString(formateador.format(ahora), 20, 30); // Encode the off screen graphics into a JPEG and send it to the client res.setContentType(quot;image/jpegquot;); JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(bufferSalida); JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(image); param.setQuality(1.0f, false); encoder.setJPEGEncodeParam(param); encoder.encode(image); bufferSalida.flush(); bufferSalida.close(); } finally { if (contextoGrafico != null) contextoGrafico.dispose(); } }
  • 26. JSP JSP es una tecnología basada en Java que simplifica el proceso de ● desarrollo de sitios web dinámicos. Las Java Server Pages son ficheros de texto (normalmente con extensión .jsp) que sustituyen a las páginas HTML tradicionales. Los ficheros JSP contienen etiquetas HTML y código embebido que permite al diseñador de la página web acceder a datos desde código Java que se ejecuta en el servidor. Es una tecnología híbrida basada en template systems. Al igual que ● ASP, SSJS y PHP puede incorporar scripts para añadir código Java directamente a las páginas .jsp, pero también implementa, al estilo de ColdFusion, un conjunto de etiquetas que interaccionan con los objetos Java del servidor, sin la necesidad de aparezca código fuente en la página. JSP se implementa utilizando la tecnología Servlet. Cuando un ● servidor web recibe una petición de una página .jsp, la redirecciona a un proceso especial dedicado a manejar la ejecución de servlets (servlet container).
  • 27. Directivas JSP Establecer atributos de la página: <HTML> <HEAD> <TITLE>La primera página con JSP</TITLE> </HEAD> <BODY BGCOLOR=quot;#FFFFFFquot;> <%@ page info=”Probando JSP.” %> <%@ page language=”java” %> <%@ page contentType=”text/plain; charset=ISO-8859-1” %> <%@ page import=”java.util.*, java.awt.*” %> <%@ page session=”false” %> <%@ page buffer=”12kb” %> <%@ page autoFlush=”true” %> <%@ page isThreadSafe=”false” %> <%@ page errorPage=”/webdev/misc/error.jsp” %> <%@ page isErrorPage=”false” %> Hola mundo! </BODY> </HTML>
  • 28. Directivas JSP <%@ include file=”localURL” %> ● Permite incluir el contenido de otra página .html o .jsp. El fichero es ● identificado mediante una URL y la directiva tiene el efecto de remplazarse a sí misma con el contenido del archivo especificado. Puede ser utilizada para incluir cabeceras y pies de páginas comunes a un desarrollo dado. <%@ taglib uri=”tagLibraryURI” prefix=”tagPrefix” %> ● Esta directiva se utiliza para notificar al contenedor JSP que la página ● utilizará una o más librerías de etiquetas personalizadas. Una librería de etiquetas es una colección de etiquetas personalizadas, que pueden ser utilizadas para extender la funcionalidad básica de JSP. El valor del atributo uri indica la localizacion del TLD (Tag Library ● Descriptor), mientras que el atributo prefix especifica el identificador del espacio de nombres en XML que será anexado a todas la etiquetas de esa librería que se utilicen en la página .jsp. Por razones de seguridad, la especificación JSP permite utilizar ● solamente TLD’s del sistema de archivos local.
  • 29. Declaraciones globales Las declaraciones se usan para definir variables y métodos ● específicos para una página .jsp. Las variables y los métodos declarados son accesibles por cualquier otro elemento de script de la página, aunque estén codificados antes que la propia declaración. La sintaxis es: <%! declaracion (es) %> ● <%! public long factorial (long numero) { if (numero == 0) return 1; else return numero * factorial(numero – 1); } %> <%! private int x = 0, y = 0; private String unidad=”cm”; %>
  • 30. Declaraciones globales Un uso importante de la declaración de métodos es el manejo de ● eventos relacionados con la inicialización y destrucción de la página .jsp. La inicialización ocurre la primera vez que el contenedor JSP recibe una petición de una página .jsp concreta. La destrucción ocurre cuando el contenedor JSP descarga la clase de memoria o cuando el contenedor JSP se reinicia. Estos eventos se pueden controlar sobreescribiendo dos métodos ● que son llamados automáticamente: jspInit() y jspDestroy(). Su codificación es opcional. <%! public void jspInit () { // El código de inicialización iría aquí. } public void jspDestroy() { // El código de finalización iría aquí. } %>
  • 31. Expresiones y Scriptlets <%= expresión %> ● Las expresiones están ligadas a la generación de contenidos. Se ● pueden utilizar para imprimir valores de variables o resultados de la ejecución de algún método. Todo resultado de una expresión es convertido a un String antes de ser añadido a la salida de la página. Las expresiones no terminan con un punto y coma (;). <% scriptlet %> ● Los scriptlets pueden contener cualquier tipo de sentencias Java, ● pudiendo dejar abiertos uno o más bloques de sentencias que deberán ser cerradas en etiquetas de scritplets posteriores.
  • 32. Ejemplo: factorial <!-- factorialestry.jsp --> <HTML><HEAD> <TITLE>La segunda página con JSP</TITLE> </HEAD> <BODY BGCOLOR=quot;#FFFFFFquot;> <%! public long factorial (long numero) throws IllegalArgumentException { if ((numero < 0) || (numero > 20)) throw new IllegalArgumentException(quot;Fuera de Rangoquot;); if (numero == 0) return 1; else return numero * factorial(numero - 1); } %> <% try { long resultado = factorial (x); %> <p align=center> <%= x %>! = <%= resultado %></p> <% } catch (IllegalArgumentException e) { %> <p>El argumento para calcular el factorial esta fuera de rango.</p> <% } %> </BODY> </HTML>
  • 33. Comentarios <!-- comentario HTML --> ● <%-- comentario JSP --%> ● <% /* comentario de scriptlet */ %> ● <% // comentario de scriptlet %> ●
  • 34. Acciones <jsp:forward page=”localURL” /> ● Se usa para transferir el control de una página .jsp a otra localización. ● Cualquier código generado hasta el momento se descarta, y el procesado de la petición se inicia en la nueva página. El navegador cliente sigue mostrando la URL de la página .jsp inicial. <jsp:include page=”localURL” flush=”true” /> ● Proporciona una forma sencilla de incluir contenido generado por otro ● documento local en la salida de la página actual. En contraposición con la etiqueta forward, include transfiere el control temporalmente.
  • 35. Objetos implícitos Objetos implícitos ● Objeto Clase o Interfaz Descripción page javax.servlet.jsp.HttpJspPage Instancia del servlet de la página .jsp. config javax.servlet.ServletConfig Datos de configuración del servlet. request javax.servlet.http.HttpServletRequest Petición. Parámetros incluidos. response javax.servlet.http.HttpServletResponse Respuesta. out javax.servlet.jsp.JspWriter Stream de salida para el contenido de la página. session javax.servlet.http.HttpSession Datos específicos de la sesión de usuario. application javax.servlet.ServletContext Datos compartidos por todas las páginas. pageContext javax.servlet.jsp.PageContext Contexto para la ejecución de las páginas. exception java.lang.Throwable Excepción o error no capturado.
  • 36. Factoriales <!-- factoriales.jsp --> <HTML> <HEAD> <TITLE>Cálculo de factoriales con JSP</TITLE> </HEAD> <BODY BGCOLOR=quot;#FFFFFFquot;> <%! public long factorial (long numero) { if (numero == 0) return 1; else return numero * factorial(numero - 1); } %> <H1>TABLA DE FACTORIALES</H1> <table border=quot;1quot;> <tr><th><i>x</i></th><th><i>x</i>!</th></tr> <% for (long x = 0; x <=20; ++x) { %> <tr><td><%= x %></td><td><%= factorial (x) %></td></tr> <% } %> </table> </BODY> </HTML>
  • 37. Factoriales <!-- factoriales.jsp --> <HTML> <HEAD> <TITLE>Cálculo de factoriales con JSP</TITLE> </HEAD> <BODY BGCOLOR=quot;#FFFFFFquot;> <%! public long factorial (long numero) { if (numero == 0) return 1; else return numero * factorial(numero - 1); } %> <H1>TABLA DE FACTORIALES</H1> <table border=quot;1quot;> <tr><th><i>x</i></th><th><i>x</i>!</th></tr> <% for (long x = 0; x <=20; ++x) { %> <tr><td><%= x %></td><td><%= factorial (x) %></td></tr> <% } %> </table> </BODY> </HTML>
  • 38. Excepciones <!-- factorialestry.jsp --> <HTML><HEAD> <TITLE>Cálculo de factoriales con JSP y manejo de excepciones</TITLE> </HEAD> <BODY BGCOLOR=quot;#FFFFFFquot;> <%! int x = 21; %> <%! public long factorial (long numero) throws IllegalArgumentException { if ((numero < 0) || (numero > 20)) throw new IllegalArgumentException(quot;Fuera de Rangoquot;); if (numero == 0) return 1; else return numero * factorial(numero - 1); } %> <% try { long resultado = factorial (x); %> <p align=center> <%= x %>! = <%= resultado %></p> <% } catch (IllegalArgumentException e) { %> <p>El argumento para calcular el factorial esta fuera de rango.</p> <% } %> </BODY>
  • 39. Tendencias actuales Modelo Vista Controlador (MVC) es un patrón de arquitectura de ● software que separa los datos de una aplicación, la interfaz de usuario, y la lógica de control en tres componentes distintos. El patrón MVC se emplea frecuentemente en aplicaciones web, donde la vista es la página HTML ó XHTML. En web se usa el conocido MVC Model 2 Actualmente: ●
  • 40. Tendencias actuales Ventajas ● No es necesario reescribir las vistas – Las acciones se programan una sola vez – Acciones que se pueden ejecutar sobre los datos y vistas se definen de – forma independiente garantizando una mayor independencia de los componentes del software Las acciones sobre los datos se pueden reutilizar fácilmente para – construir otro tipo de aplicaciones (Como por ejemplo Swing con el API Action) Actualmente la persistencia de datos se implementa mediante ● tecnologías ORM ó, en algunos casos application scafolding. ORM implica que los objetos se mapean automáticamente a una base – de datos (a veces es necesario decir cómo se almacenan los atributos en ficheros de configuración). Ejemplos: Hibernate que actualmente implementa la Java Persistent API (Extremadamente fácil de manejar) Application scafolding significa generar código de forma automática a – partir de una base de datos. No esta tan flexible como ORM.
  • 41. Hibernate package es.ei.uvigo; @Entity @Table( name=“users” ) public class User implements Serializable{ private String username; @Id @Column(name = quot;usernamequot;, nullable = false) private String username; @Column(nullable = false, length = 50, unique = true) private String clave; public String getUsername(){ return username; } public String getClave(){ return clave; } public void setUsername(String username){ this.username=username; } public void setClave(String clave){ this.clave=clave; } }
  • 42. Fichero de configuración <persistence> <!-- Colocalo en el directorio META-INF del fichero .jar y llámalo persistence.xml --> <persistence-unit name=quot;manager1quot; transaction-type=quot;RESOURCE_LOCALquot;> <class>es.ei.uvigo.User</class> <class>es.ei.uvigo.Cars</class> <!-- enumera todas las clases persistentes --> <properties> <property name=quot;hibernate.dialectquot; value=quot;org.hibernate.dialect.HSQLDialectquot;/> <property name=quot;hibernate.connection.driver_classquot; value=quot;org.hsqldb.jdbcDriverquot;/> <property name=quot;hibernate.connection.usernamequot; value=quot;saquot;/> <property name=quot;hibernate.connection.passwordquot; value=quot;quot;/> <property name=quot;hibernate.connection.urlquot; value=quot;jdbc:hsqldb:.quot;/> <property name=quot;hibernate.max_fetch_depthquot; value=quot;3quot;/> <!-- cache configuration --> <property name=quot;hibernate.ejb.classcache.org.hibernate.ejb.test.Itemquot; value=quot;read-writequot;/> <property name=quot;hibernate.ejb.collectioncache.org.hibernate.ejb.test.Item.distributorsquot; value=quot;read-write, RegionNamequot;/> </properties> </persistence-unit> </persistence>
  • 43. Hibernate // Use persistence.xml configuration EntityManagerFactory emf = Persistence.createEntityManagerFactory(quot;manager1quot;); // Retrieve an application managed entity manager EntityManager em = emf.createEntityManager(); User u=new User(); u.setUsername(“moncho”); u.setClave(“xjmon764d”); em.persist(u); em.close(); emf.close(); //close at application end