request的生命周期很短,隻活動於瀏覽器向服務器的一次請求中,當請求執行完,當前對象也將被銷毀掉。
request經常用來獲取瀏覽器頁面上輸入的表格信息——用戶名、密碼諸如此類也可以在servlet中setAttribute("索引名","索引值")來存儲一對object類型的鍵值對,通過forward或include方法實現請求跳轉,區別隻是前者不將response中的輸出流信息輸出,後者則進行輸出。由於跳轉還是在同一個請求中進行的,request對象並未被銷毀,所以能從跳轉到的頁面中得到鍵值對中的值。
Java代碼
/**
* HelloServlet中的請求處理方法
*/
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
super.service(req, resp);
resp.setContentType("text/html;charset=gbk");
resp.setCharacterEncoding("gbk");
req.setCharacterEncoding("gbk");
//得到用戶發送請求時輸入的參數
String username = req.getParameter("username");
req.setAttribute("username", username);
req.getRequestDispatcher("redirect.jsp").forward(req, resp);
//resp.sendRedirect("redirect.jsp");
}
登錄界面:當點擊登錄按鈕時,請求被服務器接收,servlet進行處理,將username保存,然後跳轉到redirect.jsp中。
跳轉界面:跳轉到redirect.jsp中,並在頁面上顯示出瞭用戶名,值得註意的一點,地址欄並沒有指向redirect.jsp,間接的證明所有操作都在一個請求中。
firebug:很明顯,服務器隻收到一個采用post方法的請求。
至於request的生命周期是否隻在一個請求中,並沒有得到驗證。那麼如果在兩個請求中完成上面的操作,是不是還會得到username呢?
Java代碼
/**
* HelloServlet中的請求處理方法
*/
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
super.service(req, resp);
resp.setContentType("text/html;charset=gbk");
resp.setCharacterEncoding("gbk");
req.setCharacterEncoding("gbk");
//得到用戶發送請求時輸入的參數
String username = req.getParameter("username");
req.setAttribute("username", username);
//req.getRequestDispatcher("redirect.jsp").forward(req, resp);
//重定向
resp.sendRedirect("redirect.jsp");
}
1、用戶名顯示為"null",說明request的生命周期是一次請求;2、地址欄指向瞭redirect.jsp;3、firebug中顯示出瞭兩次請求,一次是我指定的"post",另一次應該是默認的"get",response將重定向的信息返回給瀏覽器,瀏覽器再進行第二次請求,此時第一個request對象被銷毀,所以再也得不到它攜帶的信息瞭。