天天看点

Servlet请求分发(第九篇)

文章目录

    • 9.1、获取一个RequestDispatcher
      • 9.1.1、在请求分发器路径查询字符串
    • 9.2、使用一个请求分发器
    • 9.3、包含方法
      • 9.3.1、 Included的请求参数
    • 9.4、转发方法
      • 9.4.1、查询字符串
      • 9.4.2、forward 请求参数
    • 9.5、 错误处理
    • 9.6、获取一个异步上下文信息
    • 9.7、分发方法
      • 9.7.1、查询字符串参数
      • 9.7.2、Dispatched请求参数

9.1、获取一个RequestDispatcher

  • 一个对象实现了RequestDispatcher 接口,这个对象可以通过ServletContext如下方法获得
    • getRequestDispatcher 如果能匹配就是转发到对应servlet处理,否则返回这个内容的路径
    • getNamedDispatcher 如果能匹配就是转发到对应servlet处理,否则返回null
  • 相关路径问题

9.1.1、在请求分发器路径查询字符串

  • 示例代码
  • String path = "/raisins.jsp?orderno=5";
    RequestDispatcher rd = context.getRequestDispatcher(path);
    rd.include(request, response);
               

9.2、使用一个请求分发器

  • servlet调用,可以通过执行include和forward的方法
  • 容器提供者应确保将请求分发到目标servlet与原始请求在同一JVM的同一线程中进行。

9.3、包含方法

  • RequestDispatcher接口的include的方法可以随时调用,include方法的目标servlet可以访问请求对象的所有内容,但是对响应对象的使用受到的限制比较多
  • 它只能将信息写入响应对象的ServletOutputStream或Writer并通过写入超出响应缓冲区末尾的内容或通过显示调用ServletResponse接口的flushBuffer方法来提交响应,除了HttpServletRequest.getSession()和HttpServletRequest.getSesion(boolean)方法外,它无法设置头部信息或者调用任何影响响应头的方法,设置的头信息的任何尝试添加都是会被忽略,并且如果需要提交响应,则会抛出IllegalStateException
  • 如果默认Request.include()请求servlet资源不存在,这个默认servlet需要抛出FileNotFoundException, 如果这个异常没有被捕获和处理,那么这个响应不会提交,这个状态code可能设置500.

9.3.1、 Included的请求参数

  • 除了通过使用getNamedDispatcher方法获得的Servlet之外,已经由另一个Servlet使用RequestDispatcher的include方法调用的servlet可以访问其调用路径
  • 通过getAttribute方法获取属性
    • javax.servlet.include.request_uri
    • javax.servlet.include.context_path
    • javax.servlet.include.servlet_path
    • javax.servlet.include.path_info
    • javax.servlet.include.query_string

9.4、转发方法

  • 当且仅当没有输出提交给客户端时,调用Servlet才能调用RequestDispatcher接口的forward方法,如果响应缓冲区中存在尚未提交的输出数据,则必须在调用目标servlet的service方法之前清除内容,如果已提交响应,则必须抛出IllegalStateException.暴露给目标servlet的请求对象的路径元素必须反射用于获取RequestDispatcher的路径。
  • 如果RequestDispatcher.forward()的目标中发生错误,则异常可能会通过所有调用的筛选器和Servlet传播回,并最终传播回容器

9.4.1、查询字符串

  • 聚合查询条件

9.4.2、forward 请求参数

  • 通过getAttribute方法获取属性
    • javax.servlet.include.request_uri
    • javax.servlet.include.context_path
    • javax.servlet.include.servlet_path
    • javax.servlet.include.path_info
    • javax.servlet.include.query_string

9.5、 错误处理

  • 抛出ServletException或IOException异常会传播到其他被调用者servlet中

9.6、获取一个异步上下文信息

  • 可以通过startAsync方法之一从ServletRequest中获得实现AsynContext接口的对象,一旦有了AsyncContext,就可以使用它通过complete()方法完成请求处理,也可以使用下面介绍的一种调度方法。

9.7、分发方法

  • 可以通过AsyncContext获取分发对象
    • dispatch(path) path 是一个字符串参数,是在ServletContext中描述参数,这个路径是相对于ServletContext的根目录,并且以‘/’ 开头
    • dispatch(servletContext, path) path 是一个字符串参数,servletContext是给定servletContext参数,是在ServletContext中描述参数,这个路径是相对于ServletContext的根目录,并且以‘/’ 开头
    • dispatch() 异步方法

9.7.1、查询字符串参数

  • 聚合查询参数

9.7.2、Dispatched请求参数

  • 通过getAttribute方法获取属性
    • javax.servlet.include.request_uri
    • javax.servlet.include.context_path
    • javax.servlet.include.servlet_path
    • javax.servlet.include.path_info
    • javax.servlet.include.query_string

继续阅读