There's no reason we can't use Java Servlet components alongside Spring MVC.
Spring MVC itself is built on the Java Servlet API (via DispatcherServlet) and runs inside a Servlet container.
We can register other Java Servlet components via web.xml or by using annotations.
Let's look at an example of using a Servlet and a Filter in Spring MVC.
Example
A Spring Controller
package com.logicbig.example;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping("/app")
public class MyController {
@RequestMapping
@ResponseBody
public String handleRequest () {
System.out.println("-- handling request in controller --");
return "dummy response from MyController";
}
}
A Java Servlet
package com.logicbig.example;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(name = "myServlet", urlPatterns = "/app2")
public class MyServlet extends HttpServlet {
@Override
protected void doGet (HttpServletRequest req,
HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("-- In MyServlet --");
PrintWriter writer = resp.getWriter();
writer.println("dummy response from MyServlet");
}
}
A Servlet Filter
package com.logicbig.example;
import jakarta.servlet.Filter;
import jakarta.servlet.FilterChain;
import jakarta.servlet.FilterConfig;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.annotation.WebFilter;
import jakarta.servlet.http.HttpServletRequest;
import java.io.IOException;
@WebFilter(filterName = "myFilter", urlPatterns = "/*")
public class MyFilter implements Filter {
@Override
public void init (FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter (ServletRequest request, ServletResponse response,
FilterChain chain)
throws IOException, ServletException {
System.out.println("-- In MyFilter --");
HttpServletRequest req = (HttpServletRequest) request;
System.out.println("URI: " + req.getRequestURI());
chain.doFilter(request, response);
}
@Override
public void destroy () {
}
}
Java Config class
package com.logicbig.example;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
@EnableWebMvc
@Configuration
@ComponentScan
public class MyWebConfig {
}
DispatcherServlet initializer
package com.logicbig.example;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
public class AppInitializer extends
AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses () {
return null;
}
@Override
protected Class<?>[] getServletConfigClasses () {
return new Class<?>[]{MyWebConfig.class};
}
@Override
protected String[] getServletMappings () {
return new String[]{"/"};
}
}
To try examples, run embedded Jetty (configured in pom.xml of example project below):
mvn jetty:run
Output
Accessing Spring Controller at /app
$ curl -s "http://localhost:8080/app" dummy response from MyController
Server Output -- In MyFilter -- URI: /app -- handling request in controller --
Note that MyFilter is also invoked, confirming that manually registered Servlet Filters still run for requests handled by Spring MVC controllers.
Accessing Servlet at /app2
$ curl -s "http://localhost:8080/app2" dummy response from MyServlet
Server Output -- In MyFilter -- URI: /app2 -- In MyServlet --
Other Options
Using HttpRequestHandler
An implementation of HttpRequestHandler can be thought of as a mini Servlet that runs within Spring MVC's DispatcherServlet. See an example here.
Using Filter as a Spring bean with DelegatingFilterProxy
See an example in the next tutorial.
Using Servlet components in Spring Boot
Check this tutorial out.
Example ProjectDependencies and Technologies Used: - spring-webmvc 7.0.6 (Spring Web MVC)
Version Compatibility: 3.2.9.RELEASE - 7.0.6 Version compatibilities of spring-webmvc with this example: Versions in green have been tested.
- jakarta.servlet-api 6.1.0 (Jakarta Servlet API documentation)
- JDK 25
- Maven 3.9.11
|