DispatcherServlet in Spring Boot

Hemanth Kumar N V
3 min readJun 19, 2024

--

In Spring Boot, the DispatcherServlet retains its central role as the front controller for handling all HTTP requests and responses within a web application. However, Spring Boot simplifies the configuration and management of the DispatcherServlet compared to traditional Spring MVC applications.

Key Features and Functions

  1. Centralized Request Handling: The DispatcherServlet intercepts all incoming requests and delegates them to the appropriate controllers based on URL patterns and request mappings.
  2. Pre-processing and Post-processing: The DispatcherServlet allows for pre-processing and post-processing of requests via interceptors, enabling tasks like logging, authentication, and data manipulation.
  3. View Resolution: It resolves logical view names returned by controllers to actual views, such as JSP, Thymeleaf, or other templating engines.
  4. Exception Handling: The DispatcherServlet handles exceptions that occur during request processing, providing a consistent error-handling mechanism through configured exception resolvers.

Configuration in Spring Boot

Spring Boot automatically configures the DispatcherServlet without requiring explicit definitions in XML or Java classes. This auto-configuration is part of Spring Boot's ability to reduce boilerplate code and simplify setup.

Default Configuration: By default, Spring Boot registers the DispatcherServlet and maps it to the root URL pattern (/). This means it will handle all incoming requests.

Customizing the DispatcherServlet

While Spring Boot provides sensible defaults, you can customize the DispatcherServlet if needed.

  1. Changing the DispatcherServlet URL Pattern:
  2. You can customize the URL pattern by configuring the spring.mvc.servlet.path property in the application.properties file:
spring.mvc.servlet.path=/api

This configuration changes the default URL pattern from / to /api, so the DispatcherServlet will handle requests starting with /api.

2. Customizing the DispatcherServlet Bean:

If you need to customize the DispatcherServlet bean directly, you can define a DispatcherServlet bean in a configuration class:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.DispatcherServlet;

@Configuration
public class WebConfig {

@Bean
public DispatcherServlet dispatcherServlet() {
DispatcherServlet dispatcherServlet = new DispatcherServlet();
dispatcherServlet.setThrowExceptionIfNoHandlerFound(true);
return dispatcherServlet;
}
}

Here, we customize the DispatcherServlet to throw an exception if no handler is found for a request.

3. Customizing the DispatcherServlet Registration:

You can also customize how the DispatcherServlet is registered in the ServletContext:

import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.DispatcherServlet;

@Configuration
public class WebConfig {

@Bean
public ServletRegistrationBean<DispatcherServlet> dispatcherServletRegistration() {
DispatcherServlet dispatcherServlet = new DispatcherServlet();
ServletRegistrationBean<DispatcherServlet> registrationBean = new ServletRegistrationBean<>(dispatcherServlet, "/custom/*");
registrationBean.setName("customDispatcher");
return registrationBean;
}
}

This example registers the DispatcherServlet with a custom URL pattern /custom/* and a custom name customDispatcher.

Using Interceptors with DispatcherServlet in Spring Boot

Interceptors can be used in Spring Boot in a manner similar to traditional Spring MVC applications. Define the interceptor and register it using WebMvcConfigurer.

Step 1: Define the Interceptor

import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class CustomInterceptor implements HandlerInterceptor {

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("Pre Handle method is Calling");
return true;
}

@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("Post Handle method is Calling");
}

@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("Request and Response is completed");
}
}

Step 2: Register the Interceptor

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {

@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new CustomInterceptor())
.addPathPatterns("/api/**")
.excludePathPatterns("/api/login", "/api/register");
}
}

Conclusion

The DispatcherServlet in Spring Boot simplifies the process of building web applications by providing automatic configuration and reducing the need for boilerplate code. It remains a crucial component, serving as the front controller that manages all HTTP requests and responses. With the ability to customize its behavior and integrate with other Spring features seamlessly, the DispatcherServlet helps developers build robust and maintainable web applications.

--

--

Hemanth Kumar N V

Staff Software Engineer, (Technologies Java, Kotlin, JavaScript, Android, AWS)