Bermigrasi dari JSF 1.2 ke JSF 2.0

136

Saya bekerja dengan aplikasi yang agak besar yang ditulis di JSF 1.2 . JSF 1.2 berusia sekitar 6 tahun sekarang. Saya perlu meningkatkan ke JSF 2.0. Betapa menyakitkan ini? Saya melihat bahwa beberapa atribut di tag khusus telah diubah, dll.

mkoryak
sumber

Jawaban:

246

Sakit

Sulitnya mengupgrade JSF 1.2 ke 2.0 bergantung pada teknologi tampilan yang saat ini Anda gunakan dan yang ingin Anda gunakan.

  • JSP 2.x ke JSP 2.x = Hampir tidak ada usaha.
  • Facelet 1.x ke Facelet 2.0 = Sedikit usaha.
  • JSP 2.x ke Facelet 2.0 = Banyak usaha. Gandakan ini jika Anda juga memiliki komponen khusus.

Perubahan dasar

Terlepas dari sakelar teknologi tampilan, setidaknya langkah-langkah berikut harus dilakukan:

  • Hapus JSF 1.2 JAR dari /WEB-INF/lib(jika ada).
  • Letakkan JAR JSF 2.0 di /WEB-INF/lib(jika JSF 1.2 disediakan oleh servletcontainer, Anda mungkin ingin mengubah kebijakan pemuatan kelas untuk memuat pustaka webapp terlebih dahulu sebelum pustaka servletcontainer, lihat juga masalah pemuatan kelas JSF2 di server aplikasi ).
  • Perbarui deklarasi root faces-config.xmluntuk mematuhi spesifikasi 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">
    

    Catatan: saat Anda menggunakan JSF 2.2 atau yang lebih baru, gunakan http://xmlns.jcp.orgdomain namespace alih-alih di http://java.sun.comseluruh potongan XML di atas.

  • Pastikan bahwa deklarasi root web.xmlsudah memenuhi setidaknya Servlet 2.5. JSF 2.0 tidak akan berfungsi pada 2.4 atau lebih rendah ( meskipun dapat diretas ).

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

    Catatan: saat Anda menggunakan Servlet 3.0 atau yang lebih baru, gunakan http://xmlns.jcp.orgdomain namespace alih-alih di http://java.sun.comseluruh potongan XML di atas.


JSP 2.x ke JSP 2.x

Jika Anda menggunakan JSP 2.x dan ingin tetap menggunakannya, pada dasarnya Anda tidak perlu mengubah apa pun.

Meningkatkan secara bertahap

Jika Anda sudah menggunakan sufiks url-patternuntuk FacesServlet, like *.jsf, maka ada baiknya mengetahui bahwa file FacesServletakan dipindai terlebih dahulu *.xhtmldan jika tidak ada, maka pindai *.jspfile. Ini memberi Anda ruang untuk secara bertahap mengkonversi dari JSP ke Facelet di belakang layar tanpa mengubah URL-nya.

Tetapi jika Anda menggunakan prefiks url-pattern, like /faces/*dan Anda ingin mengupgrade secara bertahap dari JSP ke Facelet, maka Anda benar-benar harus mengubahnya menjadi *.jsfdan mungkin juga semua tautan di halaman JSP yang ada.

Anda hanya perlu mengingat bahwa JSF 2.0 baru yang menyediakan navigasi implisit tidak memindai keberadaan file, namun tetap akan pergi outcome.xhtml. Jadi jika Anda ingin datang dari atau pergi ke *.jsp, maka Anda masih perlu memasukkannya ke viewid dengan cara JSF 1.x.


Facelet 1.x hingga Facelet 2.0

Jika Anda menggunakan Facelet 1.x sebagai teknologi tampilan dan ingin menggunakan Facelet 2.0 yang disediakan JSF 2.0 , Anda perlu melakukan langkah-langkah tambahan berikut:

  • Hapus Facelet 1.x JAR dari /WEB-INF/lib.
  • Hapus Facelet 1.x FaceletViewHandlerdari faces-config.xml.
  • FaceletViewHandlerPenerapan khusus apa pun perlu diperbarui untuk memperluasnya ViewHandlerWrapper.
  • Tidak perlu, tetapi hanya untuk pembersihan, hapus semua <context-param>nilai terkait Facelet 1.x web.xmlyang sudah menjadi default di Facelet 2.0, seperti nilai javax.faces.DEFAULT_SUFFIXdengan *.xhtml.
  • Perbarui deklarasi root dari XML taglib Facelet yang ada agar sesuai dengan Facelet 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">
    

    Catatan: saat Anda menggunakan JSF 2.2 atau yang lebih baru, gunakan http://xmlns.jcp.orgdomain namespace alih-alih di http://java.sun.comseluruh potongan XML di atas.

Seharusnya begitu.


JSP 2.x hingga Facelet 2.0

Jika Anda menggunakan JSP 2.x sebagai teknologi tampilan dan ingin segera memutakhirkan ke Facelet 2.0 , Anda perlu melakukan banyak perubahan sebelum situs dapat ditayangkan. Anda pada dasarnya mengubah teknologi tampilan di sini.

Perubahan halaman master

Di setiap halaman master, Anda perlu mengubah template JSP dasar berikut ..

<%@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>

..ke template Faselet dasar berikut:

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

Catatan: saat Anda menggunakan JSF 2.2 atau yang lebih baru, gunakan http://xmlns.jcp.orgdomain namespace alih-alih di http://java.sun.comseluruh cuplikan XHTML di atas.

Sertakan perubahan halaman

Jika halaman JSP Anda yang ada dirancang dengan baik, Anda tidak boleh memiliki baris kode scriptlet apa pun dan Anda juga harus memiliki hanya <jsp:include>sebagai satu-satunya tag khusus JSP. Semua itu perlu diubah dari:

<jsp:include page="include.jsp" />

untuk

<ui:include src="include.xhtml" />

JSP dasar menyertakan template halaman dari ..

<%@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>

..harus diubah menjadi Faselet dasar berikut termasuk template halaman:

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

Catatan: saat Anda menggunakan JSF 2.2 atau yang lebih baru, gunakan http://xmlns.jcp.orgdomain namespace alih-alih di http://java.sun.comseluruh cuplikan XHTML di atas.

Perubahan komponen kustom

Anda perlu mengubah file JSP TLD menjadi file TLD Facelet seperti yang dijelaskan dalam Panduan Migrasi Mojarra ini .


Akibat

Terlepas dari pendekatan migrasi, Anda dapat secara bertahap menghilangkan faces-config.xmloleh anotasi JSF 2.0 baru atau bahkan CDI . Apa pun <managed-bean>dapat diberi keterangan oleh @ManagedBean:

@ManagedBean(name="managedBeanName")
@RequestScoped
public class SomeBean {}

Di samping @RequestScoped, ada juga @ViewScoped, @SessionScopeddan @ApplicationScopedtersedia. Jika Anda menghilangkan nameatribut dari @ManagedBean, maka itu akan default ke nama kelas dengan karakter pertama huruf kecil.

@ManagedBean
@RequestScoped
public class SomeBean {}

Dalam contoh khusus ini, itu akan terjadi #{someBean}.

Apa pun <managed-property>dapat diberi anotasi menggunakan @ManagedProperty:

@ManagedProperty("#{otherBean}")
private OtherBean otherBean;

Apa pun <validator>dapat diberi anotasi menggunakan @FacesValidator:

@FacesValidator("someValidator")
public class SomeValidator implements Validator {}

Apa <converter>pun dapat dianotasi menggunakan@FacesConverter

@FacesConverter("someConverter")
public class SomeConverter implements Converter {}

Apa <renderer>pun dapat dianotasi menggunakan@FacesRenderer

@FacesRenderer(componentFamily="someComponentFamily", rendererType="someRendererType")
public class SomeRenderer extends Renderer {}

Semua <navigation-case>yang menggunakan nama file dari halaman XHTML sebagai keduanya <from-outcome>dan <to-view-id>dapat dihapus karena ini akan dilakukan secara implisit . Ini dapat dilakukan secara bertahap dengan mengubah semua nilai hasil agar sesuai dengan nama file tampilan target.

Akhirnya, kacang cakupan sesi apa pun yang telah diletakkan di sesi dengan satu-satunya alasan untuk menyimpan data kacang dalam permintaan berikutnya di tab / jendela yang sama dapat lebih baik ditandai @ViewScoped, karena dengan cara ini kacang tidak akan terpengaruh saat pengguna akhir terbuka halaman yang sama di tab / jendela berbeda.


Perpustakaan komponen

Perhatikan bahwa saya tidak mengambil pustaka komponen pihak ketiga seperti PrimeFaces / RichFaces / IceFaces ke dalam akun dalam jawaban ini, maka tidak mungkin untuk menulis jawaban yang dapat diandalkan karena pada dasarnya bermuara pada "itu tergantung". Secara umum, cukup dengan memutakhirkan pustaka komponen ke versi -diri diverifikasi- JSF 2.0 yang kompatibel sesuai instruksi mereka. Yang terbaik adalah menulis pengujian unit, menjalankannya sebelum dan sesudah peningkatan, dan memperbaiki masalah apa pun satu per satu.

Berikut ini setidaknya beberapa tautan berguna yang berkaitan dengan migrasi pustaka komponen tertentu:

PrimeFaces tidak memiliki panduan migrasi untuk PrimeFaces 1.x ke 2.x karena PrimeFaces 1.x sudah memerlukan Facelet 1.x, jadi Anda hanya perlu mengikuti langkah-langkah migrasi Facelet 1.x ke 2.x. Namun, ada panduan migrasi PrimeFaces 2.x ke 3.x (dan lebih tinggi) yang mungkin berlaku juga saat bermigrasi dari PrimeFaces 1.x ke 3.x (atau lebih tinggi). Tomahawk juga tidak memiliki panduan migrasi. Pada dasarnya, satu-satunya yang perlu Anda ubah adalah JAR dan jika perlu singkirkan semua <t:saveState>referensi pada kacang bercakupan permintaan dengan membuat tampilan kacang tercakup.

BalusC
sumber
@ManagedBean (name = "managedBeanName") @RequestScoped Ini :)
Daniel Szalay
pos yang bagus, banyak membantu saya. Sesuatu yang perlu diperhatikan: ketika berpindah dari jsf 1.2 ke jsf 2 Anda bisa jadi hampir pasti orang telah menggunakan a4j dari richfaces 3.3.x. Saya memutuskan untuk menggunakan richfaces 3.3.3 bersama dengan jsf 2 karena sepertinya perubahan yang biasa-biasa saja untuk melakukan upgrade ke richfaces 4.x. Jadi saya melakukan panduan Anda (membatalkan semua hal yang berhubungan dengan facelet di face-config (viewhandler yang diaktifkan menghapus anotasi taglig), lalu mengikuti community.jboss.org/wiki/RichFaces333AndJSF20 dan akhirnya harus melakukan stackoverflow.com/questions/85532/…
Toskan
Jawaban yang bagus. Dalam kasus saya, saya juga harus mengatur javax.faces.VALIDATE_EMPTY_FIELDSparameter falseuntuk mendapatkan validasi diurutkan. Lihat juga: stackoverflow.com/questions/6113935/…
Jasper de Vries
2
Saya juga dapat merekomendasikan semua orang untuk membaca balusc.blogspot.nl/2011/09/communication-in-jsf-20.html
Jasper de Vries
1
@Cfold: Saya memperbaiki tautannya.
BalusC
7

Satu hal yang perlu disebutkan adalah bahwa jika ada yang menggunakan JSTL dengan JSF 1.2 maka saat mengupgrade ke JSF2 Anda harus mengubah namespace dari:

http://java.sun.com/jstl/core

untuk:

http://java.sun.com/jsp/jstl/core

Rafal G.
sumber
2
Catatan: ini hanya berlaku saat Anda bermigrasi dari Facelet 1.x ke 2.x.
BalusC
Dan untuk
versi
6

JSF 2.0 memiliki banyak fitur dan komponen baru dan saya tidak merasa migrasi akan menyakitkan. Satu-satunya area yang akan sulit bagi Anda adalah menggunakan perpustakaan partai ketiga. Jika aplikasi Anda sangat bergantung pada pustaka seperti Richfaces maka Anda akan menghadapi masalah. Tidak semua komponen dari Richfaces 3 di-porting ke Richfaces 4.

Ini juga dapat membantu migrasi aplikasi JSF 1.2 ke JSF 2.0

Juga periksa ini Apa yang baru di JSF 2?

mvg
sumber
Ini akan menjadi sama ketika Anda menggunakan Richfaces dengan JSF 1.x- Anda melalui semua "kesulitan" untuk mengetahui bagaimana mengintegrasikan komponen pihak ketiga dengan JSF. Pendekatan ke JSF 2.x tidak ada perbedaan. Itulah "kesenangan" dari pemrograman bukan? :)
ChuongPham
4

Web.xml

 Add the jars
    1. jsf-api-2.0.jar 
    2. jsf-impl.2.0.2.jar

Langkah 1: Ubah 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>

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

Langkah3: 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">
Pravin
sumber
0

Jika Anda menggunakan Apache Trinidad, Anda juga harus memutakhirkannya ke versi 2.0 agar mendukung JSF 2.0. Ada info lebih lanjut di Hacker's Valhalla .

designatevoid
sumber