官术网_书友最值得收藏!

5.6 application內置對象

JSP中的application內置對象主要是用來保存整個網站的共享信息。當服務器啟動后就將產生application對象,所有訪問該站點的客戶端對應的application對象都是同一個,即所有客戶端共享這個內置的application對象,該對象將隨著服務器的運行一直存在下去,直到服務器關閉,application對象才被銷毀。

application對象的主要方法如表5.6所示。

表5.6 application對象中常用方法

通過表5.6可以看到,application內置對象最常用的方法還是getAttribute()和setAttribute()方法,下面實例5-12就詳細介紹了如何使用application對象的這兩個方法來實現網站計數器的功能。

【實例5-12】網站計數器。

    01  <%@ page contentType="text/html; charset=GB2312" %>
    02  <HTML>
    03  <HEAD>
    04  <TITLE>application計數器</TITLE>
    05  </HEAD>
    06  <BODY>
    07  <BR>
    08  <%
    09       Integer number=(Integer)application.getAttribute("Count");//獲取application
中的Count對象
    10            if(number==null)                          //檢查Count屬性是否可取得
    11              { number=new Integer(1);                //設置初始值
    12                application.setAttribute("Count",number); //將計數值存儲到application中
    13              }
    14        else
    15              {
    16                   number=new Integer(number.intValue()+1); //將取得的值增加1
    17                application.setAttribute("Count",number);   //將計數值存儲到application中
    18              }
    19          %>
    20  <P><P>您是第
    21     <%int a=((Integer)application.getAttribute("Count")).intValue(); //顯示用戶是
第幾個訪問者
    22      %>
    23      <%=a%>
    24  個訪問本站的客戶。
    25  </BODY>
    26  </HTML>

【代碼說明】在該頁面的第9行中調用application對象的getAttribute()方法讀取application中存儲的計數器的值,如果讀取的值為null,則在第12行調用application對象的setAttribute()方法將計數器的初始值存儲到application中,如果讀取的值不為null,則在第16行將取得的值增加1后,將新的值存儲到application中,最后在第21行調用application對象的getAttribute()方法讀取application中存儲的計數器的值并顯示在頁面上。

【運行結果】該頁面第一次被請求的執行結果如圖5.25所示。

第一次執行結果是正確的,但是當再次刷新頁面時,將會看到網站的計數器的數值不斷地增加,這與實際情況應該是相悖的,因為是同一個用戶在刷新,網站的計數器的數值應該不發生變化。因為,單純使用application對象實現的計數器并不能完全符合實際的要求。這就需要使用session對象結合application對象共同來實現。

將實例5-12的代碼修改如下:

圖5.25 第一次訪問頁面顯示的內容

    01  <%@ page contentType="text/html;charset=GB2312" %>
    02  <HTML>
    03  <BODY>
    04      <%
    05      if(session.isNew()) //判斷用戶是否執行刷新操作
    06        {
    07           Integer number=(Integer)application.getAttribute("Count");
                                                           //讀取application對象中的值
    08            if(number==null)                         //檢查Count屬性是否可取得
    09              { number=new Integer(1);               //設置初始值
    10                application.setAttribute("Count",number);   //將計數值存儲到application中
    11              }
    12          else
    13              { number=new Integer(number.intValue()+1);    //將取得的值增加1
    14                application.setAttribute("Count",number);   //將計數值存儲到application中
    15              }
    16      Integer myNumber=(Integer)application.getAttribute("Count");
                                                           //再次讀取application對象中的值
    17      session.setAttribute("MyCount",myNumber);     //將獲取的值存儲到session對象中
    18        }
    19      %>
    20  <P><P>您是第
    21     <%int a=((Integer)session.getAttribute("MyCount")).intValue();
    22      %>
    23      <%=a%>
    24  個訪問本站的客戶。
    25  </BODY>
    26  </HTML>

【代碼說明】修改后的代碼與之前最大的不同就是引入了session對象,首先,在第5行使用session的isNew()方法來判斷該頁面是第一次被請求還是被刷新,如果第一次被請求,則在第13行執行計數器數值修改,如果是被刷新則直接顯示計數器的值。其次,在頁面中顯示當前計數器值之前,在第16~17行將存儲在application對象中的計數器值讀取出來存放到session對象中,然后在第21行中再從session對象中讀取并顯示在頁面上,這是為了防止多個用戶之間相互干擾。這樣刷新頁面計數器的值就不會發生變化了。

主站蜘蛛池模板: 丹巴县| 哈巴河县| 嵊泗县| 江西省| 大兴区| 荥经县| 余干县| 北碚区| 股票| 兰溪市| 伊宁县| 大埔区| 内丘县| 静安区| 井冈山市| 自治县| 连南| 金山区| 资兴市| 理塘县| 旬邑县| 临洮县| 陵水| 墨竹工卡县| 新昌县| 霍山县| 拜泉县| 沭阳县| 浦江县| 威宁| 九寨沟县| 谢通门县| 瑞昌市| 太仆寺旗| 穆棱市| 恩平市| 乐安县| 麻阳| 盖州市| 凤翔县| 舒兰市|