1、都是在一個請求中跨越多個Servlet
2、多個Servlet在一個請求中,他們共享request對象。就是在AServle中setAttribute()保存數據在BServlet中由getAttribute()取出數據
3、在AServlet轉發到BServlet,那么整個請求都是由BServlet來完成,AServlet不再插手
4、AServlet 包含BServlet,那么兩個Servlet共同完成請求
5、請求轉發和請求包含都需要使用一個對象RequestDispatcher。
AServlet.java
package cn.edu.aynu.rjxy.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class AServlet extends HttpServlet { /* * 請求轉發 * */ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //設置響應頭 response.setContentType("text/html;charset=utf-8"); response.getWriter().print("AServlet..."); request.setAttribute("name", "張三"); //獲得RequestDispatcher對象 RequestDispatcher rd = request.getRequestDispatcher("/BServlet"); //將request對象和response對象傳遞給BServlet rd.forward(request, response); } }
BServlet.java
package cn.edu.aynu.rjxy.servlet; 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 BServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String name = (String) request.getAttribute("name"); response.getWriter().print("BServlet為您服務..."); response.getWriter().print("name="+name); } }
CServlet.java
package cn.edu.aynu.rjxy.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class CServlet extends HttpServlet { /* * 請求包含 * */ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //設置響應頭 response.setContentType("text/html;charset=utf-8"); response.getWriter().print("AServlet為您服務..."); RequestDispatcher rd = request.getRequestDispatcher("/DServlet"); rd.include(request, response); } }
DSevler.java
package cn.edu.aynu.rjxy.servlet; 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 DServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.getWriter().print("DServlet為您服務..."); } }
1、請求轉發是一個請求,而重定向是兩個請求
2、請求轉發后瀏覽器地址欄不會發生變化重定向會發生變化
3、請求轉發的目標只能在本項目中的資源,重定向的目標可以是其他應用
4、請求轉發對Aservlet和Bservlet的請求方法是相同的,就是要么都是get,要么都是post。因為他們是同一個請求
5、請求轉發可以在多個Servlet中共享request的數據,而重定向不行。