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.
Antworten
Zu viele Anzeigen?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 vonhttp://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 vonhttp://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
vonfaces-config.xml
. - Jede benutzerdefinierte
FaceletViewHandler
Die Umsetzung muss aktualisiert werden, um dieViewHandlerWrapper
stattdessen. - Nicht notwendig, aber nur zum Aufräumen, entfernen Sie alle Facelets 1.x bezogenen
<context-param>
Werte vonweb.xml
die in Facelets 2.0 bereits voreingestellt sind, wie diejavax.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 vonhttp://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:
- RichFaces Migrationsleitfaden - Migration von 3.3.x nach 4.x
- IceFaces 2 Wiki - IceFaces 1.x Kompatibilitätsleitfaden
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.
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?
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">
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 .