Saltar al contenido

Migración de JSF 1.2 a JSF 2.0

Solución:

Dolor

El dolor 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.xa JSP 2.x = Casi sin esfuerzo.
  • Facelets 1.xa Facelets 2.0 = Poco esfuerzo.
  • JSP 2.xa Facelets 2.0 = Mucho esfuerzo. Duplique esto si también tiene componentes personalizados.

Cambios básicos

Independientemente del cambio de tecnología de vista, por lo menos Deben realizarse los siguientes pasos:

  • Eliminar JSF 1.2 JAR de /WEB-INF/lib (Si alguna).
  • 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 las bibliotecas de aplicaciones web primero antes que las bibliotecas de servletcontainer, consulte también Problemas de carga de clases de JSF2 en los 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 esté usando JSF 2.2 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.

  • 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 versiones anteriores (aunque se puede piratear).

    <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.xa JSP 2.x

Si estas usando JSP 2.x y quiero guardar usándolo, entonces básicamente no necesita cambiar nada más.

Mejorando gradualmente

Si ya está usando un sufijo url-pattern Para el FacesServlet, igual que *.jsf, entonces 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 entre bastidores sin cambiar las URL.

Pero si usa un prefijo url-pattern, igual que /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 necesita 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 todas formas. Entonces, si quieres venir o ir a *.jsp, entonces todavía necesita incluirlo en el viewid de la forma JSF 1.x.


Facelets 1.xa Facelets 2.0

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

  • Eliminar Facelets 1.x JAR de /WEB-INF/lib.
  • Quitar Facelets 1.x FaceletViewHandler de 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 predeterminados en Facelets 2.0, como el javax.faces.DEFAULT_SUFFIX con valor de *.xhtml.
  • Actualice la declaración 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">
    

    Nota: cuando esté usando JSF 2.2 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.

Básicamente debería ser así.


JSP 2.xa Facelets 2.0

Si estas usando JSP 2.x como tecnología de visualización y desea actualizar a Facelets 2.0 de inmediato, debe realizar muchos cambios antes de que el sitio pueda estar disponible. Básicamente, estás cambiando la tecnología de visualización 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 esté usando JSF 2.2 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 de los fragmentos de 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 scriptlet código y también debe tener solo el <jsp:include> como la única etiqueta específica de JSP. Cualquiera de esos debe cambiarse de:

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

para

<ui:include src="https://foroayuda.es/include.xhtml" />

La JSP básica 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>

..debe cambiarse a la siguiente plantilla básica de página de inclusión 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 esté usando JSF 2.2 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 de los fragmentos de XHTML anteriores.

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 el faces-config.xml por las nuevas anotaciones JSF 2.0 o incluso CDI. Alguna <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 name atributo del @ManagedBean, entonces 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}.

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

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

Alguna <validator> se puede anotar usando @FacesValidator:

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

Alguna <converter> se puede anotar usando @FacesConverter

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

Alguna <renderer> se puede anotar usando @FacesRenderer

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

Alguna <navigation-case> que usa el nombre de archivo de la página XHTML como ambos <from-outcome> y <to-view-id> se puede eliminar 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 haya puesto en la sesión con la única razón de retener los datos del bean en solicitudes posteriores en la misma pestaña / ventana se puede marcar mejor @ViewScoped, porque 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 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 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 escribir pruebas unitarias, ejecutarlas antes y después de la actualización y solucionar los problemas de forma individual.

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.xa 4.x
  • IceFaces 2 Wiki – Guía de compatibilidad de IceFaces 1.x

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 tiene que 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 (y superior) que podría aplicarse también en la migración de PrimeFaces 1.xa 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 ámbito.

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

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

para:

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 el uso de bibliotecas de terceros. Si su aplicación depende en gran medida de bibliotecas como Richfaces, se enfrentará a un problema. No todos los componentes de Richfaces 3 se transfieren a Richfaces 4.

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

Compruebe también esto ¿Qué hay de nuevo en JSF 2?

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *