Migrazione da JSF 1.2 a JSF 2.0


136

Sto lavorando con un'app piuttosto grande scritta in JSF 1.2 . JSF 1.2 ha circa 6 anni ormai. Devo eseguire l'aggiornamento a JSF 2.0. Quanto sarà doloroso? Ho notato che alcuni attributi nei tag personalizzati sono stati modificati ecc.

Risposte:


245

Dolore

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.

  • Da JSP 2.x a JSP 2.x = Quasi nessuno sforzo.
  • Facelets 1.x to Facelets 2.0 = Piccolo sforzo.
  • JSP 2.x a Facelets 2.0 = Molto sforzo. Raddoppia questo se hai anche componenti personalizzati.

Modifiche di base

Indipendentemente dello switch vista della tecnologia, almeno dovrebbe essere fatto i passi seguenti:

  • Rimuovere i JAR JSF 1.2 da /WEB-INF/lib(se presenti).
  • Rilasciare JAR JSF 2.0 /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.xmlconformità 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.orgdominio dello spazio dei nomi anziché http://java.sun.comnell'intero frammento XML sopra.

  • Assicurarsi che la dichiarazione radice web.xmlsia 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.orgdominio dello spazio dei nomi anziché http://java.sun.comattraverso lo snippet XML sopra riportato.


Da JSP 2.xa JSP 2.x

Se si utilizza JSP 2.x e si desidera continuare a utilizzarlo, in pratica non è necessario modificare nient'altro.

Aggiornamento graduale

Se stai già utilizzando un suffisso url-patternper FacesServlet, ad esempio *.jsf, allora è bene sapere che FacesServletprima scansionerà il *.xhtmlfile e se non è presente, quindi scansiona il *.jspfile. 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 *.jsfe 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.xhtmlcomunque. Quindi, se vuoi venire o andare a *.jsp, allora devi ancora includerlo nel viewid nel modo 1.x JSF.


Facelets 1.x to Facelets 2.0

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:

  • Rimuovere il JAR di Facelets 1.x da /WEB-INF/lib.
  • Rimuovere Facelets 1.x FaceletViewHandlerda faces-config.xml.
  • È invece FaceletViewHandlernecessario aggiornare qualsiasi implementazione personalizzata per estenderla ViewHandlerWrapper.
  • Non necessario, ma solo per la pulizia, rimuovere tutti i <context-param>valori relativi a Facelets 1.x dai web.xmlquali sono già predefiniti in Facelets 2.0, come il javax.faces.DEFAULT_SUFFIXvalore 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.orgdominio dello spazio dei nomi anziché http://java.sun.comnell'intero frammento XML sopra.

In pratica dovrebbe essere quello.


JSP 2.x a Facelets 2.0

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.

Modifiche alla pagina principale

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.orgdominio dello spazio dei nomi anziché http://java.sun.comnei frammenti XHTML sopra.

Includi modifiche alla pagina

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.orgdominio dello spazio dei nomi anziché http://java.sun.comnei frammenti XHTML sopra.

Modifiche ai componenti personalizzati

È necessario modificare i file TLD JSP in file TLD Facelets come descritto nella presente Guida alla migrazione di Mojarra .


conseguenze

Indipendentemente dall'approccio di migrazione, è possibile eliminare gradualmente faces-config.xmltramite 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, @SessionScopede @ApplicationScopeddisponibili. Se si omette l' nameattributo 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.


Librerie di componenti

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.


@ManagedBean (name = "managedBeanName") @RequestScoped È :)
Daniel Szalay,

ottimo post, mi ha aiutato molto. Qualcosa da notare: quando si passa da jsf 1.2 a jsf 2 si può essere quasi certi che le persone abbiano usato a4j da richfaces 3.3.x. Ho deciso di utilizzare richfaces 3.3.3 insieme a jsf 2 poiché mi sembrava un cambiamento mediocre da eseguire per l'aggiornamento a richfaces 4.x. Così ho fatto la tua guida (ho annullato tutte le cose relative a facelets in faces-config (il visualizzatore attivato ha rimosso l'annotazione taglig), quindi ho seguito community.jboss.org/wiki/RichFaces333AndJSF20 e alla fine ho dovuto fare questo stackoverflow.com/questions/85532/…
Toskan,

Bella risposta. Nel mio caso ho anche dovuto impostare il javax.faces.VALIDATE_EMPTY_FIELDSparametro su falseper ordinare la convalida. Vedi anche: stackoverflow.com/questions/6113935/…
Jasper de Vries,


1
@Cfold: ho corretto il collegamento.
BalusC,


6

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?


Sarebbe stato lo stesso quando si utilizza Richfaces con JSF 1.x- si passa attraverso tutto il "dolore" per scoprire come integrare componenti di terze parti con JSF. L'approccio a JSF 2.x non fa differenza. Questa è la "gioia" della programmazione, no? :)
ChuongPham,

4

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.