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.
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.
Unabhängig vom Wechsel der View-Technologie sollten mindestens die folgenden Schritte ausgeführt werden:
/WEB-INF/lib
(falls vorhanden)./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
.
Wenn Sie JSP 2.x verwenden und weiterhin verwenden möchten, müssen Sie im Grunde nichts ändern sonst.
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.
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:
/WEB-INF/lib
.FaceletViewHandler
aus faces-config.xml
.FaceletViewHandler
-Implementierung muss aktualisiert werden, um stattdessen ViewHandlerWrapper
zu erweitern.<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.
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.
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
.
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
.
Sie müssen die JSP-TLD-Dateien in Facelets-TLD-Dateien ändern, wie in diesem Mojarra-Migrationshandbuch beschrieben.
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.
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.
Wenn jemand JSTL mit JSF 1.2 verwendet, sollten Sie beim Upgrade auf JSF2 den Namespace ändern von:
zu:
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?
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">
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 .