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.
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.
Indépendamment du commutateur de technologie d'affichage, au moins, procédez comme suit:
/WEB-INF/lib
(Le cas échéant)./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.
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.
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.
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:
/WEB-INF/lib
.FaceletViewHandler
de faces-config.xml
.FaceletViewHandler
doit être mise à jour pour pouvoir être complétée par ViewHandlerWrapper
.<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.
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.
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.
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.
Vous devez remplacer les fichiers TLD JSP par des fichiers TLD Facelets comme décrit dans ce Guide de migration de Mojarra .
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.
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.
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:
à:
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?
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">
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 .