Feedback Form

service() Method: Request Routing to doGet(), doPost(), and Thread Safety

service() Method in Servlet: Request Routing to doGet(), doPost(), and Thread Safety

service() Method in Servlet क्या है?

जब भी कोई client (जैसे web browser) किसी Servlet को request भेजता है, तो उस request को handle करने के लिए service() method call किया जाता है। यह method Servlet lifecycle का सबसे महत्वपूर्ण हिस्सा है। इसका काम है — request को analyze करना और उसे proper method (जैसे doGet() या doPost()) की तरफ route करना।

यानि simple शब्दों में बोले तो — service() method एक traffic controller की तरह काम करता है जो यह तय करता है कि client की request किस type की है (GET या POST) और उसे कहाँ भेजना है।

service() Method की Definition

Definition: service() method Servlet interface में defined होता है और हर request के लिए automatically call किया जाता है। यह method javax.servlet.Servlet interface में होता है और इसे GenericServlet तथा HttpServlet दोनों classes override करती हैं।

Syntax:

public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException

लेकिन जब हम HttpServlet class का use करते हैं, तो उसका service() method request type को check करता है और उसे doGet(), doPost(), doPut(), या doDelete() जैसे methods को pass कर देता है।

service() Method कैसे काम करता है?

जब कोई client request भेजता है, Servlet container (जैसे Tomcat) उस request को Servlet के service() method को देता है। अब यह method check करता है कि request का type क्या है:

  • अगर request type GET है → doGet() method को call किया जाएगा।
  • अगर request type POST है → doPost() method को call किया जाएगा।
  • अगर request type PUT है → doPut() method को call किया जाएगा।
  • अगर request type DELETE है → doDelete() method को call किया जाएगा।

यानि service() method हर request को सही जगह भेजने का काम करता है ताकि proper business logic execute हो सके।

Example:

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class MyServlet extends HttpServlet {
  public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException {
    res.setContentType("text/html");
    PrintWriter out = res.getWriter();
    out.println("<h3>GET Request Handled Successfully!</h3>");
  }

  public void doPost(HttpServletRequest req, HttpServletResponse res) throws IOException {
    res.setContentType("text/html");
    PrintWriter out = res.getWriter();
    out.println("<h3>POST Request Handled Successfully!</h3>");
  }
}

ऊपर के example में जब भी user GET request भेजेगा तो doGet() call होगा, और POST request भेजेगा तो doPost() call होगा। लेकिन दोनों के बीच में routing का काम service() method करता है।

Request Routing Process in service()

चलिए step-by-step देखते हैं कि service() method कैसे routing करता है:

  • Step 1: Browser से request Servlet container (जैसे Tomcat) को जाती है।
  • Step 2: Container Servlet instance के service() method को call करता है।
  • Step 3: service() method request type को check करता है।
  • Step 4: Type के अनुसार सही HTTP method (doGet/doPost आदि) को call करता है।
  • Step 5: Response generate करके client को वापस भेजा जाता है।

इस पूरे process में service() method एक bridge की तरह काम करता है जो client और business logic के बीच में coordination बनाता है।

HttpServlet Class में service() Method का Role

HttpServlet class में पहले से ही service() method defined होता है, और हमे इसे normally override करने की जरूरत नहीं होती। यह method automatically request को proper HTTP method की तरफ भेज देता है।

लेकिन अगर आप चाहते हो कि हर request (GET या POST) पर common logic execute हो, तो आप service() method को override कर सकते हो।

Example: Common Logic Handling

public void service(HttpServletRequest req, HttpServletResponse res) throws IOException {
  res.setContentType("text/html");
  PrintWriter out = res.getWriter();
  out.println("<h3>Request received and processing started...</h3>");

  String method = req.getMethod();
  if(method.equals("GET")) {
    doGet(req, res);
  } else if(method.equals("POST")) {
    doPost(req, res);
  }
}

ऊपर के code में हमने explicitly routing किया है, जो internally वैसे ही HttpServlet करता है।

Thread Safety in service() Method

अब बात करते हैं एक बहुत important topic की — Thread Safety.

जब भी multiple clients एक ही time पर Servlet को request भेजते हैं, तो container हर request के लिए अलग thread बनाता है। सभी threads एक ही Servlet instance पर run करते हैं।

इसलिए अगर आपका Servlet shared data या global variable का use करता है, तो data corruption या inconsistent result आ सकता है।

Example of Thread Safety Issue:

public class CounterServlet extends HttpServlet {
  int counter = 0;

  public void service(HttpServletRequest req, HttpServletResponse res) throws IOException {
    counter++;
    res.setContentType("text/html");
    PrintWriter out = res.getWriter();
    out.println("<h3>Visitor Count: " + counter + "</h3>");
  }
}

ऊपर के code में अगर multiple users एक साथ site को access करें, तो counter variable inconsistent हो सकता है क्योंकि सभी threads एक ही variable share कर रहे हैं।

Thread Safety Solutions:

  • Instance variables का use न करें।
  • Shared resources को synchronize करें।
  • हर request के लिए local variables का use करें।
  • या फिर SingleThreadModel (deprecated) interface का use करें, लेकिन यह practical नहीं है।

Safe Example:

public void service(HttpServletRequest req, HttpServletResponse res) throws IOException {
  int counter = 0; // local variable
  counter++;
  res.setContentType("text/html");
  PrintWriter out = res.getWriter();
  out.println("<h3>Visitor Count: " + counter + "</h3>");
}

अब हर request के लिए counter अलग रहेगा और data safe रहेगा।

Key Points to Remember

  • service() method हर incoming request को handle करता है।
  • यह request type check करके proper method को call करता है।
  • HttpServlet class में यह already defined होता है।
  • अगर आपको हर request पर common logic चाहिए, तो इसे override किया जा सकता है।
  • Multiple threads एक साथ run करते हैं, इसलिए thread safety का ध्यान रखें।

Comparison Between service(), doGet(), and doPost()

Feature service() doGet() doPost()
Purpose Request Routing Handle GET Request Handle POST Request
Call Type Automatically by Container Called by service() Called by service()
Usage Generally not overridden Frequently overridden Frequently overridden
Parameters ServletRequest, ServletResponse HttpServletRequest, HttpServletResponse HttpServletRequest, HttpServletResponse

Exam-Oriented Notes (Quick Revision)

  • service() method Servlet lifecycle का core part है।
  • यह request को proper method (doGet/doPost) की तरफ route करता है।
  • Every client request automatically service() method को trigger करती है।
  • HttpServlet में इसे override करना rarely जरूरी होता है।
  • Thread safety maintain करने के लिए local variables का use करें।
  • Common logic apply करने के लिए इसे override किया जा सकता है।
  • Multiple clients की simultaneous requests multi-threading से handle होती हैं।
  • service() method = Request Router + Thread Manager।