Request Dispatching is a mechanism to forward/redirect a request to another resource.
Here target resource can be one of the following:
1. a servlet/jsp in the same web application (using HttpServletRequest or ServletContext)
2. a servlet/jsp in different web application in the same web container (using ServletContext)
3. invoking other web container's page using redirect
Getting RequestDispatcher object:
There are three ways to get RequestDispatcher object.
1. using request's getRequestDispatcher()
RequestDispatcher dispatcher = request.getRequestDispatcher("<resource name>");
2. using ServletContext's getRequestDispatcher()
RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("<resource name>");
3. using ServletContext's getNamedDispatcher()
RequestDispatcher dispatcher = getServletContext().getNamedDispatcher(<resource name>);
Differences between request and context's getRequestDispatcher() methods:
1. request: we can forward to only any other servlet/jsp in the same web application
context: we can forward to any other servlet/jsp in the same web application or different web application in the same web container
2. request: target resource path can be absolute or relative
context: target resource path must be absolute
Difference between forward and include:
When forward() is used, we get the response written by Forwarded Servlet(Second servlet) only.
But with include(), we get both the servlet's written response.
Lets say there are two servlets - FirstServlet and SecondServlet, like below:
FirstServlet.java:
package com;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.RequestDispatcher;
public class FirstServlet extends HttpServlet {
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
PrintWriter out = response.getWriter();
out.println("From FirstServlet: before forward() to second servlet");
RequestDispatcher dispatcher = request.getRequestDispatcher("second");
dispatcher.forward(request, response); //OBSERVE THIS LINE
out.println("From FirstServlet: after forward() to second servlet");
out.flush();
}
}
SecondServlet.java:
package com;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class SecondServlet extends HttpServlet {
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
PrintWriter out = response.getWriter();
out.println("From SecondServlet: response from Second Servlet");
}
}
output with forward():
From SecondServlet: response from Second Servlet
output with include():
Here target resource can be one of the following:
1. a servlet/jsp in the same web application (using HttpServletRequest or ServletContext)
2. a servlet/jsp in different web application in the same web container (using ServletContext)
3. invoking other web container's page using redirect
Getting RequestDispatcher object:
There are three ways to get RequestDispatcher object.
1. using request's getRequestDispatcher()
RequestDispatcher dispatcher = request.getRequestDispatcher("<resource name>");
2. using ServletContext's getRequestDispatcher()
RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("<resource name>");
3. using ServletContext's getNamedDispatcher()
RequestDispatcher dispatcher = getServletContext().getNamedDispatcher(<resource name>);
Differences between request and context's getRequestDispatcher() methods:
1. request: we can forward to only any other servlet/jsp in the same web application
context: we can forward to any other servlet/jsp in the same web application or different web application in the same web container
2. request: target resource path can be absolute or relative
context: target resource path must be absolute
Difference between forward and include:
When forward() is used, we get the response written by Forwarded Servlet(Second servlet) only.
But with include(), we get both the servlet's written response.
Lets say there are two servlets - FirstServlet and SecondServlet, like below:
FirstServlet.java:
package com;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.RequestDispatcher;
public class FirstServlet extends HttpServlet {
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
PrintWriter out = response.getWriter();
out.println("From FirstServlet: before forward() to second servlet");
RequestDispatcher dispatcher = request.getRequestDispatcher("second");
dispatcher.forward(request, response); //OBSERVE THIS LINE
out.println("From FirstServlet: after forward() to second servlet");
out.flush();
}
}
SecondServlet.java:
package com;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class SecondServlet extends HttpServlet {
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
PrintWriter out = response.getWriter();
out.println("From SecondServlet: response from Second Servlet");
}
}
output with forward():
From SecondServlet: response from Second Servlet
output with include():
From FirstServlet: before forward() to second servlet
From SecondServlet: response from Second Servlet
From FirstServlet: after forward() to second servlet
getNamedDispatcher():
This is also obtained using request object. So using getNameDispatcher(), we can forward our request to any other servlet/jsp in the same web container, by mentioning its logical name, which is defined inside <servlet-name> tag.
sendRedirect():
This is used to forward the request to another web container's page.
public void sendRedirect(String url)
Lets say a servlet is redirecting request to google.com.
So when we send request to servlet, it will send back the http status code as 302(Moved Temporarily) to browser, with target url. Then browser will make another request to sent URL. This is not visible to user, so user assumes that response is directly coming from second url.

No comments:
Post a Comment