请求转发
实现资源的跳转。
代码:
request.getRequestDispatcher("/servlet/RequestDemo").forward(request, response);
①一次请求对应一次响应,request对象是同一个。
②地址栏地址不会发生变化。
③请求转发是服务器内部的并且是同一个WEB应用内部的资源跳转;不能是在不同应用和不同服务器中的资源跳转。
④在同一个Servlet中转发不能进行多次!!(A既转发B, 又转发给C),但是可以进行多重转发(比如A转发给B, B再转发给C)。
request开发细节:
①在转发之前, 如果response缓冲区被写入了数据但是还没有打给浏览器, 在转发时response缓冲区(数据)将会被清空。
例如:A转发给B,在A中添加代码response.getWriter().write("hi!");
会发现浏览器中并未得到"hi!"这段字符串的响应。
②在转发之前, 如果response缓冲区被写入了数据并且已经打给了浏览器, 转发将会失败!
例如:A转发给B,在A中添加代码
response.getWriter().write("hi!");
response.flushBuffer();
会发现浏览器可以显示"hi!",因为强制刷新了。但是转发就会报错,因为已经响应过了,一次请求对应一次响应。
重定向
可以通过302状态码加上location响应头实现请求重定向。
代码:
response.setStatus(302);
response.setHeader(“location”, “/web/index.jsp”);
上面两行代码等价于下面这一行<===>
response.sendRedirect(“/web/index.jsp”);
①两次请求,两次响应,request对象不是同一个。
②地址栏地址会发生变化。
③既可以实现在同一个WEB应用内部资源之间进行跳转,也可以在不同的WEB应用和不同服务器资源之间进行跳转。
④由于是两次请求,两次响应,无法通过request对象共享数据。
定时刷新
与重定向类似,不同之处就是可以指定几秒之后跳转。
可以通过refresh头实现在多少秒之后跳转指定的资源.
代码:
response.setHeader(“refresh”, “3;url=/web/index.jsp”);
①两次请求,两次响应,request对象不是同一个。
②地址栏地址会发生变化。
③既可以实现在同一个WEB应用内部资源之间进行跳转,也可以在不同的WEB应用和不同服务器资源之间进行跳转。
④和重定向不同的是,定时刷新可以在刷新到新的地址之间设置一个时间,在间隔的这段时间内可以输出文本到浏览器并维系一段时间。
转发和重定向区别总结
转发在服务器端完成的;重定向是在客户端完成的
转发的速度快;重定向速度慢
转发的是同一次请求;重定向是两次不同请求
转发地址栏没有变化;重定向地址栏有变化
选择资源跳转的方式
如果是同一服务器中的同一应用内部的资源跳转:
①如果在跳转时,需要通过request对象带数据到目的地,只能用请求转发。
②如果在跳转时,希望地址栏地址不要发生变化,只能用请求转发。
③如果在跳转时,希望地址栏地址发生变化,只能使用重定向或定时刷新。
④如果没有什么具体需要,三种方式都可以,最好使用请求转发,可以减少访问服务器的次数,降低服务器的压力。
如果是不同服务器或不同WEB应用内部的资源跳转, 只能用重定向或者定时刷新:
由于重定向是立即跳转,而定时刷新是在多少秒之后再进行跳转。并且可以在跳转之前的时间里输出文本数据到浏览器并维系一段时间。
如果跳转时,需要指定多少秒或者是需要在跳转之前发送数据到浏览器,只能使用定时刷新,否则两种方式都可以。