关于ServletContext转发请求。

scl1991 2015-06-22 09:01:51
public class sss extends HttpServlet {


public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
ServletContext context=this.getServletContext();
response.getOutputStream().write("哈哈".getBytes());

try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
context.getRequestDispatcher("/serv").forward(request, response);
}

}


访问页面后为什么”哈哈“没有打印在页面上?不应该死先打印在页面上,然后再访问另一个页面吗?
...全文
100 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
scl1991 2015-06-22
  • 打赏
  • 举报
回复
引用 2 楼 qwqwqw408 的回复:
你要搞清楚,并不是你往response里面写了东西,服务端就立即会发回客户端的。要么写入的数据超过了缓冲区,要么你手动flush。否则,数据并不会发送到客户端。而你在后面紧接着调用了forward,请看下面的说明: The Forward Method The forward method of the RequestDispatcher interface may be called by the calling servlet only when no output has been committed to the client. If output data exists in the response buffer that has not been committed, the content must be cleared before the target servlet’s service method is called. If the response has been committed, an IllegalStateException must be thrown. 也就是说forward会先清除已经写入buffer但是还没有真正发给客户端的数据,然后再转到相应的servlet处理,这段英文摘选自servlet3.0 spec。
哈哈 刚开始学servlet ,谢大神指点。
scl1991 2015-06-22
  • 打赏
  • 举报
回复
引用 2 楼 qwqwqw408 的回复:
你要搞清楚,并不是你往response里面写了东西,服务端就立即会发回客户端的。要么写入的数据超过了缓冲区,要么你手动flush。否则,数据并不会发送到客户端。而你在后面紧接着调用了forward,请看下面的说明: The Forward Method The forward method of the RequestDispatcher interface may be called by the calling servlet only when no output has been committed to the client. If output data exists in the response buffer that has not been committed, the content must be cleared before the target servlet’s service method is called. If the response has been committed, an IllegalStateException must be thrown. 也就是说forward会先清除已经写入buffer但是还没有真正发给客户端的数据,然后再转到相应的servlet处理,这段英文摘选自servlet3.0 spec。
果然如此,也就是说,在转发之前,Servlet是不能往页面强制刷数据的,否则报错,缓冲区有数据的话在转发之前会被强制情况。
qwqwqw408 2015-06-22
  • 打赏
  • 举报
回复
你要搞清楚,并不是你往response里面写了东西,服务端就立即会发回客户端的。要么写入的数据超过了缓冲区,要么你手动flush。否则,数据并不会发送到客户端。而你在后面紧接着调用了forward,请看下面的说明: The Forward Method The forward method of the RequestDispatcher interface may be called by the calling servlet only when no output has been committed to the client. If output data exists in the response buffer that has not been committed, the content must be cleared before the target servlet’s service method is called. If the response has been committed, an IllegalStateException must be thrown. 也就是说forward会先清除已经写入buffer但是还没有真正发给客户端的数据,然后再转到相应的servlet处理,这段英文摘选自servlet3.0 spec。
scl1991 2015-06-22
  • 打赏
  • 举报
回复
代码中是response.getOutputStream().write("哈哈".getBytes());

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧