servletcontext以下簡(jiǎn)寫(sc)每一個(gè)web工程對(duì)應(yīng)一個(gè),用sc定義的屬性是全局的信不,所有用戶共享的蛉腌。
比如想統(tǒng)計(jì)一個(gè)網(wǎng)站的流量(訪問(wèn)人數(shù))偿荷,為了不頻繁操作數(shù)據(jù)庫(kù)檐春,我們使用在本地硬盤上創(chuàng)建一個(gè)文件,里面用來(lái)記載訪問(wèn)人數(shù)肥惭,當(dāng)用戶合法盯仪,就創(chuàng)建File,隨后判斷該文件是否存在蜜葱,如果不存在全景,就往里面寫入初始數(shù)字0,如果存在該文件牵囤,那就先讀出文件里的字符串賦值給變量爸黄,隨后再將變量+1,最后再寫入文件(但是你有沒(méi)有想過(guò)這樣不停的在讀文件揭鳞,和需要操作數(shù)據(jù)庫(kù)是同樣一個(gè)理炕贵,而在計(jì)算機(jī)中,效率最快的是讀內(nèi)存野崇,隨后我會(huì)講第二種方法称开,也就是這篇文章的標(biāo)題),最后在需要用到用戶數(shù)量的頁(yè)面同樣需要先讀出文件里的字符串乓梨,然后再將變量給到合適的地方钥弯。
以上每當(dāng)用戶登錄成功需要不停讀文件,效率是不高的督禽。
現(xiàn)在講下sc.
每一個(gè)web項(xiàng)目都有該接口,在內(nèi)存儲(chǔ)存方式很像session,左邊key(String型)总处,右邊是Object類型狈惫,所以如果是數(shù)字一定要加上“”,比如你想用一個(gè)屬性表示訪問(wèn)人數(shù),先在servlet里重寫init方法胧谈,在init里先創(chuàng)建文件忆肾,如果存在就直接讀,this.getServletContext("visitor").toString,如果不存在,就可以直接用this.setServletContext(“visitor”,0+“”)菱肖,在需要顯示人數(shù)的地方用this.getServletContext("visitor").toString(),把Object類型轉(zhuǎn)成String客冈,就可以了。
當(dāng)服務(wù)器關(guān)閉時(shí)候執(zhí)行destroy,把當(dāng)前的servletContext對(duì)應(yīng)的visitor值寫入文件稳强,如此就完成了场仲。
當(dāng)點(diǎn)擊瀏覽器時(shí)不同的用戶登錄都會(huì)實(shí)現(xiàn)人數(shù)訪問(wèn)量的增加。重寫init的時(shí)候退疫,一定要記得調(diào)用父類的init方法渠缕,super.init(config);否則在service/doGet/doPost方法中使用getServletContext方法獲取servletContext對(duì)象時(shí)就會(huì)出現(xiàn)異常褒繁。
代碼有空貼亦鳞。