Migración de JSF 1.2 a JSF 2.0

136

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

mkoryak
fuente

Respuestas:

245

Dolor

La dificultad de actualizar JSF 1.2 a 2.0 depende de la tecnología de visualización que esté usando actualmente y que quiera usar.

  • JSP 2.xa 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 cambio de tecnología de vista, al menos se deben realizar los siguientes pasos:

  • Elimine JSF 1.2 JAR de /WEB-INF/lib(si corresponde).
  • Coloque los JAR JSF 2.0 /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 de las bibliotecas de servletcontainer, consulte también Problemas de carga de clases JSF2 en servidores de aplicaciones ).
  • Actualice la declaración raíz de faces-config.xmlcumplir 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 use JSF 2.2 o más reciente, use el http://xmlns.jcp.orgdominio de espacio de nombres en lugar de en http://java.sun.comtodo el fragmento XML anterior.

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

    Nota: cuando usa Servlet 3.0 o más reciente, use el http://xmlns.jcp.orgdominio de espacio de nombres en lugar de en http://java.sun.comtodo el fragmento XML anterior.


JSP 2.xa JSP 2.x

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

Mejora gradual

Si ya está utilizando un sufijo url-patternpara FacesServlet, como *.jsf, entonces es bueno saber que FacesServletprimero buscará el *.xhtmlarchivo y, si no está presente, luego buscará el *.jsparchivo. Esto le brinda espacio para convertir gradualmente de JSP a Facelets detrás de escena sin cambiar las URL.

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

Solo necesita tener en cuenta que el nuevo JSF 2.0 siempre que la navegación implícita no explore la presencia del archivo, irá de outcome.xhtmltodos modos. Por lo tanto, si desea venir o ir *.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 utilizar los Facelets 2.0 suministrados por JSF 2.0 , debe realizar los siguientes pasos adicionales:

  • Retire Facelets 1.x JAR de /WEB-INF/lib.
  • Retire Facelets 1.x FaceletViewHandlerde faces-config.xml.
  • Cualquier FaceletViewHandlerimplementación personalizada debe actualizarse para ampliar en su ViewHandlerWrapperlugar.
  • No es necesario, pero solo para la limpieza, elimine los <context-param>valores relacionados con Facelets 1.x web.xmlque ya están predeterminados en Facelets 2.0, como el javax.faces.DEFAULT_SUFFIXvalor con *.xhtml.
  • Actualice la declaración de raíz de los XML de 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 use JSF 2.2 o más reciente, use el http://xmlns.jcp.orgdominio de espacio de nombres en lugar de en http://java.sun.comtodo el fragmento XML anterior.

Eso debería ser básicamente eso.


JSP 2.x a Facelets 2.0

Si está utilizando JSP 2.x como tecnología de visualización y desea actualizar a Facelets 2.0 de inmediato, entonces necesita hacer muchos cambios antes de que el sitio pueda comenzar a funcionar. Básicamente, estás cambiando la tecnología de visualización 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>

.. 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 use JSF 2.2 o posterior, use el http://xmlns.jcp.orgdominio de espacio de nombres en lugar de en http://java.sun.comtodos 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 código de scriptlet y también debería tener solo <jsp:include>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 una 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 las siguientes Facelets básicas que 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>

Nota: cuando use JSF 2.2 o posterior, use el http://xmlns.jcp.orgdominio de espacio de nombres en lugar de en http://java.sun.comtodos los fragmentos 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 faces-config.xmllas nuevas anotaciones JSF 2.0 o incluso CDI . Cualquiera <managed-bean>puede ser anotado por @ManagedBean:

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

Junto a @RequestScoped, también hay @ViewScoped, @SessionScopedy @ApplicationScopeddisponibles. Si omite el nameatributo de @ManagedBean, el valor predeterminado será classname con el primer carácter en minúscula.

@ManagedBean
@RequestScoped
public class SomeBean {}

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

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

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

Cualquiera <validator>puede ser anotado usando @FacesValidator:

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

Cualquiera <converter>puede ser anotado usando@FacesConverter

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

Cualquiera <renderer>puede ser anotado usando@FacesRenderer

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

Cualquiera <navigation-case>que use el nombre de archivo de la página XHTML como ambos <from-outcome>y <to-view-id>se pueda eliminar ya que esto se hará implícitamente . Esto se puede hacer gradualmente cambiando todos los valores de resultados para que coincidan con el nombre de archivo de la vista de destino.

Finalmente, cualquier bean de ámbito de sesión que se haya puesto en la sesión con el único motivo de retener los datos del bean en solicitudes posteriores en la misma pestaña / ventana puede marcarse mejor @ViewScoped, porque de esta manera el bean no se verá afectado cuando se abra el usuario final 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 simplemente actualizar la biblioteca de componentes a una versión compatible con JSF 2.0, según sus instrucciones. Lo mejor es 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 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, elimine todas las <t:saveState>referencias en un bean de ámbito de solicitud haciendo que la vista de bean sea de ámbito.

BalusC
fuente
@ManagedBean (name = "managedBeanName") @RequestScoped It is :)
Daniel Szalay
gran 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, ya que parecía un cambio mediocre de realizar para actualizar a richfaces 4.x. Así que hice su guía (deshice todas las cosas relacionadas con facelets en faces-config (el visor activado eliminó la anotación de taglig), luego seguí community.jboss.org/wiki/RichFaces333AndJSF20 y finalmente tuve que hacer esto stackoverflow.com/questions/85532/…
Toskan
Gran respuesta. En mi caso, también tuve que establecer el javax.faces.VALIDATE_EMPTY_FIELDSparámetro para falseordenar la validación. Ver también: stackoverflow.com/questions/6113935/…
Jasper de Vries
2
También puedo recomendar a todos que lean balusc.blogspot.nl/2011/09/communication-in-jsf-20.html
Jasper de Vries
1
@Cfold: arreglé el enlace.
BalusC
6

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 utilizar las 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?

mvg
fuente
Hubiera 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 la diferencia. Esa es la "alegría" de la programación, ¿no? :)
ChuongPham el
4

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">
Pravin
fuente
0

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 .

designado
fuente