JavaWeb_网站计数器

86 阅读2分钟

JavaWeb_网站计数器

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天,点击查看活动详情

  1. 实现效果

    每次登陆成功之后,浏览次数+1,退出重新登陆后,延续退出时的浏览次数

录制_2022_07_27_10_28_56_844.gif

  1. 思路

    用到的工具:数据库(写工具类调用数据库,退出系统时,存数据;登录系统时,写数据)、servletContext(this.getServletContext()方法)、destroy方法(重写servlet方法)、init方法(重写servlet方法)

  2. 代码

    a、读写数据库的工具类(准备)

    public class VisitedUtil {
        //读取访问次数
        public static int readVisited(){
            int res=0;
            Connection conn=null;
            PreparedStatement ps=null;
            ResultSet rs=null;
    
            try {
                conn=ConnUtil.getConnection();
                String sql="select * from tb_visited";
                ps=conn.prepareStatement(sql);
                rs = ps.executeQuery();
                if (rs.next()){
                    res=rs.getInt("visited");
                }
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                ConnUtil.close(rs,ps,conn);
            }
            return res;
        }
        //写入访问次数
        public static void writeVisited(int res){
            Connection conn=null;
            PreparedStatement ps=null;
            ResultSet rs=null;
    
            try {
                conn=ConnUtil.getConnection();
                String sql="update tb_visited set visited=?";
                ps=conn.prepareStatement(sql);
                ps.setInt(1,res);
                ps.executeUpdate();
    
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                ConnUtil.close(null,ps,conn);
            }
        }
    }
    
    

    b、在某个继承Servlet的类中重写destroy和init方法(准备工作)

     @Override
        public void destroy() {
            //从全局变量中,将最后的累加次数通过调用下面的方法,持久化到数据库中
            ServletContext application = getServletContext();
            int totalTimes = Integer.parseInt(application.getAttribute("totalTimes").toString());
            VisitedUtil.writeVisited(totalTimes);
        }
    
        //初始化的方法,由第一个访问的用户来创建,只被调用一次
    //从数据库的visited表中读取访问次数,保存在内存,ServletContext域中
        @Override
        public void init() throws ServletException {
            int lasttimes = VisitedUtil.readVisited();
            //次数存放到一个全局变量中,这样每个线程客户端都可以访问这个全局变量,才能有机会改写这个次数
            //域对象
            //1.HttpServletRequest,数据传递范围一次请求有效,只要是请求转发
            //2. HttpSession,数据作用范围,一次会话有效
            //3. ServletContext:数据作用范围:整个应用范围都可以共享域里面的数据
            ServletContext application = getServletContext();
            application.setAttribute("totalTimes", lasttimes);
        }
    

    c、网站计数器代码核心代码

    (注:要写在登陆成功之后,否则一刷新浏览次数+1,不符合逻辑)

     ServletContext application = getServletContext();
    //注意这里先转成字符串,再转成整型,有set才有get,否则get意义
            int totalTimes = Integer.parseInt(application.getAttribute("totalTimes").toString());
    //登陆成功自加
    totalTimes++;
    //存到apllication域
    application.setAttribute("totalTimes",totalTimes)
    
    

    d、jsp前端代码

    <h1>访问次数<%=application.getAttribute("totoalTimes")%><h1>