Migration von JSF 1.2 zu JSF 2.0

136

Ich arbeite mit einer ziemlich großen App, die in JSF 1.2 geschrieben wurde . JSF 1.2 ist jetzt ungefähr 6 Jahre alt. Ich muss auf JSF 2.0 aktualisieren. Wie schmerzhaft wird das sein? Ich habe festgestellt, dass einige Attribute in benutzerdefinierten Tags geändert wurden usw.

mkoryak
quelle

Antworten:

245

Schmerzhaftigkeit

Die Schwierigkeit, JSF 1.2 auf 2.0 zu aktualisieren, hängt von der Ansichtstechnologie ab, die Sie derzeit verwenden und die Sie verwenden möchten.

  • JSP 2.x bis JSP 2.x = Fast kein Aufwand.
  • Facelets 1.x bis Facelets 2.0 = wenig Aufwand.
  • JSP 2.x zu Facelets 2.0 = viel Aufwand. Verdoppeln Sie dies, wenn Sie auch benutzerdefinierte Komponenten haben.

Grundlegende Änderungen

Unabhängig vom Wechsel der Ansichtstechnologie sollten mindestens die folgenden Schritte ausgeführt werden:

  • Entfernen Sie JSF 1.2-JARs aus /WEB-INF/lib(falls vorhanden).
  • /WEB-INF/libLegen Sie JSF 2.0- JARs ab (wenn JSF 1.2 von Servletcontainern bereitgestellt wurde, möchten Sie möglicherweise die Klassenladerichtlinie ändern, um zuerst Webanwendungsbibliotheken vor Servletcontainer-Bibliotheken zu laden, siehe auch Probleme beim Laden von JSF2- Klassen auf Anwendungsservern ).
  • Aktualisieren Sie die Stammdeklaration von faces-config.xml, um die JSF 2.0-Spezifikation zu erfüllen.

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

    Hinweis: Wenn Sie JSF 2.2 oder höher verwenden , verwenden Sie die http://xmlns.jcp.orgNamespace-Domäne anstelle des http://java.sun.comgesamten obigen XML-Snippets.

  • Stellen Sie sicher, dass die Root-Deklaration von web.xmlbereits mindestens Servlet 2.5 entspricht. JSF 2.0 funktioniert nicht mit 2.4 oder niedriger ( obwohl es hackbar ist ).

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

    Hinweis: Wenn Sie Servlet 3.0 oder höher verwenden , verwenden Sie die http://xmlns.jcp.orgNamespace-Domäne anstelle des http://java.sun.comgesamten obigen XML-Snippets.


JSP 2.x bis JSP 2.x.

Wenn Sie JSP 2.x verwenden und es weiterhin verwenden möchten , müssen Sie im Grunde nichts anderes ändern.

Allmähliches Upgrade

Wenn Sie bereits ein Suffix url-patternfür das verwenden FacesServlet, wie*.jsf ist es gut zu wissen, dass das FacesServletzuerst nach *.xhtmlDateien sucht und wenn es nicht vorhanden ist, nach suchen*.jsp Dateien. Auf diese Weise können Sie hinter den Kulissen schrittweise von JSP zu Facelets konvertieren, ohne die URLs zu ändern.

Aber wenn Sie ein Präfix verwenden url-pattern und nach /faces/*und nach ein Upgrade von JSP auf Facelets durchführen möchten, müssen Sie es wirklich in *.jsfund möglicherweise auch in alle Links auf den vorhandenen JSP-Seiten ändern .

Sie müssen nur bedenken, dass die neue implizite Navigation in JSF 2.0 nicht nach dem Vorhandensein der Datei sucht, sondern nach outcome.xhtml trotzdem. Wenn Sie also von oder zu gehen möchten *.jsp, müssen Sie es dennoch in die Ansicht auf JSF 1.x-Weise aufnehmen.


Facelets 1.x bis Facelets 2.0

Wenn Sie Facelets 1.x als Ansichtstechnologie verwenden und die von JSF 2.0 bereitgestellten Facelets 2.0 verwenden möchten, müssen Sie die folgenden zusätzlichen Schritte ausführen:

  • Entfernen Sie Facelets 1.x JAR aus /WEB-INF/lib .
  • Entfernen Sie Facelets 1.x FaceletViewHandlervonfaces-config.xml .
  • Jede benutzerdefinierte FaceletViewHandlerImplementierung muss aktualisiert werden, um erweitert zu werdenViewHandlerWrapper stattdessen werden.
  • Nicht erforderlich, sondern nur zur Bereinigung, entfernen Sie alle Facelets 1.x-bezogenen <context-param>Werte, von web.xmldenen in Facelets 2.0 bereits Standardwerte vorhanden sind, wie z. B. den javax.faces.DEFAULT_SUFFIXwith-Wert von *.xhtml.
  • Aktualisieren Sie die Stammdeklaration vorhandener Facelet-Taglib-XMLs, um Facelets 2.0 zu entsprechen.

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

    Hinweis: Wenn Sie JSF 2.2 oder höher verwenden , verwenden Sie die http://xmlns.jcp.orgNamespace-Domäne anstelle des http://java.sun.comgesamten obigen XML-Snippets.

Das sollte es im Grunde sein.


JSP 2.x zu Facelets 2.0

Wenn Sie JSP 2.x als Ansichtstechnologie verwenden und ein Upgrade auf Facelets 2.0 durchführen möchten sofort müssen Sie viele Änderungen vornehmen, bevor die Site live geschaltet werden kann. Sie ändern hier grundsätzlich die Ansichtstechnologie.

Änderungen an der Masterseite

Auf jeder Masterseite müssen Sie die folgende grundlegende JSP-Vorlage ändern.

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

..zu der folgenden grundlegenden Facelets-Vorlage:

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

Hinweis: Wenn Sie JSF 2.2 oder höher verwenden, verwenden Sie http://xmlns.jcp.orgstattdessen die Namespace-Domänehttp://java.sun.com höher verwenden der oben genannten XHTML-Snippets.

Seitenänderungen einschließen

Wenn Ihre vorhandenen JSP-Seiten gut gestaltet sind, sollten Sie keine Zeile mit Scriptlet- Code haben und Sie sollten auch nur <jsp:include>das einzige JSP-spezifische Tag haben. Jedes dieser Elemente muss geändert werden von:

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

zu

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

Die grundlegende JSP enthält Seitenvorlage von ..

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

..sollte in die folgenden grundlegenden Facelets gehören Seitenvorlage geändert werden:

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

Hinweis: Wenn Sie JSF 2.2 oder höher verwenden , verwenden Sie die http://xmlns.jcp.orgNamespace-Domäne anstellehttp://java.sun.com der oben genannten XHTML-Snippets.

Benutzerdefinierte Komponentenänderungen

Sie müssen die JSP-TLD-Dateien in Facelets-TLD-Dateien ändern, wie in diesem Mojarra-Migrationshandbuch beschrieben .


Nachwirkungen

Unabhängig vom Migrationsansatz können Sie die faces-config.xmldurch die neuen JSF 2.0-Annotationen oder sogar CDI schrittweise entfernen . Jeder <managed-bean>kann kommentiert werden durch @ManagedBean:

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

Neben @RequestScopedgibt es auch @ViewScoped, @SessionScopedund zur @ApplicationScopedVerfügung. Wenn Sie das nameAttribut von weglassen @ManagedBean, wird standardmäßig der Klassenname mit dem 1. Zeichen in Kleinbuchstaben verwendet.

@ManagedBean
@RequestScoped
public class SomeBean {}

In diesem speziellen Beispiel wird es sein #{someBean}.

Jeder <managed-property>kann mit folgenden Anmerkungen versehen werden @ManagedProperty:

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

Jeder <validator>kann mit folgenden Anmerkungen versehen werden @FacesValidator:

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

Jeder <converter>kann mit kommentiert werden@FacesConverter

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

Jeder <renderer>kann mit kommentiert werden@FacesRenderer

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

Alle, <navigation-case>die den Dateinamen der XHTML-Seite als beides verwenden <from-outcome>und entfernt werden <to-view-id>können, da dies implizit erfolgt erfolgt. Dies kann schrittweise erfolgen, indem alle Ergebniswerte so geändert werden, dass sie mit dem Dateinamen der Zielansicht übereinstimmen.

Schließlich kann jede Bean mit Sitzungsbereich, die in die Sitzung mit dem einzigen Grund aufgenommen wurde, die Bean-Daten in nachfolgenden Anforderungen in derselben Registerkarte / demselben Fenster beizubehalten, besser markiert werden @ViewScoped, da die Bean auf diese Weise beim Öffnen des Endbenutzers nicht betroffen ist die gleiche Seite in verschiedenen Registerkarten / Fenstern.


Komponentenbibliotheken

Beachten Sie, dass ich in dieser Antwort keine Komponentenbibliotheken von Drittanbietern wie PrimeFaces / RichFaces / IceFaces berücksichtige. Es wäre dann unmöglich, eine zuverlässige Antwort zu schreiben, da es sich im Grunde genommen um "es kommt darauf an" handelt. Im Allgemeinen reicht es aus, die Komponentenbibliothek gemäß den Anweisungen auf eine von sich selbst überprüfte JSF 2.0-kompatible Version zu aktualisieren. Am besten schreiben Sie einfach Unit-Tests, führen sie vor und nach dem Upgrade aus und beheben alle Probleme einzeln.

Hier sind zumindest einige nützliche Links zur Migration der spezifischen Komponentenbibliothek:

PrimeFaces hat keinen Migrationsleitfaden für PrimeFaces 1.x bis 2.x, da für PrimeFaces 1.x bereits Facelets 1.x erforderlich ist. Sie müssen also nur die Migrationsschritte für Facelets 1.x bis 2.x ausführen. Es gibt jedoch einen PrimeFaces 2.x bis 3.x (und höher) Migrationsleitfaden, der möglicherweise auch für die Migration von PrimeFaces 1.x auf 3.x (oder höher) gilt. Tomahawk hat auch keinen Migrationsleitfaden. Grundsätzlich müssen Sie nur die JARs ändern und bei Bedarf alle <t:saveState>Verweise auf eine Bean mit Anforderungsbereich entfernen, indem Sie die Bean-Ansicht mit Gültigkeitsbereich festlegen.

BalusC
quelle
@ManagedBean (name = "manageBeanName") @RequestScoped Es ist :)
Daniel Szalay
toller Beitrag, hat mir sehr geholfen. Beachten Sie Folgendes: Wenn Sie von jsf 1.2 zu jsf 2 wechseln, können Sie fast sicher sein, dass a4j aus richfaces 3.3.x verwendet wurde. Ich entschied mich, richfaces 3.3.3 zusammen mit jsf 2 zu verwenden, da es eine mittelmäßige Änderung zu sein schien, um ein Upgrade auf richfaces 4.x durchzuführen. Also habe ich Ihren Leitfaden erstellt (alle Facelets-bezogenen Dinge in der Gesichtskonfiguration rückgängig gemacht (aktivierter Viewhandler hat die taglig-Annotation entfernt), bin dann community.jboss.org/wiki/RichFaces333AndJSF20 gefolgt und musste schließlich diesen stackoverflow.com/questions/85532/…
Toskan
Gute Antwort. In meinem Fall musste ich auch den javax.faces.VALIDATE_EMPTY_FIELDSParameter einstellen false, um die Validierung zu sortieren. Siehe auch: stackoverflow.com/questions/6113935/…
Jasper de Vries
2
Ich kann auch jedem empfehlen, balusc.blogspot.nl/2011/09/communication-in-jsf-20.html
Jasper de Vries
1
@Cfold: Ich habe den Link repariert.
BalusC
7

Eine Sache zu erwähnen ist, dass wenn jemand JSTL mit JSF 1.2 verwendet, Sie beim Upgrade auf JSF2 den Namespace ändern sollten von:

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

zu:

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

Rafal G.
quelle
2
Hinweis: Dies gilt nur, wenn Sie von Facelets 1.x auf 2.x migrieren.
BalusC
Und für 2.2 und höher
Kukeltje
6

JSF 2.0 verfügt über viele neue Funktionen und Komponenten, und ich bin nicht der Meinung, dass die Migration schmerzhaft sein wird. Der einzige Bereich, den Sie als schwierig empfinden, ist die Verwendung von Bibliotheken für Drittanbieter. Wenn Ihre Anwendung stark von Bibliotheken wie Richfaces abhängig ist, treten Probleme auf. Nicht alle Komponenten von Richfaces 3 sind auf Richfaces 4 portiert.

Dies kann auch die Migration von JSF 1.2-Anwendungen auf JSF 2.0 unterstützen

Überprüfen Sie auch, was in JSF 2 neu ist.

mvg
quelle
Es wäre dasselbe gewesen, wenn Sie Richfaces mit JSF 1.x verwenden - Sie gehen alle "Schmerzen" durch, um herauszufinden, wie Komponenten von Drittanbietern in JSF integriert werden können. Die Herangehensweise an JSF 2.x ist kein Unterschied. Das ist die "Freude" am Programmieren, nicht wahr? :)
ChuongPham
4

Web.xml

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

Schritt 1: Ändern Sie die Datei 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>

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

Schritt 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">
Pravin
quelle
0

Wenn Sie Apache Trinidad verwenden, müssen Sie es auch auf Version 2.0 aktualisieren, damit es JSF 2.0 unterstützt. Es gibt mehr Infos bei Hacker's Valhalla .

designatevoid
quelle