Respuestas:
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.
Independientemente del cambio de tecnología de vista, al menos se deben realizar los siguientes pasos:
/WEB-INF/lib
(si corresponde)./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.xml
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 use JSF 2.2 o más reciente, use el http://xmlns.jcp.org
dominio de espacio de nombres en lugar de en http://java.sun.com
todo el fragmento XML anterior.
Asegúrese de que la declaración raíz de web.xml
ya 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.org
dominio de espacio de nombres en lugar de en http://java.sun.com
todo el fragmento XML anterior.
Si está utilizando JSP 2.xy quiere seguir usándolo, entonces básicamente no necesita cambiar nada más.
Si ya está utilizando un sufijo url-pattern
para FacesServlet
, como *.jsf
, entonces es bueno saber que FacesServlet
primero buscará el *.xhtml
archivo y, si no está presente, luego buscará el *.jsp
archivo. 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 *.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 siempre que la navegación implícita no explore la presencia del archivo, irá de outcome.xhtml
todos modos. Por lo tanto, si desea venir o ir *.jsp
, aún debe incluirlo en el viewid de la manera JSF 1.x.
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:
/WEB-INF/lib
.FaceletViewHandler
de faces-config.xml
.FaceletViewHandler
implementación personalizada debe actualizarse para ampliar en su ViewHandlerWrapper
lugar.<context-param>
valores relacionados con Facelets 1.x web.xml
que ya están predeterminados en Facelets 2.0, como el javax.faces.DEFAULT_SUFFIX
valor 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.org
dominio de espacio de nombres en lugar de en http://java.sun.com
todo el fragmento XML anterior.
Eso debería ser básicamente eso.
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í.
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.org
dominio de espacio de nombres en lugar de en http://java.sun.com
todos los fragmentos XHTML anteriores.
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.org
dominio de espacio de nombres en lugar de en http://java.sun.com
todos los fragmentos XHTML anteriores.
Debe cambiar los archivos JSP TLD a archivos Facelets TLD como se describe en esta Guía de migración de Mojarra .
Independientemente del enfoque de migración, puede eliminar gradualmente faces-config.xml
las 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
, @SessionScoped
y @ApplicationScoped
disponibles. Si omite el name
atributo 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.
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.
javax.faces.VALIDATE_EMPTY_FIELDS
parámetro para false
ordenar la validación. Ver también: stackoverflow.com/questions/6113935/…
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:
a:
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?
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">
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 .