141 Stimmen

Umstellung von JSF 1.2 auf JSF 2.0

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

258voto

BalusC Punkte 1034465

Schmerzhaftigkeit

Die Schmerzhaftigkeit des Upgrades von JSF 1.2 auf 2.0 hängt von der View-Technologie ab, die Sie derzeit verwenden und die Sie verwenden möchten.

  • JSP 2.x zu JSP 2.x = Fast kein Aufwand.
  • Facelets 1.x zu Facelets 2.0 = Geringer Aufwand.
  • JSP 2.x zu Facelets 2.0 = Viel Aufwand. Doppelt so viel, wenn Sie auch benutzerdefinierte Komponenten haben.

Grundlegende Änderungen

Unabhängig von der Ansicht Technologie wechseln, mindestens sollten die folgenden Schritte durchgeführt werden:

  • Entfernen Sie JSF 1.2 JAR's von /WEB-INF/lib (falls vorhanden).

  • JSF 2.0 JAR's ablegen in /WEB-INF/lib (wenn JSF 1.2 mit Servletcontainern geliefert wurde, sollten Sie die Classloading-Policy so ändern, dass die Webapp-Bibliotheken zuerst geladen werden, bevor die Servletcontainer-Bibliotheken, siehe auch JSF2-Klassenladeprobleme in Anwendungsservern ).

  • Update Root-Erklärung 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 eine neuere Version verwenden, benutzen Sie die http://xmlns.jcp.org Namespace-Domäne anstelle von http://java.sun.com in dem obigen XML-Ausschnitt.

  • Stellen Sie sicher, dass die Root-Erklärung von web.xml erfüllt bereits die Anforderungen mindestens Servlet 2.5. 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 eine neuere Version verwenden, benutzen Sie die http://xmlns.jcp.org Namespace-Domäne anstelle von http://java.sun.com in dem obigen XML-Ausschnitt.


JSP 2.x zu JSP 2.x

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

Schrittweise Aufwertung

Wenn Sie bereits ein Suffix verwenden url-pattern pour le FacesServlet , wie *.jsf dann ist es gut zu wissen, dass die FacesServlet scannt zunächst nach *.xhtml Datei, und wenn sie nicht vorhanden ist, dann suchen Sie nach *.jsp Datei. Dies bietet Ihnen die Möglichkeit, schrittweise von JSP zu Facelets zu konvertieren, ohne die URLs zu ändern.

Aber wenn Sie ein Präfix verwenden url-pattern , wie /faces/* und Sie wollen schrittweise von JSP auf Facelets umsteigen, dann müssen Sie es wirklich auf *.jsf und möglicherweise auch alle Links in den vorhandenen JSP-Seiten.

Sie müssen nur beachten, dass die neue implizite Navigation von JSF 2.0 nicht nach dem Vorhandensein der Datei sucht, sondern zu outcome.xhtml sowieso. Wenn Sie also von einem Ort kommen oder dorthin gehen wollen *.jsp dann müssen Sie es immer noch in die viewid die JSF 1.x Weise einschließen.


Facelets 1.x zu Facelets 2.0

Wenn Sie Folgendes verwenden Facelets 1.x als View-Technologie und wollen die JSF 2.0 mitgelieferten Facelets 2.0 dann müssen Sie die folgenden zusätzlichen Schritte durchführen:

  • Facelets 1.x JAR entfernen aus /WEB-INF/lib .
  • Facelets 1.x entfernen FaceletViewHandler von faces-config.xml .
  • Jede benutzerdefinierte FaceletViewHandler Die Umsetzung muss aktualisiert werden, um die ViewHandlerWrapper stattdessen.
  • Nicht notwendig, aber nur zum Aufräumen, entfernen Sie alle Facelets 1.x bezogenen <context-param> Werte von web.xml die in Facelets 2.0 bereits voreingestellt sind, wie die javax.faces.DEFAULT_SUFFIX mit einem Wert von *.xhtml .
  • Aktualisierung der Root-Deklaration bestehender Facelet Taglib XML's, 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 eine neuere Version verwenden, benutzen Sie die http://xmlns.jcp.org Namespace-Domäne anstelle von http://java.sun.com in dem obigen XML-Ausschnitt.

Das sollte im Grunde alles sein.


JSP 2.x zu Facelets 2.0

Wenn Sie Folgendes verwenden JSP 2.x als Ansichtstechnologie und Sie möchten ein Upgrade auf Facelets 2.0 dann müssen Sie eine Menge Änderungen vornehmen, bevor die Website online gehen kann. Sie ändern hier im Grunde die Ansichtstechnologie.

Änderungen der Hauptseite

Auf jeder Stammseite 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 Facelets-Grundvorlage:

<!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 eine neuere Version verwenden, benutzen Sie die http://xmlns.jcp.org Namespace-Domäne anstelle von http://java.sun.com in den obigen XHTML-Schnipseln.

Seitenänderungen einbeziehen

Wenn Ihre bestehenden JSP-Seiten gut gestaltet sind, sollten Sie keine Zeile mit Skriptlet Code und Sie sollten auch nur die <jsp:include> als einziges JSP-spezifisches Tag. Jedes dieser Tags muss von geändert werden:

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

zu

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

Die grundlegende JSP-Include-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 auf die folgende grundlegende Facelets-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 eine neuere Version verwenden, benutzen Sie die http://xmlns.jcp.org Namespace-Domäne anstelle von http://java.sun.com in den obigen XHTML-Schnipseln.

Änderungen an benutzerdefinierten Komponenten

Sie müssen die JSP TLD-Dateien in Facelets TLD-Dateien ändern, wie in dieser Mojarra Migrationsführer .


Nachwehen

Unabhängig von der Art der Migration können Sie nach und nach die faces-config.xml durch die neuen JSF 2.0-Annotationen oder sogar CDI . Jede <managed-bean> kann kommentiert werden durch @ManagedBean :

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

Weiter zu @RequestScoped gibt es auch @ViewScoped , @SessionScoped y @ApplicationScoped verfügbar. Wenn Sie das name Attribut des @ManagedBean dann wird standardmäßig classname verwendet, wobei das erste Zeichen kleingeschrieben wird.

@ManagedBean
@RequestScoped
public class SomeBean {}

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

Jede <managed-property> können kommentiert werden mit @ManagedProperty :

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

Jede <validator> können kommentiert werden mit @FacesValidator :

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

Jede <converter> können kommentiert werden mit @FacesConverter

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

Jede <renderer> können kommentiert werden mit @FacesRenderer

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

Jede <navigation-case> die den Dateinamen der XHTML-Seite sowohl als <from-outcome> y <to-view-id> kann entfernt werden, da es sich um implizit erledigt. Dies kann schrittweise geschehen, indem alle Ergebniswerte so geändert werden, dass sie dem Dateinamen der Zielansicht entsprechen.

Schließlich kann jede sitzungsspezifische Bean, die nur deshalb in die Sitzung aufgenommen wurde, um die Bean-Daten in nachfolgenden Anfragen in derselben Registerkarte/demselben Fenster beizubehalten, besser markiert werden @ViewScoped Denn auf diese Weise wird die Bean nicht beeinträchtigt, wenn der Endbenutzer dieselbe Seite in verschiedenen Tabs/Fenstern öffnet.


Komponenten-Bibliotheken

Beachten Sie, dass ich in dieser Antwort keine Komponentenbibliotheken von Drittanbietern wie PrimeFaces/RichFaces/IceFaces berücksichtige, denn dann wäre es unmöglich, eine verlässliche Antwort zu schreiben, da es im Grunde auf "es kommt darauf an" hinausläuft. Im Allgemeinen reicht es aus, die Komponentenbibliothek auf eine - von ihnen selbst überprüfte - JSF 2.0-kompatible Version zu aktualisieren, wie in den Anweisungen beschrieben. Am besten ist es, einfach Unit-Tests zu schreiben, sie vor und nach dem Upgrade auszuführen und etwaige Probleme individuell zu beheben.

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

PrimeFaces hat keinen Migrationsleitfaden für PrimeFaces 1.x zu 2.x, da PrimeFaces 1.x bereits Facelets 1.x benötigt, so dass Sie nur die Migrationsschritte von Facelets 1.x zu 2.x befolgen müssen. Allerdings gibt es eine PrimeFaces Leitfaden für die Migration von 2.x zu 3.x (und höher) was auch für die Migration von PrimeFaces 1.x auf 3.x (oder höher) gelten könnte. Tomahawk hat auch keine Migrationsanleitung. Im Grunde müssen Sie nur die JARs ändern und ggf. alle <t:saveState> Referenzen auf eine anforderungsabhängige Bean, indem man die Bean-Ansicht anforderungsabhängig macht.

7voto

Rafal G. Punkte 4142

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

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

zu:

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

6voto

mvg Punkte 1480

JSF 2.0 haben 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 Probleme bekommen. Nicht alle Komponenten von Richfaces 3 sind auf Richfaces 4 portiert.

Auch das könnte helfen Migration von JSF 1.2-Anwendungen auf JSF 2.0

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

4voto

Pravin Punkte 103

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

0voto

designatevoid Punkte 128

Wenn Sie Apache Trinidad verwenden, müssen Sie es auch auf Version 2.0 aktualisieren, damit es JSF 2.0 unterstützt. Mehr Informationen finden Sie unter Walhalla der Hacker .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X