Migration von JSF 1.2 zu JSF 2.0

Lesezeit: 11 Minuten

Migration von JSF 12 zu JSF 20
mkorjak

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

1646644639 483 Migration von JSF 12 zu JSF 20
BalusC

Schmerzhaftigkeit

Wie schmerzhaft das Upgrade von JSF 1.2 auf 2.0 ist, hängt von der Ansichtstechnologie ab, die Sie derzeit verwenden und die Sie verwenden möchten.

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

Grundlegende Änderungen

Unabhängig vom View-Technologie-Schalter wenigstens Folgende Schritte sollten durchgeführt werden:

  • Entfernen Sie JSF 1.2 JARs aus /WEB-INF/lib (wenn überhaupt).
  • Fügen Sie JSF 2.0 JARs ein /WEB-INF/lib (Wenn JSF 1.2 von Servletcontainer bereitgestellt wurde, möchten Sie möglicherweise die Classloading-Richtlinie ändern, um Webapp-Bibliotheken zuerst vor Servletcontainer-Bibliotheken zu laden, siehe auch JSF2 Classloading Issues in Application Servers).
  • Aktualisieren Sie die Root-Deklaration von faces-config.xml zur Einhaltung der JSF 2.0-Spezifikation.

    <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 neuer verwenden, verwenden Sie die http://xmlns.jcp.org Namespace-Domain statt http://java.sun.com im gesamten obigen XML-Snippet.

  • Stellen Sie sicher, dass die Root-Deklaration von web.xml entspricht bereits wenigstens Servlets 2.5. JSF 2.0 funktioniert nicht auf 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 neuer verwenden, verwenden Sie die http://xmlns.jcp.org Namespace-Domain statt http://java.sun.com im gesamten obigen XML-Snippet.


JSP 2.x zu JSP 2.x

Wenn Sie verwenden JSP 2.x und wollen behalten verwenden, dann brauchen Sie im Grunde nichts weiter zu ändern.

Nach und nach aufrüsten

Wenn Sie bereits ein Suffix verwenden url-pattern für die FacesServletwie *.jsfdann ist es gut zu wissen, dass die FacesServlet wird zuerst nach suchen *.xhtml Datei und wenn sie nicht vorhanden ist, dann scannen Sie nach *.jsp Datei. Dies bietet Ihnen die Möglichkeit, hinter den Kulissen schrittweise von JSP zu Facelets zu konvertieren, ohne die URLs zu ändern.

Aber wenn Sie ein Präfix verwenden url-patternwie /faces/* und Sie möchten schrittweise von JSP auf Facelets upgraden, dann müssen Sie es wirklich ändern *.jsf und möglicherweise auch alle Links in den bestehenden JSP-Seiten.

Sie müssen nur bedenken, dass die neue implizite Navigation von JSF 2.0 nicht nach dem Vorhandensein der Datei sucht, zu der sie geht outcome.xhtml ohnehin. Also, wenn Sie kommen oder gehen wollen *.jspdann müssen Sie es noch in die Ansichts-ID auf JSF 1.x-Weise aufnehmen.


Facelets 1.x bis Facelets 2.0

Wenn Sie verwenden Facetten 1.x als Ansichtstechnologie verwenden und das mitgelieferte JSF 2.0 verwenden möchten Facetten 2.0dann müssen Sie die folgenden zusätzlichen Schritte ausführen:

  • Entfernen Sie Facelets 1.x JAR von /WEB-INF/lib.
  • Entfernen Sie Facelets 1.x FaceletViewHandler von faces-config.xml.
  • Jeder Brauch FaceletViewHandler Die Implementierung muss aktualisiert werden, um sie zu erweitern ViewHandlerWrapper stattdessen.
  • Nicht erforderlich, aber nur zur Bereinigung, entfernen Sie alle Facelets 1.x, die in Zusammenhang stehen <context-param> Werte ab web.xml die bereits in Facelets 2.0 voreingestellt sind, wie die javax.faces.DEFAULT_SUFFIX mit Wert von *.xhtml.
  • Aktualisieren Sie die Root-Deklaration bestehender 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 neuer verwenden, verwenden Sie die http://xmlns.jcp.org Namespace-Domain statt http://java.sun.com im gesamten obigen XML-Snippet.

Das sollte es im Grunde sein.


JSP 2.x bis Facelets 2.0

Wenn Sie verwenden JSP 2.x als Technologie ansehen und auf die Sie upgraden möchten Facetten 2.0 sofort, dann müssen Sie viele Änderungen vornehmen, bevor die Website live gehen kann. Sie ändern hier im Grunde die Ansichtstechnologie.

Masterseite ändert sich

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 Facetten-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 neuer verwenden, verwenden Sie die http://xmlns.jcp.org Namespace-Domain statt http://java.sun.com in den obigen XHTML-Schnipseln.

Seitenänderungen einbeziehen

Wenn Ihre vorhandenen JSP-Seiten gut gestaltet sind, sollten Sie keine Zeile von haben Skript code und du solltest auch nur den haben <jsp:include> als einziges JSP-spezifisches Tag. Jede davon muss geändert werden von:

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

zu

<ui:include src="https://stackoverflow.com/questions/4441713/include.xhtml" />

Die Basis-JSP enthält die 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 folgende grundlegende Seitenvorlage für Facelets 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 neuer verwenden, verwenden Sie die http://xmlns.jcp.org Namespace-Domain statt http://java.sun.com in den obigen XHTML-Schnipseln.

Änderungen an benutzerdefinierten Komponenten

Sie müssen die JSP-TLD-Dateien wie hier beschrieben in Facelets-TLD-Dateien ändern Mojarra-Migrationsleitfaden.


Nachwirkungen

Unabhängig vom Migrationsansatz können Sie das schrittweise eliminieren faces-config.xml durch die neuen JSF 2.0-Anmerkungen oder sogar CDI. Irgendein <managed-bean> kann mit kommentiert werden @ManagedBean:

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

Neben @RequestScopedes gibt auch @ViewScoped, @SessionScoped und @ApplicationScoped erhältlich. Wenn Sie die weglassen name Attribut der @ManagedBeandann wird standardmäßig der Klassenname mit dem ersten Zeichen in Kleinbuchstaben verwendet.

@ManagedBean
@RequestScoped
public class SomeBean {}

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

Irgendein <managed-property> kann mit kommentiert werden @ManagedProperty:

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

Irgendein <validator> kann mit kommentiert werden @FacesValidator:

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

Irgendein <converter> kann mit kommentiert werden @FacesConverter

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

Irgendein <renderer> kann mit kommentiert werden @FacesRenderer

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

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

Schließlich kann jede Session-Scoped-Bean, die nur aus dem Grund in die Session gestellt wurde, um die Bean-Daten in nachfolgenden Anfragen im selben Tab/Fenster beizubehalten, besser markiert werden @ViewScopedda die Bean auf diese Weise nicht beeinträchtigt wird, 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 im Grunde auf “es kommt darauf an” hinausläuft. Im Allgemeinen reicht es aus, die Komponentenbibliothek gemäß den Anweisungen auf eine – selbst verifizierte – JSF 2.0-kompatible Version zu aktualisieren. Am besten schreiben Sie einfach Komponententests, führen sie vor und nach dem Upgrade aus und beheben alle Probleme einzeln.

Hier sind zumindest einige nützliche Links im Hinblick auf die Migration der spezifischen Komponentenbibliothek:

PrimeFaces hat keinen Migrationsleitfaden für PrimeFaces 1.x auf 2.x, da PrimeFaces 1.x bereits Facelets 1.x erfordert, Sie müssen also nur die Migrationsschritte von Facelets 1.x auf 2.x befolgen. Es gibt jedoch ein PrimeFaces 2.x auf 3.x (und höher) Migrationsleitfaden was auch bei der Migration von PrimeFaces 1.x auf 3.x (oder höher) zutreffen könnte. Tomahawk hat auch keinen Migrationsleitfaden. Im Grunde müssen Sie nur die JARs ändern und ggf. alle entfernen <t:saveState> Verweise auf eine Request-Scoped-Bean, indem Sie die Bean-View Scope-fähig machen.

  • @ManagedBean(name=”managedBeanName”) @RequestScoped Es ist 🙂

    – Daniel Szalay

    29. Januar 2011 um 10:25 Uhr


  • toller Beitrag, hat mir sehr geholfen. Etwas zu beachten: Wenn Sie von jsf 1.2 zu jsf 2 wechseln, können Sie fast sicher sein, dass Leute a4j von richfaces 3.3.x verwendet haben. Ich habe mich entschieden, richfaces 3.3.3 zusammen mit jsf 2 zu verwenden, da es wie eine mittelmäßige Änderung erschien, um ein Upgrade auf richfaces 4.x durchzuführen. Also habe ich Ihre Anleitung gemacht (alle Facetten-bezogenen Dinge in der Faces-Konfiguration rückgängig gemacht (aktivierter Viewhandler entfernte Taglig-Anmerkung) und bin dann gefolgt community.jboss.org/wiki/RichFaces333AndJSF20 und musste dies schließlich tun stackoverflow.com/questions/85532/…

    – Toskanisch

    29. Dezember 2011 um 19:19 Uhr


  • Gute Antwort. In meinem Fall musste ich das auch einstellen javax.faces.VALIDATE_EMPTY_FIELDS Parameter zu false um die Validierung zu sortieren. Siehe auch: stackoverflow.com/questions/6113935/…

    – Jaspis de Vries

    9. Juli 2014 um 13:07 Uhr

  • Ich kann auch jedem empfehlen zu lesen balusc.blogspot.nl/2011/09/communication-in-jsf-20.html

    – Jaspis de Vries

    11. Juli 2014 um 9:33 Uhr

  • @Cfold: Ich habe den Link korrigiert.

    – BalusC

    28. Februar 2019 um 8:27 Uhr

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

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

zu:

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

  • Hinweis: Dies gilt nur, wenn Sie von Facelets 1.x auf 2.x migrieren.

    – BalusC

    24. Mai 2013 um 13:26 Uhr


  • Und für 2.2 und höher lesen Sie stackoverflow.com/questions/31068678/…

    – Kukeltje

    26. Juni 2020 um 16:19 Uhr

Migration von JSF 12 zu JSF 20
mvg

JSF 2.0 hat viele neue Funktionen und Komponenten und ich glaube nicht, dass die Migration schmerzhaft sein wird. Der einzige Bereich, in dem Sie Schwierigkeiten haben werden, ist die Verwendung von Bibliotheken von Drittanbietern. Wenn Ihre Anwendung stark von Bibliotheken wie Richfaces abhängig ist, werden Sie mit Problemen konfrontiert. Nicht alle Komponenten von Richfaces 3 werden auf Richfaces 4 portiert.

Dies könnte auch bei der Migration von JSF 1.2-Anwendungen zu JSF 2.0 hilfreich sein

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

  • Es wäre das gleiche gewesen, wenn Sie Richfaces mit JSF 1.x verwenden – Sie gehen den ganzen “Schmerz” durch, um herauszufinden, wie Sie Komponenten von Drittanbietern in JSF integrieren können. Der Ansatz zu JSF 2.x ist kein Unterschied. Das ist die „Freude“ am Programmieren, nicht wahr? 🙂

    – ChuongPham

    21. April 2011 um 4:56 Uhr

Web.xml

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

Schritt 1: Web.xml ändern

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

1646644640 862 Migration von JSF 12 zu JSF 20
nichtig bezeichnen

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 unter Hackers Walhalla.

964720cookie-checkMigration von JSF 1.2 zu JSF 2.0

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy