延迟后转发jsp页面

时间:2014-05-11 19:24:33

标签: java jsp forward

我需要输出一些延迟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?

1 个答案:

答案 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秒,就像前面的代码片段一样,但它很容易改变。

这些技术有点令人不悦,但仍然有效。

相关问题