Migrando de JSF 1.2 a JSF 2.0

Estoy trabajando con una aplicación bastante grande escrita en JSF 1.2 . JSF 1.2 tiene alrededor de 6 años ahora. Necesito actualizar a JSF 2.0. ¿Cuán doloroso será esto? Noté que algunos atributos en las tags personalizadas se han cambiado, etc.

Dolor

La penuria de la actualización de JSF 1.2 a 2.0 depende de la tecnología de visualización que esté utilizando actualmente y que desee utilizar.

  • JSP 2.x a JSP 2.x = Casi sin esfuerzo.
  • Facelets 1.x a Facelets 2.0 = Poco esfuerzo.
  • JSP 2.x a Facelets 2.0 = Mucho esfuerzo. Duplique esto si también tiene componentes personalizados.

Cambios básicos

Independientemente del switch de tecnología de vista, al menos se deben hacer los siguientes pasos:

  • Elimine JAR JSF 1.2 de /WEB-INF/lib (si hay).
  • Quite JSF 2.0 JAR en /WEB-INF/lib (si JSF 1.2 recibió servletcontainer, puede cambiar la política de carga de clases para cargar primero las bibliotecas de aplicaciones antes de las bibliotecas servletcontainer, consulte también problemas de carga de clases JSF2 en los servidores de aplicaciones ).
  • Actualice la statement raíz de faces-config.xml para cumplir con la especificación JSF 2.0.

      
  • Asegúrese de que la statement raíz de web.xml ya cumpla al menos Servlet 2.5. JSF 2.0 no funcionará en 2.4 o inferior ( aunque es pirateable ).

      

JSP 2.x a JSP 2.x

Si está utilizando JSP 2.x y quiere seguir usándolo, básicamente no necesita cambiar nada más.

Mejora gradual

Si ya está usando un sufijo url-pattern para FacesServlet , como *.jsf , entonces es bueno saber que FacesServlet primero escaneará el archivo *.xhtml y, si no está presente, entonces buscará el archivo *.jsp . Esto le brinda espacio para convertir gradualmente de JSP a Facelets detrás de las escenas sin cambiar las URL.

Pero si usa un prefijo url-pattern , como /faces/* y desea actualizar gradualmente desde JSP a Facelets, entonces realmente tiene que cambiarlo a *.jsf y posiblemente también a todos los enlaces en las páginas JSP existentes.

Solo debe tener en cuenta que la nueva navegación implícita de JSF 2.0 no busca la presencia del archivo, de todos modos irá a outcome.xhtml . Por lo tanto, si quiere proceder o ir a *.jsp , aún debe incluirlo en el viewid de la manera JSF 1.x.


Facelets 1.x a Facelets 2.0

Si está utilizando Facelets 1.x como tecnología de visualización y desea usar los Facelets 2.0 proporcionados por JSF 2.0 , debe seguir estos pasos adicionales:

  • Retire Facelets 1.x JAR de /WEB-INF/lib .
  • Retire Facelets 1.x FaceletViewHandler de faces-config.xml .
  • Cualquier implementación personalizada de FaceletViewHandler necesita actualizarse para extender ViewHandlerWrapper en ViewHandlerWrapper lugar.
  • No es necesario, pero solo para la limpieza, elimine los valores relacionados de Facelets 1.x de web.xml que ya están predeterminados en Facelets 2.0, como javax.faces.DEFAULT_SUFFIX con valor de *.xhtml .
  • Actualice la statement de raíz de los XML taglib de Facelet existentes para cumplir con Facelets 2.0.

      

Eso debería ser básicamente eso.


JSP 2.x para Facelets 2.0

Si está utilizando JSP 2.x como tecnología de visualización y desea actualizar a Facelets 2.0 inmediatamente, entonces necesita hacer muchos cambios antes de que el sitio pueda comenzar. Básicamente estás cambiando la tecnología de vista aquí.

Cambios de página maestra

En cada página maestra, debe cambiar la siguiente plantilla JSP básica.

 < %@page contentType="text/html" pageEncoding="UTF-8"%> < %@taglib prefix="f" uri="http://java.sun.com/jsf/core"%> < %@taglib prefix="h" uri="http://java.sun.com/jsf/html"%> < !DOCTYPE html>    JSP page       

..para la siguiente plantilla básica de Facelets:

 < !DOCTYPE html>   XHTML page      

Incluir cambios de página

Si sus páginas JSP existentes están bien diseñadas, no debe tener ninguna línea de código scriptlet y también debe tener solo como la única etiqueta específica de JSP. Cualquiera de esos debe ser cambiado de:

  

a

  

El JSP básico incluye la plantilla de página de ..

 < %@page contentType="text/html" pageEncoding="UTF-8"%> < %@taglib prefix="f" uri="http://java.sun.com/jsf/core"%> < %@taglib prefix="h" uri="http://java.sun.com/jsf/html"%>    

..deben cambiarse a las siguientes Facelets básicas incluyen la plantilla de página:

    

Cambios de componentes personalizados

Debe cambiar los archivos JSP TLD a archivos Facelets TLD como se describe en esta Guía de migración de Mojarra .


Secuelas

Independientemente del enfoque de migración, puede eliminar gradualmente faces-config.xml por las nuevas anotaciones JSF 2.0. Cualquier puede ser anotado por @ManagedBean :

 @ManagedBean(name="managedBeanName") @RequestScoped public class SomeBean {} 

Junto a @RequestScoped , también están disponibles @ViewScoped , @SessionScoped y @ApplicationScoped . Si omite el atributo de name de @ManagedBean , se establecerá de forma predeterminada en classname con el primer carácter char en minúscula.

 @ManagedBean @RequestScoped public class SomeBean {} 

En este ejemplo particular, será #{someBean} .

Cualquier se puede anotar usando @ManagedProperty :

 @ManagedProperty("#{otherBean}") private OtherBean otherBean; 

Cualquier puede ser anotado usando @FacesValidator :

 @FacesValidator("someValidator") public class SomeValidator implements Validator {} 

Cualquier se puede anotar usando @FacesConverter

 @FacesConverter("someConverter") public class SomeConverter implements Converter {} 

Cualquier puede ser anotado usando @FacesRenderer

 @FacesRenderer(componentFamily="someComponentFamily", rendererType="someRendererType") public class SomeRenderer extends Renderer {} 

Se puede eliminar cualquier que use el nombre de archivo de la página XHTML como y ya que esto se hará implícitamente . Esto se puede hacer gradualmente cambiando todos los valores de resultado para que coincidan con el nombre de archivo de la vista de destino.

Finalmente, cualquier bean con ámbito de sesión que haya sido puesto en la sesión con el único motivo de retener los datos del bean en las solicitudes subsiguientes en la misma pestaña / ventana se puede marcar mejor como @ViewScoped , porque de esta forma el bean no se verá afectado cuando el enduser abre la misma página en diferentes tabs / ventanas.


Bibliotecas de componentes

Tenga en cuenta que no tomo en cuenta ninguna biblioteca de componentes de terceros como PrimeFaces / RichFaces / IceFaces. En esta respuesta, sería imposible escribir una respuesta confiable, ya que básicamente se reduce a “depende”. En general, es suficiente actualizar la biblioteca de componentes a una versión compatible con JSF 2.0, según lo que indiquen las instrucciones. Lo mejor es simplemente escribir pruebas unitarias, ejecutarlas antes y después de la actualización y solucionar cualquier problema individualmente.

Aquí hay al menos algunos enlaces útiles con respecto a la migración de la biblioteca de componentes específicos:

  • Guía de migración de RichFaces: migración de 3.3.x a 4.x
  • IceFaces 2 Wiki – IceFaces 1.x Guía de compatibilidad

PrimeFaces no tiene una guía de migración para PrimeFaces 1.xa 2.x ya que PrimeFaces 1.x ya requiere Facelets 1.x, por lo que solo debe seguir los pasos de migración de Facelets 1.xa 2.x. Sin embargo, hay una guía de migración de PrimeFaces 2.xa 3.x que también se puede aplicar a la migración de PrimeFaces 1.xa 3.x. Tomahawk tampoco tiene una guía de migración. Básicamente, lo único que debe cambiar son los JAR y, si es necesario, deshacerse de todas las referencias de en un bean con ámbito de solicitud haciendo que la vista del bean un scope.

Una cosa para mencionar es que si alguien está utilizando JSTL con JSF 1.2 entonces al actualizar a JSF2 debe cambiar el espacio de nombres de:

http://java.sun.com/jstl/core

a:

http://java.sun.com/jsp/jstl/core

JSF 2.0 tiene muchas características y componentes nuevos y no creo que la migración sea dolorosa. La única área que le resultará difícil es usar las bibliotecas de terceros. Si su aplicación depende en gran medida de bibliotecas como Richfaces, entonces tendrá problemas. No todos los componentes de Richfaces 3 están portados a Richfaces 4.

Esto también podría ayudar a la migración de la aplicación JSF 1.2 a JSF 2.0

También verifique esto ¿Qué hay de nuevo en JSF 2?

Web.xml

  Add the jars 1. jsf-api-2.0.jar 2. jsf-impl.2.0.2.jar 

Paso 1: Cambiar web.xml

   facesServlet javax.faces.webapp.FacesServlet 1   facesServlet /faces/*   facesServlet *.jsf   facesServlet *.faces   facesServlet *.xhtml  

Paso 2: webmvc-config.xml

        

Paso 3: facess-config.xml

  

Si está utilizando Apache Trinidad, también deberá actualizarlo a la versión 2.0 para que sea compatible con JSF 2.0. Hay más información en Hacker’s Valhalla .