有时候,我们可能需要统计Web站点上的一个特定页面的访问次数,考虑这样一个场景,你为了宣传一个产品,在某个门户网站花钱做了一个链接,你希望知道产品页面每天的访问量,借此了解广告的效果。要完成上述功能,可以使用ServletContext对象来保存访问的次数。我们知道一个Web应用程序只有一个ServletContext对象,而且该对象可以被Web应用程序中的所有Servlet所访问,因此使用ServletContext对象来保存一些需要在Web应用程序中共享的信息是再合适不过了。
要在ServletContext对象中保存共享信息,可以调用该对象的setAttribute()方法,要获取共享信息,可以调用该对象的getAttribute()方法。针对本例,我们可以调用setAttribute()方法将访问计数保存到上下文对象中,新增一次访问时,调用getAttribute()方法从上下文对象中取出访问计数加1,然后再调用setAttribute()方法保存回上下文对象中。这个实例的开发主要有下列步骤。
Step1:编写CounterServlet类
在%CATALINA_HOME%\webapps\ch12\src目录下新建CounterServlet.java,代码如例12-14所示。
例12-14 CounterServlet.java
package org.sunxin.ch12.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class CounterServlet extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ServletContext context = getServletContext(); Integer count = null; synchronized(context) { count = (Integer) context.getAttribute("counter"); if (null == count) { count = new Integer(1); } else { count = new Integer(count.intValue() + 1); } context.setAttribute("counter", count); } resp.setContentType("text/html;charset=gb2312"); PrintWriter out = resp.getWriter(); out.println("<html><head>"); out.println("<title>页面访问统计</title>"); out.println("</head><body>"); out.println("该页面已被访问了" + "<b>" + count + "</b>" + "次"); out.println("</body></html>"); out.close(); } }
在程序代码的第17行,调用getServletContext()方法(从GenericServlet类间接继承而来)得到Web应用程序的上下文对象。为了避免线程安全的问题,我们在第19行使用synchronized关键字对context对象进行同步。第21行,调用上下文对象的getAttribute()方法获取counter属性的值。第21~29行,判断count是否为null,如果为null,则将它的初始值设为1。当这个Servlet第一次被访问的时候,在上下文对象中还没有保存counter属性,所以获取该属性的值将返回null。如果count不为null,则将count加1。第30行,将count作为counter属性的值保存到ServletContext对象中。当下一次访问这个Servlet时,调用getAttribute()方法取出counter属性的值不为null,于是执行第28行的代码,将count加1,此时count为2,表明页面被访问了两次。
第39行,输出count,显示该页面的访问次数。
Step2:编译CounterServlet.java
打开命令提示符,进入%CATALINA_HOME%\webapps\ch12\src目录,然后执行:
javac -d ..\WEB-INF\classes CounterServlet.java
在WEB-INF\classes\org\sunxin\ch12\servlet目录中生成类文件CounterServlet.class。
Step3:部署CounterServlet
编辑WEB-INF目录下的web.xml文件,添加对本例中的Servlet的配置,如例12-15所示。
例12-15 web.xml
<web-app version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
...
<servlet>
<servlet-name>CounterServlet</servlet-name>
<servlet-class>
org.sunxin.ch12.servlet.CounterServlet </servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CounterServlet</servlet-name>
<url-pattern>/product.html</url-pattern>
</servlet-mapping>
新增加的内容以粗体显示,请读者注意,在Servlet映射中,我们为本例的Servlet指定的URL是/product.html,对用户来说,以为访问的是一个静态页面,利用部署描述符,可以向客户端屏蔽服务器端的实现细节。
Step4:访问CounterServlet
启动Tomcat服务器,打开IE浏览器,在地址栏中输入http://localhost:8080/ch12/product.html,你将看到如图12-17所示的页面。
刷新页面,你会看到访问的次数变为2。再打开一个浏览器,输入http://localhost: 8080/ch12/product.html,你会看到第二个浏览器中显示的访问次数是3。交替刷新两个浏览器中的页面,可以看到访问次数也在交替增长,说明利用ServletContext保存属性,可以在多个客户端之间共享属性。但要注意的是,不同的Web应用程序具有不同的Servlet上下文,所以在不同的Web应用程序之间不能利用ServletContext来共享属性。另外需要注意的是,访问次数在重启Tomcat服务器后,将重新从1开始,为了永久保存访问次数,可以将这个值保存到文件或数据库中。
相关推荐
页面访问量统计实例通过利用`ServletContext`的`setAttribute()`和`getAttribute()`方法来实现对页面访问次数的记录与更新。当页面被首次访问时,会在`ServletContext`中设置一个名为"counter"的属性,其初始值为1;...
《基于Java+JSP的教师工作量统计系统》是一个典型的Web应用开发实例,它整合了Java后端技术和JSP前端技术,旨在实现高效、准确的教师工作量计算和管理。这个系统不仅对于学习Java和JSP的学生具有重要的实践价值,也...
【Java SSM+MySQL教师工作量统计系统】是一个基于Java技术栈和MySQL数据库开发的Web应用程序,主要用于管理和统计教育机构中教师的工作量。这个系统涵盖了软件工程中的前端、后端以及数据库设计等多个方面,是学习和...
网站访问量统计是衡量一个网站受欢迎程度...综上所述,网站访问量统计涉及了数据收集、处理、存储、展示等多个环节,需要结合后端技术(如Java Bean)、数据库操作、前端展示以及数据分析工具来实现全面而准确的统计。
这个系统利用JSP技术来构建动态网页,通过收集、处理和展示数据,提供关于网站用户行为、访问量、页面浏览情况等关键指标的详细报告。 ### 一、JSP基础 1. **JSP概述**:JSP是Java平台上的服务器端脚本语言,用于...
在Java开发中,分页是常见的功能,尤其是在处理大数据量时,为了提高用户体验,避免一次性加载所有数据导致页面响应慢。本实例集涵盖了多种分页实现方式,包括使用纯Java、JSP以及SSH(Struts1、Spring、Hibernate)...
Java源码下载 1个目标文件 摘要:Java源码,网络相关,HTTP Java实现HTTP连接与浏览,Java源码下载,输入html文件地址或网址,显示页面和HTML源文件,一步步的实现过程请下载本实例的Java源码,代码中包括丰富的...
Java 仓库管理系统是一个基于Java技术和JSP(Java Server Pages)的Web应用程序,结合了EasyUI框架来实现用户界面的交互。这个系统提供了完整的仓库管理功能,旨在帮助企业和组织高效地管理和追踪库存,确保业务流程...
本文将深入探讨如何使用Java实现一个日志分析的实例,以"AccessLogAdmin"为例,来理解其背后的原理和技术要点。 首先,"AccessLogAdmin"可能是一个用于处理HTTP访问日志的管理工具。HTTP访问日志通常记录了服务器...
##### 例 2: 统计网站访问量 **Example2_1.jsp** ```jsp ;charset=GB2312" %> <BODY BGCOLOR=cyan><FONT size=4> ! int i = 0; %> i++; %> 您是第 <%= i %> 个访问本站的客户。 ``` - **分析**:这段代码通过...
本案例中,"六祎"分享了使用Servlet实现访问量统计的方法。这个简单的实践可以帮助开发者了解如何利用ServletContext来记录和展示网站的访问量。 首先,让我们深入理解ServletContext的概念。ServletContext是...
每当收到新的事件,就进行实时统计,例如计算每分钟的页面访问量、用户活跃度等。 3. **结果存储与展示**:统计结果可实时写入数据库或内存缓存,再通过前端界面展示给用户。也可以使用其他流处理框架(如Spark ...
6.5.2 页面访问量统计实例 228 6.6 请求转发 231 6.6.1 requestdispatcher接口 232 6.6.2 得到requestdispatcher对象 232 6.6.3 请求转发的实例 233 6.6.4 sendredirect()和forward()方法的区别 238 6.7 小结 ...
6.5.2 页面访问量统计实例 228 6.6 请求转发 231 6.6.1 requestdispatcher接口 232 6.6.2 得到requestdispatcher对象 232 6.6.3 请求转发的实例 233 6.6.4 sendredirect()和forward()方法的区别 238 6.7 小结 ...
这个实例适用于已经掌握了一些基础的Java Web开发者,旨在通过实际操作来提升他们的技能,特别是对新闻发布、用户留言以及访问量统计等功能的实现。 JSP是Java平台上的动态网页技术,它允许开发人员在HTML代码中...
6.5.2 页面访问量统计实例 228 6.6 请求转发 231 6.6.1 requestdispatcher接口 232 6.6.2 得到requestdispatcher对象 232 6.6.3 请求转发的实例 233 6.6.4 sendredirect()和forward()方法的区别 238 6.7 小结 ...
本系统完全基于JSP(JavaServer Pages)技术,提供了一系列核心功能,包括网站计数器、用户停留时间统计、实时在线人数统计以及网站访问量统计。本文将深入探讨这些功能的实现原理及应用价值。 首先,网站计数器是...
6.5.2 页面访问量统计实例 228 6.6 请求转发 231 6.6.1 requestdispatcher接口 232 6.6.2 得到requestdispatcher对象 232 6.6.3 请求转发的实例 233 6.6.4 sendredirect()和forward()方法的区别 238 6.7 小结 ...