Spring mvc HandlerMapping VS HandlerAdapter Spring mvc HandlerMapping VS HandlerAdapter spring spring

Spring mvc HandlerMapping VS HandlerAdapter


Since introduction of RequestMappingHandlerMapping and RequestMappingHandlerAdapter in Spring 3.1 the distinction is even simpler: RequestMappingHandlerMapping finds the appropriate handler method for the given request. RequestMappingHandlerAdapter executes this method, providing it with all the arguments.


The HandlerMapping is used to Maps a request to Handlers i.e. Controllers. For example: DefaultAnnotationHandlerMapping, SimpleUrlHandlerMapping, BeanNameUrlHandlerMapping. DefaultAnnotationHandlerMapping.

<mvc:annotation-driven /> declares explicit support for annotation-driven MVC controllers. The tag configures two beans (Mapping and Adapter) DefaultAnnotationHandlerMapping and AnnotationMethodHandlerAdapter so that you do not need to declare them in context config file.

The HandlerAdapter is basically an interface which facilitates the handling of HTTP requests in a very flexible manner in Spring MVC. The DispatcherServlet doesn’t invoke the method directly – it basically serves as a bridge between itself and the handler objects, leading to a loosely coupling design.

public interface HandlerAdapter {    //check if a particular handler instance is supported or not.     boolean supports(Object handler);   //used to handle a particular HTTP request and returns ModelAndView object to DispatcherServlet    ModelAndView handle(      HttpServletRequest request,      HttpServletResponse response,       Object handler) throws Exception;    long getLastModified(HttpServletRequest request, Object handler);}

Types of HandlerAdapter :
enter image description here

AnnotationMethodHandlerAdapter : which executes methods annotated with @RequestMapping. AnnotationMethodHandlerAdapter was deprecated and replace by RequestMappingHandlerAdapter from Spring 3.1+.

SimpleControllerHandlerAdapter: This is the default handler adapter registered by Spring MVC. It deals with classes implementing Controller interface and is used to forward a request to a controller object.

If a web application uses only controllers then we don’t need to configure any HandlerAdapter as the framework uses this class as the default adapter for handling a request.

Let’s define a simple controller class, using the older style of controller (implementing the Controller interface):

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

Similar XML configuration:

<beans ...>    <bean name="/greeting.html"      class="com.baeldung.spring.controller.SimpleControllerHandlerAdapterExample"/>    <bean id="viewResolver"      class="org.springframework.web.servlet.view.InternalResourceViewResolver">        <property name="prefix" value="/WEB-INF/" />        <property name="suffix" value=".jsp" />    </bean></beans>

for more