当构建一个web应用程序时,对于处理一个跳转到另一个servlet的请求,或者包含响应中另一个servlet的输出。RequestDispacher接口提供了实现这个的机制
当请求中进行异步处理时,AsyncContext允许用户分发请求回到servlet容器。
9.1 获取一个RequestDispacher
实现RequestDispacher接口的对象可能通过以下方法从ServletContext中重新获取。
- getRequestDispacher
- getNamedDispatcher
getRequestDispacher方法传递一个路径(ServletContext的范围内)的String参数。这个路径必须是相对于ServletContext的根目录并与‘/’开始,或者可能为空。这个方法使用路径查找一个servlet,使用第十二章中的servlet路径匹配规则,“请求映射到Servlets”,使用一个RequestDispacher对象封装,并返回结果对象。如果基于这个路径没有找到相对应的servlet,就提供一个返回这个路径的RequestDispacher。
getNamedDispatcher传递一个String的参数,指向一个Servlet的名字,其被ServletContext知道。如果发现了一个Servlet,其用RequestDispacher对象封装,并返回这个对象。如果没有与给定名字关联的对象,这个方法必须返回null。
为了允许RequestDispacher对象通过相对路径重新获取(相对于当前请求的路径,而不是相对于ServletContext的根目录),ServletRequest接口提供了getRequestDispacher方法。
这个方法的行为与ServletContext中相同命名的方法相似。Servlet容器使用请求对象的信息将所给的相对路径(相较于当前的servlet)转为一个完全的路径。例如,在根目录'/'的上下文和/garden/tools.html的请求中,借助ServletRequest.getRequestDispatcher("header.html")获取的请求分发器执行起来就像是ServletContext.getRequestDispatcher("/garden/header.html").。
9.1.1 请求分发路径中的查询字符创
ServletContext和ServletRequest方法,使用路径信息创建RequestDispacher对象,允许查询字符串信息路径的可选附件(the optional attachment of query string
information to the path.这句话不好翻译)。例如,可以通过以下代码获取一个RequestDispacher对象。
String path = “/raisins.jsp?orderno=5”;
RequestDispatcher rd = context.getRequestDispatcher(path);
rd.include(request, response);
用于创建RequestDispacher对象的查询字符串的指定参数,优先于传递给所包含servlet相同命名的其他参数。与一个RequestDispacher关联的参数范围仅局限于include或forward调用期间。
9.2 使用一个Request Dispacher
为使用一个请求分发器,一个servlet要不调用RequestDispacher接口的include方法或者forward方法。这些方法的参数可能是request参数和response参数,借助service
方法(来自javax.servlet接口)传递进来,或者请求和响应封装类的子类实例。在后面的情况中,封装实例必须封装请求或者响应对象,容器传递这些对象到那个service方法。
容器提供器必须确保请求分发到目标servlet,作为原始的请求在相同JVM的相同线程中运行。