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.