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