用forward和sendRedirect转发时的区别

     forward和sendRedirect是用来转发页面的,或者说是跳转到别的页面时所采用的俩种方法。当servlet处理完一次请求时,对客户端做出的响应是让其跳转到某一页面,这时可以采用这俩种方法:

(1)forward

 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
         // TODO Auto-generated method stub
         RequestDispatcher rd=request.getRequestDispatcher("hello.jsp");  //创建一个转发器对象,转发到hello.jsp页面
         rd.forward(request,response);                                    //forward方式转发,并将request请求参数传过去
 }

这种方式的原理是:首先客户端向servlet发送一个请求,servlet收到请求后,将此请求转发到hello.jsp页面,然后由hello.jsp做出响应展现到客户端浏览器,即:

1、客户端只是向服务器发送了一次request请求。因此此时servlet和hello.jsp中的request是相同的一个,可以通过request内部对象传送数据,而不需要用到session会话。

2、在客户端的浏览器的地址栏中地址始终不变,始终都是发送一次请求时的地址。

3、使用这种内部转发时,转发地址只能是站内地址,即本工程内的网页。

(2)sendRedirect

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
         response.sendRedirect("hello.jsp");     //做出响应重定向为hello.jsp
}

这种方式的原理是:首先客户端向servlet发送了一个请求,servlet收到请求后,对客户端做出响应:我不能处理这个请求,你去请求hello.jsp吧,于是客户端向hello.jsp发送请求,然后由hello.jsp做出响应展现到客户端,即:

1、客户端向服务器发送了俩次request请求,此时servlet和hello.jsp中是俩个不同request请求对象,若这俩者之间需要传递数据只能采用作用域对象大于request的内部对象,即session、application。

2、在客户端的地址栏中地址是变化的,第一次是发送请求给servlet的地址,第二次是发送给hello.jsp的地址。

3、使用这种重定位方式转发时,地址可以是站外地址,即可以是本工程内的网页,也可以是网络上其他网页。

   简单来说这俩种转发方式的原理类似这样:

 1、老师提问小明起来回答问题,但小明不会,于是问了问同桌小白答案,然后告诉老师。

 2、老师提问小明起来回答问题,但小明不会,于是小明告诉老师:我不会,你问我同桌小白吧。于是老师提问了小白,小白将答案告诉老师。

原文地址:https://www.cnblogs.com/llsq/p/8313276.html