ServletContext可以实现请求转发,request也可以。
在forward之前输入到response缓冲区中的数据,如果已经被发送到了客户端,forward将失败,抛出异常
在forward之前输入到response缓冲区中的数据,但是还没有发送到客户端,forward可以执行,但是缓冲区将被清空
,之前的数据丢失。注意丢失的只是请求体中的内容,头内容仍然有效。
在一个Servlet中进行多次forward也是不行的,因为第一次forward结束,response已经被提交了,没有机会再
forward了
总之,一条原则,一次请求只能有一次响应,响应提交走后,就再没有机会输出数据给浏览器了。
6.RequestDispatcher进行include操作
forward没有办法将多个servlet的输出组成一个输出,因此RequestDispatcher提供了include方法,可以将多个
Servlet的输出组成一个输出返回个浏览器
request.getRequestDispatcher("/servlet/Demo17Servlet").include(request, response);
response.getWriter().write("from Demo16");
request.getRequestDispatcher("/servlet/Demo18Servlet").include(request, response);
常用在页面的固定部分单独写入一个文件,在多个页面中include进来简化代码量。
请求重定向和请求转发的区别:
请求重定向地址栏会发生变化.请求转发地址栏不发生变化.
请求重定向两次请求两次响应.请求转发一次请求一次响应.
如果需要在资源跳转时利用request域传递域属性则必须使用请求转发
如果希望资源跳转后修改用户的地址栏则使用请求重定向
如果使用请求转发也可以重定向也可以,则优先使用请求转发,减少浏览器对服务器的访问次数减轻服务器的压力.
s