viernes, 12 de diciembre de 2008
Servlet y Jsp
Nos creamos nuestra prueba.jsp y en el form le ponemos la ruta del servlet.
prueba.jsp
RecogeForm.java
WEB-INF , META-INF
Su ruta son : /src/main/resources/META-INF y src/main/webapp/WEB-INF
El META-INF tienes los archivos de persistencia.
El WEB-INF contiene toda la información de configuración necesarias para la aplicación Web, y todos los archivos de clase para su servlets y las clases que se llaman por su JSP (Java Server Pages). Este directorio es un componente vital para la aplicación web ,que sin él no funcionaria.
jueves, 11 de diciembre de 2008
Context.xml
En este fichero se mete los datos de configuración de ese contexto, se tiene que poner {path_tomcat}/conf/catalina/localhost/nombreContext.xml
Aquí es donde se configura los poll de conexiones entre otras cosas.
miércoles, 10 de diciembre de 2008
DataSource
Es un depósito de datos sobre el cual podemos almacenar y recuperar información.
Junto con el Connection Pool permite realizar muchas conexiones a base de datos sin sobrecargar el servidor.Para mas información de estas conexión mirar este blog Metalklesk
jueves, 4 de diciembre de 2008
Arrancar varios Tomcat con Eclipse
En el Ecplise, en el menú Windows/Preference/Server/Installed Runtime le damos a añadir elegimos la version del tomcat que tenemos, le ponemos la ruta del tomcat que hemos copiado.
Ahora en el proyecto en site/docs/server creamos una nueva carpeta para la configuración del tomcat copiamos un serverl.xml de otra carpeta y lo metemos en la nueva.
Al proyecto le damos Run As... elegimos Manually define... en la pestaña server Runtime elegimos el tomcat nuevo que hemos creado , el siguiente paso es elegir la aplicación para ese tomcat y terminamos.
Luego picamos sobre el nuevo server, le damos la ruta de la nueva carpeta serve de la aplicación y para que no haya conflictos entre distintos server le cambiamos los puertos.
Por ejemplo yo he teniado que hacer esto porque tenia dos aplicaciones que se tenia que comunicar y tenia que tener las dos arrancadas.
martes, 2 de diciembre de 2008
Eclipse
He encontrado en la wikipedia esta definición Definición Eclipse
lunes, 1 de diciembre de 2008
Conexión a base de datos
- Connection -->para realizar la conexión a la base de datos,
- PreparedStatement--> que será la que contenga la sentencia SQL.
- ResultSet --> que será la que contenga el resultado,es una especie de matriz (filas x columnas) y para acceder a las columnas se utiliza el método getXXX, getString() para cadenas de texto, getDouble() para decimales.getDate() para fechas.......
- Primero tenemos que ver donde se encuentra la base de datos,mediante IP o JDBC-ODBC, por ejemplo dbc:db2:10.0.1.80:50000/BD1 (referencia directa) o jdbc:odbc:BD1 (referencia por ODBC).
- Cargar el driver correspondiente mediante Class.forName("driver"), por ejemplo Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance();
- Realizamos la conexión para ello necesitaremos el login ,password y url de la base de datos y lo haremos con la siguiente clase Connection con = DriverManager.getConnection(jdbc:odbc:BD1, "myLogin", "myPassword");
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection con = DriverManager.getConnection(jdbc:odbc:BD1, "myLogin", "myPassword");
Un objeto Statement es el que envía nuestras sentencias SQL al controlador de la base de datos. Simplemente creamos un objeto Statement y lo ejecutamos, suministrando el método SQL apropiado con la sentencia SQL que queremos enviar. Para una sentencia select el método a ejecutar es executeQuery. Para sentencias que crean o modifican tablas, el método a utilizar es executeUpdate.
Ya tenemos nuestra conexión a la base de datos ahora vamos a ver como se hacen las consultas.
Por ejemplo si queremos crear una tabla seria de la siguiente manera:
String tabla="CREATE TABLE nombretabla " + "(nombreCampo1 tipo, nombreCampo2 tipo nombreCampo3 tipo, ...)";
stmt.executeUpdate(tabla);
Para insertar datos en la tabla seria de la siguiente forma:
stmt.executeUpdate("INSERT INTO nombre_tabla " +"VALUES ('valor1', valor2,valor3,,,,)");
Para sacar datos de la tabla seria:
ResultSet rs = stmt.executeQuery("SELECT campo1,campo2,campo3,... FROM nombre_tabla");
while(rs.next()){
System.out.println(rs.getString(campo1));
}
viernes, 28 de noviembre de 2008
JavaDoc
- @author nombreAutor descripción
- @version número de version descripción
- @param nombreParámetro descripción.
- @return descripción.
- @see nombre descripción. Cuando el trozo de código comentado se encuentra relacionada con otra clase o método, cuyo nombre se indica en nombre.
- @throws nombreClaseExcepción descripción.Cuando un método puede lanzar una excepción se indica así.
- @deprecated descripcion -->Indica que el método ya no se usa y se ha sustituido por otro.
Debug
Cuando hacemos un debug tenemos 4 botón el de play y 3 flechas.
El play no hace el debug ejecuta el programa normalmente, no lo analiza.
La flecha de la izquierda es el step into que lo que hace es entrar dentro del método directamente.
La flecha del centro es el step que ejecuta el código linea a linea, así ves paso a paso que hace el programa.
la flecha de la derecha llamada step over se va directamente a lo que devuelve el método.
miércoles, 19 de noviembre de 2008
DTD (Document Type Definition)
Un esquema basado en una DTD tiene bastantes limitaciones,no permite definir elementos locales que sólo sean válidos dentro de otros elementos.
martes, 18 de noviembre de 2008
Groovy
Para mas información http://es.wikipedia.org/wiki/Groovy_(Lenguaje_de_Programaci%C3%B3n)
Grails
lunes, 17 de noviembre de 2008
XML(eXtensible Markup Language)
martes, 11 de noviembre de 2008
XMLHttpRequest
Su función es crear un canal de comunicación, paralelo al usual, entre la página Web que se muestra en el navegador del cliente y el servidor que la ofrece.
El objeto XMLHttpRequest se puede invocar desde distintos lenguajes de programación.
En concreto, se utilizará el lenguaje JavaScript para acceder a este objeto.
la W3C en Abril del 2006 creó la primera especificación completa para el objeto XMLHttpRequest. Sin embargo, muchos navegadores ya habían implementado el objeto de una u otra forma. Por ello, al crear una nueva instancia del objeto en el código JavaScript de la página, se deben tener en cuenta estas implementaciones si se desean aplicaciones compatibles entre los distintos navegadores.
Para realizar este proceso se debe utilizar una función JavaScript que permita encapsular la creación de la instancia del objeto XMLHttpRequest.
lunes, 10 de noviembre de 2008
WebKit
jueves, 6 de noviembre de 2008
PERMGEN
Wrapper
Dota a los datos primitívos con un envoltorio que permita tratarlos como objetos.
Las clases envoltorio que trae la API son :
- Byte --> byte Interger --> int
- Short --> short Long --> long
- Boolean --> boolean Float --> float
- Double --> double Character --> char
Integer i = new Integer(5);
int x = i.nextValue();
Adapter
Una clase Clase1 convierte la interface de otra clase Clase2 para ser lo que la Clase1 espera.
lunes, 3 de noviembre de 2008
Builds
Uno de los pasos más importantes de construir un software es el proceso de compilación en archivos de código fuente se convierte en código ejecutable.
Integración Contínua
Es una metodología que consiste en hacer integraciones automáticas de un proyecto lo más a menudo posible para así poder detectar fallos cuanto antes. Entendemos por integración la compilación y ejecución de tests de todo un proyecto.
El proceso suele ser, cada cierto tiempo (horas), descargarse las fuentes desde el gestor de versiones (por ejemplo CVS, Subversion o Visual Source Safe) compilarlo, ejecutar tests y generar informes.
Para esto se utilizan aplicaciones como Continuum, Hudson, CruiseControl o Anthill (para proyectos Java) o CruiseControl.Net para .Net, que se encargan de controlar las ejecuciones, apoyadas en otras herramientas como Ant o Maven (también para proyectos Java), o Nant (para .Net) que se encargan de realizar las compilaciones, ejecutar los tests y realizar los informes.
viernes, 31 de octubre de 2008
DOM (Document Object Model)
Es un modelo computacional a través del cual los programas y scripts pueden acceder y modificar dinámicamente el contenido, estructura y estilo de los documentos HTML y XML. Su objetivo es ofrecer un modelo orientado a objetos para el tratamiento y manipulación en tiempo real (o de forma dinámica) a la vez que de manera estática de páginas de Internet.
Esto es lo que yo he entendido:
DOM es el árbol del documento. Un documento que siga las normas XML, (como HTML, JSF, etc.), se compone de una serie de nodos, (padres, hijos, etc.), que forman un árbol.
Gracias a DOM, el documento se ve como un árbol de objetos, y permite modificarlo de forma más sencilla.
miércoles, 29 de octubre de 2008
Enumeration
public enum EnumerationTipoColores {
ROJO("Color rojo"),
AZUL("Color azul"),
AMARILLO("Color amarillo");
private final String value;
EnumerationTipoColores(String v) {
value = v;
}
public String value() {
return value;
}
public static EnumerationTipoColores fromValue(String v) {
for (EnumerationTipoColores c: EnumerationTipoColores.values()) {
if (c.value.equals(v)) {
return c;
}
}
throw new IllegalArgumentException(v);
}
}
lunes, 27 de octubre de 2008
JQuery, YUI, ExtJs
- JQuery --> no es sólo un framework,”es un nuevo tipo de libreria Javascript” con su propia API. Este ha sustituido javascript por su facil forma de trabajar simplifica el código muchisimo y por ejemplo no hay que escribir tanto código para decir que un elemento se oculte utilizando css.
- YUI --> se rige por los mismo patrones que Javascript, tiene increible librerias que puedes utilizar desde código para crear sin necesidad de html innumerables controles (desde botones, containers, menu, tabview,...). Su código es más extenso que JQuery.
- ExtJs -->es una biblioteca JavaScript para la construcción ricamente interactivo de aplicaciones web utilizando técnicas tales como AJAX, DHTML y DOM scripting.
miércoles, 15 de octubre de 2008
Pom.xml
Ejemplos de esto es el directorio, que es objetivo, el directorio de fuentes, que es src / main / java, el directorio de fuentes de prueba, que es src / main / prueba, y así sucesivamente.
El POM fue rebautizado en project.xml de Maven 1 a pom.xml en Maven 2. En lugar de tener un maven.xml archivo que contiene los objetivos que se pueden ejecutar, los objetivos o plugins son ahora configurado en el pom.xml.
Cuando la ejecución de una tarea u objetivo, Maven busca el POM en el directorio actual.Se lee el POM, se necesita la información de configuración y, a continuación, ejecuta el objetivo.
Algunos de los que la configuración se puede especificar en el POM son las dependencias del proyecto, los plugins o metas que pueden ser ejecutadas, la construcción de perfiles, y así sucesivamente.Otros datos como la versión del proyecto, la descripción, los desarrolladores, listas de correo, así como también puede ser especificado.
viernes, 10 de octubre de 2008
JackRabbit
Un repositorio de contenido es un almacén de contenido jerárquica con el apoyo de estructura y contenido no estructurado, búsqueda de texto completo, de versiones, las transacciones, la observación, y mucho más.
Las aplicaciones típicas que utilizan repositorios de contenido incluyen gestión de contenidos, gestión de documentos, registros y sistemas de gestión.
Jetty
Wicket (Apache)
Artifactory
Está basado en JCR(JackRabbit) , tiene un UI basado en wicket y usa jetty para una implementacion rápida aunque también se puede implementar sobre tomcat.
Además baja las dependencias de Internet, cachea los proyectos y en caso de colapso viene muy bien.
martes, 7 de octubre de 2008
Apache Ivy
Se caracteriza por:
- Flexibilidad y configurabilidad - Ivy es esencialmente un proceso agnóstico y no está vinculada a ninguna estructura o metodología. En lugar de ello, proporciona la necesaria flexibilidad y configurabilidad que adaptarse a una amplia gama de la gestión de la dependencia y construir procesos.
- Estrecha integración con Apache Ant - mientras está disponible como una herramienta independiente, Ivy funciona particularmente bien con Apache Ant proporcionar una serie de poderosos Ant tareas que van desde la dependencia de la resolución a la dependencia la presentación de informes y publicación.
- Ivy es de código abierto y puesto en libertad en virtud de una muy permisiva licencia Apache.
- Ivy puede ser configurado para usar un montón de diferentes repositorios.
Ivy tiene un montón de potentes características, la más popular y útil es su flexibilidad, la integración con Ant y su fuerte dependencia transitiva de gestión de motor.La gestión de las dependencias transitiva es una característica que le permite obtener las dependencias de sus dependencias, transitively. A fin de abordar esta problemática hiedra para encontrar las necesidades de los metadatos acerca de sus módulos, por lo general en un archivo de hiedra. Para encontrar estos metadatos y sus dependencias artefactos.
Para más información http://ant.apache.org/ivy/history/latest-milestone/index.html
miércoles, 24 de septiembre de 2008
BreadCrumbs
Por ejemplo:
noelia-java.blogspot.com --> Jsf --> BreadCrumbs
martes, 9 de septiembre de 2008
Comparaciones JSF
martes, 29 de julio de 2008
Web.xml
Ejemplos de componentes Web son los parámetros de servlet, Servlets y JavaServer Pages (JSP) definiciones, y Localizadores Uniformes de Recursos (URL) mapeos.
El archivo web.xml debe residir en el WEB-INF directorio en el contexto de la jerarquía de directorios que existen para una aplicación Web.
Por ejemplo, si la solicitud es client.war, entonces el archivo web.xml se coloca en el raíz_instalación / cliente guerra / WEB-INF directorio.
Faces-Config.xml
Se espacifican los eventos, acciones , beans de respaldo (backend bean, bean que almacena las propiedades de los componentes UI de la página y los métodos asociados).
miércoles, 23 de julio de 2008
ui:fragment
Básicamente sirve para los rendered.
jueves, 17 de julio de 2008
If y else con Jstl
JSTL (JavaServer Pages Standar Tag Library)
- core: Comprende las funciones script básicas como loops, condicionales, y entrada/salida.
- xml: Comprende el procesamiento de xml
- fmt: Comprende la internacionalización y formato de valores como de moneda y fechas.
- sql: Comprende el acceso a base de datos.
lunes, 7 de julio de 2008
@SuppressWarnings("serial")
Basta con añadir la línea SupressWarnings @ ( serial) antes de que su definición de clase.
¿Cómo realizar las pruebas unitarias?
Estas pruebas hay que realizarlas al comienzo del ciclo de vida de la aplicación.
Antes y después de integrar,después de un refactor, siempre después de compilar.
Realizamoremos una serie de pruebas en busca de fallos a través de unos criterios que llamaremos pruebas de caja negra y/o de caja blanca, no son excluyentes, sino complementarias, hay que procurar usar las dos.
Esta explicado lo que es la caja negra y blanca en otro post.
Afortunadamente hay muchas herramientas para autmatizar pruebas unitarias: Maven, Ant, IDE's y CIS.
Pruebas Unitarias
Para que una prueba unitaria sea buena se deben cumplir los siguientes requisitos:
- Automatizable: no debería requerirse una intervención manual. Esto es especialmente útil para integración continua.
- Completas: deben cubrir la mayor cantidad de código.
- Repetibles o Reutilizables: no se deben crear pruebas que sólo puedan ser ejecutadas una sola vez. También es útil para integración continua.
- Independientes: la ejecución de una prueba no debe afectar a la ejecución de otra.
- Profesionales: las pruebas deben ser consideradas igual que el código, con la misma profesionalidad, documentación, etc.
Se recomienda seguirlos o de lo contrario las pruebas pierden parte de su función.Pero no es obligatorio.
Los beneficios de escribir pruebas unitarias son muchos:
- El código es menos frágil.
- Hacer cambios es más seguro y fácil.
- Podemos integrar continuamente de manera rápida.
- Podemos hacer refactors agresivamente.
- Tenemos una documentación viva de nuestros APIs.
- Nos permite pensar desde el punto de vista de la interfaz y no de la implementación.
- Los errores están más acotados y son más fáciles de localizar: dado que tenemos pruebas unitarias que pueden desenmascararlos.
miércoles, 2 de julio de 2008
Estandares de desarrollo
- Nombres de clases comienzan con mayuscula y continuan con sintaxis de camello
- Nombres de propiedades/objetos comienzan con misnúscula y continuan con sintaxis de camello
- Nombres de paquetes: todas las letras en minúscula.
- carpeta source foder:
- src
- test
- todos los paquetes tendrán como paquete raiz el paquete eticom
- el subpaquete será el que describa el módulo que se está desarrollando
- todas las clases deben estar en un paquete.
- testNG.jar
- suite de pruebas con las clases de prueba declaradas
- commons-logging.jar
- apache-log4j.jar
- y configuración correcta de log4j.xml.
- una de las reglas de POO es la de unica responsabilidad de las clases más info
- añadir atributo Log logger
@SuppressWarnings("deprecation")
Por ejemplo:
Cuando usamos java.util.Date fechaHasta = new java.util.Date("12/31/2099");
Esta clase esta obsoleta ypara evitar que salga el warning se le pone la anotación @SuppressWarnings("deprecation") y listo
jueves, 12 de junio de 2008
Conversation y Long running conversation
- Conversation-->es una unidad de trabajo desde el punto de vista del usuario. Tal vez abarcan varias interacciones con el usuario, varias solicitudes, varios de bases de datos y transacciones. Pero para el usuario, una conversación resuelve un solo problema.Una conversación tiene estado asociado con "lo que el usuario está haciendo ahora, en esta ventana". Un único usuario puede tener múltiples conversaciones en curso en cualquier momento, por lo general en múltiples ventanas. La conversación contexto nos permite asegurar que el estado de las diferentes conversaciones no chocar y provocar errores.
- Long-running conversation-->unicamente la 2ª mantiene el estado entre diferentes peticiones a lo largo de la realización de la tarea (task).
http://www.redhat.com/docs/manuals/jboss/jboss-eap-4.2/doc/seam/Seam_Reference_Guide/index.html
CSS estilos de la web
http://www.blooberry.com/indexdot/css/propindex/all.htm
Microformatos
Puedes marcar, por ejemplo, datos de contacto.
La aplicación parsea ese XHTML, y puede extraer, por ejemplo, el nombre de la persona, su e-Mail, su teléfono, etc. Porque está marcado siguiendo una especificación.
Gracias Juan por la explicación.
Link interesante:
Microformatos
miércoles, 11 de junio de 2008
@RaiseEvent Seam,@Observer
- anotacion para observar un evento @Observer("nombreEvento")
- anotación para lanzar un evento @RaiseEvent("nombreEvento")
Tenemos un método:
@RaiseEvent("nuevaEmpProductora")
public String actionNew(){
//código
}
Yen la misma clase o en otra clase de la aplicación ponemos :
@Observer("nuevaEmpProductora")
public String completarCampos(){
//código
}
El @Observer esta esperando que se lance un evento con el nombre que el tiene y lo ejecuta automaticamente.
@In y @Out Seam
es para inyectar componentes de la aplicación en el componente actual.
La anotación @In puede recibir valores:
- create=true/false que indica si se crea el componente en caso de que no exista (o lo que es lo mismo en caso de que Seam no lo haya creado en una petición anterior),.
- required=true/false indicando si el componente debe estar creado con anterioridad, en caso de que no exista la aplicación ha fallado y debería lanzarse una excepción.
- y los relacionados con el scope y el value que son el ámbito y el nombre del componente.
@Out
es para "outyectar" componentes, o dicho de otra forma inyectar hacia fuera y de ahí el término biyección que utiliza Seam.
La anotación @Out puede recibir valores:
- required=true/false.
- scope=relacionado con el ámbito.
- value=relaciona con el nombre del contexto
lunes, 2 de junio de 2008
Web Services
Distintas aplicaciones de software desarrolladas en lenguajes de programación diferentes, y ejecutadas sobre cualquier plataforma, pueden utilizar los servicios web para intercambiar datos en redes de ordenadores como Internet. La interoperabilidad se consigue mediante la adopción de estándares abiertos.
Las organizaciones OASIS y W3C son los comités responsables de la arquitectura y reglamentación de los servicios Web. Para mejorar la interoperabilidad entre distintas implementaciones de servicios Web se ha creado el organismo WS-I, encargado de desarrollar diversos perfiles para definir de manera más exhaustiva estos estándares.
Desplegar un war en un Tomcat
El tomcat cuando arranca y ver un war,lo despliega y crea su carpeta correspondiente.
Miramos en la carpeta conf/Catalina/localhost del tomcat creamos un archivo xml con el mismo nombre que el de la aplicación y copiamos alli el context que viene en el server.xml de nuestra aplicación.
Ya podemos lanzar nuestro tomcat con la aplicación.
Nos vamos o desde consola o desde modo gráfico a la carpeta bin del tomcat y ejecutamos startup.bat en windows o startup.sh en linux.
martes, 27 de mayo de 2008
Inyectar un bean en otro bean con Annotations
@In(create=true)
AdminDireccionController adminDireccionController;
Ejemplo de otra forma de inyección:
@In(value = "#{adminDireccionController}")
private AdminDireccionController adminDireccionController;
Un caso práctico:
Cuando intente inyectar un bean en otro me daba un error:
ERROR org.jboss.seam.jsf.SeamPhaseListener.beforePhase(120) - uncaught exception
javax.el.ELException: javax.el.ELException: org.jboss.seam.NoConversationException: no long-running conversation for @Conversational bean: adminTerceroController
Tuve que poner en el controller1 que voy a inyectar la anotación @Begin en el primer método que utilizaba el otro controller2 ya que mi controler1 era de ámbito conversation para que se inicie la longrunnigconversation
lunes, 26 de mayo de 2008
Crear war desde consola de un proyecto Seam
Ponemos la siguiente instrucción: mvn clean package.
viernes, 23 de mayo de 2008
JNDI(Java Naming Directory Interface)
Identity
StringBuffer
Mediante el método append() puedes añadir caracteres en la cadena que tengamos.
Ejmplo:
StringBuffer sb = new StringBuffer("Aprendiendo");
sb.insert(12, "Java ");
System.out.println(sb.toString());
Salida. Aprendiendo Java
Otro método que utiliza es el setCharAt(), que selecciona un carácter en la posición especificada del StringBuffer. setCharAt() es útil cuando se reutiliza un StringBuffer.
lunes, 19 de mayo de 2008
Enum
Debido a que son constantes, los nombres de un tipo enum de los campos son en mayúsculas.
Ejemplo:
public class Card {
public enum Rank { DEUCE, THREE, FOUR, FIVE, SIX,
SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING, ACE }
public enum Suit { CLUBS, DIAMONDS, HEARTS, SPADES }
private final Rank rank;
private final Suit suit;
private Card(Rank rank, Suit suit) {
this.rank = rank;
this.suit = suit;
}
public Rank rank() { return rank; }
public Suit suit() { return suit; }
public String toString() { return rank + " of " + suit; }
private static final List
// Initialize prototype deck
static {
for (Suit suit : Suit.values())
for (Rank rank : Rank.values())
protoDeck.add(new Card(rank, suit));
}
public static ArrayList
return new ArrayList
}
}
lunes, 12 de mayo de 2008
Ordenar un HashMap
Hay varias maneras para ellos,yo he visto más fácil esta que voy a explicar.
Para ello vamos a utilizar el Collection.sort
Voy e poner el caso mio para explicarlo:
Tenemos una lista creada --> operacionesList que es la que vamos a ordenar.
OperacionesComparator es la clase que voy a utilizar para ordenar, esta contiene
public class OperacionesComparator implements Comparator {
public int compare(Object obj1, Object obj2) {
SelectItem p1 = (SelectItem) obj1;
SelectItem p2 = (SelectItem) obj2;
return p1.getLabel().compareTo(p2.getLabel()); } }
Mi lista antes creada es de tipo SelecItem y comparamos por su label,que es lo que se va a mostrar.
Despues de rellenar la lista ponemos la instruccion siguiente y se ordena.
Collections.sort(operacionesList,new OperacionesComparator());
Este enlace esxplica todo si o que queremos ordenar son otros tipos de listas.http://java.sun.com/j2se/1.5.0/docs/api/java/util/Collections.html
viernes, 9 de mayo de 2008
OAS
jueves, 8 de mayo de 2008
martes, 6 de mayo de 2008
BeanUtils
getter y setter ni podemos llamarlos.
Es por eso que existen unas APIs que se llaman: Reflection y Introspection, que son bastante complicadas de usar, pero los componentes BeanUtils proveen unos envoltorios de facil uso para poder
utilizar estas dos habilidades sin problemas.
Reflexión e Introespección
Pues bien el api de reflexión nos permite a través de la clase Class (ej: miCoche.getClass()) obtener información sobre los métodos y propiedades y anotaciones de dicha clase. A eso se refieren con introspección (se pregunta a si mismo). Pues como os comento, a través de la clase Class (Coche.class o miCoche.getClass()) podemos saber la "metainformación" de la clase en cuestión y por lo tanto de todos los objetos que tengamos de esa clase.
¿para qué sirve esto?...
pues hay situaciones en nuestro programa en tiempo de ejecución (es decir cuando el usuario lo utiliza/ejecuta) en las que nuestros objetos pueden recibir objetos de servicios externos, estos objetos quizá sean de la clase Object y entonces ¿qué hacemos o podemos hacer con un objeto de la clase Object?, pues podemos utilizar la reflexión para saber que propiedades tiene o simplemente que clase o que interfaces, o anotaciones, o metodos (creo que la info que te da es de tipo pública nunca private)....
Introespección-->definición de la palabra para que podamos entender mejor esto :"Observación interior de los propios actos o estados de ánimo o de conciencia".
Los javaBeans estan hechos para existir dentro de un Contenedor de Beans. Son clases Java. El contenedor puede ver las propiedades de un bean, pero cómo las ve?como vería las propiedades de un bean que has creado tú? pues lo que hace es "introspeccionar", "ver el interior" de la clase Bean para buscar los métodos y propiedades que lo conforman,por ejemplo si tienes los métodos getX y setX, el contenedor deducirá que hay una propiedad en el bean llamada X.
Aqui viene mas detallada:
http://www.javahispano.org
Tiempo de compilación y de ejecución
Tiempo de Compilación-->es el intervalo de tiempo en el que un compilador compila código escrito en un lenguaje de programación a una forma de código ejecutable por una máquina.
Tiempo de Ejecución-->intervalo de tiempo en el que un programa se ejecuta en un sistema operativo. El período comienza cuando el programa es llevado a la memoria primaria y comienzan a ejecutarse sus instrucciones. El período finaliza cuando el programa envía la señal de término (normal o anormal) al sistema operativo.
Suele decirse también que un programa se encuentra "corriendo" mientras está siendo ejecutado.
En tiempo de ejecución pueden darse errores inesperados llamados runtime errors, que pueden ser controlados a través de mecanismos llamados manejos de excepciones.
StringUtils
if (solicitanteProvincia.equals(nombreProvincia)){
Lo recomendable es hacerlo con:
if(StringUtils.equals(solicitanteProvincia, nombreProvincia)){
Con esto te aseguras de que si algo es null la comparación no Explote.
Api:
http://www.euskadi.net/r33-2732/eu/contenidos/informacion/mipago/es_10741/adjuntos/javadoc/r01f/com/ejie/r01f/util/StringUtils.html
Tutorial Ajax4jsf
http://www.exadel.com/tutorial/jsf/jsftags-guide.html -->esta en español y es más reducido
http://www.jboss.org/file-access/default/members/jbossrichfaces/freezone/docs/tlddoc/index.html
http://www.ribosomatic.com/articulos/tecnicas-ajax-mas-buscadas-50-ejemplos-y-tutoriales
lunes, 5 de mayo de 2008
Decorator
Supongamos que tenemos una clase existente Ventana y queremos añadirle funcionalidad para que muestre un borde alrededor. Podemos crear una subclase VentanaConBorde que herede de Ventana.
Hasta aquí todo bien, pero supongamos que surge la necesidad de crear una ventana que muestre un pequeño botón de ayuda con un signo de interrogación (?) en su parte superior. Entonces tenemos las siguientes opciones:
- Crear otra subclase de Ventana: VentanaConBotónDeAyuda.
Problema: No cubre la necesidad de tener ventanas con bordes y botón de ayuda a la vez.
- Crear una subclase de VentanaConBorde: VentanaConBordeYBotonDeAyuda.
Problema: No tenemos una ventana con botón de ayuda y sin borde.
- Crear clases para todas las combinaciones posibles de funcionalidades.
Problema: Con este ejemplo tendríamos cuatro clases: Ventana, VentanaConBorde, VentanaConBotonDeAyuda y VentanaConBordeYBotonDeAyuda; con tres funcionalidades tendríamos ocho clases y con cuatro, ¡dieciséis!
El patrón Decorator soluciona este problema de una manera mucho más sencilla y extensible.
Se crea a partir de Ventana la subclase abstracta VentanaDecorator y, heredando de ella, BordeDecorator y BotonDeAyudaDecorator. VentanaDecorator encapsula el comportamiento de Ventana y utiliza composición recursiva para que sea posible añadir tantas "capas" de Decorators como se desee. Podemos crear tantos Decorators como queramos heredando de VentanaDecoratorEjemplo:
abstract class Componente
{
abstract public void Operacion();
}
class ComponenteConcreto extends Componente
{
public void Operacion()
{
System.out.println("ConcreteComponent.Operation()");
}
}
abstract class Decorator extends Componente
{
protected Componente componente;
public void SetComponente(Componente component)
{
this.componente = component;
}
public void Operacion()
{
if (componente != null) componente.Operacion();
}
}
class DecoradorConcretoA extends Decorator
{
private String estadoAgregado;
public void Operacion()
{
super.Operacion();
estadoAgregado = "Nuevo estado";
System.out.println("DecoradorConcretoA.Operacion()");
}
}
class DecoradorConcretoB extends Decorator
{
public void Operacion()
{
super.Operacion();
AgregarComportamiento();
System.out.println("DecoradorConcretoB.Operacion()");
}
void AgregarComportamiento()
{
System.out.println("comportamiento añadido B");
}
}
public class Cliente
{
public static void main(String[] args)
{
ComponenteConcreto c = new ComponenteConcreto();
DecoradorConcretoA d1 = new DecoradorConcretoA();
DecoradorConcretoB d2 = new DecoradorConcretoB();
d1.SetComponente(c);
d2.SetComponente(d1);
d2.Operacion();
}
}
Converter
Los converters se aplican en el momento en el que nuestra aplicación recibe valores o devuelve valores. Cuando recibimos una solicitud jsf, una de las fases de dicha recepción de la solicitud está la de aplicar converters en función del componente UI, ya que los converters son una propiedad de los componentes. Y por otro lado necesitamos convertir a String los objetos de nuestra aplicación cuando dichos objetos se pintan en la página web correspondiente, es decir no queremos que nos salga el id de objeto ej 1312341...@es.cea.academia.Alumno, sino "matricula:2345"
La libreria es javax.faces.convert.Converter;
Métodos que utiliza:
--public Object getAsObject(FacesContext context,UIComponent component,String value) throws ConverterException-->Convertir el valor, que está asociada con la UIComponent especificado, en un modelo de datos Object de que sea apropiado.
--public String getAsString(FacesContext context,UIComponent component,Object value) throws ConverterException-->convierte el valor que esta asociado al UIComponent en string que es adecuada para ser incluido en la respuesta generada durante la fase de respuesta.
Cuando se crea el converter hay que decirle a la aplicación que existe,eso se hacen el en face-config.xml
Un ejemplo para verlo más claro:
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
public class ProvinciaConverter implements Converter {
public Object getAsObject(FacesContext arg0, UIComponent arg1, String arg2) {
// TODO Auto-generated method stub
return null;
}
public String getAsString(FacesContext arg0, UIComponent arg1, Object arg2) {
return ProvinciasUtil.getInstance().getProvincia((Long)arg2);
}
}
En mi proyecto tengo un archivo jsf que en un column tiene la propiedad converter="ProvinciaConverter"
Este llama a la clase arriba descrita que lo que hace es recibir un long y devolver el nombre asociado a ese numero,es decir un string.(el nombre se recupera en la clase ProvinciasUtil,solo he puesto este trozo de código)
martes, 29 de abril de 2008
JUnit y TestNG
- JUnit-->hasta hace poco se utilizaba el JUnit. JUnit tiene DBUnit para pruebas de integración con base de datos,existe HttpUnit para probar que la página que verá el usuario contiene lo que debe contener, es decir formulario, mensaje ....JUnit en sus últimas versiones trabaja con anotaciones pero antes funcionaba por herencia.Se utiliza para pruebas mas simples.
- TestNG -->pruebas unitarias en esteroide , tiene todo lo que tiene Junit 4 y más,está basado en Annotations.Maneja los mismos conceptos. Tiene Clases que corren las pruebas y arman reportes. Es mucho más sofisticado. Las pruebas pueden depender unas de otras. Es útil para otro tipo de pruebas más complejas.
Los dos proporcionan plugins para integrar con el IDE preferido es decir: eclipse, netBeans, intellijIdea ....
lunes, 28 de abril de 2008
Leer de fichero y guardar en un HashMap
try {
FileReader fr = new FileReader("/temp/provincias.txt");
BufferedReader bf = new BufferedReader(fr);
String linea;
while ((linea = bf.readLine()) != null) {
String[] cadenas = linea.split("\t");
provincias.put(cadenas[0], cadenas[1]);
}
fr.close();
System.out.println("Provincias importadas correctamente");
} catch (FileNotFoundException e) {
System.out.println("Fichero no encontrado");
e.printStackTrace();
} catch (IOException e) {
System.out.println("Error de E/S");
e.printStackTrace();
}
}
He tenido un pequeño problema al leer de esta forma los fichero pues los carateres como la ñ o los acentos nolos leia y metia unos simbolos raros,como un combox con una iterrogracion.
Para arreglar este problema he cambiado la forma de leer los ficheros
FileInputStream fis = new FileInputStream("/temp/provincias.txt");
InputStreamReader is = new InputStreamReader(fis, "ISO-8859-1");
BufferedReader bf = new BufferedReader(is);
Asi le indico el tipo de encoding.
Estructura HashMap
Si añadimos un nuevo elemento clave/valor cuando la clave ya existe, se sobrescribe el valor almacenado anteriormente.
La estructura a listar que utilizamos como mapa es un HashMap. Lo primero que tenemos que hacer es crear el mapa y añadirle elementos:
Map
mapa.put("String","String");
Si intentamos añadir otro elemento con una clave ya existente, sobreescribe el valor. Ya que no puede haber elementos duplicados.
Para recorrerlo nos apoyaremos sobre un Iterator que será el puntero encargado en recorrer los elementos del mapa. Obtendremos un iterador sobre la estructura invocando los métodos .entrySet() e .iterator(). Usar iteradores permite separar la lógica de la clase de la lógica de la iteración. Los iteradores tienen un comportamiento similar a los enumerados.
Para mover el iterador utilizaremos el método .next() y si queremos comprobar que el iterador ha llegado al final de la estructura tenemos el método .hasNext()
Iterator it = mapa.entrySet().iterator();
while (it.hasNext()) {
Map.Entry e = (Map.Entry)it.next();
System.out.println(e.getKey() + " " + e.getValue());
}
Si queremos sacar un sólo dato,ponemos mapa.get(key que contiene ese valor);
NOTA:
El HashMap espera siempre un Object,lo digo porque me cree uno Map que esperaba 2 string le meti un int y no me daba error,porque espera un object,y ponga lo que ponga no da error,se lo traga,y me volvi loca,buscando que era lo que fallaba. Por qué no me imprimía el dato.Cosas tontas.
AJAX
No es un lenguaje de programación, como creen algunas personas.
Antes de Ajax estaba el Scripting Remoto.
Las tecnologías que forman AJAX son:
- Html-->las páginas web que son parte de la aplicacion web Ajax se crean con html y css,tambien se puede utilizar Xhtml.
- DOM-->esto perimite acceder a los elementos de la web(tabla,formularios) ,mediante javascript permite tratar los elementos como objetos con sus métodos y propiedades.
- Xml-->las transmisiones entre el cliente y el servidor se haran de forma asincrona mediante xml.Aunque tambien permite el intercambio con texto plano , pre-formateado...
jueves, 17 de abril de 2008
Cómo sabe Hibernate que algo ha cambiado
Cada vez que se cambia algo la version se incrementa en 1.
Asi se sabe cuando se ha cambiado los datos y que 2 usuarios no puedan cambiar los datos a la vez.
Más sobre Hibernate
El tiempo de arranque dependerá del numero de clases persistentes que haya en la aplicación.
Una vez arrancado,se crea un objeto de session que es el que inyectamos en nuestros componentes persistentes a través de la etiqueta @In del EntityManager.
Para que los datos que la session ha creado,eliminado,modificado quede bien reflejado y guardado en la base de datos se tiene que hacer dentro de una transacion hay que abrirla mediante el método session.beginTransaction(); y se cerrará con la sentencia tx.commit();.
Mientras no se cierre la transacción, ésta se considera "caliente" y el programador podra realizar cambios en ella sin preocuparse de la Base de Datos, ya que hibernate las modificará y actualizará automáticamente.
Bean con estado y sin estado
Un Bean sin estado si no tiene estado solo puede dar servicio a un solo usuario.
martes, 15 de abril de 2008
lunes, 14 de abril de 2008
JDeveloper + JSF Configuración del faces-config.xml
Con esta ventanita podemos crearnos los beans o las reglas de navegación entre páginas entre otras cosas.
En el caso de los beans tenemos la siguiente ventana:
Le ponemos el nombre que queramos ,elegimos la clase que va a corresponder ese beans y el ambito que va a tener que puede ser:
- Application
- Session
- Request
Cuando queramos inyectar un bean en otro(recordar siempre la dirección de inyecciones de beans que escribi entre post)
Y desde la interface gráfica se pincha en el bean que le queremos inyectar otro beans,le damos a Managed Properties /New,ponemos el nombre de la propieda y la clase,más abajo aparece Managed Property y le ponemos el nombre del bean a inyectar con #{nombre del bean}
Declaración de etiquetas jsp
Las etiquetas JSP son poderosas y encapsulan tareas que serían difíciles o llevarián mucho tiempo de programar.Los lenguajes de script que tenemos disponibles dependen del motor JSP que estemos usando. Con la implementación JSP de Sun, debemos usar el lenguaje Java como lenguaje de script, pero otros motores de JSP de terceras partes podrían incluir soporte para otros lenguajes.
Las etiquetas JSP tienen diferentes categorías:
Comentarios: <%-- mi comentario --%>
Declaraciones: se utiliza para declarar variables de tipos simples,objetos y métodos. .Ejemplo: <%! int contador = 0; %>. La sintaxis es puro Java y se continua con la vieja regla de "declarar antes de usar".
Expresiones: al procesar la página la salida es el valor de la expresión delimitada por <%= %>, por ejemplo podemos insertar la expresión dentro de una línea HTML típica
& ltp>La cuenta es: <%=contador%> <p>El cuadrado de la cuenta es: <%=cuadrado( contador )%> <%-- Llamada a método --%>
Scriptlets: un conjunto de instrucciones Java. Formato: <% scriptlet %>. Ejemplo:
<%! int base = 5, altura = 7 ; %> <% base * altura / 2.0; new java.util.Date(); %> <BR> Hola HTML <% System.out.println( "de regreso a scriplets" ); base + altura; %>
Directivas: su sintaxis general es <%@ directiva {atributo ="valor"} %> dónde la directiva debe tener al menos un atributo:
Directivas page: en función del atributo utilizado sirven para la configuración general: importar clases, definir tipo MIME, etc.
<%@ page import="paquete.clase" %> <%@ page contentType="tipo MIME" %>
Para contentType los valores por defecto son contentType="text/html; charset=iso-8859-1".
Algunos atributos:
import="package.*,clase.class" Sirve para importar paquetes y clases.
session="true|false" Por defecto es true. Indica si mantiene atributos de sesión para la página.
isThreadSafe="true|false" Por defecto es true. Si es true cada petición corre en un hilo y por tanto el procesador maneja las peticiones de forma asíncrona ("simultáneamente"). Con false se gestionan las peticiones en un hilo (una por una).
info="text" Información de la página a la que se puede acceder a través del método Servlet.getServletInfo()
errorPage="pagina_error". Página que manejará las excepciones.
isErrorPage="true|false". Indica si es una página que manejará errores.
Ejemplos:
<%@ page import=”com.myco.*” buffer=”26k” errorPage=”/oops.jsp”%>
Para reenviar una excepción a una página tiene: <%@ page errorPage="07_errorPage.jsp"%> En la página de error (07_errorPage.jsp) tenemos una forma de capturar el error por medio del objeto implícito "exception":
<%@ page isErrorPage="true" %>
<html>
<head><title>Ejemplo de errorPage
<body>
<h1>Se ha producido un error
<p>Error: <%= exception %>
Esta página capta las excepciones. No capta los errores debidos a fallos de enlace (URL).
Directivas include: se inserta un fichero en el lugar de la directiva. Matiz: se inserta el fichero, no su valor o resultado. Utiles, entre otras cosas, para insertar código HTML o JSP que se repite. La URL debe ser relativa. Ejemplo:
<%@ include file="cabecera.html" %>
Directivas Taglib: indica la referencia a la librería de etiquetas definidas por el programador (etiquetas personalizadas). El motor JSP utiliza esta librería para saber como interpretar las etiquetas personalizadas de la página JSP.Ejemplo:
<%@ taglib uri="URI_de_librería" prefix="prefijo_de_etiquetas" %>
URI es el descriptor único de la librería. No tiene valor por defecto. Si no se especifica aparece una excepción. El prefijo es el prefijo en la expresión prefijo:etiqueta, que sirve para definir la etiqueta personalizada. Cuando el motor de JSP se encuentra en la página con la expresión prefijo_de_etiquetas:etiqueta, entonces se dirige a la librería señalada en URI para interpretar la etiqueta. Las etiquetas personalizadas son importantes en el manejo de JSP.
Acciones: realizan una tarea en el momento en que se solicita la página. Sirven para acceder a beans, etc. La acción de inclusión, a diferencia de la directiva de inclusión, implica la sustitución por el valor o resultado del archivo en el momento de la petición. Ejemplo:
<jsp:include page="también una URL relativa" flush="true"/>
Otra acción es jsp:forward, que tiene el mismo comportamiento que javax.servlet.RequestDispatcher. Su sintaxis admite (o no) parámetros. La ejecución de la página invocante se detiene para resolver el forward. Sintaxis:
<jsp:forward page="también una URL relativa">
<jsp:param name="nombre_parametro" value="valor" />
domingo, 13 de abril de 2008
Bijection
Para entender el funcionamiento básico de JBoss Seam debes familiarizarte con dos conceptos: Contexto y Componente.
Un componente es un objeto con estado (normalmente stateful session beans). Una instancia de un componente vive en un contexto y se le asigna un nombre en dicho contexto.
Para asociar la instancia de un componente al nombre de dicho componente en un contexto Seam proporciona el mecanismo de Bijection
Bijection = Injection + Outjection
El mecanismo de injection permite a un componente A obtener de un contexto una referencia a una
instancia de un componente B, haciendo que el contenedor de aplicaciones ”inyecte” el componente B en una variable del componente A.
El mecanismo de outjection permite que un componente B esté disponible en un contexto para poder ser inyectado en un componente A.
Es decir, mediante outjection se toma una instancia de un componente y se deposita en un contexto
y mediante injection se toma una instancia de un componente de un contexto y se asocia a una
variable de otro componente.
A diferencia del mecanismo de Injection, el mecanismo de Bijection es:
- contextual: Es usada para asociar componentes con estado desde diferentes contextos.
- bidireccional: Los componentes pueden ser depositados en el contexto o tomados de él.
- dinámico: Como los valores de las variables de los contextos cambian con el tiempo y los
componentes tienen un estado definido, la bijection sucede cada vez que el componente es
invocado.
Las conversaciones con SEAM
Se puede entender por una conversación en Seam algo muy parecido de lo que hacemos cuando conversamos entre personas.
Existe un lugar (AplicationContext), un tiempo (SessionContext) y después una serie de objetos implicados en la conversación. Entre los objetos implicados en la conversación se encuentra el usuario, que participa a través de eventos, de tipo:
- JSF
- jBMP
- Seam page actions
- Seam component-drive events
Las clases implicadas son:
org.jboss.seam.core.ConversationEntry
org.jboss.seam.core.ConversationList
org.jboss.seam.core.Manager
Estos datos los he cogido del blog http://enjava.blogspot.com,que es de mi profesor Juan Antonio,un maestro en esto del j2ee.(que pelota no?)
Gracias por compartir tus conocimientos!!!!!
jueves, 3 de abril de 2008
Annotations (Seguimo utilizando JBoss + Seam-gen)
- @Entity en la definición clase .(se utiliza para las transaciones)
- @Id en la definición de campo que hará de identificador.(se utiliza para las transaciones)
- @Column para decir que el campo /propieda es persistente aunque sino lo ponemos por el mero hecho de estar en una entidad persisten se considera.
- @Trasient,si queremos que un componente de la clase no sea persistente se le pone la etiqueta .
- @ManyToMany(mappedBy="nombre clases relacionar"),son para implementar las relacion mucho a muchos
- OneToMany(mappedBy="nombre clases relacionar"),. son para las relaciones uno a mucho.
- @OrderBy("nombre del campo a ordenar").
- @Scope(CONVERSATION) esto es para decir que el ámbito es de tipo conversacional .esto es una solicitud en los términos de J2EE.Si se coloca un objeto en el período de sesiones los usuarios que estará disponible en todas las páginas afectadas, el usuario formula.
JBOSS + Seam-gen Empezando nuevos proyectos
Dentro de la carpeta jboss-seam/seam-gen/tenemos un archivo llamado build.xml ,lo cogemos y lo arrastramos a la ventana Ant(pluging de eclipse para lanzar tareas).
Lanzamos la tarea seam-gen>reset para resetear la información del archivo seam-gen/build.properties que se utilizará en la generación de la aplicación nueva.
Lanzamos la tarea seam-gen>setup para configurar la información del archivo seam-gen/build.properties:
Nos irá saliendo una ventanitas que tendremos que meter la siguiente información:
- Directorio de workspace: nuestro directorio desde c: al workspace.
- Directorio de jboss: nuestro directorio desde c: al servidor jboss.
- Nombre del proyecto.
- Richfaces skin:blueSky (este sale por defecto).
- Ear o war project: ear .
- El package de nuestra aplicación.
- El package de nuestros EJBs.
- El package de nuestros tests.
- Tipo de Base de datos.
- Hibernate dialect: org.hibernate.dialect.MySQLDialect .
- Path a la libreria de mysql: nuestro directorio desde c: al jar de mysql: mysql-connector-java-5.0.3-bin.jar
- Jdbc driver: com.mysql.jdbc.Driver .
- Jdbc url: jdbc:mysql://localhost/delicious?createDatabaseIfNotExist=true
user database,clave database,database name. - Are you working with tables that already exist ...:n .
- Do you want to drop and recreate the database ...: y .
- Enter your icefaces directory: dejar este campo vacio.
Ya tenemos creado las propiedades de nuesta proyecto nuevo
Lanzamos la tarea seam-gen>new-project para generar el proyecto nuevo en el workspace indicado anteriormente y lo abrimos con eclipse.File>new project>java project>create project from existing source>seleccionamos nuestro proyecto en el workspace y le ponemos de nombre al proyecto.
Localizamos el archivo de ant:build.xml de nuestro nuevo proyecto y lo arrastramos a la ventanita de Ant, y a continuación lanzamos la tarea deploy.
Arrancamos nuestro jboss a través de la ventanita servers de nuestro eclipse. Seleccionamos y click en start y cuando acabe de arrancar la aplicación podemos verla en el navegador en la dirección: http://localhost:8080/nombre proyecto dandole al deploy del Ant de nuestro proyecto o al explode(esto esta explicado la diferencia en otro apartado)
Para crearnos las clases(entidades) utilizamos new-entity del archivo build.xml de seam-gen y se nos aparecera 3 ventanitas :
- enter the entity class name: nombre de la entidad a crear.
- enter the master page name: la pagina que va a hacer el listado de objetos de esa entidad
- enter the detail page name: detalle de esos objetos.
Enlas clase que se crean se ven los import de las etiquetas del api de persistencia. Así como un validador de HIbernate: org.hibernate.validator.Length .
Links interesantes de Seam-gem
¿qué es seam? http://seamcity.madeinxpain.com/archives/31
biyection: http://seamcity.madeinxpain.com/archives/28
conversaciones: http://seamcity.madeinxpain.com/archives/29
configuración de seam: http://seamcity.madeinxpain.com/archives/30
programación orientada a aspectos: http://ejemplos-seam.blogspot.com/2007/07/crear-estadisticas-en-seam-con.html
martes, 1 de abril de 2008
JSF -->incluir una página en otra
JDeveloper + JSF
Al abrir el programa jdeveloper, en la parte izquiera tenemos una ventanita donde aparece la palabra Applications.
Pinchamos con el botón derecho y elegimos la opción New Application y se nos abrirá una ventana para poner el nombre,el package,la ruta del directorio de la aplicación y una pestaña llamada Application Template donde elegiremos el tipo de plantilla a utilizar en la aplicación,en este caso elegiremos la opción JSF|EJB.
Al darle aceptar se nos creará la aplicación con JSF con la siguiente estructura:
El archivo faces-config.xml es el archivo de configuración y en la carpeta lib contiene 2 archivos jar que serán los que contengan las clases usadas por los JSF.
Para crear una página JSf pinchamos con el botón dereco sobre ViewController en la opción New elegimos JSF/JSF JSP y al darle aceptar se nos abrirá un asistente paras la configuración de la página.
En una de las ventanas nos pide el nombre de la página y abajo tenemos dos opciones una para crear un jsp simple y otro para crear un jspx(utiliza xml para la representación de los jsp),elegimos este último.
La siguiente pantalla podemos crearnos los beans automaticamente o no, al pulsar siguiente nos abre otra pantalla para elegir librerias que queremos o necesitemos usar para este proyecto.
Y la siguente pantalla es para configurar los stylos de la página.
Ya tenemos nuestra primera página creada!!!!!!!!!