jueves, 20 de agosto de 2009

Primer Controller en Grails

Creamos un proyecto grails con el comando grails create-app como sigue

grails create-app test

dando paso a la creación de archivos y directorios de grails

C:\proyGrails: grails create-app test
Welcome to Grails 1.2-M2 - http://grails.org/
Licensed under Apache Standard License 2.0
Grails home is set to: C:\Software\grails-1.2-M2

Base Directory: C:\proyGrails
Running script C:\Software\grails-1.2-M2\scripts\CreateApp_.groovy
Environment set to development
Application name not specified. Please enter:
test
[mkdir] Created dir: C:\proyGrails\test\src
[mkdir] Created dir: C:\proyGrails\test\src\java
[mkdir] Created dir: C:\proyGrails\test\src\groovy
[mkdir] Created dir: C:\proyGrails\test\grails-app
[mkdir] Created dir: C:\proyGrails\test\grails-app\controllers
[mkdir] Created dir: C:\proyGrails\test\grails-app\services
[mkdir] Created dir: C:\proyGrails\test\grails-app\domain
[mkdir] Created dir: C:\proyGrails\test\grails-app\taglib
[mkdir] Created dir: C:\proyGrails\test\grails-app\utils
[mkdir] Created dir: C:\proyGrails\test\grails-app\views
[mkdir] Created dir: C:\proyGrails\test\grails-app\views\layouts
[mkdir] Created dir: C:\proyGrails\test\grails-app\i18n
[mkdir] Created dir: C:\proyGrails\test\grails-app\conf
[mkdir] Created dir: C:\proyGrails\test\test
[mkdir] Created dir: C:\proyGrails\test\test\unit
[mkdir] Created dir: C:\proyGrails\test\test\integration
[mkdir] Created dir: C:\proyGrails\test\scripts
[mkdir] Created dir: C:\proyGrails\test\web-app
[mkdir] Created dir: C:\proyGrails\test\web-app\js
[mkdir] Created dir: C:\proyGrails\test\web-app\css
[mkdir] Created dir: C:\proyGrails\test\web-app\images
[mkdir] Created dir: C:\proyGrails\test\web-app\META-INF
[mkdir] Created dir: C:\proyGrails\test\lib
[mkdir] Created dir: C:\proyGrails\test\grails-app\conf\spring
[mkdir] Created dir: C:\proyGrails\test\grails-app\conf\hibernate
[propertyfile] Creating new property file: C:\proyGrails\test\application.properties
[copy] Copying 1 resource to C:\proyGrails\test
[unjar] Expanding: C:\proyGrails\test\grails-shared-files.jar into C:\proyGrails\test
[delete] Deleting: C:\proyGrails\test\grails-shared-files.jar
[copy] Copying 1 resource to C:\proyGrails\test
[unjar] Expanding: C:\proyGrails\test\grails-app-files.jar into C:\proyGrails\test
[delete] Deleting: C:\proyGrails\test\grails-app-files.jar
[move] Moving 1 file to C:\proyGrails\test
[move] Moving 1 file to C:\proyGrails\test
[move] Moving 1 file to C:\proyGrails\test
[move] Moving 1 file to C:\proyGrails\test
[move] Moving 1 file to C:\proyGrails\test
[move] Moving 1 file to C:\proyGrails\test
...
Found events script in plugin tomcat
Created Grails Application at C:\proyGrails/test

Después nos posicionamos dentro del proyecto recien creado

C:\proyGrails: cd test

Ahora iniciamos nuestra aplicación con el siguiente comando de grails run-app

C:\proyGrails\test: grails run-app
Welcome to Grails 1.2-M2 - http://grails.org/
Licensed under Apache Standard License 2.0
Grails home is set to: C:\Software\grails-1.2-M2

Base Directory: C:\proyGrails\test
Running script C:\Software\grails-1.2-M2\scripts\RunApp.groovy
Environment set to development
Running Grails application..
18/08/2009 04:52:43 PM org.apache.coyote.http11.Http11Protocol init
INFO: Initializing Coyote HTTP/1.1 on http-8080
18/08/2009 04:52:43 PM org.apache.catalina.core.StandardService start
INFO: Starting service Tomcat
18/08/2009 04:52:43 PM org.apache.catalina.core.StandardEngine start
INFO: Starting Servlet Engine: Apache Tomcat/6.0-snapshot
18/08/2009 04:52:43 PM org.apache.catalina.startup.ContextConfig defaultWebConfig
INFO: No default web.xml
18/08/2009 04:52:45 PM org.apache.catalina.core.ApplicationContext log
INFO: Initializing Spring root WebApplicationContext
Server running. Browse to http://localhost:8080/test

Con esto nuestra aplicación esta corriendo



Por default corre en el puerto 8080 si deseamos cambiarla por ejemplo al puerto 8181 escribimos

grails -Dserver.port 8181 run-app

Si se quiere cambiar el puerto de la aplicación de forma permanente se puede crear el archvo BuildConfig.groovy con la entrada

grails.server.port.http=9090 en la ruta %proyecto%\grails-app\conf

Ahora para crear un controller escribimos el siguiente comando dentro del proyecto

grails create-controller contr

Vemos que el comando se ejecuta de manera exitosa

C:\proyGrails\test>grails create-controller contr
Welcome to Grails 1.2-M2 - http://grails.org/
Licensed under Apache Standard License 2.0
Grails home is set to: C:\Software\grails-1.2-M2

Base Directory: C:\proyGrails\test
Running script C:\Software\grails-1.2-M2\scripts\CreateController.groovy
Environment set to development
Created Controller for Contr
[mkdir] Created dir: C:\proyGrails\test\grails-app\views\contr
Created Tests for Contr
C:\proyGrails\test>

Ahora solo refrescamos el navegador (Ctrl.+F5) y vemos el controller recien creado



Este es creado (como lo dice cuando se ejecuta el comando create-controller) en la ruta C:\proyGrails\test\grails-app\views\contr con el nombre de ContrController.groovy, como vemos grails crea el controller con la primera letra mayúscula y concatenandole Controller, lo editamos y escribimos lo siguiente

class ContrController {
def index = {
redirect (action:accion)
}

def accion = {
render "Desde controller ControlerController";
}
}

Para llamar accion escribimos en el navegador

http://localhost:8181/test/contr/accion
o
http://localhost:8181/test/contr/ (por default toma index y este es redireccionado a accion).



Suerte.

jueves, 13 de agosto de 2009

Instalacion OpenEJB en Windows

Descargamos los siguientes archivos

openejb-3.1.1.zip
openejb.war,
apache-tomcat-6.0.20.zip

En mi caso los archivos openejb-3.1.1.zip y apache-tomcat-6.0.20.zip los descomprimo en C:\Software, quedando las siguientes rutas

C:\Software\openejb-3.1.1
C:\Software\tomcat-6.0.20

Colocamos la aplicación openejb.war en C:\Software\tomcat-6.0.20\webapps y arrancamos tomcat



Abrirmos un navegador y tecleamos la siguiente ruta http://localhost:8080/openejb/



Dentro de la carpeta C:\Software\tomcat-6.0.20\conf\ se crea el archivo openejb.xml el cual lo editamos y agregamos un path para poner nuestros ejb y sean reconocidos por OpenEJB y agregamos el path <Deployments dir="C:\Software\openejb-3.1.1\apps\" /> como sigue



Con un jar de pruebas lo colocamos en la ruta definida anteriormente y reiniciamos tomcat

Con esto dentro entramos nuevemante a http://localhost:8080/openejb/ dentro de JNDI





Seleccionamos CalculadoraBeanLocal mostrandonos lo siguiente



Seleccionamos Invoke this EJB

Y nos muestra los metodos de este EJB



Seleccionamos un servicio para escribir sus parametros





Y lo invocamos, dándonos el siguiente resultado



Descargar CalculadoraEJB
calculadoraEJB.jar

Suerte.

martes, 11 de agosto de 2009

dependency-check en Spring

Uso de dependency-check en Spring

A continuacion se muestra el uso del atributo dependency-check con varios ejemplos

Librearias

commons-logging.jar
spring.jar

Listado de Interfaces

Interface Trabajo

package org.dracof.spring.depcheck;

public interface Trabajo {
}

Interface Domicilio

package org.dracof.spring.depcheck;

public interface Domicilio {
}

Interface Persona

package org.dracof.spring.depcheck;

import java.util.List;

public interface Persona {
public void setNombre(String nombre);

public void setApellido(String apellido);

public void setEdad(int edad);

public void setEstatura(float estatura);

public void setDomicilio(Domicilio domcilio);

public void setTrabajosList(List<Trabajo> trabajos);

public void setNombreAmigos (String[] amigos);
}

Implementaciones

Clase TrabajoImpl implementacion de Trabajo

package org.dracof.spring.depcheck.impl;

import org.dracof.spring.depcheck.Trabajo;

public class TrabajoImpl implements Trabajo {
//metodos e implementacion de trabajo
}

Clase DomicilioImpl implementacion de Domicilio

package org.dracof.spring.depcheck.impl;

import org.dracof.spring.depcheck.Domicilio;

public class DomicilioImpl implements Domicilio{
//metodos e implementacion de Domicilio
}

Clase PersonaImpl implementacion Persona

package org.dracof.spring.depcheck.impl;

import java.util.List;

import org.dracof.spring.depcheck.Domicilio;
import org.dracof.spring.depcheck.Persona;
import org.dracof.spring.depcheck.Trabajo;

public class PersonaImpl implements Persona {

private String nombre;
private String apellido;
private int edad;
private float estatura;
private Domicilio domicilio;
private List<Trabajo> trabajos;
private String[] amigos;

public void setApellido(String apellido) {
this.apellido = apellido;
}

public void setEdad(int edad) {
this.edad = edad;
}

public void setEstatura(float estatura) {
this.estatura = estatura;
}

public void setNombre(String nombre) {
this.nombre = nombre;
}

public void setDomicilio(Domicilio domcilio) {
this.domicilio = domcilio;
}

public void setTrabajosList(List<Trabajo> trabajos) {
this.trabajos = trabajos;
}

public void setNombreAmigos(String[] amigos) {
this.amigos = amigos;
}

public String toString() {
StringBuilder s = new StringBuilder();
s.append("Nombre: " + nombre);
s.append("; Apellido: "+ apellido);
s.append("; Edad: " + edad);
s.append("; Estatura: " + estatura);
s.append("; Amigos: ");
for(String amigo:amigos) {
s.append(amigo+",");
}
return s.toString();
}
}

Application Context (applicationContext.xml)

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">

<beans>
<bean id="persona1" class="org.dracof.spring.depcheck.impl.PersonaImpl" dependency-check="none"/>

<bean id="persona3" class="org.dracof.spring.depcheck.impl.PersonaImpl" dependency-check="simple">
<property name="nombre" value="Dracof"/>
<property name="apellido" value="ApellidoDracof"/>
<property name="edad" value="28"/>
<property name="estatura" value="1.70"/>
<property name="nombreAmigos" value="Juanito, Pepito, Dracofito"/>
</bean>

<bean id="persona4" class="org.dracof.spring.depcheck.impl.PersonaImpl" dependency-check="objects">
<property name="domicilio">
<bean class="org.dracof.spring.depcheck.impl.DomicilioImpl"/>
</property>
<property name="trabajosList">
<list>
<bean class="org.dracof.spring.depcheck.impl.TrabajoImpl"/>
<bean class="org.dracof.spring.depcheck.impl.TrabajoImpl"/>
</list>
</property>
</bean>

<bean id="persona5" class="org.dracof.spring.depcheck.impl.PersonaImpl" dependency-check="all">
<property name="nombre" value="Dracof"/>
<property name="apellido" value="ApellidoDracof"/>
<property name="edad" value="28"/>
<property name="estatura" value="1.70"/>
<property name="domicilio">
<bean class="org.dracof.spring.depcheck.impl.DomicilioImpl"/>
</property>
<property name="trabajosList">
<list>
<bean class="org.dracof.spring.depcheck.impl.TrabajoImpl"/>
<bean class="org.dracof.spring.depcheck.impl.TrabajoImpl"/>
</list>
</property>
<property name="nombreAmigos" value="Juanito, Pepito, Dracofito"/>
</bean>

</beans>

Como se muestra el atributo dependency-check acepta none, simple, objects y all, siendo por default none.

Por ejemplo si se borra el setter nombreAmigos de persona5 que tiene dependency-check="all", Spring lanza

Exception in thread "main" org.springframework.beans.factory.UnsatisfiedDependencyException:
Error creating bean with name 'persona5' defined in class path resource [applicationContext.xml]:
Unsatisfied dependency expressed through bean property 'nombreAmigos': Set this property value or disable dependency checking for this bean.

Referencia:
Checking for dependencies

Descargar Proyectito
DependencyCheck.zip

Suerte.

domingo, 9 de agosto de 2009

Instalando Grails en Windows

A continuacion se muestra como instalar Grails en Windows.

Descargar el archivo grails-bin-1.2-M1.zip

Descomprimirlo, en mi caso C:\Software\grails-1.2-M1

Crear la variable de entorno GRAILS_HOME en mi casi apuntanto a C:\Software\grails-1.2-M1.

Escribir en PATH la ruta C:\Software\grails-1.2-M1\bin

Abrir una ventana MSDOS y escribir el comando grails help

grails help
Invalid maximum heap size: -Xmx512m -XX:MaxPermSize=96m
Could not create the Java virtual machine.

En mi caso me marco el error anterior, la solucion es editar el archivo startGrails.bat ubicado en GRAILS_HOME\bin

C:\Software\grails-1.2-M1\bin\startGrails.bat

...
set JAVA_EXE=%JAVA_HOME%\bin\java.exe
set TOOLS_JAR=%JAVA_HOME%\lib\tools.jar

if "%JAVA_OPTS%" == "" set JAVA_OPTS=-Xmx512m -XX:MaxPermSize=96m
set JAVA_OPTS=%JAVA_OPTS% -Dprogram.name="%PROGNAME%"
set JAVA_OPTS=%JAVA_OPTS% -Dgrails.home="%GRAILS_HOME%"
...

modificar la linea
if "%JAVA_OPTS%" == "" set JAVA_OPTS="-Xmx512m -XX:MaxPermSize=96m"
por
if "%JAVA_OPTS%" == "" set JAVA_OPTS=-Xmx512m -XX:MaxPermSize=96m

Quitando las dobles comillas de "-Xmx512m -XX:MaxPermSize=96m"

probamos nuevamente desde una consola msdos con el siguiente comando


grails help

Welcome to Grails 1.2-M1 - http://grails.org/
Licensed under Apache Standard License 2.0
Grails home is set to: C:\Software\grails-1.2-M1

Suerte.

viernes, 7 de agosto de 2009

Tipos de Datos en Groovy

En groovy todo es un objeto, groovy soporta todos los tipos de datos de Java sin primitivos.


def numeroDef1 = 100;
def numeroDef2 = 2.334;
def cadenaDef1 = "hola";

println "numeroDef1: " + numeroDef1.getClass()
println "numeroDef2: " + numeroDef2.getClass()
println "cadenaDef1: " + cadenaDef1.getClass()

int numeroInt = 100
Integer numeroInteger = 200

println "numeroInt: " + numeroInt.getClass()
println "numeroInteger: " + numeroInteger.getClass()

float numerofloat = 3440.8f
Float numeroFloat = 300.30f

println "numerofloat: " + numerofloat.getClass()
println "numeroFloat: " + numeroFloat.getClass()

double numerodouble = 2312.33d
Double numeroDouble = 123.33d

println "numerodouble: " + numerodouble.getClass()
println "numeroDouble: " + numeroDouble.getClass()

short numeroshort = 22
Short numeroShort = 2211

println "numeroshort: " + numeroshort.getClass()
println "numeroShort: " + numeroShort.getClass()

Salida:

numeroDef1: class java.lang.Integer
numeroDef2: class java.math.BigDecimal
cadenaDef1: class java.lang.String
numeroInt: class java.lang.Integer
numeroInteger: class java.lang.Integer
numerofloat: class java.lang.Float
numeroFloat: class java.lang.Float
numerodouble: class java.lang.Double
numeroDouble: class java.lang.Double
numeroshort: class java.lang.Short
numeroShort: class java.lang.Short


Suerte

jueves, 6 de agosto de 2009

Uso de inyeccion por constructor y setters en Spring

Muestra el uso basico de inyeccion por constructor y por setter con Spring.

commons-logging.jar
spring.jar

Definicio de la interface DatosPersonales

package org.dracof.spring.inyeccion;

public interface DatosPersonales {

public void setNombre(String nombre);

public void setEdad(int edad);

public void setRfc(String rfc);
}

Implementacion de la interface DatosPersonales

package org.dracof.spring.inyeccion.impl;

import org.dracof.spring.inyeccion.DatosPersonales;

public class DatosPersonalesImpl implements DatosPersonales {

private String nombre;
private int edad;
private String rfc;

public DatosPersonalesImpl(){
}

public DatosPersonalesImpl(String nombre, int edad, String rfc){
this.nombre = nombre;
this.edad = edad;
this.rfc = rfc;
}

public void setEdad(int edad) {
this.edad = edad;
}

public void setNombre(String nombre) {
this.nombre = nombre;
}

public void setRfc(String rfc) {
this.rfc = rfc;
}

public String toString() {
StringBuilder cadena = new StringBuilder();
cadena.append("Nombre:").append( this.nombre );
cadena.append("; Edad: ").append( this.edad );
cadena.append("; RFC: ").append( this.rfc );
return cadena.toString();
}
}

Application Context

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">

<beans>
<!-- Inyeccion por setters -->
<bean id="datosPersonalesJuanito" class="org.dracof.spring.inyeccion.impl.DatosPersonalesImpl">
<property name="nombre" value="Juanito"/>
<property name="edad" value="33"/>
<property name="rfc" value="JAN32323212"/>
</bean>

<!-- Inyeccion por setters usando <value>-->
<bean id="datosPersonalesPepito" class="org.dracof.spring.inyeccion.impl.DatosPersonalesImpl">
<property name="nombre">
<value>Pepito</value>
</property>
<property name="edad">
<value>54</value>
</property>
<property name="rfc">
<value>PEP2145322</value>
</property>
</bean>

<!-- Inyeccion por constructor respetando orden de parametros -->
<bean id="datosPersonalesDracofito" class="org.dracof.spring.inyeccion.impl.DatosPersonalesImpl">
<constructor-arg value="Drascofito"/>
<constructor-arg value="28"/>
<constructor-arg value="DRA231234"/>
</bean>

<!-- Inyeccion por constructor indicando el orden de parametros con index -->
<bean id="datosPersonalesDracofito2" class="org.dracof.spring.inyeccion.impl.DatosPersonalesImpl">
<constructor-arg value="Drascofito" index="0"/>
<constructor-arg value="DRA231234" index="2"/>
<constructor-arg value="28" index="1"/>
</bean>

<!-- Inyeccion por constructor usando <value> -->
<bean id="datosPersonalesGordita" class="org.dracof.spring.inyeccion.impl.DatosPersonalesImpl">
<constructor-arg>
<value>Gordita</value>
</constructor-arg>
<constructor-arg>
<value>15</value>
</constructor-arg>
<constructor-arg>
<value>GOR544321</value>
</constructor-arg>
</bean>

<!-- Definicion de string para usarlo despues como ref -->
<bean id="nombreX" class="java.lang.String">
<constructor-arg value="Nombre Desconocido"/>
</bean>

<!-- Definicion de Integer para usarlo despues como ref -->
<bean id="edadX" class="java.lang.Integer">
<constructor-arg value="0"/>
</bean>

<!-- Definicion de string para usarlo despues como ref -->
<bean id="rfcX" class="java.lang.String">
<constructor-arg value="RFC Desconocido"/>
</bean>

<!-- Inyeccion por constructor usando referencias a otros beans definidos-->
<bean id="datosPersonalesDesconocido" class="org.dracof.spring.inyeccion.impl.DatosPersonalesImpl">
<constructor-arg ref="nombreX"/>
<constructor-arg ref="edadX"/>
<constructor-arg ref="rfcX"/>
</bean>
</beans>

Clase de pruebas

package org.dracof.spring.test;

import org.dracof.spring.inyeccion.DatosPersonales;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class DatosPersonalesPrueba {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

DatosPersonales datosJuanito = (DatosPersonales) context.getBean("datosPersonalesJuanito");
System.out.println( datosJuanito.toString() );

DatosPersonales datosPepito = (DatosPersonales) context.getBean("datosPersonalesPepito");
System.out.println( datosPepito.toString() );

DatosPersonales datosDracofito = (DatosPersonales) context.getBean("datosPersonalesDracofito");
System.out.println( datosDracofito.toString() );

DatosPersonales datosDracofito2 = (DatosPersonales) context.getBean("datosPersonalesDracofito2");
System.out.println( datosDracofito2.toString() );

DatosPersonales datosGordita = (DatosPersonales) context.getBean("datosPersonalesGordita");
System.out.println( datosGordita.toString() );

DatosPersonales datosDesconocido = (DatosPersonales) context.getBean("datosPersonalesDesconocido");
System.out.println( datosDesconocido.toString() );

}
}

Salida:

Nombre:Juanito; Edad: 33; RFC: JAN32323212
Nombre:Pepito; Edad: 54; RFC: PEP2145322
Nombre:Drascofito; Edad: 28; RFC: DRA231234
Nombre:Drascofito; Edad: 28; RFC: DRA231234
Nombre:Gordita; Edad: 15; RFC: GOR544321
Nombre:Nombre Desconocido; Edad: 0; RFC: RFC Desconocido

Descargar Proyectito
InyeccionSpring.zip

Suerte.

GString - Groovy

Muestra el uso de GString

class Persona {
def nombre
def edad
}

//def persona = new Persona(nombre:'dracof', edad:2)
def persona = new Persona()
persona.setNombre('dracof')
persona.setEdad(28)

println "Nombre de persona: ${persona.getNombre()}"; //<-- Uso de GString ${}
println "Edad de persona: ${persona.getEdad()}" //<-- Uso de GString ${}

variable='Esta es una variable'
println "Valor de variable: ${variable}" //<-- Uso de GString ${}
println 'Valor de variable: ${variable}' //<-OJO con la salida

Salida:

Nombre de persona: dracof
Edad de persona: 28
Valor de variable: Esta es una variable
Valor de variable: ${variable}

Suerte.

Numeros en Groovy

En groovy los numeros son objetos


numero1 = 5
numero2 = 10

println 'numero1 instanceof java.lang.Integer: ' + (numero1 instanceof java.lang.Integer)
println 'println numero1 instanceof Integer: ' + (numero1 instanceof Integer)
println 'numero1 instanceof java.lang.String: ' + (numero1 instanceof java.lang.String)
println 'numero1 instanceof java.lang.String: ' + numero1 instanceof java.lang.String //<- OJO con el resultado
println 'numero1+numero2 = ' + (numero1+numero2)
println 'usando numero2.intValue(): ' + (numero2.intValue())

def sumaNumeros = numero1.plus(numero2) //<- suma usando el metodo plus
println 'numero1.plus(numero2): ' + sumaNumeros

def restaNumeros = numero1.minus(numero2) //<- resta usando el metodo minus
println 'numero1.minus(numero2): ' + restaNumeros

Salida:

numero1 instanceof java.lang.Integer: true
println numero1 instanceof Integer: true
numero1 instanceof java.lang.String: false
true
numero1+numero2 = 15
usando numero2.intValue(): 10
numero1.plus(numero2): 15
numero1.minus(numero2): -5

Suerte

Uso de Scope Basico en Spring

Muestra el uso del scope singleton y prototype en spring

Librerias

spring.jar
commons-logging.jar


Interface IPrototype

package org.dracof.spring.scope;

public interface IPrototype {}

Interface ISingleton

package org.dracof.spring.scope;

public interface ISingleton {}

Implementacion de IPrototype

package org.dracof.spring.scope.impl;

import org.dracof.spring.scope.IPrototype;

public class ClasePrototypeImpl implements IPrototype{
public ClasePrototypeImpl() {
System.out.println("Creando nueva instancia de ClasePrototypeImpl!");
}
}

Implementacion de ISingleton

package org.dracof.spring.scope.impl;

import org.dracof.spring.scope.ISingleton;

public class ClaseSingletonImpl implements ISingleton {
public ClaseSingletonImpl() {
System.out.println("Creando nueva instancia de ClaseSingletonImpl!");
}
}

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" "http://www.springframework.org/dtd/spring-beans-2.0.dtd">

<beans>

<!-- Por default es singleton -->
<bean id="claseSingleton"
class="org.dracof.spring.scope.impl.ClaseSingletonImpl"
scope="singleton"/>

<bean id="clasePrototype"
class="org.dracof.spring.scope.impl.ClasePrototypeImpl"
scope="prototype"/>

</beans>

Clase de prueba

package org.dracof.spring.test;

import org.dracof.spring.scope.IPrototype;
import org.dracof.spring.scope.ISingleton;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class PruebaScope {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

ISingleton claseSingleton1 = (ISingleton)context.getBean("claseSingleton");
ISingleton claseSingleton2 = (ISingleton)context.getBean("claseSingleton");
ISingleton claseSingleton3 = (ISingleton)context.getBean("claseSingleton");

IPrototype clasePrototype1 = (IPrototype)context.getBean("clasePrototype");
IPrototype clasePrototype2 = (IPrototype)context.getBean("clasePrototype");
IPrototype clasePrototype3 = (IPrototype)context.getBean("clasePrototype");
}
}

Salida

Creando nueva instancia de ClaseSingletonImpl!
Creando nueva instancia de ClasePrototypeImpl!
Creando nueva instancia de ClasePrototypeImpl!
Creando nueva instancia de ClasePrototypeImpl!

Descargar proyectito
ScopeSpring.zip

Suerte.

Primer Programa Struts2

Este es un ejemplo muy simple del uso de Struts2, primeramente se inicia con una pagina index.jsp la cual muestra una link que pasa por una accion e imprime un mensaje en consola para despues mostrar una pagina de resultado (resultado.jsp)

Librerias usadas

commons-fileupload-1.2.1.jar
freemarker-2.3.13.jar
ognl-2.6.11.jar
struts2-core-2.1.6.jar
xwork-2.1.2.jar

Paginas y XML

index.jsp

<%@ taglib prefix="s" uri="/struts-tags" %>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<br/>
<s:a href="miAccion.action">Enviar...</s:a>
</body>
</html>
</pre>

resultado.jsp

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
Primer programita en Struts2. <br/>
Se escribe un mensaje desde la consola del servidor (verificar)<br/><br/>
Suerte.<br/><br/>
<a href="javascript:history.back()">Regresar</a>
</body>
</html>

MiAccion.java

package org.dracof.struts2.actions;

public class MiAccion {
public String execute() throws Exception {
System.out.println("Pasando por el execute de MiAccion!");
return "success";
}
}

struts.xml

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
<package name="default" extends="struts-default" namespace="/">
<action name="miAccion" class="org.dracof.struts2.actions.MiAccion">
<result name="success">resultado.jsp</result>
</action>
</package>
</struts>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

<display-name>Basico</display-name>

<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>

Estructura del proyecto


index.jsp


consola de tomcat


resultado.jsp


Descargar war
basico.war

Descargr proyecto
ProyectoBasico.zip

Suerte.

martes, 4 de agosto de 2009

Instalar Plugin de Flasplayer en Firefox Opensolaris

Descargar el archivo flash_player_10_solaris_x86.tar

Desempaquetarlo

tar -xvf flash_player_10_solaris_x86.tar

Entramos al directorio creado por tar

cd flash_player_10_solaris_r22_87_x86/

Copiaamos el so al directorio de plugins de firefox

cp libflashplayer.so /usr/lib/firefox/plugins/

Y listo...

Suerte.

lunes, 3 de agosto de 2009

Recorriendo una lista basicamente en Groovy

Algunas formas de recorrer una lista...

def lista = [1,4,5,"Cadena",]

lista.size().times {
print it + " "
}

print "\nElementos en lista : "
for( i in lista ) {
print "${i} "
}

print "\nOtra forma de mostrarlos : "
for (indice=0; indice<lista.size(); indice++) {
print " ${lista[indice]} "
}

print "\nUna forma mas : "
lista.size().times {
print lista[it] + ' ' ;
}

print "\nPor si fuera poco : "
for(i in 0..lista.size()-1){
print lista[i] + ' ' ;
}

Salida:

0 1 2 3
Elementos en lista : 1 4 5 Cadena
Otra forma de mostrarlos : 1 4 5 Cadena
Una forma mas : 1 4 5 Cadena
Por si fuera poco : 1 4 5 Cadena

Suerte.

domingo, 2 de agosto de 2009

Instalando Grails

Descargamos el archivo grails-bin-1.2-M1.tar.gz

Lo desempaquetamos

tar -xvf grails-bin-1.2-M1.tar.gz

Establecemos la variable de entorno

export JAVA_HOME=/usr/java

Nos establecemos dentro del directorio bin de grails, en mi caso

cd /opt/grails-1.2-M1/bin

Ejecutamos el siguiente comando de grails

sh grails help

Obteniendo la salida

Welcome to Grails 1.2-M1 - http://grails.org/
Licensed under Apache Standard License 2.0
Grails home is set to: /opt/grails-1.2-M1

Se puede establecer las variables JAVA_HOME y GROOVY_HOME de forma permanenete al igual que escribir en PATH la ruta /opt/grails-1.2-M1/bin

Suerte.

Uso Basico de Rangos en Groovy

Muestra el uso básico de rangos con groovy

def rango = 1..5

println 'Rango inicial: ' + rango.from
println 'Rango final: ' + rango.to
println "Tamanio de rango: ${rango.size()}"

def r= rango.each {
println " Numero actual: ${it}"
}

println 'r = ' + r

Salida:

Rango inicial: 1
Rango final: 5
Tamanio de rango: 5
Numero actual: 1
Numero actual: 2
Numero actual: 3
Numero actual: 4
Numero actual: 5
r = [1, 2, 3, 4, 5]

Suerte.