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.
Migración de JSF 1.2 a JSF 2.0
mkoryak
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 dehttp://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 dehttp://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 FacesServlet
me gusta *.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 detrás de escena sin cambiar las URL.
Pero si estás usando un prefijo url-pattern
me 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 *.jsp
entonces 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
desdefaces-config.xml
. - Cualquier costumbre
FaceletViewHandler
la implementación necesita ser actualizada para extenderViewHandlerWrapper
en lugar de. - No es necesario, pero solo para la limpieza, elimine cualquier Facelets 1.x relacionado
<context-param>
valores deweb.xml
que ya están por defecto en Facelets 2.0, como eljavax.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 dehttp://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 @RequestScoped
también hay @ViewScoped
, @SessionScoped
y @ApplicationScoped
disponible. Si omite el name
atributo de la @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}
.
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 @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 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:
- Guía de migración de RichFaces: migración de 3.3.x a 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.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 afalse
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:
para:
-
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
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">
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.