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、老师提问小明起来回答问题,但小明不会,于是小明告诉老师:我不会,你问我同桌小白吧。于是老师提问了小白,小白将答案告诉老师。