Weblog de Victor Ramirez

Miércoles, diciembre 12, 2007

Aplicaciones Web en Netbeans con DB2

Filed under: db2, glassfish, java, netbeans, web — Etiquetas: , , , , , , — vramirez @ 12:11 PM

Desde el primer RC (release Candidate), incluso desde las versiones Beta, ya le venia “siguiendo el rastro” a la salida de NetBeans 6.0. Sus ejemplo, funciones y características que sin duda lo convertirán, a corto plazo, en un poderoso y múltiple entorno. Aunque orientado a Java principalmente, no es lo único que ofrece, ya que cuenta con diferentes módulos y plugins para trabajar con otros lenguajes (Ruby, PHP, C/C++, etc). Volviendo al tema razón de ser de este artículo, desde las primeras versiones de Netbeans 6 intenté hacer una aplicación web sencilla que a través de un componente visual (JSF), una tabla en este caso, pudiera visualizar elementos de una tabla en DB2. Sin embargo nunca (hasta ahora) habia podido hacerlo correctamente. Al desplegar la aplicación obtenía resultados extraños. En las primeras versiones, al parecer los drivers JDBC de DB2 no estaban soportados por la herramienta cosa que por suerte ha cambiado. Sin embargo , un error aún salía en los logs del servidor, al parecer la libreria db2jcct2.dll es necesaria para compltar satisfactoriamente la conexión y no se incluye en los jars JDBC de DB2. La razón para utilizar DB2 es que es una base de datos robusta, que dia a dia ofrece grandes beneficios en aspectos como seguridad, rapidez y alta disponibilidad, y aún más; posee una versión gratis, denominada DB2 Express, la cual actualmente marcha por la versión 9.5, que como lo indica en su página. No tiene límites (procesadores, memoria..etc), solo los datos (tu espacio en disco duro). A continuación explicaré, como conectar satisfactoriamente DB2 con Netbeans 6:
Primero creamos la conexión con DB2 desde Netbeans 6.0. Netbeans a diferencia de Java Studio Creator se ha desatado de la función embebida de traer los drivers y realizar todas las tareas requeridas para conectarse correctamente. Es un poco más complicado pero permite tener mayor control sobre la aplicación ya que podemos escoger a nuestro gusto o necesidad los componentes del driver.
1. Asegurarse de que la base de datos esté arriba.
2. Creamos un nuevo proyecto Web en Netbeans utilizando el framework “Visual Web Java Server Faces”. (yo lo denominé: WebTest1).
3. Dentro de Netbeans en la pestaña que dice Services: DataBases – > Drivers, Haga click derecho en la palabra Driver —
> New Driver…

4. A continuación se abre un cuadro de diálogo:



5. Le damos click en “add” (Agregar) y escogemos los 2 archivos drivers jdbc.

DB2 utiliza los archivos db2jcc.jar y db2jcc_license_cu.jar para conectar cualquier aplicacion JDBC. Cabe resaltar que desde la version 9 de DB2, también está disponible un tercer archivo llamado db2jcc4.jar el cual incluye las funcionalidades de JDBC 4.0 y su antecesor (JDBC 3.0). IBM recomienda no utilizar db2jcc y db2jcc4 juntos, es decir son disyuntivos. Los archivos se encuentran en el directorio SQLLIBJava de la carpeta de IBM que se escogió para la instalación de DB2. En mi caso queda el driver queda conformado asi:


El nombre lo genera Netbeans, de acuerdo con la información que obtiene de los jar’s, aunque se puede personalizar para identificarlo mejor. Lo importante es que en el campo “Driver Class” este la clase com.ibm.db2.jcc.DB2Driver, sino está le damos “Find” y Netbeans buscará dentro de el (los) jar(s) que le hayamos dado nosotros y nos mostrará en “Driver Class” una lista de las posibles clases que podemos utilizar dependiendo del driver.

Luego de dar OK, y ya tenemos configurado el driver de DB2 con netbenas. Sin embargo no tenemos aún una conexión real con la base de datos. Digamos que ya armamos el barco, falta remar hasta la otra orilla. En la lista de drivers ya aparece el nuevo, ahora nos conectamos a la base de datos.


6. Damos click derecho sobre el y seleccionamos “Connect Using”, se abre un nuevo cuadro de diálogo en que nos pide la forma de conectarnos a la base de datos host o direccion IP, puerto y nombre de la base de datos, además del usuario y contraseña que tengamos. Luego de digitar estos datos, nos vamos a la ficha “Advanced” y damos click en Get Schemas y seleccionamos el esquema en que se encuentran las tablas. En mi caso el esquema se llama ” y “SCH”.


Ahora si damos click en “OK”, y observamos que en el nodo Databases aparece nuestra nueva conexion:

7. Abrimos la pagina .jsp del proyecto llamada Page1.jsp, y nos ponemos en vista de diseño. Estando ahi seleccionamos de la paleta de JSF una tabla y la arrastramos hasta la pagina page1.jsp.


8. Abrimos el nodo de nuestra conexion y estamos en un ambiente parecido al de nuestra base de datos, donde observamos las tablas, vistas y procedimientos (si disponemos de ellos en nuestra base de datos)

9. Selecionamos la tabla (en mi caso TABLE1) y la arrastramos de igual forma hasta la pagina. Netbeans automaticamente craerá un rowset en el SessionBean1 (si no existe) y un Cachedrowsetdataprovider generado asi nombre_de_tabladataprovider.

10. Aún en la vista de sieño, nos vamos a la tabla JSF y hacemos click dercho->bind to data, seleccionamos el dataprovider de la tabla, que acabamos de agregar a la pagina y de igual forma las columnas de la tabla en DB2, que queremos visualizar:



En mi caso, mi tabla solo tiene 2 campos un entero de nombre CODIGO y un varchar de nombre TEXTO. Depues de dar click en OK, nos queda la tabla parecida a esta:



Normalmente seria solo darle “Run” y esperar que salga la tabla, pero me he dado cuenta que no es asi. Si le damos ejecutar inmediatamente en Mozilla sale la página en blanco, ientras que en explorer sale algo de código html referente a la tabla JSF. Al revisar los logs de Glassfish osbervé constantemente este mensaje:

com.ibm.db2.jcc.b.SqlException: [jcc][10389][12245][3.50.152] Failure in loading native library db2jcct2, java.lang.UnsatisfiedLinkError: no db2jcct2 in java.library.path: ERRORCODE=-4472, SQLSTATE=null

y a continuación de el un stack trace espantoso. Resulta que los señores de IBM requieren otro archivo para conectarse (oootro?? si, otro…). existe una libreria nativa de DB2 llamada db2jcct2.dll que es necesaria de incluir. Vamos a la carpeta de IBM donde instalamos DB2 (ojo, no donde reside la base de datos). En mi caso dicho archivo se encontraba en: C:Archivos de programaIBMSQLLIBBIN, simplemente lo copiamos a la carpeta “lib” del servidor ubicada en C:Archivos de programaglassfish-v2lib.
Nota: Si tu servidor estaba iniciado es necesario que lo reinicies despues de copiar el archivo.

bon despliegue!!! :D


32 comentarios »

  1. hola que tal tu blog esta genial muy explicado pero tengo una duda ami solo me aparecen:

    private CachedRowSetDataProvider cachedRowSetDataProvider1 = new CachedRowSetDataProvider();

    public CachedRowSetDataProvider getCachedRowSetDataProvider1() {
    return cachedRowSetDataProvider1;
    }

    public void setCachedRowSetDataProvider1(CachedRowSetDataProvider crsdp) {
    this.cachedRowSetDataProvider1 = crsdp;
    }

    en mi page1 y no en sessionbean como explicas puedes decirme en que estoy mal por favor

    Comentario por Laura Patricia — Martes, abril 1, 2008 @ 3:25 PM

  2. Hola laura, disculpame me faltó explicar que el rowset se genera en el SessionBean, pero el dataprovider si se genera en la página. Vas bien.

    Comentario por Victor Manuel Ramirez — Jueves, abril 3, 2008 @ 1:17 PM

  3. En realidad esta muy bien tu explicacion, pero aun tengo instalada la versión 5.5 de Netbeans, el detalle es que no encuentro los drivers que cargas al comenzar, ¿es por la version? ¿Debo instalar la versión 6 del Netbeans?

    Saluditos afectuosos

    Comentario por Juan Carlos Canto — Miércoles, junio 4, 2008 @ 10:53 AM

  4. Hola, juan carlos, gracias. Te recomiendo que instales la nueva version: Netbeans 6.1. Los drivers que utilizo vienen dentro de DB2, los encontrarás en una carpeta llamada “java”, dentro de “sqllib”.

    Comentario por vramirez — Miércoles, junio 4, 2008 @ 11:00 AM

  5. Sinceramente esta muy pero muy bueno lo que publicaste,
    muy bien explicado, todo lo que dices aca funciona,
    Gracias por tu grandisima ayuda,
    talvez cualquier pregunta que tenga puedas contestarla.

    Comentario por Francisco — Miércoles, junio 4, 2008 @ 11:27 AM

  6. Gracias por el comentario, francisco. Cualquier duda, por acá siempre a la orden.

    Comentario por vramirez — Miércoles, junio 4, 2008 @ 11:43 AM

  7. la verdad felicitaciones, esta muy buena la publicacion, el tema es q yo tengo un problema al especificar el url de la database,creo q el problema se origina en el campo [DATABASE], pero la verdad como no se muchoo mas no te podria decir, me das una mano por favor, gracias por la publicacion adios

    Comentario por gabriel — Martes, julio 8, 2008 @ 10:11 AM

  8. tengo una pregunta, antes quisiera felicitarte por el tutorial, estoy realizando faces como lo explicas en el tutorial, pero deseo hacer filtros, osea que la vista de la tabla se refresque dinamicamente al seleccionar un criterio en una dropdownlist quisas me puedas colaborar con algo de infrmacion, he leido y me doy cuenta que esto se hace en un metodo de la droplist
    public void droplist1_processValueChange(ValueChangeEvent event)
    pero parece no sevirme, creo que aun me falta algo

    Comentario por felipe — Lunes, julio 14, 2008 @ 9:59 PM

  9. Gabriel, lamento haberme demorado, pero la verdad he estado muy ocupado últimamente. el url deñl jdbc de DB2 es: jdbc:db2://servername:port/dbname donde serv ername es el nombre o ip del equipo en que esta alojada la base de datos, port el numero del puerto por el que escucha (por default es el 50000) y dbname es el nombre que tiene la base de datos que creaste.

    Felipe, gracias por tu comentario. Respecto a tu inquietud, intenta lo sgte: haz click derecho sobre el dropdown y selecciona la opción que dice “auto-submit on change”. Si esta opción no se marca, nunca se ejecutará lo que coloques en el evento. Inténtalo y me cuentas. Buena suerte!!!

    Comentario por vramirez — Martes, julio 15, 2008 @ 11:21 PM

  10. Con el ejemplo anterior, si yo quisiera filtrar por del codigo
    en un Text Field, si yo ingresara 1 en Text Field que obtenga la informacion relacionado con el codigo 1.

    Por favor, Mil gracias

    Comentario por Gomez — Lunes, septiembre 1, 2008 @ 5:54 PM

  11. Buen dia.

    Necesito ayuda por favor

    Ya llevo investigando por mucho tiempo a mi problema, no encontrado la solucion. (Soy nuevo)

    Necesito filtrar para mostrar esa informacion en una tabla

    en el diseño arrastre una Tabla, TextField, Boton
    Arrastre una tabla de la base de datos en la Tabla del diseño, En sessionBeans Tengo un RowSet con Select * from MITABLA, Modifique en criteria Ahora queda Select * from Where ID = ?, como hago el filtro.
    al presionar boton necesito que tome lo que hay en TexField y que me muestre los datos relacionados al ID que esta en TextField.

    Por Favor
    Mil Gracias.

    Comentario por Gomez — Jueves, septiembre 4, 2008 @ 1:20 PM

  12. Gracias por visitar este blog. He estado preparando un tutorial que contiene esta parte, pero tuve un inconveniente con mi maquina y me he retrasado. Sin embargo, espero que este listo para este fin de semana, pero te puedo adelantar algo: el rowset necesita que le pases los parammetros para reemplazar los ?’s. Esto lo haces asi: nombredelrowset.setObject(n,var); donde n es el numero del parametro y var es una variable tipo String con el valor. Por ejemplo, si tienes un rowset llamado rowsetPersonas y el query que contiene es SELECT * FROM PERSONAS WHERE ID = ? debes hacer lo sgte.
    String cod=”0001″;
    rowsetPersonas.setObject(1,cod);
    Luego debes refrescar el dataprovider que esta asociado a ese rowset. personasDataProvider.refresh();

    Espero que te haya dado una idea. Mucha suerte y no te desanimes.

    Comentario por vramirez — Viernes, septiembre 5, 2008 @ 6:59 AM

  13. Mil Gracias por la respuesta.

    Creo que tengo un problema con el conector JDBC

    ESTE ES MI CODIGO:
    public String button1_action() {
    String cod = (String) this.textField1.getText();
    getSessionBean1().getJbpm_variableinstanceRowSet().setObject(1, Cod);
    this.jbpm_variableinstanceDataProvider.refresh();
    return null;
    }
    catch (SQLException ex) { Logger.getLogger(Page1.class.getName()).log(Level.SEVERE, null, ex);
    return null;
    }
    }

    Verson de NetBeans 6.0.1
    La version de Mysql es 5.0.45
    El Conector es: mysql-connector-java-5.0.8
    Y me conecto por medio de OBDC

    DA EL SIGUIENTE ERROR:
    05-sep-2008 12:29:42 com.sun.faces.lifecycle.LifecycleImpl phase
    ADVERTENCIA: executePhase(RENDER_RESPONSE 6,com.sun.faces.context.FacesContextImpl@1272a1) threw exception
    com.sun.rave.web.ui.appbase.ApplicationException: java.sql.SQLException: No value specified for parameter 1
    at com.sun.rave.web.ui.appbase.faces.ViewHandlerImpl.cleanup(ViewHandlerImpl.java:594)
    at com.sun.rave.web.ui.appbase.faces.ViewHandlerImpl.renderView(ViewHandlerImpl.java:325)
    at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:106)
    at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251)
    at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:144)
    at com.sun.faces.extensions.avatar.lifecycle.PartialTraversalLifecycle.render(PartialTraversalLifecycle.java:106)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:245)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at com.sun.webui.jsf.util.UploadFilter.doFilter(UploadFilter.java:267)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
    at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:857)
    at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:565)
    at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1509)
    at java.lang.Thread.run(Thread.java:619)
    Caused by: java.lang.RuntimeException: java.sql.SQLException: No value specified for parameter 1
    at com.sun.data.provider.impl.CachedRowSetDataProvider.setCursorRow(CachedRowSetDataProvider.java:404)
    at com.sun.data.provider.impl.CachedRowSetDataProvider.setCursorIndex(CachedRowSetDataProvider.java:361)
    at com.sun.data.provider.impl.CachedRowSetDataProvider.getRowCount(CachedRowSetDataProvider.java:701)
    at com.sun.webui.jsf.component.TableRowGroupBase.getRowKeys(TableRowGroupBase.java:552)
    at com.sun.webui.jsf.component.TableRowGroupBase.getFilteredRowKeys(TableRowGroupBase.java:185)
    at com.sun.webui.jsf.component.TableRowGroupBase.getRowCount(TableRowGroupBase.java:495)
    at com.sun.webui.jsf.component.Table.getRowCount(Table.java:326)
    at com.sun.webui.jsf.renderkit.html.TableRenderer.renderTitle(TableRenderer.java:416)
    at com.sun.webui.jsf.renderkit.html.TableRenderer.encodeBegin(TableRenderer.java:138)
    at javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:785)
    at com.sun.webui.jsf.component.Table.encodeBegin(Table.java:1079)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:884)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:892)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:892)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:892)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:892)
    at javax.faces.component.UIComponent.encodeAll(UIComponent.java:892)
    at com.sun.faces.application.ViewHandlerImpl.doRenderView(ViewHandlerImpl.java:244)
    at com.sun.faces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:175)
    atcom.sun.rave.web.ui.appbase.faces.ViewHandlerImpl.renderView(ViewHandlerImpl.java:320)

    EN LA OPCION DE DAR CLICK DERECHO (RUN QUERY) DA EL SIGUIENTE ERROR:

    the JDBC driver does not provide the capabilities required for this feature.

    No se que estoy haciendo mal.

    gomezcos@gmail.com
    Gracias por tu tiempo.

    Comentario por Gomez — Viernes, septiembre 5, 2008 @ 1:35 PM

  14. Perdon utilizo no utilizo el Odbc
    Solo el JDBC

    Comentario por Gomez — Viernes, septiembre 5, 2008 @ 2:19 PM

  15. Hola tengo un problema al conectar con SQL Server 2005 ya instale el controlador, aparace dentro de netbeans pero cuando quiero conectarme sale un error de host.
    tambien cree un odbc en windows pero nada.
    Cual sera la razon podrian ayudarme

    Comentario por Eddier — Domingo, septiembre 28, 2008 @ 2:35 PM

  16. Hola tengo el mismo problema cuando tengo que conectar a mysql las tablas no salen en el navegador sera que falta una libreria como pasa en db2 y donde la consigo para donde colocarla.
    Gracias por la colaboracion.

    Comentario por rafael — Martes, octubre 28, 2008 @ 3:06 PM

  17. Me sirvio mucho tu tutorial.

    Gracias.

    Comentario por Bruce — Viernes, noviembre 7, 2008 @ 1:23 PM

  18. hola disculpa lamlestia pero a la mejor mi pregunta es super tonta pero soy nueva en db2 y me urge saber como crear tablas en db2 express me da pena no tiene nada q ver pero en verdad me urge y supongo que tu sabras “lo que tengo q hacer es crear una base de datos en db2 y exportarla a excel perdon mi ignorancia espero q me puedas ayudar es q busco y busco y no encuentro “

    Comentario por adriana — Viernes, noviembre 21, 2008 @ 7:00 PM

  19. oye excelente tu publicacion ayuda bastante pero ahora tengo una pregunta como haria si yo quiero ejecutar un where en la sentencia sql… es decir que no me agrege todos los datos a la tabla si no que tenga una condicion… si sabes alguna manera te agradeceria o si sabes como agrgar los datos a mi tabla manualmente, cualquier forma me serviria, agradeceria cualquier ayuda este es mi correo (gjmm1711@hotmail.com)

    Comentario por Gabriel — Domingo, noviembre 23, 2008 @ 7:11 PM

  20. Como puedo llamar un procedimiento de MySQL desde NetBeans

    Comentario por Jose Caloca — Jueves, noviembre 27, 2008 @ 10:27 PM

  21. Hola Jose, gracias por postear tu pregunta, desafortunadamente no tengo mayor alcance en MySQL, sugiero que revises la documentación del sitio de MySQL: http://dev.mysql.com

    Comentario por vramirez — Lunes, diciembre 8, 2008 @ 11:40 PM

  22. el problema con que no carga el componente luego de ponerlo es mas sencillo de solucionar solo basta con darle click derecho y ADD BINDING ATRIBUTE

    CON ESO EL COMPONETE APARECERA DESDE LA PRIMERA VEZ QUE EJECUTAMOS
    LA APLICACION WERB

    Comentario por Oscar — Miércoles, diciembre 24, 2008 @ 12:01 PM

  23. hola disculpa podrias postearl algo referente a formularios web con base de datos muchas gracias

    Comentario por yazbk — Martes, abril 21, 2009 @ 5:01 PM

  24. hola gracias me sirvio muchisimo tengo q aser un proyecto con DB2 eso si ocupe netbeans 6.5 la ultima parte cambia un poco aunq es bastante intuitiva saludos y muchas gracias

    Comentario por dante medina — Miércoles, abril 29, 2009 @ 1:28 AM

  25. no te entiendo
    mas detallado

    Comentario por manuel cordova — Sábado, julio 31, 2010 @ 5:02 PM

  26. Hola amigo sabes seleccionar registros de la tabla y hacer cosillas con estos registros?

    Comentario por Davis — Martes, septiembre 7, 2010 @ 11:50 AM

  27. Hola amigo, muy bueno tu post,,, pero quisiera saber si se puede hacer lo mismo con las vistas, o como puedo hacerlo?? ya que he estado intentando y solo funciona con tablas.. Agradezco de antemano tu respuesta.Gracias

    Comentario por Priscila — Domingo, enero 30, 2011 @ 8:24 PM

  28. Hey There. I found your blog using msn. This is a
    very well written article. I will be sure to bookmark it and come back to read more of
    your useful info. Thanks for the post. I’ll definitely comeback.

    Comentario por billig til salg sommerhus i hillerød — Miércoles, diciembre 19, 2012 @ 5:45 PM

  29. Hello just wanted to give you a quick heads up. The text in your content seem to
    be running off the screen in Safari. I’m not sure if this is a formatting issue or something to do with browser compatibility but I thought I’d post to let you
    know. The design and style look great though! Hope you
    get the problem fixed soon. Kudos

    Comentario por hot sitz-bath — Viernes, febrero 8, 2013 @ 11:58 PM

  30. Greetings! Very helpful advice in this particular post!
    It is the little changes that make the most significant changes.
    Many thanks for sharing!

    Comentario por augenlasern — Miércoles, abril 17, 2013 @ 5:48 AM

  31. A fascinating discussion is worth comment. I do think that you ought to write more on this topic, it
    may not be a taboo matter but typically folks don’t talk about such issues. To the next! Kind regards!!

    Comentario por Karine — Miércoles, abril 17, 2013 @ 5:52 AM

  32. Intel’s i7 980X or 990X-Extreme are beastly units, featuring 64-bit architecture, Turbo-Boost and the Hyper-Threading technology seen since the days of the 478 Socket. However, you still need to sign documents and get them to where they need to go. Perhaps the biggest slot machine myth is that you always do poorly and lose in the long run because you do not make the maximum bet.

    Comentario por machine à sous — Viernes, abril 26, 2013 @ 10:02 AM


RSS feed for comments on this post. TrackBack URI

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

Blog de WordPress.com.

A %d blogueros les gusta esto: