viernes, septiembre 22, 2006

Ejemplo completo JSF+JPA en JEE

He desarrollado el mismo ejemplo del zoo pero esta vez en 3 capas, desplegando en un servidor de aplicaciones. En concreto lo he probado con el glassfish (servidor de aplicaciones gratuito de SUN).

El objetivo final de este ejemplo es tomarlo como base para la implementación de todos los desarrollos con esta estructura. El resultado final del proyecto es un único EAR que contiene dos modulos. Un módulo EJB contenido en un JAR y un módulo Web contenido en un WAR. La estructura en Eclipse es un único Workspace que contiene 3 proyectos. Un proyecto de tipo EJB, un proyecto WEB y un proyecto Aplicación Empresarial J2EE.

Os voy a ir explicando como lo he hecho paso a paso.

1 - Instalación del servidor de aplicaciones e integración en Eclipse

Lo primero es instalar el Glassfish (https://glassfish.dev.java.net/) en "c:\glassfish". He instalado el último build, que es el el b48 (el Glassfish es el Sun Application Server 9). Existe un pequeño BUG que nos afectará en la integración con Eclipse. El problema es que Glassfish no se lleva bien con las rutas con caracteres de lenguajes diferentes al ingles (como los acentos). Por lo tanto debemos modificar la ruta de los directorios temporales del usuario de Windows a "C:\TEMP" por ejemplo (esto lo haceis desde la opción "Variables de Entorno" de las propiedades de "Mi PC". Despues debemos instalar el plugin del glassfish (simplemente copiando lo necesario a la carpeta plugin) e iniciar eclipse con la opción "-clean".

Ahora debemos configurar el plugin. Para ello hay que añadir un nuevo Run-Time de servidor. Esto se hace desde "Window/Preferences/Server/Installed Runtimes". Simplemente es necesario indicar la ruta al directorio "C:\glassfish". Posteriormente ya podemos crear un nuevo servidor (esto se puede hacer desde la pestaña "Servers" con el botón derecho).

2 - Creación del proyecto "EJB"

Para crear el proyecto EJB debemos ejecutar "File/New/Project..." y luego seleccionar "EJB/EJB Project". Seleccionamos como "Target Runtime" el Glassfish y continumos el asistente.

Al crear el proyecto EJB, por defecto se crea el fichero "ejb-jar.xml" con la version 2.1 del estandar. Sin embargo nosotros vamos a utilizar la 3.0. para ello basta modificar el fichero directamente dejandolo así:


<?xml version="1.0" encoding="UTF-8"?>
<ejb-jar id="ejb-jar_ID" version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd">
<display-name>ejb-zoo<display-name>
</ejb-jar>


Lo siguiente es configurar la persistencia. Para ello pulsamos botón derecho sobre el proyecto y seleccionamos "Java Persistence/ Add Java Persistence...". Aqui tan solo es necesario añadir el nombre de la unidad de persistencia. Esto solo se podrá hacer si tenemos correctamente configurado el plugin de Dali.

Cuando se añade la persistencia, Dali genera el fichero "persistence.xml". Configurarlo es mucho más simple que en JSE. Basta con indicarle el "DataSource" que vamos a utilizar. Esto se hace añadiendo la clusula <jta-data-source>.

El fichero queda así:

<?xml version="1.0" encoding="UTF-8"?><persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"><persistence-unit name="default"><jta-data-source>jdbc/DRMDataSource</jta-data-source></persistence-unit></persistence>

3 - Implementación del proyecto "EJB"

Posteriormente debemos crear los paquetes en los que vamos a distribuir las clases. Yo he seguido la siguiente estructura:

drm.zoo.model
AnimalEntity
drm.zoo.biz
AnimalBean
AnimalInterface

drm.zoo.dto
Animal

En el paquete "model" meteré las clases entidad que implementan la persistencia. En el paquete "biz" (business logic) meteré las clases EJB y en el paquete "dto" meteré las clases de tipo Data Transfer Object.

Ahora toca crear las clases de persistencia de entidades. Para ello podemos utilziar el plugin Dali pulsando botón derecho sobre el proyecto EJB y seleccionando "Java Persistence/Generate Entities". Las clases de entidad no tienen ningún secreto y son identicas a las clases utilizadas en JSE.

Posteriormente crearemos las clases EJB. Para ello debemos crear para cada EJB una clase y un interfaz (al menos). El interfaz define el acceso "Remoto" al EJB (aunque tambien podría ser local). Un interfaz ejemplo es este:

import java.util.List;
import javax.ejb.Remote;
import drm.zoo.dto.Animal;

@Remote
public interface AnimalInterface {
public void insert(Animal a);
public void delete(Animal a);
public void update(Animal a);
public List<Animal> retrieve();
}


Seguimos con la clase de implementacion del EJB. Esta clase esta implementada como un EJB sin estado, para ello utilizamos la anotación "@Stateless". Utilizar la persistencia aqui es muy simple. Basta declarar el EntityManager mediante "@PersistenceContext" y luego usarlo normalmente, aunque de forma diferente que con JSE ya que aqui las transacciones estan manejadas por el contenedor ("Cannot use an EntityTransaction while using JTA"). A continuación os hago un resumen de la clase:

import javax.ejb.*;
import javax.persistence.*;
import java.util.List;

import java.util.ArrayList;
import java.util.Iterator;
import drm.zoo.model.AnimalEntity;

import drm.zoo.dto.Animal;

@Stateless
public class AnimalBean implements AnimalInterface{

@PersistenceContext
EntityManager em;

private Animal convert(AnimalEntity ae){
Animal a = new Animal();
a.setId(ae.getId());
a.setNombre(ae.getNombre());
return a;
}

private AnimalEntity convert(Animal a){
AnimalEntity ae = new AnimalEntity();
ae.setId(a.getId());
ae.setNombre(a.getNombre());
return ae;
}

private void copy(AnimalEntity ae, Animal a){
ae.setNombre(a.getNombre());
}

private AnimalEntity find(Animal a){
AnimalEntity ae = em.find(AnimalEntity.class, a.getId());
return ae;
}

// Implementación del Interfaz
public void insert(Animal a){

AnimalEntity ae = convert(a); em.persist(ae);
}

public void delete(Animal a){
AnimalEntity ae = find(a);em.remove(ae);
}

public void update(Animal a){
AnimalEntity ae = find(a);copy(ae,a);
}

@SuppressWarnings("unchecked")public List<Animal> retrieve(){
List<AnimalEntity> aeList = em.createNamedQuery("findAllAnimal").getResultList();
List <Animal> aList = new ArrayList<Animal>();
for (Iterator iter = aeList.iterator(); iter.hasNext();) {
AnimalEntity ae = (AnimalEntity) iter.next();
em.refresh(ae);
aList.add(convert(ae));}return aList;
}
}

4 - Creación de proyecto Web

Para crear el modulo Web debemos ejecutar "File/New/Project..." y luego seleccionar "Web/Dynamic Web Project". Como "Target Runtime" seleccionamos el Glassfish y en el combo "Configurations" escogemos "JavaServer Faces". Siguiendo el asistente tener en cuenta añadir "Sun DD Files" como "Project Facet". Despues seleccionar como siempre las librerias de JSF y Tomahawk y elegir "Deploy jars to WEB-INF/lib". Todo esto no se podrá hacer si no tenemos correctamente configurado el plugin de JSF y las respectivas librerias de implementación de MyFaces y Tomahawk.

Lo siguiente será realizar la correcta configuración de Web.xml (filtros para Tomahawk).
Ahora se debe enlazar el proyecto Web con el EJB. Para ello, desde las propiedades del proyecto Web, en el apartado "Project References", añadimos referencia al proyecto EJB creado anteriormente. Aún así, no podremos importar los paquetes del proyecto EJB en el Web. Para poder hacerlo debemos crear primero el proyecto de Aplicación Empresarial.

5 - Creación de proyecto "J2EE" Aplicación empresarial

Para crear el modulo Web debemos ejecutar "File/New/Project..." y luego seleccionar "J2EE/Enterprise Application Project". Asociar los dos proyectos (ejb+web) durante la creación. Posteriormente debemos establecer la dependencia de modulo J2EE desde el proyecto Web al proyecto EJB. Esto se realiza desde las propiedades del proyecto Web, en el apartado "J2EE Module Dependencies".

6 - Implementación del proyecto Web

Posteriormente debemos crear los paquetes en los que vamos a distribuir las clases. Yo he seguido la siguiente estructura:

drm.zoo.view
AnimalListManagedBean
AnimalManagedBean

Los Managed Beans se encargarán de invocar de forma remota a los EJB. Para ello en el constructor instanciamos el EJB adecuado:

import javax.naming.InitialContext;
import javax.naming.NamingException;
import drm.zoo.biz.AnimalInterface;
import drm.zoo.dto.Animal;

public class AnimalListManagedBean {

private AnimalInterface abList;
public AnimalListManagedBean() throws NamingException{
InitialContext ic = new InitialContext();
abList = (AnimalInterface) ic.lookup(AnimalInterface.class.getName());
}
// .........
}

Lo demás es generar las JSP, configurar el faces-config.xml y terminar de implementar los Managed Beans.

7- Configurar el Servidor de Aplicaciones

Antes de poder ejecutar la aplicación debemos configurar el servidor de aplicaciones. Ya que debemos crear el DataSource que declaramos en el fichero de persistencia. Para ello hay que integrar el Oracle JDBC Driver en Glassfish. Para ello copiaremos el jar (ojdbc14.jar) en el directorio "C:\glassfish\domains\domain1\lib" y reiniciaremos el servidor (asadmin start-domain domain1).

Posteriormente debemos crear un Connection Pool. Esto lo realizaremos con la Consola de Administración del Glassfish (http://localhost:4848). Desde la opción "Resources/JDBC/Connection Pools". Creamos un OracleDataSource y establecemos únicamente las siguientes propiedades:

user: drm
password: drm1
url: jdbc:oracle:thin:@maquetadb:1521:ORCL

Posteriormente debemos crear un recurso JDBC desde la opción "Resources/JDBC/JDBC Resources". Lo llamaremos "jdbc/DRMDataSource" (el mismo que el declarado en el fichero de persistencia) y utilizará el Pool creado anteriormente.

8 - Desplegar y Ejecutar la aplicación

Para ejecutar la aplicación podemos simplemente utilizar la opción de "Run" del proyecto elijiendo el Servidor Glassfish declarado y añadiendo el proyecto de aplicación empresarial para desplegar. Despues elegir una página JSP y realizar el "Run As" de la misma.

Para desplegar la aplicación fuera del entorno debemos exportar como la aplicación empresarial como "EAR file". Esto se realiza mediante la opción "Export" (botón derecho sobre el proyecto).
El EAR generado se puede desplegar en glassfish y (en teoria) en cualquier servidor de aplicaciones.

Para desplegar la aplicación manualmente se puede hacer de varias formas, pero lo más sencillo es utilizar la Consola de Administración del Glassfish.

JPA en SQL Server

En este correo voy a intentar explicar cómo configurar JPA para que corra sobre una base de datos MSSQL. Tomaremos como ejemplo la aplicación Zoo desarrollada por David.

Los pasos a seguir son los siguientes:

Crear el usuario “drm” con clave “drm01”. Luego, creamos una base de datos (llamada DRM) que contenga a la tabla ANIMAL:

CREATE TABLE ANIMAL (
ID numeric(8, 0) NULL ,
NOMBRE varchar(20)
)
GO

Descomprimimos en nuestra máquina el driver JDBC de MSSQL proporcionado por Microsoft (file://isoftidi01/SHARED/JSF-JPA/04%20-%20librerias%20JPA/jdbc/mssql2005).

Añadimos al Web App Libraries el sqljdbc.jar.

Configuramos adecuadamente el fichero persistence.xml (os adjunto el mio para que lo veáis).

Con estos sencillos cuatro pasos deberíamos poder ejecutar Zoo sobre Sql Server.

Ejemplo completo JSF+JPA en JSE

Os anuncio que he desarrollado un ejemplo completo de aplicación JSF con acceso a datos mediante JPA para vuestra formación.

A continuación está el Link para descargar los fuentes:

http://dl2u.savefile.com/f158ee0159974a371f810c17e7ac4c23/zoo.rar

Dentro encontrareis dos ficheros:

- zoo.war (es la aplcación que es desplegable directamente en Tomcat5.5)
- zoo.rar (son los fuentes de la aplicación para su utilización en Eclipse)

La aplicación solo tiene dos páginas. La primera "animalList.jsp" ofrece la lista de animales existentes y permite insertar, eliminar y modificar los mismos. La segunda "animalForm.jsp" representa el formulario de edición de los campos de la tabla ANIMAL.

He dividido los fuentes en los siguientes paquetes y clases:

drm.zoo.model
AnimalEntity
drm.zoo.control
AnimalBean
AnimalListBean
drm.zoo.view
AnimalListManagedBean
AnimalManagedBean
drm.zoo.dto
Animal

AnimalEntity representa la entidad Animal y es un EntityBean generado con Dali y que posteriormente he modificado añadiendo una NamedQuery.

AnimalBean utiliza la clase Animal para realizar las operaciones básicas de insercción, modificación, borrado en la base de datos. Para ello utiliza un EntityManager que recibe como parametro en su creación.

La clase AnimalListBean gestiona las consultas a base de datos de la entidad Animal y es quien ejecuta la NamedQuery.

AnimalListManagedBean y AnimalManagedBean son "Managed Beans" de sesión declarados en el faces-config y son las clases "backing" de las dos páginas jsp. El intercambio de información entre los ManagedBeans y los Beans de control se realizan mediante una clase de tipo DTO (Data Transfer Object). Esta clase es la clase Animal, y únicamente dispone de getters y setters.

Cualquier duda relacionada con el ejemplo será atendida con gusto.

JPA en Eclipse

En esta entrada voy a tratar de informaros sobre JPA y sobre el uso de JPA en Eclipse.

Como ya os he comentado en otra ocasión, solo voy a daros algunos apuntes básicos para luego dejaros a vuestro habitual ritmo autodidacta. Aunque por supuesto cualquier duda/problema será atendido por mi parte con mucho gusto.

Lo primero, como siempre, es saber que es JPA (Java Persistence API). JPA es la especificación del API de persistencia de EJB3.0 (http://www.jcp.org/en/jsr/detail?id=220). La especificación EJB 3.0 es muy extensa y define toda la arquitectura EJB que soporta JEE5. Una parte de este modelo es el "motor" o mecanismo de persistencia.

El objetivo del motor de persistencia es gestionar el el acceso almacenes de datos persistentes de algún tipo. Estos almacenes de datos suelen ser bases de datos relacionales aunque se pueden gestionar otros almacenes de datos como XML, etc. La razón principal para separar el acceso a datos del resto del sistema, es que de esta manera, es más sencillo reemplazar orígenes de datos y compartir objetos de acceso a datos entre aplicaciones o módulos.
Existen diferentes métodos para implementar la persistencia de datos. Es posible modelar la persistencia sin tener definido el método de implementación que puede ir desde una clase JDBC codificada manualmente, un Entity Bean (EJB) con persistencia de tipo bean-managed (BMP) o container-managed (CMP), un objeto JDO, o un objeto generado mediante una herramienta O/R (object-relational mapping tool) como TopLink o Hibernate.

La especificación JPA se introdujo en JEE5 para tratar de dar solución a este conglomerado de soluciones. Aunque como siempre, es opcional utilizarlo y es posible seguir desarrollando con las tecnologías antes citadas.

La especificación JPA se basa en la definición de objetos de tipo entidad. Normalmente una entidad se corresponde con el registro de una tabla y se define al igual que un Bean, con metodos get y set para cada uno de sus atributos (que se corresponden con el valor de cada columna de la tabla). Una vez tenemos definidos los "Entity Beans" solo necesitamos un gestor de Entidades que sea capaz de manejarlos, añadir nuevas entidades (filas), eliminarlas o modificarlas. De esta forma se independiza del motor de base de datos utilizandose un lenguaje especial para ejecutar las consultas llamado EJB QL (aunque tambien se puede utilizar SQL nativa).

Para saber en general más acerca de la especificación JPA y de como usarla debeis leer los siguientes capitulos del tutorial de JEE5:
Definición de Entidades - SUN (http://java.sun.com/javaee/5/docs/tutorial/doc/PersistenceIntro2.html)Utilización de Entidades (http://java.sun.com/javaee/5/docs/tutorial/doc/PersistenceIntro3.html)

Y como ultima referencia siempre esta el Javadoc:
Javadoc de persistencia (http://java.sun.com/javaee/5/docs/api/javax/persistence/package-summary.html)
Bien, una vez que ya sabemos que es JPA y como se utiliza ahora queremos...usarlo. Bueno, JPA es una especificación, por lo tanto hay que buscar una implementación de la misma. La implementación de referencia ofrecida por SUN es Glassfish JPA (https://glassfish.dev.java.net/javaee5/persistence/). Sin embargo, aunque es la implementación de referencia de SUN esta implementada y mantenida por ORACLE. En realidad, esta implementación se llama TopLink Essentials (http://www.oracle.com/technology/products/ias/toplink/jpa/index.html).

Para usar JPA de una forma más amigable Eclipse tiene un plugin que ayuda a crear las entidades de persistencia. Este plugin se llama Dali (http://www.eclipse.org/dali/). Basta con instalarlo adecuadamente y una vez operativo es sencillo acceder a la base de datos y generar las entidades asociadas a las tablas automaticamente. Creo que como punto de partida esta bien. Pero una vez generadas las entidades no volvemos a utilizar Dali nunca más. Así que depende y como es util o no.

Lo más coñazo de utilizar JPA es utilizar el fichero de configuración (persistence.xml). En este fichero se configura la conexión a la base de datos y demás caracteristicas necesarias para la utilización de la persistencia. Además debe residir en un sitio muy especifico (directorio META-INF en el raiz de las clases que lo utilizan).

Otra cosa que hay que explicar es que JPA se puede utilizar en aplicaciones JSE y en aplicaciones JEE. En el caso de JEE toda la configuración y gestión de los jars se deja al servidor de aplicaciones. Esto es, cada servidor de aplicaciones implementará su JPA como más le convenga (ORACLE usa TopLink, Glassfish usa TopLink Essentials, JBOSS usa Hibernate JPA, etc.). En caso de JSE es necesario mayor configuración y disponer de las librerías de implementación de JPA y del proveedor JDBC adecuado para la conexión a la base de datos.

Para empezar a trabajar con TopLink Essentials en una aplicación JSE debemos descargarnos los "jar" correspondientes y configurar adecuadamente nuestra aplicación. Este es un buen punto de partida (https://glassfish.dev.java.net/javaee5/persistence/entity-persistence-support.html).

Para empezar a jugar os recomiendo que empeceis con una aplicación JSE. Si quereis incluso puede ser una aplicación Web que podeis desplegar en el Tomcat sin necesidad de Servidor de Aplicaciones. Lo más complicado que es la configuración del fichero de configuración de la persistencia os lo paso:


<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
<persistence-unit name="default">
<provider>oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider</provider>
<!-- All persistence classes must be listed -->
<class>drm.zoo.model.AnimalEntity</class>
<properties>
<!-- Provider-specific connection properties -->
<property name="toplink.jdbc.driver" value="oracle.jdbc.OracleDriver"/>
<property name="toplink.jdbc.url" value="jdbc:oracle:thin:@maquetadb:1521:ORCL"/>
<property name="toplink.jdbc.user" value="drm"/>
<property name="toplink.jdbc.password" value="drm01"/>
<!-- Provider-specific settings -->
<property name="toplink.logging.level" value="INFO"/>
</properties>
</persistence-unit>
</persistence>

Saludos

Tomahawk en Eclipse

Paso a comentaros el capitulo 2 de configuración de MyFaces en Eclipse.

Todo lo que os conté es valido, pero sin embargo no os he dicho que Tomahawk se añade como un paquete diferente y tiene alguna particularidad. Para poder añadir los componentes de Tomahawk desde Eclipse debeis añadir la librería tomahawk-1.1.3.jar y commons-fileupload-1.1.1.jar a un nuevo grupo de librerías JSF que podeis llamar Tomahawk (esto desde window/preferences/Web and XML/JSF Libraries). Los paquetes son descargables desde la web de Apache (http://www.apache.org).

Una vez configurado el grupo de librerías luego se ha de añadir normalmente desde el wizard de creación de proyecto Web dinamico. Para poder usar tomahawk hay que configurar especialmente el fichero web.xml para la utilización del MyFaces Extension Filter:

<web-app id="WebApp_ID">
<display-name>test-jsf-2</display-name>
<filter>
<filter-name>MyFacesExtensionsFilter</filter-name>
<filter-class>org.apache.myfaces.webapp.filter.ExtensionsFilter</filter-class>
<init-param>
<param-name>maxFileSize</param-name>
<param-value>20m</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>MyFacesExtensionsFilter</filter-name>
<servlet-name>Faces Servlet</servlet-name>
</filter-mapping> <filter-mapping>
<filter-name>MyFacesExtensionsFilter</filter-name>
<url-pattern>/faces/myFacesExtensionResource/*</url-pattern> </filter-mapping>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>
javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.faces</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>

Por último solo es necesario crear una definición de tag en la página JSP y listo:

<%@ taglib uri="http://myfaces.apache.org/tomahawk" prefix="t" %>

Todo esto viene un poco peor explicado en (http://myfaces.apache.org/tomahawk/index.html).

Saludos




JSF y JSF sobre Eclipse

En esta entrada voy a tratar de informaros acerca del uso de JSF en general y de JSF sobre Eclipse.

Solo voy a daros algunos apuntes básicos para luego dejaros a vuestro habitual ritmo autodidacta. Aunque por supuesto cualquier duda/problema será atendido por mi parte con mucho gusto.

Lo primero es saber que es JSF (Java Server Faces) para ello lo mejor debería ser leer las especificaciones (http://jcp.org/aboutJava/communityprocess/final/jsr127/index2.html) aunque es lo que nadie se lee (ni yo). En general es un Framework de desarrollo de aplicaciones Web en Java. Y desde mi punto de vista va por detras de ASP.NET aunque mejora alguna cosa de Struts. JSF es solo una especificación, es decir, SUN define un estandar y luego aparecen diferentes implementaciones. Aunque SUN tiene una implementación de referencia, la SUN-RI (http://java.sun.com/javaee/javaserverfaces/), la implementación más usada y la que nosotros vamos a usar es MyFaces de Apache (http://myfaces.apache.org/). MyFaces implementa la especificación y adicionalmente ofrece el proyecto Tomahawk (http://myfaces.apache.org/tomahawk/index.html) que proporciona componentes que extienden la implementación (como un DatePicker un TreeViwe, etc.).

Para hacer las pruebas y ejecutar la aplicación Web usaremos un contenedor Web. En este caso podemos usar Tomcat (http://tomcat.apache.org/).

Para trabajar usaremos Eclipse 3.2. Yo he partido de la distribución Eclipse WTP 1.5 (Web Tools Platform) (http://www.eclipse.org/webtools/). Esta distribución incluye Eclipse 3.2 y todos los plugins necesarios para el trabajo en Web. Si usais la distribución Callisto (http://www.eclipse.org/callisto/java.php) entonces WTP esta incluido (aunque no lo he verificado).

Para poder trabajar con Tomcat desde Eclipse debemos configurarlo. Para ello hay que añadir un nuevo Run-Time de servidor. Esto se hace desde "Window/Preferences/Server/Installed Runtimes". Simplemente es necesario indicar la ruta al directorio donde este el tomcat. Posteriormente ya podemos crear un nuevo servidor (esto se puede hacer desde la pestaña "Servers" con el botón derecho).

Adicionalmente a Eclipse WTP, para trabajar con JSF teneis que instalaros el plugin especifico WTP-JSF (http://www.eclipse.org/webtools/jsf/). Una vez instalado esto debeis configurar el entorno.

Lo primero es registrar las librerías. Esta característica permite crear un conjunto de jars con nombre para su utilización con aplicaciones JSF.

Descomprimir el fichero myfaces-core-1.1.3-bin.zip y observar los jars necesarios en el subdirectorio lib.

Selecciona Window/Preferences/Web and XML/JSF Libraries. Click en nuevo y añade una nueva librería llamandola "MyFaces". Ojo en marcar el check box que indica que es una implementación de JSF "Is JSF Impementation". En esta librería añadiremos los jars de implementación de MyFaces (dos jars que comienzan con myfaces).

Luego añadiremos dos librerías más. Una llamada "JSTL" y otra "Commons" y distribuiremos alli los jars que nos quedan (en Commons todo lo que empieza por commons y en JSTL el jar que empieza por jstl). A partir de ahi ya se puede trabajar con Eclipse y JSF.

Lo siguiente es crear un proyecto JSF. Para ello se debe crear un nuevo proyecto de tipo "Dynamic Web Application" y elegir la configuración "Java Server Faces". En la página JSF Capabilities, añadir las librerías Commons y JSTL y selecciona "Deploy JARS to WEB-INF/lib". Una vez hecho esto el proyecto se crea completamente.

Para comenzar, el tutorial más completo es el siguiente (http://www.coreservlets.com/JSF-Tutorial/). Este tutorial no tiene en cuenta el uso del plugin JSF tool de Eclipse, por lo tanto explica el fichero faces-config.xml y lo modifica "a pelo". Sin embargo gracias al plugin cuando hacemos doble-click sobre el fichero faces-config.xml se abre una ventana y de manera visual se puede configurar todo. El manejo básico de este plugin se puede ver en el siguiente tutorial (http://www.eclipse.org/webtools/jsf/dev_resource/JSFTutorial-RC3/JSFTools_tutorial.html).

Suerte !!

Bienvenida

Por iniciativa propia y sintiendome obligado a devolver algo de lo que Internet me ha dado voy a ir dejando mis "descubrimientos" acerca de JEE en este Blog. Aparte de que estará en Español y puede ser util para muchos. Mi intención es presentar una información practica que puede ser aplicada directamente sin dejarse los cuernos en 30.000 mil enlaces diferentes.

Como resumén el objetivo aqui es diseñar, desarrollar y desplegar aplicaciones Web en tres capas básadas en Java EE que puedan acceder a cualquier motor de base de datos y ejecutarse en cualquier servidor de aplicaciones. Ahi es nada !!

Valor y a ver cuanto duramos....