1)如果使用request.getRequestDispatcher().forward() 這種方式進行跳轉頁面,前后頁面共享一個request,存儲在request里面的數據也會一起發送過去下一個頁面, 。
2)如果用response.sendRedirect()是重新定向,前后頁面不是一個request。
你在頁面中寫的request,當這個jsp頁面被servlet容器編譯成servlet,再生成html流,通過response輸出到前端時生命周期才算結束,你的request在編譯、執行期間都是有效的,這次請求響應的周期直到response.write才算結束。不要弄混淆,你寫的JSP和用戶在前端看到的並不是同一個東西,JSP只是腳本,用戶看到的是腳本解釋執行后輸出的結果
這次請求響應的周期直到response.write才算結束"-----你的意思是當響應完成request才消失
是的,否則怎么能稱為請求-響應。你在JSP中寫的request,並沒有脫離這次請求的服務端,JSP中的變量、標簽等等都會在服務端解釋完后再write到客戶端,這才算響應完成
你可以設置request里面的數據存活時間。Request.setTime("httpwwwzhishajihaocom",1232322);
當從一個jsp發出一個request,即表明了這個request生命周期的開始,當到達action之后一般有兩種處理request的方式,一種為request.getDispatcher.forward,一種是response.sendRedirect.
對於request的forward,該request的生命周期將會繼續延續下去,當采用forward如果到達JSP頁面,那么之前從第一個JSP頁面中發送出來的request的消息將仍然存在,新的頁面同樣能夠取得該request里所包含的一些信息,比如之前的JSP發送request中所包含的參數信息.事實上,它們是同一個request.
而如果是使用response.sendRedirect那么該request的生命周期將結束.
對於request,對request信息的傳遞,只有setAttribute()這一個方法,該方法將設置一個Object對象到request中.
但是,如果當一個request是從jsp從發出,包含的信息段為param1=test這樣的方式,那么只能通過getParameter()得到,getAttribute()是得不到param1的value的.
再次,對於JSP的EL表達式,${}這中方式只能得到setAttribute中的值,因此當從一個JSP發送request到達action並且被forward到新的JSP中時,如果想在該JSP中取得JSP發送時的參數信息需要寫為這種形式:${param.patam1}.
我們都知道jsp中傳值 會涉及到 request,session,application這三個容器。
當我們想做一些緩存或者存儲一些全局變量時,就要考慮到它們的生命周期。
我們也有會疑惑一台計算機上打開同一WEB應用是否只產生一個session?
我們可以做對比了解:
application
全局作用范圍,整個應用程序共享,就是在部署文件中的同一個webApp共享,生命周期為:應用程序啟動到停止。
session
會話作用域,當用戶首次訪問時,產生一個新的會話,以后服務器就可以記住這個會話狀態。生命周期:會話超時,或者服務器端強制使會話失效。
打開一個瀏覽器請求一個網站的頁面后,Session開始,當session超過時間限制(一般是20分種)后,session注銷而失效或是人為使用session.invalidate();使用session失效。
用瀏覽器打開一個web程序,一個瀏覽器窗口就會有一個session,且是唯一的,過了session的生存周期就沒了,或者是你關了窗口也就沒了。
不同瀏覽器的session在計算機中並不是同一個。
request
請求作用域,就是客戶端的一次請求。比如訪問某個頁面,就是一次請求。頁面訪問結束,該頁面的request就結束了
ps
由上可知,如果我們有一份比較大的數據想做緩存。可以使用application 或者 session。 但是 application 占用的是服務器的資源,需要自己寫數據清除。session當用戶緩存就比較簡便,占用的是客戶端資源,會自動失效。