Risposte:
La dolorosità dell'aggiornamento di JSF da 1.2 a 2.0 dipende dalla tecnologia di visualizzazione attualmente in uso e che si desidera utilizzare.
Indipendentemente dello switch vista della tecnologia, almeno dovrebbe essere fatto i passi seguenti:
/WEB-INF/lib
(se presenti)./WEB-INF/lib
(se JSF 1.2 è stato fornito con servletcontainer, è possibile che si desideri modificare la politica di caricamento delle classi per caricare le librerie webapp prima delle librerie servletcontainer, vedere anche problemi di caricamento delle classi JSF2 nei server delle applicazioni ).Aggiorna la dichiarazione radice di faces-config.xml
conformità alle specifiche JSF 2.0.
<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">
Nota: quando si utilizza JSF 2.2 o versione successiva, utilizzare il http://xmlns.jcp.org
dominio dello spazio dei nomi anziché http://java.sun.com
nell'intero frammento XML sopra.
Assicurarsi che la dichiarazione radice web.xml
sia già conforme almeno al servlet 2.5. JSF 2.0 non funzionerà su 2.4 o versioni precedenti ( sebbene sia hackerabile ).
<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">
Nota: quando si utilizza Servlet 3.0 o versione successiva, utilizzare il http://xmlns.jcp.org
dominio dello spazio dei nomi anziché http://java.sun.com
attraverso lo snippet XML sopra riportato.
Se si utilizza JSP 2.x e si desidera continuare a utilizzarlo, in pratica non è necessario modificare nient'altro.
Se stai già utilizzando un suffisso url-pattern
per FacesServlet
, ad esempio *.jsf
, allora è bene sapere che FacesServlet
prima scansionerà il *.xhtml
file e se non è presente, quindi scansiona il *.jsp
file. Questo ti offre lo spazio per convertire gradualmente da JSP a Facelets dietro le quinte senza cambiare gli URL.
Ma se stai usando un prefisso url-pattern
, come /faces/*
e vuoi aggiornare gradualmente da JSP a Facelets, allora devi davvero cambiarlo *.jsf
e possibilmente anche tutti i collegamenti nelle pagine JSP esistenti.
Devi solo tenere a mente che il nuovo JSF 2.0 fornito navigazione implicita non cerca la presenza del file, andrà outcome.xhtml
comunque. Quindi, se vuoi venire o andare a *.jsp
, allora devi ancora includerlo nel viewid nel modo 1.x JSF.
Se si utilizza Facelets 1.x come tecnologia di visualizzazione e si desidera utilizzare Facelets 2.0 fornito da JSF 2.0 , è necessario eseguire i seguenti passaggi aggiuntivi:
/WEB-INF/lib
.FaceletViewHandler
da faces-config.xml
.FaceletViewHandler
necessario aggiornare qualsiasi implementazione personalizzata per estenderla ViewHandlerWrapper
.<context-param>
valori relativi a Facelets 1.x dai web.xml
quali sono già predefiniti in Facelets 2.0, come il javax.faces.DEFAULT_SUFFIX
valore with *.xhtml
.Aggiorna la dichiarazione radice degli XML taglib di Facelet esistenti per conformarsi a Facelets 2.0.
<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">
Nota: quando si utilizza JSF 2.2 o versione successiva, utilizzare il http://xmlns.jcp.org
dominio dello spazio dei nomi anziché http://java.sun.com
nell'intero frammento XML sopra.
In pratica dovrebbe essere quello.
Se si utilizza JSP 2.x come tecnologia di visualizzazione e si desidera eseguire immediatamente l' aggiornamento a Facelets 2.0 , è necessario apportare molte modifiche prima che il sito possa essere pubblicato. Stai sostanzialmente cambiando la tecnologia di visualizzazione qui.
Su ogni pagina principale, è necessario modificare il seguente modello JSP di base.
<%@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>
..per il seguente modello di base Facelets:
<!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>
Nota: quando si utilizza JSF 2.2 o versioni successive, utilizzare il http://xmlns.jcp.org
dominio dello spazio dei nomi anziché http://java.sun.com
nei frammenti XHTML sopra.
Se le tue pagine JSP esistenti sono ben progettate, non dovresti avere nessuna riga di codice scriptlet e dovresti avere solo <jsp:include>
il solo tag specifico di JSP. Ognuno di questi deve essere modificato da:
<jsp:include page="include.jsp" />
per
<ui:include src="include.xhtml" />
Il JSP di base include un modello di pagina di ..
<%@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>
..dovrebbe essere modificato nei seguenti Facelets include il modello di pagina:
<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>
Nota: quando si utilizza JSF 2.2 o versioni successive, utilizzare il http://xmlns.jcp.org
dominio dello spazio dei nomi anziché http://java.sun.com
nei frammenti XHTML sopra.
È necessario modificare i file TLD JSP in file TLD Facelets come descritto nella presente Guida alla migrazione di Mojarra .
Indipendentemente dall'approccio di migrazione, è possibile eliminare gradualmente faces-config.xml
tramite le nuove annotazioni JSF 2.0 o anche il CDI . Qualsiasi <managed-bean>
può essere annotato da @ManagedBean
:
@ManagedBean(name="managedBeanName")
@RequestScoped
public class SomeBean {}
Accanto a @RequestScoped
, ci sono anche @ViewScoped
, @SessionScoped
e @ApplicationScoped
disponibili. Se si omette l' name
attributo di @ManagedBean
, verrà impostato automaticamente su classname con il primo carattere minuscolo.
@ManagedBean
@RequestScoped
public class SomeBean {}
In questo esempio particolare, lo sarà #{someBean}
.
Qualsiasi <managed-property>
può essere annotato usando @ManagedProperty
:
@ManagedProperty("#{otherBean}")
private OtherBean otherBean;
Qualsiasi <validator>
può essere annotato usando @FacesValidator
:
@FacesValidator("someValidator")
public class SomeValidator implements Validator {}
Qualsiasi <converter>
può essere annotato usando@FacesConverter
@FacesConverter("someConverter")
public class SomeConverter implements Converter {}
Qualsiasi <renderer>
può essere annotato usando@FacesRenderer
@FacesRenderer(componentFamily="someComponentFamily", rendererType="someRendererType")
public class SomeRenderer extends Renderer {}
Chiunque <navigation-case>
utilizzi il nome del file della pagina XHTML come entrambi <from-outcome>
e <to-view-id>
può essere rimosso poiché ciò sarà implicitamente fatto. Questo può essere fatto gradualmente modificando tutti i valori di risultato in modo che corrispondano al nome file della vista di destinazione.
Infine, è possibile contrassegnare meglio qualsiasi bean con ambito sessione inserito nella sessione con l'unico motivo di conservare i dati del bean nelle richieste successive nella stessa scheda / finestra @ViewScoped
, poiché in questo modo il bean non sarà interessato all'apertura dell'utente finale la stessa pagina in diverse schede / finestre.
Nota che non prendo in considerazione alcuna libreria componibile di terze parti come PrimeFaces / RichFaces / IceFaces in questa risposta, sarebbe quindi impossibile scrivere una risposta affidabile poiché sostanzialmente si riduce a "dipende". In generale è sufficiente aggiornare la libreria dei componenti in una versione compatibile con JSF 2.0 da loro stessi verificata secondo le loro istruzioni. La cosa migliore è semplicemente scrivere unit test, eseguirli prima e dopo l'aggiornamento e risolvere eventuali problemi individualmente.
Ecco almeno alcuni link utili per quanto riguarda la migrazione della libreria dei componenti specifici:
PrimeFaces non ha una guida alla migrazione per PrimeFaces 1.xa 2.x poiché PrimeFaces 1.x richiede già Facelets 1.x, quindi devi solo seguire le fasi di migrazione di Facelets 1.xa 2.x. Tuttavia, esiste una guida alla migrazione da PrimeFaces 2.xa 3.x (e successive) che potrebbe applicarsi anche alla migrazione da PrimeFaces 1.xa 3.x (o superiore). Anche Tomahawk non ha una guida alla migrazione. Fondamentalmente l'unico che è necessario modificare sono i JAR e, se necessario, eliminare tutti i <t:saveState>
riferimenti su un bean con ambito di richiesta rendendo la vista con ambito.
javax.faces.VALIDATE_EMPTY_FIELDS
parametro su false
per ordinare la convalida. Vedi anche: stackoverflow.com/questions/6113935/…
Una cosa da menzionare è che se qualcuno sta usando JSTL con JSF 1.2, durante l'aggiornamento a JSF2 dovresti cambiare lo spazio dei nomi da:
per:
JSF 2.0 ha molte nuove funzionalità e componenti e non credo che la migrazione sarà dolorosa. L'unica area che troverai difficile è l'uso delle librerie di terze parti. Se la tua applicazione è fortemente dipendente da librerie come Richfaces, dovrai affrontare un problema. Non tutti i componenti di Richfaces 3 sono portati su Richfaces 4.
Questo potrebbe anche aiutare la migrazione dell'applicazione JSF 1.2 a JSF 2.0
Controlla anche questo Cosa c'è di nuovo in JSF 2?
web.xml
Add the jars
1. jsf-api-2.0.jar
2. jsf-impl.2.0.2.jar
Passaggio 1: modifica 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>
Passaggio 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>
Fase 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">
Se stai usando Apache Trinidad dovrai anche aggiornarlo alla versione 2.0 in modo che supporti JSF 2.0. Ulteriori informazioni su Valhalla di Hacker .