miércoles, 13 de enero de 2010

Atributo method del action en Struts2

Atributo method del action en Struts2

En el primer ejemplo de struts2 (PrimerProgramaStruts2) se muestra la accion org.dracof.struts2.actions.MiAccion con alias miAccion, cuando se realice el llamado a esta por default struts buscara el metodo public String execute(), si no lo encuentra lanza una excepcion diciendo que El recurso requerido (No result defined for action org.dracof.struts2.actions.MiAccion and result success) no esta disponible.

Para escribir multiples metodos dentro del Action se puede usar el atributo method del elemento action de nuestro xml, quedando


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


Se modifica el nombre del metodo execute por otroMetodo de la clase MiAccion y se manda el mensaje ‘Pasando por el metodo otroMetodo de MiAccion’
Quedando la clase como sigue

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

Con esto cada vez que se llame a miAccion se ejecutara el metodo otroMetodo.

Si probamos el ejercicio velos la salida a consola


Descargar war MethodAction.war

Descargar proyecto MethodAction.zipwar

Suerte.

domingo, 6 de diciembre de 2009

Ejercicio Basico con Flex

Bueno, empiezo a jugar con Flex y aqui un Screencast mostrando un ejemplo.





Suerte

viernes, 20 de noviembre de 2009

Recuperar el arranque en Win7, eliminando el GRUB de Linux

Recuperar el arranque en Win7, eliminando el GRUB de Linux

bootrec.exe /fixmbr
bootrec.exe /fixboot

ejecutar esto desde la consola de recuperacion usando el DVD de instalacion Win7.

Suerte

martes, 17 de noviembre de 2009

Primer Stateless EJB3 con Eclipse y Weblogic 10

Primer Stateless EJB3 con Eclipse y Weblogic 10

Crear un Bean de Session Sin Estado es muy simple usando las anotaciones de EJB3, a continuación un ejemplo que realiza las operaciones basicas de una calculadora

La estructura del proyecto es



La carpeta jar contiene el EJB generado para el despliegue, este jar es construido con ayuda de Eclipse, esto creando inicialmente el proyecto de tipo EJB como sigue



Y configurando la version a usar



Las librerias que se usan para este proyecto son

javaee.jar
wlclient.jar (para uso del cliente)

Cabe señalar que se usa Eclipse 3.5 y WebLogic 10.3.1.0

Creamos la inteface de negocio,

package org.dracof.ejb3.calculadora;

import javax.ejb.Remote;

@Remote
public interface Calculadora {

public int suma(int a, int b);

public int resta(int a, int b);

public float multiplicacion(int a, int b);

public float division(int a, int b);
}

Usando la anotacion @Remote indicamos que este EJB sera accesado remotamente, es decir, desde otra máquina virtual. Su implementacion

package org.dracof.ejb3.calculadora;

import javax.ejb.Stateless;

@Stateless (mappedName="ejb/calculadora" )
public class CalculadoraBean implements Calculadora {

public float division(int a, int b) {
if ( b!= 0 ) {
return a/b;
}
return -1;
}

public float multiplicacion(int a, int b) {
return a*b;
}

public int resta(int a, int b) {
return a-b;
}

public int suma(int a, int b) {
return a+b;
}
}

Con @Stateless se indica que sera un EJB de Session sin Estado, para este caso implementamos directamente la interface Calculadora, en caso de no querer hacerlo podemos hacer uso de la anotacion @Remote desde la clase como sigue

@Remote(Calculadora.class)
@Stateless (mappedName="ejb/calculadora")
public class CalculadoraBean {

}

Para Weblogic la propiedad mappedName de Stateless le indica el nombre del JNDI.

Dejamos el META-INF/MANIFEST.MF como lo genera Eclipse

Manifest-Version: 1.0
Class-Path:

Para generar el jar simplemente hacemos clic derecho sobre el nombre del proyecto y seleccionamos



Después seleccionar el tipo de export



Y finalmente seleccionamos el destino y nombre del EJB, para este caso se exporta en la carpeta jar del proyecto



Ahora entramos a la consola de Weblogic, en mi caso usando


http://localhost:7011/console/


Seleccionamos del panel izquierdo Deployments



Seleccionamos install de la pantalla desplegada



Desde upload your file(s)



Seleccionamos el jar recien creado del ejb



Oprimimos Next, Selecciomos la aplicación BasicoLocalStateless.jar



Oprimimos Next y seleccionamos que lo instale como una aplicacion



Oprimimos Next y dejamos la configuración por default



Oprimimos Finish, si todo esta correcto vemos una pantalla en la cual nos indica que el EJB esta Activo.



Para ver el JNDI de este EJB seleccionamos dentro de Domain Structure, la opcion Servers y del lado derecho el Server en el cual estamos trabajando



Con esto vemos la opcion ‘View JNDI Tree’, la seleccionamos y vemos una nueva ventana con el arbol JNDI



Vemos nuestro JNDI de Calculadora



Creamos el cliente desde eclipse

import java.util.Properties;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.rmi.PortableRemoteObject;

public class ClienteCalculadora {

public static void main(String[] args) {
Properties prop = new Properties();
prop.put(Context.INITIAL_CONTEXT_FACTORY,
"weblogic.jndi.WLInitialContextFactory");
prop.put(Context.PROVIDER_URL, "t3://localhost:7011/");
try {
InitialContext contexto = new InitialContext(prop);
Object obj = contexto.lookup("ejb.calculadora#org.dracof.ejb3.calculadora.Calculadora");

Calculadora calculadora = (Calculadora) PortableRemoteObject.narrow(obj, Calculadora.class);

int a = 10;
int b = 13;
int res = calculadora.suma(a, b);
System.out.println( "La suma de " + a + " + " + b + " es " + res);
} catch (NamingException e) {
e.printStackTrace();
}
}
}

Y al ejecutarlo vemos el resultado

La suma de 10 + 13 es 23

Como vemos, para este ejercicio ya no es necesario crear el xml ejb-jar.xml !!

Codigo Java

JAR EJB

Suerte.

martes, 3 de noviembre de 2009

Integración Spring y Hibernate (1)

La integracion de Hibernate con Spring es muy sencilla, se puede hacer de varias formas. Aquí vamos a ver la primera y mas simple.

Creamos una tabla Persona con la siguiente estructura

CREATE TABLE PERSONA (
NOMBRE VARCHAR(10),
APELLIDOP VARCHAR(20),
EDAD INTEGER
);

La estructura de este ejemplo es



Para obtener un sessionFactory usamos la clase HibernateUtil.java que se define como sigue

package org.dracof.hibernate.util;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtil {

private static final SessionFactory sessionFactory;

static {
sessionFactory =
new Configuration().configure().buildSessionFactory();
}

public static SessionFactory getSessionFactory () {
return sessionFactory;
}
}

El mapeo de hibernate (Persona.hbml.xml) con la tabla Persona se realiza como sigue

<hibernate-mapping>
<class name="org.dracof.hibernate.Persona" table="PERSONA">
<id name="nombre" column="NOMBRE">
<generator class="assigned"/>
</id>
<property name="apellidoP" column="APELLIDOP"/>
<property name="edad" column="EDAD"/>
</class>
</hibernate-mapping>

Se crea el POJO para este mapeo

public class Persona {

private String nombre;

private String apellidoP;

private Integer edad;

//setters y getters
...
}

Definimos la interface para el DAO

package org.dracof.hibernate.dao;

import org.dracof.hibernate.Persona;

public interface PersonaDAO {

public void creaPersona (Persona persona);

public Persona obtienePersona (String nombre);

public void eliminaPersona (String nombre);
}

Y su implementacion

package org.dracof.hibernate.dao.impl;

import org.dracof.hibernate.Persona;
import org.dracof.hibernate.dao.PersonaDAO;
import org.hibernate.Session;
import org.hibernate.SessionFactory;

public class PersonaDAOImpl implements PersonaDAO {

private SessionFactory sessionFactory;

public void setSessionFactory (SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}

public void creaPersona (Persona persona) {
Session session = sessionFactory.getCurrentSession();
session.beginTransaction();
session.save(persona);
session.getTransaction().commit();
}

public Persona obtienePersona (String nombre) {
Session session = sessionFactory.getCurrentSession();

session.beginTransaction();
Persona persona = (Persona)session.get(Persona.class, nombre);
session.getTransaction().commit();

return persona;
}

public void eliminaPersona (String nombre) {
Persona persona = new Persona();
persona.setNombre(nombre);

Session session = sessionFactory.getCurrentSession();

session.beginTransaction();
session.delete(persona);
session.getTransaction().commit();
}
}

En este caso vemos que se le inyecta el sessionFactory con Spring.

El XML de configuración para hibernate es

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

<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
<session-factory>
<property name="connection.driver_class">
org.apache.derby.jdbc.ClientDriver
</property>
<property name="connection.url">
jdbc:derby://localhost:1531/dracof
</property>
<property name="connection.username">dracof</property>
<property name="connection.password">dracof</property>

<property name="current_session_context_class">
thread
</property>
<property name="dialect">
org.hibernate.dialect.DerbyDialect
</property>
<property name="show_sql">true</property>

<mapping resource="org/dracof/hibernate/Persona.hbm.xml"/>
</session-factory>
</hibernate-configuration>

Con ayuda de Spring se inyecta el sessionFactory

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>
<bean id="sessionFactory" factory-method="getSessionFactory"
class="org.dracof.hibernate.util.HibernateUtil"/>

<bean id="personaDAO"
class="org.dracof.hibernate.dao.impl.PersonaDAOImpl">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
</beans>

Podemos usar el factory-method para obtener el sessionFactory desde HibernateUtil, por ultimo se crea una clase para probar lo programado

package org.dracof.test;

import org.dracof.hibernate.Persona;
import org.dracof.hibernate.dao.PersonaDAO;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.
ClassPathXmlApplicationContext;

public class Test {

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

PersonaDAO personaDAO =
(PersonaDAO)context.getBean("personaDAO");

//Creacion de Persona
Persona persona = new Persona();
persona.setNombre("Juan");
persona.setApellidoP("Perez");
persona.setEdad(50);
personaDAO.creaPersona( persona );

//Obtencion de Persona
persona = null;
persona = personaDAO.obtienePersona("Juan");
System.out.println( "Apellido de Juan: " +
persona.getApellidoP() );

Borrado de Persona
personaDAO.eliminaPersona( "Juan" );
}
}

Si ejecutamos el Test la salida es la siguiente

log4j:WARN No appenders could be found for logger (org.springframework.context.support.ClassPathXmlApplicationContext).
log4j:WARN Please initialize the log4j system properly.
Hibernate: insert into PERSONA (APELLIDOP, EDAD, NOMBRE) values (?, ?, ?)
Hibernate: select persona0_.NOMBRE as NOMBRE0_0_, persona0_.APELLIDOP as APELLIDOP0_0_, persona0_.EDAD as EDAD0_0_ from PERSONA persona0_ where persona0_.NOMBRE=?
Apellido de Juan: Perez
Hibernate: select persona_.NOMBRE, persona_.APELLIDOP as APELLIDOP0_, persona_.EDAD as EDAD0_ from PERSONA persona_ where persona_.NOMBRE=?
Hibernate: delete from PERSONA where NOMBRE=?

Con este ejercicio tambien se puede omitir la construccion de la clase HibernateUtil modificando el applicationContext.xml inyectandole a la propiedad configLocation de
LocalSessionFactoryBean el valor classpath:hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING/DTD BEAN/EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>
<bean id="sessionFactory"
class="org.springframework.orm.
hibernate3.LocalSessionFactoryBean">
<property name="configLocation"
value="classpath:hibernate.cfg.xml"/>
</bean>

<bean id="personaDAO"
class="org.dracof.hibernate.dao.impl.PersonaDAOImpl">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
</beans>

Para esta configuracion conservamos completamente el archivo hibernate.cfg.xml, en otros casos solo lo podemos usar para el mapeo de recursos y en otros casos se puede hasta eliminar este archivo y escribir la configuración en el applicationContext.xml.


Codigo Java
Script SQL

Suerte.

martes, 27 de octubre de 2009

Uso insert/update de property en Hibernate

Con estos ejercicios se muestra el uso de insert y update del tag property de hibernate que por default el valor de estas propiedades es true y la anotación @Transient para JPA

Veamos el primer caso usando el xml de mapeo de hibernate

<hibernate-mapping>
<class name="org.dracof.hibernate.Persona" table="PERSONA">
<id name="nombre" column="NOMBRE">
<generator class="assigned"/>
</id>
<property name="apellidoP" column="APELLIDOP"/>
<property name="edad" column="EDAD"/>
</class>
</hibernate-mapping>

Si hacemos operaciones de insert de Persona hibernate genera lo siguiente

Hibernate: insert into PERSONA (APELLIDOP, EDAD, NOMBRE) values (?, ?, ?)

o update

Hibernate: update PERSONA set APELLIDOP=?, EDAD=? where NOMBRE=?

Como vemos se toman en cuenta todos los campos del mapeo, para el caso del insert APELLIDOP, EDAD, NOMBRE y para el update APELLIDOP=?, EDAD=?

Si agregamos la propiedad insert="false" o update="false" en el tag property para edad

<property name="edad" column="EDAD" insert="false"/>

<property name="edad" column="EDAD" update="false"/>

O ambos

<property name="edad" column="EDAD" insert="false" update="false"/>

Vemos que el SQL generado ahora es

Para insert

Hibernate: insert into PERSONA (APELLIDOP, NOMBRE) values (?, ?)

Para update

Hibernate: update PERSONA set APELLIDOP=? where NOMBRE=?

Con esto vemos que hibernate ya no toma la propiedad edad para los insert/update.

Podemos tener el mismo resultado usando las anotaciones JPA con @Transient o la palabra reservada transient de java como sigue

 
@Transient
@Column (name="EDAD")
private Integer edad;

o
 
@Column (name="EDAD")
private transient Integer edad;

Y obtenemos el mismo resultado.

Suerte.

sábado, 24 de octubre de 2009

Uso de dynamic-insert y dynamic-update en Hibernate

Uso de dynamic-insert y dynamic-update en Hibernate

Con este ejemplo salgo de la duda del uso de dynamic-insert y dynamic-update de class, cabe mencionar que ambas son opcionales y por default tienen el valor false.

Estructura de la tabla PERSONA

CREATE TABLE PERSONA (
NOMBRE VARCHAR(10),
APELLIDOP VARCHAR(20),
EDAD INTEGER
);

Todos los campos de la tabla aceptan valores nulos.

Insertamos valores y queda como sigue



Uso de dynamic-insert

Tenemos el objeto Persona para realizar la inserción como sigue

Persona persona = new Persona();
persona.setNombre("Nombre");
persona.setApellidoP("ApellidoP");
//persona.setEdad(15);

NOTA: Observamos que la propiedad EDAD contiene el valor NULL.

Dentro del mapeo de la tabla PERSONA en Persona.hbm.xml, tenemos la propiedad dynamic-insert a false

<class name="org.dracof.hibernate.Persona" table="PERSONA"
dynamic-insert="false">

El query del insert generado por hibernate es el siguiente

Hibernate: insert into PERSONA (APELLIDOP, EDAD, NOMBRE) values (?, ?, ?)

Aquí con dynamic-insert a FALSE se hará el insert con todos los campos aun teniendo un valor NULL, por eso se toma en cuenta la columna EDAD

Ahora probamos con dynamic-insert a TRUE , con esto se hará el insert con todos los campos que tengan un valor DIFERENTE DE NULL

<class name="org.dracof.hibernate.Persona" table="PERSONA"
dynamic-insert="true">

El query generado por Hibernate es

Hibernate: insert into PERSONA (APELLIDOP, NOMBRE) values (?, ?)

La columna EDAD ya no es tomada en cuenta por tener el valor NULL.

Uso de synamic-update

Probamos primero el caso de dynamic-update con FALSE

<class name="org.dracof.hibernate.Persona" table="PERSONA"
dynamic-update="false">

Con esto al obtener un registro y aún cuando no se a modificado algun campo de este objeto hibernate actrualiza los valores de todas las columnas aún cuando no se hayan modificado. Para realizar esta prueba se usa el siguiente fragmento de código

Persona persona = (Persona) session.load(Persona.class, "Dracof");
persona.setApellidoP("Dracof XYZ");
session.update(persona);

Vemos que solo se modifico la propiedad ApellidoP sin embargo tambien setea la columna EDAD aun cuando esta no se modifico, el update generado es

Hibernate: update PERSONA set APELLIDOP=?, EDAD=? where NOMBRE=?

Ahora con dynamic-update con TRUE

<class name="org.dracof.hibernate.Persona" table="PERSONA"
dynamic-update="true">

Corremos el mismo ejemplo pero con dynamic-update con TRUE y vemos que solo setea el valor de la columna APELLIDOP y edad no la toma en cuenta porque no se modifico.

Hibernate: update PERSONA set APELLIDOP=? where NOMBRE=?


Codigo Java

Script SQL

Suerte.