HandlerAdapters di Spring MVC

1. Gambaran keseluruhan

Dalam artikel ini, kami akan menumpukan pada pelbagai implementasi adaptor pengendali yang tersedia dalam rangka Spring.

2. Apa itu Handleradapter?

The HandlerAdapter pada dasarnya antara muka yang memudahkan pengendalian HTTP permintaan dengan cara yang sangat fleksibel dalam Spring MVC.

Ini digunakan bersama dengan HandlerMapping , yang memetakan kaedah ke URL tertentu.

The DispatcherServlet kemudian menggunakan HandlerAdapter untuk menggunakan kaedah ini. Servlet tidak menggunakan kaedah secara langsung - pada dasarnya berfungsi sebagai jambatan antara dirinya dan objek pengendali, yang membawa kepada reka bentuk gandingan yang longgar.

Mari kita lihat pelbagai kaedah yang terdapat di antara muka ini:

public interface HandlerAdapter { boolean supports(Object handler); ModelAndView handle( HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception; long getLastModified(HttpServletRequest request, Object handler); }

Yang menyokong API digunakan untuk memeriksa sama ada pengendali contoh tertentu disokong atau tidak. Kaedah ini harus dipanggil terlebih dahulu sebelum memanggil kaedah pegangan () antara muka ini, untuk memastikan sama ada contoh pengendali disokong atau tidak.

Yang mengendalikan API digunakan untuk mengendalikan permintaan HTTP tertentu. Kaedah ini adalah bertanggungjawab untuk menyeru pengendali yang dengan meluluskan HttpServletRequest dan HttpServletResponse objek sebagai parameter. Pengendali kemudian melaksanakan logik aplikasi dan mengembalikan objek ModelAndView , yang kemudian diproses oleh DispatcherServlet .

3. Ketergantungan Maven

Mari kita mulakan dengan kebergantungan Maven yang perlu ditambahkan ke pom.xml :

 org.springframework spring-webmvc 5.2.8.RELEASE 

Versi terbaru artifak spring-webmvc boleh didapati di sini.

4. Jenis HandlerAdapter

4.1. SimpleControllerHandlerAdapter

Ini adalah penyesuai pengendali lalai yang didaftarkan oleh Spring MVC. Ini berkaitan dengan kelas yang melaksanakan antara muka Pengawal dan digunakan untuk meneruskan permintaan ke objek pengawal.

Sekiranya aplikasi web hanya menggunakan pengawal maka kita tidak perlu mengkonfigurasi HandlerAdapter apa pun kerana kerangka menggunakan kelas ini sebagai penyesuai lalai untuk menangani permintaan.

Mari tentukan kelas pengawal sederhana, menggunakan gaya pengawal yang lebih lama (melaksanakan antara muka Pengawal ):

public class SimpleController implements Controller { @Override public ModelAndView handleRequest( HttpServletRequest request, HttpServletResponse response) throws Exception { ModelAndView model = new ModelAndView("Greeting"); model.addObject("message", "Dinesh Madhwal"); return model; } }

Konfigurasi XML yang serupa:

The BeanNameUrlHandlerMapping kelas adalah kelas pemetaan untuk penyesuai pengendali ini.

Catatan : Sekiranya penyesuai pengendali khas ditentukan dalam BeanFactory, maka penyesuai ini tidak didaftarkan secara automatik. Oleh itu, kita perlu menentukannya secara eksplisit dalam konteks. Sekiranya tidak ditentukan dan kami telah menentukan penyesuai pengendali khusus, maka kami akan mendapat pengecualian yang mengatakan bahawa tidak ada penyesuai untuk pengendali yang ditentukan.

4.2. Penyesuai SimpleServletHandler

Penyesuai pengendali ini membenarkan penggunaan mana-mana Servlet untuk bekerja dengan DispatcherServlet untuk menangani permintaan tersebut. Ia meneruskan permintaan dari DispatcherServlet ke kelas Servlet yang sesuai dengan memanggil kaedah perkhidmatannya () .

Kacang yang melaksanakan antara muka Servlet dikendalikan secara automatik oleh penyesuai ini. Ia tidak didaftarkan secara lalai dan kami perlu mendaftarkannya seperti kacang biasa yang lain dalam fail konfigurasi DispatcherServlet :

4.3. AnnotationMethodHandlerAdapter

Kelas penyesuai ini digunakan untuk melaksanakan kaedah yang diberi penjelasan dengan anotasi @RequestMapping . Ia digunakan untuk memetakan kaedah berdasarkan kaedah HTTP dan jalur HTTP.

Kelas pemetaan untuk penyesuai ini adalah DefaultAnnotationHandlerMapping, yang digunakan untuk memproses anotasi @RequestMapping pada peringkat jenis dan AnnotationMethodHandlerAdaptor digunakan untuk memproses pada tahap kaedah.

Kedua-dua kelas ini sudah didaftarkan oleh kerangka ketika DispatcherServlet diinisialisasi. Walau bagaimanapun, jika penyesuai pengendali yang lain sudah ditentukan, maka kita perlu menentukannya juga dalam fail konfigurasi.

Mari tentukan kelas pengawal:

@Controller public class AnnotationHandler { @RequestMapping("/annotedName") public ModelAndView getEmployeeName() { ModelAndView model = new ModelAndView("Greeting"); model.addObject("message", "Dinesh"); return model; } }

The @Controller anotasi menunjukkan bahawa kelas ini menyajikan peranan pengawal.

The @RequestMapping anotasi memetakan getEmployeeName () kaedah untuk URL / nama.

Terdapat 2 cara untuk mengkonfigurasi penyesuai ini bergantung pada apakah aplikasi menggunakan konfigurasi berbasis Java atau konfigurasi berasaskan XML. Mari kita lihat cara pertama menggunakan konfigurasi Java:

@ComponentScan("com.baeldung.spring.controller") @Configuration @EnableWebMvc public class ApplicationConfiguration implements WebMvcConfigurer { @Bean public InternalResourceViewResolver jspViewResolver() { InternalResourceViewResolver bean = new InternalResourceViewResolver(); bean.setPrefix("/WEB-INF/"); bean.setSuffix(".jsp"); return bean; } }

Sekiranya aplikasi menggunakan konfigurasi XML, maka ada dua pendekatan yang berbeza untuk mengkonfigurasi penyesuai pengendali ini dalam konteks aplikasi web XML. Mari kita lihat pendekatan pertama yang ditentukan dalam file spring-servlet_AnnotationMethodHandlerAdapter.xml :

The tag digunakan untuk menentukan pakej untuk mengimbas kelas pengawal .

Mari kita lihat pendekatan kedua:

The tag akan mendaftarkan dua kelas ini secara automatik dengan spring MVC. Penyesuai ini tidak digunakan lagi pada musim bunga 3.2 dan penyesuai pengendali baru yang disebut RequestMappingHandlerAdapter diperkenalkan pada musim bunga 3.1.

4.4. RequestMappingHandlerAdapter

Kelas penyesuai ini diperkenalkan pada musim bunga 3.1, menghentikan penyesuai pengendali AnnotationMethodHandlerAdaptor pada musim bunga 3.2.

Ia digunakan dengan kelas RequestMappingHandlerMapping , yang melaksanakan kaedah yang dianotasi dengan @RequestMapping .

The RequestMappingHandlerMapping is used to maintain the mapping of the request URI to the handler. Once the handler is obtained, the DispatcherServlet dispatches the request to the appropriate handler adapter, which then invokes the handlerMethod().

The type-level and method-level mappings were processed in two different stages in the Spring version prior to 3.1.

The first stage was to select the controller by DefaultAnnotationHandlerMapping and the second stage was to invoke the actual method by AnnotationMethodHandlerAdapter.

From Spring version 3.1, there is only one stage, which involves identifying the controller as well as which method needs to be invoked to process the request.

Let's define a simple controller class:

@Controller public class RequestMappingHandler { @RequestMapping("/requestName") public ModelAndView getEmployeeName() { ModelAndView model = new ModelAndView("Greeting"); model.addObject("message", "Madhwal"); return model; } }

There are 2 different ways of configuring this adapter depending on whether the application uses Java-based configuration or XML based configuration.

Let's look at the first way using Java configuration:

@ComponentScan("com.baeldung.spring.controller") @Configuration @EnableWebMvc public class ServletConfig implements WebMvcConfigurer { @Bean public InternalResourceViewResolver jspViewResolver() { InternalResourceViewResolver bean = new InternalResourceViewResolver(); bean.setPrefix("/WEB-INF/"); bean.setSuffix(".jsp"); return bean; } }

If the application uses XML configuration, then there are two different approaches for configuring this handler adapter in web application context XML. Let us take a look at the first approach defined in the file spring-servlet_RequestMappingHandlerAdapter.xml:

And here's the second approach:

This tag will automatically register these two classes with Spring MVC.

If we need to customize the RequestMappingHandlerMapping, then we need to remove this tag from the application context XML and manually configure it in the application context XML.

4.5. HttpRequestHandlerAdapter

This handler adapter is used for the handlers that process HttpRequests. It implements the HttpRequestHandler interface, which contains a single handleRequest() method for processing the request and generating the response.

The return type of this method is void and it doesn't generate ModelAndView return type as produced by other handler adapters. It's basically used to generate binary responses and it doesn't generate a view to render.

5. Running the Application

If the application is deployed on localhost with the port number 8082 and the context-root is spring-mvc-handlers:

//localhost:8082/spring-mvc-handlers/

6. Conclusion

Dalam artikel ini, kami membincangkan pelbagai jenis penyesuai pengendali yang terdapat dalam rangka Spring.

Sebilangan besar pembangun mungkin akan mematuhi lalai, tetapi perlu difahami betapa fleksibelnya kerangka apabila kita perlu melampaui asas.

Kod sumber tutorial ini boleh didapati di projek GitHub.