您的位置:首页 > 编程语言 > PHP开发

同时调用getOutputStream()和getWriter()出现的问题以及请求转发和请求重定向的区别

2016-09-09 21:05 288 查看
package response;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//同时调用getOutputStream()和getWriter()会抛java.lang.IllegalStateException异常
public class ResponseDemo8 extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

//调用了getOutputStream()和getWriter()不能同时调用
response.getOutputStream();
response.getWriter();
//用转发也不能同时调用getOutputStream()和getWriter(),因为始终是同一个request和response
//重定向可以同时调用getOutputStream()和getWriter(),因为会产生两个request和response

}

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}

}


请求转发(Forward)和请求重定向(Redirect):

一个比喻:

小张向小李发送一次请求,想让他完成某项工作,当小李接受到请求时,发现自己完成不了,又请求小王帮忙,小王接收到小李请求之后最终完成了该项工作,并把最后的结果交给了小张。这个过程就是请求转发,在此期间,小张只发送了一次请求,他只知道把任务交给了小李,至于小李是如何完成的,小张并不知道,他只等待最终的结果。

重定向则不同,首先小张向小李发送请求,想让他完成某项工作,当小李接收到这个请求时,发现自己完成不了,他立即通知小张,并推荐小王可以完成任务,于是小张又联系小王,最终小王完成了该项任务。

区别:

1、浏览器地址栏显示不同(表面区别)

无论进行多少次请求,如果使用请求转发来实现,浏览器地址栏中只显示第一次发送请求的地址;如果使用重定向来实现,浏览器地址栏显示的是每次请求的新地址。这只是表面上看到的不同地方。

2、组件之间可否共享信息不同(本质区别)

从本质上讲,请求转发时,从发送第一次到最后一次请求的过程中,WEB容器只创建一次request和response对象,请求之间始终共享这两个对象,所以每个请求可以访问他之前请求中的参数和属性的值;而重定向时,浏览器每发送一次请求,WEB容器都会重新创建新的request和response对象,所以请求之间不能共享信息,即不能在请求中访问到他之前请求中的参数和属性的值。

3、实现方式不同

1. 请求转发的实现步骤:

说明将要转发的资源;
获取请求转发的对象;
调用请求转发对象中forward()方法


2. 重定向的实现步骤:

说明将要重定向的资源;
调用response对象中sendRedirect方法


请求转发时转发的过程只有WEB服务器知道,而浏览器不知道进行了多少次转发,以及都转发给哪些组件(servlet,JSP),它只是在等待WEB服务器最终的结果。而重定向时,每发送一次请求,WEB服务器都会通知浏览器的,所以重定向了几次请求以及每次都向哪个组件发送的请求,浏览器很清楚,当让WEB服务器也很明白。

【相同点】:

两者都可以进行多次请求的转发。

【总结】

转发和重定向的区别

1.转发在服务器端完成的;重定向是在客户端完成的

2.转发的速度快;重定向速度慢

3.转发的是同一次请求;重定向是两次不同请求

4.转发不会执行转发后的代码;重定向会执行重定向之后的代码

5.转发地址栏没有变化;重定向地址栏有变化

6.转发必须是在同一台服务器下完成;重定向可以在不同的服务器下完成
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  javaweb