Servlet的应用(二)
重定向和请求分派
• 重定向
– HttpServletRequest接口提供的sendRedirect()方法用于生成302响应码和Location响应头,从而通知客户端去重新访问Location响应头中指定的URL,其完整的定义语法如下:
• public void sendRedirect(String location) throws IOException;
– 其中的location参数指定了重定向的URL,它可以使用绝对URL和相对URL,Servlet容器会自动将相对URL转换成绝对URL后,再生成location头字段。
• 请求分派
– Servlet API中定义了一个RequestDispatcher接口,俗称请求分派器。它定义了如下两个方法:
• public void forward(ServletRequest request, ServletResponse response)
• throws ServletException,IOException;
• public void include(ServletRequest request, ServletResponse response)
• throws ServletException,IOException;
– 获取RequestDispatcher实例的方式主要有两种:
• 调用ServletContext接口提供的getRequestDispatcher(String url)方法。
• 调用ServletRequest接口提供的getRequestDispatcher(String url)方法。
• RequestDispatcher接口的forward()方法用于将请求转发到RequestDispatcher实例封装的资源,由新的资源对客户端作出响应,它的原理可以用图4.16来表示。
• 同样使用“http://localhost:8080/jsp_04_servlet/servlet1?name=test”路径访问这个Servlet1,客户端浏览器将得到如图4.17所示的效果。
• 重定向和请求分派的比较
HttpServletResponse的sendRedirect()方法实现的重定向和RequestDispatcher的forward()方法实现的请求转发的比较:
– 请求分派只能将请求转发给同一个Web应用中的其他组件;而重定向不仅可以定向到当前应用程序中的其他资源,也可以重定向到其他站点的资源上。
– 重定向的访问过程结束后,浏览器地址栏中显示的URL会发生改变,由初始的URL地址变成重定向的目标URL;而请求转发过程结束后,浏览器地址栏保持初始的URL地址不变。
– 请求分派的发起者和被调用者之间共享相同的request实例和response实例,它们属于同一个“请求/响应”过程;而重定向的发起者和被调用者使用各自的request实例和response实例,它们各自属于独立的“请求/响应”过程。
–