java jsf migration jsf-2

java - Migrando de JSF 1.2 a JSF 2.0



migration jsf-2 (5)

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 etiquetas 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 declaración raíz de faces-config.xml para cumplir con la especificación JSF 2.0.

    <faces-config xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd" version="2.0">

  • Asegúrese de que la declaración 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 ).

    <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="YourWebappID" version="2.5">

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 <context-param> 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 declaración de raíz de los XML taglib de Facelet existentes para cumplir con Facelets 2.0.

    <facelet-taglib xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0.xsd" version="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> <f:view> <html lang="en"> <head> <title>JSP page</title> </head> <body> <h:outputText value="JSF components here." /> </body> </html> </f:view>

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

<!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/1999/xhtml" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" xmlns:ui="http://java.sun.com/jsf/facelets"> <h:head> <title>XHTML page</title> </h:head> <h:body> <h:outputText value="JSF components here." /> </h:body> </html>

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 <jsp:include> como la única etiqueta específica de JSP. Cualquiera de esos debe ser cambiado de:

<jsp:include page="include.jsp" />

a

<ui:include src="include.xhtml" />

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"%> <f:subview id="include"> <h:outputText value="JSF components here." /> </f:subview>

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

<ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" xmlns:ui="http://java.sun.com/jsf/facelets"> <h:outputText value="JSF components here." /> </ui:composition>

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 eliminate gradualmente faces-config.xml por las nuevas anotaciones JSF 2.0. Cualquier <managed-bean> 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 <managed-property> se puede anotar usando @ManagedProperty :

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

Cualquier <validator> puede ser anotado usando @FacesValidator :

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

Cualquier <converter> se puede anotar usando @FacesConverter

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

Cualquier <renderer> puede ser anotado usando @FacesRenderer

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

Se puede eliminar cualquier <navigation-case> que use el nombre de archivo de la página XHTML como <from-outcome> y <to-view-id> ya que esto se hará implicitly . 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 pestañas / 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:

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 <t:saveState> en un bean con ámbito de solicitud haciendo que la vista del bean <t:saveState> un alcance.


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?


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 .



Web.xml

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

Paso 1: Cambiar web.xml

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <servlet> <servlet-name>facesServlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>facesServlet</servlet-name> <url-pattern>/faces/*</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>facesServlet</servlet-name> <url-pattern>*.jsf</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>facesServlet</servlet-name> <url-pattern>*.faces</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>facesServlet</servlet-name> <url-pattern>*.xhtml</url-pattern> </servlet-mapping>

Paso 2: webmvc-config.xml

<!-- Handles requests mapped to the Spring Web Flow system --> <bean id="flowController" class="org.springframework.webflow.mvc.servlet.FlowController"> <property name="flowExecutor" ref="flowExecutor" /> <property name="ajaxHandler"> <bean class="org.springframework.faces.webflow.JsfAjaxHandler" /> </property> </bean>

Paso 3: facess-config.xml

<faces-config xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd" version="2.0">