Session代表客戶的會(huì)話過(guò)程,客戶登錄時(shí),往Session中傳入一個(gè)對(duì)象,即可跟蹤客戶的會(huì)話。在Servlet中,傳入Session的對(duì)象假如是一個(gè)實(shí)現(xiàn)HttpSessionBindingListener接口的對(duì)象(方便起見(jiàn),此對(duì)象稱為監(jiān)聽(tīng)器),則在傳入的時(shí)候(即調(diào)用HttpSession對(duì)象的setAttribute方法的時(shí)候)和移去的時(shí)候(即調(diào)用HttpSession對(duì)象的removeAttribute方法的時(shí)候或Session Time out的時(shí)候)Session對(duì)象會(huì)自動(dòng)調(diào)用監(jiān)聽(tīng)器的valueBound和valueUnbound方法(這是HttpSessionBindingListener接口中的方法)。 由此可知,登錄日志也就不難實(shí)現(xiàn)了。 另外一個(gè)問(wèn)題是,如何統(tǒng)計(jì)在線人數(shù),這個(gè)問(wèn)題跟實(shí)現(xiàn)登錄日志稍微有點(diǎn)不同,統(tǒng)計(jì)在線人數(shù)(及其信息),就是統(tǒng)計(jì)現(xiàn)在有多少個(gè)Session實(shí)例存在,我們可以增加一個(gè)計(jì)數(shù)器(假如想存儲(chǔ)更多的信息,可以用一個(gè)對(duì)象來(lái)做計(jì)數(shù)器,隨后給出的實(shí)例中,簡(jiǎn)單起見(jiàn),用一個(gè)整數(shù)變量作為計(jì)數(shù)器),通過(guò)在valueBound方法中給計(jì)數(shù)器加1,valueUnbound方法中計(jì)數(shù)器減1,即可實(shí)現(xiàn)在線人數(shù)的統(tǒng)計(jì)。當(dāng)然,這里面要利用到ServletContext的全局特性。(有關(guān)ServletContext的敘述請(qǐng)參考Servlet規(guī)范),新建一個(gè)監(jiān)聽(tīng)器,并將其實(shí)例存入ServletContext的屬性中,以保證此監(jiān)聽(tīng)器實(shí)例的唯一性,當(dāng)客戶登錄時(shí),先判定ServletContext的這個(gè)屬性是否為空,假如不為空,證實(shí)已經(jīng)創(chuàng)建,直接將此屬性取出放入Session中,計(jì)數(shù)器加1;假如為空則創(chuàng)建一個(gè)新的監(jiān)聽(tīng)器,并存入ServletContext的屬性中。