IT兄弟连 JavaWeb教程 Servlet转发

  • 2019 年 10 月 5 日
  • 筆記

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/ITXDL123/article/details/90089715

Servlet对象由Servlet容器创建,并且Servlet对象的service()方法也由容器调用,一个Servlet对象可否直接调用另一个Servlet对象的service()方法呢?答案是否定的,因为一个Servlet对象无法获得另一个Servlet对象的引用。

Web应用在响应客户端的一个请求时,有可能响应过程很复杂,需要多个Web项目组件共同协作,才能生成响应结果。尽管一个Servlet对象无法直接调用另一个Servlet对象的service()方法,但Servlet规范为Web组件之间的协作提供了两种途径。

● 请求转发:Servlet(源组件)先对客户请求做一些预处理,然后把请求转发给其他Web组件(目标组件)来完成包含生成响应结果在内的后续操作。

● 包含:Servlet(源组件)把其他Web组件(目标组件)生成的响应结果包含到自身的响应结果中。

请求转发与包含具有以下共同特点:

源组件和目标组件处理的都是同一个客户请求,源组件和目标组件共享一个ServletRequest对象和ServletResponse对象。

目标组件都可以为Servlet、JSP或HTML文档。

都依赖javax.servlet.RequestDispatcher接口。

javax.servlet.RequsetDispatcher接口表示请求分发器,它有两个方法。

● forward()方法:把请求转发给目标组件,该方法的声明如下:

public void forward(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException

● include()方法:包含目标组件的响应结果,该方法的声明如下:

public void include(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException

当Servlet源组件调用RequestDispatcher和forward()或include()方法时,都要把当前的ServletRequest对象和ServletResponse对象作为参数传给forward()或include()方法。这使得源组件和目标组件共享同一个ServletRequest对象和ServletResponse对象。

Servlet可通过两种方式得到RequestDispatcher对象:

● 调用ServletContext的getRequestDispatcher(String path)方法,path参数指定目标组件的路径。

● 调用HttpServletRequest的getRequestDispathcer(String path)方法,path参数指定目标组件的路径。

以上两种方式的区别在于,前者的path参数必须为绝对路径,而后者的path参数既可以为绝对路径,也可以为相对路径。所谓绝对路径就是以"/"开头的路径,"/"表示当前Web应用的URL入口,所谓相对路径,就是指相对于当前源组件的路径,不以符号"/"开头。