HandlerAdapters in Spring MVC

1. Overzicht

In dit artikel zullen we ons concentreren op de verschillende implementaties van handleradapters die beschikbaar zijn in het Spring-framework.

2. Wat is een handleradapter?

De HandlerAdapter is in feite een interface die de afhandeling van HTTP-verzoeken op een zeer flexibele manier in Spring MVC mogelijk maakt.

Het wordt gebruikt in combinatie met de HandlerMapping, die een methode toewijst aan een specifieke URL.

De DispatcherServlet gebruikt dan een HandlerAdapter om deze methode aan te roepen. De servlet roept de methode niet rechtstreeks op - het dient in feite als een brug tussen zichzelf en de handlerobjecten, wat leidt tot een losjes gekoppeld ontwerp.

Laten we eens kijken naar verschillende methoden die beschikbaar zijn in deze interface:

openbare interface HandlerAdapter {boolean ondersteunt (Objecthandler); ModelAndView-handle (HttpServletRequest-verzoek, HttpServletResponse-antwoord, Object-handler) genereert een uitzondering; lang getLastModified (HttpServletRequest-verzoek, Objecthandler); }

De ondersteunt API wordt gebruikt om te controleren of een bepaalde handler-instantie wordt ondersteund of niet. Deze methode moet eerst worden aangeroepen voordat de handvat() methode van deze interface, om er zeker van te zijn of de handler-instantie wordt ondersteund of niet.

De handvat API wordt gebruikt om een ​​bepaald HTTP-verzoek af te handelen. Deze methode is verantwoordelijk voor het aanroepen van de handler door de HttpServletRequest en HttpServletResponse object als parameter. De handler voert vervolgens de toepassingslogica uit en retourneert een ModelAndView object, dat vervolgens wordt verwerkt door het DispatcherServlet.

3. Maven Afhankelijkheid

Laten we beginnen met de Maven-afhankelijkheid waaraan moet worden toegevoegd pom.xml:

 org.springframework spring-webmvc 5.2.8.RELEASE 

De nieuwste versie van het lente-webmvc artefact is hier te vinden.

4. Soorten HandlerAdapter

4.1. SimpleControllerHandlerAdapter

Dit is de standaard handleradapter die is geregistreerd door Spring MVC. Het behandelt klassen die worden geïmplementeerd Controller interface en wordt gebruikt om een ​​verzoek door te sturen naar een controllerobject.

Als een webapplicatie alleen controllers gebruikt, hoeven we er geen te configureren HandlerAdapter aangezien het framework deze klasse gebruikt als de standaardadapter voor het afhandelen van een verzoek.

Laten we een eenvoudige controller-klasse definiëren, met behulp van de oudere stijl van controller (implementatie van het Controller koppel):

openbare klasse SimpleController implementeert Controller {@Override openbare ModelAndView handleRequest (HttpServletRequest-verzoek, HttpServletResponse-antwoord) genereert Uitzondering {ModelAndView-model = nieuw ModelAndView ("Groet"); model.addObject ("bericht", "Dinesh Madhwal"); retourmodel; }}

De vergelijkbare XML-configuratie:

De BeanNameUrlHandlerMapping class is de toewijzingsklasse voor deze handleradapter.

Opmerking: Als een aangepaste handleradapter is gedefinieerd in BeanFactory, dan wordt deze adapter niet automatisch geregistreerd. We moeten het dus expliciet in de context definiëren. Als het niet is gedefinieerd en we hebben een aangepaste handler-adapter gedefinieerd, dan krijgen we een uitzondering die zegt dat er geen adapter voor een handler is gespecificeerd.

4.2. SimpleServletHandlerAdapter

Deze handler-adapter maakt het gebruik van elke Servlet werken met DispatcherServlet voor het afhandelen van het verzoek. Het stuurt het verzoek door van DispatcherServlet naar de juiste Servlet klasse door zijn onderhoud() methode.

De bonen die het Servlet interface worden automatisch afgehandeld door deze adapter. Het is niet standaard geregistreerd en we moeten het zoals elke andere normale bean registreren in het configuratiebestand van DispatcherServlet:

4.3. AnnotationMethodHandlerAdapter

Deze adapterklasse wordt gebruikt om de methoden uit te voeren die zijn geannoteerd @RequestMapping annotatie. Het wordt gebruikt om de methoden in kaart te brengen op basis van HTTP-methoden en HTTP-paden.

De toewijzingsklasse voor deze adapter is DefaultAnnotationHandlerMapping, die wordt gebruikt om de @RequestMapping annotatie op typeniveau en AnnotationMethodHandlerAdaptor wordt gebruikt om op methodeniveau te verwerken.

Deze twee klassen zijn al geregistreerd door het framework wanneer het DispatcherServlet wordt geïnitialiseerd. Als de andere handleradapters echter al zijn gedefinieerd, moeten we deze ook in het configuratiebestand definiëren.

Laten we een controllerklasse definiëren:

@Controller openbare klasse AnnotationHandler {@RequestMapping ("/ annotedName") openbaar ModelAndView getEmployeeName () {ModelAndView model = nieuw ModelAndView ("Groet"); model.addObject ("bericht", "Dinesh"); retourmodel; }}

De @Controller annotatie geeft aan dat deze klasse de rol vervult van controller.

De @RequestMapping annotatie wijst de getEmployeeName () methode naar de URL /naam.

Er zijn 2 verschillende manieren om deze adapter te configureren, afhankelijk van of de applicatie Java-gebaseerde configuratie of XML-gebaseerde configuratie gebruikt. Laten we eens kijken naar de eerste manier om Java-configuratie te gebruiken:

@ComponentScan ("com.baeldung.spring.controller") @Configuration @EnableWebMvc openbare klasse ApplicationConfiguration implementeert WebMvcConfigurer {@Bean openbare InternalResourceViewResolver jspViewResolver () {InternalResourceViewResolver bean = nieuwe InternalResourceViewResolver bean = nieuwe InternalResourceViewResolver bean = nieuwe InternalResourceViewResolver; bean.setPrefix ("/ WEB-INF /"); bean.setSuffix (". jsp"); terugkeer boon; }}

Als de toepassing XML-configuratie gebruikt, zijn er twee verschillende benaderingen voor het configureren van deze handleradapter in XML-context van webtoepassingen. Laten we eens kijken naar de eerste benadering die in het bestand is gedefinieerd spring-servlet_AnnotationMethodHandlerAdapter.xml:

De tag wordt gebruikt om het pakket op te geven waarnaar moet worden gescand controller klassen.

Laten we eens kijken naar de tweede benadering:

De tag registreert deze twee klassen automatisch bij spring MVC. Deze adapter is verouderd in Spring 3.2 en er wordt een nieuwe handler-adapter genoemd RequestMappingHandlerAdapter werd geïntroduceerd in Spring 3.1.

4.4. RequestMappingHandlerAdapter

Deze adapterklasse is geïntroduceerd in Spring 3.1, waardoor het AnnotationMethodHandlerAdaptor handler-adapter in Spring 3.2.

Het wordt gebruikt met RequestMappingHandlerMapping klasse, die voert methoden uit die zijn geannoteerd met @RequestMapping.

De RequestMappingHandlerMapping wordt gebruikt om de toewijzing van de verzoek-URI aan de handler bij te houden. Zodra de handler is verkregen, wordt het DispatcherServlet verzendt het verzoek naar de juiste handler-adapter, die vervolgens de handlerMethod ().

De toewijzingen op typeniveau en op methode-niveau werden in de Spring-versie voorafgaand aan 3.1 in twee verschillende fasen verwerkt.

De eerste fase was om de controller te selecteren door DefaultAnnotationHandlerMapping en de tweede fase was het aanroepen van de feitelijke methode door AnnotationMethodHandlerAdapter.

Vanaf Spring-versie 3.1 is er slechts één fase, namelijk het identificeren van de controller en de methode die moet worden aangeroepen om het verzoek te verwerken.

Laten we een eenvoudige controllerklasse definiëren:

@Controller openbare klasse RequestMappingHandler {@RequestMapping ("/ requestName") openbaar ModelAndView getEmployeeName () {ModelAndView model = nieuw ModelAndView ("Groet"); model.addObject ("bericht", "Madhwal"); retourmodel; }}

Er zijn 2 verschillende manieren om deze adapter te configureren, afhankelijk van of de applicatie Java-gebaseerde configuratie of XML-gebaseerde configuratie gebruikt.

Laten we eens kijken naar de eerste manier om Java-configuratie te gebruiken:

@ComponentScan ("com.baeldung.spring.controller") @Configuration @EnableWebMvc openbare klasse ServletConfig implementeert WebMvcConfigurer {@Bean openbare InternalResourceViewResolver jspViewResolver () {InternalResourceViewResolver bean = nieuwe InternalResourceViewResolver bean = nieuwe InternalResourceViewResolver bean = nieuwe InternalResourceViewResolver; bean.setPrefix ("/ WEB-INF /"); bean.setSuffix (". jsp"); terugkeer boon; }}

Als de toepassing XML-configuratie gebruikt, zijn er twee verschillende benaderingen voor het configureren van deze handleradapter in XML-context van webtoepassingen. Laten we eens kijken naar de eerste benadering die in het bestand is gedefinieerd spring-servlet_RequestMappingHandlerAdapter.xml:

En hier is de tweede benadering:

Deze tag registreert deze twee klassen automatisch bij Spring MVC.

Als we het RequestMappingHandlerMapping, dan moeten we deze tag verwijderen uit de applicatiecontext XML en deze handmatig configureren in de applicatiecontext XML.

4.5. HttpRequestHandlerAdapter

Deze handleradapter wordt gebruikt voor de handlers die verwerken HttpRequests. Het implementeert het HttpRequestHandler interface, die een enkele handleRequest () methode voor het verwerken van het verzoek en het genereren van het antwoord.

Het retourtype van deze methode is ongeldig en wordt niet gegenereerd ModelAndView retourtype zoals geproduceerd door andere handleradapters. Het wordt in feite gebruikt om binaire reacties te genereren en het genereert geen weergave om weer te geven.

5. De toepassing uitvoeren

Als de applicatie is geïmplementeerd op localhost met het poortnummer 8082 en de context-root is spring-mvc-handlers:

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

6. Conclusie

In dit artikel hebben we verschillende soorten handleradapters besproken die beschikbaar zijn in het Spring-framework.

De meeste ontwikkelaars zullen waarschijnlijk vasthouden aan de standaardinstellingen, maar het is de moeite waard om te begrijpen hoe flexibel het framework is wanneer we verder moeten gaan dan de basis.

De broncode van deze tutorial is te vinden in het GitHub-project.


$config[zx-auto] not found$config[zx-overlay] not found