Generador de slideshow básico con XML y Flash

De nuevo, y para no variar tarea de Tecnologías para la Web, esta vez correspondió hacer un servlet que se valiera de una película hecha en flash para presentar imágenes que el usuario elige.
El proceso es el siguiente:

  1. Mediante la interfaz se le solicita al usuario el número de imágenes que desea en su presentación
  2. Se crean los campos correspondientes al número de imágenes, para que el usuario suba sus archivos
  3. Ya dentro del servlet se leen las descripciones y se guardan en una lista
  4. Se obtiene el ID de la sesión actual para crear una carpeta única en el servidor que alojará los archivos necesarios para la presentación
  5. Posteriormente se suben las imágenes al directorio creado, al tiempo que se crea una etiqueta de XML por cada imagen, al cual se le añaden los atributos de descripción que guardamos en la lista en el paso anterior y la url en la que el servlet las guardó
  6. Una vez que las imágenes han sido cargadas, se procede a guardar el documento XML dentro del directorio creado para el cliente y a copiar el archivo SWF dentro de la misma carpeta
  7. Una vez que llegamos a este paso, ya está listo para ser devuelto al cliente para lo cual se comprime la carpeta completa
  8. Y se reenvía al cliente una vez comprimida
  9. El cliente disfruta de su presentación para la cual solo tuvo que subir imágenes :D

En resumen, lo que se hace es implementar la subida de archivos al servidor para lo cual se usan las librerías de Apache Commons(IO y FileUpload), se crea un documento XML para lo cual se usa la librería JDOM, de la cual ya tengo tiempo escribiendo cosas y utilizo una clase llamada SimpleZip para comprimir el archivo, la cual viene incluida.

Más detalles y código en el resto de la entrada

Valida tus archivos XML 'online'.

Hay dos tipos de documentos XML:
Bien formados
Es un tipo de documento que cumple ciertas normas, tales como incluir información sobre la versión de XML que usa o el juego de caracteres que contiene. También debe de tener un único elemento raíz además de llevar una sintaxis correcta para documentos XML.

Válido
Este tipo, además de estar bien formado, cumple con normas que se especifican dentro de el DTD(Document Type Definition). Para que sea válido debe cumplir con todas esas normas.

Ahora, este servlet que preparé para la clase de Tecnologías para la Web, toma cualquier archivo que elijas y lo sube al servidor para validarlo. Utiliza las librerías de JDOM de las cuales ya les había hablado antes la validación es simple con esta herramienta y el manejo de excepciones, ya que al momento de cargarlo a memoria se le puede especificar que revise o no la validez del documento; La buena forma la revisa al estar leyendo el archivo. En el momento en el que no se cumpla alguno de los parámetros una excepción es lanzada.

Digo que es online ya que está pensado para que trabaje montado en un servidor, sin embargo es posible convertirlo a una aplicación de escritorio.

Las pocas, y de verdad pocas, líneas que tuve que escribir para la validación fueron estas(en las que se pide se construya el archivo y se valide):

JDOM, Fácil manipulacion de XML en Java.

Esta es una biblioteca para Java que facilita el uso y manipulación de documentos XML en memoria y de manera persistente. Similar al DOM del W3C, con la potente diferencia de que este se refuerza con las características de Java.

Me lo presentó el profesor de Tecnologías para la Web.


Del siguiente código XML:
<tienda nombre="tienda para geeks" ubicacion="Tokio, Japon">
  <computadora nombre="iBook" precio="$1200" />
  <historieta nombre="Dragon Ball Volumen 1" precio="$9" />
  <nivel_geek_de_la_tienda precio="sin precio" /> 
</tienda>
Mediante Java y JDOM se puede obtener la información de la siguiente manera:
SAXBuilder builder = new SAXBuilder ();
Document doc = builder.build (new FileInputStream ("foo.xml"));
Element root = doc.getRootElement ();
root.getName ();                            // devuelve "tienda"
root.getAttributeValue ("nombre");          // devuelve "tienda para geeks"
root.getAttributeValue ("ubicacion");       // devuelve "Tokio, Japon"
root.getChildren ();                        // devuelve una java.util.List de objetos que tiene tres Element
Ejemplo extraído de Wikipedia 

JDOM

¡Saludos! @fferegrino :)

Tareas Teóricas de Tecnologías para la Web

Esta noche les traigo mis tareas teóricas de la asignatura Tecnologías para la Web, aclaro que no son nada buenas, aún me falta mucho para aprender a redactar bien pero... ¿qué le vamos a hacer?

Prometo de a poco ir mejorando en la redacción.

Incluídas en el súper paquete:

  1. Conceptos básicos de la web
  2. Historia del internet y la www
  3. Estándares de la web
  4. La Web 2.0
  5. Entornos de desarrollo
  6. Historia y diferencias entre navegadores
  7. Historia de XHTML
  8. Diferencias entre HTML y XHTML

Si las quieren en paquete aquí las dejo:

Tareas teóricas

¡Saludos! @fferegrino :)

Asignar trigger a un UpdatePanel en tiempo de ejecución (C#, ASP)

Supongamos que tenemos el siguiente escenario:
<asp:GridView ID="GridView1" runat="server">
 <Columns>
  <asp:TemplateField HeaderText="Botón">
   <ItemTemplate>
    <asp:ImageButton ID="ImageButton2" runat="server" />
   </ItemTemplate>

El botón ImageButton2 es inaccesible directamente dado que está contenido en un GridView, entonces no lo podríamos añadir como trigger para un UpdatePanel en el código como normalmente se haría:

<asp:AsyncPostBackTrigger ControlID="ImageButton2" EventName="Click" />
Entonces, lo que haremos será añadirlo dinámicamente en tiempo de ejecución.

 Nos valemos del evento OnLoad del control. Para que al momento de cargarse, se asigne como trigger al UpdatePanel en cuestión.

De tal manera el código quedaría así:

ASP:
<asp:GridView ID="GridView1" runat="server">
 <Columns>
  <asp:TemplateField HeaderText="Botón">
   <ItemTemplate>
    <asp:ImageButton ID="ImageButton2" runat="server" OnLoad="ImageButton2_Load" />
   </ItemTemplate>
Y C#:
protected void ImageButton2_Load(object sender, EventArgs e)
{
    ImageButton boton = (ImageButton)sender;
    UpdatePanel1.Triggers.Add(new AsyncPostBackTrigger { ControlID = boton.UniqueID, EventName = "Click" });
}

¡Listo! ahora nuestro ImageButton2 ha quedado registrado como trigger asíncrono para actualizar el UpdatePanel1

¡Saludos!
@fferegrino :)