martes, 27 de mayo de 2008

Tutorial Facelets

https://facelets.dev.java.net/nonav/docs/dev/docbook.html#template

RichFaces

Inyectar un bean en otro bean con Annotations

Ejemplo de una inyección

@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

Abrimos una consola y nos vamos a dentro de la carpeta donde esta nuestro proyecto.
Ponemos la siguiente instrucción: mvn clean package.

Escribir ficheros

viernes, 23 de mayo de 2008

JNDI(Java Naming Directory Interface)

Es una especificación que permite localizar información en distintos directorios distribuidos (como NDS de Novell), directorios LDAP (como OpenLDAP) o servicios CORBA "(COS)Corba Object Service".Debido a la importancia que tienen los servicios antes mencionados en sistemas empresariales, JNDI es una herramienta que cobrará gran importancia en este tipo de desarrollos

Identity

El componente org.jboss.seam.security.Identity tiene las anotaciones necesarias para ser un componente pre-built, es decir un componente que siempre lo tendrás disponible con el framework de Seam cuando arranques tu aplicación, de hecho se ve la inicialización en consola. Se puede apreciar http://www.redhat.com/docs/manuals/jboss/jboss-eap-4.3/doc/seam/api/org/jboss/seam/security/Identity.html que es un componente de session y que representa la identidad del usuario este viene a concretarse en nuestra aplicación a través del nombreUsuario y clave (más o menos aunque éste se lo han currado con algunas propiedades más). Básicamente se utiliza para utilizarlo en el formulario del login que una vez que se hace click en el boton se llama al componente Authenticator que lleva inyectado el Identity. En dicho método de registro lo más importante es aplicar rol (o roles de usuario ) al componente identity, y en función de dichos roles nuestra aplicación (y sus componentes) permitirán o no ciertas acciones de usuario (una vez inyectado el componente identity en el componente correspondiente que necesita hacer la validación de usuario y rol)

StringBuffer

StringBuffer, se utiliza cuando se quiere manipular el contenido de una cadena.
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

Un tipo enum es un tipo cuyos campos consisten en un conjunto fijo de constantes. Los ejemplos más comunes incluyen direcciones (valores de Norte, Sur, Este y Oeste) y los días de la semana.

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 protoDeck = new ArrayList();

// Initialize prototype deck
static {
for (Suit suit : Suit.values())
for (Rank rank : Rank.values())
protoDeck.add(new Card(rank, suit));
}

public static ArrayList newDeck() {
return new ArrayList(protoDeck); // Return copy of prototype deck
}
}

lunes, 12 de mayo de 2008

Ordenar un HashMap

Un HashMap no tiene ningún método para ordenar sus datos.
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

Oracle Application Server,un componente clave de Oracle Fusion Middleware, ofrece la solución más completa del sector para desarrollar, integrar e implementar las aplicaciones, portales y servicios Web de su empresa. Basado en un poderoso servidor J2EE escalable, Oracle Application Server ofrece implementación de aplicaciones líderes, integración de negocios y el mejor software para portales. Oracle Application Server es la única plataforma diseñada para grid computing (inglés), así como soporte total del ciclo de vida de la Arquitectura Orientada a Servicios (SOA).

jueves, 8 de mayo de 2008

¿Tomcat o Jboss?

martes, 6 de mayo de 2008

BeanUtils

Cuando se quiere acceder directamente a los metodos de los beans, se suelen usar los correspondientes metodos getXXX o setXXX. Sin embargo,hay casos en lo que se necesita acceder dinamicamente a las propiedades del objeto Java y no tenemos conocimiento de los metodos
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

Reflexión-->si partimos de la idea de que en java es un lenguaje orientado a objetos, se supone que los objetos son de una clase. Es decir que si tengo un objeto/variable miCoche que es de tipo Coche, pues entonces sabemos que es de la clase Coche. (ya sé que es evidente pero empezamos despacito...)
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/contenidos/es/introduccrion_al_api_reflection_reflexrion_de_ja/;jsessionid=8ACC346B5864053D9AC0C8CBBCA58062

Tiempo de compilación y de ejecución

Voy a explicar el tiempo de compilación y el tiempo de ejecución pues he visto que hay gente que no saben lo que es,asi les puede quedar muy clarito.

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

Cuando hay que comparar dos String:

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 Hibernate

http://www.visualbuilder.com/java/hibernate/tutorial/

Tutorial Ajax4jsf

http://www.jboss.org/jbossajax4jsf/docs/devguide/en/html/index.html

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-buEnlacescadas-50-ejemplos-y-tutoriales

Tutorial Seam

http://docs.jboss.com/seam/2.0.0.GA/reference/en/html/index.html

Tutorial JSF

http://www.exadel.com/tutorial/jsf/jsftags-guide.html

http://www.horstmann.com/corejsf/jsf-tags.html

http://www.jsftoolbox.com/documentation/facelets/10-TagReference/

lunes, 5 de mayo de 2008

Decorator

El patrón Decorator responde a la necesidad de añadir dinámicamente funcionalidad a un Objeto. Esto nos permite no tener que crear sucesivas clases que hereden de la primera incorporando la nueva funcionalidad, sino otras que la implementan y se asocian a la primera.

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 VentanaDecorator

Ejemplo:

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

Es un interfaz que extiende de Serializable que puede realizar conversiones de Object-a-String y String-a-Objeto utilizando la tecnología JSF, de ahí que uno de los parámetros que recibe el parámetro es el propio contexto de la aplicación web.
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)