5 回答

TA貢獻16條經驗 獲得超8個贊
回來填坑。先說答案:前一題選D,后一題選A。我們來看下getRequestDispatche()和sendRedirect():
?????? getRequestDispatcher()前面是什么?request!既然是request,它必然是屬于服務器端的邏輯。而在這里,getRequestDispatcher()的作用就是轉發請求。完整的來講,一個請求包括request和response這兩個參數,所以在getRequestDispatcher()后面接了一個forward(resquest,response);把這個請求轉發到了另個頁面。這里,一定要明白轉發這兩個字:對原有的對象不進行修改,從A拿到B,這叫轉發,它是一個服務器的內部行為。所以在a.jsp收到轉發的request后,該requset還是有key為name的這個對象。你用getParameter("name")自然能夠獲取到value,也就是sase;
?????? 再來看看sendRedircet()。類似的,sendRedirect()前面是response對象。什么是response?你可以簡單的理解為是服務器想告訴客戶端(在這里是瀏覽器)的一系列信息。那么,sendRedirect()這個動作服務器想告訴客戶端什么信息呢?重定向!那什么是重定向又是什么呢?你可以理解為瀏覽器根據服務器的響應信息重新向某個URL發起一次新的請求,而這個URL也是服務器告訴瀏覽器的,在這里就是sendRedirect()中的參數。也就是說,重定向是一個客戶端行為,對應的URL地址欄會發生變化。這和你自己在地址欄輸入這個URL再回車,并沒有什么卵的區別。
?????? 明白了重定向的概念,我們回到你的題目上:重定向是客戶端行為,重新向某個URL發起請求,該請求的request和response信息都是新的,和上一次請求的request、response沒有一毛錢的關系。所以,重定向以后,在a.jsp頁面里面你收到request和response都是很干凈的,啥都沒攜帶,自認也沒有name這個參數,所以你這時候用getParameter()找不到name,自然給你返回了一個null值。顯示在頁面上也是null。
?????? 所以前一題選D,后一題選A。

TA貢獻223條經驗 獲得超56個贊
請求轉發:request.getRequestDispatcher(“/xx.jsp”).forward(request,response);可以實現request域對象數據共享(這一點很重要,日后學springmvc或者其他視圖框架會用到),地址欄不會反生變化(也就是一個請求)。
重定向:地址欄發生變化,request不能共享,兩次請求

TA貢獻98條經驗 獲得超73個贊
轉發:request.getRequestDispatcher(“/xx.jsp”).forward(request,response);?其特點是:地址欄無變化,始終是一個請求,轉發的對象可以是本工程內的任何頁面。
?重定向:就相當于客戶端向服務器請求時,服務器響應給客戶端一個新的URL瀏覽器就把請求傳遞個一個新的頁面 。特點是:地址發生了變化,重定向的范圍沒有限制。
添加回答
舉報