web.xml vs Initializer dengan Spring

1. Gambaran keseluruhan

Dalam artikel ini kita akan membahas tiga pendekatan berbeza untuk mengkonfigurasi DispatcherServlet yang tersedia dalam versi Spring Framework:

  1. Kami akan memulakan dengan konfigurasi XML dan fail web.xml
  2. Kemudian kami akan memindahkan deklarasi Servlet dari fail web.xml ke konfigurasi Java, tetapi kami akan meninggalkan konfigurasi lain dalam XML
  3. Akhirnya pada langkah ketiga dan terakhir refactoring, kita akan mempunyai projek 100% dikonfigurasi Java

2. The DispatcherServlet

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

Pengirim pusat untuk pengendali / pengendali permintaan HTTP, misalnya untuk pengawal UI web atau pengeksport perkhidmatan jarak jauh yang berbasis HTTP. Pengiriman kepada pengendali berdaftar untuk memproses permintaan web, menyediakan kemudahan pemetaan dan pengendalian pengecualian yang mudah.

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

3. Konfigurasi Dengan w eb.xml

Sekiranya anda berurusan dengan projek Spring yang lama, adalah sangat biasa untuk mencari konfigurasi XML dan sehingga Spring 3.1 satu-satunya cara untuk mengkonfigurasi DispatcherServlet adalah dengan fail WEB-INF / web.xml . Dalam kes ini terdapat dua langkah yang diperlukan.

Mari 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 kami menyatakan servlet yang:

  1. Dinamakan " penghantar "
  2. Merupakan contoh org.springframework.web.servlet.DispatcherServlet
  3. Akan diinisialisasi dengan parameter bernama konteksConfigLocation yang mengandungi jalan menuju konfigurasi XML

load-on-startup adalah nilai integer yang menentukan urutan untuk memuatkan beberapa servlet. Oleh itu, jika anda perlu menyatakan lebih daripada satu servlet, anda boleh menentukan urutannya. Servlet yang ditandai dengan bilangan bulat yang lebih rendah dimuat sebelum servlet yang ditandai dengan bilangan bulat yang lebih tinggi.

Sekarang servlet kami dikonfigurasi. Langkah kedua adalah menyatakan pemetaan servlet :

 dispatcher / 

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

4. Konfigurasi Hibrid

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

Kita dapat mendaftarkan servlet yang menerapkan WebApplicationInitializer . Ini setara 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 kita:

  1. Melaksanakan antara muka WebApplicationInitializer
  2. Mengatasi kaedah onStartup kami membuat XmlWebApplicationContext baru yang dikonfigurasi dengan fail yang sama yang dilalui sebagai konteksConfigLocation ke servlet dalam contoh XML
  3. Kemudian kami membuat contoh DispatcherServlet dengan konteks baru yang baru kami tunjukkan
  4. Dan akhirnya kami mendaftarkan servlet dengan corak URL pemetaan

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

5. Konfigurasi 100% Java

Dengan pendekatan ini servlet kami dinyatakan di Java , tetapi kami masih memerlukan file XML untuk mengkonfigurasinya. Dengan WebApplicationInitializer anda dapat mencapai konfigurasi Java 100% .

Mari kita lihat bagaimana kita boleh memperhalusi contoh sebelumnya.

Perkara pertama yang perlu kita lakukan ialah membuat konteks aplikasi untuk servlet.

Kali ini kita akan menggunakan konteks berdasarkan anotasi sehingga kita dapat menggunakan Java dan anotasi untuk konfigurasi dan menghapus keperluan untuk fail XML seperti dispatcher-config.xml :

AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();

Jenis konteks ini kemudiannya dapat dikonfigurasi mendaftarkan kelas konfigurasi:

context.register(AppConfig.class);

Atau menetapkan keseluruhan pakej yang akan diimbas untuk kelas konfigurasi:

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

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

container.addListener(new ContextLoaderListener(context));

Langkah seterusnya adalah membuat dan mendaftarkan servlet penghantar kami:

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

Sekarang WebApplicationInitializer kami akan kelihatan 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.