Professional Documents
Culture Documents
Kit de desarrollo de
componentes
En este capítulo, vamos a crear un sencillo componente JSF utilizando el Kit de Desarrollo de
Componentes (CDK). Desarrollar un componente JSF no es una tarea sencilla, y si lo hace sin la ayuda
de la CDK, usted tendrá que escribir mucho del código estandar(y no en componentes específicos) que
incluye la clase UIComponent, clase Procesador, etiqueta de clase, archivos de configuración, y así
sucesivamente. El CDK ofrece muchas ventajas tales como un esqueleto del proyecto pre-generado
para iniciar rápidamente, un generador que tiene la tarea de generación de tareas repetitivas utilizando
archivos de configuración simple, un constructor de funcionalidades Ajax, pruebas, optimización para
versiones especificas JSF, creación del componente render usando un código de marcado JSP-like,
soporte para plantillas JSF, y mucho más.
Con el fin de mostrar cómo iniciar y sus características básicas, vamos a desarrollar un componente de
conteo de estrellas que acepta un valor flotante y hace que sea como las estrellas
Vamos a empezar!
Configurando el entorno
Todo el CDK se basa en Apache Maven (http://maven.apache.org/) que es ampliamente utilizado para
generar el código esqueleto que podemos utilizar como base para trabajar.
Maven es una herramienta utilizada por una gran cantidad de proyectos Java con el fin de gestionar la
administración de proyectos y fases de construcción. Está cerca (como concepto) a Apache Ant y muy
útil para generar la automatización.
Maven se puede descargar de forma dinámica las dependencias necesarias para crear un proyecto y es
muy útil para crear desde cero y mantener las plantillas de proyecto.
Instalando Maven
Si usted no ha instalado Maven antes de empezar tenemos que instalar. Para ello, visite el sitio web de
Maven (http://maven.apache.org), descargarlo, y siga las instrucciones para completar la instalación.
Configurando
Después de haber instalado correctamente Maven, tenemos que configurarlo para usarlo con el CDK.
El archivo setting.xml contiene toda la configuración general de Maven que podemos utilizar en
nuestros proyectos de Maven.
En nuestro caso, vamos a agregar el perfil de cdk a la configuración de elemento, este perfil permite
que los recursos generales, tales como repositorios cdk-specific y plugins, que serán compartidos entre
los archivos pom.xml utilizados para nuestros componentes CDK.
Ir al directorio de maven y abra el fichero conf / settings.xml dentro de un editor, agregando un nuevo
perfil (dentro de la sección perfiles) para CDK:
<profile>
<id>cdk</id>
<repositories>
<repository>
<id>maven2-repository.dev.java.net</id>
<name>Java.net Repository for Maven</name>
<url>http://download.java.net/maven/1</url>
<layout>legacy</layout>
</repository>
<repository>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
<updatePolicy>never</updatePolicy>
</snapshots>
<id>repository.jboss.com</id>
<name>Jboss Repository for Maven</name>
<url>http://repository.jboss.com/maven2/</url>
<layout>default</layout>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>maven.jboss.org</id>
<name>JBoss Repository for Maven Snapshots</name>
<url>http://snapshots.jboss.org/maven2/</url>
<releases>
<enabled>false</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
<updatePolicy>always</updatePolicy>
</snapshots>
</pluginRepository>
<pluginRepository>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
<updatePolicy>never</updatePolicy>
</snapshots>
<id>repository.jboss.com</id>
<name>Jboss Repository for Maven</name>
<url>http://repository.jboss.com/maven2/ </url>
<layout>default</layout>
</pluginRepository>
</pluginRepositories>
</profile>
Como puede ver, hemos añadido recursos repository y pluginRepository que serán utilizadados por
nuestro fichero pom.xml.
Después de eso, tenemos que activar el perfil. Para hacer eso, simplemente quite la sección
activeProfiles, como en el siguiente código:
<activeProfiles>
activeProfile>cdk</activeProfile>
</activeProfiles>
Ahora el ambiente está listo y podemos empezar a crear nuestro proyecto nuevo componente!
Creando el proyecto
Con el fin de generar nuestro proyecto, en primer lugar vamos a crear un directorio que contiene
nuestro componente (que puede contener más de uno) y vamos a llamarlo, por ejemplo, sandbox.
Dentro del nuevo directorio, vamos a crear un archivo llamado pom.xml e inserte este código:
<modelVersion>4.0.0</modelVersion>
<groupId>org.mycompany</groupId>
<artifactId>sandbox</artifactId>
<url>http://mycompany.org</url>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.4</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.faces</groupId>
<artifactId>jsf-api</artifactId>
<version>1.2_12</version>
</dependency>
<dependency>
<groupId>javax.faces</groupId>
<artifactId>jsf-impl</artifactId>
<version>1.2_12</version>
</dependency>
<dependency>
<groupId>javax.el</groupId>
<artifactId>el-api</artifactId>
<version>1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>el-impl</groupId>
<artifactId>el-impl</artifactId>
<version>1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>jsr250-api</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>org.richfaces.ui</groupId>
<artifactId>richfaces-ui</artifactId>
<version>3.3.1.GA</version>
</dependency>
</dependencies>
</project>
Con la excepción del modelVersion, empaquetado, y las secciones dependencies, puede cambiar los
otros parámetros (como groupId, artifactId, etc) con sus valores personalizados.
¿Qué es POM?
Si usted no conoce Maven, tal vez usted se está preguntando acerca de lo que significa POM. POM
significa Proyecto de Modelo de Objetos y se utiliza como una descripción del proyecto para poder
construirlo, usted puede especificar no solo las dependencias, sino también las tareas a realizar
durante el proceso y un montón de características avanzadas. Puede ser personalizado con plugins
three-part para tareas específicas.
Una vez creado el POM, se puede pasar (en nuestro terminal) dentro del directorio sandbox que hemos
creado (que contiene el archivo pom.xml) y lanzar el siguiente comando (todo está en una línea
completa):
Al utilizar este comando, le estamos pidiendo Maven para generar una plantilla de proyecto para un
componente llamado starRating.
Se iniciará la fase de generación de proyectos , se detendrá en algún punto para preguntar cierta
información:
Aquí, hemos definido el prefijo de la estructura del paquete de nuestra biblioteca que será
book.richfaces.cdk.example.
Aquí, se puede decidir la versión del componente. El sistema sugiere el valor 1.0-SNAPSHOT y
acabamos de confirmar pulsando Enter.
También para la siguiente pregunta, elegimos los valores predefinidos con sólo pulsar la tecla Intro:
Después de eso, el script nos pide confirmar los valores, así que solo escriba Y presione la tecla Intro:
Se genera la estructura del proyecto del nuevo componente que debería aparecer como se muestra en
la siguiente pantalla:
Una breve explicación sobre la estructura de directorios generada es la siguiente:
Directorio Descripción
src/main/config Contiene los metadatos de archivos
relacionados con la configuración de
los componentes.
src/main/java Contiene el código Java
src/main/resources Contiene todos los recursos que
vamos a utilizar en nuestro
componente (imágenes, archivos
JavaScript, archivos CSS, etc.).
src/main/templates Contiene la plantilla JSP-like la que
describe el diseño del componente.
Generando el template
Como puede ver, dentro del directorio del nuevo componente generado (llamado starRating), usted
puede encontrar otro archivo pom.xml. El siguiente paso es editar el archivo mediante la adición de un
nuevo plugin dentro de la sección de plugins:
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<inherited>true</inherited>
<configuration>
<source>1.5</source>
<target>1.5</target>
</configuration>
</plugin>
Configurando la versión del source y target dentro del elemento configuration del pluginse llama al
plugin compilador de Maven para pasar estos parametros al compilador javac. Por lo tanto, se obtiene
clases compatibles con la versión de Java que se especifica en el elemento de destino (1,5) para
compilar el código fuente 1.5-compatible.
Tenemos que establecer los parámetros, como la configuración por default de source es de 1,3, y la
configuración predeterminada de target es de 1,1-esto es independiente de la JDK que corre con
Maven.
Ahora estamos listos para crear el esqueleto de nuestro nuevo componente: vamos a ir dentro del
directorio starRating y lanzamos el siguiente comando:
Acabamos de ejecutar la meta Maven llamada cdk: create pasando el nombre como parámetro
(utilizando la opción-D para definir una propiedad de sistema).
Probando el template
Después de la creación del esqueleto de la plantilla, podemos probarlo con sólo lanzar el siguiente
código:
mvn install
Si, al final del proceso, dice BUILD SUCCESSFUL, entonces todo lo trabajado y que ha generado un
nuevo paquete(vacio) de componente jar. Usted puede encontrar el paquete dentro del directorio
target que el proceso ha creado.
La próxima vez que desee reconstruir el proyecto, primero debe limpiar todo y volver a generarlo
mediante el siguiente comando:
Creando el componente
Como hemos dicho, que acabamos de generar un componente vacío - el siguiente paso es editar los
archivos generados (y añadir otras nuevas) a fin de crear nuestros archivos personalizados.
Hemos decidido desarrollar un componente sencillo con el fin de mostrar cómo empezar de una manera
sencilla. Por lo tanto, no vamos a usar JavaScript o características complejas, nuestro componente
sólo mostrará el número de estrellas que pasan a él.
Con el fin de hacerlo más interesante también se gestionaran valores decimales (que representaran la
mitad de una estrella).
<property>
<name>value</name>
<classname>java.lang.Float</classname>
<description>
The value of the component.
</description>
</property>
Además, queremos apoyar a las propiedades estándar para el estilo de personalización (estyle y
styleClass); en vez de añadir a mano, podemos utilizar las entidades predefinidas, añadiendo este
código:
&html_style_attributes;
Hay otras entidades predefinidas para los atributos comunes que podemos utilizar (consulte la
documentación CDK para este fin en http://docs.jboss.org/richfaces/ latest_3_3_X/en/cdkguide/html /).
Recursos de componentes
La segunda cosa que necesitamos son las imágenes de dos tipos de estrellas una llena y una media.
Vamos a crear el directorio starRating / src / main / resources / book / RichFaces / example cdk / /
renderkit / html / imágenes y copiamos las dos imágenes (con nombre y full.png half.png) .
Procesador de componente
La clase Procesador de un componente se encarga de hacer la representación del componente que
genera el marcado elegido (como HTML, WML, etc.). También es responsable de convertir los valores a
los clientes el tipo correcto de que el componente va a utilizar.
Con el fin de entrar en la profundidad de la estructura de los componentes JSF y los ciclos de vida,
consulte la documentación oficial de JSF.
Utilizando el marco CDK, podemos crear nuestra clase Procesador mediante una página JSP-like de
marcado que se convierte automáticamente en el código de Java durante la generación de paquetes.
Muy conveniente!
Vamos a abrir la plantilla de archivo generado starRating / src / main / templates / book / RichFaces /
cdk / ejemplo / htmlStarRating, jspx y empezamos a importar los recursos que se van a utilizar,
añadiendo el código de relieve entre el f: ClientID y las etiquetas div :
...
<f:clientid var="clientId"/>
<f:resource var="fullStar" name="images/full.png" />
<f:resource var="halfStar" name="images/half.png" />
<div ...
Ahora podemos referirnos a ellos con la denominación que figura en el atributo var (fullStar y halfStar).
Por ejemplo, si queremos insertar la imagen de la estrella completa, podemos utilizar el siguiente
código:
En nuestra aplicación, aceptamos los valores Flotantes en el atributo de valor (que especificamos como
un flotante en el archivo de configuración), así que lo primero que debes hacer es conseguir un flotante
del valor pasado.
Para ello, usamos una etiqueta especial llamada jsp: scriptlet que es muy útil para insertar dentro de la
lógica de Java dentro del código JSP-like, será copiado "tal cual" en la clase Renderer generada .
<jsp:scriptlet>
<![CDATA[
Float ratingValue =(Float) component.getAttributes().get("value");
variables.setVariable("ratingValue", ratingValue);
]]>
</jsp:scriptlet>
En este código, lo primero que vamos a obtener es el valor flotante, a continuación será insertarlo en
una variable denominada ratingValue (así, podemos referirnos a ella en el siguiente fragmento de
código que vamos a insertar).
Después de obtener y establecer el valor, tenemos que llegar a la parte entera del valor flotante y
escribir tantas estrellas como el número que hemos encontrado.
For that purpose, we use the following scriptlet (to be written after the first one):
<jsp:scriptlet>
<![CDATA[
// Render the full stars
int integerValue = (int)Math.floor(ratingValue);
for (int b=0; b<integerValue; b++) {
]]>
</jsp:scriptlet>
<img src="#{fullStar}" alt="#{ratingValue}" />
<jsp:scriptlet>
<![CDATA[
}
]]>
</jsp:scriptlet>
Como puede ver, mezclamos el código HTML y código Java (correctamente el cierre y la reapertura de
las etiquetas scriptlet).
El código que acabamos de insertar itera sobre la parte entera con el fin de escribir una lista de estrellas
completas, por ejemplo, si pasamos el número 3.4, escribe tres estrellas completas.
Ahora tenemos que considerar la parte decimal y decidir qué hacer. Hemos hecho una lógica simple:
• Si el valor de la parte decimal es de más de 0,66, luego escribimos otra estrella completa
(redondeando hacia arriba)
• Si está entre (el rango) de 0,33 y 0,66, escribimos media estrella
• Si el valor es inferior a 0,33, no escribimos nada (redondeando hacia abajo)
<jsp:scriptlet>
<![CDATA[
// Decide if I have to render for the last star
float decimalPart = (ratingValue-integerValue);
if (decimalPart>0.66) {
]]>
</jsp:scriptlet>
<jsp:scriptlet>
<![CDATA[
} else if (decimalPart>=0.33 && decimalPart<=0.66) {
]]>
</jsp:scriptlet>
<jsp:scriptlet>
<![CDATA[
}
]]>
</jsp:scriptlet>
Hemos terminado (esto es un componente muy simple), y estamos dispuestos a probarlo dentro de
nuestra aplicación!
Después de eso, hay que añadir la nueva biblioteca en el paquete generado en el proyecto sean-
generator y editar el archivo desployed-jars-war.list añadiendo la siguiente línea:
starRating-1.0-SNAPSHOT.jar
En nuestro caso, estamos añadiendo a la lista de archivo EAR (deployed-jars-ear.list), porque hemos
movido todas las bibliotecas que había, al escribir los ejemplos para el Capítulo 10.
package book.richfaces.advcm.modules.main.examples.component;
import org.jboss.seam.annotations.Name;
@Name("starRatingTest")
public class StarRatingTest {
Ahora vamos a usarlo dentro del XHTML a través de nuestro nuevo componente!
Como puedes ver, hemos conectado los valores del bean a un texto de entrada y dos componentes
starRating con el fin de mostrar el valor que el usuario escribe en la entrada como las estrellas.
Para utilizar el componente, que hemos definido el namespace como pueden ver por la línea señalada.
Lo último que podemos añadir (opcionalmente, sólo para tener una buena apariencia de la URL de la
página) es el descriptor Seam de la página en el mismo directorio, con el nombre
componentExample.page.xml y el siguiente contenido:
Si ejecutamos el ejemplo, podemos ver el componente de actualización de una petición Ajax después
de foco de entrada del usuario sale del componente h: inputText.
Aquí hemos añadido a los componentes de color de bordes a nuestra prueba sólo para darle un
ejemplo. También puede implementar imágenes personalizadas para las estrellas y así sucesivamente:
le toca a usted!
Resumen
CDK es "kit" muy útil para desarrollar componentes rich JSF en una forma rápida y sólida, sin importar
todos los estándares de código que normalmente un componente JSF requiere.
En este capítulo, hemos visto cómo poner en marcha un proyecto para desarrollar un simple
componente JSF Ajax de una manera sencilla y eficaz con las características que ofrece CDK.