从零开始学Java Web开发
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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对象中读取并显示在页面上,这是为了防止多个用户之间相互干扰。这样刷新页面计数器的值就不会发生变化了。