随笔都是学习笔记
随笔仅供参考,为避免笔记中可能出现的错误误导他人,请勿转载。

简介

需要服务JSP页面,这里需要用到JSP中的EL表达式,所以首先要导jstl的jar包:

下载:https://tomcat.apache.org/download-taglibs.cgi

下载前两个就行:

然后就是导入jar包,不会的参考:https://www.cnblogs.com/0099-ymsml/p/16062244.html

导入完成后进行代码的编写。

需要创建的类和文件:

AFilter:

package demoFilter;
import java.io.IOException;
import java.util.Map;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

/**
 * 从application中获取servletContext
 * 从request中获取IP
 * 统计次数保存在Map中
 * @author CDU_LM
 *
 */
public class AFilter implements Filter {
    private FilterConfig config;
    public void destroy() {
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        /**
         * 得到app中的map
         * 从request中获取当前客户端的IP地址
         * 查看map中是否存在这个IP对应的访问次数
         *         如果存在则次数加1并保存回去
         *         如果不存在则设置访问次数为1
         */ 
        // 从已经赋值的config中得到ServletContext对象app
        ServletContext app = this.config.getServletContext();
        // 取出ServletContext中保存的map集合
        Map<String,Integer> map = (Map<String, Integer>) app.getAttribute("map");
        // 获取客户端的IP地址
        String ip = request.getRemoteAddr();
        // 进行判断
        if(map.containsKey(ip)) {    // ip存在,访问次数加1再保存
            Integer count = map.get(ip);    // 通过ip查看对应ip的值
            map.put(ip, count+1);
        }else {    // ip不存在,是第一次访问,则直接赋值为1
            map.put(ip, 1);
        }
        // 最后将统计后的map保存到ServletContext对象app中
        app.setAttribute("map",map);
        
        System.out.println("AFilter......" + map.get(ip) + "  ip:" + ip + "    Host:" + request.getRemoteHost() + "   Port:" + request.getRemotePort());
        // 因为只是统计访问次数,不需要进行拦截,所以一定要放行
        chain.doFilter(request, response);     // 放行
    }
    
    // 从服务器启动就执行,最先执行
    public void init(FilterConfig fConfig) throws ServletException {
        this.config = fConfig;    // 将方法中的fConfig取出到定义的全局变量中
    }

}

AListener:

package demoListener;
import java.util.LinkedHashMap;
import java.util.Map;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

@WebListener
public class AListener implements ServletContextListener {

    
    /**
     * 在服务器启动时创建Map,保存到ServletContext中
     */
    public void contextInitialized(ServletContextEvent sce)  { 
        // 创建Map
        Map<String,Integer> map = new LinkedHashMap<String,Integer>();
        // 得到ServletContext
        ServletContext app = sce.getServletContext();
        // 把Map保存到ServletContext
        app.setAttribute("map",map); // 设置一个属性,名称为map,值为map集合
        System.out.println("Listener.....");
    }
    
}

这里不需要AServlet,所以下一个创建AJSP.jsp:

AJSP:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
<head>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>ip次数统计</title>
</head>
<body>
    <h1 align="center">There is a method for count the ip !!!</h1>
    map:${ applicationScope.map }
    <br />
    <br />
    <br />
    <br />
    <table align="center" width="60%" border="2">
        <tr>
            <th>ip</th>
            <th>count</th>
        </tr>
        <tr>
             <c:forEach items="${applicationScope.map}" var="entry">
                <td>${entry.key}</td>
                <td>${entry.value}</td>
            </c:forEach>
        </tr>
    </table>
</body>
</html>

然后是web.xml的配置:

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0">
  <display-name>day041302</display-name>
    <filter>
    <filter-name>AFilter</filter-name>
    <filter-class>demoFilter.AFilter</filter-class>
    </filter>
    <filter-mapping>
    <filter-name>AFilter</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

启动Tomcat:

从浏览器访问jsp文件:

查看控制台输出结果:

代码没有异常。

 

posted on 2022-04-14 10:38  时间完全不够用啊  阅读(202)  评论(0编辑  收藏  举报