JSP使用application对象实现网站简单计数

描述:JSP使用application对象实现网站简单计数

代码:注意web开发属于多线程操作,所以需要同步

<%@ page language="java" contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>JSP</title>
</head>
<body>
    <%
        // 加入同步方法确保能+1
        synchronized(application) {
            // 获取上一次计数,注意application返回的是Object类型所以需要转换
            String data = (String)application.getAttribute("count");
            if (data == null) {
                application.setAttribute("count", "1");     // 首次访问
            }
            else {
                int i = Integer.parseInt(data);             // 取出上一次数据
                i++;                                        // +1
                application.setAttribute("count", Integer.toString(i)); // 重新写入
            }
        }
    %>
    <%-- 使用EL进行输入,也可以使用application.getAttribute("count")输入 --%>
    <h2>您是第${count}位访客!</h2>
</body>
</html>

缺点:每刷新一次计数值就会+1,所以需要改进

改进:使用session对象的isNew方法判断是否是新用户,如果是则+1,否则则不加

<%@ page language="java" contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>JSP</title>
</head>
<body>
    <%
        // 加入session进行判断是否是新用户
        if (session.isNew()) {
            
            // 加入同步方法确保能+1
            synchronized(application) {
                // 获取上一次计数,注意application返回的是Object类型所以需要转换
                String data = (String)application.getAttribute("count");
                if (data == null) {
                    application.setAttribute("count", "1");     // 首次访问
                }
                else {
                    int i = Integer.parseInt(data);             // 取出上一次数据
                    i++;                                        // +1
                    application.setAttribute("count", Integer.toString(i)); // 重新写入
                }
            }
        }
    %>
    <%-- 使用EL进行输入,也可以使用application.getAttribute("count")输入 --%>
    <h2>您是第${count}位访客!</h2>
</body>
</html>
提示:还是有缺点,因为application对象重启服务器后就会消失,所以如果开发计数器则应该使用保存到文件的方式,当用户访问并且为新用户的时候就+1后再把数据写入文件,这样一来就算换了服务器也不影响之前的访客统计

最后改进:

<%@ page language="java" contentType="text/html" pageEncoding="UTF-8"%>

<%-- 导入包 --%>
<%@ page import="java.io.* "%>
<%@ page import="java.math.* "%>
<%@ page import="java.util.* "%>
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>JSP</title>
</head>
<body>
    <%-- 数据量很大则可以使用BigInteger --%>
    <%-- 定义全局count用于计数 --%>
    <%!
        BigInteger count = null;
    %>
    <%-- 定义全局方法 --%>
    <%!
        // 定义文件操作方法
        public BigInteger getCount(File file) {
            BigInteger count = null;
            
            // 对文件的操作会有异常,所以需要捕获
            try{
                if (file.exists()) {                          // 必须判断文件是否存在
                    Scanner scan = new Scanner(new FileInputStream(file));
                    // 文件中只有一个数据,所以只需要if而不需要while
                    if (scan.hasNext()) {
                        count = new BigInteger(scan.next());    // 取得数据
                    }
                    scan.close();                               // 关闭输入流
                }
                else{
                    count = new BigInteger("0");            // 新建
                    save(file, count);                      // 保存
                }
            }
            catch(Exception e){
                e.printStackTrace();
            }
            return count;                                       // 返回值
        }

        // 保存文件
        public void save(File file, BigInteger count) {
            try{
                PrintStream out = null;                         // 实例化打印流
                out = new PrintStream(new FileOutputStream(file));
                out.print(count);                             // 写入数据 
                out.close();                                    // 关闭打印流
            }
            catch(Exception e){
                e.printStackTrace();
            }
        }
    %>
    <%
        // 取得虚拟路径真实路径,在根目录下新建count.txt文件
        String path = this.getServletContext().getRealPath("/") + "count.txt";
        File file = new File(path);
        if (session.isNew()) {
            synchronized(this){
                count = getCount(file);                         // 获取值
                count = count.add(new BigInteger("1"));         // 计数值+1
                System.out.println(count);
                save(file, count);                               // 保存
            }
        }
    %>

    <%-- 要考虑count==null的情况 --%>
    <h2>您是第<%=(count==null)? 0 : count%>位访客!</h2>
</body>
</html>
总结:最后改进版可以适用于任何网站,无论数据多大
已标记关键词 清除标记
相关推荐
<p> <strong><span style="font-size:16px;color:#003399;">会用Python分析金融数据 or 金融行业会用Python</span></strong> </p> <p> <strong><span style="font-size:16px;color:#003399;">职场竞争力更高</span></strong> </p> <p> <br /> </p> <p> <img src="https://img-bss.csdnimg.cn/202012231042221925.png" alt="" /> </p> <p> <br /> </p> <p> <br /> </p> <p> <strong><span style="font-size:16px;color:#003399;">Python金融数据分析入门到实战</span></strong> </p> <p> <strong><span style="font-size:16px;color:#003399;">Get√金融行业数据分析必备技能</span></strong> </p> <p> <img src="https://img-bss.csdnimg.cn/202012231042438069.png" alt="" /> </p> <p> <br /> </p> <p> <br /> </p> <p> <strong><span style="font-size:16px;color:#003399;">以股票量化交易为应用场景</span></strong> </p> <p> <strong><span style="font-size:16px;color:#003399;">完成技术指标实现的全过程</span></strong> </p> <p> <br /> </p> <p> <span style="font-size:14px;">课程选取股票量化交易为应用场景,由股票数据的获取、技术指标的实现,逐步进阶到策略的设计</span><span style="font-size:14px;">和回测,由浅入深、由技术到思维地为同学们讲解Python金融数据分析在股票量化交易中的应用</span><span style="font-size:14px;">。</span> </p> <p> <br /> </p> <p> <span style="font-size:14px;"><br /> </span> </p> <p> <img src="https://img-bss.csdnimg.cn/202012231043183686.png" alt="" /> </p> <p> <br /> </p> <p> <br /> </p> <p> <strong><span style="font-size:16px;color:#003399;">以Python为编程语言</span></strong> </p> <p> <strong><span style="font-size:16px;color:#003399;">解锁3大主流数据分析工具</span></strong> </p> <p> <br /> </p> <p> <span style="font-size:14px;">Python做金融具有先天优势,课程提取了Python数据分析工具NumPy、Pandas及可视化工具</span><span style="font-size:14px;">Matplotlib的关键点详细讲解,帮助同学掌握数据分析的关键技能。</span> </p> <p> <img src="https://img-bss.csdnimg.cn/202012231043472858.png" alt="" /> </p> <p> <strong><span style="font-size:16px;color:#003399;"><br /> </span></strong> </p> <p> <strong><span style="font-size:16px;color:#003399;">2大购课福利</span></strong> </p> <p> <strong><span style="font-size:16px;color:#003399;"><br /> </span></strong> </p> <p> <img src="https://img-bss.csdnimg.cn/202012300628195864.png" alt="" /> </p>
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页