sep 212011
 

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.

También te puede interesar:

  39 Comentarios to “Ejemplo Java EE: Una tienda Online”

  1. 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

      • 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.

  2. 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 :)

  3. 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

  4. 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

  5. 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

  6. 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

  7. 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

  8. [...] a ir poco a poco centrándonos en algunas partes concretas del proyecto que presente de la tienda online y así veremos en detalle determinadas partes. Hoy nos vamos a centrar en ofrecer la posibilidad de [...]

  9. 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

  10. 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!

      • 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

  11. 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

  12. 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!

  13. 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 presentar un proyecto que he llevado a cabo este año, un proyecto que se podría acercar bastante a un ejemplo real co……

  14. ¡Crack!

  15. Muy buen trabajo Juan! Te felicito! un besazo!

 Deje su comentario

(necesario)

(necesario, no será publicado)

Puede usar las siguientes etiquetas HTML y atributos: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>