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 @WebServlet annotations over web.xml for simple mappings
  • Always set Content-Type before writing response body
  • Use try-with-resources for PrintWriter and 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