Servlet的请求转发与重定向

在Servlet程序中 有时需要调用另外一个资源来对浏览器的请求进行响应,则可以通过两种方式来实现:
1,调用RequestDispatcher.forward方法来实现
2,调用HttpServletResponse.sendRedirect方法实现的请求重定向。

RequestDispatcher接口
  Servlet API中定义了一个RequestDispatcher接口,它定义了RequestDispatcher实例对象的方法。RequestDispatcher实例对象是由Servlet引擎创建的,它用于包装一个要被其他资源(Servlet ,jsp),并可以通过其中的方法将客户端的请求转发给所包含的资源。

Servlet可通过两种方式得到RequestDispatcher对象:
1,调用ServletContext的getRequestDispatcher(String path)方法,path参数指定目标组件的路径。
2,调用ServletRequest的getRequestDispatcher(String path)方法,path参数指定目标组件的路径。

RequestDispatcher接口包含两个方法,forward方法和include方法,forward将将请求转发到RequestDispatcher对象封装的资源,include方法将RequestDispatcher对象封装的资源作为当前响应内容的一部分包含进来。他们都有两个参数,即传递给当前Servlet的service方法的那两个ServletRequest和ServletResponse对象

include方法,要注意的是 被包含的Servlet程序不能改变响应消息的状态码和响应头,它里面设置状态码和响应头的语句将被忽略

在forward方法调用之前,如果Servlet程序中写入的部分内容已被传送到客户端,forward方法将抛出IllegalStateException. forward方法执行以后,写入到缓冲区的内容将被清空,后面的写入操作将被忽略。
forward方法的调用者和被调用者的状态码和响应头都不会被忽略。


forward() 与redirect()的区别
HttpServletResponse.sendRedirect方法实现请求重定向,RequestDispatcher.forward方法实现请求转发
     forward()仅是容器中控制权的转向,在客户端浏览器地址栏中不会显示出重定向后的地址;redirect()则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。forward()更加高效,在其可以满足需要时,尽量使用forward()方法,并且,这样也有助于隐藏实际的链接。在有些情况下,需要跳转到一个其它服务器上的资源,则用sendRedirect()方法。
sendRedirect()方法可以重定向到:当前应用程序中的其他资源,同一站点的其他应用程序中的资源,甚至其他站点的资源。

他们都能使浏览器获得另一个URL所指向的资源。
1.如果传递给HttpServletResponse.sendRedirect方法的相对Url以"/"开头,它是相对于整个web站点的根目录;
如果创建RequestDispatcher对象是指定的Url以”/“开头,他是相对于当前web应用程序的根目
2.HttpServletResponse.sendRedirect方法对浏览器的请求做出响应,响应的结果是让浏览器去重新发出对另外一个URL的访问请求。
RequestDispatcher.forward方法在服务器端内部将请求转发给另外一个资源,浏览器只显示响应结果,并不知道在服务器内部发生了转发行为。
3,RequestDispatcher.forward方法的调用者和被调用者之间共享相同的request对象和response对象,他们属于同一个访问请求和响应过程;HttpServletResponse.sendRedirect方法调用者和被调用者使用各自不同的request对象和response对象,他们属于两个独立的访问请求和响应过程。
4,这两个方法调用之前都不能有内容已经被输出到客户端,如果缓冲区已有了一些内容,将被清除。

猜你喜欢

转载自clown-chuchu.iteye.com/blog/1702050