DispatcherServlet dan web.xml dalam Spring Boot

1. Gambaran keseluruhan

The DispatcherServlet adalah pengawal depan dalam aplikasi web Spring. Ia digunakan untuk membuat aplikasi web dan perkhidmatan REST di Spring MVC. Dalam aplikasi web Spring tradisional, servlet ini ditentukan dalam fail web.xml .

Dalam tutorial ini, kita akan memindahkan kod dari fail web.xml ke DispatcherServlet dalam aplikasi Spring Boot. Juga, kami akan memetakan kelas Filter , Servlet , dan Listener dari web.xml ke aplikasi Spring Boot.

2. Ketergantungan Maven

Pertama, kita harus menambahkan pergantungan spring-boot-starter-web Maven ke fail pom.xml kami :

 org.springframework.boot spring-boot-starter-web 

3. DispatcherServlet

DispatcherServlet menerima semua permintaan HTTP dan mendelegasikannya ke kelas pengawal.

Sebelum spesifikasi Servlet 3.x, DispatcherServlet akan didaftarkan dalam fail web.xml untuk aplikasi Spring MVC. Oleh kerana spesifikasi Servlet 3.x, kami dapat mendaftarkan servlet secara terprogram menggunakan ServletContainerInitializer .

Mari lihat konfigurasi contoh DispatcherServlet dalam fail web.xml :

 dispatcher  org.springframework.web.servlet.DispatcherServlet    dispatcher / 

Spring Boot menyediakan perpustakaan web spring-boot-starter untuk mengembangkan aplikasi web menggunakan Spring MVC. Salah satu ciri utama Spring Boot adalah konfigurasi automatik. Autokonfigurasi Spring Boot mendaftarkan dan mengkonfigurasi DispatcherServlet secara automatik . Oleh itu, kami tidak perlu mendaftarkan DispatcherServlet secara manual.

Secara lalai, starter-boot-starter-web starter mengkonfigurasi DispatcherServlet ke corak URL “/”. Jadi, kami tidak perlu menyelesaikan konfigurasi tambahan untuk contoh DispatcherServlet di atas dalam fail web.xml . Namun, kita dapat menyesuaikan corak URL menggunakan server.servlet. * dalam fail application.properties :

server.servlet.context-path=/demo spring.mvc.servlet.path=/baeldung

Dengan penyesuaian ini, DispatcherServlet dikonfigurasi untuk menangani corak URL / baeldung dan root pathPath akan / demo . Oleh itu, DispatcherServlet mendengar di // localhost: 8080 / demo / baeldung /.

4. Konfigurasi Aplikasi

Aplikasi web Spring MVC menggunakan fail web.xml sebagai fail penerangan penerapan. Juga, ini menentukan pemetaan antara jalur URL dan servlet dalam fail web.xml .

Ini tidak lagi berlaku dengan Spring Boot. Sekiranya kita memerlukan penapis khas, kita dapat mendaftarkannya dalam konfigurasi kelas Java. The web.xml fail termasuk penapis, Servlets, dan pendengar.

Apabila kita ingin melakukan migrasi dari Spring MVC tradisional ke aplikasi Spring Boot moden, bagaimana kita boleh mengangkut web.xml ke aplikasi Spring Boot baru? Dalam aplikasi Spring Boot, kita dapat menambahkan konsep-konsep ini dengan beberapa cara.

4.1. Mendaftar Penapis

Mari buat penapis dengan menerapkan antara muka Penapis :

@Component public class CustomFilter implements Filter { Logger logger = LoggerFactory.getLogger(CustomFilter.class); @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { logger.info("CustomFilter is invoked"); chain.doFilter(request, response); } // other methods }

Tanpa Spring Boot, kami akan mengkonfigurasi CustomFilter kamidalam fail web.xml :

 customFilter CustomFilter   customFilter /* 

Agar Spring Boot dapat mengenali penapis, kita hanya perlu menentukannya sebagai kacang dengan anotasi @Component .

4.2. Mendaftar Servlet

Mari tentukan servlet dengan memperluas kelas HttpServlet :

public class CustomServlet extends HttpServlet { Logger logger = LoggerFactory.getLogger(CustomServlet.class); @Override protected void doGet( HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { logger.info("CustomServlet doGet() method is invoked"); super.doGet(req, resp); } @Override protected void doPost( HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { logger.info("CustomServlet doPost() method is invoked"); super.doPost(req, resp); } } 

Tanpa Spring Boot, kami akan mengkonfigurasi CustomServlet kami dalam fail web.xml :

 customServlet CustomServlet   customServlet /servlet 

Dalam aplikasi Spring Boot, servlet didaftarkan sama ada sebagai Spring @Bean atau dengan mengimbas kelas anotasi @WebServlet dengan bekas terbenam.

Dengan pendekatan Spring @Bean , kita dapat menggunakan kelas ServletRegistrationBean untuk mendaftarkan servlet.

Oleh itu, kami akan menentukan CustomServlet sebagai kacang dengan kelas ServletRegistrationBean :

@Bean public ServletRegistrationBean customServletBean() { ServletRegistrationBean bean = new ServletRegistrationBean(new CustomServlet(), "/servlet"); return bean; } 

4.3. Mendaftar Pendengar

Mari tentukan pendengar dengan memanjangkan kelas ServletContextListener :

public class CustomListener implements ServletContextListener { Logger logger = LoggerFactory.getLogger(CustomListener.class); @Override public void contextInitialized(ServletContextEvent sce) { logger.info("CustomListener is initialized"); } @Override public void contextDestroyed(ServletContextEvent sce) { logger.info("CustomListener is destroyed"); } } 

Tanpa Spring Boot, kami akan mengkonfigurasi CustomListener kami dalam fail web.xml :

 CustomListener 

Untuk menentukan pendengar dalam aplikasi Spring Boot, kita boleh menggunakan sama ada @Bean atau @WebListener penjelasan.

Dengan pendekatan Spring @Bean , kita dapat menggunakan kelas ServletListenerRegistrationBean untuk mendaftarkan Pendengar .

Oleh itu, mari kita tentukan CustomListener sebagai kacang dengan ServletListenerRegistrationBeankelas:

@Bean public ServletListenerRegistrationBean customListenerBean() { ServletListenerRegistrationBean bean = new ServletListenerRegistrationBean(); bean.setListener(new CustomListener()); return bean; }

Setelah memulakan aplikasi kami, kami dapat memeriksa output log untuk melihat pengesahan bahawa pendengar telah berjaya dimulakan:

2020-09-28 08:50:30.872 INFO 19612 --- [main] c.baeldung.demo.listener.CustomListener: CustomListener is initialized

5. Kesimpulan

Dalam tutorial ringkas ini, kami melihat bagaimana menentukan elemen DispatcherServlet dan web.xml termasuk filter , servlet , dan pendengar dalam aplikasi Spring Boot. Dan, seperti biasa, kod sumber untuk contoh di atas boleh didapati di GitHub.