On this page
Servlet Basics
Servlets are Java classes that handle HTTP requests and generate responses. They are the foundation of Java web development, running inside a servlet container (Tomcat, Jetty).
Servlet Lifecycle
init() → service() [doGet/doPost/...] → destroy()
↑ ↑ (many calls) ↑
Container creates Container shuts down
| Method | Called | Purpose |
|---|---|---|
init() |
Once | Setup resources |
service() |
Per request | Dispatch to doGet/doPost |
destroy() |
Once | Cleanup resources |
Basic Servlet
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String name = request.getParameter("name");
response.setContentType("text/html;charset=UTF-8");
try (PrintWriter out = response.getWriter()) {
out.println("<h1>Hello, " + (name != null ? name : "World") + "!</h1>");
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
// authenticate and respond
response.sendRedirect("/dashboard");
}
}
web.xml Configuration (alternative to annotations)
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>com.example.HelloServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
Request and Response
// Request info
String method = request.getMethod();
String uri = request.getRequestURI();
String param = request.getParameter("id");
String header = request.getHeader("Accept");
Cookie[] cookies = request.getCookies();
HttpSession session = request.getSession(true);
// Request attributes (forward between components)
request.setAttribute("user", currentUser);
User user = (User) request.getAttribute("user");
// Response
response.setStatus(HttpServletResponse.SC_OK);
response.setContentType("application/json");
response.setHeader("Cache-Control", "no-cache");
response.addCookie(new Cookie("sessionId", session.getId()));
response.sendRedirect("/login");
Request Dispatching
// Forward (server-side, URL unchanged)
RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/views/profile.jsp");
dispatcher.forward(request, response);
// Include (embed another resource)
dispatcher.include(request, response);
Session Management
HttpSession session = request.getSession(); // create if not exists
session.setAttribute("userId", user.getId());
session.setMaxInactiveInterval(1800); // 30 minutes
Long userId = (Long) session.getAttribute("userId");
session.invalidate();
Servlet 6.0 (Jakarta EE 10)
Since Jakarta EE 9, packages moved from javax.servlet to jakarta.servlet:
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.annotation.WebServlet;
Servlet vs Spring MVC
| Aspect | Servlet | Spring MVC |
|---|---|---|
| Boilerplate | More | Less (annotations) |
| Routing | Manual or web.xml | @RequestMapping |
| DI | Manual | Spring container |
| Best for | Learning, simple apps | Production web apps |
Best Practices
- Prefer
@WebServletannotations over web.xml for simple mappings - Always set
Content-Typebefore writing response body - Use try-with-resources for
PrintWriterand streams - Never store large objects in session — use IDs and reload from DB
- For new projects, use Spring MVC or Spring Boot instead of raw servlets