我需要输出一些延迟JSP的数据。我已经完成了下一步:
for (int i = 0; i < arr.length; i++) {
out.println(arr[i] + " ");
out.flush();
Thread.sleep(100 * i);
}
并且得到了预期的结果(数据输出有延迟)。然后,我尝试使用这种方法转发到另一个JSP:
<% out.println("Hello there.");
out.flush(); %>
<jsp:forward page="/another.jsp"></jsp:forward>
它对我没用(JSP没有被转发)。但是,以这种方式转发而不处理out.flush()工作正常。问题是什么?如何在显示当前数据之后转发到另一个JSP?
答案 0 :(得分:6)
我怀疑jsp:forward
无效,因为它尝试使用HTTP 3xx response,但flush()
会导致JSP发送隐式HTTP 200
,因此{{ 1}}没有被发送。
任何给定的HTTP请求 - 就像您为测试网页所做的那样 - 可以从服务器获得最多1个HTTP响应。必须在任何实际输出发生之前发送HTTP响应。 (因此,您不能发送3xx
后跟HTTP响应; HTTP响应必须先来。)当您调用"hello"
时,您强制JSP发送任何挂起的输出。由于当时没有发送头,JSP发送了一个隐式HTTP 200,然后发送了输出。
如果您想发送输出然后重定向,则需要使用浏览器端重定向。
您可以使用以下几种方法:
flush()
您可以将它放在页面的任何位置。它是一个JavaScript代码段,指示浏览器在固定延迟后转到新位置。它仅适用于启用了JavaScript的浏览器,但现在约占全世界的99.99%,因此不必过于担心。 :)
<script>
setTimeout(function() {
document.location = "/next/page/to/go/to.jsp";
}, 1000); // <-- this is the delay in milliseconds
</script>
来电意味着您在固定延迟后始终重定向。您可以轻松地使用AJAX调用或websocket事件(或其他100个事件)来触发重定向,假设您的应用程序愿意假设它们在目标浏览器中可用。
这可能是首选方法。
setTimeout
:<head>
这是一种较旧(但非常受支持)的技术,用于在固定延迟后强制网页刷新或重定向。这个片段使用1秒,就像前面的代码片段一样,但它很容易改变。
这些技术有点令人不悦,但仍然有效。