關於request和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>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章