调用其他web资源

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异常。

相关推荐