Java实现UV PV

简介

在Web开发中,我们经常需要统计网站的访问量和独立访客数。其中,PV(Page View)即页面浏览量,是指用户浏览网站的页面总次数;而UV(Unique Visitor)即独立访客数,是指一段时间内访问网站的不同用户数量。

本文将介绍如何使用Java实现统计网站的UV和PV,并提供相应的代码示例。我们将通过使用Servlet和数据库来实现这一功能。

实现步骤

步骤一:创建数据库表

首先,我们需要创建一个用于存储访问记录的数据库表。表的结构如下:

CREATE TABLE `access_logs` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `ip` VARCHAR(255) NOT NULL,
  `visit_time` DATETIME NOT NULL,
  PRIMARY KEY (`id`)
);

这个表包含了三个字段:id(访问记录ID)、ip(访问者IP地址)和visit_time(访问时间)。

步骤二:编写Servlet

接下来,我们将使用Servlet来处理用户的访问请求,并将访问记录保存到数据库。首先,我们需要创建一个名为AccessLogServlet的类,继承自HttpServlet。

@WebServlet("/access")
public class AccessLogServlet extends HttpServlet {
  
  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // 获取访问者的IP地址
    String ip = request.getRemoteAddr();
    
    // 将访问记录保存到数据库
    saveAccessLog(ip);
    
    // 返回响应给用户
    response.getWriter().println("Access recorded.");
  }
  
  private void saveAccessLog(String ip) {
    // 创建数据库连接
    try (Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "password")) {
      // 插入访问记录
      String sql = "INSERT INTO access_logs (ip, visit_time) VALUES (?, ?)";
      try (PreparedStatement stmt = conn.prepareStatement(sql)) {
        stmt.setString(1, ip);
        stmt.setTimestamp(2, new Timestamp(System.currentTimeMillis()));
        stmt.executeUpdate();
      }
    } catch (SQLException e) {
      // 处理数据库错误
      e.printStackTrace();
    }
  }
}

在doGet方法中,我们首先通过HttpServletRequest对象的getRemoteAddr方法获取访问者的IP地址。然后,调用saveAccessLog方法将访问记录保存到数据库。

saveAccessLog方法使用JDBC来操作数据库。我们首先获取一个数据库连接,然后使用PreparedStatement对象执行SQL语句来插入访问记录。

步骤三:统计UV和PV

为了统计UV和PV,我们需要编写一个名为AccessStatsServlet的类,继承自HttpServlet。这个Servlet将查询数据库并返回相应的统计结果。

@WebServlet("/access/stats")
public class AccessStatsServlet extends HttpServlet {
  
  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // 查询数据库获取UV和PV
    int uv = getUniqueVisitors();
    int pv = getPageViews();
    
    // 返回统计结果给用户
    response.setContentType("text/html");
    response.getWriter().println("UV: " + uv);
    response.getWriter().println("PV: " + pv);
  }
  
  private int getUniqueVisitors() {
    // 创建数据库连接
    try (Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "password")) {
      // 查询UV
      String sql = "SELECT COUNT(DISTINCT ip) FROM access_logs";
      try (PreparedStatement stmt = conn.prepareStatement(sql)) {
        try (ResultSet rs = stmt.executeQuery()) {
          if (rs.next()) {
            return rs.getInt(1);
          }
        }
      }
    } catch (SQLException e) {
      // 处理数据库错误
      e.printStackTrace();
    }
    
    return 0;
  }
  
  private int getPageViews() {
    // 创建数据库连接
    try (Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "password")) {
      // 查询PV
      String sql = "SELECT COUNT(*) FROM access_logs";
      try (PreparedStatement stmt = conn.prepareStatement(sql)) {
        try (ResultSet rs = stmt.executeQuery()) {
          if (rs.next()) {
            return rs.getInt(1);
          }
        }
      }
    } catch (SQLException e) {
      // 处理数据库错误
      e.printStackTrace();
    }
    
    return 0;
  }
}

在doGet方法中,我们通过调用getUniqueVisitors和getPageViews方法来查询UV和PV。