当web程序启动后,放入application作用域中一个Map<StringInteger>集合 这个Map集合key是访问者的IP(IP地址可以从request里去获取),如果是第一次访问,则把值设置成1, 如果是第二次访问服务器(xxxdo),把值设置成2 写一个展示页面,可以显示这个Map集合的数据(EL表达式,forEarch进行循环展示),每三秒刷新一次
时间: 2024-03-18 15:38:42 浏览: 18
好的,这是一个比较典型的Web应用程序的需求,需要对访问者的IP地址进行计数,并将其保存在一个Map集合中,然后展示在页面中。以下是一个简单的实现方式:
1.编写一个Filter,用于对访问者的IP地址进行计数,并将其保存在Map集合中:
```java
public class IPCountFilter implements Filter {
private Map<String, Integer> ipCountMap = new ConcurrentHashMap<>();
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
String ip = request.getRemoteAddr();
Integer count = ipCountMap.get(ip);
if (count == null) {
count = 1;
} else {
count++;
}
ipCountMap.put(ip, count);
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
}
}
```
2.将上面的Filter配置到web.xml中:
```xml
<filter>
<filter-name>IPCountFilter</filter-name>
<filter-class>com.example.IPCountFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>IPCountFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
```
3.编写一个Servlet,用于展示Map集合中的数据:
```java
public class IPCountServlet extends HttpServlet {
private Map<String, Integer> ipCountMap;
@Override
public void init() throws ServletException {
ipCountMap = (Map<String, Integer>) getServletContext().getAttribute("ipCountMap");
if (ipCountMap == null) {
ipCountMap = new ConcurrentHashMap<>();
getServletContext().setAttribute("ipCountMap", ipCountMap);
}
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=UTF-8");
PrintWriter out = resp.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>IPCount</title>");
out.println("<meta http-equiv=\"refresh\" content=\"3\">");
out.println("</head>");
out.println("<body>");
out.println("<table>");
out.println("<tr>");
out.println("<th>IP地址</th>");
out.println("<th>访问次数</th>");
out.println("</tr>");
for (Map.Entry<String, Integer> entry : ipCountMap.entrySet()) {
out.println("<tr>");
out.println("<td>" + entry.getKey() + "</td>");
out.println("<td>" + entry.getValue() + "</td>");
out.println("</tr>");
}
out.println("</table>");
out.println("</body>");
out.println("</html>");
out.close();
}
}
```
4.将上面的Servlet配置到web.xml中:
```xml
<servlet>
<servlet-name>IPCountServlet</servlet-name>
<servlet-class>com.example.IPCountServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>IPCountServlet</servlet-name>
<url-pattern>/ipcount</url-pattern>
</servlet-mapping>
```
5.在页面中使用EL表达式和forEach循环展示Map集合中的数据:
```html
<table>
<tr>
<th>IP地址</th>
<th>访问次数</th>
</tr>
<c:forEach var="entry" items="${applicationScope.ipCountMap}">
<tr>
<td>${entry.key}</td>
<td>${entry.value}</td>
</tr>
</c:forEach>
</table>
```
以上就是一个简单的实现方式,每次访问都会将访问者的IP地址进行计数,然后在页面中展示Map集合中的数据,并且每隔三秒钟自动刷新页面。