获取 RequestDispatcher

优质
小牛编辑
134浏览
2023-12-01

实现了 RequestDispatcher 接口的对象,可以从 ServletContext 中的下面方法得到:

  • getRequestDispatcher
  • getNamedDispatcher

getRequestDispatcher 方法需要一个 String 类型的参数描述在ServletContext 作用域内的路径。这个路径必须是相对于ServletContext 的根路径,或以’/’开头,或者为空。该方法根据这个路径使用 servlet 路径匹配规则(见第12章,请求映射到 servlet)来查找 servlet,把它包装成 RequestDispatcher 对象并返回。如果基于给定的路径没有找到相应的 servlet,那么返回这个路径内容提供的RequestDispatcher。

getNamedDispatcher 方法使用一个 ServletContext 知道的 servlet 名称作为参数。如果找到一个 servlet,则把它包装成RequestDispatcher 对象,并返回该对象。如果没有与给定名字相关的servlet,该方法必须返回 null。

为了让 RequestDispatcher 对象使用相对于当前请求路径的相对路径(不是相对于 ServletContext 根路径)获得一个 servlet,在ServletRequest 接口中提供了 getRequestDispatcher 方法。

此方法的行为与 ServletContext 中同名的方法相似。Servlet 容器根据request 对象中的信息把给定的相对路径转换成当前 servlet 的完整路径。例如,在以’/’作为上下文根路径和请求路径 /garden/tools.html中,通过 ServletRequest.getRequestDispatcher("header.html") 获得的请求调度器和通过调用 ServletContext.getRequestDispatcher("/garden/header.html") 获得的完全一样。

请求调度器路径中的查询字符串

ServletContext 和 ServletRequest 中创建 RequestDispatcher 对象的方法使用的路径信息中允许附加可选的查询字符串信息。比如,开发人员可以通过下面的代码来获得一个 RequestDispatcher:

String path = “/raisins.jsp?orderno=5”;
RequestDispatcher rd = context.getRequestDispatcher(path);
rd.include(request, response);

查询字符串中指定的用来创建 RequestDispatcher 的参数优先于传递给它包含的 servlet 中的其他同名参数。与 RequestDispatcher 相关的参数作用域仅适用于包含(include)或转发(forward)调用期间。