sábado, 22 de diciembre de 2007

PHP en NetBeans 6.0

PHP es un lenguaje de programación basado en scripts muy popular, fácil de aprender, de desplegar, es multiplataforma (igual que java, solo necesita de un programa que interprete el lenguaje para que lo convierta a la plataforma ya sea Linux, Windows o cualquiera), y sobretodo... es libre.

No tiene un IDE específico, por lo que es necesario navegar por la documentación para recordar las sentencias... a menos que uno tenga buena memoria para recordarlas todas. Lo que está de moda en los IDEs es la coloración de sintaxis y el autollenado de sentencias.

Existen varios IDEs que están apostando por este lenguaje que no es nada nuevo. Uno de ellos es CodeGear con su Delphi for PHP. Y Eclipse tiene un subproyecto que esta trabajando en un plugin para manejar PHP llamado PHP Development Tools.

La gente de NetBeans - por su puesto - no se queda atrás. Por lo que en el NetBeans 6.0 han puesto a disposición un plugin (a la fecha de este post) en versión beta.

Veremos como configurarlo, y haremos una simple aplicación con PHP. No voy a dedicarme a enseñar PHP, ya que este blog no es para aprender PHP :P

Instalando el plugin de PHP

En el NetBeans 6.0 entramos a la opción Tools > Plugins y buscamos de la sección "Available Plugins" a PHP de categoría Scripting. Activamos su check...


... y hacemos clic en el botón Install. Aceptamos las ventanas que se nos muestra, descargará lo necesario del plugin (el plugin en sí, así como su documentación, etc)...

... y aceptamos reiniciar el IDE para cargar el plugin.

Configurando nuestro computador para que funcione PHP

El PHP necesita de un servidor web para que funcionen los scripts. PHP puede configurarse sobre Apache Server (muy recomendado) o sobre IIS. Así que nos centraremos en instalar el Apache Server con el PHP.

Apache + PHP sobre Linux

Si eres un linuxero, no tienes porque leer esta parte, pero aún así, es bueno recodarlo: si usas Centos, Fedora o similar.. usa el comando yum. Si usas Ubuntu, Debian o similar, usa apt


Probemos como se ve en el navegador, y recordemos la carpeta que se publica.
... aquí se publica en /apache2-default

Apache + PHP sobre Windows

Existen software ya empaquetados que permiten instalar toda la plataforma WAMP (Windows + Apache + MySQL + PHP) y no tendríamos que preocuparnos en como configurar estos software. Uno de ellos es WampServer. Pero personalmente opino que es mejor que uno mismo lo configure. Solo bastaría descargar el Apache Server, el PHP 5 (el que está en .zip) y leer la documentación de como instalarlo en windows con apache2.

Creando proyecto en Netbeans 6.0

Creamos un nuevo proyecto y seleccionamos en las categorías a PHP, como proyecto a "PHP Project".
... clic en "Next".
Escribimos como nombre de proyecto HelloPhpProject. También indicamos en que carpeta deseamos crear el proyecto.

... clic en "Next".
A continuación nos mostrará qué servidor web se usará.

Ya que es nuestra primera vez que estamos usando el NetBeans para PHP, haremos clic en "Manage".

Nos mostrará la ventana para registrar el servidor web. Hay dos tipos de publicación: si está accesible desde una unidad de disco (por mapeo de una carpeta remota o si está en nuestro computador) o si es accesible vía ftp. Esto es lo que nos esta preguntando en esta ventana.

Así que escribiremos en Connection name "Local Web Server" y como tipo de servidor "Local web Server with file Access", ya que tenemos el apache server en nuestro computador. Clic en 'Next'.

Luego nos pide el archivo de configuración de Apache Server. Como estoy en Ubuntu, le selecciono el apache2.conf

Esto es porque buscará cierta configuración sobre directorios virtuales y demás. Pero en Ubuntu se usa apache2.2 y pues la configuración está delegada a otros archivos, y eso no lo puede interpretar el NetBeans... por eso aún es beta.

Clic en "Next"

Colocaremos el nombre del servidor y el puerto que utilizará, así como la carpeta que utilizará para la publicación.


Esta información lo usará el NetBeans al lanzar la aplicación para ejecutarla.
Clic en 'Next'.

Ahora, indicaremos la carpeta de nuestro disco donde estarán ubicados los archivos que se publicarán.

Recordemos que debe ser la carpeta que está asociada a la carpeta pública de internet. En el caso de ubuntu, este se encuentra en /var/www/apache2-default
Clic en 'Finish'.
Nota: Recordemos tener los permisos necesarios para guardar archivos.

Ahora que ya hemos creado nuestro configuración del servidor web para NetBeans, lo seleccionamos:

Clic en 'OK'

Ahora veremos como lucirá la aplicación en ejecución.
La ruta del contexto es /HelloPhpProject
La ruta web será: http://localhost:80/apache2-default/HelloPhpProject
y se creará la carpeta para los archivos: /var/www/apache2-default/HelloPhpProject

Estamos de acuerdo que así será y tiene mucho sentido que así debe funcionar.

Clic en 'Finish'
Y ya, tenemos nuestro proyecto de PHP con un index.php listo para editar.

Haciendo nuestro primer formulario

No es cosa del otro mundo programar en PHP, así que haremos una simple aplicación que consistirá en un formulario donde se registran nombres y se muestra una lista de los mismos.

Pues bien, escribiremos un formulario con una sola entrada llamada nombre.

Vemos que al escribir los tags, el IDE nos mostrará las sugerencias y los atributos de los mismos.
Tratemos de escribir el siguiente código y veremos como se va autoescribiendo el código necesario.
<?php session_start();?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title></title>
</head>
<body>
<form action="index.php" method="post">
Nombre: <input type="text" name="nombre" /><br/>
<input type="submit" />
</form>
<?php
$lista=$_SESSION["lista"];

if ($nombre=$_POST["nombre"]){
$lista[]=$nombre;
}
if ($lista){
echo "<ul>";
foreach ($lista as $elem) {
echo "<li>$elem</li>";
}
echo "</ul>";
}
$_SESSION["lista"]=$lista;
?>
</body>
</html>

Ejecutando el programa

Como todo proyecto en NetBeans, bastará con presionar la tecla F6. Se ejecutará nuestro navegador, y veremos ejecutar el proyecto tal cual lo hemos programado.

Para terminar...

Físicamente, los archivos están dentro del directorio del proyecto que se definió al momento de crearse. Al momento de ejecutar el proyecto, lo que hace NetBeans es copiar la carpeta del proyecto con todos sus archivos y los coloca en el directorio del Apache Server. Si volvemos a ejecutar el proyecto, volverá a copiar los archivos. Así que si editamos el archivo y lo guardamos, no podremos verlo en el navegador hasta que presionemos la tecla F6, o ejecutemos el proyecto.

La caida de un grande - JBuilder

Yo era un consumidor de los productos Borland desde que existió Turbo Pascal 5.5. Con la venida de los Windows, Borland decidió subir un poco más de nivel evolucionando Turbo Pascal a Delphi que todas luces era mucho mejor que Visual Basic 3.0 (creo que fue por el año 1993) Tenía todo lo necesario para que fuese una aplicación completa para Win32: orientado a objetos, usa el API directo de Windows (sin ningún runtime como lo tiene Visual Basic), no sé.. era EL software para desarrollo de Windows. Pero perdió terreno porque le faltó a Borland lo que tiene (o lo que es) Microsoft: PUBLICIDAD. La mejor versión de Delphi fue la 7.0, aún hay gente que lo usa, y a pesar que Borland ya puesto todo su esfuerzo para poner a Delphi 2007 sobre cualquier versión previa... parece que no es suficiente. ¿Como pudieron los de Microsoft poner a el Visual Studio .Net sobre todo el studio 6.0? Simple... publicidad.

Recuerdo también antes que saliera el Windows 95 (que decía ser de 32 bits, cuando realmente no lo era, sino hasta subversiones posteriores) IBM tenía su OS/2. Y en lugar de hacer publicidad extrema con su sistema operativo (que era realmente impresionante) se dedicó a cuestionar al Windows 95... más publicidad para Microsoft sin ningún esfuerzo. Todos sabemos que Windows es malo.. totalmente malo y cada vez peor... pero la gente lo recuerda bien, y si piensa en un computador siempre pensará en Windows.

Cuando me topaba con un programador (o estudiante de programación) siempre mencionaba Visual como si fuera lo único que existiera: "¿usas visual?"... "tengo un programa en visual"... "¿sabes visual?" y yo le respondía: qué visual? visual basic? visual objects? visual fox?. Algunos respondian, otros no. El poder recordación de la palabra Visual era tan fuerte que la gente lo usaba con naturalidad sin saber de lo que hablaban.

En fin, ya me estoy desviando del tema de este post.

Borland apostó muy bien por darle todo su esfuerzo a un IDE para Java: JBuilder. Desde la versión 3 que comencé a usar me pareció espectacular, sorprendente. Con dos clic se tenía lo que necesitaba. Aunque era pesado, era muy bueno.

Su versión final fue la 2006, pero pareciera que ya no querian seguir perdiendo esfuerzo en rehacer un IDE cuando ya en el mercado existían varios... y los más usados son libres!

Para la versión 2007 decidieron dejar su IDE y usar uno ya hecho, solo habría ponerle algunas bibliotecas y otras opciones y voila! un JBuilder nuevo. Y el último.

Eclipse - para mi - es malo. No es muy intuitivo como lo era JBuilder. Se necesitan de muchas bibliotecas para hacer algo simple, y como lei en un artículo en la web: uno baja 20 modulos de Eclipse y no se sabe que hacen. Una aplicación con JSF en JBuilder 2006 era simple, tanto de hacer como de desplegar. En Eclipse (y también en JBuilder 2007) se necesita descargar bibliotecas adicionales! OMG! tanto pesa el instalador y aún el instalador y necesita descargar más cosas de internet!

Lo peor fue que JBuilder 2007 está basado en Eclipse 2.5... ahora Eclipse está en la versión 3 Muchas bibliotecas (como el ex Mylar ahora Mylin) ya no existen, y por tanto el update de Eclipse no está del todo completo. ¿Como solucionar ese problema de dependencia de JBuilder? Fácil, crear una biblioteca llamada JGear que se anexe al Eclipse.

¿Y JBuilder?

Para el 2007, Borland creó la divisón CodeGear que se dedicaría más a la parte de desarrollo. Ahí fueron a parar Delphi, JBuilder, Interbase entre otros.

Para mi JBuilder dejó de existir. Ahora se volvió una biblioteca que no sé si la gente lo quiera comprar. Yo creo que uno más usa un programa que un componente. Así que aún prevalecerán Eclipse y NetBeans.

domingo, 4 de noviembre de 2007

Tutorial: EJB 3.0 Enterprise Beans con NetBeans 5.5

Uno de los puntos fuertes e importantes de programar con Java Enteprise es la centralización del código de negocio usando EJBs.

De esta manera, cualquier aplicación (ya sea web o desde una aplicación cliente desktop) siempre tendrán la misma lógica.

El problema era que hasta antes de la versión 3.0 de EJB la programación era realmente pesada. Aprender lo que eran los beans de sesión (con estado y sin estado), crear interfaces y usar clases como javax.ejb.SessionBean, codificando los archivos de despliegue (y que eran diferentes entre los diferentes contenedores como JBoss, Jonas, etc) y no sé que tanto más... era un lío. Personalmente no me apetecía aprenderlo... ni usando los IDE más sofisticados como NetBeans, JBuilder, JDevelopment... nada.. me quedaría programando en web y listo.

Pero no pude huir fácilmente... aún la necesidad de utilizar un solo código de negocio para varias aplicaciones me rondaba.

Hasta que salió el Java EE 5.


Tuve mis dudas, pensé que sería lo mismo que antes pero más pesado. Pero no. Ahora está todo más simplificado, porque utiliza muchas características de Java SE 5.0. Una de ellas, la de usar anotaciones para simplificar código que se utilizaba en una archivo de despliegue.

Leí el tutorial "EJB 3.0 Enterprise Beans" de netbeans.org. y es lo que me ha motivado el traducirlo en este post.

Necesitamos para ello

  • (Obviamente) NetBeans 5.5 ó 5.5.1 instalado (a la publicación de este post, aún no ha salido oficialmente la versión 6, así que usaré lo que está en versión estable)

  • NetBeans Enterprise Pack. El cual se puede obtener desde aquí: http://www.netbeans.org/products/enterprise/

Comencemos ahora

Creando un proyecto de aplicación empresarial

El objetivo de este ejercicio es crear un proyecto de aplicación empresarial llamada NewsApp el cual contendrá un módulo EJB y un módulo web. La aplicación NewsApp usa un bean message-driven para recibir y procesar mensajes enviados por un servlet a la cola. La aplicación usa servlets para enviar mensajes al bean message-driven y para mostrar mensajes.”

Creando una aplicación empresarial

  1. Seleccione File > New Project del menú principal. O presione Ctrl + Mayus + N.

  2. Seleccione Enterprise Application desde la categorìa Enterprise tal como se muestra en la siguiente ventana.


    Haga clic en Next.

  3. Escriba como nombre del proyecto NewsApp y establezca como servidor a Sun Java System Application Server.

  4. Establezxca la versión de J2EE a Java EE 5, y seleccione Create EJB Module y Create Web Application Module, si no está seleccionado.

  5. Haga clic en Finish.

Resumen

En este ejercicio hemos creado una aplicación empresarial Java EE 5 que contiene un módulo EJB y un módulo web.”

Codificando el módulo EJB

En este ejercicio crearemos objetos en el módulo EJB. Crearemos una clase entidad, un bean message-driven y una fachada (façade) de sesión. También crearemos una unidad de persistencia que proporcionará el contenedor con información para administrar nuestras entidades, y los recursos del servicio de mensajería java (JMS) que manejará nuestros beans message-driven”.

Creando una Unidad de Persistencia

Primero crearemos una unidad de persistencia que define el origen de datos y el administrador de entidades que se usarán en nuestro proyecto.

  1. Hacer clic derecho en el módulo EJB y seleccionar New > File / Folder

  2. De la categoría Persistence seleccionamos Persistence Unit.

    Hacemos clic en "Next".
  3. Utilizaremos los valores por defecto que se muestra en la ventana.
    Además, seleccionamos como Data Source el valor jdbc/sample.
  4. Hacemos clic en Finish.
El IDE habrá creado el archivo persistence.xml y lo mostrará en el editor de código en vista de diseño.

Cerrar el archivo persistence.xml.

Creando la clase entidad NewsEntity

En este ejercicio crearemos la clase entidad NewsEntity. Para conocer más sobre lo que es una clase entidad, revisar las siguientes entradas:
Para crear la clase NewsEntity, haremos lo siguiente:
  1. Clic derecho sobre el módulo EJB en la venta de proyectos, y seleccionar New > File / Folder para abrir el asistente de New File
  2. De la categoría Persistence, seleccione Entity Class

    Clic en Next
  3. Escriba como nombre de la clase NewsEntity y como paquete ejb y dejar el tipo de la clave primaria con el valor Long

    Clic en Finish
Agregue dos propiedades de tipo String: body y title. Puede usar el nodo de "Bean Patterns" de la clase para hacerlo más rápido. Debería quedar así:

Creando el bean Message-Driven NewMessage

Ahora crearemos el bean message-driven NewMessage en nuestró módulo EJB. Usaremos el asistente New Message-Driven para crear el bean y los recursos JMS necesarios.
Para crear el bean message-driven usaremos el asistente del IDE. Para ello haremos lo siguiente:
  1. Clic derecho en el módulo EJB, seleccionar New > File /Folder.
  2. De la categoría Enterprise seleccionamos Message-Driven Bean
    Clic en Next
  3. Escribimos como nombre NewMessage, como paquete ejb, y como Destination Type el valor Queue seleccionado, tal como se ve en la siguiente imagen:
    Clic en Finish
Al finalizar, la clase bean message-driven NewMessage.java ha sido creado, y se abre su código fuente en el editor de código.
Notará que existe la siguiente anotación:
Esta anotación dice al contenedor que el componente es un bean message-driven (bean manejador de mensajes) y cual es el recurso JMS usado por el bean. Cuando el IDE genera la clase, el nombre del mapeo del recurso (jms/NewMessage) está derivado del nombre de la clase (NewMessage.java). El recurso JMS está mapeado al nombre JNDI del destino desde el cual el bean recibirá los mensajes. El asistente New Message-Driven Bean ha creado el recurso JMS por nosotros. El API EJB 3.0 nos permite buscar objetos en nombres de spacio JNDI desde la clase bean que queramos sin necesidad de configurar descriptores de despliegue que especifican los recursos JMS.

Las especificaciones de EJB 3.0 nos permite usar anotaciones para introducir recursos directamente en las clases. Ahora usaremos anotaciones para introducir el recurso MessageDrivenContext dentro de nuestra clase, y luego insertaremos el recurso PersistenceContext el cual será usado por el API EntityManager que maneja la persistencia de entidades. Agregaremos las anotaciones a la clase desde el editor de código.
  1. Agregamos las siguientes líneas después de la declaración de la clase.
    Recomiendo usar el autollenado del IDE presionando Ctrl + Espacio cuando se escriba la anotación y el tipo MessageDrivenContext.
  2. En el fondo del código fuente hacemos clic derecho, luego seleccionamos Persistence > Use Entity Manager.
    Esto convertirá el código a lo siguiente:
  3. Cambiar el nombre del método persist() a save() y modificar el contenido para que luzca así:
  4. Modificar el método onMessage() para que luzca así:
  5. Grabamos el archivo.

Creando el Bean de Sesión

Ahora crearemos una fachada de sesión para la clase entidad NewsEntity. Para ello, hagamos lo siguiente:
  1. Clic derecho sobre el módulo EJB y seleccionar New > File / Folder.
  2. De la categoría Persistence, seleccionar Session Beans for Entity Classes
    Clic en Next
  3. De la lista de clases entidad disponible, seleccionar NewsEntity y haga clic en Add.

    Clic en Next
  4. Verificar que el paquete sea ejb y que la interfaz local se crearán.
    Clic en Finish
Al finalizar, la clase fachada de sesión NewsEntityFacade.java se habrá creado y abierto en el editor de código. El IDE también creará la interfaz local NewsEntityFacadeLocal.java

La tecnología EJB 3.0 simplifica la creación de beans de sesión reduciendo considerablemente el código necesario. Puedes ver que la anotación @Stateless se está usando para declarar la clase como un componente bean de sesión sin estado y que la clase no necesita una implementación de javax.ejb.SessionBean. El código también está mucho más limpio porque con la tecnología EJB 3.0 los métodos de negocio ya no necesitan de excepciones verificadas (o sea, que utilice alguna sentencia throws)

Puedes ver que el recursos PersistenceContext fue insertada directamente al componente bean de sesión cuando se creó la fachada de sesión.

Resumen

En este ejercicio, hemos codificado una clase entidad y un bean manejador de mensajes (message-driven) en el módulo EJB. Luego hemos creado una fachada de sesión para la clase entidad. También hemos creado los recursos JMS que serán usados por nuestra aplicación.

Codificando el módulo Web

Ahora crearemos dos servlets: ListNews y PostMessage. Se encargarán de listar los registros y agregar mensajes respectivamente.

Creando el servlet ListNews

En este ejercicio crearemos un servlet simple para mostrar nuestros datos. Usaremos anotaciones para llamar a nuestro bean de entidad desde nuestro servlet.
  1. Clic derecho sobre el módulo web, y seleccionar New > Servlet
  2. Escribimos ListNews para el nombre de la clase, y escribimos web como nombre de paquete.
    Clic en Finish
Con esto, la clase ListNews.java se abrirá en el editor de código. En él haremos lo siguiente.
  1. Clic derecho en el código fuente y seleccionar Enterprise Resources > Call Enterprise Bean.
  2. En la ventana de diálogo Call Enterprise Bean, seleccionar NewsEntityFacade y hacer clic en OK.

    Con esto, el recurso bean de entidad será insertado en el servlet usando la anotación @EJB
  3. Modificar el método proccessRequest() con el siguiente contenido:
    No olvidar escribir los nombres de las clases presionando Ctrl + Espacio para abrir el autollenado, y de paso hace los imports necesario. También podría presionar Alt + Mayúsculas + F para generar los imports necesarios.
  4. Guardamos los cambios del archivo.

Creando el servlet PostMessage

Ahora creamores el servlet PostMessage que se encargará de enviar mensajes al contenedor EJB. Usaremos anotaciones para insertar recursos JMS al servlet, especificando el nombre de la variable y el nombre de su mapeo. Luego agregaremos el código para enviar el mensaje JMS y mostraremos un formulario web para agregar un mensaje.
  1. Clic derecho sobre el proyecto módulo web y seleccionar New > Servlet
  2. Escribir PostMessage para el nombre de clase, y web para el nombre del paquete.
    Clic en Finish
Al terminar, la clase PostMessage.java se abrirá en el editor de código. Ahora haremos lo siguiente en el editor:
  1. Escribimos las siguientes anotaciones para insertar los recursos ConnectionFactory y Queue seguido de la declaración de sus respectivas variables.

  2. Ahora agregaremos el siguiente código que permitirá leer los valores de los parámetros enviados por el formulario, creará un objeto NewsEntity y lo enviará al JMS.
  3. Ahora editamos la salida que dará el servlet, que será el formulario. Este código debe estar después del código anterior. Ambos hacen el método processRequest()

  4. Guardamos los cambios.

Ejecutando el proyecto

Ahora, nos toca apreciar la melodía de la orquesta. Como queremos que se muestre el listado de nuestros datos (que es el servlet /ListNews) haremos lo siguiente.
  1. Clic derecho sobre el nodo de la aplicación NewsApp y seleccionamos Properties.
  2. Seleccionamos Run en el panel Categories
  3. En el campo Relative URL, escribimos /ListNews
  4. Clic en OK
  5. En la ventana de proyectos, clic derecho sobre el nodo de la aplicación enterprise NewsApp y seleccionar Run Project.
Con esto, se creará la tabla NEWSENTITY en la base de datos sample de Derby (podemos presionar las teclas Ctrl + 5 y ver dentro del nodo Databases la conexión a la base de datos jdbc:derby://localhost:1527/sample. Abrimos esa conexión - usuario app / password app - y podemos ver la tabla creada, y ver sus registros), se cargará el contenedor EJB, y el contenedor web.

En nuestro navegador se verá el listado de registros (la primera vez no habrá nada, claro) y al hacer clic en Add new message nos presentará el formulario para registrar un mensaje.

Pruébalo... y piensa dónde más lo puedes utilizar. Tus aplicaciones enterprise serán mucho más fáciles de hacer.

Investiga

Nunca encontrarás todo lo que necesitas en una web. Solo encontrarás partes que juntándolas harás algo nuevo. Así que, trata de modificar la aplicación para que funcione con JSF.

Recursos


El proyecto que desarrollé lo puedes descargar de aquí: http://diesil-java.googlecode.com/files/newsapp.tar.gz