Passage du JSF 1.2 au JSF 2.0

je travaille avec une application plutôt grande écrite dans JSF 1.2 . JSF 1.2 est d'environ 6 ans maintenant. J'ai besoin de passer à la JSF 2.0. Comment douloureux ce que ce sera? J'ai remarqué que certains attributs dans les balises personnalisées ont été modifiés etc.

128
demandé sur BalusC 2010-12-14 19:44:37

5 réponses

douleur

la sensibilité de la mise à niveau JSF 1.2 à 2.0 dépend de la technologie de vue que vous utilisez actuellement et que vous voulez utiliser.

  • JSP 2.x à JSP 2.x = presque aucun effort.
  • Facelets 1.x pour Facelets 2.0 = Peu d'effort.
  • JSP 2.x pour Facelets 2.0 = Beaucoup d'efforts. Doublez ceci si vous avez aussi des composants personnalisés.

changements Fondamentaux

quel que soit le commutateur de la technologie view, au moins les étapes suivantes doivent être effectuées:

  • Supprimer JSF 1.2 JAR de /WEB-INF/lib (s'il y a lieu).
  • Drop JSF 2.0 JAR dans /WEB-INF/lib (si JSF 1.2 était servletcontainer-fourni, vous pourriez vouloir changer la Politique de téléchargement de classe pour charger les bibliothèques webapp en premier avant servletcontainer les bibliothèques, voir aussi JSF2 classloading questions dans les serveurs d'applications ).
  • mise à Jour de la racine de la déclaration de faces-config.xml de se conformer JSF 2.0 spec.

    <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">
    
  • S'assurer que la déclaration racine de web.xml est déjà conforme au moins Servlet 2.5. JSF 2.0 ne fonctionnera pas sur 2.4 ou moins ( 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">
    

JSP 2.x à JSP 2.x

si vous utilisez JSP 2.x et que vous voulez garder en l'utilisant, alors vous essentiellement n'avez pas besoin de changer quoi que ce soit d'autre.

mise à niveau progressive

si vous utilisez déjà un suffixe url-pattern pour le FacesServlet , comme *.jsf , alors il est bon de savoir que le FacesServlet effectuera d'abord un balayage pour le fichier *.xhtml et s'il n'est pas présent, alors un balayage pour le fichier *.jsp . Cela vous permet de convertir progressivement de JSP à Facelets dans les coulisses sans changer les URLs.

mais si vous utilisez un préfixe url-pattern , comme /faces/* et que vous voulez passer progressivement de JSP à Facelets, alors vous devez vraiment le changer en *.jsf et peut-être aussi tous les liens dans les pages JSP existantes.

il suffit de garder à l'esprit que la nouvelle navigation implicite fournie par JSF 2.0 ne Recherche pas la présence du fichier, elle passera de toute façon à outcome.xhtml . Donc , si vous voulez venir de ou aller à *.jsp , alors vous avez encore besoin de l'inclure dans le viewid JSF 1.x.


Facelets 1.x pour Facelets 2.0

si vous utilisez Facelets 1.x comme vue la technologie et que vous voulez utiliser le JSF 2.0 fourni Facelets 2.0 , alors vous devez faire les étapes supplémentaires suivantes:

  • Retirer Les Facelets 1.x BOCAL de /WEB-INF/lib .
  • Enlever Les Facelets 1.x FaceletViewHandler de faces-config.xml .
  • personnalisé FaceletViewHandler la mise en œuvre doit être mis à jour pour étendre ViewHandlerWrapper à la place.
  • Pas nécessaire, mais juste pour le nettoyage, enlever les Facelets 1.x lié <context-param> valeurs de web.xml qui sont déjà par défaut dans les Facelets 2.0, comme le javax.faces.DEFAULT_SUFFIX avec la valeur de *.xhtml .
  • mise à Jour de la racine de la déclaration de l'existant Facelet taglib XML est 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">
    

ça devrait être ça.


JSP 2.x Facelets 2.0

si vous utilisez JSP 2.x que la technologie de vue et vous voulez mettre à niveau à Facelets 2.0 immédiatement, alors vous devez faire beaucoup de changements avant que le site peut aller en direct. Vous changez fondamentalement la technologie de la vue ici.

modifications à la page principale

sur chaque page principale, vous devez changer le modèle de base de JSP 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>

.. au modèle de base de 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>

Comprennent les changements de page

si vos pages JSP existantes sont bien conçues, vous ne devriez pas avoir de ligne de scriptlet code et vous devriez également avoir seulement le <jsp:include> comme la seule étiquette spécifique JSP. Tout cela doit être changé de:

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

à

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

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

..devrait être modifié pour le modèle de page suivant:

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

modifications aux composants personnalisés

vous devez changer les fichiers TLD JSP en fichiers TLD Facelets comme décrit dans ce Mojarra Migration Guide .


Aftermath

Quelle que soit l'approche de migration, vous pouvez progressivement éliminer le faces-config.xml par les nouvelles annotations JSF 2.0. 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 du @ManagedBean , puis il sera par défaut à classname avec le 1er char lowercased.

@ManagedBean
@RequestScoped
public class SomeBean {}

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

Tout <managed-property> peuvent être annotées à l'aide d' @ManagedProperty :

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

Tout <validator> peuvent être annotées à l'aide d' @FacesValidator :

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

Tout <converter> peuvent être annotées à l'aide d' @FacesConverter

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

Tout <renderer> peuvent être annotées à l'aide d' @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é puisque ce sera implicitement fait. Cela peut être fait progressivement par changer toutes les valeurs de résultat pour correspondre au nom de fichier de la vue cible.

enfin, toute session scoped bean qui a été mis dans la session avec la seule raison de conserver les données bean dans les demandes ultérieures dans le même onglet/fenêtre peut mieux être marqué @ViewScoped , parce que de cette façon le bean ne sera pas affecté lorsque l'utilisateur ouvre la même page dans différents onglets/fenêtres.


bibliothèques de Composants

notez que je ne prends pas en compte les bibliothèques de composants tiers comme PrimeFaces/RichFaces/IceFaces dans cette réponse, il serait alors impossible d'écrire une réponse fiable car elle se résume essentiellement à "cela dépend". En général, il suffit de simplement mettre à niveau la bibliothèque de composants vers une version compatible JSF 2.0-par eux - mêmes vérifiés selon leurs instructions. Le mieux est d'écrire des tests unitaires, de les exécuter avant et après la mise à niveau et de corriger les problèmes individuellement.

voici au moins quelques liens utiles en ce qui concerne la migration de la bibliothèque de composants spécifique:

PrimeFaces n'a pas de guide de migration pour PrimeFaces 1.x à 2.x comme PrimeFaces 1.X nécessite des Facelets 1.x déjà, donc tu dois juste suivre Facelets 1.x à 2.x étapes de la migration. Cependant, il y a un PrimeFaces 2.x à 3.x Guide de migration qui pourrait s'appliquer également à la migration à partir de PrimeFaces 1.x à 3.x. Tomahawk n'a pas non plus de guide de migration. Fondamentalement, les seuls que vous devez changer sont les pots et si nécessaire se débarrasser de toutes les références <t:saveState> sur une demande scoped bean en faisant la vue bean scoped.

236
répondu BalusC 2017-05-23 11:54:50

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

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

à:

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

5
répondu Rafal G. 2013-05-24 11:39:17

JSF 2.0 ont beaucoup de nouvelles caractéristiques et composants et je ne sens pas que la migration sera douloureuse. Seule la zone que vous trouverez difficile est en utilisant les bibliothèques de parti de thrid. Si votre application est fortement dépendante de bibliothèques comme Richfaces, alors vous allez faire face à des problèmes. Tous les composants de Richfaces 3 ne sont pas portés sur Richfaces 4.

cela pourrait aussi aider JSF 1.2 migration de l'application vers JSF 2.0

vérifiez aussi ceci quoi de neuf dans JSF 2?

4
répondu mvg 2017-05-23 12:34:40

Web.xml

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

Étape 1: changer 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>

Etape 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">
2
répondu Pravin 2014-01-20 06:45:35

si vous utilisez Apache Trinidad, vous devrez aussi le mettre à jour vers la version 2.0 pour qu'il supporte JSF 2.0. Il y a plus d'infos sur Hacker's Valhalla .

0
répondu designatevoid 2011-11-17 03:23:01