web-dev-qa-db-fra.com

Migration de JSF 1.2 à JSF 2.0

Je travaille avec une application assez grosse écrite en JSF 1.2. JSF 1.2 a environ 6 ans maintenant. J'ai besoin de passer à JSF 2.0. Est-ce que cela sera douloureux? J'ai remarqué que certains attributs dans les balises personnalisées ont été modifiés, etc.

133
mkoryak

Douleur

La difficulté de la mise à niveau de JSF 1.2 à 2.0 dépend de la technologie d'affichage que vous utilisez et que vous souhaitez utiliser.

  • JSP 2.x à JSP 2.x = presque aucun effort.
  • Facelets 1.x à Facelets 2.0 = Peu d'effort.
  • JSP 2.x à Facelets 2.0 = Beaucoup d'effort. Doublez-le si vous avez également des composants personnalisés.

Changements de base

Indépendamment du commutateur de technologie d'affichage, au moins, procédez comme suit:

  • Supprimez les fichiers JAR JSF 1.2 de /WEB-INF/lib (Le cas échéant).
  • Supprimez les fichiers JAR JSF 2.0 dans /WEB-INF/lib (Si JSF 1.2 était fourni par servletcontainer, vous souhaiterez peut-être modifier la stratégie de chargement de classes pour charger les bibliothèques Webapp avant les bibliothèques servletcontainer, voir aussi Problèmes de chargement de classe JSF2 dans les serveurs d'application ).
  • Mettez à jour la déclaration racine de faces-config.xml Pour qu'elle soit conforme aux spécifications 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">
    

    Remarque: lorsque vous utilisez JSF 2.2 ou une version plus récente, utilisez le domaine d'espace de noms http://xmlns.jcp.org Au lieu de http://Java.Sun.com Dans tout l'extrait XML ci-dessus.

  • Assurez-vous que la déclaration racine de web.xml Est conforme au moins Servlet 2.5. JSF 2.0 ne fonctionnera pas sur la version 2.4 ou inférieure ( bien que ce soit hackable ).

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

    Remarque: lorsque vous utilisez Servlet 3.0 ou une version plus récente, utilisez le domaine d’espace de noms http://xmlns.jcp.org Au lieu de http://Java.Sun.com Dans l’extrait de code XML ci-dessus.


JSP 2.x à JSP 2.x

Si vous utilisez JSP 2.x et souhaitez conserver en utilisant Dans ce cas, vous n'avez fondamentalement pas besoin de changer quoi que ce soit.

Mise à niveau progressive

Si vous utilisez déjà un suffixe url-pattern Pour le FacesServlet, comme *.jsf, Il est bon de savoir que le FacesServlet recherchera d'abord *.xhtml Et s'il n'est pas présent, recherchez le fichier *.jsp. Cela vous permet de convertir progressivement de JSP à Facelets dans les coulisses sans changer d'URL.

Mais si vous utilisez un préfixe url-pattern, Comme /faces/* Et que vous souhaitez passer progressivement de JSP à Facelets, vous devez vraiment le modifier en *.jsf Et éventuellement aussi. tous les liens dans les pages JSP existantes.

N'oubliez pas que la nouvelle navigation implicite fournie par JSF 2.0 n'analyse pas la présence du fichier, elle ira quand même à outcome.xhtml. Donc, si vous voulez venir de ou aller à *.jsp, Vous devez toujours l’inclure dans le viewid de la manière JSF 1.x.


Facelets 1.x à Facelets 2.0

Si vous utilisez Facelets 1.x comme technologie d'affichage et souhaitez utiliser le fichier JSF 2.0 fourni , Facelets 2.0 , vous devez effectuer les étapes supplémentaires suivantes:

  • Supprimez le fichier JAR de Facelets 1.x de /WEB-INF/lib.
  • Supprimez Facelets 1.x FaceletViewHandler de faces-config.xml.
  • Toute implémentation personnalisée FaceletViewHandler doit être mise à jour pour pouvoir être complétée par ViewHandlerWrapper .
  • Pas nécessaire, mais juste pour le nettoyage, supprimez toutes les valeurs <context-param> De Facelets 1.x de web.xml Qui sont déjà définies par défaut dans Facelets 2.0, comme le javax.faces.DEFAULT_SUFFIX Avec la valeur *.xhtml.
  • Mettez à jour la déclaration racine des XML taglib Facelet existants afin de la rendre conforme à 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">
    

    Remarque: lorsque vous utilisez JSF 2.2 ou une version plus récente, utilisez le domaine d'espace de noms http://xmlns.jcp.org Au lieu de http://Java.Sun.com Dans tout l'extrait XML ci-dessus.

Cela devrait fondamentalement être ça.


JSP 2.x à Facelets 2.0

Si vous utilisez JSP 2.x comme technologie d'affichage et que vous souhaitez passer à Facelets 2.0 immédiatement, alors vous devez faire beaucoup de changements avant que le site puisse être mis en ligne. Vous changez fondamentalement la technologie d'affichage ici.

Changements de page maître

Sur chaque page maître, vous devez modifier le modèle JSP de base suivant.

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

..pour le modèle de base Facelets suivant:

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

Remarque: lorsque vous utilisez JSF 2.2 ou une version plus récente, utilisez le domaine d’espace de nommage http://xmlns.jcp.org Au lieu de http://Java.Sun.com Dans les extraits XHTML ci-dessus.

Inclure les modifications de page

Si vos pages JSP existantes sont bien conçues, vous ne devriez avoir aucune ligne de code scriptlet et vous ne devriez également avoir que le <jsp:include> En tant que balise unique spécifique à JSP. N'importe lequel de ces besoins doit être changé de:

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

à

<ui:include src="include.xhtml" />

Le modèle de page JSP de base include 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>

..should devrait être remplacé par le modèle de page suivant Facelets include:

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

Remarque: lorsque vous utilisez JSF 2.2 ou une version plus récente, utilisez le domaine d’espace de nommage http://xmlns.jcp.org Au lieu de http://Java.Sun.com Dans les extraits XHTML ci-dessus.

Changements de composants personnalisés

Vous devez remplacer les fichiers TLD JSP par des fichiers TLD Facelets comme décrit dans ce Guide de migration de Mojarra .


Conséquences

Quelle que soit l'approche adoptée pour la migration, vous pouvez éliminer progressivement le faces-config.xml Dans les nouvelles annotations JSF 2.0 ou même CDI . Tout <managed-bean> Peut être annoté par @ManagedBean :

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

À côté de @RequestScoped , il y a aussi @ViewScoped , @SessionScoped et @ApplicationScoped disponible. Si vous omettez l'attribut name de @ManagedBean, Le nom de classe par défaut sera défini avec le 1er caractère en minuscule.

@ManagedBean
@RequestScoped
public class SomeBean {}

Dans cet exemple particulier, ce sera #{someBean}.

Tout <managed-property> Peut être annoté avec @ManagedProperty :

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

Tout <validator> Peut être annoté avec @FacesValidator :

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

Tout <converter> Peut être annoté avec @FacesConverter

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

Tout <renderer> Peut être annoté avec @FacesRenderer

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

Tout <navigation-case> Qui utilise le nom de fichier de la page XHTML comme <from-outcome> Et <to-view-id> Peut être supprimé, car ce sera implicitement terminé. Cela peut être fait progressivement en modifiant toutes les valeurs de résultat afin qu'elles correspondent au nom de fichier de la vue cible.

Enfin, il est préférable de marquer @ViewScoped Toute bean de périmètre de session insérée dans la session avec la seule raison de conserver les données de bean dans les requêtes suivantes, dans le même onglet/la même fenêtre. être affecté lorsque l'utilisateur final ouvre la même page dans différents onglets/fenêtres.


Bibliothèques de composants

Notez que dans cette réponse, je ne prends pas en compte les bibliothèques de composants tierces telles que PrimeFaces/RichFaces/IceFaces. Il serait alors impossible d'écrire une réponse fiable car cela revient essentiellement à "ça dépend". En général, il suffit de mettre à niveau la bibliothèque de composants vers une version compatible JSF 2.0 vérifiée par eux-mêmes, conformément aux instructions. Le mieux est d'écrire des tests unitaires, de les exécuter avant et après la mise à niveau et de résoudre les problèmes individuellement.

Voici au moins quelques liens utiles concernant la migration de la bibliothèque de composants spécifique:

PrimeFaces ne dispose pas de guide de migration pour PrimeFaces 1.x à 2.x, car PrimeFaces 1.x nécessite déjà Facelets 1.x. Il vous suffit donc de suivre les étapes de migration de Facelets 1.x à 2.x. Cependant, il existe un Guide de migration PrimeFaces 2.x à 3.x (et supérieur) qui peut également s'appliquer à la migration de PrimeFaces 1.x vers 3.x (ou supérieure). Tomahawk n'a pas non plus de guide de migration. Fondamentalement, les seuls fichiers que vous devez modifier sont les fichiers JAR et, si nécessaire, supprimez toutes les références <t:saveState> Sur un haricot de type requête en définissant la vue du haricot.

240
BalusC

Une chose à mentionner est que si quelqu'un utilise JSTL avec JSF 1.2, lors de la mise à niveau vers JSF2, vous devez modifier l'espace de nom de:

http://Java.Sun.com/jstl/core

à:

http://Java.Sun.com/jsp/jstl/core

7
Rafal G.

JSF 2.0 comporte de nombreuses nouvelles fonctionnalités et composants et je ne pense pas que la migration sera pénible. Le seul domaine que vous trouverez difficile est l’utilisation des bibliothèques de tiers. Si votre application dépend fortement de bibliothèques telles que Richfaces, vous rencontrerez des problèmes. Tous les composants de Richfaces 3 ne sont pas portés sur Richfaces 4.

Cela pourrait également aider Migration de l’application JSF 1.2 vers JSF 2.

Vérifiez également ceci Quoi de neuf dans JSF 2?

6
mvg

Web.xml

 Add the jars
    1. jsf-api-2.0.jar 
    2. jsf-impl.2.0.2.jar

Étape 1: Changer le fichier 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>

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

Étape 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">
4
Pravin

Si vous utilisez Apache Trinidad, vous devrez également le mettre à niveau vers la version 2.0 pour pouvoir prendre en charge JSF 2.0. Il y a plus d'informations à Valhalla de Hacker .

0
designatevoid