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