Migración de JSF 1.2 a JSF 2.0

12 minutos de lectura

Migracion de JSF 12 a JSF 20
mkoryak

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. ¿Qué tan doloroso será esto? Noté que se han cambiado algunos atributos en las etiquetas personalizadas, etc.

1646971631 335 Migracion de JSF 12 a JSF 20
BalusC

dolor

Lo doloroso de actualizar 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. Doble esto si también tiene componentes personalizados.

Cambios básicos

Independientemente del cambio de tecnología de visualización, por lo menos se deben realizar los siguientes pasos:

  • Eliminar JSF 1.2 JAR de /WEB-INF/lib (Si alguna).
  • Coloque JSF 2.0 JAR en /WEB-INF/lib (si se suministró JSF 1.2 como servletcontainer, es posible que desee cambiar la política de carga de clases para cargar primero las bibliotecas de aplicaciones web antes que las bibliotecas de servletcontainer; consulte también Problemas de carga de clases de 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">
    

    Nota: cuando utilice JSF 2.2 o posterior, utilice el http://xmlns.jcp.org dominio de espacio de nombres en lugar de http://java.sun.com a lo largo del fragmento XML anterior.

  • Asegúrese de que la declaración raíz de web.xml ya cumple por lo 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">
    

    Nota: cuando esté usando Servlet 3.0 o más reciente, use el http://xmlns.jcp.org dominio de espacio de nombres en lugar de http://java.sun.com a lo largo del fragmento XML anterior.


JSP 2.x a JSP 2.x

si estás usando JSP 2.x y quiero mantenerse usándolo, entonces básicamente no necesita cambiar nada más.

Mejorando gradualmente

Si ya estás usando un sufijo url-pattern Para el FacesServletme gusta *.jsfentonces es bueno saber que el FacesServlet primero buscará *.xhtml archivo y si no está presente, busque *.jsp expediente. Esto le brinda espacio para convertir gradualmente de JSP a Facelets detrás de escena sin cambiar las URL.

Pero si estás usando un prefijo url-patternme gusta /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 el nuevo JSF 2.0 provisto de navegación implícita no busca la presencia del archivo, irá a outcome.xhtml de todos modos. Así que si quieres venir o ir a *.jspentonces aún debe incluirlo en viewid de la manera JSF 1.x.


Facetas 1.x a Facetas 2.0

si estás usando Facetas 1.x como ver la tecnología y desea utilizar el JSF 2.0 suministrado Facetas 2.0entonces debe realizar los siguientes pasos adicionales:

  • Eliminar Facelets 1.x JAR de /WEB-INF/lib.
  • Quitar facetas 1.x FaceletViewHandler desde faces-config.xml.
  • Cualquier costumbre FaceletViewHandler la implementación necesita ser actualizada para extender ViewHandlerWrapper en lugar de.
  • No es necesario, pero solo para la limpieza, elimine cualquier Facelets 1.x relacionado <context-param> valores de web.xml que ya están por defecto en Facelets 2.0, como el javax.faces.DEFAULT_SUFFIX con valor de *.xhtml.
  • Actualice la declaración de raíz de los XML existentes de Facelet taglib 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">
    

    Nota: cuando utilice JSF 2.2 o posterior, utilice el http://xmlns.jcp.org dominio de espacio de nombres en lugar de http://java.sun.com a lo largo del fragmento XML anterior.

Eso debería ser básicamente.


JSP 2.x a Facelets 2.0

si estás usando JSP 2.x como ver la tecnología y desea actualizar a Facetas 2.0 inmediatamente, entonces debe hacer muchos cambios antes de que el sitio pueda publicarse. Básicamente estás cambiando la tecnología de vista aquí.

Cambios en la 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>

..a 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>

Nota: cuando utilice JSF 2.2 o posterior, utilice el http://xmlns.jcp.org dominio de espacio de nombres en lugar de http://java.sun.com a lo largo de los fragmentos XHTML anteriores.

Incluir cambios de página

Si sus páginas JSP existentes están bien diseñadas, no debería tener ninguna línea de guion código y también debe tener sólo el <jsp:include> como la única etiqueta específica de JSP. Cualquiera de esos necesita ser cambiado de:

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

para

<ui:include src="https://stackoverflow.com/questions/4441713/include.xhtml" />

El JSP básico incluye 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>

..debería cambiarse a la siguiente plantilla de página básica de Facelets:

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

Nota: cuando utilice JSF 2.2 o posterior, utilice el http://xmlns.jcp.org dominio de espacio de nombres en lugar de http://java.sun.com a lo largo de los fragmentos XHTML anteriores.

Cambios de componentes personalizados

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


Secuelas

Independientemente del enfoque de migración, puede eliminar gradualmente el faces-config.xml por las nuevas anotaciones JSF 2.0 o incluso CDI. Ninguna <managed-bean> puede ser anotado por @ManagedBean:

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

Junto a @RequestScopedtambién hay @ViewScoped, @SessionScoped y @ApplicationScoped disponible. Si omite el name atributo de la @ManagedBeanentonces se establecerá de forma predeterminada en el nombre de clase con el primer carácter en minúsculas.

@ManagedBean
@RequestScoped
public class SomeBean {}

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

Ninguna <managed-property> se puede anotar usando @ManagedProperty:

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

Ninguna <validator> se puede anotar usando @FacesValidator:

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

Ninguna <converter> se puede anotar usando @FacesConverter

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

Ninguna <renderer> se puede anotar usando @FacesRenderer

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

Ninguna <navigation-case> que usa el nombre de archivo de la página XHTML como <from-outcome> y <to-view-id> se puede eliminar ya que esto será implícitamente hecho. 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 haya colocado en la sesión con el único motivo de retener los datos del bean en solicitudes posteriores en la misma pestaña/ventana se puede marcar mejor @ViewScopedporque de esta manera 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 de componentes 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, es suficiente simplemente actualizar la biblioteca de componentes a una versión compatible con JSF 2.0, verificada por ellos mismos, 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íficos:

PrimeFaces no tiene una guía de migración para PrimeFaces 1.x a 2.x, ya que PrimeFaces 1.x ya requiere Facelets 1.x, por lo que solo tiene que seguir los pasos de migración de Facelets 1.x a 2.x. Sin embargo, hay un PrimeFaces Guía de migración de 2.x a 3.x (y superior) que podría aplicarse también al migrar de PrimeFaces 1.x a 3.x (o superior). Tomahawk tampoco tiene una guía de migración. Básicamente, lo único que necesita cambiar son los JAR y, si es necesario, deshacerse de todos <t:saveState> referencias en un bean con ámbito de solicitud haciendo que la vista del bean tenga un ámbito.

  • @ManagedBean(name=”managedBeanName”) @RequestScoped Es 🙂

    – Daniel Szalay

    29 de enero de 2011 a las 10:25


  • excelente publicación, me ayudó mucho. Algo a tener en cuenta: al pasar de jsf 1.2 a jsf 2, puede estar casi seguro de que las personas han usado a4j de richfaces 3.3.x. Decidí usar richfaces 3.3.3 junto con jsf 2 porque parecía un cambio mediocre para actualizar a richfaces 4.x. Así que hice su guía (deshacer todas las cosas relacionadas con las facetas en la configuración de caras (el controlador de vista activado eliminó la anotación de taglig), luego seguí community.jboss.org/wiki/RichFaces333AndJSF20 y finalmente tuve que hacer esto stackoverflow.com/questions/85532/…

    – toscano

    29 de diciembre de 2011 a las 19:19


  • Gran respuesta. En mi caso también tuve que configurar el javax.faces.VALIDATE_EMPTY_FIELDS parámetro a false para ordenar la validación. Ver también: stackoverflow.com/questions/6113935/…

    –Jasper de Vries

    9 de julio de 2014 a las 13:07

  • También puedo recomendar a todos que lean balusc.blogspot.nl/2011/09/communication-in-jsf-20.html

    –Jasper de Vries

    11 de julio de 2014 a las 9:33

  • @Cfold: arreglé el enlace.

    – BalusC

    28 de febrero de 2019 a las 8:27

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

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

para:

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

  • Nota: esto se aplica solo cuando está migrando de Facelets 1.x a 2.x.

    – BalusC

    24 de mayo de 2013 a las 13:26


  • Y para 2.2 y versiones posteriores, lea stackoverflow.com/questions/31068678/…

    – Kukeltje

    26 de junio de 2020 a las 16:19

Migracion de JSF 12 a JSF 20
mvg

JSF 2.0 tiene muchas características y componentes nuevos y no creo que la migración sea dolorosa. La única área en la que encontrará dificultades es en el uso de bibliotecas de terceros. Si su aplicación depende en gran medida de bibliotecas como Richfaces, 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 revisa esto ¿Qué hay de nuevo en JSF 2?

  • Habría sido lo mismo cuando usa Richfaces con JSF 1.x: pasa por todo el “dolor” para descubrir cómo integrar componentes de terceros con JSF. El enfoque de JSF 2.x no es diferente. Esa es la “alegría” de la programación, ¿no? 🙂

    – Chuong Pham

    21 de abril de 2011 a las 4:56

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">

1646971632 333 Migracion de JSF 12 a JSF 20
designar nulo

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 Valhalla de hackers.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad