1.請求內部轉發
使用:req.getRequestDispatcher("
uri").forward(req, resp);
1、多個
Servlet
共享一個request對象(重點)
2、一次請求,當轉發結束的時候也就是業務處理完畢的時候request對象會被銷毀
3、地址欄不改變
注意在執行轉發完畢后會繼續執行代碼,但是沒有意義,所以一般在轉發后面加return
4、request對象的作用域(重中之重)
作用域:共享request對象的Servlet
作用域中存取數據:
req.setAttribute(key,value)
req.getAttribute(key)
req.removeAttribute(key)
請求內部轉發實例演示
@Override
protectedvoid service(HttpServletRequest req,HttpServletResponse resp)
throws ServletException,IOException{
//設置響應編碼格式
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
//設置請求字符編碼格式
req.setCharacterEncoding("utf-8");
//請求轉發(獲取用戶數據):
System.out.println(req.getParameter("uname"));
System.out.println(req.getParameter("pwd"));
//開始請求轉發
req.setAttribute("405","聽說支付寶要收費了,趕緊給我轉賬");
req.getRequestDispatcher("tr.action").forward(req, resp);
//開始重定向
resp.sendRedirect("http://www.baidu.com");
return;
}
@Override
protectedvoid service(HttpServletRequest req,HttpServletResponse resp)
throws ServletException,IOException{
//獲取用戶數據
System.out.println(req.getParameter("uname")+"-----tr.action");
System.out.println(req.getParameter("pwd")+"-----tr.action");
System.out.println(req.getAttribute("405"));
resp.getWriter().write("哈哈");
}
2.重定向
使用:resp.sendRedirect("uri");
特點:
地址欄改變
兩次請求,兩個request對象
3.重定向/請求轉發時參數URI問題
3.1重定向
項目目錄

main.jsp

在main.jsp中進行重定向
response.sendRedirect("/login.jsp")-->代表localhost:8080/login.jsp |
response.sendRedirect("login.jsp")-->代表localhost:8080/Admin/login.jsp |
response.sendRedirect("checkOper")-->代表localhost:8080/Admin/checkOper |
response.sendRedirect("/checkOper")-->代表localhost:8080/checkOper |
response.sendRedirect("/Exercise_Jsp/login.jsp")-->代表localhost:8080/Exercise_Jsp/login.jsp |
response.sendRedirect("/Exercise_Jsp/checkOper")-->代表localhost:8080/Exercise_Jsp/checkOper |
3.2請求轉發
在checkOper中轉到Oper下的selectAll.jsp中

請求內部轉發和重定向圖解

總結:
請求轉發是一次請求,地址欄不改變,多個Sevrlet共享一個request |
重定向是兩次請求,地址欄改變,兩個request對象 |