Servlet-点击计数器

Servlet-点击计数器

  • 访问网页计数器
  • 访问网站计数器

访问网页计数器

很多时候,我们会看到网站特定页面上的总点击数。使用Servlet计算这些点击非常简单,因为Servlet的生命周期由运行它的容器控制。

以下是实现基于Servlet生命周期的简单页面命中计数器所要采取的步骤:

  • 在init()方法中初始化全局变量。
  • 每次调用doGet()或doPost()方法时都要增加全局变量。
  • 如果需要,可以使用数据库表将全局变量的值存储在destroy()方法中。下次初始化servlet时,可以在init()方法中读取此值。此步骤是可选的。
  • 如果只想计算会话中唯一身份网页的点击次数,则可以使用isNew()方法来检查该会话中是否已单击同一页面。此步骤是可选的。
  • 可以显示全局计数器的值以显示网站上的总点击数。此步骤也是可选的。

在这里,我假设Web容器将不会重新启动。如果重新启动或servlet销毁,则将重置命中计数器。

这个例子展示了如何实现一个简单的页面点击计数器:

package servlet;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class PageHitCounter extends HttpServlet {

   private int hitCount; 

   public void init() { 
      //重置点击计数器
      hitCount = 0;
   } 

   //用的是doGet
   public void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {

	  response.setHeader("contentType","text/html;charset=UTF-8");
      response.setContentType("text/html");
      response.setCharacterEncoding("UTF-8");

      //每当点击servlet时,此方法就会执行 
      //增加hitCount
      hitCount++; 
      PrintWriter out = response.getWriter();
      String title = "总点击数";
      String docType = " + "transitional//en\">\n";
      
      out.println(docType +
         "\n" +
            ""</span> <span class="token operator">+</span> title <span class="token operator">+</span> <span class="token string">"\n" +
            "\n" +
               "

" + title + ":

\n"
+ "

" + hitCount + "

\n"
+ "\n" + "" ); } public void destroy() { //这是可选步骤,但是如果您愿意,可以在数据库中写入hitCount值。 } }

现在让我们在servlet上方进行编译,并在web.xml中创建以下条目

<servlet>
   <servlet-name>PageHitCounterservlet-name>
   <servlet-class>servlet.PageHitCounterservlet-class>
servlet>

<servlet-mapping>
   <servlet-name>PageHitCounterservlet-name>
   <url-pattern>/PageHitCounterurl-pattern>
servlet-mapping>
....

现在,在eclipse上启动tomcat,执行这个servlet。每次刷新此页面时,计数器将增加一,并显示以下结果:
Servlet-点击计数器_第1张图片

访问网站计数器

很多时候,我们可以看到整个网站上的总点击次数。这在Servlet中也非常简单,我们可以使用过滤器来实现。

以下是实现基于过滤器生命周期的简单网站点击计数器所要采取的步骤:

  • 在过滤器的init()方法中初始化全局变量。
  • 每次调用doFilter方法时增加全局变量。
  • 如果需要,可以使用数据库表将全局变量的值存储在filter的destroy()方法中。下次初始化过滤器时,可以在init()方法中读取此值。此步骤是可选的。

在这里,我假设Web容器将不会重新启动。如果重新启动或servlet销毁,则将重置命中计数器。

这个例子展示了如何实现一个简单的网站点击计数器:

package servlet;

import javax.servlet.*;

public class SiteHitCounter implements Filter {

   private int hitCount; 

   public void  init(FilterConfig config) throws ServletException {
      //初始化
      hitCount = 0;
   }

   //用的是拦截器
   public void  doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
      throws java.io.IOException, ServletException {

      //加一
      hitCount++;

      //打印出点击数
      System.out.println("总点击数 :"+ hitCount );

      //将请求传递回过滤链
      chain.doFilter(request,response);
   }
   
   public void destroy() { 
      // 这是可选步骤,但是如果您愿意,可以在数据库中写入hitCount值。
   } 
} 

现在让我们编译上面的servlet并在web.xml中创建以下条目

....
<filter>
   <filter-name>SiteHitCounterfilter-name>
   <filter-class>servlet.SiteHitCounterfilter-class>
filter>

<filter-mapping>
   <filter-name>SiteHitCounterfilter-name>
   <url-pattern>/*url-pattern>
filter-mapping>
....

现在调用任何URL,只要是这个filter所在的项目即可,我把它放在jspStudy的项目下,例如点击http://localhost:8080/jspStudy。每当这个项目下的任何页面被点击时,这将使计数器增加一,并且它将在日志中显示以下消息:
Servlet-点击计数器_第2张图片
上一篇:Servlet-页面重定向和请求转发的区别
下一篇:Servlet-注释

你可能感兴趣的:(JAVAweb基础,#,servlet,servlet)