Migración 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. Necesito actualizar a JSF 2.0. ¿Qué tan doloroso será esto? Me di cuenta de que algunos atributos en las etiquetas personalizadas se han cambiado, etc.

Author: BalusC, 2010-12-14

5 answers

Dolor

La dificultad de actualizar JSF 1.2 a 2.0 depende de la tecnología de vista que esté utilizando actualmente y que desee usar.

  • JSP 2.x a JSP 2.x = Casi ningún 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 interruptor de tecnología de vista, al menos el se deben hacer los siguientes pasos:

  • Remove JSF 1.2 JAR's from /WEB-INF/lib (if any).
  • Coloque JSF 2.0 JAR en /WEB-INF/lib (si JSF 1.2 fue suministrado por servletcontainer, es posible que desee cambiar la política de carga de clases para cargar bibliotecas de aplicaciones web primero antes que las bibliotecas de servletcontainer, consulte también Problemas de carga de clases JSF2 en servidores de aplicaciones).
  • Actualizar 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 raíz la declaración de web.xml ya cumple al menos el Servlet 2.5. JSF 2.0 no funcionará en 2.4 o inferior ( aunque es hackeable).

    <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 desea mantener usándolo, entonces básicamente no necesita cambiar nada más.

Actualización gradual

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

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

Solo debe tener en cuenta que la nueva JSF 2.0 proporciona la navegación implícita no busca la presencia del archivo, irá a outcome.xhtml de todos modos. Así que si quieres venir desde o ir a *.jsp, entonces todavía necesitas incluirlo en el viewid el JSF 1.x way.


Facelets 1.x a Facelets 2.0

Si está usando Facelets 1.x como tecnología de vista y desea utilizar el JSF 2.0 suministrado Facelets 2.0 , entonces debe hacer los siguientes pasos adicionales:

  • Eliminar las facetas 1.x TARRO de /WEB-INF/lib.
  • Eliminar las facetas 1.x FaceletViewHandler de faces-config.xml.
  • Cualquier implementación personalizada FaceletViewHandler debe actualizarse para ampliar ViewHandlerWrapper en su lugar.
  • No es necesario, pero solo para la limpieza, retire las facetas 1.x relacionados <context-param> valores de web.xml que ya están por defecto en Facelets 2.0, como el javax.faces.DEFAULT_SUFFIX con el valor de *.xhtml.
  • Actualizar la declaración raíz de los XML Facelet taglib 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 básicamente sea.


JSP 2.x a Facelets 2.0

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

Cambios en la página maestra

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

<%@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>

To a las siguientes facetas básicas plantilla:

<!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 la <jsp:include> como la única etiqueta específica de JSP. Cualquiera de ellos necesita 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>

..se debe cambiar a las siguientes facetas básicas incluyen 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>

Componente Personalizado cambios

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


Consecuencias

Independientemente del enfoque de migración, puede eliminar gradualmente el faces-config.xml mediante 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 hay @ViewScoped, @SessionScoped y @ApplicationScoped disponible. Si omite el atributo name del @ManagedBean, entonces por defecto será classname con el 1st char en minúsculas.

@ManagedBean
@RequestScoped
public class SomeBean {}

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

Cualquier <managed-property> puede ser anotado usando @ManagedProperty:

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

Cualquier <validator> puede ser anotado usando @FacesValidator:

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

Cualquier <converter> puede ser anotado 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 {}

Cualquier <navigation-case> que use el nombre de archivo de la página XHTML como <from-outcome> y <to-view-id> puede eliminarse 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 se puso en la sesión con la única razón para retener los datos de bean en solicitudes posteriores en la misma pestaña/ventana puede marcarse mejor @ViewScoped, porque esto de manera que el bean no se verá afectado cuando el usuario final abra la misma página en diferentes pestañas/ventanas.


Bibliotecas de componentes

Tenga en cuenta que no tomo en cuenta ninguna biblioteca componant de terceros como PrimeFaces/RichFaces/ICEfaces en esta respuesta, entonces sería imposible escribir una respuesta confiable ya que básicamente se reduce a "depende". En general, basta con actualizar la biblioteca de componentes a una versión compatible con JSF 2.0 verificada por ellos mismos como según sus 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ífica:

PrimeFaces no tiene una guía de migración para PrimeFaces 1.x a 2.x como PrimeFaces 1.x requiere Facelets 1.x ya, así que solo tienes que seguir Facelets 1.x a 2.x pasos de migración. Sin embargo, hay un PrimeFaces 2.x a 3.x migration guide que podría aplicarse también en la migración desde PrimeFaces 1.x a 3.x. Tomahawk tampoco tiene guía de migración. Básicamente, lo único que necesita cambiar son los frascos y, si es necesario, deshacerse de todas las referencias <t:saveState> en una solicitud con ámbito bean haciendo que la vista bean tenga ámbito.

 236
Author: BalusC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:54:50

Una cosa a mencionar es que si alguien está usando 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

 5
Author: Rafal G.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-24 11:39:17

JSF 2.0 tiene muchas características y componentes nuevos y no creo que la migración sea dolorosa. El único área que encontrará difícil es usar las bibliotecas de terceros. Si su aplicación depende en gran medida de bibliotecas como Richfaces, entonces se enfrentará a un problema. No todos los componentes de Richfaces 3 se portan a Richfaces 4.

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

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

 4
Author: mvg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:34:40

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">
 2
Author: Pravin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-20 06:45:35

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

 0
Author: designatevoid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-17 03:23:01