请求转发是Web组件之间协作的一种方式,多个Web组件共享一个ServletResponse和ServletRequest对象。
1. 请求转发的实现
Servlet的请求转发是通过RequestDispatcher类来实现的,我们可以通过以下方式获取RequestDispatcher对象。
ServletContext context = this.getServletContext();
RequestDispatcher dispatcher = context.getRequestDispatcher("/test"); // 绝对路径
dispatcher.forward(request, response);
request.getRequestDispatcher("test"); // 相对路径
dispatcher.forward(request, response);
2. forward方法处理流程
当调用forward方法后,会先清空用于存放响应正文的数据缓冲区,也就是说你在源组件中,可能已经写了一些数据到缓冲区了(如下代码),这时你写的数据都会被清理掉。
PrintWriter out = response.getWriter();
out.println("hello");
ServletContext context = this.getServletContext();
RequestDispatcher dispatcher = context.getRequestDispatcher("/test"); // 绝对路径
dispatcher.forward(request, response);
这时你写的输出语句并不会输出到用户端,在调用forward方法时,直接被清理掉了。
3. 注意点
如果你尝试在forward方法前向客户提交响应结果,这样是会报IllegalStateException的。
response.flushBuffer(); //会报异常
out.close(); //会报异常