web.xml vs Initializer dengan Spring

1. Ikhtisar

Dalam artikel ini, kami akan membahas tiga pendekatan berbeda untuk mengonfigurasi DispatcherServlet yang tersedia di versi terbaru Spring Framework:

  1. Kami akan mulai dengan konfigurasi XML dan file web.xml
  2. Kemudian kami akan memigrasikan deklarasi Servlet dari file web.xml ke konfigurasi Java, tetapi kami akan meninggalkan konfigurasi lain dalam XML
  3. Akhirnya pada langkah ketiga dan terakhir dari refactoring, kita akan memiliki proyek yang 100% dikonfigurasi Java

2. DispatcherServlet

Salah satu konsep inti Spring MVC adalah DispatcherServlet . Dokumentasi Spring mendefinisikannya sebagai:

Dispatcher pusat untuk penangan / pengontrol permintaan HTTP, misalnya untuk pengontrol UI web atau pengekspor layanan jarak jauh berbasis HTTP. Mengirimkan ke penangan terdaftar untuk memproses permintaan web, menyediakan fasilitas pemetaan dan penanganan pengecualian yang nyaman.

Pada dasarnya DispatcherServlet adalah titik masuk dari setiap aplikasi Spring MVC . Tujuannya adalah untuk mencegat permintaan HTTP dan mengirimkannya ke komponen yang tepat yang akan mengetahui cara menanganinya.

3. Konfigurasi Dengan w eb.xml

Jika Anda berurusan dengan proyek Spring lama , sangat umum untuk menemukan konfigurasi XML dan hingga Spring 3.1 satu-satunya cara untuk mengkonfigurasi DispatcherServlet adalah dengan file WEB-INF / web.xml . Dalam hal ini ada dua langkah yang diperlukan.

Mari kita lihat contoh konfigurasi - langkah pertama adalah deklarasi Servlet:

 dispatcher  org.springframework.web.servlet.DispatcherServlet   contextConfigLocation /WEB-INF/spring/dispatcher-config.xml  1 

Dengan blok XML ini kita mendeklarasikan servlet yang:

  1. Dinamakan " petugas operator "
  2. Merupakan turunan dari org.springframework.web.servlet.DispatcherServlet
  3. Akan diinisialisasi dengan parameter bernama contextConfigLocation yang berisi jalur ke konfigurasi XML

load-on-startup adalah nilai integer yang menentukan urutan beberapa servlet untuk dimuat. Jadi jika Anda perlu mendeklarasikan lebih dari satu servlet, Anda dapat menentukan dengan urutan apa mereka akan diinisialisasi. Servlet yang ditandai dengan bilangan bulat lebih rendah dimuat sebelum servlet ditandai dengan bilangan bulat yang lebih tinggi.

Sekarang servlet kami telah dikonfigurasi. Langkah kedua adalah mendeklarasikan pemetaan servlet :

 dispatcher / 

Dengan pemetaan servlet, kami membatasi namanya ke pola URL yang menentukan permintaan HTTP apa yang akan ditangani olehnya.

4. Konfigurasi Hybrid

Dengan adopsi Servlet API versi 3.0 , file web.xml telah menjadi opsional, dan sekarang kita dapat menggunakan Java untuk mengkonfigurasi DispatcherServlet .

Kita bisa mendaftarkan servlet yang mengimplementasikan WebApplicationInitializer . Ini sama dengan konfigurasi XML di atas:

public class MyWebAppInitializer implements WebApplicationInitializer { @Override public void onStartup(ServletContext container) { XmlWebApplicationContext context = new XmlWebApplicationContext(); context.setConfigLocation("/WEB-INF/spring/dispatcher-config.xml"); ServletRegistration.Dynamic dispatcher = container .addServlet("dispatcher", new DispatcherServlet(context)); dispatcher.setLoadOnStartup(1); dispatcher.addMapping("/"); } }

Dalam contoh ini kami adalah:

  1. Menerapkan antarmuka WebApplicationInitializer
  2. Override OnStartup metode kita membuat baru XmlWebApplicationContext dikonfigurasi dengan file yang sama lulus sebagai contextConfigLocation ke servlet dalam XML contoh
  3. Kemudian kami membuat sebuah instance DispatcherServlet dengan konteks baru yang baru saja kami buat
  4. Dan akhirnya kami mendaftarkan servlet dengan pola URL pemetaan

Jadi kami menggunakan Java untuk mendeklarasikan servlet dan mengikatnya ke pemetaan URL, tetapi kami menyimpan konfigurasi dalam file XML terpisah : dispatcher-config.xml .

5. 100% Konfigurasi Java

Dengan pendekatan ini servlet kita dideklarasikan di Java , tapi kita masih membutuhkan file XML untuk mengkonfigurasinya. Dengan WebApplicationInitializer Anda dapat mencapai konfigurasi Java 100% .

Mari kita lihat bagaimana kita dapat memfaktor ulang contoh sebelumnya.

Hal pertama yang perlu kita lakukan adalah membuat konteks aplikasi untuk servlet.

Kali ini kita akan menggunakan konteks berbasis anotasi sehingga kita dapat menggunakan Java dan anotasi untuk konfigurasi dan menghilangkan kebutuhan akan file XML seperti dispatcher-config.xml :

AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();

Jenis konteks ini kemudian dapat dikonfigurasi dengan mendaftarkan kelas konfigurasi:

context.register(AppConfig.class);

Atau mengatur seluruh paket yang akan dipindai untuk kelas konfigurasi:

context.setConfigLocation("com.example.app.config");

Sekarang setelah konteks aplikasi kita dibuat, kita dapat menambahkan pendengar ke ServletContext yang akan memuat konteks:

container.addListener(new ContextLoaderListener(context));

Langkah selanjutnya adalah membuat dan mendaftarkan servlet dispatcher kami:

ServletRegistration.Dynamic dispatcher = container .addServlet("dispatcher", new DispatcherServlet(context)); dispatcher.setLoadOnStartup(1); dispatcher.addMapping("/");

Sekarang WebApplicationInitializer kita akan terlihat seperti ini:

public class MyWebAppInitializer implements WebApplicationInitializer { @Override public void onStartup(ServletContext container) { AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext(); context.setConfigLocation("com.example.app.config"); container.addListener(new ContextLoaderListener(context)); ServletRegistration.Dynamic dispatcher = container .addServlet("dispatcher", new DispatcherServlet(context)); dispatcher.setLoadOnStartup(1); dispatcher.addMapping("/"); } }

Java and annotation configuration offers many advantages. Usually it leads to shorter and more concise configuration and annotations provide more context to declarations, as it's co-located with the code that they configure.

But this is not always a preferable or even possible way. For example some developers may prefer keeping their code and configuration separated, or you may need to work with third party code that you can't modify.

6. Conclusion

In this article we covered different ways to configure a DispatcherServlet in Spring 3.2+ and it's up to you to decide which one to use based on your preferences. Spring will accommodate to your decision whatever you choose.

You can find the source code from this article on Github here and here.