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.
Jawaban:
Sulitnya mengupgrade JSF 1.2 ke 2.0 bergantung pada teknologi tampilan yang saat ini Anda gunakan dan yang ingin Anda gunakan.
Terlepas dari sakelar teknologi tampilan, setidaknya langkah-langkah berikut harus dilakukan:
/WEB-INF/lib
(jika ada)./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.xml
untuk 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.org
domain namespace alih-alih di http://java.sun.com
seluruh potongan XML di atas.
Pastikan bahwa deklarasi root web.xml
sudah 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.org
domain namespace alih-alih di http://java.sun.com
seluruh potongan XML di atas.
Jika Anda menggunakan JSP 2.x dan ingin tetap menggunakannya, pada dasarnya Anda tidak perlu mengubah apa pun.
Jika Anda sudah menggunakan sufiks url-pattern
untuk FacesServlet
, like *.jsf
, maka ada baiknya mengetahui bahwa file FacesServlet
akan dipindai terlebih dahulu *.xhtml
dan jika tidak ada, maka pindai *.jsp
file. 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 *.jsf
dan 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.
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:
/WEB-INF/lib
.FaceletViewHandler
dari faces-config.xml
.FaceletViewHandler
Penerapan khusus apa pun perlu diperbarui untuk memperluasnya ViewHandlerWrapper
.<context-param>
nilai terkait Facelet 1.x web.xml
yang sudah menjadi default di Facelet 2.0, seperti nilai javax.faces.DEFAULT_SUFFIX
dengan *.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.org
domain namespace alih-alih di http://java.sun.com
seluruh potongan XML di atas.
Seharusnya begitu.
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.
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.org
domain namespace alih-alih di http://java.sun.com
seluruh cuplikan XHTML di atas.
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.org
domain namespace alih-alih di http://java.sun.com
seluruh cuplikan XHTML di atas.
Anda perlu mengubah file JSP TLD menjadi file TLD Facelet seperti yang dijelaskan dalam Panduan Migrasi Mojarra ini .
Terlepas dari pendekatan migrasi, Anda dapat secara bertahap menghilangkan faces-config.xml
oleh 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
, @SessionScoped
dan @ApplicationScoped
tersedia. Jika Anda menghilangkan name
atribut 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.
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.
javax.faces.VALIDATE_EMPTY_FIELDS
parameter false
untuk mendapatkan validasi diurutkan. Lihat juga: stackoverflow.com/questions/6113935/…
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?
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">
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 .