╬JGSISTEM_ONLINE╬

╬Menu I╬

╬ JG_Online╬

Usuarios ONLINE

╬Sistemas╬

╬Sistemas╬

Cristalab vs The Web #19: El orgullo de mis padres

Introducción a HTML5 Web Messaging

HTML5 Web Messaging es una API de JavaScript que permite de una forma segura compartir información entre documentos en el mismo contexto de navegación, sin correr el riesgo de exponer el DOM a un sitio hostil. La especificación está centrada en relegar la comunicación de documentos directamente al navegador, logrando así una implementación hermosa y sin necesidad de intervención del servidor, reduciendo así su carga e incrementando la seguridad en el sitio (teóricamente).

En la Web actual es común el intercambio de información entre documentos pertenecientes o no al mismo dominio, no obstante es un problema no muy sencillo de solucionar. Un ejemplo común es cuando se tiene un anuncio publicitario contenido en un iframe alojado en un servidor externo, en el cual se necesita enviar valores relacionados con el contenido de la pagina principal, esto con la finalidad de mostrar un anuncio adecuado. 

Para automatizar este proceso recurrimos a JavaScript, y lo más sencillo es que el iframe lea de alguna manera la etiqueta meta keywords de la página principal o que esta misma proporcione dicha información; sin embargo, el acceso al DOM desde cualquiera de las partes no está permitido por el navegador, esto debido principalmente a la política del mismo origen –una medida importante de seguridad presente en los navegadores modernos– que admite la comunicación sin restricciones de scripts en documentos del mismo sitio, no siendo así entre aquellos que son diferentes. 


Ante esta problemática surgieron algunos mecanismos como Cross-Frame Messaging; una solución que carece de naturalidad, poco elegante y que requiere hacer malabares. 

[nota:7e3558eab3] En los siguientes ejemplos se han utilizado dominios locales (revisar el apéndice) así como la ultima versión de Google Chrome. [/nota:7e3558eab3]

Cross-document messaging: enviando y recibiendo mensajes


El envío de un mensaje es relativamente sencillo, no hace falta más que utilizar el método postMessage de un objeto window referenciado, ya sea de la propiedad contentWindow de un iframe, el objeto devuelto dewindow.open, o un nombre/indice en window.frames.
Código :
window.postMessage( Mensaje, Origen );

El primer parámetro es el mensaje que va a ser enviado. Éste puede ser una cadena de texto, un objeto, un array, etc.

El segundo parámetro es el dominio de la ventana objetivo, es decir, la ventana que va a recibir el mensaje. Si no se desea especificar un origen en concreto puede utilizarse un asterisco como comodín, sin embargo esto no es nada recomendable ya que deja enormes agujeros de seguridad. Por otra parte si el origen es el mismo que el del emisor puede utilizarse simplemente una barra diagonal: "/" (lamentablemente Google Chrome no soporta este último).

También puede añadirse un tercer parámetro, el cual debe ser un objeto MessagePort, pero esto será tratado mas adelante.

Enviar un mensaje


http://emisor.com/emisor.html
Código :
...

   
   

   

...

Al dar click al botón se enviará un mensaje con el contenido: "Hola, ¿como estas?", al iframe alojado en receptor.com; sin embargo nuestro ejemplo no está completo con sólo enviar el mensaje, también es necesario recibirlo, pero antes de continuar es importante conocer los atributos del evento message que será disparado en receptor.com cuando se reciba un mensaje.

Atributos del evento message


El evento message está compuesto por cinco atributos que sólo pueden ser leídos, que básicamente significa que es imposible alterar el valor de cualquiera de ellos.

  • evento.data: contiene la información del mensaje enviado por el emisor.
  • evento.origin: devuelve una cadena de texto conteniendo el origen del emisor. Ej. http://emisor.com
  • evento.lastEventId: una cadena con el identificador único del actual evento de message.
  • evento.source: es una referencia al objeto window de quien envía el mensaje.
  • evento.ports: un array conteniendo un objeto de MessagePort enviado junto al mensaje.

Recibir un mensaje


http://receptor.com/receptor.html
Código :
…
  
    
Aún no he recibido nada. :(
      …

El funcionamiento del ejemplo anterior es simple: se comienza a escuchar al evento message; cuando un mensaje es detectado, se dispara el método recibirMensaje que simplemente verifica que el origen sea el esperado y después se coloca el texto recibido dentro del elemento #mensaje.

[nota:7e3558eab3] Si intentan mandar a la consola – console.log(evento) – la información del objeto evento, se darán cuenta que al final les aparece un error. Esto se debe a lo que mencioné al principio, el receptor sólo tiene acceso a la información que explícitamente es enviada, y al colocarlo en la consola está siempre y tratará de imprimir todo el árbol del DOM.[/nota:7e3558eab3]

Como pueden ver es igual de sencillo recibir un mensaje, pero deben tener siempre presente que se tiene que verificar que en efecto, el origen sea el esperado, incluso el tipo de dato que se espera: una cadena de texto, un número, un objeto, etc. Además de que es muy importante que se controle el número de mensajes que pueden ser recibidos por minuto, de lo contrario dejarían la puerta abierta a un posible ataque de denegación de servicio.

Ahora bien, por qué no extender el ejemplo haciendo que nuestro receptor sea capaz de ser emisor también, y viceversa:

http://emisor.com/emisor.html
Código :
...
  
    
    
Esperando contestación...
              ...

http://receptor.com/receptor.html
Código :
…
  
    
Aún no he recibido nada. :(
      ...

Ver ejemplo funcionando en el navegador


Ventana externa 

MessageChannel y MessagePort


Hasta ahora sólo hemos visto la primera mitad que compone la especificación de HTML5 web messaging; sin embargo esta también nos provee de un objeto llamado MessageChannel, el cual permite el funcionamiento de dos piezas de código independendientes (ej. corriendo en diferentes contextos de navegación) comunicarse directamente. Por ejemplo: tenemos dos iframes contenidos en un documento: por simple deducción concluimos que están en el contexto de navegación del documento principal; por otra parte, estos iframes entre sí no están en el mismo contexto; a pesar de que están juntos; uno no sabe de la existencia del otro. 

Otro ejemplo: considera una situación en la cual una red social tiene incrustado un iframe de una libreta de direcciones, y otro iframe que contiene un juego en línea. El juego necesita las direcciones electrónicas de los amigos del usuario, para esto se necesita la información de la libreta de direcciones. Es aquí cuandoMessageChannel hace su aparición para hacer este proceso posible, en este caso la red social actuaría como mediador en la comunicación entre ambos iframes.

[nota:7e3558eab3] Lamentablemente Firefox todavía no soporta MessageChannel.[/nota:7e3558eab3]

Componentes de MessageChannel


El objeto MessageChannel está compuesto por dos puertos (port1 y por2) que no son otra cosa sino objetos de MessagePort, y estos a su vez contienen tres métodos:


  • puerto.postMessagemensaje ): envía mensajes a través del puerto en cuestión.
  • puerto.start(): comienza el envío de mensajes a través del puerto.
  • puerto.stop(): detiene el envío de mensajes a través del puerto.

MessagePort también contiene el evento onmessage, que puede ser utilizado en lugar de agregar un addEventListener.

Ejemplo


Con la finalidad de explicar mejor cómo trabajan MessageChannel y MessagePort, en este ejemplo nos basaremos en el escenario de la red social descrito anteriormente.

[nota:7e3558eab3] Por cuestiones de infraestructura se utilizara un mismo origen; sin embargo la estructura es básicamente la misma para orígenes externos.[/nota:7e3558eab3]

En primera instancia tenemos la página del juego. Lo primero que haremos es definir una función que se ejecutará cuando la estructura de nuestro documento esté completamente cargada. El objetivo primordial de esta función será el indicar a nuestro documento principal – la red social – que ya está listo para empezar a recibir correos. Para conseguir esto se crea un nuevo objeto MessageChannel, del cual su segundo puerto será enviado en un mensaje al documento principal. Después iniciamos nuestro primer puerto para procesar los mensajes que serán recibidos.

http://red-social.com/juego.html
Código :


    La red social actuará como proxy: será quien enlace el juego con la agenda. Una vez que se reciba el mensaje de parte de la página del juego será enviado un mensaje a la agenda contiendo el puerto para comunicarse con el juego.

    http://red-social.com/redsocial.html
    Código :
    
      
    
      
    
     ...

    En la agenda tenemos un simple formulario con una entrada de texto, en el cual serán ingresadas las direcciones electrónicas.

    http://red-social.com/agenda.html
    Código :
    
    
       
    ...

    [nota:7e3558eab3] Por cuestiones de legibilidad y simpleza se omitieron todas las validaciones que deben hacerse; validar el origen, el tipo de datos, etc.[/nota:7e3558eab3]

    Ver el ejemplo funcionando en el navegador.



    Conclusión


    Esta es una tecnología asombrosa que ayudará a hacer la vida mas fácil a muchos desarrolladores, no obstante habrá que esperar un tiempo más, ya que los navegadores principales solo han implementado parcialmenteHTML5 web messaging.

    Referencias



    Apéndice


    Para simular distintos dominios se agregan entradas al archivo hosts de los dominios deseados, por ejemplo: emisor.com, receptor.com y red-social.com. En Ubuntu y Mac este archivo se encuentra en "/etc/hosts" y"system32\drivers\etc\hosts" en Windows. Se echa a andar un servidor web, como Nginx (aunque vale con cualquier otro como Lighttpd, Cherokee o el tradicional Apache) con los dominios apuntando a una misma carpeta, sin otro motivo más que de comodidad, ya que se tienen los archivos juntos.

    Archivo hosts
    Código :
    127.0.0.1 emisor.com
    127.0.0.1 receptor.com
    127.0.0.1 red-social.com
    
    

    Configuración ejemplo de Nginx
    Código :
    server {
      listen   80;
    
      # Tres dominios distintos apuntando a la misma carpeta.
      server_name  emisor.com alias receptor.com red-social.com; 
      location / {
        root   /home/jonasanx/public_html;
        autoindex  on; 
      }
    }
    

    Category: 0 comentarios

    Introducción a Python

    En este pequeño tutorial vamos a ver inicialmente qué es Python, cómo descargarlo, porqué utilizarlo y luego daremos paso a crear una aplicación que calcule el área y el perímetro de un triángulo. Este archivo se guardará con extensión .py. Espero que les guste la información.

    ¿Qué es python?


    Es un lenguaje de programación creado por Guido van Rossum con el cual podremos crear tanto aplicaciones para escritorio como para la web utilizando el framework de Django y todo con muy pocas líneas de código lo cual facilita y agiliza nuestro trabajo.



    ¿De dónde proviene el nombre de Python?


    Pues al principio pensaba que hacía honor a la serpiente pitón debido lo poderosa que es pero investigando un poco más me di cuenta que:

    “El nombre del lenguaje proviene de la afición de su creador original, Guido van Rossum, por los humoristas británicos Monty Python.” 

    Descargar Python


    No hay cosa más fácil y accesible que descargar python lo puedes hacer directamente desde su página oficial:http://www.python.org/getit/ 

    Puedes empezar usando la versión 2.7 que es bastante buena y completa. Al finalizar la descarga podrás ejecutar en típico proceso de instalación (siguiente, siguiente (elije el lugar donde lo vas a guardar, por defecto viene con c:\python27\), terminar) fácil ¿verdad? al final te deben quedar instalados los siguientes archivos: 

    Idle (python GUI): es el editor de código python que viene junto con la instalación. Pero si no te gusta puedes descargar otro por aparte como por ej: sublime text 2 o notepad++.
    • Module docs: módulo de documentos
    • Python(command line): consola o línea de comandos python
    • Python manuals: cuando tengas una duda puedes consultar este manual (esta en ingles)
    • Uninstall python:desinstalador 


    ¿Por qué python?

    • la sintaxis es bastante clara y sencilla de hecho tiene un gran parecido con el lenguaje natural! lo cual te ayuda a comprender mejor el código y hacer potentes aplicaciones de manera rápida.
    • puedes ahorrarte muchas líneas de código que normalmente harías con php, c++ o java!!
    • es multiparadigma lo cual quiere decir que el desarrollador puede usar más de un método de programación, ej: Orientación a Objetos, Programación Funcional o Programación imperativa.
    • es el lenguaje de programación con más apoyo y aceptación en el mundo! 
    • no necesita compilación, sólo basta con tener un editor de texto como el notepad, guardarlo con extensión .py y listo, en mac ya viene instalado y en Windows como acabas de ver su instalación es bastante sencilla. 
    • YO lo digo!! :lol: 


    Nuestra primera aplicación en Python


    Lo que vamos a hacer es crear una aplicación que calcule el área y el perímetro de un triángulo:



    Solo con este código:

    Código :
    print "area de un triangulo"
    
    base = float(raw_input("medida de la base: "))
    altura = float(raw_input("medida de altura: "))
    lados = float(raw_input(“medida de los lados: ”))
    
    area = base * altura / 2.0
    perímetro = lados* 2 + base
    if lados < altura:
    print “la medida de los lados debe ser mayor a la altura”
    else:
    print "al area es: " , area , "el perímetro es: ", perímetro
    


    Es bastante fácil, para calcular el área se tiene que realizar la siguiente operación base*altura/2 y el perímetro es ladoA + ladoB + base, la medida debe ser igual en ambos lados (AB) por lo tanto es multiplicada por dos y sumada a la base. ¡Pero no nos olvidemos del código! Que es lo más importante, vamos a explicar cada una de sus partes: 


    Print


    Tenemos a “print” o imprimir con el cual podemos mostrar texto en la consola. Hace una función muy parecida a la de “trace” en actionscript, “document.write” en javascript o “System.out.println” en java. En él podemos escribir textos, números o almacenar datos de variables.

    Variables


    En las variables podemos guardar cualquier tipo de datos tales como: operaciones, texto, números, datos booleanos… sin embargo estas no se mostraran en pantalla hasta ser llamadas por el nombre asignado. Las variables se declaran así:



    Float()


    Es una función de python bastante fácil de entender lo que hace es convertir enteros en números flotantes básicamente lo contrario a la función “int”.

    Raw_input()


    Raw_input espera a que escribamos algo sobre él. En nuestro caso utilizamos dos, una que espere la medida de la base y otra, la medida de la altura. Ésta se encuentra dentro de float lo cual significa que no podemos introducir texto, si lo hacemos la consola nos lanzará error.

    If, else


    Con if podemos hacer condiciones, Si la condición se cumple (en nuestro caso lados < altura) entonces se imprimirá en pantalla el texto: “la medida de los lados debe ser mayor a la altura”, 
    Pero si no se cumple else que significa “de otro modo” o “de otro caso” pasará a ejecutarse. (En nuestro caso lo que hará es calcular el área y perímetro del triangulo).

    Operadores



    Category: 0 comentarios

    Firefox evitará que Flash cargue sin permiso del usuario por click

    ared Wein, uno de los ingenieros de la Mozilla Foundation publicó el anuncio que Firefox 14, la próxima versión de Firefox, no permitirá que Flash cargue en cada página que se abra hasta que el usuario de permiso explicito.

    La implementación está aprobada y el desarrollo ya va avanzado, la pregunta que queda es cómo será la interfaz. Las dos opciones son mostrar un cuadrado gris con el texto de clickear para activar (como abajo en la imagen) o una barra amarilla en el header del sitio web, avisando del contenido Flash y dando la posibilidad de activar. 

    Esta implementación será por URL y por elemento Flash. A menos que se cambie explicitamente en el about:config, todos los SWF requerirán permiso de click para correr


    ¿Qué significa esto para los desarrolladores en Flash y Actionscript 3?


    Hay 3 tipos de personas que se verán afectados por esta medida: Devs normales de Flash, creadores de banners y sitios que usan Flash de manera invisible. 

    Para el uso normal de Flash, no significa mucho


    A la gran mayoría de las personas que crean en Flash, lo único en lo que los afectará es un click adicional. Si tu sitio es 100% Flash, se verá gris antes que el usuario de el primer click. En algunos casos, esto puede ser imperdonable, en otros, no tan grave. 

    Aunque a nivel de usabilidad, cualquier click adicional es malo. 

    Para los creadores de banners: Hora de no usar Flash


    En un banner, un click adicional es inviable. Los banners son ultra optimizados para efectividad y rendimiento. Si un banner requiere un click adicional, muertos. PEro lo peor, si un banner NO SE VE sin darle click, ahí ya nos jodimos todos. Con esto, hacer banners en Flash no es rentable ya. 

    Para quienes usan Flash de manera invisible como "canal"


    Grooveshark usa Flash internamente para reproducir la música (Grooveshark no usa HTML5, aunque tienen unaversión HTML5). Pandora igual. El audio en HTML5 aun es muy malo (el video no, es genial). Otro ejemplo destacado es Socket.io, que usa Flash en navegadores que no soportan sockets para hacer realtime. Estos casos donde Flash es usado como un "canal invisible" son seriamente afectados. Porque al ser de 1px de tamaño, son Flash invisibles a los que no se les puede hacer click. 

    ¿Soluciones? No tengo ni idea. Hacer visible el SWF y agregar al diseño un "da click aquí para que funcione" es lo que se me ocurre. 


    ¿Para donde va Flash en los desktops?


    Repasemos. Flash ya será imposible correr en Windows 8 cuando esté activa la interfaz Metro. Igualmente Safari (aunque sólo se usa en móviles). Adobe abandonó el plugin para móviles y la nueva estrategia de Flash está centrada en el desarrollo de juegos.

    Para allá va Flash. Flash será la plataforma cross-device de juegos #1. Ya no una de experiencias interactivas al estilo de GrupoW, 2Advanced o BigSpaceShip, sino juegos móviles en teléfonos y tablets como Angry Birds, Machinarium o Draw Something. Mientras, todavía sirve.
    Category: 0 comentarios

    Listado con paginación en jsp con AJAX y SQL SERVER

    Hola a todos, hoy traigo un tutorial básico de un listado de registros de una Base de Datos en SQL Server 2008 utilizando jspjquery y css3. El listado se hace mediante procedimientos almacenados, así que veremos en primer lugar como podemos conectarnos a sql server 2008 desde jsp y como invocar a un procedimiento almacenado con parámetros desde jsp, y mostraremos los resultados utilizando la tecnología AJAX ( Jquery) y modificaremos el estilo para darle una mejor apariencia utilizando css3… así que manos a la obra.



    Crear una Base de Datos en sql Server


    En primer lugar lo que vamos a hacer es crear nuestra base de datos en sql server 2008, preferiblemente utilizando autenticación sql Server; así que escribimos en el analizador de consultas lo siguiente:

    Código :
    create database tutorial
    go
    use tutorial
    go
    


    Creamos la tabla CategoriaProductos:

    Código :
    create table CategoriaProductos
    (
    CodigoCategoriaProductos int not null identity(1,1),
    DescripcionCategoriaProductos varchar(50) not null,
    EstadoCategoriaProductos int
    
    constraint clavecategoria primary key (CodigoCategoriaProductos)
    
    )
    go
    


    Creamos la tabla Productos con referencia a la tabla CategoriaProductos:

    Código :
    create table Productos
    (
    CodigoProductos int not null identity(1,1),
    CodigoCategoriaProductos int ,
    DescripcionProductos varchar(50) not null,
    PrecioProductos decimal(9,2),
    SotckProductos int,
    EstadoCProductos int
    
    constraint claveproductos primary key (CodigoProductos),
    constraint claveforaneaproductos foreign key (CodigoCategoriaProductos)
    references CategoriaProductos(CodigoCategoriaProductos)
    )
    go
    


    Y debería quedarnos de esta manera:



    Una vez que hemos creado nuestras tablas, procedemos a llenarlas de algunos registros. Insertamos algunos registros en la tabla CategoriaProductos:

    Código :
    insert into CategoriaProductos values(‘Bebidas’,1)
    insert into CategoriaProductos values(‘Lacteos’,1)
    insert into CategoriaProductos values(‘Cereales’,1)
    


    Para ver los registros que acabamos de insertar en la tabla CategoriaProductos:

    Código :
    select * from CategoriaProductos
    go
    




    Ahora insertamos algunos registros en la tabla Productos:

    Código :
    insert into Productos values(1, ‘Inka Kola 2 Lts’,3.5, 200,1)
    insert into Productos values(1, ‘Pepsi 1 Lt.’,3, 100,1)
    insert into Productos values(2, ‘Leche Pura Vida’,2.5, 400,1)
    insert into Productos values(2, ‘Leche Anchor’,2, 200,1)
    insert into Productos values(2, ‘Leche Gloria deslactozada’,3, 100,1)
    insert into Productos values(3, ‘Arroz Paisana 1 Kg.’,3.5, 50,1)
    insert into Productos values(3, ‘Arroz Costeño 1Kg.’,3, 50,1)
    insert into Productos values(3, ‘Cereales Angel 1Kg.’,4, 50,1)
    


    Ahora vemos los registros que acabamos de ingresar:
    select * from Productos



    Ahora pasamos a crear el procedimiento almacenado que me lista los Productos:

    Código :
    create procedure sp_gen_s_productos
    @RegistrosAMostrar int,
    @RegistrosAEmpezar int
    as
    
    SELECT TOP (@RegistrosAMostrar)* FROM
    (
    select p.CodigoProductos as codigo, p.DescripcionProductos as descripcion,cp.DescripcionCategoriaProductos as categoria,
    p.PrecioProductos as precio,p.SotckProductos as stock,
    ROW_NUMBER() OVER (ORDER BY p.CodigoProductos ) AS num
    
    from Productos p
    inner join CategoriaProductos cp on p.CodigoCategoriaProductos=cp.CodigoCategoriaProductos
    
    )
    AS a
    WHERE num > @RegistrosAEmpezar
    


    Para probar lo ejecutamos:

    Código :
    exec sp_gen_s_productos 3,0
    


    Nos debe salir lo siguiente:




    Crear un proyecto jsp


    Como entonces ya creamos nuestra base de datos con las tablas correspondientes para el ejemplo, ahora procedemos a crear un proyecto jsp en la IDE que utilizaremos para este ejemplo , que es Net Beans. Ustedes pueden utilizar la que gusten pero el proyecto tendrá la siguiente estructura:



    Los resaltados con amarillo, son los directorios y archivos que debemos crear, como sabemos en netbeans , el resto de archivos se crea por defecto, así que para crear el proyecto en Net Beans nos vamos a la ficha archivo, click en Proyecto nuevo, en categorías seleccionamos Java Web y Proyectos seleccionamos Web Application, click en siguiente y colocamos un nombre a nuestro proyecto y lo guardamos en la ruta que deseemos, click en siguiente y luego en terminar.

    Para empezar a crear nuestros directorios damos click derecho sobre la carpeta Web Pages, luego click ennuevo y luego en carpeta y así vamos creando las carpetas hasta tener la estructura de la imagen anterior, luego en la carpeta CSS hacemos click derecho y elegimos la opción nuevo y luego elegimos Hoja de estilo en cascada (CSS) y le ponemos de nombre estilo.

    Una vez que hemos hecho esto, el siguiente paso es descargarnos el archivo de jquery aquí, ojo, si descargan una versión distinta a la que yo utilicé, sólo tienen que cambiar la referencia en el index por la versión que ustedes hayan descargado. Hasta hoy la última versión es jquery-1.7.2.min.js, entonces ese archivo lo descargamos y copiamos a la carpeta js de nuestro proyecto. Asimismo también damos click derecho en la carpeta js y elegimos nuevo, luego elegimos archivos de Java Script y lo llamamos funciones. Para tener toda la estructura lista y empezar con el proceso, descargamos la siguiente imagen y la copiamos en la carpeta images.

    Una vez que hemos hecho todo lo anterior procedemos a descargar el proyecto que necesitamos para conectarnos y donde están los métodos de consulta a la Base de datos, así como también el driver necesario para conectarme a SQL SERVER 2008. Podemos descargarlo aquí, descargamos y descomprimimos las dos carpetas en la carpeta raíz de nuestro proyecto.

    En el explorador de windows copiamos las dos carpetas driver sql y jdbc y debe ver así:



    Ahora en el Net Beans nos vamos a abrir proyecto y seleccionamos el archivo jdbc de la carpeta de nuestro proyecto:



    …y hacemos click en abrir proyecto. Doble click en el archivo ConectaDB.java del proyecto jdbc y cambiamos los parámetros necesarios para conectarnos: el primer parámetro driver, es la regla del driver que utilizaremos para conectarnos que lo agregaremos después, el segundo la cadena de conexión que para este caso será mediante un dsn que crearemos luego de nombre dsnProductos, lo siguiente es el usuario de sql y luego su contraseña.

    Una vez que hemos modificado estos valores hacemos click derecho en el proyecto jdbc y elegimos limpiar y construir:

    Ahora vamos a crear el dsn de usuario que nos permitirá conectarnos a la base de datos, para esto nos vamos a panel de control:



    En el panel de control donde dice ver por, seleccionamos iconos pequeños y luego elegimos la opción Herramientas Administrativas.



    Luego elegimos la opción Origenes de Datos ODBC.


    Y se abre la siguiente pantalla:



    damos click en agregar:


    seleccionamos sql server y click en finalizar


    Escribimos en nombre del dsn, una descripción y el servidor , para este caso local y click en siguiente:


    Escribimos nuestro usuario de sql server y la contraseña y click en siguiente:


    Seleccionamos la db a la cual nos queremos conectar y click en siguiente:


    Click en finalizar.


    Click en probar origen de datos.


    Si todo estuvo bien sale esta imagen, click en aceptar.


    Como vemos nuestro DSN de usuario(dsnProductos) ha sido creado.

    Lo siguiente que vamos a hacer es agregar el proyecto jdbc y la librería para conectarnos a sql server a nuestro proyecto turorialJSP, entonces click derecho en el nombre del proyecto y elegimos propiedades.


    Click en libraries.


    Click en add project para agregar el proyecto jdbc.


    Seleccionamos el proyecto jdbc que hicimos las modificación de conexión y que está dentro de nuestro proyecto tutorialJSP y le damos click en Agregar al proyecto archivos JAR.


    Aquí ya aparece el proyecto jdbc agregado ahora hacemos click en add library.


    Click en crear.


    Le ponemos en nombre mssql_conect y hacemos click en aceptar.


    Click en agregar archivo JAR/Carpeta.


    Buscamos el archivo sqljdbc4 que está dentro de la carpeta driver sql en la carpeta raíz de nuestro proyecto tutorialJSP y le damos click en Agregar archivo JAR/Carpeta.


    Click en Aceptar.


    Como se creo la librería de nombre mssql_conect, ahora hacemos click en añadir biblioteca.


    Click en aceptar.


    Si desplegamos la carpeta libraries de nuestro proyecto vemos las librerías que acabamos de agregar.

    Ahora que ya tenemos nuestras librerías necesarias ya agregadas, procedemos a programar cada uno de los archivos, empezaremos programando el archivo estilo.css de la carpeta css que nos va a permitir mejorar la apariencia de nuestra página:

    estilo.css

    Código :
    body {
    background-color:#F2F2F2;
    font-family: verdana,arial;
    font-size: 14px;
    }
    
    a{
    color:#DF7401;
    text-decoration: none;
    }
    a:hover{
    color:#FFFF00;
    }
    
    #bienvenida
    {
    background-color: #F5F6CE;
    border: 1px solid #FFBF00;
    border-radius:5px;
    color:#FF8000;
    margin: 0px auto;
    padding:10px 0 0 0;
    text-align: center;
    
    }
    
    #menu{
    background: #00BFFF;
    border:1px solid #01A9DB;
    border-radius: 5px;
    border-bottom-right-radius: 100px;
    border-bottom-left-radius: 100px;
    height: 50px;
    margin:0 auto;
    width:50%;
    -webkit-border-radius: 5px;
    -webkit-border-bottom-right-radius: 100px;
    -webkit-border-bottom-left-radius: 100px;
    -moz-border-radius: 5px;
    -moz-border-radius-bottomright: 100px;
    -moz-border-radius-bottomleft: 100px;
    
    }
    
    li{
    color:#fff;
    cursor:pointer;
    font-size:15px;
    float:left;
    list-style: none;
    margin-left: 40px;
    
    }
    li:hover {
    color:#F4FA58;
    font-weight: bold;
    
    }
    #contenedor{
    background-color:#fff;
    border:1px solid #BDBDBD;
    margin: 20px auto;
    min-height: 300px;
    -webkit-border-radius: 5px;
    -moz-border-radius: 5px;
    border-radius: 5px;
    width: 70%;
    
    text-align: center;
    
    }
    .paginadoractivo{
    padding:5px 10px 5px 10px;
    font-family: “Trebuchet MS”, Arial, Helvetica, sans-serif;
    font-size:14px;
    background-color:#F5DAA0;
    color:#000000;
    border:0.5px solid #000000;
    cursor:pointer;
    }
    .paginador{
    padding:5px 10px 5px 10px;
    font-family: “Trebuchet MS”, Arial, Helvetica, sans-serif;
    font-size:14px;
    background-color: #E7F7FF;
    color:#000000;
    border:0.5px solid #333333;
    cursor:pointer;
    
    }
    .paginador:hover{
    padding:5px 10px 5px 10px;
    font-family: “Trebuchet MS”, Arial, Helvetica, sans-serif;
    font-size:14px;
    background-color:#73ADD6;
    color: white ;
    border:0.5px solid #333333;
    cursor:pointer;
    }
    .tablita
    {
    font-size: 12px;
    width:90%;
    text-align: left;
    margin:0 auto;
    border: 1px solid #E6E6E6;
    border-collapse: collapse;
    font-family: “Trebuchet MS”, Arial, sans-serif;
    color: #ffffff;
    }
    .tablita caption
    {
    font-size: 16px;
    font-weight: normal;
    padding: 5px;
    /* background: #73ADD6 url(‘../images/fon_perfil.gif’) repeat-x;*/
    border-right: 1px dotted #06C ;
    background: #084B8A;
    color: #FFFFFF;
    -webkit-border-top-left-radius: 10px;
    -webkit-border-top-right-radius: 10px;
    -moz-border-radius-topleft: 10px;
    -moz-border-radius-topright: 10px;
    border-top-left-radius: 10px;
    border-top-right-radius: 10px;
    }
    .tablita th
    {
    font-size: 13px;
    font-weight: normal;
    padding: 5px;
    /* background: #73ADD6 url(‘../images/fon_perfil.gif’) repeat-x;*/
    border-right: 1px dotted #06C ;
    background: #084B8A;
    color: #FFFFFF;
    }
    .tablita td
    {
    padding: 4px;
    color: #086A87;
    
    }
    .tablita tfoot tr td
    {
    font-size: 12px;
    color: #ffffff;
    }
    .tablita tbody tr:hover td
    {
    /* background: #FCFDFE; */
    color:saddlebrown;
    background: #E0F8F7;
    }


    Ahora procederemos a codificar nuestro archivo Index:

    index.jsp
    Código :
    <%@page contentType=”text/html” pageEncoding=”UTF-8″%>
    
    
    
    
    
    
    
    
    JSP Page
    
    
    

    Bienvenidos a este tutorial JSP- MSSQL SERVER 2008 – JQUERY -CSS

    • Inicio
    • Listado
    • Registro

    Aqui se mostrara el listado de productos




    Ahora procedemos a codificar el código de la función listarProductos en el archivo funciones.js que se encuentra en la carpeta js de nuestro proyecto:

    funciones.js
    Código :
    function listaproductos(pagina){
    var rnd = Math.random()*11;
    
    $.post(“lib/listado.jsp”,{
    rnd:rnd,
    pagina:pagina
    },function(data){
    $(“#contenedor”).html(data);
    });
    }
    

    Por último codificamos el archivo jsp que nos realiza el listado y el que recibe la variable pagina por el método post en jquery, este archivo se encuentra en la carpeta lib de nuestro proyecto:

    listado.jsp

    Código :
    <%–
    
    Document : listado
    Created on : 31/03/2012, 02:28:29 PM
    Author : Jose Garcia
    –%>
    
    <%@ page import=”java.util.Vector, jdbc.*” %>
    <%@page contentType=”text/html” pageEncoding=”UTF-8″%>
    <%
    
    out.println(“
    
    ”);
    
    out.println(“”);
    out.println(“”);
    out.println(“”);
    out.println(“”);
    out.println(“”);
    out.println(“”);
    out.println(“”);
    out.println(“”);
    
    out.println(“”);
    out.println(“”);
    int RegistrosAMostrar=4;
    int PaginasIntervalo=3;
    int RegistrosAEmpezar=0;
    int PagAct = 1;
    String pag = request.getParameter(“pagina”);
    if (pag==null || pag==”"){
    RegistrosAEmpezar=0;
    PagAct=1;
    }else{
    RegistrosAEmpezar=(Integer.valueOf(pag).intValue()-1)* RegistrosAMostrar;
    PagAct=Integer.valueOf(pag).intValue();
    }
    %>
    <%
    Vector productos = Sql.consulta(“exec [sp_gen_s_productos] @RegistrosAMostrar=’”+RegistrosAMostrar+”‘,@RegistrosAEmpezar=’”+RegistrosAEmpezar+”‘”);//nos permite ejecutar un sp con parametros para la paginacion
    for (int fils = 1; fils < productos.size(); ++fils) { //recorre el vector productos con los resultados del metodo Sql.consulta
    String[] unaFila = (String[]) productos.get(fils);
    %>
    
    
    <%
    
    } %>
    <%
    String NroRegistros = Sql.getCampo(“select count(*) from Productos p “
    + ” inner join CategoriaProductos cp on p.CodigoCategoriaProductos=cp.CodigoCategoriaProductos”);// obtengo la cantidad de registros actuales
    int PagAnt=PagAct-1;
    int PagSig=PagAct+1;
    
    double PagUlt=Integer.valueOf(NroRegistros).intValue()/RegistrosAMostrar; //calculo cuantas paginas tendra mi paginacion
    int Res=Integer.valueOf(NroRegistros).intValue()%RegistrosAMostrar;
    if(Res>0){
    PagUlt=Math.floor(PagUlt)+1;
    }
    
    out.println(“”);
    out.println(“
    LISTADO DE PRODUCTOS
    CodigoProductoCategoriaPrecioStock
    <%=unaFila[0]%> <%=unaFila[1]%> <%=unaFila[2]%> <%=unaFila[3]%> <%=unaFila[4]%>
    ”); //principio del paginador out.println(“
    ”); if(PagAct>(PaginasIntervalo+1)) { out.println(“<< Primero”); out.println(“ ”); } for ( int i = (PagAct-PaginasIntervalo) ; i <= (PagAct-1) ; i ++) { if(i>=1) { out.println(“”+i+””); out.println(“ ”); } } out.println(“”+PagAct+””); out.println(“ ”); for ( int i = (PagAct+1) ; i <= (PagAct+PaginasIntervalo) ; i ++) { if(i<=PagUlt) { out.println(“”+i+””); out.println(“ ”); } } if(PagAct<(PagUlt-PaginasIntervalo)) { out.println(“Ultimo >>”); } out.println(“
    ”); //fin del paginador %>


    Si hemos hecho todo bien cuando hacemos click en listado de la pagina index.jsp nos aparecerá el listado en el div contenedor con su respectiva paginación y nos mostrará 4 registros por página cuando hacemos click en los números de páginas (si queremos que nos muestre más registros por página cambiamos el valor de la variable RegistrosAMostrar en la pagina listado.jsp) y se mostrará de la siguiente manera:

    Primera página del paginador:


    Segunda y última pagina del paginador


    Espero que este tutorial les haya sido de gran ayuda

    Gracias por la atención brindada ..hasta otra oportunidad
    Category: 0 comentarios