domingo, 27 de julio de 2014

selección simple y múltiple







  • Principal
  • Bean
  • Dao
  • Opciones (Servlet)
  • UtezSelectX.js
  • Descargar

  • En una aplicación "de escritorio"  elegir una opción, de entre varias disponibles, a menudo se realiza con un  combobox mientras que en una aplicación web se le conoce como select

    En este post, se muestra como llenar los valores de un select simple o múltiple en una vista jsp --> (html).


    Nuestro proyecto consta de los siguientes elementos
     

    En index.jsp, iniciamos colocando 2 select (para editorial y para área)


    Como se puede ver, el resultado son dos select con la única opción que dice "Selecciona..."
    Ahora, mostraremos como cargar los select con los datos que se encuentran en las tablas "area" y "editorial" respectivamente.


    De la imagen anterior, se puede apreciar como se incorporan jequery.min.js y utezSelectX.js
    utezSelect.js contiene una función llamada cargarSelectX (que espera el nombre de un Servlet), en este caso el Servlet se llama Opcionesel cuál se encarga de recuperar los valores y las opciones de cada opción que tendrá el select. 
    ...
    $('#editorial').cargarSelectX("Opciones");
    $('#area').cargarSelectX("Opciones"); 

    .....



    Como se puede apreciar en la imagen anterior, ya se cuenta con las opciones en nuestros select (cada opción ha sido recuperada de nuestra bd en las tablas "editorial" y "area" respectivamente).

    Ahora es conveniente aplicar un filtro, para que el usuario pueda insertar un término de búsqueda y encuentre rápidamente la opción que quiera elegir, en lugar de desplazarse por todas las opciones hasta encontrar la que requiere.



    Basta con agregar las líneas 24 a 33 que se ven en la imagen anterior.
    La llamada al método combobox(), es la que aplica el filtro.
    ...
    $( "#editorial" ).combobox();
                $( "#area" ).combobox();
    .....
    
    

    Selección múltiple
    Además de jquery, necesitamos: tokeninput.js, token-input.css y token-input-facebook.css 

    En este caso se trata de un input, en lugar de un select (con un comportamiento semejante).
    Se aplica tokenInput() al elemento cuyo id=autores ("#autores")

    Enviando el URL, que en este caso es el recurso llamado "Opciones"  (ver línea 22 de la siguiente imagen)
    Además de 3  configuraciones:
     Línea 23, establece el tema, recuperado de token-input-facebook.css 
     Línea 24, no permite seleccionar opciones duplicadas.
     Línea 25, la traducción al español de la solicitud del filtro.

    Como se puede apreciar en la primera imgen,  el filtro no funciona del todo bien. Se resulve esperando el parámetro "q" (el valor del filtro) en el Servlet Opciones:






    Bean

    Se ha determinado este modelo para SelectBean, dado que en cualquier select necesitamos el valor (id) y la opción como tal (name).
    (ver línea 18 de UtezSelectX.js)

    Código fuente del Bean, en el código fuente puede ver que se implementa a Serializable el morivo lo puede consultar aquí.




    DAO

    En la línea 26, se realiza una consulta (query, que se recibe como parámetro en la declaración del método consultar) y el resutado (ResultSet) es asignado a la variable rs.

    De la línea 28  a 33, se encuentra el ciclo while que itera el resultado (rs), en cada recorrido crea un SelectBean y le asigna el id y name. Al final de cada iteración (línea 32) añade el SelectBean a la lista.

    Las instrucciones 28 a 33 están "encerradas" en el bloque try-catch para "capturar/controlar" en caso de ocurrir una excepción SQLException.

    Finalmente, la lista es "retornada" (ver línea 38).
    
    
    
    
    
    Código fuente del DAO





    Opciones

    Sea petición Get o Post, se atiende en el método processRequest.
    Recordemos que de request se obtienen los parámetros del cliente (navegador web) y desde response puede responder el Servlet.
    Línea 40, realizamos una composición de Gson() (puedes obtener el código fuente desde code.google.com), gson nos permitirá convertir fácilmente una lista, llama opciones de elementos SelectBean, a su representación en formato JSON.
    En la línea 43, recuperamos el parámetro "q", el cuál pudiera existir o no, por ello en la línea 44, en caso de que la variable "q" tenga el valor de "nulo" o  una cadena de texto sin contenido, declaramos "q" con el valor de cadena de texto vacía (línea 45).

    Línea 46, obtenemos el parámetro "paramName" que contiene el valor del id del select (ver UtezSelectX.js en línea 14).
    Línea 48 a 52, si y sólo si selectX es diferente de null, se revisa si ésta tiene el valor de "editorial" o "area" y asigna a la variable query la instrucción de la consulta sql.


    Línea 53,54, de lo contrario (si selectX==null) se asigna la consulta, relativa a autor(es), a la variable query.
    Línea 56, contando con la consulta en la variable query, se llama al método consultar del dao (SelectDao), el resultado, que es una lista de elementos SelectBean, se asigna a a variable opciones (lista declarada en la línea 41).

    Línea 57, la lista de elementos SelectBean se convierte a formato JSON
    Un filtro en un select múltiple con el término "ed" produce 3 registros, entonces la lista 
    es de 3 elementos, cuya representación JSON es:
    [{"name":"Edward Punset","id":"18"},{"name":"Pat Fallon y Fred Senn","id":"19"},{"name":"Salvat Editores","id":"24"}]

    Línea 60, desde response, se establece el contentType que en este caso es "application/json"
    Línea 61, se responde escribiendo el valor de json.
    (ver línea 15 y 17 de UtezSelectX.js)

    Código fuente de Opciones







    UtezSelectX
    Métodos importantes, utilizados.

    $.get(URL,data,function(data,status,xhr),dataType)

    de lo cual, utilizamos:

    $.get(URL,data,function(data))

    línea 13: URL=servlet
    línea 14: data= paramName : $(this).attr("id") }
    línea 15: function(data) = function(jsonResponse) {
    a 20:             ...
                          }


    Lo que  resulta en:


    En la línea 11, se declara la función llamada cargarSelectX que recibirá un argumento llamado servlet
    Línea 12, se podrá utilizar la variable select o hacer referencia this para referirse al select (elemento html) que se le aplique la función caragarSelectX
    Línea 13, inicia el uso de get con el formato $.get(URL,data,function(data))
    el URL es el valor que se recibe como argumento llamado servlet (ver línea 11)
     $.get(servlet, {
    Línea 14, el valor de data, en este caso, se recupera el valor del atributo id del select en cuestión y tal valor se asigna a paramName, parámetro que recibe el servlet.                                 $.get(URL,data,function(data))
    Línea 15, inicia la función function(data,status,xhr),  pero sólo utilizando el tipo function(data), en este caso: function(jsonResponse)
    el contenido de tal función sólo tiene dos intrucciones (que terminan con "punto y coma")
    Línea 16, encuentra(find) todas las opciones y las elimina (opciones/option´s del select en cuestión).
    Línea 17, se utiliza each() para recorrer los los elementos de la lista (representada en JSON) que devuelve el   servlet,
    Línea 18, de cada elemento, de jsonResponse, el valor (value) es un objeto que contiene id y name (de acuerdo con SelectBean), dichos atributos se utilizan para ir agregando (append) opciones al select en cuestión.

    Información importante:
    En algunos casos es conveniente determinar si la carga de las opciones en el select será  bajo transmisión asíncrona o no.


    se puede encontrar un ejemplo aquí
    Recomendamos utilizar el código de la imagen anterior, para cargar las opciones de un select y sólo hasta terminar de cargar las opciones proceder a seleccionar automáticamente una opción del mismo select, esto se da muy a menudo en una interfaz para modificar un registro.
    Por ejemplo, cargar todos los países y seleccionar por default a México.


    En resumen, se eliminan las opciones del select (línea 16), se recupera una lista (de elementos SelectBean)  convertida a JSON (esta lista la crea y devuelve el servlet), para cada elemento de la lista se recupera el valor que es un objeto con el atributo id y name, los cuales se utilizan para ir agregando (append) opciones al select (ver línea 18).






    
    
    El código fuente los puedes descargar
    BD
    Puede  ver el post  Reconstruir proyecto NetBeans para crear un proyecto Netbeans a partir del código fuente disponible.

    Reconstruir proyecto NetBeans

    Normalmente, cuando se exporta un proyecto a GitHub no se incluyen los archivos de configuración del proyecto Netbeans.  Por ejemplo https://github.com/abadrector/utez.app.web/tree/FKc



    De tal manera que al descargar el código de GitHub, se trata de una simple carpeta que no podemos abrir con Netbeans. El motivo es porque seguramente cada usuario necesita su propio nombre de proyecto y tendrá diferente configuración en cuanto a: versión de Netbeans, java y/o servidor de aplicación web (e.j. Apache tomcat)

    Si sabemos que se trata del código de un proyecto web. Se puede realizar lo siguiente:

    Crear un nuevo proyecto  "Java Web".

    Las carpetas web y src son las que contienen nuestras páginas web y nuestros paquetes respectivamente.
    Normalmente la carpeta lib contiene nuestros jar´s.



    Entonces, copiamos el contenido de web, src y lib, del zip que descargamos, a nuestro proyecto.


    En src/java copiamos todo.

    En web, debemos copiar todo con la excepción de  META-INF y WEB-INF  (a index.jsp si lo reemplazamos)


    Si no contamos con la carpeta lib la creamos, y copiamos el contenido.

    Regresamos a Netbeans y veremos que ya se tiene contenido en "Web Pages" y en "Source Packages"
    Posiblemente con algunos errores, por que falta incluir las librerías o jar necesarios.


    Los jar se encuentran, normalmente, en la  carpeta lib.
    Agregamos  JAR: 
    Acudimos a la ruta donde se encuentra nuestro proyecto, entramos a lib, y seleccionamos todos los jar.

    En esta caso en particular, también se necesita la librería JSTL.

    A menudo se requiere de una BD, en las aplicaciones web, en este caso, el script de la bd, está en: https://github.com/abadrector/utez.app.web/blob/master/src/java/BD.sql

    Revisamos los datos de conexión, en este proyecto:



    Limpiamos y ejecutamos nuestro proyecto.


    Nota: un proceso semejante se debe seguir cuando el proyecto se realiza en una versión de netbeans mayor a la versión que se tiene, por ejemplo 7.4, y requiere abrir en 6.4 (SI es que nos da algún error)

    (en un nuevo proyecto, sólo se debe de copiar lo de src, lib, y web, sin META ni WEB-INF,  y agregar las librerías y/o jar necesarios).


    jueves, 24 de julio de 2014

    acentos, eñes, etc

    Procesar  caracteres especiales  en nuestros formularios para almacenarlos en una BD puede ser una tarea frustrante.

    Sólo vasta leer una nota como esta: (leer nota) para darse una idea..

    Sin embargo existe una solución fácil, que generalmente funciona (depende de algunas configuraciones en tu servidor), y es agregando  el atributo accept-charset="ISO-8859-1" al formulario.


    En la imagen se puede observar un registro (id=33) que fue agregado con un formulario "normal" y el registro con id=34 se registró con un formulario que contenía el atributo:  accept-charset="ISO-8859-1".
    (VER columna TITULO)

    Espero que les sea de utilidad, pueden dejar sus comentarios en caso de que no les funcione.


    lunes, 21 de julio de 2014

    CRUD

    Blog en proceso...

    Las operaciones CRUD sobre una BD, son comunes. A pesar de ello, pueden presentarse algunas complicaciones, para su implementación, en usuarios que apenas inician  su formación como programadores y más cuando se tiene que lidiar con tablas relacionadas, tablas que tienen llaves foráneas (FK).






    Relaciones

    Para un caso didáctico, se presenta la siguiente relacion de una BD parcial para un sistema de control de libros en biblioteca.
    No es parte de este post, atender la  normalización de la base de datos,  
    por ello no se discutirá si es correcta o no la relación presentada.
    El autor de este post, no es el autor de la BD que se utiliza, 
    la BD sólo se toma para dar un ejemplo didáctico.

    En este post, se da por echo, que el lector es capaz de realizar las operaciones CRUD sobre las tablas autor, area y editorial. Sólo nos centraremos en realizar las operaciones CRUD sobre la tabla libro y por efecto en la tabla escribe.

    En la relación se puede apreciar que varios autores pueden serlo para un mismo libro y a su vez que un autor puede ser de uno o más libros.

    Cuando se registre un nuevo libro, se deben registrar una o más entradas en la tabla 'escribe' dependiendo del número de autores para tal libro.

    Una de las primeras cosas con las que se tiene que iniciar, es determinar cuales son las consultas para la recuperación de información relativa a los libros.


    Consultas


    • Consultar todos los libros recuperando el nombre de la editorial y la descripción(nombre) del area:

            ...


    •    conocer los autores de un libro dado el id (libro_id):




    Bean

    Bean para libro





    dao


    Servlet


    Read


    add

    viernes, 18 de julio de 2014

    exportar contenido de la BD en MS. SQL Server

    Trabajando con  Microsoft SQL Server (Management Studio)...

    A menudo se realiza una base de datos (bd) en una computadora, se insertan registros de prueba y llega el momento en el que la misma bd con sus registros los necesitamos tener en una computadora distinta.

    ¿Tiene sentido volver a crear, desde cero, la bd e insertar uno a uno los registros? la mayoría estará de acuerdo en que no.

    Los gestores de BD lo saben, y me atrevo a decir que todos (aunque en realidad no lo he confirmado) tienen una opción para exportar nuestras tablas con todo y sus registros. Lamentablemente es común que los usuarios que apenas empiezan a formarse como administradores de BD desconocen tal opción.

    Es por lo anterior, que presento el procedimiento para exportar las tablas y registros de nuestra bd en Microsoft SQL Server:


    • Damos clic derecho sobre nuestra bd 
      • Seleccionamos  Tareas/ Generar scripts...




    • Seguimos el asistente


    • Seleccionamos la BD (si es necesario), y activamos la opción de incluir todos los objetos...




    • En el paso de "Elegir opciones de script", la configuración por defecto sólo nos permite exportar las tablas (sin sus registros). Para incluir los registros de nuestras tablas, nos desplazamos a la sección de "Opciones de tabla o vista" y cambiamos a Verdadero la opción de "Incluir datos en el script".


    En versiones diferentes, puede encontrarse la opción de "Esquema y datos" (tablas y registros) como una opción de "Tipos de datos que se deben incluir..."

    Otra posible vista:


    • Sólo hay que decidir, si queremos el script en el portapapeles (como si lo hubiésemos copiado, ya estará listo para pegarlo en donde necesitemos), en una nueva ventana de consulta (en nuestra misma interfaz Management) o en un archivo. En caso de quererlo en un archivo, debemos especificar la ruta y el nombre del archivo.



    • Seguimos el asistente, y cuando finalice, se mostrará el informe de estado en donde procedemos a "cerrar"  la ventana.




    Considerando que se exportó a un archivo, sólo lo recuperamos y nos lo llevamos a cualquier otra computadora, que cuente con SQL server para simular el proceso de importación:

    Creamos y seleccionamos la BD e incluimos el script y lo ejecutamos en una "Nueva consulta" de  la computadora donde se requiere la BD.



    CREATE DATABASE tuBD;

    USE tuBD;

    /****** Tu código (script) de las tablas y registros que se encuentran dentro del archivo ******/


    El proceso se ha realizado en SQL Server 2008, en versiones distintas los pasos del asistente pueden variar pero en esencia es lo mismo.






    blog en proceso...

    jueves, 10 de julio de 2014

    Recorrer colecciones con JSTL


    El contenido de este blog requiere de los conocimientos previos de temas básicos en programación web, utilizando jsp.

    Se muestra, de forma breve, como recorrer colecciones con JSTL

    En programación web, es común verse en la necesidad de recorrer una colección de elementos (como por ejemplo una lista: List).

    Una manera ~ limpia de realizarlo es con el uso de JSTL tomando en cuenta el "grupo" core con su prefijo (por default) c


    Desde un ServLet "añadimos" un atributo a request  que tenga el valor de una colección para después en nuestra vista (jsp) podamos recorrer tal atributo (que representa a la colección, lista por ejemplo)



    En este caso, la lista que se encuentra representada por el atributo "atributoLista" es una lista cuyos elementos son PersonaBean, este último bajo el siguiente diseño:

    A continuación, un bosquejo de como se agregan los elementos a la lista en cuestión.




    Descargar proyecto de ejemplo

    NOTA:
    En caso de no contar con la misma versión de JSTL se deberá corregir eliminando la librería incorrecta y añadiendo la librería correcta (con la que cuentas en tu PC).

     Damos clic derecho al proyecto/propiedades
    Categoría: librerías                
    Si tiene problemas con la librería comenzará con letras o puntos en color rojo.
    Procedemos a seleccionarla con el "mouse" la eliminamos (remove) y agregamos  (add library) la librería JSTL que tengamos en nuestra PC (no importa la versión).


    blog en proceso...

    sábado, 5 de julio de 2014

    dataTables.bootstrap.js en segundos!




    La"display tag library" es una suite de código abierto de etiquetas personalizadas, enfocadas al modelado de tablas en una interfaz web en donde se trabaja en un modelo MVC utilizando, por ejemplo, "struts".    
    Más información: http://www.displaytag.org/1.2/

    dataTables.bootstrap

    Una alterativa realmente interesante es el uso de Bootstrap (con sus extensiones) para procesar y personalizar nuestras tablas, utilicemos o no un framework para el modelado MVC.

    La idea original se encuentra en  http://www.datatables.net/

    dataTables.bootstrap.js


    Preparamos nuestro documento para el uso de Bootstrap y dataTables



    Aplicamos .dataTable()  a nuestra tabla id=myTable


    Es importante el uso de THEAD y de TBODY 
    para que funcione .dataTable()
    Además el atributo span (con valor mayor a uno) 
    o la combinación de celdas no es soportada por .dataTable()


     En este caso además de .dataTable()  inyecto la traducción al español y glyphicon´s para la navegación.




    El proyecto de ejemplo, en NetBeans:  descargar

    jueves, 3 de julio de 2014

    Twitter Bootstrap


    Framework o conjunto de herramientas de software libre para diseño de sitios y aplicaciones web. Contiene plantillas de diseño, basado en HTML y CSS, además de extensiones de JavaScript.

    http://getbootstrap.com/

    http://librosweb.es/bootstrap_3/

    http://www.bootply.com/

    Una vez que contamos con bootstrap en nuestra aplicación, sin importar el nivel de conocimiento sobre el mismo, seguramente tendrás que realizar un formulario, para ello recomiendo la siguiente aplicación online:

    http://bootsnipp.com/forms?version=3

    Ahora sólo debemos arrastrar y soltar los elementos que necesitamos en nuestro formulario, así como especificar nuestros valores en los diferentes atributos de los elementos.






    Al finalizar el diseño de nuestro formulario, sólo acudimos a la pestaña "Rendered" y seleccionamos y copiamos el código que corresponde al formulario para incorporarlo en nuestra página de proyecto.