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

来源:互联网 发布:取消3.5mm耳机接口知乎 编辑:程序博客网 时间:2024/06/15 12:13
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.转发必须是在同一台服务器下完成;重定向可以在不同的服务器下完成

0 0
原创粉丝点击