比如:在網(wǎng)上書店應(yīng)用中,從一個客戶開始購物,到最后結(jié)賬,整個過程是一個Session.
Servlet API中定義了javax.servlet.http.HttpSession接口,Servlet容器必須實現(xiàn)這一接口。當(dāng)一個Session開始時,Servlet容器將創(chuàng)建一個HttpSession對象,在HttpSession對象中可以存放客戶狀態(tài)的信息。Servelt容器為HttpSession分配一個唯一標(biāo)識符,稱為Session ID.Servlet容器把Session ID作為Cookie保存在客戶的瀏覽器中。每次客戶發(fā)出HTTP請求時,Servlet容器可以從HttpRequest對象中讀取Session ID,然后根據(jù)SessionID找到相應(yīng)的HttpSession對象,從而獲取客戶的狀態(tài)信息。
HttpSession接口中的方法:
getId():返回Session的ID;
invalidate():使當(dāng)前的Session失效,Servlet容器會釋放HttpSession對象占用的資源。
setAttribute(String name,Object value):將一對name/Value屬性保存在HttpSession對象中
getAttribut(String name):根據(jù)name參數(shù)返回保存在HttpSession對象的屬性值。
getAttributeNames():以數(shù)組的方式HttpSession對象中所有的屬性名。
isNew():判斷是否是新創(chuàng)建的Session,如果是新創(chuàng)建的Session,返回true,否則返回false
setMaxInactiveInterval():設(shè)定一個Session可以處于不活動狀態(tài)的最大時間間隔,以秒為單位。如果超過這個時間。Session自動失效,如果設(shè)置為負(fù)數(shù),表示不限制Session付出與不活動狀態(tài)的時間。
getMaxInactiveInterval()讀取當(dāng)前Sessions可以處于不活動狀態(tài)的最大時間間隔。
在Java Servlet API中提出了跟蹤Session的另一種機制,如果客戶瀏覽器不支持Cookie,Servlet容器可以重寫客戶請求的URL,吧Session ID添加到URL信息中。
HttpServletResponse接口提供了重寫URL的方法:
public java.lang.String encodeURL(java.lang.String url)
該方法的實現(xiàn)機制為:
先判斷當(dāng)前的Web組件是否啟用Session,如果沒有啟用Session,例如在JSP中聲明
<%@ page session="false"%>或者已經(jīng)執(zhí)行了session.invalidate()方法,那么直接返回參數(shù)URL
再判斷客戶瀏覽器是否支持Cookie,如果支持Cookie,就直接返回參數(shù)URL;如果不支持,就在參數(shù)URL中加入Session ID信息,然后返回修改后的URL.
String username1 = ""; (username1 為自定義的字段,從數(shù)據(jù)庫中取出值后放到里面)
request.getSession().setAttribute("username",username1);
從request里得到session在把值傳進(jìn)去,不過這種方法可以將從數(shù)據(jù)庫里取得的數(shù)據(jù)用session顯示于頁面,但當(dāng)在頁面點擊按鈕產(chǎn)生別的action的時候,取出來顯示在頁面的數(shù)據(jù)就都沒了,原來是request的生命周期是一個請求,當(dāng)另外一個請求發(fā)生時,原來action中的request的值沒重置了,也就是說原來的數(shù)據(jù)都沒了,所以在頁面也不會顯示.這時候要將原來action中的request.getSession().setAttribute("username",username1);
改為HttpSession session = request.getSession(); session.setAttribute("username",username1);這時候傳到頁面的生命周期就是一個會話,即使你在頁面有別的請求,但session中的值依然存在.