Request Dispatching: Forward, Include, and AsyncContext
Request Dispatching: Forward, Include, and AsyncContext
Servlet technology में Request Dispatching एक बहुत important concept है, जो हमें एक servlet से दूसरे servlet या JSP page पर request को forward या include करने की सुविधा देता है। जब हम web application बनाते हैं, तब कई बार ऐसा होता है कि एक servlet का काम खत्म होने के बाद control दूसरे component को देना होता है — यही काम RequestDispatcher करता है।
What is RequestDispatcher?
RequestDispatcher एक interface है जो javax.servlet package में मिलता है। इसका main काम है – किसी request को दूसरे resource (जैसे servlet, JSP या static file) को भेजना (forward करना) या response में किसी दूसरे resource का output जोड़ना (include करना)।
RequestDispatcher कैसे प्राप्त करते हैं?
RequestDispatcher object हम दो तरीकों से प्राप्त कर सकते हैं:
- Using ServletContext:
RequestDispatcher rd = getServletContext().getRequestDispatcher("/targetServlet"); - Using HttpServletRequest:
RequestDispatcher rd = request.getRequestDispatcher("target.jsp");
पहला तरीका तब use होता है जब हमें किसी absolute path से दूसरे resource तक पहुंचना हो, जबकि दूसरा तरीका relative path के लिए इस्तेमाल किया जाता है।
Forward Method
forward() method का use तब किया जाता है जब हमें current servlet का control पूरी तरह किसी दूसरे resource को देना हो। जब forward किया जाता है, तो current servlet का response client को नहीं जाता — बल्कि पूरा response अगले resource से आता है।
forward() का Syntax
RequestDispatcher rd = request.getRequestDispatcher("SecondServlet");
rd.forward(request, response);
Forward Method के Features
- Client को पता नहीं चलता कि request दूसरे resource को forward की गई है।
- Control पूरी तरह अगले resource के पास चला जाता है।
- Request और Response object वही रहते हैं — नए नहीं बनते।
- forward method response buffer clear होने से पहले call करनी चाहिए।
Example of Forward
public class FirstServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
RequestDispatcher rd = request.getRequestDispatcher("SecondServlet");
rd.forward(request, response);
}
}
इस example में FirstServlet का काम पूरा होने के बाद control SecondServlet को दे दिया गया है। Client को सिर्फ SecondServlet का output दिखाई देगा।
Include Method
include() method का use तब किया जाता है जब हमें current servlet के response में किसी दूसरे resource का output भी जोड़ना हो। जैसे — header, footer, या menu को add करना।
include() का Syntax
RequestDispatcher rd = request.getRequestDispatcher("footer.html");
rd.include(request, response);
Include Method के Features
- Current servlet और target resource दोनों का output client को भेजा जाता है।
- Control वापस current servlet पर लौट आता है include के बाद।
- Common UI parts (header/footer) include करने में helpful होता है।
- Request और Response objects share किए जाते हैं।
Example of Include
public class HomeServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<h2>Welcome to Home Page</h2>");
RequestDispatcher rd = request.getRequestDispatcher("footer.html");
rd.include(request, response);
}
}
यहाँ footer.html को HomeServlet के output में add किया गया है — यानी दोनों output merge होकर client को दिखेंगे।
Difference Between Forward and Include
| Feature | forward() | include() |
|---|---|---|
| Control Transfer | Control पूरी तरह अगले resource को चला जाता है | Control include के बाद वापस आ जाता है |
| Response Merge | Only next resource का response दिखता है | Current + next resource दोनों का response दिखता है |
| Visibility to Client | Client को forwarding का पता नहीं चलता | Client combined output देखता है |
| Use Case | Page navigation, processing transfer | Header/footer जोड़ना, common UI elements |
AsyncContext in Servlet
AsyncContext Servlet 3.0 से introduce किया गया था ताकि servlets asynchronous processing कर सकें। मतलब — जब कोई long-running process चल रहा हो (जैसे external API call या database operation), तब servlet thread को free किया जा सकता है और response बाद में asynchronously complete किया जा सकता है।
Why AsyncContext is Needed?
Normally, servlets synchronous होती हैं — जब तक process खत्म नहीं होता, thread busy रहता है। इससे server performance गिर सकती है। लेकिन AsyncContext के साथ हम long operations को background में run कर सकते हैं और servlet container को जल्दी free कर सकते हैं।
AsyncContext कैसे Enable करें?
Async processing enable करने के लिए हमें web.xml या annotation में asyncSupported = true लिखना होता है।
Example of AsyncContext
@WebServlet(urlPatterns = "/asyncDemo", asyncSupported = true)
public class AsyncDemoServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
AsyncContext asyncCtx = request.startAsync();
asyncCtx.start(() -> {
try {
Thread.sleep(3000);
PrintWriter out = asyncCtx.getResponse().getWriter();
out.println("Async Processing Done!");
asyncCtx.complete();
} catch (Exception e) { e.printStackTrace(); }
});
}
}
AsyncContext के Important Methods
| Method | Description |
|---|---|
startAsync() |
Async processing शुरू करता है |
start(Runnable) |
Background thread में process चलाता है |
complete() |
Async processing को खत्म करता है |
dispatch() |
Request को किसी दूसरे resource पर भेजता है asynchronously |
Advantages of AsyncContext
- Server performance और scalability improve होती है।
- Long-running tasks के दौरान threads block नहीं होते।
- Non-blocking I/O operations support करता है।
- Real-time applications (chat, notifications) में useful है।
RequestDispatcher vs AsyncContext
दोनों ही request forwarding से जुड़े हैं, लेकिन उनके purpose अलग हैं।
| Aspect | RequestDispatcher | AsyncContext |
|---|---|---|
| Processing Type | Synchronous | Asynchronous |
| Control Flow | Immediate transfer या include | Background processing possible |
| Use Case | Page navigation, response merge | Long-running tasks, async I/O |
| Thread Usage | Same thread | Separate worker thread |
Exam Point of View Notes
- RequestDispatcher दो method provide करता है –
forward()औरinclude() - forward() पूरे response को दूसरे resource पर transfer करता है
- include() दूसरे resource का output current response में जोड़ता है
- AsyncContext Servlet 3.0 feature है जो asynchronous processing allow करता है
- asyncSupported=true set करना जरूरी है async servlets के लिए
- forward() response भेजने से पहले call होना चाहिए
- include() header/footer जैसे common components के लिए useful है
- AsyncContext long operations को efficiently handle करता है