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)
請求內部轉發實例演示
@Overrideprotectedvoid 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;}
@Overrideprotectedvoid 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對象 |
