Guardando y mostrando imágenes desde bases de datos con JSP

Vamos a aprender a guardar imágenes en una base de datos (Oracle, MySQL, SQLServer, cualquiera a la que Java pueda acceder, es decir, casi todas) y a mostrarlas a continuación, utilizando sencillas páginas JSP.

Formulario y ejemplo de invocación de imagen

En éste código definiremos el formulario (ojo a la declaración, ha de ser multipart) y además mostraremos una imagen desde la BD; ambos elementos usarán los arhivos que definiremos a continuación:

<!DOCTYPE html>
<html>

<head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-15">
    <title>Cargador de imágenes desde BD</title>
</head>

<body style="margin: 20px;">

    <h1>Cargador de imágenes desde BD</h1>
    <hr/>

    <h2>Subir una imagen a la BD</h2>

    <form enctype='multipart/form-data' action="subir.jsp" method="post">
        Elige la imagen (PNG) a subir: <input type="file" name="imagen" /><br/>
        <input type="submit" value="Subir archivo" />
    </form>

    <h2>Imagen desde BD</h2>

    <img src="img.jsp?id=1" />

</body>

</html>

Guardado de la imagen en BD

En éste JSP veremos cómo extraer los datos de la imagen que acabamos de subir y como codificarlos a Base64. Ésta cadena codificada será la que guardemos en BD, como si de otra cadena cualquiera se tratase:

<%@page import="sun.misc.BASE64Encoder"%>
<%@page import="java.io.DataInputStream"%>
<%@page contentType="text/html" pageEncoding="ISO-8859-15"%>

<!DOCTYPE html>
<html>

<head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-15">
    <title>Cargador de imágenes desde BD</title>
</head>

<body style="margin: 20px;">

    <h1>Cargador de imágenes desde BD</h1>
    <hr/>

    <h2>Subiendo imagen...</h2>

    <%

    // Es un formulario multipart, cogeremos cada una de esas partes
    String contentType = request.getContentType();

    if ((contentType != null) && (contentType.indexOf("multipart/form-data") >= 0))
    {
        // Cogemos el flujo de entrada
        DataInputStream in = new DataInputStream(request.getInputStream());

        // Empezamos a leer
        int longitud = request.getContentLength();
        byte dataBytes[] = new byte[longitud];
        int byteLeido = 0;
        int numBytesLeidos = 0;

        while (numBytesLeidos < longitud)
        {
            byteLeido = in.read(dataBytes, numBytesLeidos, longitud);
            numBytesLeidos += byteLeido;
        }

        // Extraemos la porción con el archivo añadido
        String archivo = new String(dataBytes);

        // Buscamos la posición de los datos
        int lastIndex = contentType.lastIndexOf("=");
        String boundary = contentType.substring(lastIndex + 1, contentType.length());
        int pos;

        pos = archivo.indexOf("filename=\"");
        pos = archivo.indexOf("\n", pos) + 1;
        pos = archivo.indexOf("\n", pos) + 1;
        pos = archivo.indexOf("\n", pos) + 1;

        int boundaryLocation = archivo.indexOf(boundary, pos) - 4;
        int startPos = ((archivo.substring(0, pos)).getBytes()).length;
        int endPos = ((archivo.substring(0, boundaryLocation)).getBytes()).length;

        // Copiamos los datos en un array
        byte[] datosArchivo = new byte[(endPos - startPos)];
        System.arraycopy(dataBytes, startPos, datosArchivo, 0, (endPos - startPos));

        // Codificamos a Base64
        BASE64Encoder e = new BASE64Encoder();
        String datos = e.encodeBuffer(datosArchivo);

        // Guardamos en la BD
        guardarEnBaseDeDatos(datos);
    }

    %>

    Redirigiendo...

    <script language="javascript">
        location.href="index.jsp";
    </script>

</body>

</html>

Lectura de la imagen desde BD

Una vez guardada, para invocarla bastará con leer ésa cadena desde la base de datos y mostrarla como salida de un script JSP, estableciendo el tipo MIME del contenido al de la imagen que hayamos guardado, para que el navegador la interprete correctamente como imagen:

<%@page contentType="image/png" %><%@page import="sun.misc.BASE64Decoder" %><%

// Cargamos desde la BD
String datos = cargarDesdeLaBaseDeDatos(request.getParameter("id"));

// Decodificamos
BASE64Decoder d = new BASE64Decoder();
byte[] datosImagen = d.decodeBuffer(datos);

// Mostramos como salida del JSP
%><%= datosImagen %>

¿Alguien conoce una forma más sencilla de hacerlo? Todo comentario será bienvenido icon smile Guardando y mostrando imágenes desde bases de datos con JSP

¡Happy coding!

Usando JSPs en Google App Engine

Eclipse provocará un extraño fallo al crear JSPs en nuestro proyecto si no está correctamente configurado. El error es el siguiente:

Your project must be configured to use a JDK in order to use JSPs

Para solucionarlo -como se detalla aquí-, ir a la configuración de los JREs de Eclipse (a través de la opción de menú Preferences > Java > Installed JREs) y asegurarse de que la opción activa es un JDK en vez de un JRE. Si no hay un JDK registrado, habrá que instalarlo y agregarlo a la lista. Tras registrar un JDK, basta con activarlo por defecto o a nivel de proyecto y ¡voilá! Ya podremos disfrutar de los JSPs en Google App Engine.

¡Happy coding!

JEE con JBoss y Netbeans: Conceptos básicos

 JEE con JBoss y Netbeans: Conceptos básicos
Vamos a aprender los conceptos básicos de una aplicación JEE, y a aprender más sobre Beans, Servlets y JSPs, y el resto de las tecnologías básicas de las aplicaciones Java Enterprise.

¿Qué es contenedor de aplicaciones? Descripción de JBoss

La Wikidepdia habla mejor que yo:

JBoss AS es el primer servidor de aplicaciones de código abierto, preparado para la producción y certificado J2EE 1.4, disponible en el mercado, ofreciendo una plataforma de alto rendimiento para aplicaciones de e-business. Combinando una arquitectura orientada a servicios revolucionaria con una licencia de código abierto, JBoss AS puede ser descargado, utilizado, incrustado y distribuido sin restricciones por la licencia. Por este motivo es la plataforma más popular de middleware para desarrolladores, vendedores independientes de software y, también, para grandes empresas.

Al ser Java, es un servidor de aplicaciones multiplataforma, y viene cargadito de múltiples caracteristicas más que jugosas, como:

  • Cumple todo tipo de estándares

  • Es incrustable, sin restricciones por su licencia abierta

  • El sun middleware apto para cualquier objeto Java

  • Implementa de forma nativa EJB 3, Hibernate, etc…

  • Dispone de un servidor Tomcat integrado

  • Y mucho, mucho, mucho más icon smile JEE con JBoss y Netbeans: Conceptos básicos

Lée la página de JBoss en la Wikipedia para conocer todos los detalles en profundidad.

¿Qué es una Bean? Tipos de Beans

Una Bean es un objeto Java que corre dentro del contenedor de aplicaciones y cumple una función específica en nuestra aplicación JEE. Hay tres tipos básicos de Beans (EJBs), cada uno de ellos con propósitos muy diferentes:

  • Session Bean: Realiza una tarea para un cliente, una acción concreta de la lógica de negocio. Representa el grueso de proceso de la aplicación, e implementa la funcionalidad de la misma.

  • Entity Bean: Representa una entidad de negocio que presiste en un almacenamiento externo (como una BD). Serán utilizadas por ORMs como Hibernate para implementar la persistencia de datos de la aplicación.

  • Message-Driven Bean: Actúa como un Listener para la Java Message Service API, procesando mensajes de forma asíncrona.

Cada EJB define dos interfaces, un interfaz Home y un interfaz Remote, que engloban las funcionalidades de la bean según quien vaya a consumirlas. Nosotros, en éste manual, pasaremos de las interfaces Home y usaremos tan sólo el interfaz Remote.

Más adelante, en los ejemplos concretos, explicaremos cómo implementarlos y cómo utilizarlos a través de la RMI (instanciación remota, usando los mecanismos que nos brinda el servidor de aplicaciones Java, es decir, JBoss).

¿Qué es un servlet? ¿Y un JSP? Diferencia entre ambos

Los servlets y los JSPs son en realidad la misma cosa, pero con diferente envoltura.

Un servlet es un objeto que se ejecuta en el contexto del servidor web (como el Tomcapt que JBoss tiene integrado). Se pueden mapear las peticiones de los usuarios a dichos servlets, para poder servir contenidos web dinámicos. Es un estandar muy bien definido y permite extender la funcionalidad del servidor web de forma cómoda y eficiente. Es un objeto java puro y duro.

Por otro lado, un JSP es una forma simplificada de generar servlets, pues cada JSP se convertirá a servlet de forma automática antes de atender peticiones. Un JSP combina código Java con HTML de forma que el desarrollo de páginas dinámicas se acerca mucho más a la forma de programar de otros lenguajes como el popular PHP.

Ambas son buenas tecnologías, pero en éste tutorial usaremos tan sólo Servlets.

Conclusiones

JBoss y las tecnologías Java nos dan una base maravillosa para desarrollar aplicaciones web escalables, sólidas y profesionales. En lecciones sucesivas iremos desgranando todo el potencial de ésta plataforma.

Y recordad, Code is Poetry icon smile JEE con JBoss y Netbeans: Conceptos básicos

Etiquetas: , , , ,

Disclaimer: Las imágenes mostradas en ésta página web se utilizan sólamente con propósitos ilustrativos, y son propiedad de sus respectivos autores (cuando es aplicable).
Hijo de Blog es un producto del Dr. SeROne

Los contenidos se ofrecen bajo una licencia de Creative Commons
Attribution-NonCommercial-NoDerivs 3.0 Unported

salvo que se indique lo contrario

Licencia de Creative Commons