第十七章 Servlet 點擊計數(shù)器

關(guān)于本篇文章

了解一些 servlet 概念,本編文章只進行一些文章格式修改凯旭,文章內(nèi)使用的圖片均來自 Runoob 網(wǎng)站

致謝

感謝 Runoob 提供的相關(guān)資料坯墨,官方資料地址Servlet 教程

網(wǎng)頁點擊計數(shù)器

很多時候属提,您可能有興趣知道網(wǎng)站的某個特定頁面上的總點擊量权逗。使用 Servlet 來計算這些點擊量是非常簡單的,因為一個 Servlet 的生命周期是由它運行所在的容器控制的冤议。

以下是實現(xiàn)一個簡單的基于 Servlet 生命周期的網(wǎng)頁點擊計數(shù)器需要采取的步驟:

  • 在 init() 方法中初始化一個全局變量斟薇。
  • 每次調(diào)用 doGet() 或 doPost() 方法時,都增加全局變量求类。
  • 如果需要奔垦,您可以使用一個數(shù)據(jù)庫表來存儲全局變量的值在 destroy() 中。在下次初始化 Servlet 時尸疆,該值可在 init() 方法內(nèi)被讀取椿猎。這一步是可選的。
  • 如果您只想對一個 session 會話計數(shù)一次頁面點擊寿弱,那么請使用 isNew() 方法來檢查該 session 會話是否已點擊過相同頁面犯眠。這一步是可選的。
  • 您可以通過顯示全局計數(shù)器的值症革,來在網(wǎng)站上展示頁面的總點擊量筐咧。這一步是可選的。

在這里噪矛,我們假設(shè) Web 容器將無法重新啟動量蕊。如果是重新啟動或 Servlet 被銷毀,計數(shù)器將被重置艇挨。

實例

本實例演示了如何實現(xiàn)一個簡單的網(wǎng)頁點擊計數(shù)器:

package com.runoob.test;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class PageHitCounter
 */
@WebServlet("/PageHitCounter")
public class PageHitCounter extends HttpServlet {
    private static final long serialVersionUID = 1L;
    private int hitCount; 
    
    public void init() 
    { 
        // 重置點擊計數(shù)器
        hitCount = 0;
    } 
    
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        response.setContentType("text/html;charset=UTF-8");
        // 增加 hitCount 
        hitCount++; 
        PrintWriter out = response.getWriter();
        String title = "總點擊量";
        String docType = "<!DOCTYPE html> \n";
        out.println(docType +
            "<html>\n" +
            "<head><title>" + title + "</title></head>\n" +
            "<body bgcolor=\"#f0f0f0\">\n" +
            "<h1 align=\"center\">" + title + "</h1>\n" +
            "<h2 align=\"center\">" + hitCount + "</h2>\n" +
            "</body></html>");
    }
    
    public void destroy() 
    { 
        // 這一步是可選的残炮,但是如果需要,您可以把 hitCount 的值寫入到數(shù)據(jù)庫
    } 

}

現(xiàn)在讓我們來編譯上面的 Servlet缩滨,并在 web.xml 文件中創(chuàng)建以下條目:

<?xml version="1.0" encoding="UTF-8"?>
<web-app>
  <servlet>
    <servlet-name>PageHitCounter</servlet-name>
    <servlet-class>com.runoob.test.PageHitCounter</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>PageHitCounter</servlet-name>
    <url-pattern>/TomcatTest/PageHitCounter</url-pattern>
  </servlet-mapping>
</web-app>

現(xiàn)在通過訪問 http://localhost:8080/TomcatTest/PageHitCounter 來調(diào)用這個 Servlet势就。這將會在每次頁面刷新時,把計數(shù)器的值增加 1脉漏,結(jié)果如下所示:

網(wǎng)站點擊計數(shù)器

很多時候苞冯,您可能有興趣知道整個網(wǎng)站的總點擊量。在 Servlet 中侧巨,這也是非常簡單的舅锄,我們可以使用過濾器做到這一點。

以下是實現(xiàn)一個簡單的基于過濾器生命周期的網(wǎng)站點擊計數(shù)器需要采取的步驟:

  • 在過濾器的 init() 方法中初始化一個全局變量司忱。
  • 每次調(diào)用 doFilter 方法時巧娱,都增加全局變量碉怔。
  • 如果需要烘贴,您可以在過濾器的 destroy() 中使用一個數(shù)據(jù)庫表來存儲全局變量的值禁添。在下次初始化過濾器時,該值可在 init() 方法內(nèi)被讀取, 這一步是可選的桨踪。

在這里老翘,我們假設(shè) Web 容器將無法重新啟動。如果是重新啟動或 Servlet 被銷毀锻离,點擊計數(shù)器將被重置铺峭。

實例

本實例演示了如何實現(xiàn)一個簡單的網(wǎng)站點擊計數(shù)器:

// 導入必需的 java 庫
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.*;

public class SiteHitCounter implements Filter{
    
  private int hitCount; 
               
  public void  init(FilterConfig config) 
                    throws ServletException{
     // 重置點擊計數(shù)器
     hitCount = 0;
  }

  public void  doFilter(ServletRequest request, 
              ServletResponse response,
              FilterChain chain) 
              throws java.io.IOException, ServletException {

      // 把計數(shù)器的值增加 1
      hitCount++;

      // 輸出計數(shù)器
      System.out.println("網(wǎng)站訪問統(tǒng)計:"+ hitCount );

      // 把請求傳回到過濾器鏈
      chain.doFilter(request,response);
  }
  public void destroy() 
  { 
      // 這一步是可選的,但是如果需要汽纠,您可以把 hitCount 的值寫入到數(shù)據(jù)庫
  } 
} 

現(xiàn)在讓我們來編譯上面的 Servlet卫键,并在 web.xml 文件中創(chuàng)建以下條目:

....
<filter>
   <filter-name>SiteHitCounter</filter-name>
   <filter-class>SiteHitCounter</filter-class>
</filter>

<filter-mapping>
   <filter-name>SiteHitCounter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>

....

現(xiàn)在訪問網(wǎng)站的任意頁面,比如 http://localhost:8080/虱朵。這將會在每次任意頁面被點擊時莉炉,把計數(shù)器的值增加 1,它會在日志中顯示以下消息:

網(wǎng)站訪問統(tǒng)計: 1
網(wǎng)站訪問統(tǒng)計: 2
網(wǎng)站訪問統(tǒng)計: 3
網(wǎng)站訪問統(tǒng)計: 4
網(wǎng)站訪問統(tǒng)計: 5
..................

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末碴犬,一起剝皮案震驚了整個濱河市絮宁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌服协,老刑警劉巖绍昂,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異偿荷,居然都是意外死亡窘游,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門跳纳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來忍饰,“玉大人,你說我怎么就攤上這事棒旗〈” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵铣揉,是天一觀的道長饶深。 經(jīng)常有香客問我,道長逛拱,這世上最難降的妖魔是什么敌厘? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮朽合,結(jié)果婚禮上俱两,老公的妹妹穿的比我還像新娘饱狂。我一直安慰自己,他們只是感情好宪彩,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布休讳。 她就那樣靜靜地躺著,像睡著了一般尿孔。 火紅的嫁衣襯著肌膚如雪俊柔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天活合,我揣著相機與錄音雏婶,去河邊找鬼。 笑死白指,一個胖子當著我的面吹牛留晚,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播告嘲,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼错维,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了状蜗?” 一聲冷哼從身側(cè)響起需五,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎轧坎,沒想到半個月后宏邮,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡缸血,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年蜜氨,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片捎泻。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡飒炎,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出笆豁,到底是詐尸還是另有隱情郎汪,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布闯狱,位于F島的核電站煞赢,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏哄孤。R本人自食惡果不足惜照筑,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧凝危,春花似錦波俄、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至趴生,卻和暖如春阀趴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背苍匆。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留棚菊,地道東北人浸踩。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像统求,于是被迫代替她去往敵國和親检碗。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 這部分主要是與Java Web和Web Service相關(guān)的面試題码邻。 96折剃、闡述Servlet和CGI的區(qū)別? 答...
    雜貨鋪老板閱讀 1,397評論 0 10
  • 1.內(nèi)存泄露 內(nèi)存泄漏兩種情況: 在堆中申請的空間沒有被釋放(虛擬機gc可以解決) 對象已不在使用,但仍然在內(nèi)存中...
    Aimerwhy閱讀 575評論 0 0
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,089評論 1 32
  • Based on Java? Servlet Specification v3.1 [TOC] Servlet和S...
    0x70e8閱讀 1,305評論 0 7
  • 我們總是活在慣性里面不自知。 比如己莺,一個被父母傷害過的姑娘奏甫,她成年以后就會在男朋友面前各種折騰,各種做作凌受,以此來證...
    心羽暖姐姐閱讀 296評論 4 6