Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果浏览器已停止,如何停止此JSP?_Java_Jsp_Browser - Fatal编程技术网

Java 如果浏览器已停止,如何停止此JSP?

Java 如果浏览器已停止,如何停止此JSP?,java,jsp,browser,Java,Jsp,Browser,我创建了一个JSP,它将创建潜在的无限量的输出 当我告诉浏览器停止时,浏览器停止了,但我的控制台告诉我JSP的servlet一直在运行 我想知道是否以及如何修改此代码,以便在浏览器停止接收数据时停止: <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1" errorPage="ExcessOutputErrorPage.jsp" %> &l

我创建了一个JSP,它将创建潜在的无限量的输出

当我告诉浏览器停止时,浏览器停止了,但我的控制台告诉我JSP的servlet一直在运行

我想知道是否以及如何修改此代码,以便在浏览器停止接收数据时停止:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"  errorPage="ExcessOutputErrorPage.jsp" %>
<%@ page import="de.svenjacobs.loremipsum.LoremIpsum" %>
<%@ page buffer="8kb" autoFlush="true" %>

<%! 
    private int dumpCount = 0;

    private String nextDump()
    {
        dumpCount++;

        String dumpHeader = "Dumping " + dumpCount + " paragraphs"; 
        String dump = "<h2>" + dumpHeader + "</h2>";
        LoremIpsum loremIpsum = new LoremIpsum();

        System.out.println(dumpHeader);

        for (int i=0; i<dumpCount; i++)
        {
            dump += "<p>" + loremIpsum.getParagraphs(1) + "</p>";
        }

        return dump;
    }
%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Large Amount of Text</title>
</head>
<body>
    <h1>Large Amount of Text</h1>
    <% 
        boolean doDump = true;
        while (doDump) 
        { 
            out.println(nextDump());
            out.flush();
        } 
    %>
</body>
</html>

大量文本
大量文本

如果您想从浏览器控制流程,您可能想看看AJAX。公开loremIpsum对象,并将AJAX代码回调到服务器,以便继续更新屏幕

现在,应用程序服务器上有一个全天运行的无限循环,多个请求可能会进入并严重降低服务器的速度


根据我所看到的您发布的代码,loremIpsum对象似乎不是特定于用户的,因此您应该可以安全地使用AJAX,以便将循环和大部分工作从服务器资源转移到JavaScript/AJAX中。

您最终应该会遇到“断管”类型的IOException。但是在servlet容器和前面的任何web服务器中都存在一些缓冲。我怀疑你除了调用
flush
(你已经在这么做了)还能做更多的事情。我让它运行了很长一段时间,但它没有停止。我还发现了一些有趣的事情:如果我再次访问页面,无论是同一个浏览器还是不同的浏览器,呈现的页面取决于servlet自最初启动以来的进度。发现了一些更有趣的事情。如果在第一个浏览器窗口保持打开状态的同时尝试浏览第二个浏览器窗口中的页面,则在关闭或停止第一个浏览器窗口之前,第二个浏览器窗口中不会呈现任何内容。如果两个浏览器正在等待,它将向一个浏览器发送一些内容,向另一个浏览器发送一些内容,但不会向两个浏览器发送任何内容。如果有三个浏览器在等待,它只会发送到一个浏览器。但如果有四个人在等待,三个人就会得到满足。如果有两个正在接收内容,则必须在另一个(或可能有两个)开始接收内容之前终止它们。播放代码以发现新页面无法从1段开始是由于在外部声明dumpCount导致的,并相应调整代码,新页面将从1段开始,但所有其他描述的问题仍然存在。这是一个有趣的想法,但循环实际上并不是无限的——我希望它在浏览器断开连接时停止。然而,情况似乎并非如此,我正试图找出如何阻止它。我想我可以在网页中加入一些JavaScript,告诉它在用户离开网页时给家里打电话,但这取决于浏览器是否启用了JavaScript。