1. 程式人生 > >關於request和session的生命週期

關於request和session的生命週期

我們都知道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當用戶快取就比較簡便,佔用的是客戶端資源,會自動失效。

 

最近在重溫jsp,之前呢已經看過一遍,有些東西忘了。而在做java web開發時,request,session又是用的比較多的。尤其是頁面的跳轉傳值問題,或多或少地會用到request和session,由於有些東西現在知道,過一段時間會忘,現將request和session的生命週期總結如下:

首先是session,比如我們在實現一個購物車功能時,在某一頁面(這裡稱為頁面A)選擇了一些購物的商品,新增到購物車。那麼當我們選擇完成後點選我的購物車時會跳轉到一個購物車頁面(這裡稱為頁面B),這和頁面A是兩個不同的頁面,那麼怎麼講頁面A選取的商品新增到頁面B呢。這裡一種解決方案就是session。直接上一個demo了:

A.jsp頁面:

<body>
    <h1>A介面</h1>
    <%
        session.setAttribute("name","蘋果");//這是jsp檔案,如果是Servlet的話,先得獲得Session,HttpSession hs=request.getSession(true);
     %>

  </body>

B.jsp頁面:

<body>
    <h1>B介面</h1>
    <%
    String name1=(String)session.getAttribute("name");
     %>
     <p>Session的值為:<%=name1 %></p>
 </body>

上面就達到了一個傳值得目的,當然,我們談的是session的生命週期,Tomcat裡,預設的session生命週期是30min,也就是你不操作介面的時間,你一重新整理介面的話,session會重新計時的,那麼session的預設時間可以改麼,答案是肯定的。可以在Tomcat目錄下的conf檔案下的web.xml進行修改,如下圖所示,預設是30min,修改的話改個數值就行了:

恩 預設的可以設定,那麼我們每個應用程式的session可以自己設定生命週期呢,答案是可以的。比如在A.jsp介面加句話就行了。

A.jsp頁面:
<body>
    <h1>A介面</h1>
    <%
        session.setAttribute("name","蘋果");//這是jsp檔案,如果是Servlet的話,先得獲得Session,HttpSession hs=request.getSession(true);

        session.setMaxInactiveInterval(5);
     %>
  </body>

這裡session.setMaxInactiveInterval(5);設定的是有效時間5秒,這裡是以秒為單位的。

那麼比如我從A介面跳轉到B介面,B介面會顯示Asession傳過來的session內容,但是如果我5秒內沒有動過B介面,那麼再次重新整理A介面時, 將不會再獲得session內的值了,因為這個session失效了。好了session生命週期相關先介紹到這裡。

下面介紹request,request有兩個方法:getParameter()和getAttribute(),詳情請見部落格:http://blog.csdn.net/jcy1009015337/article/details/53768512

現在有兩個介面test1.jsp,test2.jsp,當我們在瀏覽器中輸入http://127.0.0.1:8080/UserManageSys/test2.jsp時,一個request就產生了,也就是生命週期的開始。test1.jsp的request中,我們可以設定一些值,比如我在test1.jsp是這樣設定的:

<body>
    <h1>test1介面</h1>
    <%
        request.setAttribute("name", "jingchenyong");
     %>
     <a href="test2.jsp"></a>
  </body>

上面setAttribue是在request中設定值的。那麼問題來了,就像購物一樣,我們需要從test1.jsp介面跳轉訪問test2.jsp介面,是否test2.jsp介面中的request也儲存test1.jsp中的request值呢,那麼下面我們接著討論。一般來說有兩種處理方式實現跳轉,一種是response.sendRedirect,另一種是request.getRequestDispatcher("xxx.jsp").forward(request,response);

用第一種方法,那麼test1.jsp中的request不會傳遞到test2.jsp。

用第二種方法,request的生命週期將延續下去,當採用forward如果到達JSP頁面,那麼之前從第一個JSP頁面中傳送出來的request的訊息將仍然存在,新的頁面同樣能夠取得該request裡所包含的一些資訊,比如之前的JSP傳送request中所包含的引數資訊.事實上,它們是同一個request。

這裡注意一下:第二種方法中,如果在頁面中通過setAttribute()設定一個Object值到request中,那麼再另一個頁面中可以通過getAttribute()來獲得值,這裡值是Object型別的。

下面是test1.jsp和test2.jsp頁面的程式碼:

test1.jsp

<body>
    <h1>test1介面</h1>
    <%
        request.setAttribute("name", "jingchenyong");
        request.getRequestDispatcher("test2.jsp").forward(request,response);
     %>
     <a href="test2.jsp"></a>
</body>

 

test2.jsp

<body>
    <hr>test2介面</hr>
    <%
    String name=(String)request.getAttribute("name");
     %>
     <p>值為:<%=name %></p>
</body>

 

轉載部落格1

轉載部落格2