6 July, 2008

Curso J2EE (9ª,10ª semana) spring

Llegamos a la 9ª semana y le toca el turno a spring, nos extenderemos 2 semanas y un poquito de la siguiente debido a la gran cantidad de herramientas y frameworks con los que podemos integrarlo además aprovecharemos su módulo aop para introducir los conceptos de la programación orientada a aspectos.

Spring no es un framework al uso como los que yo había utilizado, struts, cakephp, jsf. Spring abarca todas las capas de una aplicación, y no solo de una aplicación web, podemos utilizar perfectamente spring para el desarrollo de aplicaciones de escritorio. Spring se compone de diversos módulos siendo indispensable el "core" a partir de este podemos utilizar cualquiera de los existentes dependiendo de nuestras necesidades:

- MVC: Implementación del patrón MVC.

- ORM: Integración con api's de mapeo objeto-relacional (JDO, Hibernate, iBatis).

- AOP: Implementación de programación orientada a aspectos.

- WEB: Contexto de aplicaciones orientado a web. Deberemos utilizarlo para integrar otros frameworks (struts, webwork, etc).

- DAO: JDBC.

Modulos spring

Por esto al principio me chocó un poco la idea que tenía a priori de spring, esperaba un framework típico y me encontré con algo muy diferente. Podríamos decir que spring es el encargado de unir todas las piezas de nuestra aplicación, piezas que pueden ser propias del framework (módulo mvc), o piezas de terceros que se integran a perfección (hibernate, struts, etc). Frameworks como spring se conocen como "contenedores ligeros" y no es el único: http://www.picocontainer.org.

¿Como integra spring todas estas piezas?. Dos conceptos a tener muy en cuenta: inversión de control e inyección de dependencias. Tenemos un montón de información por la red de "que es" y "hace" cada uno aunque a menudo se confunden. Pero digamos que estas dos técnicas hacen posible que spring elimine todas las dependencias y desacople los diferentes módulos que componen un programa, siguiendo el Principio de Hollywood: "no nos llames a nosotros; nosotros te llamaremos a tí".

Para spring un bean será un objecto que el podrá gestionar, lo crea lo destruye lo inyecta donde sea necesario. Así tenemos una interfaz básica BeanFactory que será la encargada de proporcionar los mecanismos necesarios para gestionar estos beans. Para aprovechar las capacidades de spring todo lo que desarrollemos serán beans, solo de esta forma spring podrá inyectar las dependencias que especifiquemos en el fichero de configuración.

Un ejemplo para verlo un poco mas claro:

Tenemos una clase Factura.java:

  1. public class Factura implements Serializable{
  2.    private Integer num;
  3.    private Double importe;
  4.    public Integer getNum() {
  5.       return num;
  6.    }
  7.    public void setNum(Integer num) {
  8.       this.num = num;
  9.    }
  10.    public Double getImporte() {
  11.       return importe;
  12.    }
  13.    public void setImporte(Double importe) {
  14.       this.importe = importe;
  15.    }
  16. }

Tenemos un FacturasManager.java que contiene una lista de facturas y un método que las pinta por pantalla:

  1. public class FacturasManager implements Serializable {
  2.    private List facturas;
  3.    public List getFacturas() {
  4.       return facturas;
  5.    }
  6.    public void setFacturas(List facturas) {
  7.       this.facturas = facturas;
  8.    }
  9.    public void pintaFacturas() {
  10.       ListIterator iterator = facturas.listIterator();
  11.       while(iterator.hasNext())
  12.       {
  13.             Factura f = (Factura)iterator.next();
  14.             System.out.println("Factura Nº:"+f.getNum()+",importe"+f.getImporte());
  15.       }
  16.    }
  17. }

Deberíamos complicarlo un poco mas pero para ilustrar los conceptos anteriores nos sirve.
Ahora tenemos el fichero xml de configuración de spring donde detallaremos los beans y las inyecciones que necesitamos hacer:

  1. <beans>
  2.     <bean id="factMan" class="net.jsanroman.facturas.FacturasManager">
  3.         <property name="facturas">
  4.             <list>
  5.                 <ref bean="factura1"/>
  6.                 <ref bean="factura2"/>
  7.                 <ref bean="factura3"/>
  8.             </list>
  9.         </property>
  10.     </bean>
  11.     <bean id="factura1" class="net.jsanroman.facturas.Factura">
  12.         <property name="num"><value>1</value></property>
  13.         <property name="importe"><value>124.3</value></property>
  14.     </bean>
  15.     <bean id="factura2" class="net.jsanroman.facturas.Factura">
  16.         <property name="num"><value>2</value></property>
  17.         <property name="importe"><value>14.3</value></property>
  18.     </bean>
  19.     <bean id="factura3" class="net.jsanroman.facturas.Factura">
  20.         <property name="num"><value>3</value></property>
  21.         <property name="importe"><value>224.3</value></property>
  22.     </bean>

Estamos instanciando 3 beans tipo Factura desde el propio xml y los estamos inyectando en la propiedad facturas de FacturasManager:

Ahora simplemente necesitamos un método que ejecute lo anterior, como veis una simple case standalone:

  1. private static FacturasManager facturasManager;
  2.    public static void main(String[] args){
  3.       ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
  4.         facturasManager = (FacturasManager)ctx.getBean("factMan");
  5.         facturasManager.pintaFacturas();
  6.     }

Hemos desacoplado las clases Factura y FacturasManager, si en lugar de esas 3 instancias de facturas necesitáramos enviar un listado de las facturas de nuestra BD simplemente necesitaríamos modificar la inyección en el fichero .xml.

De esta forma también podremos integrar un montón de librerías externas.

2 July, 2008

Curso J2EE (8ª semana) struts2

Aunque este fin de semana pasado ya hemos terminado el curso, a mi todavía me queda contaros por encima el contenido de algunas semanas, que espero poder liquidar pronto, aquí va la 8ª, dedicada a struts2.

Otro framework, webwork, nació como un fork de struts añadiendo nuevas ideas y funcionalidades. Allá por el 2005 se anunció la fusión de struts con webwork. En ese momento nació struts2.

El primer cambio cuando pasamos de struts a struts 2 lo encontramos en la configuración de nuestro web.xml, ahora ya no utilizamos el conocido ActionServlet, ni especificamos la ruta de nuestro fichero de configuración struts-config.xml. En struts2 lo cambiamos por un DispatcherFilter que debemos definir en web.xml y será el encargado de gestionar nuestras acciones y de selccionar los interceptores a invocar:

  1. <filter>
  2.     <filter-name>struts2</filter-name>
  3.         <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
  4.     </filter>
  5.     <filter-mapping>
  6.         <filter-name>struts2</filter-name>
  7.         <url-pattern>/*</url-pattern>
  8.     </filter-mapping>
  9. </filter>

El fichero de configuración principal será struts.xml el cual podremos segmentar en tantos ficheros como deseemos para estructurar lo mejor posible nuestras acciones:

  1. <include file="administracion.xml"/>

Ahora nuestras acciones extienden de ActionSupport y aunque siempre acabamos necesitándolo no tenemos que acceder a la request para obtener nuestros parámetros sino que se encarga de hacerlo struts2 mediante inyección de dependencias, ya no necesitamos ActionForm.

Results predefinidos para devolver el estado de una accion, ERRORS, SUCESS,...

Tenemos una serie de interceptores predefinidos (validaciones, login, logger, etc) y podemos definir nuestros propios interceptores, deben extender de AbstractInterceptor y ser declarados en el fichero principal struts.xml.

  1. <interceptors>
  2.      <interceptor name="login" class="net.jsanroman.interceptors.LoginInterceptor"/>
  3.      <interceptor name="logger" class="net.jsanroman.interceptors.LogInterceptor"/>
  4.           <interceptor-stack name="comun">
  5.                <interceptor-ref name="login"></interceptor-ref>
  6.                <interceptor-ref name="logger"></interceptor-ref>
  7.                <interceptor-ref name="validation"></interceptor-ref>
  8.           </interceptor-stack>
  9. </interceptors>

y los asignamos a una acción, podemos asignar un stack o conjunto de interceptores directamente:

  1. <action name="doLogin" class="net.jsanroman.security.controller.LoginAction">
  2.        <interceptor-ref name="comun"></interceptor-ref>
  3.        <result name="input">/login/login.jsp</result>
  4.        <result name="error">/login/login.jsp</result>
  5.        <result>/login/login_ok.jsp</result>
  6. </action>

Añadido concepto de packages y namespace en la definición de acciones en nuestro xml para agrupar acciones:

  1. <package name="facturas" namespace="/facturas" extends="struts-default">
  2.       <action name="Pagar" class="net.jsanroman.security.controller.factura.PagarFacturaAction">
  3.             <result>/facturas/factura.jsp</result>
  4.       </action>
  5.       <action name="Cargar" class="net.jsanroman.common.controller.CargarFacturaAction">
  6.             <result name="error">/facturas/error.jsp</result>
  7.             <result>/facturas/factura.jsp</result>
  8.       </action>
  9. </package>

Nuevos tags para renderizar diferentes elementos html:

  1. <%@ taglib prefix="s" uri="/WEB-INF/struts-tags.tld" %>
  2.    <head><title>Nueva factura</title></head>
  3.    <body>
  4.     <s:form action="guardar" method="post">
  5.        <s:textfield label="Fecha" name="fecha" />
  6.        <s:textarea label="Concepto" name="concepto" rows="6" cols="35" />
  7.        <s:textfield label="Importe" name="importe" />
  8.        <s:submit value="Guardar"/>
  9.    </s:form>
  10.     </body>
  11.  </html>

Validaciones declarativas en xml, uno por acción, PagarFacturaAction-validation.xml

  1. <validators>
  2.      <field name="importe">
  3.           <field-validator type="requiredstring">
  4.               <param name="trim">true</param>
  5.                <message>Importe factura obligatorio</message>
  6.           </field-validator>
  7.      </field>
  8. </validators>

o mediante anotaciones:

  1. @Validation
  2. public class Factura {
  3.     private float importe;
  4.     @RequiredStringValidator(message="Importe factura obligatorio", key="validation.fieldRequeried")
  5.     public String getImporte() {
  6.         return importe;
  7.     }
  8. ...

Como veis muchos cambios, y muchos mas que nos quedan por descubrir.

http://www.infoq.com/minibooks/starting-struts2
http://struts.apache.org/2.x/

30 June, 2008

Mi wiki

Personal

Como comentaba hace unos días, aquí está el wiki accesible desde el menú superior.

¿Por que un wiki? pues porque es el medio perfecto para escribir artículos permanentes, actualizables, en los que la prioridad de sus enlaces no disminuye con el tiempo, el lugar perfecto para almacenar información a priori inclasificable, ya sabeis, en un wiki cabe todo. Lo contrario a un blog que es utilizado para contar cosas que suceden por momentos, en el que la relevancia de sus artículos se suele medir según el tiempo de vida de los mismos.

Este wiki es simple y modestamente una parte de mi centro de documentación, al igual que este blog, es por este motivo que a pesar de elegir mediawiki su edición es privada, para mi y las personas que yo decida.

¿Por que hacerlo público? y porque no, nada de lo que ahí escriba es confidencial, podré consultarlo y editarlo donde quiera y si a alguno de vosotros algún día le sirve de algo lo escrito pues mejor.

¿Por que mediawiki? simplemente por ser el que mas he utilizado y con el que estoy mas familiarizado, por la madurez del proyecto y porque el desarrollo está garantizado con la wikipedia detrás, o eso creemos.

Como veis he modificado el layout, ya sabeis "meticuloso-pejillero", si Isa, pejillero no tiene nada que ver con pajillero aunque suene mal jejeje, con pejillero quiero decir cuidadoso hasta el mas pequeño e inapreciable de los detalles ;-). Como dice el paisano Bodegas, "si la cocinera escribe almondigas todos nos entendemos ¿o no?".

Saludetes!

24 June, 2008

Hacks ie

Como veis me he puesto en plan diseñador-meticuloso-pejillero y gracias a los conocimientos de css/xhtml adquiridos en mi etapa de interacción he podido cambiar un poquillo el layout de este espacio.

Mas espacio en la columna de navegación, nuevo menú de navegación superior donde en los próximos días encontrareis un enlace al nuevo wiki, menos importancia al titulo de este blog (el cual me sigue sonrojando :$ estaba falto de ideas aquel día), el buscador en la cabecera, la nube de etiquetas y algunos cambios de colorines.

Como no podía ser de otra forma me topé con los siempre cojoneros problemas de visualización en ie. Este vez le tocaba a los bloques que contienen otros bloques flotantes. El bloque padre no se adapta a la altura de su contenido así que toca utilizar los hacks para ie6 y ie7.
Lo primero añadir las css con los bloques condicionales para los ie's.

  1. <!--[if IE 6]>
  2.      <style type="text/css">
  3.          @import url( /ie6.css );
  4.      </style>
  5. <![endif]-->
  6. <!--[if IE 7]>
  7.      <style type="text/css">
  8.          @import url( /ie7.css );
  9.      </style>
  10. <![endif]-->

Luego en ie6.css declaramos la altura del contenedor padre como:

  1. #header {
  2.     height:1%;
  3. }

Y para ie7.css así:

  1. #header {
  2.     display:inline-block;
  3. }

Esta vez he tenido suerte y no han sido necesarias mas personalizaciones.

21 June, 2008

Otro semestre fuera

Personal

Esta mañana a las 11:45 ya estaba fuera los 2 ex. de este semestre, y lo que es mejor, con posibilidades de aprobar los 2, aunque ahora mismo esto queda en un segundo plano hasta que sobre el 8 de julio aparezcan las calificaciones. A los 15min de salir ya estabamos por la playa de Riazor tomando el solete pues nos acompaña un buen dia de calor, ahora escribo desde el hotel y esta noche el amiguete Fran nos enseñará un poco mas de la noche coruñesa :-), y es que ahora es tiempo de disfrute.

Este semestre se avecinaba mas relajado que el anterior, para empezar era una asignatura menos (estructura información y análisis) y la de estructura la verdad es que me resultó bastante sencilla de llevar. Pero como uno siempre quiere abarcar mas de lo que puede entre estas asignaturas, el curso de j2ee, mi trabajo oficial, algún proyectillo personal que he tenido que dejar parado, y por no hablar de lo tremendamente compleja que me resultó análisis matemático (que vale por 2), al final acabé tan agobiado como en semestres anteriores.

Hoy ya terminamos exámenes, la semana siguiente terminamos curso j2ee, y ya me quedará tiempo para nuevos retos (tengo muchas ganas de ver algo de django&python, y de volver a montar un server casero y probar soluciones de virtualización), aunque antes tendré que quitar otras cosas de en medio, haber si tengo tiempo porque todo debera ser antes de que llegue otra vez septiembre-octubre y comience un nuevo semestre, seguro que mucho mas intenso que este.

5 June, 2008

Curso J2EE (6ª, 7ª semana) struts

Como ya te habrás dado cuenta estoy bastante retrasado con esta colección de artículos, este lo tengo pendiente desde hace varias semanas, y el próximo no creo que llegue hasta finales de junio que finalizo el semestre en la uoc con 2 puñeteros exámenes. Ese fin de semana lo aprovecharé para disfrutar de un par de días sabáticos por A Coruña, que ya va haciendo falta, y volver cargado de energía.

Estoy planteándome desde hace un tiempo instalar un wiki en este espacio para dejar estos ejemplos y otra información inclasificable bien documentada, cualquier decisión será después de los famosos exámenes, también te tendré al tanto.

Struts ya era un conocido para mi, lo había utilizado en interacción, la última vez hace unos meses antes de irme, por eso que pocas cosas me sorprendieron en esas semanas.

Comenzamos con las explicaciones básicas, un framework que cumple el modelo MVC, que cuenta con una madurez y estabilidad muy valorada por todos, que ha sido de los primeros en aparecer y que ha sido el framework con mayor acogida en el mundo j2ee hasta la fecha. Ahora ya le han salido contrincantes.

Continuamos con los ejemplos básicos, struts-config.xml donde configuramos la navegación, definimos los formularios, definimos nuestro servlet que actúa como controller. Como segregar la configuración de nuestras acciones en diferentes xml. Ejemplos de internacionalización, en ficheros .properties o en .xml. Definición y uso de los filtros de preprocesado, el patrón frontcontroller. El patrón Facade. ActionForm para la definición de nuestros formularios. Uso de las propias librerías de struts para las validaciones. Las plantillas tiles en struts.

En estas semanas ya posteriores a struts estamos viendo spring (el cual hemos aprovechado para introducirnos en la programación orientada a aspectos AOP), y hemos hecho un par de ejemplos con appfuse y struts2.

Como ves da para mucho, y mi tiempo es escaso, asi que mientras sigo pensando en la idea del wiki y en como dejar documentada toda esta información voy a centrarme en mi asignatura de "análisis matemático" que se me está haciendo muy cuesta arriba. Paciencia, en un par de semanas tendrás noticias mías.

4 June, 2008

Windows 7 multi-touch, ¿cual es la novedad?


Estos días han aparecido un montón de noticias sobre la futura versión windows 7, noticias que por momentos ocultan los peores augurios sobre vista, supongo que era el principal objetivo.

Dicen que windows 7 aparecerá a finales del 2009, pero dados los antecedentes todo el mundo aventura retraso. Dicen que la interacción con pantallas táctiles y otros dispositivos serán las grandes novedades. "Hoy casi toda la interacción es teclado-ratón, en los próximos años, el papel de la voz, la visión, la tinta -todos ellos- será enorme" palabra de Gates, y bien, supongo que si, una de las evoluciones podrá ir en esa línea.

Pero esto no es ninguna novedad. Ya no solo es apple y su iphone (donde mpx cobra todo el sentido del mundo, pero es un dispositivo diferente), también existen iniciativas en el mundo open source (http://wearables.unisa.edu.au/mpx/).

De acuerdo, la posibilidad de utilizar otros dispositivos agrega mayor interactividad a un S.O., pero ya, estas no son las bases. ¿Alguien cree que podremos prescindir de nuestro teclado+ratón?, no, ese no debe ser el fin, yo no me veo codificando a golpe de dedos en la pantalla por muy táctil que sea, ni imagino una oficina media con todos sus empleados charlando con la máquina y manoseando la pantalla, para jugar, la wii. El trabajo frente a un ordenador es mas solitario, requiere en la mayoría de los casos de grandes dosis de concentración. Claro que es posible que estén pensando en otros mercados.

Quizás este tipo de interactividad tenga a corto plazo un mercado mas amplio en el ámbito doméstico (dicen que también en hoteles, tiendas, lugares de ocio), las visualización de fotos, la música, los videos, los juegos de mesa, una pantalla táctil a la entrada del salón (podría ser), pero para esto se necesitarán nuevos dispositivos de hardware y no se si el mercado estará dispuesto a asumir tantos costes, todavía no conozco un hogar en mi circulo familiar y de amistades (posiblemente estemos muy retrasados) en el que exista un verdadero home media center con las vueltas que se le han dado ya.

Pero precisamente es en el ámbito doméstico donde microsoft está perdiendo menos usuarios, el vista sirve para lo que ellos quieren. El principal problema lo tienen en el mercado profesional, es aquí donde pierden usuarios o cuando menos donde no consiguen encajar a vista. Tienen la obligación de convencer a los profesionales de que su windows sigue siendo productivo, pero estarás conmigo en que convencer a estos usuarios con noticias como la que nos encontramos estos días es tremendamente complejo, hace tiempo que necesitan hechos consumados, trabajo bien hecho, y no mas campañas de marketing. Si windows 7 trae consigo otras mejoras mas significativas aunque menos espectaculares deberían anunciarlas, pero si este es el hecho mas destacable del futuro windows, posiblemente seguiremos presenciando el declive del todavía mayor fabricante de software del mundo.

Powered by WordPress
Bajo licencia Creative Commons
Contacto sanroman.javier at gmail.com