In Jakarta EE, you can define servlets using annotations instead of the traditional web.xml
deployment descriptor. The most common annotation used for this purpose is @WebServlet
. Here’s an overview of how to use annotations to define servlets:
1. Basic Syntax of the @WebServlet
Annotation
The @WebServlet
annotation is used to declare a servlet and map it to a URL pattern. It belongs to the jakarta.servlet.annotation
package.
package org.kodejava.servlet;
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;
@WebServlet(name = "MyServlet", urlPatterns = {"/hello", "/greet"})
public class MyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
response.getWriter().println("<h1>Hello, World!</h1>");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
response.getWriter().println("<h1>Post Request Handled</h1>");
}
}
2. Parameters of @WebServlet
The @WebServlet
annotation has several attributes you can set:
name
: Specifies the name of the servlet. This is optional.urlPatterns
(orvalue
): An array of URL patterns to which the servlet will respond. TheurlPatterns
orvalue
element is required.loadOnStartup
: Specifies the servlet’s load-on-startup priority. If set to a positive integer, the servlet will be loaded and initialized during deployment, not upon its first request.asyncSupported
: A boolean indicating whether the servlet supports asynchronous processing. Default isfalse
.
Example with Additional Attributes
package org.kodejava.servlet;
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;
@WebServlet(
name = "ExampleServlet",
urlPatterns = "/example",
loadOnStartup = 1,
asyncSupported = true
)
public class ExampleServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/plain");
response.getWriter().println("Welcome to the Example Servlet!");
}
}
3. How It Works
- No
web.xml
Needed: When you use@WebServlet
, there’s no need to register the servlet manually inweb.xml
. The application server automatically registers the servlet based on the annotation configuration. - URL Patterns: You define the URLs (using
urlPatterns
orvalue
) to which the servlet will respond.
4. Multiple URL Patterns
You can map multiple URL patterns to the same servlet using an array:
package org.kodejava.servlet;
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;
@WebServlet(urlPatterns = {"/path1", "/path2", "/path3"})
public class MultiPathServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/plain");
response.getWriter().println("This servlet can handle multiple paths!");
}
}
5. Use with Filters and Listeners
Annotations can also be used for filters (@WebFilter
) and listeners (@WebListener
). For example:
@WebFilter
for filters@WebListener
for event listeners
Conclusion
Using annotations to define servlets makes your code more concise and simplifies configuration. It eliminates the need for verbose web.xml
entries and is easier to maintain, particularly in modern Jakarta EE-based applications.
Maven dependencies
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<version>6.1.0</version>
<scope>provided</scope>
</dependency>