Lecture 23: Servlet Overview & Architecture

BMC201 - Web Technology

Mr. Prashant Kumar Nag

2026-02-27

Lecture 23

Servlet Overview & Architecture

Week 8 | Unit III: Servlets
BMC201 - Web Technology
Mr. Prashant Kumar Nag, Assistant Professor

Learning Objectives


  • Explain what a servlet is and its role in web applications
  • Understand the servlet architecture and container responsibilities
  • Describe the request-response processing flow
  • Understand servlet mapping and URL patterns
  • Grasp basic servlet lifecycle concepts
  • Learn about servlet filters and interceptors

Servlet at a Glance


A Servlet is a Java class that handles HTTP requests and generates responses on the server side.

Typical uses:

  • Process form data
  • Perform business logic
  • Interact with databases
  • Return HTML/JSON responses
  • Handle user sessions and authentication

Traditional Web Application Architecture


flowchart LR
  Client["Browser"] -->|HTTP Request| WebServer
  WebServer["Web Server<br/>(Tomcat)"] -->|Forward| SC
  SC["Servlet Container"] -->|Route| Servlet
  Servlet["Your Servlet"] -->|Query| DB[(Database)]
  DB -->|Result| Servlet
  Servlet -->|Response| Client

Servlet Container Responsibilities


  • Load and instantiate servlets - Creates servlet objects when first request arrives
  • Manage lifecycle - Calls init(), service(), destroy() at appropriate times
  • Create request/response objects - Wraps HTTP calls in HttpServletRequest and HttpServletResponse
  • Handle threading - Assigns threads from thread pool to handle concurrent requests
  • Security - Manages authentication, authorization, and SSL/TLS
  • Session management - Maintains user sessions across requests
  • Resource management - Manages classloaders, security domains, and resource pooling

URL Mapping: How Requests Route to Servlets


@WebServlet("/hello")              // Exact match
@WebServlet("/api/*")              // Wildcard: /api/users, /api/tasks, etc.
@WebServlet("*.json")              // Extension: any .json request

Or in web.xml:

<servlet-mapping>
  <servlet-name>HelloServlet</servlet-name>
  <url-pattern>/hello</url-pattern>
</servlet-mapping>

The container matches incoming request URLs to servlet mappings and routes accordingly.

Core Servlet Classes & Methods


import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

@WebServlet("/demo")
public class DemoServlet extends HttpServlet {
  
  // Called once when servlet is first loaded
  public void init() throws ServletException { }
  
  // Called for every request (delegated to doGet/doPost)
  public void service(HttpServletRequest req, HttpServletResponse res) { }
  
  // Handle GET requests
  protected void doGet(HttpServletRequest req, HttpServletResponse res) { }
  
  // Handle POST requests
  protected void doPost(HttpServletRequest req, HttpServletResponse res) { }
  
  // Called once when servlet is unloaded
  public void destroy() { }
}

Simple Servlet Example


@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
  
  @Override
  protected void doGet(HttpServletRequest request,
                      HttpServletResponse response)
      throws ServletException, IOException {
    response.setContentType("text/html; charset=UTF-8");
    PrintWriter out = response.getWriter();
    
    out.println("<h1>Hello from Servlet!</h1>");
    out.println("<p>Request URI: " + request.getRequestURI() + "</p>");
    out.close();
  }
}
  1. @WebServlet - Maps this servlet to /hello URL
  2. doGet() - Handles GET requests (called by container)
  3. setContentType() - Tells browser what format to expect
  4. PrintWriter - Output stream to send response to client

Request-Response Processing Flow


sequenceDiagram
    participant C as Browser
    participant SC as Servlet Container
    participant S as Servlet
    
    C->>SC: HTTP GET /hello
    SC->>S: service(request, response)
    S->>S: doGet() → generate HTML
    S-->>SC: Response 200 OK
    SC-->>C: HTTP Response

Generating Responses


// Set content type (MUST before getWriter())
response.setContentType("text/html; charset=UTF-8");

// Get output stream for text
PrintWriter out = response.getWriter();

// Write response data
out.println("<h1>Title</h1>");

// Set HTTP status code
response.setStatus(HttpServletResponse.SC_OK);  // 200

// Send error response
response.sendError(404, "Page not found");

Servlet URL Patterns & Routing


// Exact match - only /search
@WebServlet("/search")

// Path wildcard - /api/users, /api/tasks, etc.
@WebServlet("/api/*")

// Extension match - anything.json
@WebServlet("*.json")

// Root servlet - everything not matched elsewhere
@WebServlet("/")

URL pattern matching order: 1. Exact matches first 2. Then longest path pattern 3. Then extension pattern 4. Finally default servlet (/)

Servlet Filters: Intercepting Requests/Responses


@WebFilter("/*")
public class LoggingFilter implements Filter {
  
  @Override
  public void doFilter(ServletRequest request, ServletResponse response,
                       FilterChain chain)
      throws IOException, ServletException {
    
    System.out.println(">> Before servlet: " + 
      ((HttpServletRequest)request).getRequestURI());
    
    chain.doFilter(request, response);  // Pass to next filter/servlet
    
    System.out.println("<< After servlet: Status " + 
      ((HttpServletResponse)response).getStatus());
  }
  
  @Override
  public void init(FilterConfig config) throws ServletException { }
  
  @Override
  public void destroy() { }
}
  1. @WebFilter - Applies to all URLs (/*)
  2. doFilter() - Intercepts request before servlet and response after
  3. chain.doFilter() - Passes control down to next filter or servlet

Filter Chain: Multiple Interceptors


flowchart LR
  Request["HTTP Request"]
  F1["Filter 1<br/>(Logging)"]
  F2["Filter 2<br/>(Auth)"]
  Servlet["Servlet"]
  F2_out["Filter 2<br/>(Response)"]
  F1_out["Filter 1<br/>(Response)"]
  Response["HTTP Response"]
  
  Request -->|chain.doFilter| F1
  F1 -->|chain.doFilter| F2
  F2 -->|chain.doFilter| Servlet
  Servlet -->|returns| F2_out
  F2_out -->|returns| F1_out
  F1_out -->|returns| Response

Common Filter Use Cases


  • Logging Filter - Log all incoming requests and outgoing responses
  • Authentication Filter - Check credentials before servlet processes request
  • Compression Filter - GZip response body for faster transfer
  • CORS Filter - Add cross-origin headers for REST APIs
  • Character Encoding Filter - Set consistent encoding for all requests
  • Rate Limiting Filter - Throttle requests per IP or user
  • Error Handling Filter - Catch and format errors consistently

Servlet Initialization Parameters


Via annotation:

@WebServlet(value = "/config", 
            initParams = { @WebInitParam(name = "maxUsers", value = "1000"),
                          @WebInitParam(name = "timeout", value = "30") })
public class ConfigServlet extends HttpServlet {
  public void init() {
    String maxUsers = getInitParameter("maxUsers");
    String timeout = getInitParameter("timeout");
  }
}

Via web.xml:

<servlet>
  <init-param>
    <param-name>maxUsers</param-name>
    <param-value>1000</param-value>
  </init-param>
</servlet>

Summary


  • Servlet is a Java class handling HTTP requests on the server side
  • Servlet Container manages lifecycle, threading, and resource allocation
  • URL Mapping routes incoming requests to the appropriate servlet
  • Servlet Methods: init() (setup), service() (handle requests), destroy() (cleanup)
  • Request-Response objects wrap HTTP data with Java API
  • Filters intercept requests/responses for cross-cutting concerns
  • Filter Chain allows multiple interceptors to work in sequence

This architecture is the foundation of enterprise Java web applications!

Resources & References


Questions?

Next: Lecture 24 - Servlet Interface & Life Cycle