当一个servlet无法单独完成客户端的请求时,这时就要用到多个servlet对请求信息进行处理。怎样从一个servlet跳转到里一个servlet中呢?
一共有两种方法进行处理:
一、重定向
使用HttpServletResponse接口提供的sendRedirect()方法用于生成302响应码和Location响应头,从而通知客户端去重新访问Location响应头中指定的URL。
其完整的定义语法如下:
public void sendRedirect(Stringlocation) throws IOException;
其中的location参数指定了重定向的URL,它可以使用绝对URL和相对URL,Servlet容器会自动将相对URL转换成绝对URL后,再生成location头字段。
例:response.sendRedirest("servlet2");跳转到servlet2中执行servlet2。
二、请求分派
使用的方法:
public void forward(ServletRequest request, ServletResponse response) throws ServletException,IOException;
public void include(ServletRequest request, ServletResponse response) throws ServletException,IOException;
forward和include的区别:
forward方法是把请求的内容转发到另外的一个servlet.而include是把另一个servlet处理过后的内容拿过来.
举例来说比如在servlet1打一句out.print("1111"),servlet2打上out.print("22222"),在servlet1中用forward命令会转到servlet2中,显示22222. 而在servlet1中使用include方法会依然在servlet1的页面中,但是在1111后打出22222。
获取RequestDispatcher实例的方式主要有两种:
调用ServletContext接口提供的getRequestDispatcher(String url)方法。
调用ServletRequest接口提供的getRequestDispatcher(String url)方法。
例:RequestDispatcher dispatcher=request.getRequestDispatcher("servlet2");//得到RequestDispatcher
dispatcher.forward(request,response);//将request和response传递到servlet2中
重定向和请求分派的比较:
1、HttpServletResponse的sendRedirect()方法实现的重定向和RequestDispatcher的forward()方法实现的请求转发的比较: 请求分派只能将请求转发给同一个Web应用中的其他组件;而重定向不仅可以定向到当前应用程序中的其他资源,也可以重定向到其他站点的资源上。 重定向的访问过程结束后,浏览器地址栏中显示的URL会发生改变,由初始的URL地址变成重定向的目标URL;而请求转发过程结束后,浏览器地址栏保持初始的URL地址不变。
2、请求分派的发起者和被调用者之间共享相同的request实例和response实例,它们属于同一个“请求/响应”过程;而重定向的发起者和被调用者使用各自的request实例和response实例,它们各自属于独立的“请求/响应”过程。