13 July, 2008

Curso J2EE (15ª,16ª semana) JSF

Después de varias semanas con spring cambiamos de tercio y nos adentramos en otro framework java, jsf (java server faces). Mi experiencia con jsf se había reducido ya hace tiempo al trabajo con jbpm pero había profundizado muy poco.

Jsf es el estándar propuesto por sun para el desarrollo de aplicaciones web en j2ee, sus especificaciones se definen en los siguientes jsr JSR 127, JSR 252, JSR 276.
Como toda especificación definida por sun encontraremos diversos proyectos que la implementan: MyFaces, backbase, ice-faces, adf-faces , richfaces, jsf-extensions, etc...

La mayor novedad en jsf respecto a otros frameworks es el concepto de componente/evento, así emulando al desarrollo bajo swing por ejemplo tendremos componentes para crear menús, listas, arboles, componentes que nos aportan funcionalidades bajo ajax y tendremos la posibilidad de crear nuestros propios componentes en caso de ser necesario.

Para comenzar a utilizar jsf necesitaremos modificar nuestro web.xml indicando el servlet que gestionará todas nuestras peticiones jsf:

  1. <servlet>
  2.         <servlet-name>Faces Servlet</servlet-name>
  3.         <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
  4.         <load-on-startup>1</load-on-startup>
  5.     </servlet>
  6.     <servlet-mapping>
  7.         <servlet-name>Faces Servlet</servlet-name>
  8.         <url-pattern>*.jsf</url-pattern>
  9.     </servlet-mapping>

Por supuesto no nos libraremos de los ficheros de configuración xml, en jsf este fichero será faces-config.xml, en el declaramos por ejemplo todas las reglas de navegación, y los beans de nuestro modelo.

  1. <faces-config>
  2.   <managed-bean>
  3.     <managed-bean-name>facturaBean</managed-bean-name>
  4.     <managed-bean-class>net.jsanroman.beans.FacturaBean</managed-bean-class>
  5.     <managed-bean-scope>request</managed-bean-scope>
  6.   </managed-bean>
  7.  
  8.   <navigation-rule>
  9.     <from-view-id>/factura.jsp</from-view-id>
  10.     <navigation-case>
  11.       <from-outcome>error</from-outcome>
  12.       <to-view-id>/WEB-INF/factura.jsp</to-view-id>
  13.     </navigation-case>
  14.     <navigation-case>
  15.       <from-outcome>success</from-outcome>
  16.       <to-view-id>/WEB-INF/facturas.jsp</to-view-id>
  17.     </navigation-case>
  18.   </navigation-rule>

En jsf los controles de la vista lanzarán eventos listener y estos serán implementados por los métodos de los respectivos beans:

  1. ...
  2.   <h:selectBooleanCheckbox
  3.            valueChangeListener="#{facturaBean.aplicaDescuento}"
  4.            onclick="submit()"
  5.            immediate="true"/>
  6.  
  7.   <h:commandButton
  8.     value="Guardar"
  9.     actionListener="#{facturaBean.save}"
  10.     immediate="true"/>
  11. ...

Crear nuestros propios componentes jsf puede resultar al principio un poco complejo pero una vez sabemos la mecánica será siempre igual, la complejidad entonces vendrá dada por el componente que necesitemos crear:
- Crear la clase que represente a nuestro componente, que extenderá de UIComponentBase.
- Crear la clase que represente a los tags necesarios para incluir nuestro componente en la vista y que extenderá de UIComponentTag.
- Creamos el tld que defina nuestro componente.
- Y lo incluimos en faces-config.xml de la forma:

  1. <component>
  2.      <component-type>net.jsanroman.JsfHolaMundo</component-type>
  3.      <component-class>net.jsanroman.component.HolaMundoUIComp</component-class>
  4. </component>

Para finalizar estas 2 semanas hemos probado varios componentes de myfaces que integran funcionalidades ajax, y como no!, hemos integrado spring con jsf.

Una buena comparativa entre struts y jsf.

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