JavaServer Faces (JSF) dengan Spring

1. Gambaran keseluruhan

Dalam artikel ini kita akan melihat resipi untuk mengakses kacang yang ditakrifkan pada musim bunga dari dalam kacang yang diuruskan JSF dan halaman JSF, untuk tujuan mendelegasikan pelaksanaan logik perniagaan ke kacang musim bunga.

Artikel ini menganggap pembaca mempunyai pemahaman terlebih dahulu mengenai JSF dan Spring secara berasingan. Artikel ini berdasarkan pelaksanaan JSF Mojarra.

2. Pada musim bunga

Mari kita ketahui kacang berikut pada musim bunga. The UserManagementDAO kacang menambah nama pengguna ke gedung dalam ingatan, dan ia ditakrifkan oleh antara muka berikut:

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

Pelaksanaan kacang dikonfigurasi menggunakan konfigurasi Java berikut:

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

Atau menggunakan konfigurasi XML berikut:

Kami menentukan kacang dalam XML, dan mendaftarkan CommonAnnotationBeanPostProcessor untuk memastikan bahawa anotasi @PostConstruct diambil.

3. Konfigurasi

Bahagian berikut menerangkan item konfigurasi yang memungkinkan penyatuan konteks Spring dan JSF.

3.1. Konfigurasi Java Tanpa web.xml

Dengan melaksanakan WebApplicationInitializer kita dapat mengkonfigurasi ServletContext secara program. Berikut ini adalah pelaksanaan 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 menambah kacang dengan mendaftarkan SpringCoreConfig kelas.

Begitu juga, dalam pelaksanaan Mojarra terdapat kelas FacesInitializer yang mengkonfigurasi FacesServlet. Untuk menggunakan konfigurasi ini, cukup untuk memperluas FacesInitializer. Pelaksanaan lengkap MainWebAppInitializer, adalah seperti 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

Kita akan mulakan dengan mengkonfigurasi ContextLoaderListener dalam fail web.xml aplikasi:

  org.springframework.web.context.ContextLoaderListener  

Pendengar ini bertanggungjawab untuk memulakan konteks aplikasi Spring ketika aplikasi web dimulakan. Pendengar ini akan mencari fail konfigurasi spring yang bernama applicationContext.xml secara lalai.

3.3. wajah-config.xml

Kami sekarang mengkonfigurasi SpringBeanFacesELResolver dalam fail face-config.xml :

org.springframework.web.jsf.el.SpringBeanFacesELResolver

Penyelesai EL adalah komponen yang dapat disokong yang didukung oleh kerangka JSF, yang memungkinkan kita untuk menyesuaikan tingkah laku runtime JSF ketika menilai ekspresi Bahasa Ekspresi (EL). Penyelesai EL ini akan membenarkan JSF runtime mengakses komponen Spring melalui ungkapan EL yang ditentukan dalam JSF.

4. Mengakses Spring Beans di JSF

Pada ketika ini, aplikasi web JSF kami siap untuk mengakses kacang Spring kami dari kacang sokongan JSF, atau dari halaman JSF.

4.1. Dari Backing Bean JSF 2.0

Kacang musim bunga kini boleh diakses dari kacang sokongan JSF. Bergantung pada versi JSF yang anda jalankan, terdapat dua kaedah yang mungkin. Dengan JSF 2.0, anda menggunakan anotasi @ManagedProperty pada kacang terurus JSF.

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

Perhatikan bahawa pengambil dan pengatur adalah wajib semasa menggunakan @ManagedProperty.

Sekarang - untuk menegaskan kebolehaksesan biji kacang dari kacang yang diuruskan, kami akan menambahkan kaedah createNewUser () :

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

Inti kaedahnya ialah menggunakan kacang SpringDao , dan mengakses fungsinya.

4.2. Dari Backing Bean di JSF 2.2

Pendekatan lain, hanya berlaku pada JSF2.2 dan ke atas, adalah menggunakan anotasi @Iject CDI . Ini berlaku untuk kacang yang diuruskan JSF (dengan anotasi @ManagedBean ), dan kacang yang diuruskan CDI (dengan anotasi @Nama ).

Memang, dengan penjelasan CDI, ini adalah satu-satunya kaedah yang sah untuk menyuntik kacang:

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

Dengan pendekatan ini, pengambil dan pengatur tidak diperlukan. Perhatikan juga bahawa ungkapan EL tidak ada.

4.3. Dari Pandangan JSF

Kaedah createNewUser () akan dipicu dari halaman JSF berikut:

Untuk membuat halaman, mulakan pelayan dan arahkan ke:

//localhost:8080/jsf/index.jsf

Kami juga dapat menggunakan EL dalam pandangan JSF, untuk mengakses kacang Spring. Untuk mengujinya sudah cukup untuk menukar nombor baris 7 dari halaman JSF yang diperkenalkan sebelumnya kepada:

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.

Ini bermaksud bahawa anda tidak akan dapat menggunakan anotasi seperti @Autowired atau @Component dll dalam kacang JSF yang dikendalikan, atau menggunakan anotasi @ManagedBean pada kacang yang diuruskan Spring. Walau bagaimanapun, anda boleh menggunakan anotasi @Inject dalam kacang JSF 2.2+ yang dikendalikan, dan kacang kacang (kerana Spring menyokong JSR-330).

Kod sumber yang menyertai artikel ini terdapat di GitHub.