Spring DefaultServlet tutorial
last modified October 18, 2023
Spring DefaultServlet tutorial shows how to enable default servlet in a Spring application.
Spring is a popular Java application framework. In the tutorial, we use Spring 5 version.
DefaultServlet
DefaultServlet
is a default resource-serving servlet for most web applications,
used to serve static resources such as HTML pages and images.
DefaultServletHttpRequestHandler
attempts to auto-detect the
default Servlet for the containers, such as Tomcat, Jetty, Wildfly, and Resin,
at startup time. If the default Servlet has been custom configured with
a different name then the default Servlet's name must be explicitly provided.
If we rewrite the DefaultServlet's
route (/
), we can enable it with
DefaultServletHandlerConfigurer's
enable
method so that we can still
serve static resoruces with the container's default servlet.
Spring DefaultServlet example
In the following application we configure the Spring dispatcher servlet
to the /
path, which rewrites the default servlet's one.
We enable the default servlet with DefaultServletHandlerConfigurer
.
The application serves a simple HTML home page, which is a static resource.
pom.xml src ├───main │ ├───java │ │ └───com │ │ └───zetcode │ │ └───config │ │ MyWebInitializer.java │ │ WebConfig.java │ ├───resources │ │ logback.xml │ └───webapp │ index.html └───test └───java
This is the project structure.
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.zetcode</groupId> <artifactId>defaultservletex</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>17</maven.compiler.source> <maven.compiler.target>17</maven.compiler.target> </properties> <dependencies> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.4.0</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.23</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>3.3.2</version> </plugin> </plugins> </build> </project>
This is the Maven build file. We have the following dependencies:
javax.servlet-api
for Java Servlet technology, logback-classic
for logging, and spring-webmvc
for creating Spring Web MVC
applications.
The maven-war-plugin
creates web archives (WAR).
package com.zetcode.config; import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; public class MyWebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { @Override protected Class<?>[] getRootConfigClasses() { return null; } @Override protected Class<?>[] getServletConfigClasses() { return new Class[]{WebConfig.class}; } @Override protected String[] getServletMappings() { return new String[]{"/"}; } }
MyWebInitializer
initializes a Spring web application.
@Override protected String[] getServletMappings() { return new String[]{"/"}; }
We register the Spring DispatcherServlet
to the /
path. This replaces the DefaultServlet
; therefore we have to
register a default servlet handler in the configuration file.
package com.zetcode.config; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration @EnableWebMvc public class WebConfig implements WebMvcConfigurer { @Override public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { configurer.enable(); } }
WebConfig
enables Spring MVC with @EnableWebMvc
and
configures the DefaultServlet
with DefaultServletHandlerConfigurer's
enable
method.
@Override public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { configurer.enable(); }
The configureDefaultServletHandling
configures a
DefaultServletHttpRequestHandler
with a URL mapping of
/**
and the lowest priority relative to other URL mappings.
This way the static resource requests are handled by the container's default Servlet.
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Home page</title> </head> <body> <p> This is home page. </p> </body> </html>
This is the home page. It is a static resource and is automatically served
by the DefaultServlet
.
$ curl localhost:8080 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Home page</title> </head> <body> <p> This is home page. </p> </body> </html>
When we run the application, the home page is served.
In this article we shown how to register a default servlet in a Spring application.
Author
List all Spring tutorials.