it-swarm.com.de

Migration von JSF 1.2 auf JSF 2.0

Ich arbeite mit einer ziemlich großen App, die in JSF 1.2 geschrieben ist. 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.

133
mkoryak

Schmerzhaftigkeit

Die Schwierigkeit, ein Upgrade von JSF 1.2 auf 2.0 durchzuführen, 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 = Geringer Aufwand.
  • JSP 2.x auf Facelets 2.0 = Viel Aufwand. Verdoppeln Sie dies, wenn Sie auch benutzerdefinierte Komponenten haben.

Grundlegende Änderungen

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

  • Entfernen Sie JSF 1.2-JARs aus /WEB-INF/lib (falls vorhanden).
  • Löschen Sie JSF 2.0-JARs in /WEB-INF/lib (wenn JSF 1.2 von Servletcontainer bereitgestellt wurde, möchten Sie möglicherweise die Klassenlade-Richtlinie so ändern, dass Webapp-Bibliotheken zuerst geladen werden, bevor Servletcontainer-Bibliotheken geladen werden. Siehe auch JSF2-Klassenlade-Probleme in Anwendungsservern ).
  • Aktualisieren Sie die Root-Deklaration 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 im obigen XML-Snippet die Namespace-Domäne http://xmlns.jcp.org anstelle von http://Java.Sun.com.

  • Stellen Sie sicher, dass die Root-Deklaration von web.xml bereits den Anforderungen von 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 im obigen XML-Snippet die Namespace-Domäne http://xmlns.jcp.org anstelle von http://Java.Sun.com.


JSP 2.x zu JSP 2.x

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

Allmählich aktualisieren

Wenn Sie bereits ein Suffix url-pattern für FacesServlet verwenden, wie z. B. *.jsf, ist es gut zu wissen, dass FacesServlet zuerst nach sucht *.xhtml Datei und wenn es nicht vorhanden ist, dann scannen Sie nach *.jsp Datei. So haben Sie im Hintergrund die Möglichkeit, schrittweise von JSP zu Facelets zu konvertieren, ohne die URLs zu ändern.

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

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


Facelets 1.x bis Facelets 2.0

Wenn Sie Facelets 1.x als View-Technologie verwenden und die von JSF 2.0 bereitgestellten Facelets 2.0 verwenden möchten, benötigen Sie Führen Sie die folgenden zusätzlichen Schritte aus:

  • Entfernen Sie Facelets 1.x JAR aus /WEB-INF/lib.
  • Entfernen Sie Facelets 1.x FaceletViewHandler aus faces-config.xml.
  • Jede benutzerdefinierte FaceletViewHandler -Implementierung muss aktualisiert werden, um stattdessen ViewHandlerWrapper zu erweitern.
  • Nicht erforderlich, aber nur zur Bereinigung: Entfernen Sie alle Facelets 1.x-bezogenen <context-param>-Werte aus web.xml, die bereits in Facelets 2.0 als Standardwert verwendet werden, z. B. javax.faces.DEFAULT_SUFFIX mit Wert von *.xhtml.
  • Aktualisieren Sie die Root-Deklaration 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 im obigen XML-Snippet die Namespace-Domäne http://xmlns.jcp.org anstelle von http://Java.Sun.com.

Das sollte es im Grunde sein.


JSP 2.x zu Facelets 2.0

Wenn Sie JSP 2.x als View-Technologie verwenden und sofort auf Facelets 2.0 aktualisieren möchten, müssen Sie dies tun Nehmen Sie viele Änderungen vor, bevor die Website online geschaltet werden kann. Sie ändern hier im Grunde 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>

..auf die folgende grundlegende 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 in den obigen XHTML-Snippets die Namespace-Domäne http://xmlns.jcp.org anstelle von http://Java.Sun.com.

Seitenänderungen einschließen

Wenn Ihre vorhandenen JSP-Seiten gut gestaltet sind, sollten Sie keine Zeile mit scriptlet Code und nur den <jsp:include> als einziges JSP-spezifisches Tag verwenden. Jedes dieser Elemente muss geändert werden von:

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

zu

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

Die grundlegende JSP-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>

..soll auf die folgenden grundlegenden Facelets-Seitenvorlagen 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 in den obigen XHTML-Snippets die Namespace-Domäne http://xmlns.jcp.org anstelle von http://Java.Sun.com.

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 den faces-config.xml schrittweise durch die neuen JSF 2.0-Annotationen oder sogar durch CDI entfernen. Jeder <managed-bean> kann mit @ManagedBean kommentiert werden:

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

Neben @RequestScoped gibt es auch @ViewScoped , @SessionScoped und @ApplicationScoped verfügbar. Wenn Sie das name -Attribut von @ManagedBean weglassen, wird standardmäßig der Klassenname mit dem 1. Zeichen in Kleinbuchstaben verwendet.

@ManagedBean
@RequestScoped
public class SomeBean {}

In diesem speziellen Beispiel ist es #{someBean}.

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

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

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

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

Jeder <converter> kann mit @FacesConverter kommentiert werden

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

Jeder <renderer> kann mit @FacesRenderer kommentiert werden

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

Jeder <navigation-case>, der den Dateinamen der XHTML-Seite als <from-outcome> und <to-view-id> verwendet, kann entfernt werden, da dies implizit erledigt wird. Dies kann schrittweise erfolgen, indem alle Ergebniswerte so geändert werden, dass sie mit dem Dateinamen der Zielansicht übereinstimmen.

Schließlich kann jedes Session-Scoped-Bean, das in die Session aufgenommen wurde, mit dem einzigen Grund, die Bean-Daten in nachfolgenden Requests im selben Tab/Fenster zu behalten, besser als @ViewScoped markiert werden, da auf diese Weise das Bean gewonnen hat. ' Dies ist nicht betroffen, wenn der Endbenutzer dieselbe Seite in verschiedenen Registerkarten/Fenstern öffnet.


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 auf "es kommt darauf an" hinausläuft. Im Allgemeinen reicht es aus, die Komponentenbibliothek nur auf eine selbst verifizierte JSF 2.0-kompatible Version gemäß deren Anweisungen zu aktualisieren. Schreiben Sie am besten nur Komponententests, führen Sie sie vor und nach dem Upgrade aus und beheben Sie alle Probleme einzeln.

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

PrimeFaces hat keinen Migrationsleitfaden für PrimeFaces 1.x bis 2.x, da PrimeFaces 1.x bereits Facelets 1.x erfordert, sodass Sie nur die Migrationsschritte Facelets 1.x bis 2.x ausführen müssen. Es gibt jedoch eine Migrationsanleitung für PrimeFaces 2.x bis 3.x (und höher) , die möglicherweise auch für die Migration von PrimeFaces 1.x auf 3.x (oder höher) gilt. Tomahawk hat auch keinen Migrationsführer. 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 auf einen bestimmten Bereich festlegen.

240
BalusC

Wenn jemand JSTL mit JSF 1.2 verwendet, sollten Sie beim Upgrade auf JSF2 den Namespace ändern von:

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

zu:

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

7
Rafal G.

JSF 2.0 hat 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ängt, treten Probleme auf. Nicht alle Komponenten von Richfaces 3 sind auf Richfaces 4 portiert.

Dies könnte auch helfen JSF 1.2-Anwendungsmigration auf JSF 2.

Überprüfen Sie auch diese Was ist neu in JSF 2?

6
mvg

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

Wenn Sie Apache Trinidad verwenden, müssen Sie auch ein Upgrade auf Version 2.0 durchführen, damit JSF 2.0 unterstützt wird. Es gibt mehr Infos unter Hacker's Valhalla .

0
designatevoid