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)