Buscar
Social
Ofertas laborales ES
miércoles
may262010

OpenXava 4m4 liberado

OpenXava 4m4 ya está disponible. Como muchos de vosotros ya sabéis OpenXava es un marco de trabajo para desarrollo rápido de aplicacion de gestión en Java orientado al modelo.

Esta versión es un hito más hacia OX4, cuyo objetivo es mejorar la experiencia del usuario. Tiene más de 30 nuevas características y arreglos sobre 4m3, entre las que destacan:

  • El usuario puede minimizar cualquier marco en modo detalle.
  • Cualquier acción puede mostrarse en cada fila del modo lista o colecciones.
  • Hay un nuevo editor para mostrar las colecciones como árboles.
  • El comportamiento de la búsqueda desde modo detalle es más intuitivo

Os invito a descargar y probar esta nueva versión

martes
may252010

La revolución SPI e ItsNat: siguientes pasos

Como es sabido ItsNat está fuertemente orientado al desarrollo de sitios web (no sólo aplicaciones) basadas en una única página web sin recargas, es decir, siguiendo el paradigma Single Page Interface, sin perder las características propias de una web paginada (SEO, accesibilidad, favoritos, botones adelante/atrás, contadores de visitas etc).

En el objetivo de promover la evolución hacia el SPI publiqué reciéntemente el Manifiesto SPI, como muestra de que el SPI puede ser realidad en sitios web, como ejemplo la web corporativa innowhere.com fue convertida a SPI conservando la misma apariencia que la versión antigua, pero conservando el SEO, favoritos, contadores etc.  

 El siguiente paso consistió en desarrollar un tutorial mostrando cómo podía realizarse un sitio web SPI con ItsNat, en dicho tutorial se mostró cómo la estética de los estados puede diseñarse como HTML plano y por tanto de forma muy similar a como se diseña cualquier web convencional paginada (en el caso de ItsNat el HTML plano no contiene lógica alguna que se ejecute en el servidor). El tutorial constaba de la correspondiente demo online. Constatar que recientemente actualicé ligeramente el tutorial para mostrar que es posible simular el funcionamiento de los botones Atrás/Adelante (Back/Forward) sin necesidad de recargar la página (como estaba inicialmente), es decir más puro SPI aún.

Posteriormente Jorge Rubira, Iván Zaera y yo grabamos un podcast sobre Single Page Interface. En aquel podcast surgió el tema de las dificultades de llevar el paradigma SPI a cualquier sitio web de gran público y en medio del debaté planteé porqué no podía convertirse a SPI una web tal y como la de El Corte Inglés. El Corte Inglés para quienes no lo conozcais, es la mayor empresa española (capital y sede)  de comercio al por menor en España (Wikipedia) y una de las más grandes del mundo. Iván comentaba que una de las principales razones era que la legislación española imponía que las empresas de cierto tamaño estaban obligadas a cumplir reglas de accesibilidad algo antiguas tal y como que la web sea funcional sin JavaScript (la legislación española todavía no se ha actualizado a las nuevas posibilidades de accesibilidad con JavaScript que ofrece el WAI-ARIA).

Ciertamente el requisito de que una web SPI funcione también sin JavaScript (obviamente en ese modo ya no será SPI) es un requisito difícil... PERO NO IMPOSIBLE. De hecho el requisito de que la web funcione también sin JavaScript es un requisito muy similar a que sea SEO compatible, algo básico para cualquier sitio web.

El siguiente paso en la promoción de la revolución SPI parece obvio...¿por qué no convertir el sitio web de El Corte Inglés a SPI?

Pues eso es lo que he hecho... mejor dicho una pequeña parte del sitio web ha sido clonada como Single Page Interface sin perder ninguna característica en general exigible a cualquier sitio web de gran público y que cumpla con la legislación española:

    * Navegación sin recargas.

    * Los estados pueden ser "Favoritos" (bookmarks)

    * Compatible SEO (prueba a desactivar JavaScript para entender "como" es visto el sitio web por los indexadores de los buscadores).
    * Soporte (simulación) de Atrás/Adelante y en general navegación a través de la historia del navegador SIN RECARGA.
    * Plenamente funcional con JavaScript desactivado.

    * El "layout" es casi exactamente el mismo que la web original

    * Como plus típico de ItsNat existe la opción del control remoto de otros usuarios viendo el sitio web.

  Lee cuidadosamente la información de la página de entrada y las condiciones de uso del mismo. También se cuenta qué parte es la clonada y funcional como SPI.

  Por razones de diverso tipo no voy a publicar el código fuente, si alguien quiere verlo que me escriba un correo y lo estudiaré, aunque adelanto que la redistribución de fuente y/o binarios quedará prohibida y tendrá una finalidad de objeto de estudio y no será ejecutado con otro fin. De todas formas no hay nada esencialmente diferente a lo que se puede encontrar en el tutorial SPI.

  Enlace a la DEMO.

 

martes
may252010

Tercer webinar Rumbo a Spring I/O (Plugins Grails)

 

Siguiendo con nuestros webinars de Rumbo a Spring I/O, este miércoles 26 tendremos la tercera entrega por parte de Escuela de Groovy. Ellos nos van a presentar 'Desarrollo modular con Grails mediante plugins'.

En esta ocasión, el webinar se va a realizar a las 17h, hora de España (GMT +1), 10h hora de México (GMT -6). Igual que para los otros webinars, la url de acceso es la siguiente: http://experts.na3.acrobat.com/springio/

A modo informativo, deciros que Spring I/O ya cuenta con 250 personas registradas, así que si aún no estás registrado, reserva el 19 de Junio!

lunes
may242010

MyBatis 3 + Spring 3.1 para los que les gusta el SQL

Introducción a MyBatis 3 

Se ha publicado la última versión del framework de persistencia MyBatis (antiguamente conocido como iBATIS).
Para los que no lo conozcan MyBatis es una utilidad que ejecuta sentencias SQL y mapea sus resultados a POJOs. 
Los dos puntos fuertes de MyBatis son su simplicidad y su infinita flexibilidad que permite usar cualquier base de datos por mal hecha que esté sin demasiados problemas.
A diferencia de JPA, Hibernate o Cayenne, MyBatis no pretende mapear un modelo relacional a un modelo de objetos. No es necesario describir las relaciones de las tablas en ficheros XML ni utilizar dialectos del SQL para solucionar relaciones imposibles. 

Mappers y Fichero XML de sentencias 

 Básicamente MyBatis consiste en definir un fichero de sentencias SQL como este:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
    PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"
    "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
<mapper namespace="org.example.UserMapper">

	<select id="getUser" resultType="org.example.User" parameterType="org.example.User">
		select * from users where id=#{id} and name=#{name}
	</select>
</mapper>

Este fichero indica que existe un método llamado getUser en un objeto (aka mapper) llamado org.example.UserMapper. Indica también que cuando se ejecute getUser se espera recibir como parametro de entrada un pojo org.example.User y que se devolverá otro pojo org.example.User
Un mapper es un DAO, es decir, un objeto de acceso a datos. Con MyBatis no es necesario construir una implementación, basta con definir la interfaz. MyBatis genera un proxy dinámico con la implementación.
En nuestro caso el UserMapper es simplemente:
public interface UserMapper {
	User getUser(User user);
}

API de MyBatis 

 MyBatis dispone de un API muy sencillo para obtener le mapper y ejecutar la sentencia. Básicamente consiste en esto:
SqlSession session = sessionFactory.openSession();
UserMapper userMapper = session.getMapper(UserMapper.class);
return userMapper.getUser();

Sin embargo, y aunque este código es bastante sencillo no es código de negocio sino código técnico que no aporta gran cosa, sencillamente hay que escribirlo o el programa no funciona.  

Combinando Spring 3.1 y MyBatis 3 

 Spring y la inversión de control se encargan precisamente de eliminar código de inicialización y conseguir que el programador se centre en la lógica de negocio que es de lo que se trata. 
Vamos a inyectar directamente un mapper en un bean de Spring para ver cómo podemos ejecutar la select sin codificar una llamada explícita a SqlSession.
Definimos un bean de spring que tiene una propiedad UserMapper
public class Service implements IService {
	
	private UserMapper userMapper;

	public void setUserMapper(UserMapper userMapper) {
		this.userMapper = userMapper;
	}
	
	public void logicaDeNegocio() {
		User user = new User();
		user.setId("u1");
		user.setName("Pocoyo");
		user = userMapper.getUser(user);
	}
}

Y esto es todo. El servicio Serivce puede invocarse desde la capa de presentación, por ejemplo un action de Struts y la sentencia simplemente se ejecutará. Como véis no hay ni un solo import al API de MyBatis y tampoco lo hay al API de Spring.
Los más suspicaces pensarán que no es posible que esto funcione con tan poco código y efectivamente hemos de confesar que el "codigo" de integración de beans que falta debe estar obligatoriamente en algún lugar y ese lugar es el applicationContext de spring: 

Configuración de Spring 

  <bean id="servicio" class="org.example.Service"> <property name="userMapper" ref="userMapper" /> </bean>
<bean id="userMapper" class="org.springframework.orm.ibatis3.support.MapperFactoryBean"> <property name="sqlSessionFactory" ref="sqlSessionFactory" /> <property name="mapperInterface" value="org.example.UserMapper" /> </bean>
<bean id="sqlSessionFactory" class="org.springframework.orm.ibatis3.SqlSessionFactoryBean"> <property name="configLocation" value="classpath:org/example/ibatis-config.xml" /> <property name="dataSource" ref="dataSource" /> </bean>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="org.hsqldb.jdbcDriver"/> <property name="url" value="jdbc:hsqldb:mem:test"/> <property name="username" value="sa"/> <property name="password" value=""/> </bean>
En el ejemplo usamos un datasource de apache commons. Lógicamente a nuestro servicio le podemos dotar de transaccionalidad usando los interceptores de Spring.
Es posible generar automaticamente los DAOs que implementan el CRUD (create, remove..) usando el generador MyBatis (antes denominado iBator). 

Eso es todo! 

 Como véis MyBatis y Spring nos permiten crear programas sin código de persistencia. Externalizando las SQL a un fichero xml externo. Una solución muy adecuada para bases de datos desorganizadas o simplemente para los que les gusta el SQL Ejemplo en: http://jira.springframework.org/secure/attachment/16059/MapperFactoryBean_20100101.tar.gz 
lunes
may242010

Nuevos videos en nuestro canal de Parleys: introducción a TDD

Hemos subido dos videos nuevos a nuestro canal de Parleys. En esta ocasión se trata del seminario sobre TDD impartido por Paradigmas Tecnológico hace unas semanas en Madrid. Desde aquí podéis acceder a la presentación y al código fuente del seminario.

 

El código fuente es especialmente interesante, ya que en el repositorio de Google Code están almacenadas todas las distintas versiones del código que Carlo Scarioni abusando a lo largo de la presentación, según va evolucionando el proyecto añadiendo funcionalidad y creando test. Si queréis, según vais siguiendo la presentación podéis ir haciendo updates de las distintas versiones desde el repositorio.

 

Aquí tenéis los videos:

 

 

Muchas gracias a Paradigmas Tecnológico por este seminario, por el de Grails que aún no hemos tenido tiempo para colgar en video, y por el de Apache Solr, que será impartido el día 8 de Junio a las 17:30 en el sitio de costumbre. En breve os daremos más información al respecto sobre este nuevo seminario.

 

Nota: Las partes de los videos correspondientes a las demos han sido grabadas en alta calidad y el código fuente y texto de la pantalla puede leerse sin problemas. Eso sí, dependiendo de las características de la pantalla de vuestro ordenador, es posible que para leerlo correctamente tengáis que maximizar la pantalla correspondiente al video (minimizando por tanto la pantalla correspondiente a la presentación). Si no, puede que el área de pantalla disponible para reproducir el video sea inferior a la resolución real del video, con lo cual el reproductor le va a bajar la resolución y es posible que dejéis de poder leer el código fuente y demás.