JavaServer Faces (JSF) dengan Spring

1. Ikhtisar

Pada artikel ini kita akan melihat resep untuk mengakses kacang yang didefinisikan di Spring dari dalam kacang yang dikelola JSF dan halaman JSF, untuk tujuan mendelegasikan eksekusi logika bisnis ke kacang Spring.

Artikel ini menganggap pembaca memiliki pemahaman sebelumnya tentang JSF dan Spring secara terpisah. Artikel tersebut didasarkan pada implementasi Mojarra dari JSF.

2. Di Musim Semi

Mari kita definisikan kacang berikut di Spring. The UserManagementDAO kacang menambahkan nama pengguna ke sebuah toko di memori, dan itu ditentukan oleh antarmuka berikut:

public interface UserManagementDAO { boolean createUser(String newUserData); }

Implementasi kacang dikonfigurasi menggunakan konfigurasi Java berikut:

public class SpringCoreConfig { @Bean public UserManagementDAO userManagementDAO() { return new UserManagementDAOImpl(); } }

Atau menggunakan konfigurasi XML berikut:

Kami mendefinisikan kacang dalam XML, dan mendaftarkan CommonAnnotationBeanPostProcessor untuk memastikan bahwa anotasi @PostConstruct diambil.

3. Konfigurasi

Bagian berikut menjelaskan item konfigurasi yang memungkinkan integrasi konteks Spring dan JSF.

3.1. Konfigurasi Java Tanpa web.xml

Dengan menerapkan WebApplicationInitializer kami dapat mengkonfigurasi ServletContext secara terprogram. Berikut ini adalah implementasi onStartup () di dalam kelas MainWebAppInitializer :

public void onStartup(ServletContext sc) throws ServletException { AnnotationConfigWebApplicationContext root = new AnnotationConfigWebApplicationContext(); root.register(SpringCoreConfig.class); sc.addListener(new ContextLoaderListener(root)); }

The AnnotationConfigWebApplicationContext bootstraps konteks Spring'g dan menambahkan kacang dengan mendaftarkan SpringCoreConfig kelas.

Demikian pula, dalam implementasi Mojarra ada kelas FacesInitializer yang mengonfigurasi FacesServlet. Untuk menggunakan konfigurasi ini, cukup memperluas FacesInitializer. Implementasi lengkap MainWebAppInitializer, sekarang adalah sebagai berikut:

public class MainWebAppInitializer extends FacesInitializer implements WebApplicationInitializer { public void onStartup(ServletContext sc) throws ServletException { AnnotationConfigWebApplicationContext root = new AnnotationConfigWebApplicationContext(); root.register(SpringCoreConfig.class); sc.addListener(new ContextLoaderListener(root)); } }

3.2. Dengan web.xml

Kami akan mulai dengan mengkonfigurasi ContextLoaderListener di file web.xml aplikasi:

  org.springframework.web.context.ContextLoaderListener  

Pendengar ini bertanggung jawab untuk memulai konteks aplikasi Musim Semi saat aplikasi web dijalankan. Listener ini akan mencari file konfigurasi pegas bernama applicationContext.xml secara default.

3.3. wajah-config.xml

Kami sekarang mengkonfigurasi SpringBeanFacesELResolver di file face-config.xml :

org.springframework.web.jsf.el.SpringBeanFacesELResolver

Penyelesai EL adalah komponen yang dapat dicolokkan yang didukung oleh kerangka kerja JSF, memungkinkan kita menyesuaikan perilaku runtime JSF saat mengevaluasi ekspresi Bahasa Ekspresi (EL). Penyelesai EL ini akan memungkinkan JSF runtime mengakses komponen Spring melalui ekspresi EL yang ditentukan di JSF.

4. Mengakses Spring Beans di JSF

Pada titik ini, aplikasi web JSF kita siap untuk mengakses kacang Musim Semi kita dari kacang pendukung JSF, atau dari halaman JSF.

4.1. Dari Backing Bean JSF 2.0

Kacang Spring sekarang dapat diakses dari kacang pendukung JSF. Bergantung pada versi JSF yang Anda jalankan, ada dua metode yang memungkinkan. Dengan JSF 2.0, Anda menggunakan penjelasan @ManagedProperty pada kacang yang dikelola JSF.

@ManagedBean(name = "registration") @RequestScoped public class RegistrationBean implements Serializable { @ManagedProperty(value = "#{userManagementDAO}") transient private IUserManagementDAO theUserDao; private String userName;
 // getters and setters }

Perhatikan bahwa pengambil dan penyetel adalah wajib saat menggunakan @ManagedProperty.

Sekarang - untuk menegaskan aksesibilitas kacang musim semi dari kacang yang dikelola, kita akan menambahkan metode createNewUser () :

public void createNewUser() { FacesContext context = FacesContext.getCurrentInstance(); boolean operationStatus = userDao.createUser(userName); context.isValidationFailed(); if (operationStatus) { operationMessage = "User " + userName + " created"; } } 

Inti dari metode ini adalah menggunakan kacang userDao Spring, dan mengakses fungsinya.

4.2. Dari Backing Bean di JSF 2.2

Pendekatan lain, hanya valid di JSF2.2 dan yang lebih baru, adalah menggunakan anotasi @Inject CDI . Ini berlaku untuk kacang yang dikelola JSF (dengan anotasi @ManagedBean ), dan kacang yang dikelola CDI (dengan anotasi @Named ).

Memang, dengan penjelasan CDI, ini adalah satu-satunya metode yang valid untuk memasukkan kacang:

@Named( "registration") @RequestScoped public class RegistrationBean implements Serializable { @Inject UserManagementDAO theUserDao; }

Dengan pendekatan ini, pengambil dan penyetel tidak diperlukan. Perhatikan juga bahwa ekspresi EL tidak ada.

4.3. Dari Tampilan JSF

Metode createNewUser () akan dipicu dari halaman JSF berikut:

Untuk merender halaman, mulai server dan arahkan ke:

//localhost:8080/jsf/index.jsf

Kita juga bisa menggunakan EL dalam tampilan JSF, untuk mengakses kacang Spring. Untuk mengujinya cukup dengan mengubah baris nomor 7 dari halaman JSF yang diperkenalkan sebelumnya menjadi:

Here, we call the createUser method directly on the Spring DAO, passing the bind value of the userName to the method from within the JSF page, circumventing the managed bean all together.

5. Conclusion

We examined a basic integration between the Spring and JSF contexts, where we’re able to access a Spring bean in a JSF bean and page.

It’s worth noting that while the JSF runtime provides the pluggable architecture that enables the Spring framework to provide integration components, the annotations from the Spring framework cannot be used in a JSF context and vice versa.

Artinya, Anda tidak dapat menggunakan anotasi seperti @Autowired atau @Component dll. Dalam kacang yang dikelola JSF, atau menggunakan penjelasan @ManagedBean pada kacang yang dikelola Spring. Namun Anda dapat, menggunakan anotasi @Inject di kedua kacang yang dikelola JSF 2.2+, dan kacang Spring (karena Spring mendukung JSR-330).

Kode sumber yang menyertai artikel ini tersedia di GitHub.