Ejemplo Java EE: Una tienda Online

Continuando con la presentación de seguridad en aplicaciones web, aplicado especialmente a Java EE voy a presentar un proyecto que he llevado a cabo este año, un proyecto que se podría acercar bastante a un ejemplo real con Java EE. Una tienda Online.

El proyecto comenzó siendo una asignatura de la universidad, pero conforme fue avanzando me fui involucrando más en ello y fue adquiriendo unas dimensiones que fácilmente acercarían a la aplicación a algo cada vez más orientado a algo real.

Al acabar el curso el profesor de la asignatura, Abraham Otero Quintana me propuso perfeccionar el proyecto con la intención de que fuera útil a mucha más gente, que fuera un ejemplo más avanzado de lo que se suele encontrar en los manuales.

La aplicación

El proyecto consiste en una aplicación web Java EE que cumple con las funciones de una tienda online. Consiste en una web en la que los usuarios pueden adquirir una serie de productos y posteriormente realizarán el pago (no se ha implementado ninguna pasarela de pago). Los usuarios de la tienda podrán ser usuarios sin registrar o se podrán registrar en la aplicación, lo que les evitará tener que rellenar sus datos; a la vez que les permitirá dejar comentarios sobre los productos.

Como cualquier aplicación del estilo que se precie dispone de una zona de administración únicamente accesible a usuarios con derechos de administración. En dicha zona se podrá gestionar los productos en venta, los usuarios de la aplicación registrados y también consultar el historial de ventas, con el que se generan una serie de gráficas estadísticas sobre las ventas; por último será posible gestionar los comentarios de los productos. Las características están más detalladas en la documentación.

En detalle

La aplicación basa su persistencia en el patrón DAO, por lo que es posible implementar varios métodos de persistencia. Por defecto se han implementado la persistencia contra bases de datos (MySQL) y persistencia contra ficheros serializados en disco.

Durante el desarrollo de la aplicación se ha prestado especial atención a varios aspectos: la seguridad, la concurrencia y finalmente un especial cuidado en la detección de fallos y errores en el funcionamiento del sistema.

En el aspecto de la seguridad nos encontraremos con que toda información enviada por el usuario es validada mediante una librería de seguridad (ESAPI), observaremos también que todo el sistema de URLs está preparado para que solo sea posible acceder a las páginas de la manera que se espera y no de otra manera. Encontraremos más información sobre las medidas tomadas en la documentación del proyecto.

En lo referente a la concurrencia se han hecho las clases encargadas de la persistencia siguiendo el patrón de diseño Singleton para que no sea posible tener más de una instancia de esa clase. En el caso de la persistencia contra ficheros se han tomado las medidas necesarias para asegurar que los archivos no sean corrompidos realizando escrituras simultáneas; así como en el caso de la persistencia contra bases de datos se ha usado un nivel de aislamiento adecuado para evitar la lectura de datos confirmados (READ COMMITED). Es de especial interés en lo que a concurrencia se refiere la manera en la que se hace la compra de un carrito y se disminuyen las unidades en el almacén.

Recursos

He decidido publicar el código fuente completo en un repositorio de google code, también dejo las sentencias SQL necesarias para crear la base de datos. He realizado también un escrito como documentación en el que se puede observar el funcionamiento más en detalle de la aplicación. Por último he realizado un videotutorial en el que se explica desde cero como montar la aplicación y todo lo necesario para que esta funcione.

Espero que os haya gustado y os haya ayudado este ejemplo de programación con Java EE. La publicación es totalmente desinteresada y con fines didácticos; si alguien estuviese interesado en utilizarlo para algún otro fin o seguir trabajando en ello me gustaría que me lo comunicase y se podrían publicar las mejoras.

Estoy abierto a cualquier duda al respecto ya sea con un comentario, contactando conmigo mediante el formulario de contacto o mediante los medios que se indican en la documentación o en Twitter.

Actualización: El artículo ha sido publicado en JavaHispano por Abraham Otero. Creo que es interesante ver los comentarios que se han publicado allí, entre otras cosas por anotaciones interesantes que se han hecho y que se hagan.

Actualización (28-marzo-2013): He publicado una actualización del código que modifica bastantes cosas y también he actualizado la documentación con ello, y es la versión 2 de la documentación.

Actualización (28-marzo-2013): Instrucciones para usar Tomcat y persistencia con Postgres. La configuración de la base de datos para Postgres la he añadido en la sección de los recursos.


275 Comentarios

  1. Hola me interesaría saber como funciona el tema de la autentificación y autorización de contenidos a usuarios no registrados en la tienda. ¿Se encargan los servlet de llevar a cabo la autenticación?¿Se trata de autorización declarativa o programada? Gracias.

    • Hola Iván:

      No entiendo muy bien tu pregunta. Los usuarios no registrados no tienen autenticación. No se a que te refieres. Un saludo!

    • Me refiero a autorizacion a recursos no accesibles para usuarios no registrados. Y otra cuestión es el tema de los filtros, entender un poco más lo que hacen y cómo se lleva a cabo el proceso de autentificación. Gracias

    • Hola Iván:

      Sigo sin entender muy bien a lo que te refieres con lo de los usuarios no registrados. Respecto a los filtros tienes un apartado dedicado a ello en la documentación, creo que en la página 34. Si después de verlo no sabes lo que hacen o no lo entiendes ponte en contacto conmigo por mail y te lo intento explicar algo mejor.

      Un saludo!

  2. No entiendo lo que hace el restricted.jsp ya que un usuario no registrado se supone que no puede acceder al panel de preferencias así que sobraría creo yo esa página de error.

    • La página no sobra porque es la página a donde se redirige si intentas acceder a un área en la que no está permitido acceder. Simplemente muestra un mensaje y te lleva a la página de login tras unos segundos.
      Aunque un usuario no registrado no pueda acceder a las preferencias siempre puede probar a poner en la URL /admin/index.jsp o similar, en ese caso se mostrará la página restricted.jsp. La seguridad no ha de basarse en la ocultación. Que no se vea el enlace a administración no significa que no se pueda acceder.

      Un saludo!

  3. ¿Cuál sería el esquema relacional de la base de datos? Te agradecería si me lo pudieras enviar el dibujo con las relacion entre tablas.

    • Hola Ivan:
      En este mismo post tienes a tu disposición un pdf con la documentación de la tienda online. En la misma documentación tienes un diagrama de clases con las relaciones y las tablas de la base de datos explicando su contenido. Creo que eso te puede servir.
      Un saludo!

  4. Hola el histórico de compras de un usuario en concreto y el histórico de ventas al que puede acceder solo el administrador.¿No es el mismo? Es que consultando el código parece ser el mismo y no debería serlo. Gracias

    • Hola Ivan:

      Creo recordar que el administrador puede ver todas las ventas realizadas que se han hecho en la tienda (es decir, las compras que han hecho todos los usuarios).
      Sin embargo lo que puede ver un usuario no administrador es solo sus comprar en la tienda online.
      En la línea 53 de salesrecord.jsp puedes ver que se comprueba si el usuario es administrador o no y los parámetros que recibe la función de persistencia son diferentes.

      Si sigues con la duda me lo comentas. Un saludo!

  5. Laura Mancipe

    Hola Juan, la verdad acabo de descargar tu aplicación. Resulta que tengo que hacer una aplicación web que permita diseñar encuestas y enviarlas por mail, yo tengo conocimientos sobre Java SE, y la verdad es que este lenguaje me gusta mucho, pero el problema es que no tengo ni idea de cómo comenzar, yo tengo instalado el NetBeans 7.4, Apache y Glassfish 4.
    La aplicación debe ser desarrollada con Oracle.
    Te agradecería muchísimo si me hicieras una breve introducción sobre como empezar.

    Te felicito por ese trabajo que hiciste, y por responder a las personas oportunamente.

    Att: Laura

    • Hola Laura:

      Muchas gracias por tus agradecimientos.
      Creo que un buen lugar por donde empezar es el tutorial de Java EE por Abraham Otero Quintana, es el profesor que me dio a mi clase cuando hice esta aplicación y es el manual que él siguió para sus clases. Creo que es un punto bueno por donde comenzar ya que trata muchas cosas desde el principio y se comprende bien desde la base.
      http://www.javahispano.org/portada/2011/7/28/tutorial-basico-de-java-ee-por-abraham-otero.html

      Una vez comprendido eso comprenderás mucho mejor la Tienda Online que he presentado y podrás enfocar tu aplicación.

      Si bien es cierto que tanto el tutorial que de Abraham como la Tienda Online cumplen fines didácticos por lo que si tu aplicación es para poner en producción deberías adentrarte en temas más avanzados que puede que en un principio te cueste algo pero te ahorrarán mucho trabajo. Estos temas pueden ser motores de persistencia, páginas JSF …

      Espero haber sido de ayuda. Un saludo!

  6. Yordanis

    Hola.
    En el servlet SearchProductServlet utilizas un método de validación llamado validateForm.
    Mi duda es si aquí se protege de algún ataque, de algún error. Porque aunque no he estudiado nunca algo de Javascript (lo dejare para más adelante), leí por arriba lo que es vanadium y lo que hace en este caso es no permitir un nombre invalido. Ok, pero por ejemplo cuando pones

    if (request.getParameter(“campo”).equals(“name”) || request.getParameter(“campo”).equals(“desc”)
    || request.getParameter(“campo”).equals(“detail”)){

    No es de suponer que ya esos son los valores que tendrá que tener el parámetro campo obligatoriamente. ¿Para qué necesita ser consultado? Porque ya null no es porque se comprueba en el if anterior.

    Por eso es mi pregunta ¿si hay alguna manera de que el parámetro campo llegue con otro valor que no sea (null, name, desc, detail)?

    Gracias.

  7. Yordanis

    Hola!!
    En la documentación acerca de la aplicación dices que hay que poner la carpeta setup en el classpath de ejecución de la máquina virtual, pero luego que hago el deploy desde Netbeans todo funciona bien, y no he llevado a cabo ese paso, es decir, no he puesto la carpeta setup en el classpath. ¿¿O es que Netbeans lo hace al desplegar la aplicación??
    Por favor, si puedes aclárame esa duda.
    Gracias

    • Hola:
      Efectivamente hay que poner la carpeta setup en el Classpath porque la librería de seguridad busca entre varios lugares sus ficheros de configuración, uno de ellos es el Classpath. Lo verás en el log de glassfish ya que indica los sitios en los que ha buscado. Los demás elementos que hay en la carpeta setup verás en el código que yo los recupero usando la sentencia para recuperar archivos del Classpath.

      No has tenido que hacer ninguna configuración porque lo he hecho yo. Es una configuración que se hace sobre el proyecto de Netbeans y como yo he puesto a disposición del público el proyecto entero incluida su configuración pues ya está hecho. Si te fijas dentro del proyecto donde librerías verás que entre otras está la carpeta setup, lo que indica que está añadida al Classpath.

      Espero que esto te sirva de ayuda, si tienes más dudas no dudes en comentarlo. Un saludo!

    • Yordanis

      Ok. Muchas gracias. Ya esos conocimientos de configuración los dejaré para más adelante.
      Saludos.

    • Me alegro de que te sirva. Si tienes más problemas no dudes en comentar. Un saludo!

  8. Yordanis

    Saludos muchas gracias por tu gran aporte, quisiera estudiarlo de principio a cabo, pero me da el mismo error que a otros programadores:
    Ping Connection Pool failed for jdbc/OnlineShop. Class name is wrong or classpath is not set for : com.mysql.jdbc.jdbc2.optional.MysqlDataSource Please check the server.log for more details.

    He seguido tus sugerencias y persiste el problema.

    La versión que pude descargar del conector para MySQL es la 5.1.28, y la que tienes en el videotutorial es la 5.1.17, no sé si eso tendrá que ver, si puedes, por favor sube a esta página el driver que utilizas en el videotutorial y así salimos de dudas.

    También hoy cuando inicié el servicor GlassFish me pone una series de warning y Severe. Entre ellas al final pone.

    WARNING: RAR8054: Exception while creating an unpooled [test] connection for pool [ jdbc/OnlineShop ], Class name is wrong or classpath is not set for : com.mysql.jdbc.jdbc2.optional.MysqlDataSource
    SEVERE: RestResponse.getResponse() da FAILURE. endpoint = ‘http://localhost:4848/management/domain/resources/ping-connection-pool.json’; attrs = ‘{id=jdbc%2FOnlineShop}’

    No sé si tenga eso que ver con el problema o es otra cosa.

    Muchas gracias.

    • Hola, muchas gracias por el comentario.
      Yo la verdad es que no conservo este driver actualmente ya que como verás la aplicación tiene tiempo, sin embargo te puedo decir que yo he puesto en marcha la aplicación antes de este verano con el driver que hubiera entonces y ha funcionado perfectamente. En teoría la versión del driver de MySQL no debería ser un impedimento para el correcto funcionamiento.
      Inténtalo de nuevo, asegúrate de que estas poniendo el jar del conector de MySQL en el directorio correcto, fíjate bien en la documentación y en el vídeo por si se te ha escapado algo. Fíjate que en mi vídeo uso un sistema Mac, si usas Windows el directorio de las librerías que use Glassfish podría ser diferente.

      Espero tu respuesta. Un saludo!

    • Yordanis

      Hola.
      Tenías toda la razón. No estaba colocando el driver donde era pues en el directorio C:\Program Files vi una carpeta GlassFish 4 y sus subdirectorios y ahí era donde estaba poniendo el driver, pero no era ahí, realmente no sé o no recuerdo como esa carpeta llegó ahí, pero creo que fue una vez ya hace como tres meses yo mismo intentando instalar GlassFish fui el que la puso.

      Pero para dejar la charla e ir al grano, la cuestión es que el Servidor GlassFish que utilizo realmente es el que viene incluido con NetBeans y el directorio donde se instala por defecto es en C:\Users\nombre_usuario\GlassFish_Server\.
      Por lo que donde situé el driver fue en C:\Users\nombre_usuario\GlassFish_Server\glassfish\domains\domain1\lib y funcionó bien, es decir, Ping realizado correctamente.

      Esa ubicación: glassfish\domains\domain1\lib es la que recomienda Oracle, pero igual probé en la que pones en el videotutorial (glassfish\lib) y trabaja igual.
      Ahora después de tres días de buscar por aquí y por allá seguiré estudiando tu aplicación. Muchas gracias.

    • Muchas gracias por tu detallada respuesta, es valioso decir como lo has solucionado para que los próximos que lleguen lo puedan leer. El directorio que pongo yo ten en cuenta que para empezar es algo diferente porque no lo hice sobre Windows, si te ha funcionado de las dos maneras pues mejor que mejor ;)

      Si te surgen más problemas cuando empieces a ver la aplicación en detalle no dudes en preguntar ;) Un saludo!

  9. Guillermo Paez

    Hola Compañero, excelente post felicitaciones, pero me da este error:
    Fallo al hacer ping al pool de conexiones para jdbc/OnlineShop. No PasswordCredential found Please check the server.log for more details. esto ocurre al configurar el servidor, cual seria el problema, gracias.

    • Hola Guillermo:
      Si has configurado la base de datos con un usuario sin contraseña puede que sea ese el problema. No es una práctica muy común configurar bases de datos con usuarios sin contraseña y a menudo suele dar problemas. Posiblemente sea ese tu problema.
      Un saludo!

  10. Darwin

    Hola compañero un favor talvez tienes otro proyecto similar a la tienda on line porque tengo unos inconvenientes al integrarlo al mvc que estoy desarrollando

    • Hola:
      La verdad es que no entiendo muy bien tu pregunta, si me puedes explicar con más claridad lo que quieres te intentaré responder.
      Saludos!

  11. Eduardo

    Nuevamente yo, en netbeans tambien me sale el mensaje:

    SEVERE: Excepción al desplegar la aplicación [OnlineShop] : Could not initialize class com.sun.org.apache.xerces.internal.impl.xs.SchemaGrammar

    Gracias.

    • Hola Eduardo: El mensaje que me muestras no me dice mucho. Hay que ver la pila de mensajes del log entera para que pueda intentar enterarme de algo.
      Si quieres me puedes poner más detalles en el formulario de contacto y a ver si puedo echarte una mano. Saludos!

  12. Eduardo

    Disculpa me olvidaba en Netbeans en glassfish server me sale el mensaje:

    SEVERE: PWC6117: File “C:\glassfish\glassfish\domains\domain1\docroot\login.jsp” not found

    Muchas gracias.

    • Hola Eduardo: Bueno por lo que veo ya me muestras lo que dice el log de Glassfish. Revisa que se haya bajado bien el proyecto y tengas todas las páginas. No tiene lógica que de un 404. Mira a ver si hay algún error más en la consola de Glassfish.

      Un saludo!

  13. Eduardo

    Hola, nuevamente ya pude solucionar algunos incovenientes que tenia ya esta configurado todo tal cual tu video, ejecuto con http://localhost:8080/login.jsp y me sale el siguiente mensaje:

    descriptionThe requested resource () is not available.

    GlassFish Server Open Source Edition 3.1.2

    gracias amigo por tu ayuda.

    • Hola Eduardo, el error que me indicas no me dice nada, tiene que haber algo más sobre el error, con lo que me has mostrado no puedo hacer mucho. ¿Esto te sale en el navegador no? Dime lo que aparece en la consola de Glassfish.

  14. Eduardo

    Hola, te pido disculpas de nuevo, ya pude solucionar lo de glassfish, pero al momento de ejecutar http://localhost:8080/login.jsp me sale el mensaje:

    descriptionThe requested resource () is not available.
    GlassFish Server Open Source Edition 3.1

    Asimismo, cuando intento conectar la base de datos ya creada em MySQL me sale el mensaje:

    Failed to Connect to MySQL at 127.0.0.1:3306 with user root
    Unknown database ‘q1f447′

    ayudame por favor, gracias de antemano

    • Hola:
      Parece que has hecho mal la configuración de la Base de datos. Por lo que veo has seguido usando el mismo nombre de Base de datos que di yo ‘q1f447′, sin embargo en el web.xml o en otro sitio parece que has puesto tu otro nombre de base de datos.
      No puedo decirte más cosas, pero te pongo sobre la pista de que en algún sitio el nombre de la base de datos está mal puesto. En el fichero sql que di yo aparece ‘q1f447′ muchas veces, para que lo sepas con eso se hace referencia al nombre de la base de datos.
      Repasa el vídeo de configuración y fíjate en donde se configure el nombre de la base de datos.

      Si te sigue sin funcionar después de revisarlo me lo comentas. Un saludo!

  15. Eduardo

    Hola de nuevo, disculpa la molestia, en la parte de adicionar propiedades en Glassfish que valor pongo en serverName y Url, gracias

    • Eso es un dato que tienes que saber tu dependiendo de donde tengas la base de datos. Pero no obstante te pongo un ejemplo, el ejemplo que te pongo debería de valerte en el caso de que tengas la base de datos en localhost.

      Url: jdbc:mysql://localhost
      ServerName: localhost

      Si tienes algún problema más no dudes en volver a comentar. Saludos!

  16. Eduardo

    Hola, de antemano muchas gracias por tu sistema y tu respuesta, me aparece este mensaje cuando lo ejecuto:

    In-place deployment at C:\Users\eortizp\Documents\NetBeansProjects\OnlineShop\build\web
    GlassFish Server 4.0, deploy, null, false
    C:\Users\eortizp\Documents\NetBeansProjects\OnlineShop\nbproject\build-impl.xml:1137: The module has not been deployed.
    See the server log for details.
    BUILD FAILED (total time: 2 seconds)

    Y en glassfish me sale este mensaje:

    SEVERE: Exception while loading the app
    SEVERE: Undeployment failed for context
    SEVERE: The web application [] created a ThreadLocal with key of type [org.owasp.esapi.reference.AbstractAuthenticator.ThreadLocalUser] (value [org.owasp.esapi.reference.AbstractAuthenticator$ThreadLocalUser@119dc6e]) and a value of type [org.owasp.esapi.User$1] (value [org.owasp.esapi.User$1@d6bb59]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak.
    SEVERE: Exception while loading the app : java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: java.lang.RuntimeException: No se ha podido iniar la aplicación, parámetros de contexto incorrectos

    Te pregunto no si tiene algo que ver la ruta en:

    archivoDatos
    jdbc/OnlineShop
    <!–data.bin–>

    Por que mi ruta es C:\Users\eortizp\Documents\NetBeansProjects\OnlineShop

    Gracias por tu ayuda.

    • Hola:
      Gracias por tu agradecimiento.

      Lo importante de ese error es esto “No se ha podido iniciar la aplicación, parámetros de contexto incorrectos” Es un error que lanza la aplicación generado programáticamente por mi cuando los parámetros del web.xml son incorrectos. No debería tener nada que ver la ruta donde se despliega la aplicación. Revisa el vídeo y la documentación donde explico cada uno de los parámetros y lo que hay que poner en ellos. También aquí mismo en los comentarios puedes encontrar gente que ha preguntado por los parámetros y he respondido a las preguntas. Si después de todo sigues con el mismo error me lo vuelves a comentar.

      Saludos!

  17. Que buen aporte Juan, tuve inconvenientes al principio por no haber configurado el servidor de correos pero con sus respuestas ya lo solucione. Muchas gracias por volver a este mundo un poco menos ignorante

    • Muchas gracias por tu comentario, me alegro que este recurso sea de utilidad. Si vuelves a tener problemas y no das con la solución no dudes en volver a comentar. Un saludo!

  18. Hola Juan Díez buen día!

    Tu proyecto es interesante, felicidades…
    Solo que me surgió un problema al intentar hacer la conexión (El ping no lo hace) y esta es la advertencia que me sale en glassfish, no se si puedas asesorarme:

    Advertencia: RAR8054: Exception while creating an unpooled [test] connection for pool [ jdbc/OnlineShop ], Class name is wrong or classpath is not set for : com.mysql.jdbc.jdbc2.optional.MysqlDataSource
    Grave: RestResponse.getResponse() gives FAILURE. endpoint = ‘http://localhost:4848/management/domain/resources/ping-connection-pool.json’; attrs = ‘{id=jdbc%2FOnlineShop}’

    Ping Connection Pool failed for jdbc/OnlineShop. Class name is wrong or classpath is not set for : com.mysql.jdbc.jdbc2.optional.MysqlDataSource Please check the server.log for more details.

    (EL PROYECTO LO ESTOY TRATANDO DE CORRER LOCALMENTE)
    LOS DATOS Q HE UTILIZADO SON:
    user: root
    serverName: localhost
    url: jdbc:mysql://localhost
    databaseName: rocker
    portNumber: 3306
    password: admin

    LA VERDAD NO SE SI EN ALGO ESTOY INCURRIENDO MAL…
    PODRÍAS AYUDARME?

    • Hola gracias por tu comentario. Lo que creo que te pasa es que no tienes puesto el driver de MySQL en el servidor de aplicaciones. En la esta misma entrada entre los recursos que he dejado a vuestra disposición puedes ver un vídeo en donde explico la forma en que hay que poner el Driver de MySQL. Si sigues tiendo problemas no dudes en preguntar. Un saludo!

    • Maria

      Hola,
      Antes de nada muchas gracias por compartir este proyecto, me ha venido genial!Felicidades!
      Tengo un problema, al configurar glassfish:
      (YO tb lo estoy corriendo en local y la bda no tiene ni usuario ni contraseña)

      serverName: localhost
      url: jdbc:mysql://localhost
      databaseName: shop
      portNumber: 3306
      password:
      user:

      el error que me muestra:

      Ping Connection Pool failed for jdbc/OnlineShop. Class name is wrong or classpath is not set for : com.mysql.jdbc.jdbc2.optional.MysqlDataSource Please check the server.log for more details.

      Anteriormente descargue el archivo “mysql-connector-java-5.1.28-bin.jar” y lo he pegado en la ruta
      C:\Program Files\glassfish-3.1.2.2\glassfish\lib tal y como comentas en el video.

      ¿que es lo que estoy haciendo mal?

    • Hola María:
      Lo primero muchas gracias por tus palabras. Ahora paso a responderte.
      El error que te da es porque Glassfish no encuentra el conector para MySQL. Si sigues el vídeo de la puesta en marcha verás como configuro todo para que funcione correctamente el proyecto.

      Con respecto a lo que me comentas de tu base de datos no puede ser que tu base de datos no tenga usuario, eso es imposible sino no podrías acceder a ella. La base de datos no tiene usuarios no tiene contraseña como tal, sino que son los usuarios que si que tienen contraseña los que pueden acceder a la base de datos. Te recomiendo que busques en google la forma de crear una BD en MySQL y la forma de crear usuarios y asignarles permisos.

      Si tienes algún problema más no dudes en comentar de nuevo. Un saludo!

  19. donde lo puedo descargar amigo

    • Hola Ricardo: En el artículo tienes las instrucciones para descargarlo, he hecho un vídeo completo explicando como obtener el proyecto.
      Saludos

  20. tengo problemas con lo del smtp, no se si podrias darme indicaciones de como relizar la configuracion mas detallado

  21. CREES QUE PODRIASS AYUDARME A ENCONTRAR EL ERROR Y LEVANTAR LA APLICACION USANDO TEAMVIEWER … !! SOY DE PERU

    • Hola Eddy: La verdad es que ahora no dispongo de suficiente tiempo como para levantarte la aplicación de manera remota, además si lo hago yo no creo que a ti te sirva de aprendizaje, aprenderás más si lo haces tú. En cualquier caso puedes seguir preguntándome por los errores sin problema y responderé en la medida de lo posible.
      Saludos!

  22. Carrasco

    Me gustaría saber si el sistema funciona con Apache Tomcat y MySQL… si si, podrias decirme como por favor.. eh intentado y no eh podido.

    • Hola Carrasco:
      En teoría si que debería correr bien con Tomcat y MySQL, yo no lo he probado nunca con Tomcat pero no hay nada que sea específico de GlassFish salvo claro está el fichero donde se declara el pool de conexiones que ese si es propio de GlassFish y debería de haber algo similar en Tomcat.

      Al final de la entrada puedes ver que tengo una guía que publiqué gracias a un lector sobre hacerlo con Tomcat y Postgress. Pero yo no he probado a hacerlo con Tomcat simplemente publiqué la guía para quien le fuera de ayuda pero resolver dudas sobre esa guía ya puede ser más complicado que lo haga. http://jdiezfoto.es/informatica/actualizacion-tienda-online-java-ee-tomcat-y-persistencia-con-postgres/

      Espero que esto te pueda servir en algo de ayuda. Un saludo!

  23. EDDY BUSTILLOS

    DISCULPA SOY NUEVO EN JAVA Y EL ENTORNO NETBEANS ES POR ESO MIS DUDAS .. NO SE A QUE TE REFIERES CON : te manda a mirar el log del servidor de aplicaciones para que veas la razón por la cual no se despliega la aplicación. … DONDE VEO EL LOG DEL SERVIDOR DE APLICACIONES???? —- INTENTE CON TOMCAT Y POSGRET Y TAMPOCO ME CORRE … REALMENTE QUIERO PODER LEVANTAR LA APLICACION … QUISIERA QUE PUDIERAS EXPLICARME DETALLE A DETALLE … GRACIAS

    • Hola Eddy:

      Digo que te manda mirar el log del servidor de aplicaciones porque si te fijas en el error dice en inglés “See the server log for details” Que significa traducido al español que mires el log del servidor de aplicaciones para ver detalles.

      El log del servidor de aplicaciones está dentro de NetBeans en la parte inferior al lado de la consola de donde has sacado los errores que me has mostrado. No se si has visto el vídeo en el que muestro como poner en marcha la aplicación y la documentación de la misma pero te recomiendo que lo veas porque lo explico todo paso por paso. En concreto, del minuto 9 en adelante hago referencia concretamente a que hay que mirar la consola de GlassFish y accedo a ella.

      El vídeo y todos los recursos los tienes en esta misma entrada.

      Espero que esto te sirva de más ayuda. Saludos!

  24. holas !!! .. me sale el siguiente error cuando doy en deploy : C:\Users\EDDY BUSTILLOS\Documents\NetBeansProjects\OnlineShop\nbproject\build-impl.xml:1127: The module has not been deployed.
    See the server log for details.

    ademas cuando creas el pool de conexion y el jdni le pones el mismo nombre a los 2 .. y a mi no me permite eso .. tu crees que ese sea la falla y x eso no me corre el programa

    gracias de antemano

    • Hola Eddy:

      Por favor haz lo que te he dicho en el primer mensaje porque me has mandado dos comentarios prácticamente iguales sin hacer lo que te he dicho y además un mensaje por el formulario de contacto.

      Has de mirar los detalles del error en la consola del servidor de aplicaciones que no es la que estás mirando. En el vídeo verás que se muestran dos consolas en la parte inferior del entorno de desarrollo NetBeans. Y además el error que te da lo deja claro, te manda a mirar el log del servidor de aplicaciones para que veas la razón por la cual no se despliega la aplicación.

      Por lo que comentas he visto que estás usando GlassFish 4.0, lo cierto es que yo no he desplegado la aplicación en este servidor de aplicaciones por lo que no te puedo asegurar que funcione, pero en principio debería. Lo que no te permite crear el recurso JNDI con el mismo nombre que el pool de conexiones pues no entiendo porque ya que son dos cosas distintas, pero si no te deja que ya me parece extraño puedes usar un nombre distindo para el pool que para el recurso JNDI, eso sí, el recurso JNDI ha de estar apuntando al pool de conexiones.

      Cuando hagas referencia al recurso en la aplicación en el fichero de configuración que enseño en el vídeo tienes que poner el nombre que le hayas dado al recurso JNDI.

      Saludos!

    • Faxon007

      el error se da en la version del Glassfish, simplemente se cambia el nombre del recurso, pero si estas usando netbeans 7.3 , debes de usar jdk 7 para que no te de error……….

    • Muchas gracias por aportar tu consejo. Se agradece tu aportación en la resolución de las dudas del proyecto. Un saludo!

  25. holas .. he hecho todos los pasos pero me sale el siguiente error cuando doy en deploy : The module has not been deployed.
    See the server log for details. … ayuda please

    • Hola de nuevo Eddy:

      Ese error te sale en la consola normal de java pero ten en cuenta que al hacer una aplicación web no ejecutas sobre la máquina virtual de java sino sobre el servidor de aplicaciones, por lo que los errores te salen en consola del glassfish, que es donde miraste el error anterior que me mandaste. En el netbeans aparecen en pestañas las dos consolas. En la consola de glassfish es donde miras los errores, que de hecho es lo que dice el cartel del error, que mires la consola del servidor.

      Saludos

  26. holas una pregunta que ingresas cuando estas configurando el glassfish en los campos de la propiedad Url, ServerName

    • Hola Eddy:

      Depende de donde esté el servidor de tu base de datos. Si lo tienes en localhost por ejemplo debería ser algo similar a esto.
      Url: jdbc:mysql://localhost
      ServerName: localhost

      Espero que te sirva de ayuda. Si tienes alguna duda más no dudes en dejar un comentario :) Un saludo!

  27. Jhonny Orquera

    como siempre lo he dicho, demasiada buena la aplicacion. en versiones pasadas yo he cambiado los url de los ficheros, para guardarlos en una carpeta personalida del servidor, ahora mi pregunta es se pueden guardar archivos pdf?? y ademas nose si podrias explicar a detalle el funcionamiento de los servlets y demas componentes que permiten guardar una imagen asignada al producto. me ayudarias demasiado. gracias compañero

    • Hola:
      Lo cierto es que no he entendido muy bien lo que has hecho del cambio de URL de los ficheros. Se subir archivos PDF perfectamente, pero habría que refinar la parte de subida de adjuntos.
      En primer lugar quitar la restricción que hay para que solo se suban archivos de tipo imagen y modificar la vista para que no intente mostrar un archivo pdf ya que como ves se muestran las imágenes junto a la ficha del producto.

      Actualmente las imágenes se suben sin una extensión y se encuentran gracias a que se guardan con el mismo nombre del código de producto. Si recuerdas en la documentación hago referencia a ello como una cuestión a mejorar. Ahora al meter pdfs deberías conservar la extensión de los archivos al guardarlos y posiblemente sería ya una muy buena mejora agregar a la base de datos el nombre de los adjuntos.

      No te he explicado el funcionamiento en detalle de la subida de archivos pero si creo que te he puesto en la dirección correcta. Mírate los flujos de navegación de la documentación para ver más en detalle de la subida de archivos y si necesitas que sobre ello te explique como funciona alguna cosa en concreto te lo puedo explicar como me pedías.

      Un saludo!

    • Jhonny Orquera

      pues me exprese mal, no es la url de los archivos, es la direccion de la ubicacion en el servidor, y pues segun estas directrices que me facilitas, analizaré el codigo y la documentación, ya pude guardar ficheros de tipo pdf unicamente con quitar la restriccion en el AddProductServlet.java, ahora estaré en la investigacion de poder visualizar los pdf ya que segun veo los archivos estan cifrados.
      gracias tu aporte

    • Hola, me alegro que con las pistas que te indiqué seas capaz de seguir adelante con la modificación.

      Comentarte un par de cosas, si encontraste la restricción de la imagen sino recuerdo mal la restricción la tenía dentro de un método que estaba en la clase Tools, revísalo por si acaso no me estoy equivocando. En cualquier caso revisa también la Servlet de editar producto porque ahí también se puede subir la imagen.

      Respecto a lo que dices que los archivos están cifrados no se a que te refieres, no he puesto ningún código fuente cifrado está todo abierto, o al menos así debería estar. Aclárame esto por favor.

      Un saludo!

    • Jhonny Orquera

      mmm analizandolo bien no es un cifrado como tal sino es quitar la extension del fichero, y pues si ya me guarda normalmente.. demasiado buen aporte compañero. lo que te plantearia la duda es de si se podría a esto implementar librerias primefaces, que estuve analizandoles y corren perfectamente.
      Saludos

    • Hola de nuevo:

      Si, como te dije las imágenes se suben sin extensión, únicamente con el nombre del código del producto, esto estaba bien porque solo se iban a subir imágenes, en tu caso habría que conservar la extensión.

      Respecto a lo de las PrimeFaces no se responderte, nunca he trabajado con esto.

      Un saludo!

    • Jhonny Orquera

      Claro, buen aporte el de generacion de codigo para id de imagenes, ahora mi pregunta talvez sabes de algun pulgin para despelgar documentos de pdf online?? gracias la respuesta

    • Por tu respuesta no me queda claro que lo hayas entendido bien. No genero id para imágenes. Las imágenes se guardan con el mismo ID que su producto correspondiente como nombre de archivo y por ello se asocian al producto, tienen el mismo nombre de archivo que el código de producto. Los códigos de producto son UUID que son autogenerados. Si no sabes lo que es un UUID lo puedes buscar en google.
      Respecto al plugin para pdf la verdad es que no he usado nunca ninguno. Pero has de saber que la mayoría de los navegadores pueden abrir un PDF si están correctamente configurados. Si lo que quieres es incrustarlo en la web tendrías que usar algo de JavaScript + JQuery. Puedes buscar en google algo parecido a esto “JQuery PDF viewer”.

      Espero haberte aclarado algo. Un saludo!

    • Jhonny Orquera

      Pues si tienes razon el id de las imagenes son como lo nombras, te comento que ya puedo visualizar los pdf con un iframe incrustado en la pagina( ) y pues me resulto de maravilla, lo que estoy investigando es que el guardado y recuperado de imagenes sea desde una fuente externa es decir un almacenamiento terciario, ya que la aplicacion va en el galsfish, los datos en la base de datos pero los ficheros irian en una carpeta pertenciente a otro servidor, entonces mi pregunta es deberia crear solo una carpeta de archivos en el servidor(como si se tratase de una nueva carpeta en el disco duro)o tendria que hacer configuraciones extras para usarla????
      Saludos….

    • Hola:

      Tal y como viene la aplicación las imágenes se guardan en una carpeta dentro de la aplicación desplegada en el servidor. Ten en cuenta que no puedes guardarlo en cualquier carpeta puesto que si no es visible por el servidor no se mostrarán las imágenes. Si las pones en una carpeta que no tiene nada que ver con la aplicación ten en cuenta que tendrías que hacerte con código que fuera a una carpeta del disco y sacara las imágenes leyéndolas por la salida del HTML. Ten muy clara la diferencia entre lo que es el sistema de archivos del servidor y lo que es el entorno de directorios de la aplicación web. Espero que me hayas entendido con esto. Si tienes alguna duda más no dudes en preguntar.

      Saludos!

  28. Gabriel

    sorry yo recien veo esta aplicacion y me sale que no puedo iniciar la aplicacion, parametros de contexto incorrectos… Ayudame a resolverloo … Please

    • Hola Gabriel:

      Los parámetros de contexto son los que se configuran en el web.xml, antes de poner en marcha la aplicación te recomiendo que los configures según se indica en el vídeo. Si ya tienes todo configurado como lo indico y sigues teniendo problemas no dudes en volver a comentármelo.

      Un saludo!

    • Gabriel

      LO QU ENO TENGO CLARO ES QUE DATOS PONER POR EJEMPLO ALLI DONDE EN archivosHistoriales hay 3 asteriscos(*) que datos va alli haa ademas el nombre de la base de datos no especifica como debe de llamarse….. mil disculpas si no he visto algun detalle o se me haya pasado de largo el nombre de la base de datos auqnue solo puedo ver nameBD

    • Hola de nuevo:

      Voy a explicártelo un poco más despacio. Como puedes ver en la documentación la aplicación puede funcionar guardando los datos en ficheros y en una base de datos. Guardar los datos en ficheros no es lo normal y es algo meramente educativo. La manera de configurar la manera en que se guardan los datos se hace en el descriptor de despliegue con el parámetro “persistenceMethod” que tal y como viene puesto “pool” indica que se va a usar la base de datos usando un pool de conexiones.

      Para persistencia con base de datos se usa el parámetro “archivoDatos” que indica el nombre del recurso JNDI del pool de conexiones que hemos definido en el servidor de aplicaciones como puedes ver en el vídeo. Ese mismo parámetro si se usara persistencia contra ficheros indicaría el nombre del archivo de datos.

      El parámetro “archivoHistoriales” indica el nombre de la base de datos cuando se ha seleccionado la persistencia con base de datos y cuando se selecciona persistencia con fichero es el nombre del fichero en donde se guardan los historiales de carritos de la compra.

      El parámetro “archivoRecuperacion” no se usa con persistencia de base de datos y cuando se selecciona persistencia con ficheros se usa para indicar el nombre del fichero para guardar los carritos que no han sido comprados y se recuperan cuando el usuario que lo inició inicia la sesión.

      El parámetro “archivoLog” no se usa con persistencia de base de datos y cuando se selecciona persistencia con ficheros indica el nombre de fichero donde se guarda el log de peticiones de la aplicación.

      El resto de los parámetros puedes ver que unos son el nombre del usuario administrador por defecto y su contraseña cuando la aplicación se inicia por primera vez y no hay usuario administrador. Esto lo puedes ver en el vídeo.

      Y también presente en el vídeo los parámetros restantes son para los datos de un servidor SMTP de correo que es usado para que la aplicación pueda enviar correos electrónicos.

      Si tienes algún problema más no dudes en preguntar. Un saludo!

    • Gabriel

      Muchas gracias mi estimado Gracias a este aporte que ud brinda a personas como nosotros que estamnos recien iniciando con aplicaciones web es de mucha importancia… de todo corazon siga adelante que asi de alguna manera nos va ayudar y si gracias a los videos y algunos comentarios por este medio pude desplegar la aplicacion y resolver los inconvenientes que se me presentaron…. de ante mano es un buen trabajo el cual ud ha compartido…. un saludo y muchas gracias por su ayudaaa …..Gabriel

    • Hola Gabriel:
      Muchas gracias por tan agradable comentario. Me alegro que sea de utilidad el recurso. Si tienes algún problema más no dudes en volver a preguntar.
      Un saludo!

  29. Si está en Java EE 6 jejeje después de investigar bien me di cuenta pero bueno el aporte es muy significativo para la comunidad.

    • Me alegro que te haya servido de ayuda y lo consideres así, si tienes algún problema más con el funcionamiento no dudes en preguntar. Un saludo!

    • Hola tengo una inquietud para el envío de correo mediante la aplicación??? En el archivo web.xml de la aplicación como obtengo esas configuraciones del servidor SMTP no es muy especifico en los videos tutoriales…???Si talvez tienes algún link como para poder configurar o instalar en mi máquina y poder llevarlo como lo hacen en el video???

      hostMail
      ***

      TSLMail
      false

      mailPort
      25

      mailUser
      ***

      authMail
      ***

      Te agradecería mucho está contribución.

    • Hola:

      No es muy explícito en el vídeo con esta configuración porque para serlo más te tendría que haber puesto los datos de mi servidor SMTP. En esos campos que señalas se pide la configuración de un servidor SMTP para que la aplicación se pueda conectar al mismo para enviar los correos electrónicos.

      Cualquiera tiene un servidor SMTP a su alcance por ejemplo el de su cuenta de correo electrónico en Gmail. He dejado la URL con los datos del servidor SMTP de Gmail en algún comentario, pero te la pego aquí otra vez: https://support.google.com/mail/troubleshooter/1668960?hl=es&from=75726&rd=1&uls=es#ts=1665018,1665144

      Si lo que quieres es montar un servidor SMTP tu mismo pues casualmente tengo una guía que te podría servir, el tutorial es bastante completo y abarca más de lo que necesitarías para esto. Y si te quieres ahorrar problemas yo no configuraría la parte de seguridad que se indica porque requiere que configures algo adicional en Java y yo creo que para aprender sobre la aplicación no necesitas complicarte con este tema.
      http://jdiezfoto.es/informatica/como-configurar-un-servidor-de-correo-seguro-con-postfix-y-dovecot/

      Un saludo!

  30. Guau, gracias, mil gracias, esto ayuda mucho a quienes siempre buscamos aprender un poco más, no he visto el código, pero este enlace ya está entre mis favoritos.

    Mil Gracias!

    • Muchas gracias por el comentario, me alegro que sea de utilidad. Cuando lo uses si tienes algún problema no dudes en preguntar.

      Un saludo!

  31. Muy buena aplicacion … Exelente proyecto … mmm tengo un problema con el proyecto me salen errores en el paquete donde estan las clases … es decir el paquete control, controladmin ect por favor tendrias la amabilidad de poder ayudarme .. de antemano te lo agradesco .. !!

    • Hola: En primer lugar gracias por tus agradecimientos. Respecto a los errores que tienes te puedo intentar echar un mano sin ningún problema.
      Para que te pueda ayudar me tienes que dar más datos sobre los errores que te salen, si lo deseas puedes usar el formulario de contacto y te intentaré responder a la mayor brevedad posible.
      Un saludo!

  32. geronimo

    Muchas gracias, estas cosas son impagables la verdad. La mejor forma de aprender

    • Muchas gracias por el comentario, me alegro que sea de utilidad, el agradecimiento siempre es bienvenido :)
      Un saludo!

  33. Charlotte

    espero no crear un spam, pero no veo mis comentarios publicados :(

    Tengo un nuevo problema, los otros han quedado resueltos:

    Error durante el despliegue: Exception while loading the app : java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: java.lang.IllegalArgumentException: The selected type was not set via the ESAPI validation configuration.

    Esto lo trate de configurar asi, pero no se que tanto este bien y el nivel de impacto de esto para el error antes mencionado…..gracias de verdad por atender mis dudas

    adminMail
    xxxxx@gmail.com

    adminPass
    xxxxxxx

    hostMail
    smtp.gmail.com

    TSLMail
    true

    mailPort
    465

    • Hola Charlotte:
      Es cierto que hay un sistema de detección de SPAM y los dos comentarios anteriores tuyos los se han marcado como SPAM posiblemente por los datos del servidor de correo. Pero los tengo y los leo. Siempre respondo. Si quieres pegar cosas largas siempre tienes si te parece más cómodo que esto el formulario de contacto de la web.

      El error que te da parece ser porque has usado un método de validación que no está en la configuración de ESAPI que es la librería de seguridad utilizada. En este blog tienes varios tutoriales sobre ESAPI donde puedes aprender a configurarlo y posiblemente al ver como funciona verás el porque de ese error. Asegúrate de que estás trabajando con la última versión que hay en el repositorio de la tienda online puesto que de vez en cuando he corregido cosas. Pero los datos que muestras no parecen estar mal.

      Si sigues sin saber el porque del error me lo comentas y lo vemos más despacio. Los otros comentarios que fueron marcados como SPAM no los publico porque veo que son lo mismo que este que te he respondido.

      Un saludo!

  34. Charlotte

    Antes que nada, muchas gracias por responder mis dudas :3, me equivoque al escribir el puerto, encontre el error, se debia a que no tenia contraseña MYSQL, ya me ha hecho el ping. Ahora tengo un problema, quise ver como funcionaba tu proyecto y al correrlo, me ha mandado un error que dice: There is no web component by the name of CheckEmail here….

    • Charlotte

      Ni yo misma se como lo resolvi, pero ha quedado, ahora el problema es que me salta un error que dice : org.xml.sax.saxparseexception duplicate unique value

    • Te digo lo mismo que antes con este error no puedo decirte nada cuando me digas los errores intenta copiarlos al completo y decirme cuando te dio exactamente el fallo ya que sin tenerlo delante es más difícil para mí saber cual es la causa.
      Un saludo!

    • Hola Charlotte:
      Siento tardar en responder, a veces puedo tardar pero siempre respondo.
      Con la descripción del error que me das la verdad es que no te puedo ayudar pero ya veo que lo acabaste resolviendo :)

      Un saludo!

  35. Hola hubiese sido interesante que todo este material que has desarrollado estuviera en la versión de Java EE 6..! Sería un gran aporte significativo a la comunidad..! Gracias por el aporte y muchos éxitos.

    • Hola Jimmy: Gracias por tu comentario, me alegro de que el trabajo te haya gustado.
      Lo cierto es que está realizado sobre Java EE 6, lo único que en vez de organizar los Servlets con anotaciones he usado el descriptor de despliegue web.xml pero está desarrollado usando Java EE 6. ¿Por qué dices que no está en Java EE 6?
      Un saludo!

  36. Darwin

    Hola, Amigo Juan. Gracias por el Aporte felicitaciones. tengo una pregunta… quisiera saber por que no me hace ping en la consola de Glassfish me aparece este error

    Se ha producido un error
    Fallo al hacer ping al pool de conexiones para jdbc/OnlineShop. null Please check the server.log for more details.

    la verdad soy nuevo en esto y me gusta la programación quiero ser ing de sistemas y bueno este aporte me da entusiasmo. ayúdame por favor

    • Hola muchas gracias por tus agradecimientos :)

      Lo que tienes que hacer para saber el problema es mirar en la consola de Glassfish para ver el error porque como ves no da muchos detalles de lo que ha fallado. Mira el vídeo que publiqué con las instrucciones para poner en marcha el proyecto y verás como acceder a esta consola.

      Si tienes algún problema más no dudes en preguntar de nuevo. Un saludo!

  37. Mario

    Buenas, te he mandado un mensaje de contacto con el problema que tengo, te he copiado el web.xml pero no se si sale bien, sino dimelo y te lo reenvío.

    Un saludo

    • Si, lo sé, lo he recibido, ahora en cuanto pueda te respondo. Un saludo!

  38. Charlotte

    Disculpa una enorme pregunta, yo soy nueva en estas cosas, en donde has configurado la Url y el serverName, que tendría que poner si estoy usando mi maquina, es decir sin conectarme a otro ordenador? seria colocar jdbc:mysql//localhost:4848?? y el serverName que seria?

    • Hola Charlotte:
      La URL de la Base de datos si es en local debería de ser como las has puesto pero cambiando el puerto ya que el puerto de MySQL es el 3306.
      jdbc:mysql//localhost:3306
      En cuanto al serverName creo que debe de ser localhost
      Prueba con estos valores y si tienes algún problema me lo vuelves a comentar.
      Un saludo!

  39. Por favor, podrías poner tu base de datos? Gracias

    • Hola Ramirez:
      El esquema de la base de datos lo tienes al final de este artículo junto con todos los recursos entre los que incluyo una documentación completa.
      Te he editado el comentario, cuando escribes en mayúsculas se suele entender que estás gritando.
      Si tienes alguna cuestión más no dudes en preguntar.
      Un saludo!

  40. Charlotte

    Excelente ejemplo, espero me ayude a comprender más acerca de Java Web

    • Charlotte

      Por cierto, hiciste la BD en MYSQL? o en Postgress?

    • La Base de datos de la aplicación está hecha en MySQL y así he trabajado yo. Lo de Postgress es una aportación de un lector que la migró a Postgress y me dijo como hacerlo y lo hice público por si a alguien le servía.
      De manera que la respuesta a tu pregunta es MySQL.
      Un saludo!

    • Muchas gracias por el comentario. Espero que te sea de utilidad. Si tienes dudas no hay mas que preguntar ;)
      Un saludo!

  41. Jhonny Orquera

    demasiado buena actualizacion… una pregunta amigo…
    como seria si no usaras glassfish sino jboss?? configuras el mismo pool y mismo jndi y como seria??
    gracias la respuesta

    • Muchas gracias por el comentario me alegro que te gustara la actualización.

      Nunca he trabajado con JBoss pero todo lo que se ha usado en la tienda online es estándar de Java EE, lo único que cambiaría para JBoss es que el archivo sun-web.xml que es propio de GlassFish para declarar los recursos del servidor. De manera que lo único que debería cambiar es la forma de declarar el pool de conexiones.

      Espero que esto te sirva de ayuda y siento no poder ayudarte más ya que no he trabajado con JBoss. Si consigues ponerlo en marcha con JBoss sería buena idea que lo comentases aquí para que los demás también lo vean.

      Saludos

  42. Luis Antonio

    Estimado amigo, te felicito por el gran aporte.
    Quisiera saber como añadir mas atributos en la tabla productos. Me podrias explicar que archivos debo configurar.
    Gracias

    • Hola Luis Antonio:
      En primer lugar gracias por el comentario y me alegro de que te sirva para aprender.
      Si quieres añadir atributos a los productos lo que debes de hacer es en primer lugar modificar la tabla de productos de la base de datos y luego deberás por supuesto modificar las operaciones de añadir, modificar y obtener producto de la base de datos. Luego en la parte de las vistas lo que tendrás que hacer es modificar la vista de añadir, modificar y mostrar producto y respecto a los Servlet te toca hacer lo mismo, modificarlos para que reciban los nuevos parámetros de la vista que has modificado. A nivel de seguridad deberías validar los nuevos atributos que vayas a introducir creando por ejemplo expresiones regulares para los mismos, tanto en la validación por JavaScript como en la validación en servidor usando la librería ESAPI.
      Te dejo a continuación dos tutoriales que te van a servir para hacer las validaciones tanto en cliente como en servidor.
      http://jdiezfoto.es/informatica/vanadium-validacion-de-formularios-con-jquery/
      http://jdiezfoto.es/informatica/java-ee-seguridad-en-aplicaciones-web-ii-evitando-inyeccion-sql-y-xss-con-esapi/

      Espero que con estas anotaciones te sea suficiente para modificar lo que deseas. Por otra parte, espero que hayas visto que he dejado a disposición del público en este mismo artículo una documentación de la estructura de la aplicación y detalles sobre su funcionamiento. Si tienes alguna duda más no dudes en preguntar.

      Un saludo!

  43. eduardo

    me sale este error, como puedo solucionarlo (ya segui el video)
    deploy?DEFAULT=C:\Users\eduardo\Downloads\OnlineShop\build\web&name=OnlineShop&force=true failed on GlassFish Server 3.1.2
    Error durante el despliegue: Exception while loading the app : java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: java.lang.RuntimeException: No se ha podido iniar la aplicación, parámetros de contexto incorrectos. Consulte server.log para obtener más información.
    C:\Users\eduardo\Downloads\OnlineShop\nbproject\build-impl.xml:1127: The module has not been deployed.
    See the server log for details.
    BUILD FAILED (total time: 5 seconds)

    • Hola Eduardo:

      Este problema se da porque alguno de los parámetros del descriptor de despliegue web.xml no es correcto. Aunque hayas seguido el vídeo puede que te hayas equivocado en alguno de ellos. Si quieres puedes mandarme los parámetros que has puesto mediante el formulario de contacto que puedes encontrar el menú e intento ver cual puede ser tu error.

      Un saludo!

  44. hola que tal primero para agradecerte esta muy bien documentado, unda duda cuando haces el registro de un nuevo cliente la direccion de su casa da muchos errores

    • Hola Luis:
      Gracias por el comentario, me alegro de que te sea de utilidad. Dime los errores que te dan en el registro del nuevo cliente.
      Si es un error muy largo mejor que me lo mandes por el formulario de contacto de la web.
      La dirección tiene que tener el formato que pone cuando se indica “Ejemplo: ” en el mismo formulario ya que la dirección es validada según ese formato. Si copias y pegas el texto de ejemplo debería de pasar la validación sin mayor problema.

      Un saludo!

  45. irving

    cuando quiero dar de alta a un usuario me pide contraseña con una validación de datos bastante difícil y me sale ese error porque no se que tanto puede contener si hay alguna manera de poder cambiar esa validación se lo agradeceré mucho

    • Hola Irving:
      No me has indicado el error que te sale, supongo que te referirás a que la contraseña que introduces no cumple con la expresión regular que uso para validar la misma.

      Para cambiar esta validación hay que cambiarla en dos lugares, en el cliente mediante JavaScript y en el servidor. Vayamos primero a la parte del servidor.

      En la clase java control/Tools.java puedes encontrar el método validatePass(), verás que dentro del método se llama a un método de validación de la librería de seguridad ESAPI y que uno de los parámetros es 20, eso indica la longitud máxima de la cadena a validar. Por otra parte verás que otro de los parámetros es “Pss”, esto indica la expresión regular del fichero de configuración de ESAPI con el que se está validando la contraseña. Ese fichero lo puedes encontrar en el directorio setup/validation.properties. Verás que ahí aparecen las expresiones regulares usadas para las validaciones, las puedes cambiar si deseas.

      En lo referente a la validación mediante JavaScript puedes encontrar la validación de la contraseña dentro de la librería JQuery usada para la validación que es VanadiumJS, en los archivos web busca el siguiente fichero scripts/vanadium.js. Y en este caso la librería ya tiene una validación por defecto para contraseñas.

      Te dejo a continuación algunos artículos que he escrito que te pueden ayudar para realizar las operaciones que te he indicado.

      Espero que esta respuesta te sea de ayuda, si aún así tienes problemas no dudes en preguntar.

      Un saludo.

  46. EDUARDO ALEJANDRO

    HOLA QUE TAL. PRIMERO QUE NADA TE FELICITO POR EL PROGRAMA ME SERVIRÁ PARA ANALIZAR TU CODIGO Y ENTENDER LOS METODOS DE SEGURIDAD QUE LE HAS PUESTO PERO TENGO UN PROBLEMA CUANDO LO DESPLIEGO !!! ME SALE ESTE ERROR

    Initializing…
    deploy?DEFAULT=C:\Users\EL_REY_ALE_ALEJANDRO\Documents\OnlineShop\build\web&name=OnlineShop&force=true failed on GlassFish Server 3+
    Exception while loading the app : java.lang.Exception: java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: java.lang.RuntimeException: No se ha podido iniar la aplicación, parámetros de contexto incorrectos
    C:\Users\EL_REY_ALE_ALEJANDRO\Documents\OnlineShop\nbproject\build-impl.xml:1114: The module has not been deployed.
    See the server log for details.
    GENERACIÓN INCORRECTA (total time: 10 seconds)

    NO SE SI ME PUEDES APOYAR DICIENDOME QUE ES O POR QUE GENERA ESTO GRACIAS Y SALUDOS

    • Hola Eduardo:

      Me alegro de que te sea de utilidad. Muchas gracias por el comentario. Intenta no escribir en mayúsculas ;)

      Respecto al error que te da es un error por tener mal configurado algún parámetro en el descriptor de despliegue de la aplicación. Has seguido las instrucciones y has visto el vídeo para prepararlo perfectamente para el despliegue?

      Si ya has configurado todos los parámetros ye te sigue dando el error coméntamelo e intentamos ver cual es el fallo.

      Un saludo

    • EDUARDO ALEJANDRO

      Hola de nuevo, gracias por la recomendacion te agradesco por otro lado te comento que sigue apareciendo ese error lo configure conforme a el video pero no se que pueda ser…!!!

    • Debe ser que algún parámetro de los que has configurado lo tienes mal configurado.
      Si quieres puedes usar el formulario de contacto y me puedes pegar ahí los parámetros del web.xml que has puesto. El formulario de contacto lo tienes en el menú superior del blog.
      Un saludo!

  47. Carlos T

    Esto es increible… muchas gracias…

    • Muchas gracias por el comentario.

      Me alegro de que te parezca tan bueno. Si tienes cualquier problema no tienes más que comentarlo :)

      Un saludo!

  48. felipe

    Hola Juan antes de nada gracias por el proyecto que has compartido.

    Veras estoy leyendo la documentacion del proyecto “DocumentacionTiendaOnlinePublicar_v2.pdf” en la pagina 35 mensionas que “la función de previsualización ha sido eliminada en la última versión” al revisar las JSP noto que el archivo “preview_prod.jsp” existe y me ha entrado la duda si el archivo que tengo es la ultima version o no, no se si pudieras por favor poner el enlace a la ultima version o al apartado que lo contiene, no he descargado las fuentes desde el netbeans si no en un zip de 37 megas llamado “OnlineShop.zip” no se si son las fuentes version 1 ó 2.

    Otra mas que nada curiosidad es si tu estas tomando esas fotos, no soy un experto de en fotos y como observador me parecen de una buena calida, no se que camara usas dicho sea de paso ademas de que claro se deben conciderar aspectos de luz.
    saludos

    • Hola Felipe:

      El zip que hay en zona de descargas es de antes del cambio de haber eliminado la previsualización porque había gente que tenía problemas descargándolo del repositorio, por lo que no es la última versión. Si tienes problemas para bajarlo del repositorio de google code dímelo y lo vuelvo a subir por separado en un zip cuando pueda.

      Respecto a las fotografías del blog, salvo que ponga lo contrario son todas realizadas por mi, la fotografía es mi otra afición. Me alegro que te hayan gustado. La cámara que uso es la Nikon D-90, aunque como bien mencionas no es la cámara lo más importante sino la luz y otros aspectos.

      Muchas gracias por el comentario y un saludo!

    • felipe

      Hola Juan primero gracias por la respuesta
      Y lo acabo del descargar del repositorio asi que asunto solucionado. Ahora una consulta adicional, veras entre que revisaba la documentacion del protecto encontre un foro en donde mension lo siguiente:

      “Segun la especificacion J2EE dice que NO debemos colocar los archivos de presentacion (jsp, imagenes, etc) dentro de /WEB-INF/ , es decir, no debemos de mezclar la capa de la Vista con el Controlador/Modelo.” esta es la fuente: http://www.forosdelweb.com/f45/para-que-ponen-jsp-dentro-web-inf-614227/

      No se que de cierto sera o si es conveniente o no tener archivos JSP en la carpeta, se que el proyecto es un modelo -por cierto bien realizado- a seguir, y las preguntas serian

      1) ¿se puede tener archivos de presentacion en la carpeta WEB-INF?
      2) Si no se recomienda ¿que salida podria tenerse en el poryecto? digamos si desearamos hacer el cambio en el proyecto ¿que aspectos de seguridad debemos establecer si se pasan esos JSP junto a los demas, aparte de las rutas a las cuales los servlets direccionan? , por que como mensiona ese comentario la capeta WEB-INF no es visible al cliente.

      Saludos y siempre gracias

    • Hola, me alegro de que haya funcionado sin problemas.

      Yo no veo que haya problema en que haya JSP visibles al usuario, la verdad es que no entiendo mucho la conversación que me has mandado del post. Creo que el problema no es ese. El problema es que el usuario no debe acceder a un determinado recurso salvo que esté en determinadas circunstancias.

      Ya ves que yo validación si que hago mediante filtros y que la zona de administración está fuera de WEB-INF. Luego el problema no es la seguridad o eso pienso yo. Como ves lo único que he metido yo en esa carpeta sino recuerdo mal es la página de salida. No es lógico que nadie acceda a la vista de cerrar sesión si no es porque ha cerrado la sesión y tenía una iniciada que cerrar. Por ello está ahí esa página. Solo se puede mostrar programáticamente de manera que solo se muestra cuando yo decido que se muestre pero no se puede acceder poniendo la URL.

      No se si me has entendido mas o menos con esto…

      Un saludo

    • felipe

      Hola Juan nuevamente gracias
      La respuesta es clara.

      saludos

    • Me alegro de que haya sido de utilidad. Cualquier otra cosa ya sabes :)

      Un saludo!

  49. Buenas como vamos
    Gracias por compartir sus conocimientos no muchos hace eso

    una pregunta despliego el proyecto y me genera un error
    SEVERE: Exception while loading the app : java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: java.lang.RuntimeException: Errores en la incialización de persistencia, imposible iniciar aplicación

    configure la BD el web.xml y me genera el error

    gracias de antemano

    • Buenas como vamos
      ya solucione ese problemilla gracias de todas formas

      pero ahora tengo otra inquietud que es sobre la conexion a la BD
      en la clase PersistenceBD.
      no se como conecta me explico

      Context env = (Context) new InitialContext().lookup(“java:comp/env”);
      es para crear el para la busqueda del contexto
      usted llama en la busqueda (java:comp/env ) , luego no se coloca el nombre que le dio a JNDI que usted lo llamo jdbc/Onlineshop

      y lo que usted llama String datos
      pool = (DataSource) env.lookup(datos); luego no es lo que esta llamando en el contexto

      muchas Gracias

    • Hola:

      Si miras en el manual de Java EE verás que la cadena java:comp/env es el lugar donde buscar los recursos como bien comentas.

      Ese String datos se llama así porque si ves el proyecto está preparado para hacer persistencia sobre ficheros y para ello hacen falta más cadenas. Y la clase PersistenceBD implemente la interfaz PersistenceInterface por eso recibe más parámetros de los que usa.

      Si ves la línea del web.xml número 223 verás que ese parámetro se usa para una cosa en la persistencia de ficheros y para poner el nombre del recurso JNDI en caso de persistencia a Base de Datos. Por lo tanto el String que tu dices será jdbc/OnlineShop.

      Puedes ver todo el proceso de Inicialización en la clase StartListener.

      No se si me he explicado bien, si no lo has entendido no dudes en volverme a preguntar.

      Saludos

    • Hola

      En primer lugar muchas gracias por tus agradecimientos.

      El problema ese es porque no encuentra el recurso de conexión (pool de conexiones) en el servidor de aplicaciones. Si sigues el vídeo del tutorial seguramente logres configurarlo correctamente y sino me preguntas sin problemas.

      Saludos

    • ¿Cómo lo has solucionado Juan? Es que a mí me sale ese error también.

    • Por lo que vi en tu mensaje ya lo has solucionado.
      Este error se da típicamente porque no se encuentra el pool de conexiones. Eso es porque el nombre está mal indicado o porque no se ha declarado bien en Glassfish, yo creo que esas son las principales razones del error.
      Un saludo!

  50. Hola Juan,

    Muchas gracias una vez más por haber compartido tu proyecto. Soy novato en el mundillo del desarrollo web y me está resultando de mucha utilidad.

    Te quería preguntar, me gustaría poder ejecutar la aplicación en mi entorno habitual de desarrollo, que es Eclipse con Tomcat. Crees que sería muy complicado cambiar de Glasfish a Eclipse? Algún consejo que puedas darme sobre como proceder para este cambio?

    Tu ayuda es muy apreciada…

    Muchas gracias y un saludo.

    Leo.

    • Hola:

      No he trabajado nunca con Tomcat y Eclipse. No se si la pregunta que me haces está bien formulada porque me preguntas por cambiar de Glassfish (servidor de aplicaciones) a Eclipse (entorno de desarrollo).

      En cualquier caso, el descriptor de despliegue web.xml es estándar de Java EE por lo que debería de funcionar con Tomcat. Lo que no estándar es el que se llama sun-web.xml que es propietario de GlassFish para definir los recursos como el pool de conexiones de la base de datos. Por lo que, lo que deberías hacer es como definir el pool de conexiones en Tomcat, ya que por el resto de la aplicación en principio te debería de funcionar sin problemas.

      Espero tus noticias y si lo consigues estaría bien que lo contases aquí.

    • Hola Juan,

      Muchas gracias por tu respuesta. Disculpa, efectivamente hay un error en la pregunta. Lo que pretendo es cambiar de Glassfish a Tomcat y de JavaBeans a Eclipse.

      Intentaré el cambio del pool de conexiones y os cuento los resultados.

      Muchas gracias una vez más.

      Leo.

  51. Gustavo P.

    Gracias Juan ,, ahora ya tengo todo funcionando a la perfeccion.

    1. Referente al ultimo comentario quize decir “ping” el de la conexion a la Base de Datos;
    puse mal la Url del servidor.

    2. Me parecio muy interesante los redirecionamiento segun la clave del usuario
    a diferentes menus que lo denominas Preferencias,,,,Cliente o Administrador, los
    graficos , imagenes..

    3. Un detalle al confirmar la venta aparece un mensaje que no se pudo mandar el email
    y efectivamente no manda.

    Un abrazo ,,, entrare a estudiar los programas que es lo que estube buscando
    un buen tiempo.

    • Muchas gracias de nuevo por tus palabras.

      Respecto al mensaje del email revisa los log de GlassFish que aparecen en el NetBeans a ver si das con la causa del error y revisa que los parámetros del correo estén bien configurados.

      Un saludo!

  52. Gustavo P.

    MUCHAS GRACIAS JUAN EL CARRITO ARRANCO

    Encontre mi error ,, el pin de la conexion , ,, disculpa por el contratiempo.

    Una consulta web,xml

    246 admin@example.com
    251 Administrador

    Donde tenguo la clave por defecto del Administrador , en la base de datos esta cifrado

    Gracias nuevamente por darnos la oportunidad de aprender.

    • Hola Gustavo:

      Me alegro de que solucionaras el fallo ¿A que te refieres con el pin?

      La clave por defecto del administrador va en la línea 251. Pero esto es por si cuando inicias la aplicación no hay ningún usuario y entonces se crea este, si después se cambia esto no es tenido en cuenta. Y el usuario administrador por defecto es el de la 246.

      En la base de datos las claves no están guardadas, sino la huella MD5 de la clave más un añadido que no me acuerdo cual es, pero está en el código.

      Un saludo!

  53. Gustavo P.

    Juan te explico paso a paso

    1,- Configuracion del pool conexiones puerto 4848
    me pide user y passwoord con admin ,adminadmin no pude ingresar
    configure en el puerto 8080 y logre la conexion y la referencia JDNI
    2.- configuracion web.xml segun video
    230 qlf447 // la base de datos
    256 smpt.hotmail.com
    268 guparo
    272 true
    276 guparo@hotmail.com
    280 miclave
    3.-clean and build
    BUILD SUCCESSFUL (total time: 25 seconds)
    4,- Deploy
    deploy?DEFAULT=C:\Programacion\NetBeans\OnlineShop\build\web&name=OnlineShop&force=true failed on GlassFish Server 3+
    Error occurred during deployment: Exception while loading the app : java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: java.lang.RuntimeException: No se ha podido iniar la aplicación, parámetros de contexto incorrectos. Please see server.log for more details.
    C:\Programacion\NetBeans\OnlineShop\nbproject\build-impl.xml:1116: The module has not been deployed.
    See the server log for details.
    BUILD FAILED (total time: 52 seconds)

    5.- No se si se debe al puerto que puse 8080 o tengo un error ‘

    MUY AGRADECIDO VEO TU TRABAJO TAN INTERESANTE .. Y BIEN DOCUMENTADO

    • Lo primero gracias por tus palabras de agradecimiento Gustavo.

      He revisado los parámetros que has puesto y parecen correctos salvo que no me has comentado el nombre del recurso JNDI del pool de conexiones (línea 224). El error que sale es una excepción que lanza el programa al validar los parámetros del web.xml puede ser que alguno que no me hayas dicho haya fallado la validación o similar. Puedes usar el depurador para ver en que línea falla y así ves en que parámetro ha fallado la validación. Puede haber sido un error mío validando también, no lo niego.

      Miralo y me comentas a ver si vemos algún problema más. Estoy a tu disposición.

      Un saludo!

  54. Buen trabajo, muy completo y facil de instalar con la documentacion que diste.
    Si no te molesta te hago un par de consultas estudiantiles:

    1) Por que elegiste hacer el control con tus propios servlets y no usar un framework como struts, java server faces o Spring.

    2) Sabes de algun servicio de hosting que en su version gratuita te permita desplegar aplicaciones java j2ee.

    3) Java EE versus PHP (con un buen framework como Zend), basado en tu experiencia cual preferis.

    Saludos y gracias por compartir tu trabajo.

    • Hola Ana:

      Muchas gracias por el comentario. Me alegro de que haya sido de utilidad. Te respondo a tus preguntas.

      1. Era un trabajo de iniciación a la programación en Java EE, por lo tengo creo que lo mejor para empezar es hacer las cosas un poco a más bajo nivel. Si empiezas directamente usando Frameworks como indicas puede que no te enteres de la “magia” que hay por debajo. Por ello me parece buena idea hacerlo así y además con un ejemplo de dimensiones considerables como este se pueden ver muchas situaciones posibles.

      2. La verdad es que no conozco servicio de hosting que permita desplegar aplicaciones Java EE gratuitamente pero seguro que hay alguno. De todas maneras depende de lo que quieras hacer no es muy complicado desplegar un GlassFish en un Linux, si lo que quieres hacer son pruebas no esta mal hacerlo en un PC que tengas por ahí sin uso.

      3. Yo no he programado aplicaciones en PHP. Pero si las he visto. PHP desde luego es más ligero y en costes mucho más barato, compara los precios de un hosting compartido con un vps o servidor dedicado. Por otra parte un servidor Java EE te da una serie de garantías que no da apache como colas, transaccionabilidad, etc… En resumen, si quieres hacer aplicaciones empresariales te diría que la mejor opción no es PHP, pero si quieres hacer un aplicaciones que no requieran tantas garantías me parece un desperdicio de recursos desplegar todos los requisitos que requiere un servidor Java EE para funcionar.

      Espero haberte resuelto tus preguntas. No obstante si tienes cualquier otra cuestión estaré dispuesto a resolverla en la medida que pueda.

      Un saludo!

  55. Abraham rios

    Mira, hay una parte que sensuras en el video donde pones datos en el XML y otra parte donde censuras a la hora de agregar propiedades en el galssfish, podrías poner ejemplos de como son o como se forman dependiendo que?

    • Las partes del vídeo que están censuradas son solo los datos de conexión a las bases de datos y correo. Están censuradas porque no iba a poner en el vídeo los datos personales de acceso.

      En cualquier caso si hay algo que no entiendas no tienes más que comentármelo y te digo que es lo que tienes que poner en cada campo sin problemas.

      Un saludo!

  56. Hola Juan, muchas gracias por compartir con nosotros todo este proyecto. También soy nuevo en elmundo de la programación web, así que disculpa si pregunto alguna tontería :)

    Mi problema es que al hacer el deploy del proyecto me aparace el error:

    Error durante el despliegue: Exception while loading the app : java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: java.lang.NullPointerException. Consulte server.log para obtener más información.

    Tambien me da eeror al hacer elping a la base de datos desde elconfigurador del pool de conexiones. Por tus comentarios deduzco que se trata de un error en el archivo web.xml, pero me lo he repasado bien y creo que he hecho todos los cambios que mencionabas en el tutorial. Te envío el archivo web.xml por el formulario de contacto por si le puedes echar un vistazo.

    A ver si puedo desplegarlo con exito y probar la aplicación.

    Muchas gracias por tu ayuda.

    Un abrazo.

    Leo.

    • Hola Leo:

      He revisado tu web.xml y creo que todo está correcto. Debe de tratarse de un problema con la Base de Datos, si el ping a la misma no te funciona es que no la has configurado bien. Que funcione el ping o no es algo dependiente de la BD y de los parámetros que hayas puesto para configurarla, no tiene nada que ver con el web.xml. Si no funciona el ping la aplicación no va a funcionar.

      Saludos

    • Hola Juan,

      Muchísimas gracias por tu rápida respuesta. Los datos de configuración que tengo son los siguientes, hay algo que pueda considerarse como causa del problema?

      Url: jdbc.mysql://127.0.0.1
      serverName: localhost
      user: root
      portNumber: 3306

      Muchas gracias una vez más.

      Un saludo.

      Leo.

    • Perdona por tardar en responder. Ya te he respondido al correo que me has mandado. A simple vista parece correcto, simplemente te he comentado que pruebes a poner localhost en vez de 127.0.0.1

      Un saludo!

    • Gracias Juan. Funciona poniendo jdbc:mysql://localhost:3306/NombreBaseDatos.

    • Muchas gracias por responder con la solución que encontraste a tu problema, seguro que a otros les sirve tu comentario ;-)

      Un saludo

  57. Tavo Gtz

    Hola, buen día a todos. Espero que alguien me pueda ayudar. Verán, soy nuevo en el lenguaje Java y el manejo de base de datos. Es por eso que estoy teniendo dificultades en la consola de administracion en la dirección localhost 4848

    Espero nadie se moleste por mi ignorancia, pero me gustaría que me explicarán exactamente como puedo saber las propiedades que tengo que ingresar.
    Por ejemplo:

    Esto es lo que yo estoy haciendo, estoy poniendo la dirección IP en la url, asi;

    Url: jdbc.mysql://127.0.0.1
    serverName: localhost
    user: root

    Pero al momento de guardar los cambios, me aparece el siguiente error:

    Ping Connection Pool for jdbc/OnlineShop is Failed. Ping failed Exception – null Please check the server.log for more details. Ping failed Exception – null Please check the server.log for more details.

    • Hola, nadie se molesta por que preguntes :)

      Los datos que estas poniendo a simple vista parecen correctos y tienen sentido.

      El error que te da es porque no puede hacer un ping a la base de datos, lo único que se me ocurre es que tengas la base de datos apagada porque con ese usuario no puede ser un problema de permisos al ser el root.

      Espero que se solucione :)

  58. mmmmmmmmm hola que tal nose si me puedan ayudar con netbeans 7.2 tengo mi proyecto de una editorial pero me sale en librerias missing java EE server como error bueno espero puedan ayudarme con esto porfas……. :=

    • La verdad es que no has especificado muy bien tu problema. Pero con la versión 7.2 de NetBeans en su edición de Java EE debe incluir las librerías de los Servlet, no debería dar problemas en este aspecto, y las demás librerías que se usan en el proyecto están incluidas en la descarga así que no deberías tener problemas.

      Si pudieras especificar mejor las librerías que te faltan te podríamos ayudar mejor.

      Un saludo!

  59. juan.fsc777

    hola juan tengo un problema al querer levantar el proyecto
    UTILIZE LAS SIGUIENTES HERRAMIENTAS
    === Netbeans 7.2. RC1
    ———————————————————————————————-
    —————————————-Team———————————————–
    Subversion—>Checkout
    y segui los pasos indicados
    ———————————————————————————————-

    ====para la DB utilize XAMPP de la siguiente forma en la conexion con netbeans

    cree la bd con el nombre de “nameBD” y lo importe el ExportModelo.sql
    ——————————————————————————————-
    driver name : Mysql(connector/J driver)
    host :localhost Port :3306
    database :nameBD
    Username :root
    password :

    test connection

    Connection Succeeded

    el error me sale cuando le doy ejecutar el proyecto OnlineShop el siguiente comentario
    ————————————————OnlineShop(run)x——————————————————
    deployment at C:\Users\Franclin\Documents\NetBeansProjects\OnlineShop\build\web
    Initializing…
    deploy?DEFAULT=C:\Users\Franclin\Documents\NetBeansProjects\OnlineShop\build\web&name=OnlineShop&force=true failed on GlassFish Server 3.1.2
    Error durante el despliegue: Exception while loading the app : java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: java.lang.RuntimeException: No se ha podido iniar la aplicación, parámetros de contexto incorrectos. Consulte server.log para obtener más información.
    C:\Users\Franclin\Documents\NetBeansProjects\OnlineShop\nbproject\build-impl.xml:1116: The module has not been deployed.
    See the server log for details.
    BUILD FAILED (total time: 6 seconds)
    ———————————————————————————————————————————-
    solo se que no es con la conexion de la base de datos, porque no levanta ni la pantalla de inicio de la tinda en linea de agradeceria mucho que me ayudes a resolver el problema anticipadamente o alguien que ya lo resolvio

    • Hola:

      Perdona por tardar en responder, he estado bastante ocupado.

      Respecto al problema que te da la aplicación significa que los parámetros de contexto no son correcto, alguno de los ajustes que hablé de hacer no lo has hecho bien sobre el desciptor de despliegue. Habría que verlos para ver cual puede estar fallando.

      Espero tu respuesta a ver si lo podemos solucionar. Un saludo!

  60. Juan Ignacio Sánchez

    Hola Juan,

    Gracias de antemano por exponer tan bien el contenido del proyecto. ¡Un lujo!.
    He conseguido, con algún inconveniente, deployar la aplicación con éxito y ahora queda la parte más interesante estudiarla y aprender con ella. Si observara algo de relevancia, sin duda, te lo haría llegar.

    Por si fuera de interés para alguien, los problemas que más me han costado resolver para poner en funcionamiento el proyecto han sido los siguientes:

    1) A la hora de dar de alta el POOL de conexiones me he pegado con la propiedad password ya que la instalación por defecto que he hecho del mysql es la que realiza de manera automática el XAMPP junto con Apache, Filezilla, Mercury32, Tomcat.
    Para mysql el password del usuario Admin es “Blanco” y para que la consola de Glassfish lo entienda hay que insertar los siguientes caracteres: ()

    (Otras soluciones pasan por cambiar en mysql la pasword del usuario (de la base de datos del proyecto) que se fuera a parametrizar en Glassfish por otra que no sea “Blanco” y evitar así el problema).

    2) Y esta me pasa por no copiar literalmente. En la definición del POOL y del JNDI se establecen para su referenciación los siguientes nombres: jdbc/OnlineShop. Pues bien, si no te fijas, como yo!! y los nombras de la siguiente manera: jdbc/OnLineShop, para posteriormente hacer referencia a jdbc/OnlineShop en los ficheros de contexto, de seguro que pasarás un rato preguntándote ¿por qué no puedo desplegar el proyecto?.

    Un saludo y de nuevo muchas gracias por la oportunidad que nos proporcionas.

    • Hola Juan Ignacio:

      En primer lugar agradecerte enormemente las alabanzas que me haces.

      También darte las gracias por este comentario, sin duda alguna es de agradecer para todo el mundo que no solo uses el proyecto sino que ayudes a los demás en los problemas que te has encontrado facilitando la labor a los demás si se encuentran problemas similares.

      Por supuesto, como dices si encuentras alguna falla o tienes algún problema no dudes en hacérmela llegar.

      Muchas gracias. Un saludo!!

  61. Juan Antonio

    Buenos días.

    Cuando importo el proyecto en Netbeans 6.7.1 (el contenido del fichero OnlineShop.zip), el Netbeans me dice que tengo que indicarle que Servidor de Aplicaciones se va a utiliar (Resolve Missing Server Problem), entonces con el botón derecho sobre el proyecto le doy a Resolve Missing Server , y partir de ese momento el NetBeans me lanzá una serie de expeciones y se me queda colgado. ¿Es que hace falta alguna versión específica del Netbeans???? Esto consultando en Internet pero la verdad es que no encuentro nada que me ayude, y estoy bastanta interesado en estudiar tu proyecto porque me ayudaría en un curso que estoy haciendo.

    GRACIAS

    • Te he respondido al correo que me has mandado por el formulario de contacto.

      Un Saludo

    • Juan Antonio

      Os comento que instalando el Netbeans 7.2 se soluciona el problema. Por lo tanto era que no rula la versión 6.7 con el proyecto.

      Un saludo

    • Muchas gracias Juan Antonio por dar a conocer la solución por si alguien le pasa lo mismo. Posiblemente se debiera a las librerías de Java EE que incluyese la versión del NetBeans con la que trabajases que es posible que fuera bastante más antigua a la que he usado yo.

      Un saludo!

  62. Buen dia Juan , para empezar quiero agradecerte tu gentileza de poderme atenderme tan pronto y en forma desinterezada; todo esto me motiva mas para ver si mas adelante yo pudiera seguir tus pasos.
    Te envio mi configuracion del Deployment Descriptor

    Web.xml
    archivoHistoriales
    230 qlf447
    hotMail
    256 smpt.hotmail.com
    mailUser
    268 mi usuario
    authMail
    272 true
    mailPass
    280 mi clave
    309
    NOTA. Casi al final elimine algunas lineas segun pude observar en el video

    • Lo cierto es que no veo así algo que me llame la atención que pueda estar mal. Respecto a las líneas que has eliminado que lineas son?, no recuerdo haber eliminado linea alguna en el vídeo.

      Si quieres me puedes mandar el archivo completo por correo electrónico y lo reviso a ver si veo algo raro. http://www.jdiezfoto.es/contacto.html

      Saludos!

  63. Saludos Juan , disculpa la molestia ; al hacer el deploy al proyecto me sale el mensaje error,, las verdad no se donde me pude equivocar soy nuevo pero estoy aprendiendo bastatante,,, gracias por tu aporte.
    Error occurred during deployment: Exception while loading the app : java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: java.lang.RuntimeException: No se ha podido iniar la aplicación, parámetros de contexto incorrectos. Please see server.log for more details.
    C:\Users\Owner\Downloads\OnlineShop\OnlineShop\nbproject\build-impl.xml:1118: The module has not been deployed.

    • Este error es debido a que alguno de los parámetros del descriptor de despliegue web.xml no es correcto. Has de echar un ojo al vídeo para ver como se configura el web.xml antes de su puesta en marcha. En caso de haberlo visto y completado todo lo que ahí pone lo que puedes hacer es concretarme que es lo que has puesto en cada uno de los parámetros.

      Un saludo!

  64. Gustavo

    Gracias de todas maneras ya pude obtener las sentencias SQL

    • Aunque ya las tengas para recalcarlo decir que están enlazadas desde este mismo post.

      Un saludo!

  65. Gustavo

    Felicitaciones por tu exelente trabajo y gracias por darnos la opotunidad de poder aprender .
    Mi consulta es : donde puedo obtener las SENTENCIAS SQL para crear las tablas de la BD.
    Si tambien alguien me puede ayudar les agradesco por adelantado.
    Saludos para todos.

  66. Buenas a todos !…
    no se como explicarlo pero lo voy hacer a ver si me entienden
    El problema es a la hora de configurar el SMTP por que hago lo que esta en el vídeo y el la documentación y persiste el mismo error no se si estoy configurando mal el SMTP, e buscado el google y me dice que hay que instalar un software para que funcione el SMTP y la otra es que si no se si estoy configurando bn el SMTP en el archivo web.xml.

    Si hay alguien que me pueda colaborar se lo agradecería y que vergüenza mi ignorancia

    Gracias de antemano

    • jhonny

      talvez estas configurando mal el SMTP porque en el video se ocultan ciertas cosas que son privadas y eso toca investigar…….

    • No hay que instalar ningún SMTP sino quieres. Puedes usar como he dicho en otras ocasiones el servidor SMTP de una cuenta de Gmail. En las opciones de la cuenta puedes encontrar la configuración y la usas para poner en el descriptor de despliegue web.xml

      Ya me contarás como va con esto. Un saludo!

    • Buenas !…..
      Como vamos bn

      tengo un inconveniente o mejor muchos jejejej
      cuando estoy products.jsp en la opción añadir producto a ala cesta me arroja el siguiente error
      Error 404 No encontrado cierto

      estuve revisando el código entonces encontré esto

      <a href="/shop/addcart?prod= &cant=1″>

      es el direccionamiento para añadir productos al carrito cierto,
      pero no encontré ningún jsp addcart en la carpeta shop y utilice las diferentes jsp como cart, buycart y me
      arroja el mismo error.

      y la otra duda es la var &cant=1 no se que hace luego la condición no la hace de esta manera 0){ %>

      si me puedes ayudar te lo agradecería

      Saludos!!……

    • Hola: Ya te he respondido mediante correo electrónico al mensaje que me dejaste :)

      Saludos!

    • Buenas !…. o traves yo jejejejej
      si ya habia encontrado la logica pero gracias por tomarse la molestia de contestar esas cosas que son tan tan tan…….

      pero persiste el error no e podido encontrar el porque
      primero que todo el la opcion de <a href="/shop/addcart?prod= &cant=1″, el problema es que cuando le agrego la var para (&cant=1 ) la cantidad de articulos lo toma como error el jsp.
      lo ejecuto pero en la url si tomo los datos
      http://localhost:8080/shop/addcart?prod=3%20&cant=1

      pero al pintar el formulario se ejecuta error 404 No encontrado
      No se a encontrado el recurso solicitado. por favor revise su petición

      Gracias de antemano

    • No he ejecutado la aplicación ahora para revisar las cosas pero creo que se a que puede ser debido el error y es que el Servlet de destino comprueba los parámetros de la petición y en caso de ser una validación fallida lo que hace es dar un error 404 (por cuestiones de seguridad para no dar pistas de ningún tipo a un posible atacante y así piensa que la página no existe). Y según la URL que tu me muestras un producto no puede tener el 3 de código porque está hecho para que los códigos de los productos sean un UUID y si no lo es posiblemente por eso salga el error 404.

      Si no sabes lo que es un UUID te dejo un link a la wikipedia en inglés: http://en.wikipedia.org/wiki/Universally_unique_identifier

      A ver si con esto se soluciona, ya me contarás… Un saludo!

    • Buenas!…
      o través yo jejeje
      En cuanto a identificador único universal creo no estoy seguro que esta bien porque no solo el 3 aparece 3%20 cierto.

      y pues no se como hacer eso que usted dice de seguridad
      y el otro inconveniente es. No se si es el Netbeans porque a la hora de colocar ( & ) para la variable cant=1 me genera error, es un error todo raro (la referencia cant debe terminar con el delimitador ).

      si me puedes ayudar te lo agradecería y que vergüenza fastidiarle la vida

      Gracias de antemano

    • La verdad es que no te estoy entendiendo mucho lo que me estás contanto.
      En la aplicación original cada vez que se añade un producto el código de producto que se le asigna es un UUID que es generado de manera automática, y cada vez que se hace referencia a un producto en los parámetros de una petición se comprueba si el producto existe y si es un UUID o no.

      Respecto al ampersand (&) es lo que se usa para separar los parámetros de una petición HTTP cuando se usa el método GET Ejemplo:miweb.com/nueva_persona.jsp?edad=23&nombre=juan&sexo=masculino (es obvio que 4 no es un UUID, esto es solo un ejemplo de como se usa el ampersand ‘&’ )

      Espero que esto te aclare más las cosas… Un saludo

    • Buenas !…como vamos

      seguro no me entendio o no me supe explicar las dudas que tengo el incomveniente en cuanto UUID creo que si esta funcionando porque no ingrese todo el dato que mostraba que esta de esta manera

      ://localhost:8080/shop/addcart?prod=cef1aaf-1be6-46b7-bee6-bb5f7766bf60%60%20&cant=1

      y como me decia antes que (sale el error Error 404. No encontrado) porque no estaba funcionando el UUID, pero creo que si esta funcionado.

      pues el problema es lo que usted dijo de los datos fallidos (seguridad del Servlet ), ?

      Gracias:

    • Siento haber tardado en responder. Me alegro de que te haya funcionado con lo que te dije.

      Lo que pasa es que como te dije, antes de entrar a ejecutar las funciones de una Servlet se trata de validar que todos los parámetros son correctos. En este caso pues se comprueba que el parámetro prod tenga formato de UUID.

      Un saludo!

    • Buenas !….

      Como vamos
      Si el problema es que si me toma las datos como son UUID.
      el inconveniente que no me ejecuta,
      como ya le avía comentado del error que me sale al ejecutar la opción de añadir producto a la cesta, la ejecuto y me sale el error Error 404. No encontrado, (no se ha encontrado el recurso solicitado. por favor revise su petición)

      Gracias de antemano;

    • Si me pudieses pegar el error que haya en la consola de GlassFish para ver que es lo que pasa. Yo en cuanto pueda probaré a ver que es lo que puede estar pasando.
      Un saludo!

    • Buenas Como Vamos !…

      Lo que me arroja la consola es lo siguiente

      INFO:SecurityConfiguration fot ESAPI.Validator not found in ESAPI.properties. Using default:
      org.owasp.esapi.reference.DefaultValidator
      INFO:SegurityConfiguration for Encoder.AllowMultipleEncoding not found in ESAPI.properties. Using default:false
      INFO:SegurityConfiguration for Encoder.AllowMixedEncoding not found in ESAPI.properties. Using default: false
      INFO:SegurityConfiguration for ESAPI.Validator not found in ESAPI.properties. Using default:
      org.owasp.esapi.reference.defaultValidator
      INFO:SegurityConfiguration for Encoder.AllowMultipleEncoding not found in ESAPI.properties. Using default: false
      INFO:SegurityConfiguration for Encoder.AllowMixedEncoding not found in ESAPI.properties. Using default: false

      pues esto es lo que me arroja cuando ejecuto la opción de añadir a la cesta
      gracias!…………………

    • Hola: Tiene que haber más cosas en la consola, lo que me muestras son errores normales por no especificar todas las opciones de ESAPI (la librería de seguridad que usa la aplicación para realizar las validaciones)

      Como te digo, esos mensajes son normales, mira a ver que más puedes ver en la consola porque esto como digo es normal que salga por lo que no puedo decirte nada con ello.

      Un saludo!

    • Buenas !…
      pues no muestra mas, al parecer todo esta bien no se como sea esto porque lo que se ejecuta es la jsp de paginas de error 404.jsp pues no se si es de datos o del mismo programa que esta fallando.
      porque en la consola muestra errores normales pero no específicamente el error al ejecutar ingresar a la cesta

      Si por algo le envió todo lo sale en la consola desde que inicio la pagina pero como le digo no muestra el error de la ejecución

    • Te he respondido al correo, he borrado el log de aquí por lo largo que era. Simplemente que sepas que he visto el comentario :)

  67. Jhonny

    Hola amigo
    otra vez yo tengo otra pregunta mas puntual para que sirve este codigo ya que lo veo en las paginas jsp

    String menuInicio =
    ! String menuProductos =
    ! String menuLogin = “class=\”
    String menuPreferencias =
    String menuAbout = “”;

    el codigo esta al final de las paginas

    espero te des uin tiempito y me puedas ayudar con esta incognita que me esta fundiendo el cerebro :) !.
    GRAcias

    • He editado el comentario y borrado los otros dos anteriores Jhonny.

      Este código sirve para mostrar de diferente manera el elemento del menú en las distintas páginas. Me explico: en el menú aparece de diferente manera la página donde te encuentres que el resto de las páginas. Entonces si te fijas en menu.jsp lo que se hace es usar estos String que hay al final de todas las páginas (puesto que todas las páginas incluyen a menu.jsp) y si te fijas siempre son todos los String vacíos menos el que pone active, que es diferente en la página de inicio que en las páginas de preferencias y así para todo. En definitiva lo que se hace es usar o no usar (String vacío) una clase CSS.

      Espero que esto te ayude. Siento la tardanza pero ahora no tengo Internet disponible siempre. Un saludo!

    • Jhonny

      muchas gracias exelente respuesta entonces si digamos estoy craendo una tabla identica a productos que se llama adjuntos y quiero que se visualize en la aplicacion tendira que aumentar abajo un codigo que diga ! String menuAdjuntos =

      gracias por la respuesta….. tu sistema es exelente..

    • La verdad es que no se muy bien a que te refieres. Pero si esa tabla es una nueva página y quieres que aparezca en el menú superior pues pones el String para que use la clase CSS active como he hecho yo y también has de añadir el enlace a la nueva página en el jsp menu.jsp.

      Espero que esto ayude.

      Un saludo!

  68. Buenas !!…juan
    como vamos excelente su blog pero tener unos convenietes a la hora de desplegarlo
    en primer lugar cuando le ejecuto el proyecto me genera este error

    RAVE: Exception while loading the app : java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: java.lang.RuntimeException: No se ha podido iniar la aplicación, parámetros de contexto incorrectos

    y e estado leyendo los comentarios de los demas companeros y me di cuenta de ke abia descartado lo de el E-mail el envio de al correro electronico
    y pues lo descarte porque no se si lo estaria haciendo bien

    hostMail
    localhost

    y no se cual es el usuario para
    context-param>
    mailUser
    ***

    y pues la direccion de correos

    mailFrom
    juan.cupapedroza@gmail.com

    me despido de antemano agradeciendo la ayuda

    Gracias

    • Jhonny

      domoticodoc no puedes ignorar el email porque la aplicacion se levanta con el mail del usuario y por ende debe estar configurado el smtp, a mi tambien me dio ese error pero era porque no ctenia konfigurado el SMTP
      Saludos

    • Buenas !… otra ves yo es que no se como explicarme pero voy a ver si me entienden
      estoy configurando el SMTP pero el problema persiste me genera el mismo error no se si estoy configurando bn el SMTP.

      la verdad no se como se configura el SMTP si alguien me puede ayudar se lo agradecería
      y que vergüenza mi ignorancia

      Gracias de antemano

  69. Jhonny

    hola amigo espero me puedas ayudar con una explicacion no se para que son las Server REsources y no se si se te generan solas, y bueno ademas las partes de la persistencia las hize con un wisard osea importe las entidades desde mysql.. gracias la ayuda

    • La verdad es que no acabo de entender muy bien tus dudas. Si pudieses concretar más te intento ayudar con lo que sepa.

      Los Server Resources creo que te refieres a los recursos JNDI que eso es el recurso del pool de conexiones. El Pool se crea en el servidor de aplicaciones y es un recurso que usas en la aplicación. Respecto al wizard de NetBeans para crear nuevas conexiones la verdad es que no lo he usado nunca. Siempre creo el Pool en el servidor y obtengo el recurso dentro del código Java tal y como puedes ver en el proyecto.

      Un saludo!

    • Jhonny

      hola amigo, estoy haciendo un proyecto paralelo al tuyo entonces estaba importando todas las librerias que tu tienes y en la parte de abajo osea en la ultima carpeta aparece la carpeta que dice Server Resources, entonces mi duda era como se creaba la carpeta y sus clases?, vi en un post que eso te creaba el netbeans 6.9 o inferior y yo lo estoy haciendo con netbeans 7.2, ademas vi que esas clases son las mismas que estan en un paquete ubicado en una carpeta que esta en libraries… entonces mi pregunta seria para que sirven estas clases y como las creo?…. y bueno desconosco el porque no se me podia crear desde la consola de glasfish y por esto lo empeze a crear desde un wizard de netbeans…. gracias por la informacion y tu tan exelente aporte….. pondre tu nombre en los creditos del proyecto que estoy montando gracias!!!!!

  70. juanjo

    Hola juan como has estado?, otra vez yo juanjo jaja vieras que he estado trabajando en mi propio proyecto y quería preguntarte que me salio un inconveniente al tratar de crear un servlet con los pasos tradicionales CLICK DERECHO >> NEW >> SERVLET le doy CREAR y no puedo porque me sale este error:

    Web application version is unsupported. Upgrade web.xml to version 2.4 or newer or use previous version of NetBeans.

    No sabes como actualizar de version al menos a la 2.4 para que sea soportado, el web.xml que uso es el que me creo el netbeans que cosas verdad! lol
    jajaja

    ¡Gracias!

    ¡Un Saludo que la pases bien!

    • La verdad es que no se que puede estar pasando. Yo he usado el proyecto con las últimas versiones del netbeans. Además, el web.xml es algo estándar de JavaEE, no tiene nada que ver con el netbeans.

      Lo único que se me ocurre es que el fichero de configuración propio del.servidor ha cambiado el nombre con la compra de Sun por parte de Oracle que antes se llamaba Sun-web.xml y ahora glassfish-web.xml.

      De todas maneras a veces el netbeans hace cosas raras, reinicialo, cierra el proyecto etc…

      Un saludo!

    • juanjo

      Ok gracias Juan te agradezco, pura vida!!!! decimos aqui en Costa Rica
      Es cierto aveces el NETBEANS hace cosas raras pero es un buen IDE jaja

      Un saludo!!

    • Un placer Juanjo, me alegro de haberte ayudado. Un Saludo!!

  71. juanjo

    Hola juan de nuevo yo juanjo no sabes porque me sale este error ahora, de la nada salio este error ayer servia y hoy ya no, y ya lo compile usando esa opcion de compilacion, pero nada gracias!

    Note: Some input files use unchecked or unsafe operations.
    Note: Recompile with -Xlint:unchecked for details.

    compile:
    compile-jsps:
    Created dir: /home/juanjo/NetBeansProjects/OnlineShop/dist
    Building jar: /home/juanjo/NetBeansProjects/OnlineShop/dist/OnlineShop.war
    do-dist:
    dist:
    BUILD SUCCESSFUL (total time: 3 seconds)

    No sabes que sera?

    Saludos!

    • Eso se produce porque en algún lugar se usará algún método que este deprecado (entre otras razones) pero no es problema, es normal que salga eso; la compilación ha sido correcta, fíjate que pone Build Successful, eso es que todo ha ido bien.

      Ahí aparecen errores de compilación, si el código es correcto esa consola no debe preocuparte, la consola importante es la de GlassFish en donde aparecen los errores durante la ejecución.

      Un saludo!

    • juanjo

      ¿Que significa “deprecado” que quieres decir con eso?, si eso pensé que no era mucho problema porque sale BUILD SUCCESFUL, pero sin embargo no puedo abrir el proyecto en http://localhost:8080/ porque sale:

      Your server is now running

      To replace this page, overwrite the file index.html in the document root folder of this server. The document root folder for this server is the docroot subdirectory of this server’s domain directory.

      To manage a server on the local host with the default administration port, go to the Administration Console….

      ¿Que debo hacer para resolver esto?

    • Deprecado significa que son métodos que Sun ha decidido que ya no es seguro usarlos y los marca así en la API de Java.

      Eso es que tienes un problema a la hora del despliegue. Ten en cuenta que una cosa es compilar y otra cosa es desplegar en el servidor. Clean & Build limpia el directorio de compilados y después compila. Deploy lo que hace es desplegar en el servidor. Si no se ha desplegado es que tienes un problema en el despliegue y eso lo puedes ver en la consola de GlassFish, no en la consola de compilación que es lo que me has enseñado. Es decir, la compilación parece ser correcta pero has tenido problemas al desplegar. Ya me contarás lo que pone donde la consola de GlassFish.

      Un saludo Juanjo!

    • juanjo

      Hola juan amigo, ya he podido desplegar la aplicación nuevamente en mi web browser, pero sabes es algo extraño porque aunque me tira unos errores en la consola de glassfish, aun así despliega, y anteriormente no desplegaba la aplicación al momento de escribirte el mensaje pasado porque decia el error que te puse antes, sin embargo al desplegar hoy la aplicación el error que me manda en el consola de glassfish es el siguiente:

      Grave: at org.owasp.esapi.reference.DefaultSecurityConfiguration.getResourceStream(DefaultSecurityConfiguration.java:518)
      Grave: at org.owasp.esapi.reference.DefaultSecurityConfiguration.loadConfiguration(DefaultSecurityConfiguration.java:429)
      Grave: at org.owasp.esapi.reference.DefaultSecurityConfiguration.(DefaultSecurityConfiguration.java:227)
      Grave: at org.owasp.esapi.reference.DefaultSecurityConfiguration.getInstance(DefaultSecurityConfiguration.java:75)
      Grave: at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      Grave: at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
      Grave: at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      Grave: at java.lang.reflect.Method.invoke(Method.java:601)
      Grave: at org.owasp.esapi.util.ObjFactory.make(ObjFactory.java:86)
      Grave: at org.owasp.esapi.ESAPI.securityConfiguration(ESAPI.java:184)
      Grave: at org.owasp.esapi.ESAPI.validator(ESAPI.java:191)
      Grave: at control.Tools.validateEmail(Tools.java:87)
      Grave: at control.StartListener.startValidate(StartListener.java:99)
      Grave: at control.StartListener.contextInitialized(StartListener.java:23)
      Grave: at org.apache.catalina.core.StandardContext.contextListenerStart(StandardContext.java:4750)
      Grave: at com.sun.enterprise.web.WebModule.contextListenerStart(WebModule.java:550)
      Grave: at org.apache.catalina.core.StandardContext.start(StandardContext.java:5366)
      Grave: at com.sun.enterprise.web.WebModule.start(WebModule.java:498)
      Grave: at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:917)
      Grave: at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:901)
      Grave: at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:733)
      Grave: at com.sun.enterprise.web.WebContainer.loadWebModule(WebContainer.java:2018)
      Grave: at com.sun.enterprise.web.WebContainer.loadWebModule(WebContainer.java:1669)
      Grave: at com.sun.enterprise.web.WebApplication.start(WebApplication.java:109)
      Grave: at org.glassfish.internal.data.EngineRef.start(EngineRef.java:130)
      Grave: at org.glassfish.internal.data.ModuleInfo.start(ModuleInfo.java:269)
      Grave: at org.glassfish.internal.data.ApplicationInfo.start(ApplicationInfo.java:301)
      Grave: at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:461)
      Grave: at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:240)
      Grave: at org.glassfish.deployment.admin.DeployCommand.execute(DeployCommand.java:389)
      Grave: at com.sun.enterprise.v3.admin.CommandRunnerImpl$1.execute(CommandRunnerImpl.java:348)
      Grave: at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:363)
      Grave: at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:1085)
      Grave: at com.sun.enterprise.v3.admin.CommandRunnerImpl.access$1200(CommandRunnerImpl.java:95)
      Grave: at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1291)
      Grave: at com.sun.enterprise.v3.admin.CommandRunnerImpl$ExecutionContext.execute(CommandRunnerImpl.java:1259)
      Grave: at com.sun.enterprise.v3.admin.AdminAdapter.doCommand(AdminAdapter.java:461)
      Grave: at com.sun.enterprise.v3.admin.AdminAdapter.service(AdminAdapter.java:212)
      Grave: at com.sun.grizzly.tcp.http11.GrizzlyAdapter.service(GrizzlyAdapter.java:179)
      Grave: at com.sun.enterprise.v3.server.HK2Dispatcher.dispath(HK2Dispatcher.java:117)
      Grave: at com.sun.enterprise.v3.services.impl.ContainerMapper$Hk2DispatcherCallable.call(ContainerMapper.java:354)
      Grave: at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195)
      Grave: at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:849)
      Grave: at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:746)
      Grave: at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1045)
      Grave: at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:228)
      Grave: at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
      Grave: at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
      Grave: at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
      Grave: at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
      Grave: at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
      Grave: at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
      Grave: at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
      Grave: at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
      Grave: at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
      Grave: at java.lang.Thread.run(Thread.java:722)
      Información: Attempting to load ESAPI.properties via the classpath.
      Información: SUCCESSFULLY LOADED ESAPI.properties via the CLASSPATH from ‘/ (root)’ using current thread context class loader!
      Información: SecurityConfiguration for Validator.ConfigurationFile not found in ESAPI.properties. Using default: validation.properties
      Información: Attempting to load validation.properties via file I/O.

      Y aun asi despliega bajo estos errores, no se porque antes no me desplegaba y ahora si, sin yo hacer nada absolutamente que raro.

    • Lo que ha pasado con tu despliegue que antes comentabas que no funcionaba y ahora sí pues no se decirte, yo no estaba delante jeje. Pero lo que sí pudo pasar es que tuvieras algún problema temporal de conexión con la base de datos o similar.

      Respecto a los errorres que te tira ahora son normales y no impiden el funcionamiento correcto de la aplicación. Estos errores son debidos a que la librería de seguridad ESAPI (puedes encontrar información extensa y guías en este blog sobre ella) busca ficheros de configuración en varios directorios, en el classpath, en el directorio de usuario, etc… y en casa uno de ellos que busca da error hasta que en es búsqueda secuencial una de las opciones no da error y encuentra los ficheros de la configuración. Busca primero en un sitio, luego en otro y así recorriendo las opciones que da para situar los ficheros de configuración y da errores porque obviamente fallará en todas las opciones menos en las que estén los ficheros situados.

      En el caso de este proyecto me pareció bien situarlos en el ClassPath de la aplicación (en el ClassPath está incluida la carpeta setup) y puedes ver que encuentra con éxito los ficheros en el último mensaje.

      Información: SUCCESSFULLY LOADED ESAPI.properties via the CLASSPATH from ‘/ (root)’ using current thread context class loader!

      Espero que esto te aclare mejor las dudas Juanjo! Un saludo!!

  72. Marcos

    Warning Pool successfully created with the following Warning
    Ping Connection Pool failed for jdbc/OnlineShop. Class name is wrong or classpath is not set for : com.mysql.jdbc.jdbc2.optional.MysqlDataSource Please check the server.log for more details

    Sale error cuando configuro el GalassFishh

    • Hola Marcos:

      Este error se produce porque GlassFish no ha encontrado el conector JDBC de MySQL, el cual has de ponérselo tu. En el video que deje a disposición del público sobre la puesta en marcha de la aplicación está explicado como hacerlo.

      Si aún así te quedas con dudas quedo a tu disposición. Un saludo!

  73. juanjo

    Hola juan como estas?

    mi nombre es juan jose primero que nada felicitarte por ese proyecto que hiciste esta muy bueno desde todo punto de vista, y preguntarte que tengo una duda segui los pasos que tu decias en el video tutorial pero en la parte que estas hablando sobre el descriptor de despliegue y estas haciendo modificaciones de el servidor SMTP de correo yo no tengo un servidor SMTP entonces no hice nada en esos pasos mas le di clean and buil y luego deploy pero al darle deply me salio el siguiente error:

    Error durante el despliegue: Exception while loading the app : java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: java.lang.RuntimeException: No se ha podido iniar la aplicación, parámetros de contexto incorrectos. Consulte server.log para obtener más información.
    /home/juanjo/NetBeansProjects/OnlineShop/nbproject/build-impl.xml:813: The module has not been deployed.
    See the server log for details.

    no se si me puedes ayudar que sera lo que hice mal??

    muchas gracias de antemano y felicidades por tu logro!

    • Hola Juanjo:

      La aplicación está preparada para funcionar con el servidor SMTP y por eso no te ha funcionado, por eso da el error que te da.

      No pasa nada porque no tengas un servidor SMTP, con que tengas una cuenta de Gmail podrás configurarla para que uses el servidor SMTP de Gmail, seguramente también hotmail tiene un servidor SMTP y podrás hacerlo funcionar con eso. Mira en los comentarios de la entrada y busca un enlace que puse a la configuración SMTP de Gmail.

      Muchas gracias por tus alabanzas y me alegro que te haya sido de utilidad el proyecto. Para cualquier otra consulta quedo a tu disposición.

      Un saludo!

    • juanjo

      Muchas gracias por tu ayuda juan, bueno mira ahora he estado buscando ese comentario de entrada en toda tu pagina pero no lo he logrado encontrar, si me podrias orientar en que parte este el comentario a la configuracion SMTP de gmail te lo agradezco.

      Gracias y saludos!

    • Hola Juanjo:
      He estado buscando y no lo he visto, lo siento, recordaba haberlo puesto en algún comentario.

      No he podido entrar a coger el enlace a Gmail pero te digo como es, ve a la configuración y en la pestaña POP/IMAP (o un nombre parecido) puedes ver un enlace que te da instrucciones, haces click y dentro del enlace aparecen varios gestores de correo, selecciona otro y te da detalles del servidor SMTP.

      Ahí aparecen los detalles de la configuración que puedes usar para poner en la tienda online.

      Espero que te sirva. Un saludo!

    • juanjo

      Hola juan, bueno tengo otra pregunta eso que dices de la configuracion no lo encontre en netbeans, pero estuve investigando en google como hacer eso que decias, y la duda es esta ¿Es necesario tener el paquete java mail instalado en el netbeans para que salgan los gestores de correo en configuracion?, porque resulta que fui a configuracion pero nunca encontre nada parecido a POP/IMAP.

      Talves me puedas nuevamente orientar a cual menu de configuracion te refieres ya que no encontre nada en realidad que diga configuracion, solo en la pestaña herramientas que dice opciones la ultima opcion pero no venia nada de POP/IMAP

      Gracias y saludos!

    • Hola Juanjo:

      Creo que no me entendiste. Eso lo tienes en la configuración de tu cuenta de Gmail. Y lo que tienes que hacer es usar la configuración que te da Gmail del servidor SMTP para ponerla en los parámetros del descriptor de despliegue web.xml tal como aparece explicado en la documentación y en el vídeo.

      Espero que esto te sirva. Ya me contaras.

    • juanjo

      Hola juan, ¿Como estas?

      Tengo que decirte que la aplicación funcionó a la perfección apenas configure el servidor SMTP de gmail en el descriptor de despliegue. Obviamente era eso por lo que no me funcionaba ahora planeo estudiar tu aplicación más profundamente para sacar el maximo provecho de ella en cuanto a lo que pueda aprender, te agradezco una vez más por decidir publicarla y ponerla como ejemplo para aprander de ella.

      ¡Gracias!

    • Me alegro mucho de que ya funcione perfectamente. Muchas gracias por los elogios.

      Si tienes preguntas cuando la estudies no dudes en preguntar. Así mismo te informo que en el blog tienes varios tutoriales sobre algunas partes concretas de la aplicación.

      Un saludo!

  74. Jhonny Orquera

    hola juan sabes que ya resolvi el problema quite el if y se me guarda la imagen todo bien ahora mi problema esta en que necesito visualisar con el adobe reader o con cualquier otro programa para pdf, es decir aumentar un boton asi komo el de editar o eliminar que le llame a este programa y visualizar el archivo pdf en el programa.. gacias por la respuesta

    • Hola:
      Para que se abra el pdf es suficiente con poner un enlace al mismo y el navegador lo abrirá con lo que corresponda. Puedes poner un botón con una imagen como enlace en el bucle para mostrar productos de products.jsp, también puedes poner un enlace en la vista de producto en viewprod.jsp.

      Espero que esto te ayude :)

  75. jhonny

    holA AMIGO exelentisimo aporte, que bueno que haya gente como tu que comparte su conocimiento
    tengo una pregunta si en ves de imagenes quiero insertar un archivo pdf como lo podria hacer lo intente en la parte de AddProductServlet en la prarte que valida la imagen pero no me corre al moment de insertar el archivo me sigue diciendo que solo acepta img… gracias por el exelentisimo aporte…. Saludos desde ECUADOR

    • Hola, en esa parte se valida que sea una imagen y que el tamaño no exceda los ocho megas. Y en efecto se debe modificar en la parte de AddProductServlet. Si quieres subir cualquier tipo de archivo simplemente elimina esa condición del if.
      Lo otro que has de solucionar es que a la hora de mostrar los productos se inserta en el html de mostrar producto la imagen, has de cambiarlo para poner el pdf, y también has de modificar el guardado del archivo. Se guarda con el nombre del código de producto y has de ponerle en el nombre la extensión pdf.

      Espero que esto te guie un poco, si necesitas la ayuda con más detalle dímelo y te lo explico mejor.

      Un saludo y muchas gracias por las alabanzas, me alegro que te haya sido útil el proyecto.

  76. Steven

    Un saludo.

    Lo que pasa es que estoy tratando de correr la aplicación, y cuando trato de acceder a productos, o a iniciar sesión, siempre me da un error 500. Yo seguí los pasos como están en el video, configurando el xml, lo único que no configure fue el servidor smtp, de hecho lo he comentado, podría el problema estar ahí, o que estoy haciendo mal ?? podrías darme una ayuda ??

    • Hola Steven:

      En efecto el problema puede que este ahí, la aplicación al iniciarse trata de crear un autenticador y de SMTP que siempre se ha de usar a la hora de mandar un email, por lo tanto si no están metidos los datos fallará. Si después de configurar bien eso te diese algún fallo más comentamelo y lo miro más despacio a ver si hubiese algún fallo por mi parte.

      Un saludo

  77. Manuel Fernando

    hola, muy buen aporte aunque por noob no lo he podido aprovechar.

    tengo problemas al crear la conexión con glassfish, en las propiedades que agregas. yo tengo todo en localhost y no se como poner el url, tampoco se cual es el nombre del servidor.

    otra cosa es que no se como creaste la base de datos, yo la cree con el txt que diste, pero la cree con el MySQL Workbench, no se si altere en algo, no se si debo ponerla en una ubicación especifica.

    • Hola:

      Me alegro que te sea de utilidad el proyecto.

      Respecto a los ajustes de la base de datos ya hay otra persona que en los comentarios preguntó lo mismo. Te dejo el enlace a mi respuesta, lo único aclarar que si no funciona en la url deberías poner después de localhost lo siguiente “/nombreBD” (sin las comillas).

      Respecto a la BD si la has creado con MySQL siguiendo el fichero de importación que puse pues está bien, no tiene que haber problema alguno.

      Saludos

    • Manuel Fernando

      he realizado los cambios y aun me sale el mismo error, el error es el siguiente:

      Se ha producido un error
      Fallo al hacer ping al pool de conexiones para jdbc/OnlineShop. Class name is wrong or classpath is not set for : com.mysql.jdbc.jdbc2.optional.MysqlDataSource Please check the server.log for more details.

      no se que mas hacer.

      gracias

    • Este error es porque no has puesto en el GlassFish el conector de MySQL, en el vídeo se explica como lo debes de hacer. Hay que añadir el conector JDBC de MySQL al classpath de Glassfish; como digo en el vídeo está bastante bien explicado y fácil de hacer.

      Si te queda alguna duda coméntalo.

      Saludos

  78. Hola a todos:

    Para los que tengan problemas a la hora de hacer el checkout he decidido poner la descarga del proyecto en formato zip en la sección de descargas del repositorio de google code.

    http://code.google.com/p/tiendaonlinelpijdyb/downloads/list

    Saludos!

  79. aldo

    necesito tu ayuda, mira soy un completo novato en todo esto y si me interesa mucho ver tu ejemplo funcionando, me trabe donde estamos configurando el loop donde se genera el ping, y que no se que debe ir en url ni en srerver name, y no pude ver que va ahi ya que esta borroso en tu video, porfavor ayudame gracias

    • Hola aldo:

      Perdona por la tardanza en responder, he estado bastante ocupado.
      Lo que has de poner en los campos depende mucho de como sea tu servidor de bases de datos, pero te voy a poner un ejemplo. Supongamos que tenemos las bases de datos en localhost
      En Url debes de poner un prefijo que indica el driver que usar y después la dirección.
      Url–>jdbc:mysql://localhost
      En serverName el nombre del servidor que sería igual
      serverName–>localhost

      Nunca lo he configurado en local pero creo que sería así. Espero que te sea de ayuda. Quedo a la espera por si queda alguna duda más.

      Saludos!

  80. Aldo

    oye te qqueria pedir ayuda porque la verdad soy muy novato en esto y me trabe donde estamos configurando el pool ya que no me genera el ping, puesto que no se que poner en url ni server name etc, me seria de gran ayuda que me ayudaras esque con eso borroso en tu video tutorial, enverdad me interesa mucho ver funcionando tu proyecto y ojala y me puedas ayudar

  81. juan carlos

    Querido amigo tengo una duda tamaño planeta…como hago un cliente en swing u otro lenguaje a una aplicación jee, la verdad no quiero usar tanto web.

    • La verdad es que nunca me he planteado ese problema pero yo pienso que para acceder desde un cliente de escritorio a los datos de la web lo mas lógico sería hacer una API.

      Saludos!

  82. Error al realizar el deploy

    Hola, tengo un problema cuando intento desplegar el proyecto ,la consola me da el siguiente error:

    In-place deployment at /home/****/NetBeansProjects/OnlineShop/build/web
    Initializing…
    deploy?DEFAULT=/home/****/NetBeansProjects/OnlineShop/build/web&name=OnlineShop&force=true failed on GlassFish Server 3.1.1
    Error durante la implementación: Exception while loading the app : java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: java.lang.RuntimeException: No se pudo obtener numero de administradores, no se iniciará la aplicación. Consulte /server.log para obtener más información.
    /home/****/NetBeansProjects/OnlineShop/nbproject/build-impl.xml:813: The module has not been deployed.
    See the server log for details.
    BUILD FAILED (total time: 0 seconds)

    Y te pego las últimas lineas del server.log:

    [#|2012-01-23T17:12:19.206+0100|SEVERE|glassfish3.1.1|javax.enterprise.system.tools.admin.org.glassfish.deployment.admin|_ThreadID=24;_ThreadName=Thread-2;|Exception while loading the app : java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: java.lang.RuntimeException: No se pudo obtener numero de administradores, no se iniciará la aplicación|#]

    ¿Tienes idea de que puede estar fallando?
    gracias.

    • Hola

      En primer lugar comentarte que no he probado la aplicación con GlassFish 3.1.1 que es la nueva versión que incluye NetBeans 7.1, lo probaré pronto.

      Y luego comentarte que el error que te da diciendo que no ha podido obtener el número de administradores es un error programado por mi al inicio de la aplicación por no poder hacer la consulta para obtener el número de usuarios administradores.

      Es posible que no funcione tu base de datos o la conexión con las mismas, revisa ese tema y revisa el descriptor de despliegue web.xml para ver si los parámetros de configuración son correctos.

      Saludos y ya me contarás

    • Error al realizar el deploy

      Hola,

      ya he solucionado el problema, al parecer era tema del descriptor de despliegue, no se exactamente que etiqueta estaba fallando, pero lo he reescrito todo y ahora mismo si puedo desplegar la configuración.

      Otro problema que estoy viendo está relacionado con la validación de las cadenas de entrada, en concreto con el campo de “Nombre” al intentar registrar un nuevo usuario, ponga la cadena que ponga, la validación no se realiza correctamente y me indica que tengo que ceñirme al formato:

      Nombre: Invalid input. Please conform to regex ^[A-Z][a-zA-Z -áÁéÉíÍóÓúÚüÜñÑ]+$ with a maximum length of 100

      gracias.

    • Hola:

      Tampoco hacía falta reescribir el descriptor de despliegue entero, solo los parámetros de contexto, el resto si deben de ser correctos.

      Respecto a la validación comentarte que han de ser nombres q sigan esa expresión regular que obliga a que empiece por mayúscula y continuar con cualquier letra, espacios y guiones. Ponme algún ejemplo de nombres que hayas probado y no hayan funcionado.

      Juan-valido
      juan-no valido

      Saludos y ya me cuentas.

  83. Hola a todos:

    Por fin está solucionado el problema de la validación mediante JavaScript y Ajax para comprobar si un email está ocupado o no a la hora de registrarse sin tener que enviar la petición al servidor, se comprueba nada más escribir el email en el navegador.

    La modificación ya está subida al repositorio :)

  84. Christian

    Hola Juan, gracias x el Sistema pero me sale un error al ejecutarlo:
    init:

    deps-module-jar:
    deps-ear-jar:
    deps-jar:
    library-inclusion-in-archive:
    library-inclusion-in-manifest:
    compile:
    compile-jsps:
    In-place deployment at E:\OnlineShop\build\web
    Initializing…
    deploy?DEFAULT=E:\OnlineShop\build\web&name=OnlineShop&force=true failed on GlassFish Server 3.1
    Error durante la implementación: Exception while loading the app : java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: java.lang.NullPointerException. Consulte /server.log para obtener más información.
    E:\OnlineShop\nbproject\build-impl.xml:813:
    The module has not been deployed.
    at org.netbeans.modules.j2ee.deployment.devmodules.api.Deployment.deploy(Deployment.java:210)
    at org.netbeans.modules.j2ee.ant.Deploy.execute(Deploy.java:106)
    at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291)
    at sun.reflect.GeneratedMethodAccessor54.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
    at org.apache.tools.ant.Task.perform(Task.java:348)
    at org.apache.tools.ant.Target.execute(Target.java:390)
    at org.apache.tools.ant.Target.performTasks(Target.java:411)
    at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1399)
    at org.apache.tools.ant.Project.executeTarget(Project.java:1368)
    at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
    at org.apache.tools.ant.Project.executeTargets(Project.java:1251)
    at org.apache.tools.ant.module.bridge.impl.BridgeImpl.run(BridgeImpl.java:284)
    at org.apache.tools.ant.module.run.TargetExecutor.run(TargetExecutor.java:539)
    at org.netbeans.core.execution.RunClassThread.run(RunClassThread.java:153)
    GENERACIÓN INCORRECTA (total time: 5 seconds)

    nota : El usuario de mi mysql es root pero es sin cotraseña.

    • Hola, lo de no poner contraseñas a las bases datos es un poco extraño. ¿Te dio funciono correctamente el ping cuando configuraste el pool en el servidor de aplicaciones?

      Yo probaría a ponerle contraseña a la BD. Si no funciona con una pass ya me dices.

      Saludos

  85. Parece muy buen trabajo. Tengo problemas para descargarlo. ¿ Puede ser por el proxy?
    El error es
    org.tigris.subversion.javahl.ClientException: connection refused by the server
    OPTIONS request failed on ‘/svn’

    • Lo que dice exactamente es que la conexión ha sido rechazada por el servidor. Revisa que los datos sean todos correctos como se explica en el video y vuelve a intentarlo. Recuerda por ejemplo que no tienes que poner ningún usuario ni contraseña, el acceso ha de ser anónimo.

      Puedes probar también desde otro lugar. Si sigue sin funcionar ya me comentas e intentamos ver.

      Saludos

    • Nada. Que no hay manera. Lo he intentado en casa (no tengo proxy) y si he conseguido bajarlo. También podría ser que la versión de Java es distinta, pero me parece más improbable.

      Gracias

    • Hola, visto tus problemas me he puesto yo a hacer un Checkout desde cero desde mi casa y me ha funcionado perfectamente. Estoy usando NetBeans 7.0.1 y tengo Java 7 update 1 (JDK y JRE). Lo he hecho en Windows en vez de en Mac para que fuera un entorno lo más parecido al tuyo.

      No creo que influya en esto la versión de Java. Pero si te funciona en casa no hay problema ¿no?

      Ya me comentarás. Saludos

    • No. Lo he copiado y punto. Seguiremos en contacto. Muchas gracias.

  86. macarena

    hola me gustaria saber como meterle mano a un proyecto que tengo que hacer antes del 19 de este mes

    • Repito ya por tercera vez que si no dices que es exactamente lo que quieres va a ser complicado ayudarte.

      Te he respondido a tus comentarios ya tres veces.
      Saludos

  87. Buenas, lo tengo todo montado y solo me falla cuando voy añadir el primer producto (la bd esta vacia). me dice:

    Ha ocurrido un error al añadir el producto. El producto está duplicado. Inténtelo de nuevo

    Bueno es el problema que no se que hacer para arreglarlo.

    • Hola,

      Yo cuando hice el video de la demo no tuve problemas para añadir un producto. Convendría ver el log completo que deja el servidor de aplicaciones en tu consola para ver que podría estar pasando. Si no quieres pegarlo aquí puedes contactar conmigo en la dirección que he dejado en la documentación del proyecto.

      Saludos

    • GRAVE: Error obteniendo los productos
      java.sql.SQLException: Unable to retrieve metadata for procedure.
      at com.mysql.jdbc.CallableStatement.extractProcedureName(CallableStatement.java:783)
      at com.mysql.jdbc.CallableStatement.determineParameterTypes(CallableStatement.java:618)
      at com.mysql.jdbc.CallableStatement.(CallableStatement.java:513)
      at com.mysql.jdbc.Connection.parseCallableStatement(Connection.java:4147)
      at com.mysql.jdbc.Connection.prepareCall(Connection.java:4221)
      at com.sun.gjc.spi.base.ConnectionHolder.prepareCall(ConnectionHolder.java:446)
      at com.sun.gjc.spi.jdbc40.ConnectionWrapper40.callableCachedStatement(ConnectionWrapper40.java:291)
      at com.sun.gjc.spi.jdbc40.ConnectionWrapper40.callableCachedStatement(ConnectionWrapper40.java:52)
      at com.sun.gjc.spi.ManagedConnection.prepareCachedCallableStatement(ManagedConnection.java:1161)
      at com.sun.gjc.spi.jdbc40.ConnectionWrapper40.prepareCall(ConnectionWrapper40.java:127)
      at persistencia.PersistenceBD.getProducts(PersistenceBD.java:378)
      at org.apache.jsp.shop.products_jsp._jspService(products_jsp.java from :268)
      at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:111)
      at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
      at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:403)
      at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:492)
      at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:378)
      at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
      at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1534)
      at org.apache.catalina.core.ApplicationDispatcher.doInvoke(ApplicationDispatcher.java:787)
      at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:649)
      at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:483)
      at org.apache.catalina.core.ApplicationDispatcher.doDispatch(ApplicationDispatcher.java:454)
      at org.apache.catalina.core.ApplicationDispatcher.dispatch(ApplicationDispatcher.java:350)
      at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:300)
      at control.productos.SearchProductServlet.processRequest(SearchProductServlet.java:38)
      at control.productos.SearchProductServlet.doPost(SearchProductServlet.java:76)
      at javax.servlet.http.HttpServlet.service(HttpServlet.java:755)
      at javax.servlet.http.HttpServlet.service(HttpServlet.java:848)
      at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1534)
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:343)
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:215)
      at control.LogFilter.doFilter(LogFilter.java:42)
      at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
      at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:215)
      at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:279)
      at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
      at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
      at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
      at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:98)
      at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:91)
      at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:162)
      at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:326)
      at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:227)
      at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:170)
      at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:822)
      at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:719)
      at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1013)
      at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:225)
      at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
      at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
      at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
      at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
      at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
      at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
      at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
      at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
      at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
      at java.lang.Thread.run(Thread.java:662)

    • Ya he solucionado el problema, me he dado cuenta de que había unas erratas en llamadas a métodos que se estaba llamando a un procedimiento almacenado en vez de al método preparedStatement().

      Lo he solucionado y actualizado en el repositorio, lo único que tienes que hacer es click derecho sobre el proyecto de NetBeans, luego vas a Subversión y allí haces click en update. Creo que con eso será suficiente.

      Confírmame que te funciona. Si después tienes dudas con alguna parte del proyecto que no entiendes como se hace alguna cosa estoy abierto a preguntas.

      Saludos

    • Muchas gracias lo pruebo y te digo

    • Funciona perfectamente. Muchas gracias :D

  88. macarena

    hola buenos dias me gustaria saber si puedes ayudarme con un proyecto que estoy haciendo de java no se nada y el profesor no ayuda mucho muchas gracias

  89. Muy interesante y servirá de mucha ayuda para empezar a conocer el mundillo, no obstante, lo primero que he visto es que usas técnicas obsoletas y antiguas por lo que no recomiendo que nadie use tu proyecto, Ya que te pones con un proyecto nuevo deberías usar JEE 5, y no usar cosas desfasadas como los DAO, para algo está JPA, luego tampoco veo ejbs Stateless o Statefull que son juunto con la gestion de transaciones algo que ha facilitado mucho la vida del programador.

    A nivel academico está bien, te ayudará a entender, pero a nivel profesional lo veo desfasado. Usando los conocimientos adecuados te hubieras ahorrado gran parte de la lógica del servidor innecesaria.

    • Hola:

      Tienes toda la razón en que no se usan motores de persistencia entre otras tecnologías que comentas. Esto es porque el proyecto proviene de un curso de introducción a Java EE; y bajo mi punto de vista para aprender correctamente motores de persistencia y otras tecnologías de más alto nivel es necesario conocer como trabajan dichas tecnologías a más bajo nivel para comprender realmente su funcionamiento.

      En resumen, de lo que ha tratado el proyecto es de conocer adecuadamente el funcionamiento de las cosas en vez de en solucionar los problemas de la forma más optima posible.

      No obstante, creo que en el proyecto se han tratado temas interesantes como el tema de la seguridad con ESAPI, el envío de Emails con JavaMail, el upload de imágenes con la última especificación de Servlets, los temas de concurrencia etc..

      Un saludo

  90. luis sanchez

    Dilculpa colega, ¿Donde puedo descargar el codigo para echarle un ojo?, porque en la página de google no hay nada.

    • Hola:

      El código fuente está en un repositorio de subversion de google code como indido. En el vídeo se explica paso por paso como descargar el código del repositorio usando NetBeans.

      También puedes ver el código desde google. Vas a la pestaña de Source y luego haces click en Browse, y como explico en el vídeo está en la carpeta trunk.

      Si tienes algún problema con ello no dudes en indicármelo.

      Un saludo!

    • luis sanchez

      Que tal coleja, me he encontrado con el siguiente problema después de construir la aplicación y compilar la aplicación para poder desplegarla:

      In-place deployment at C:\Users\luisd\Documents\NetBeansProjects\OnlineShop\build\web
      Initializing…
      deploy?DEFAULT=C:\Users\luisd\Documents\NetBeansProjects\OnlineShop\build\web&name=OnlineShop&force=true failed on GlassFish Server 3.1
      Error durante la implementación: Exception while loading the app : java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: java.lang.RuntimeException: No se ha podido iniar la aplicación, parámetros de contexto incorrectos. Consulte /server.log para obtener más información.
      C:\Users\luisd\Documents\NetBeansProjects\OnlineShop\nbproject\build-impl.xml:813:
      The module has not been deployed.
      at org.netbeans.modules.j2ee.deployment.devmodules.api.Deployment.deploy(Deployment.java:210)
      at org.netbeans.modules.j2ee.ant.Deploy.execute(Deploy.java:106)
      at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291)
      at sun.reflect.GeneratedMethodAccessor83.invoke(Unknown Source)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
      at java.lang.reflect.Method.invoke(Method.java:597)
      at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
      at org.apache.tools.ant.Task.perform(Task.java:348)
      at org.apache.tools.ant.Target.execute(Target.java:390)
      at org.apache.tools.ant.Target.performTasks(Target.java:411)
      at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1399)
      at org.apache.tools.ant.Project.executeTarget(Project.java:1368)
      at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
      at org.apache.tools.ant.Project.executeTargets(Project.java:1251)
      at org.apache.tools.ant.module.bridge.impl.BridgeImpl.run(BridgeImpl.java:284)
      at org.apache.tools.ant.module.run.TargetExecutor.run(TargetExecutor.java:539)
      at org.netbeans.core.execution.RunClassThread.run(RunClassThread.java:153)
      BUILD FAILED (total time: 10 seconds)

      No he podido ver la aplicación en mi navegador, pues marca ese error al estar compilando… espero me puedas ayudar.

      Gracias por tu aporte y por el tiempo que dedicas a contestar..,. saludos

    • Ese fallo es provocado porque hay parámetros de contexto en el descriptor de despliegue que no son correctos. La aplicación hace una validación de los parámetros de contexto al iniciar y en caso de no ser una validación satisfactoria la aplicación no se inicia.

      Pásame si quieres los parámetros que has puesto en el descriptor de despliegue y miro a ver porque falla. Si no los quieres poner aqui envíamelos a la dirección de correo que hay en la documentación.

      Un saludo

  91. He hecho un añadido al artículo notificando que se ha publicado el artículo en JavaHispano y que sería conveniente leer los comentarios allí publicados. Siempre es interesante ver los añadidos o consejos de los demás.

    Un saludo a todos

  92. Hola, he leído tu noticia en javahispano y me ha parecido muy interesante.

    Yo acabo de empezar un curso de experto en jee así que empiezo a aprender de 0, netbeans, glassfish,jee, html, strut, hibernate, etc. jaja, y se me va a hacer laaaargo porque llevo 3-4 años sin programar y nunca he visto java y se dan cosas por sabidas de programación básica.

    Tu proyecto me parece un buen recurso para compaginarlo con el curso + los tutoriales de java hispano escritos por Othero que tanto el básico de j2se y el de jee los veo muy buenos.

    Si me das algún consejo de NO-novato a novato es agradecido. Aunque me queda mucho camino por delante.

    Gracias y Salu2!!!

    • Muchas gracias por el comentario.

      Mi consejo si no has programado nunca en Java es que lo primero mires el tutorial de Java SE. La programación web con Java EE tiene como base lo primero. JavaEE lo que hace es añadir sobre lo que ya sabemos ciertos conceptos orientados a aplicaciones web y servidores.

      Asi que primero empezar con Java SE, posteriormente el tutorial de Java EE, y una vez comprendido el tutorial de Java EE ya sería el momento de meterse con la tienda online a entender su funcionamiento y ver como organizar un proyecto medianamente grande.

      Por supuesto, durante tu aprendizaje en Java SE y Java EE siempre podrás mirar la tienda online en busca de determinadas cosas de Java, pero en ese progreso no te fijes en profundidad en el funcionamiento de la tienda sino en determinadas cosas como por ejemplo, como leer un fichero, como escribir un fichero, etc…

      Espero haber sido lo más claro posible, estoy a tu disposición para más cuestiones.

      Un saludo!

  93. Jesús L.

    ¡Crack!

  94. Lara Benito Concepción

    Muy buen trabajo Juan! Te felicito! un besazo!

    • Muchas gracias por el comentario. Ya sabes lo bien que lo he pasado haciendola ;)
      Un abrazo!

    • ¿”Un abrazo”? Tío, mándale otras cosas que no sean abrazooooooos jajaja
      besos a ambos ;)

Trackbacks/Pingbacks

  1. Java | Annotary - [...] from Giovanny Fuentes: Ctfght&Wrstlng SQL_BI ASP.NET JBoss …
  2. Java EE: Upload de Imagenes con la especificación Servlet 3.0 - [...] a ir poco a poco centrándonos en algunas partes concretas del proyecto que presente de la tienda online y …
  3. Ejemplo Java EE: Una tienda Online - [...] [...]
  4. Bitacoras.com - Información Bitacoras.com...Valora en Bitacoras.com: Continuando con la presentación de seguridad en aplicaciones web, aplicado especialmente a Java EE voy a …

Deja un comentario

%d personas les gusta esto: