介绍
在这个项目中,你将学习如何使用 Java Servlet 和 JSP 构建一个简单的 IP 访客跟踪应用程序。该应用程序将跟踪访问网站的访客的 IP 地址以及每个 IP 地址的访问次数。
预览

🎯 任务
在这个项目中,你将学习:
- 如何实现
index.jsp文件以显示 IP 地址及其访问计数。 - 如何实现
MyListener类以在ServletContext中创建并存储ipVisitMap。 - 如何实现
MyFilter类以统计每个 IP 地址的访问次数并更新ipVisitMap。
🏆 成果
完成这个项目后,你将能够:
- 使用 Java Servlet 和 JSP 构建一个简单的 Web 应用程序。
- 使用
ServletContext存储和检索应用程序级别的数据。 - 使用
Filter拦截并处理传入的请求。 - 使用同步来确保对共享资源的线程安全访问。
实现 index.jsp 文件
在这一步中,你将学习如何实现 index.jsp 文件以显示 IP 地址及其访问计数。
打开位于
/home/labex/project/IpProject/src/main/webapp目录下的index.jsp文件。将以下代码添加到
index.jsp文件中:
<%@ page import="java.util.Map" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>IP 访客跟踪器</title>
</head>
<body>
<h1>IP 访客跟踪器</h1>
<table border="1">
<tr>
<th>IP 地址</th>
<th>访问计数</th>
</tr>
<%
Map<String, Integer> ipVisitMap = (Map<String, Integer>) getServletContext().getAttribute("ipVisitMap");
if (ipVisitMap!= null) {
for (String ip : ipVisitMap.keySet()) {
%>
<tr>
<td><%= ip %></td>
<td><%= ipVisitMap.get(ip) %></td>
</tr>
<%
}
}
%>
</table>
</body>
</html>
这段代码从 ServletContext 中获取 ipVisitMap,并在表格中显示 IP 地址及其访问计数。
实现 MyListener 类
在这一步中,你将学习如何实现 MyListener 类,以便在 ServletContext 中创建并存储 ipVisitMap。
打开位于
/home/labex/project/IpProject/src/main/java/org/labex/listener目录下的MyListener.java文件。将以下代码添加到
MyListener类中:
package org.labex.listener;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import java.util.HashMap;
import java.util.Map;
@WebListener
public class MyListener implements ServletContextListener {
public void contextInitialized(ServletContextEvent sce) {
ServletContext servletContext = sce.getServletContext();
Map<String, Integer> ipVisitMap = new HashMap<>();
servletContext.setAttribute("ipVisitMap", ipVisitMap);
}
public void contextDestroyed(ServletContextEvent sce) {
// 如有需要,进行清理代码
}
}
这段代码创建了一个名为 ipVisitMap 的新 HashMap,用于存储 IP 地址及其访问计数,然后将其设置为 ServletContext 的一个属性。
实现 MyFilter 类
在这一步中,你将学习如何实现 MyFilter 类,以统计每个 IP 地址的访问次数并更新 ipVisitMap。
打开位于
/home/labex/project/IpProject/src/main/java/org/labex/filter目录下的MyFilter.java文件。将以下代码添加到
MyFilter类中:
package org.labex.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.Map;
@WebFilter("/*")
public class MyFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
// 如有需要,进行初始化代码
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
String ipAddress = httpRequest.getRemoteAddr();
ServletContext servletContext = httpRequest.getServletContext();
Map<String, Integer> ipVisitMap = (Map<String, Integer>) servletContext.getAttribute("ipVisitMap");
synchronized (ipVisitMap) {
if (ipVisitMap.containsKey(ipAddress)) {
ipVisitMap.put(ipAddress, ipVisitMap.get(ipAddress) + 1);
} else {
ipVisitMap.put(ipAddress, 1);
}
}
chain.doFilter(request, response);
}
public void destroy() {
// 如有需要,进行清理代码
}
}
这段代码从 ServletContext 中获取 ipVisitMap,获取当前客户端的 IP 地址,然后相应地更新 ipVisitMap。synchronized 块确保对 ipVisitMap 的更新是线程安全的。
测试应用程序
打开一个终端,并导航到
/home/labex/project/IpProject目录。通过运行以下命令启动 Tomcat 服务器:
mvn tomcat7:run
打开一个网页浏览器,并导航到
http://127.0.0.1:8080。你应该会看到显示 IP 地址及其访问计数的 IP 访客跟踪器页面。多次刷新页面,以查看访问计数增加。

总结
恭喜!你已完成此项目。你可以在 LabEx 中练习更多实验以提升你的技能。



