共计 1181 个字符,预计需要花费 3 分钟才能阅读完成。
web 组件可以直接或间接的调用其他 web 资源。一个 web 组件通过内嵌返回客户端内容的另一个 web 资源的 url 来间接调用其他 web 资源。在执行时,一个 web 资源通过包含另一个资源的内容或者转发请求到另一个资源直接调用。调用运行 web 组件服务的一个有效的资源,必须首先通过 getRequestDispatcher 方法获得一个 RequestDispatcher 对象。你可以从 web 上下文或者一个请求对象中获取 RequestDispatcher 对象;需要注意的是,这两个方法有一些不同的行为。该方法将所请求的路径作为一个参数;请求可能使用相对路径(),但 web 上下文必须是一个绝对路径。如果资源是无效的,或者服务容器没有为该类型的资源实现 RequestDispatcher 对象,getRequestDispatcher 将返回 null。您的 servlet 应该准备好处理这种情况。
在响应中包含其他资源
导入其他 web 资源是经常使用的,例如广告内容或者版权信息,包含在一个 web 资源返回的响应中。导入其他 web 资源,调用 RequestDispatcher 对象的 include 方法:
include(request, response);
如果资源是静态的,include 方法启用了程序化的服务端关联。如果资源是一个 web 组件,这个方法的作用是发送请求到要包含的 web 组件,执行这个 web 组件,然后将 include 包含的 servlet 响应执行的结果。被包含的组件可以访问请求对象,但它对响应的处理是受限的。
它可以写入响应体,并且提交响应
它不能设置响应头或者调用任何方法,比如设置 cookie,等影响请求头的操作
将控制器转移到另一个 web 资源
在某些应用程序中,你可能相对某些 web 资源做请求的预处理,有另一个组件生成响应。例如,你可能想去部分的处理一个请求,然后根据请求的性质调用另一个 web 组件。为了控制转发到另一个 web 资源,你需要调用 RequestDispatcher 对象的 forward 方法。当一个请求被转发,请求的 url 会被设置为转发页面的路径。原始 URL 和他的构成部分被设置到下面的属性中:
javax.servlet.forward.request_uri
javax.servlet.forward.context_path
javax.servlet.forward.servlet_path
javax.servlet.forward.path_info
javax.servlet.forward.query_string
应该使用 forward 方法为回复用户提供另一个资源责任。如果你已经在 servlet 内部响应一个 ServletOutputStream 对象或者 PrintWriter 对象,你不能使用这个方法; 做这个操作,将抛出 IllegalStateException 异常。