Antworten:
Die Schwierigkeit, JSF 1.2 auf 2.0 zu aktualisieren, hängt von der Ansichtstechnologie ab, die Sie derzeit verwenden und die Sie verwenden möchten.
Unabhängig vom Wechsel der Ansichtstechnologie sollten mindestens die folgenden Schritte ausgeführt werden:
/WEB-INF/lib
(falls vorhanden)./WEB-INF/lib
Legen Sie JSF 2.0- JARs ab (wenn JSF 1.2 von Servletcontainern bereitgestellt wurde, möchten Sie möglicherweise die Klassenladerichtlinie ändern, um zuerst Webanwendungsbibliotheken vor Servletcontainer-Bibliotheken zu laden, siehe auch Probleme beim Laden von JSF2- Klassen auf Anwendungsservern ).Aktualisieren Sie die Stammdeklaration 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 die http://xmlns.jcp.org
Namespace-Domäne anstelle des http://java.sun.com
gesamten obigen XML-Snippets.
Stellen Sie sicher, dass die Root-Deklaration von web.xml
bereits 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 die http://xmlns.jcp.org
Namespace-Domäne anstelle des http://java.sun.com
gesamten obigen XML-Snippets.
Wenn Sie JSP 2.x verwenden und es weiterhin verwenden möchten , müssen Sie im Grunde nichts anderes ändern.
Wenn Sie bereits ein Suffix url-pattern
für das verwenden FacesServlet
, wie*.jsf
ist es gut zu wissen, dass das FacesServlet
zuerst nach *.xhtml
Dateien sucht und wenn es nicht vorhanden ist, nach suchen*.jsp
Dateien. Auf diese Weise können Sie hinter den Kulissen schrittweise von JSP zu Facelets konvertieren, ohne die URLs zu ändern.
Aber wenn Sie ein Präfix verwenden url-pattern
und nach /faces/*
und nach ein Upgrade von JSP auf Facelets durchführen möchten, müssen Sie es wirklich in *.jsf
und möglicherweise auch in alle Links auf den vorhandenen JSP-Seiten ändern .
Sie müssen nur bedenken, dass die neue implizite Navigation in JSF 2.0 nicht nach dem Vorhandensein der Datei sucht, sondern nach outcome.xhtml
trotzdem. Wenn Sie also von oder zu gehen möchten *.jsp
, müssen Sie es dennoch in die Ansicht auf JSF 1.x-Weise aufnehmen.
Wenn Sie Facelets 1.x als Ansichtstechnologie verwenden und die von JSF 2.0 bereitgestellten Facelets 2.0 verwenden möchten, müssen Sie die folgenden zusätzlichen Schritte ausführen:
/WEB-INF/lib
.FaceletViewHandler
vonfaces-config.xml
.FaceletViewHandler
Implementierung muss aktualisiert werden, um erweitert zu werdenViewHandlerWrapper
stattdessen werden.<context-param>
Werte, von web.xml
denen in Facelets 2.0 bereits Standardwerte vorhanden sind, wie z. B. den javax.faces.DEFAULT_SUFFIX
with-Wert von *.xhtml
.Aktualisieren Sie die Stammdeklaration 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 die http://xmlns.jcp.org
Namespace-Domäne anstelle des http://java.sun.com
gesamten obigen XML-Snippets.
Das sollte es im Grunde sein.
Wenn Sie JSP 2.x als Ansichtstechnologie verwenden und ein Upgrade auf Facelets 2.0 durchführen möchten sofort müssen Sie viele Änderungen vornehmen, bevor die Site live geschaltet werden kann. Sie ändern hier grundsätzlich 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>
..zu der folgenden grundlegenden 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 http://xmlns.jcp.org
stattdessen die Namespace-Domänehttp://java.sun.com
höher verwenden der oben genannten XHTML-Snippets.
Wenn Ihre vorhandenen JSP-Seiten gut gestaltet sind, sollten Sie keine Zeile mit Scriptlet- Code haben und Sie sollten auch nur <jsp:include>
das einzige JSP-spezifische Tag haben. Jedes dieser Elemente muss geändert werden von:
<jsp:include page="include.jsp" />
zu
<ui:include src="include.xhtml" />
Die grundlegende JSP enthält 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 folgenden grundlegenden Facelets gehören 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 höher verwenden , verwenden Sie die http://xmlns.jcp.org
Namespace-Domäne anstellehttp://java.sun.com
der oben genannten XHTML-Snippets.
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 die faces-config.xml
durch die neuen JSF 2.0-Annotationen oder sogar CDI schrittweise entfernen . Jeder <managed-bean>
kann kommentiert werden durch @ManagedBean
:
@ManagedBean(name="managedBeanName")
@RequestScoped
public class SomeBean {}
Neben @RequestScoped
gibt es auch @ViewScoped
, @SessionScoped
und zur @ApplicationScoped
Verfügung. Wenn Sie das name
Attribut von weglassen @ManagedBean
, wird standardmäßig der Klassenname mit dem 1. Zeichen in Kleinbuchstaben verwendet.
@ManagedBean
@RequestScoped
public class SomeBean {}
In diesem speziellen Beispiel wird es sein #{someBean}
.
Jeder <managed-property>
kann mit folgenden Anmerkungen versehen werden @ManagedProperty
:
@ManagedProperty("#{otherBean}")
private OtherBean otherBean;
Jeder <validator>
kann mit folgenden Anmerkungen versehen werden @FacesValidator
:
@FacesValidator("someValidator")
public class SomeValidator implements Validator {}
Jeder <converter>
kann mit kommentiert werden@FacesConverter
@FacesConverter("someConverter")
public class SomeConverter implements Converter {}
Jeder <renderer>
kann mit kommentiert werden@FacesRenderer
@FacesRenderer(componentFamily="someComponentFamily", rendererType="someRendererType")
public class SomeRenderer extends Renderer {}
Alle, <navigation-case>
die den Dateinamen der XHTML-Seite als beides verwenden <from-outcome>
und entfernt werden <to-view-id>
können, da dies implizit erfolgt erfolgt. Dies kann schrittweise erfolgen, indem alle Ergebniswerte so geändert werden, dass sie mit dem Dateinamen der Zielansicht übereinstimmen.
Schließlich kann jede Bean mit Sitzungsbereich, die in die Sitzung mit dem einzigen Grund aufgenommen wurde, die Bean-Daten in nachfolgenden Anforderungen in derselben Registerkarte / demselben Fenster beizubehalten, besser markiert werden @ViewScoped
, da die Bean auf diese Weise beim Öffnen des Endbenutzers nicht betroffen ist die gleiche Seite in verschiedenen Registerkarten / Fenstern.
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 genommen um "es kommt darauf an" handelt. Im Allgemeinen reicht es aus, die Komponentenbibliothek gemäß den Anweisungen auf eine von sich selbst überprüfte JSF 2.0-kompatible Version zu aktualisieren. Am besten schreiben Sie einfach Unit-Tests, führen sie vor und nach dem Upgrade aus und beheben alle Probleme einzeln.
Hier sind zumindest einige nützliche Links zur Migration der spezifischen Komponentenbibliothek:
PrimeFaces hat keinen Migrationsleitfaden für PrimeFaces 1.x bis 2.x, da für PrimeFaces 1.x bereits Facelets 1.x erforderlich ist. Sie müssen also nur die Migrationsschritte für Facelets 1.x bis 2.x ausführen. Es gibt jedoch einen PrimeFaces 2.x bis 3.x (und höher) Migrationsleitfaden, der möglicherweise auch für die Migration von PrimeFaces 1.x auf 3.x (oder höher) gilt. Tomahawk hat auch keinen Migrationsleitfaden. 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 mit Gültigkeitsbereich festlegen.
javax.faces.VALIDATE_EMPTY_FIELDS
Parameter einstellen false
, um die Validierung zu sortieren. Siehe auch: stackoverflow.com/questions/6113935/…
Eine Sache zu erwähnen ist, dass wenn jemand JSTL mit JSF 1.2 verwendet, Sie beim Upgrade auf JSF2 den Namespace ändern sollten von:
zu:
JSF 2.0 verfügt über 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ängig ist, treten Probleme auf. Nicht alle Komponenten von Richfaces 3 sind auf Richfaces 4 portiert.
Dies kann auch die Migration von JSF 1.2-Anwendungen auf JSF 2.0 unterstützen
Überprüfen Sie auch, was in JSF 2 neu ist.
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 es auch auf Version 2.0 aktualisieren, damit es JSF 2.0 unterstützt. Es gibt mehr Infos bei Hacker's Valhalla .