HandlerAdapter im Frühjahr MVC

1. Übersicht

In diesem Artikel konzentrieren wir uns auf die verschiedenen Implementierungen von Handleradaptern, die im Spring-Framework verfügbar sind.

2. Was ist ein Handleradapter?

Der HandlerAdapter ist im Grunde eine Schnittstelle, die die Verarbeitung von HTTP-Anforderungen in Spring MVC auf sehr flexible Weise erleichtert.

Es wird in Verbindung mit dem HandlerMapping verwendet , das eine Methode einer bestimmten URL zuordnet .

Das DispatcherServlet verwendet dann einen HandlerAdapter , um diese Methode aufzurufen. Das Servlet ruft die Methode nicht direkt auf - es dient im Wesentlichen als Brücke zwischen sich selbst und den Handlerobjekten, was zu einem lose Kopplungsdesign führt.

Schauen wir uns verschiedene Methoden an, die in dieser Oberfläche verfügbar sind:

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

Die unterstützte API wird verwendet, um zu überprüfen, ob eine bestimmte Handlerinstanz unterstützt wird oder nicht. Diese Methode sollte zuerst aufgerufen werden, bevor die handle () -Methode dieser Schnittstelle aufgerufen wird , um sicherzustellen, dass die Handlerinstanz unterstützt wird oder nicht.

Die Handle- API wird verwendet, um eine bestimmte HTTP-Anforderung zu verarbeiten. Diese Methode ist für den Aufruf des Handlers verantwortlich, indem das Objekt HttpServletRequest und HttpServletResponse als Parameter übergeben wird. Der Handler führt dann die Anwendungslogik aus und gibt ein ModelAndView- Objekt zurück, das dann vom DispatcherServlet verarbeitet wird .

3. Maven-Abhängigkeit

Beginnen wir mit der Maven-Abhängigkeit, die zu pom.xml hinzugefügt werden muss :

 org.springframework spring-webmvc 5.2.8.RELEASE 

Die neueste Version des Spring-Webmvc- Artefakts finden Sie hier.

4. Arten von HandlerAdapter

4.1. SimpleControllerHandlerAdapter

Dies ist der von Spring MVC registrierte Standard-Handler-Adapter. Es befasst sich mit Klassen, die die Controller- Schnittstelle implementieren , und wird verwendet, um eine Anforderung an ein Controller-Objekt weiterzuleiten.

Wenn eine Webanwendung nur Controller verwendet, müssen wir keinen HandlerAdapter konfigurieren, da das Framework diese Klasse als Standardadapter für die Verarbeitung einer Anforderung verwendet.

Definieren wir eine einfache Controller-Klasse unter Verwendung des älteren Controller-Stils (Implementierung der Controller- Schnittstelle):

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; } }

Die ähnliche XML-Konfiguration:

Die BeanNameUrlHandlerMapping- Klasse ist die Zuordnungsklasse für diesen Handleradapter .

Hinweis : Wenn in BeanFactory ein benutzerdefinierter Handleradapter definiert ist, wird dieser Adapter nicht automatisch registriert. Daher müssen wir es explizit im Kontext definieren. Wenn es nicht definiert ist und wir einen benutzerdefinierten Handleradapter definiert haben, erhalten wir eine Ausnahme, die besagt, dass kein Adapter für einen Handler angegeben ist.

4.2. SimpleServletHandlerAdapter

Mit diesem Handleradapter kann jedes Servlet verwendet werden , um mit DispatcherServlet zur Bearbeitung der Anforderung zusammenzuarbeiten. Die Anforderung von DispatcherServlet wird durch Aufrufen der service () -Methode an die entsprechende Servlet- Klasse weitergeleitet .

Die Beans, die die Servlet- Schnittstelle implementieren , werden von diesem Adapter automatisch verarbeitet. Es ist nicht standardmäßig registriert und muss wie jede andere normale Bean in der Konfigurationsdatei von DispatcherServlet registriert werden :

4.3. AnnotationMethodHandlerAdapter

Diese Adapterklasse wird verwendet, um die Methoden auszuführen, die mit der Annotation @RequestMapping versehen sind . Es wird verwendet, um die Methoden basierend auf HTTP-Methoden und HTTP-Pfaden zuzuordnen.

Die Zuordnungsklasse für diesen Adapter ist DefaultAnnotationHandlerMapping, mit der die Annotation @RequestMapping auf Typebene und AnnotationMethodHandlerAdaptor auf Methodenebene verarbeitet werden.

Diese beiden Klassen werden bereits vom Framework registriert, wenn das DispatcherServlet initialisiert wird. Wenn jedoch die anderen Handleradapter bereits definiert sind, müssen wir sie auch in der Konfigurationsdatei definieren.

Definieren wir eine Controller-Klasse:

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

Die Annotation @Controller gibt an, dass diese Klasse die Rolle des Controllers übernimmt .

Die Annotation @RequestMapping ordnet die Methode getEmployeeName () der URL / dem Namen zu.

Es gibt zwei verschiedene Möglichkeiten, diesen Adapter zu konfigurieren, je nachdem, ob die Anwendung eine Java-basierte Konfiguration oder eine XML-basierte Konfiguration verwendet. Schauen wir uns den ersten Weg mit der Java-Konfiguration an:

@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; } }

Wenn die Anwendung die XML-Konfiguration verwendet, gibt es zwei verschiedene Ansätze zum Konfigurieren dieses Handleradapters im Webanwendungskontext XML. Schauen wir uns den ersten Ansatz an, der in der Datei spring-servlet_AnnotationMethodHandlerAdapter.xml definiert ist :

Das Tag wird verwendet, um das Paket anzugeben, das nach Controller- Klassen durchsucht werden soll.

Schauen wir uns den zweiten Ansatz an:

Das Das Tag registriert diese beiden Klassen automatisch bei Spring MVC. Dieser Adapter war in Spring 3.2 veraltet, und in Spring 3.1 wurde ein neuer Handler-Adapter namens RequestMappingHandlerAdapter eingeführt.

4.4. RequestMappingHandlerAdapter

Diese Adapterklasse wurde in Spring 3.1 eingeführt und veraltete den AnnotationMethodHandlerAdaptor- Handleradapter in Spring 3.2.

Es wird mit der RequestMappingHandlerMapping- Klasse verwendet, die mit @RequestMapping annotierte Methoden ausführt .

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

In diesem Artikel haben wir verschiedene Arten von Handleradaptern erläutert, die im Spring Framework verfügbar sind.

Die meisten Entwickler werden sich wahrscheinlich an die Standardeinstellungen halten, aber es lohnt sich zu verstehen, wie flexibel das Framework ist, wenn wir über die Grundlagen hinausgehen müssen.

Der Quellcode dieses Tutorials befindet sich im GitHub-Projekt.