servlet2.3规范之八——转发请求

8 转发请求

在构建一个web应用时,经常要把请求转发给另一个servlet处理,或者在响应中包含另一个servlet的输出。RequestDispatcher接口提供了一种机制来实现这种需求。

 

8.1 获取RequestDispatcher

可以通过ServletContext的下列方法获得实现RequestDispatcher接口的对象:

 

getRequestDispatcher

getNamedDispatcher

 

getRequestDispatcher方法以String参数描述ServletContext作用域的路径。该路径必须相对于ServletContext的根,并且以“/”开头。该方法使用路径(path)来查找servlet,用RequestDispatcher对象包装,然后返回结果对象。如果没有基于指定路径的servlet,提供一个RequestDispatcher返回路径值。

 

getNamedDispatcher方法以String参数表示ServletContext已知的servlet名称。如果找到servlet,用RequestDispatcher对象将它包装并返回。如果没有和指定名称关联的servlet,该方法必须返回null

 

为了能够使用当前请求的相对路径(不是ServletContext根的相对路径)来获得RequestDispatcher对象,ServletRequest接口提供以下方法:

 

getRequestDispatcher

 

该方法的行为和ServletContext的同名方法类似。servlet容器使用request对象中的信息将指定的相对路径转换成完整路径。比如,以“/”为根的上下文,请求/garden/tools.html,通过ServletRequest.getRequestDispatcher("header.html") 获得的requestDispatcher实际上等同于调用ServletContext.getRequestDispatcher("/garden/header.html")

 

8.1.1 RequestDispatcher路径的query字符串

ServletContextServletRequest使用path参数创建RequestDispatcher对象的方法,允许在path后添加query字符串。比如,开发人员可以通过下列代码获得RequestDispatcher

 

String path = “/raisons.jsp?orderno= 5” ;

RequestDispatcher rd = context.getRequestDispatcher(path);

rd.include(request, response);

 

query字符串中指定的参数用来创建RequestDispatcher,优先于传递给包含servlet的同名的其他参数。该参数和RequestDispatcher关联,只在includeforward调用中有效。

 

8.2 使用RequestDispatcher

要使用requestDispatcherservlet可以调用RequestDispatcher接口的includeforward方法。这些方法的参数可以是通过Servlet接口的service方法传递的requestresponse参数,也可以是规范2.3中引入的requestresponse包装类的子类的实例。后者,包装实例必须包装容器传递给service方法的requestresponse对象。

 

容器供应商必须确保向目标servlet转发请求和原请求处于同一个VM,同一个线程。

 

8.3 include方法

RequestDispatcher接口的include可以随时调用。include方法的目标servlet可以完整访问request对象,但是使用response对象上有一些限制:

 

它只能向response对象的ServletOutputStream或者Writer写入信息,提交响应(将内容输出到响应缓冲尾部),或者显式调用ServletResponse接口的flushBuffer方法。它不能设置header,或者调用任何影响响应header的方法。任何那样的尝试必须都被忽略。

 

8.3.1 包含的请求参数

除了使用getNamedDispatcher方法获得的servlet之外,includeservlet可以访问调用它的路径。设置以下请求属性:

 

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

 

includeservlet的这些属性通过request对象的getAttribute方法访问

 

如果includeservlet通过getNamedDispatcher方法获得,那么这些属性没有设置。

 

8.4 forward方法

RequestDispatcher接口的forward方法只有在输出还未提交给客户端时,才可以由调用servlet调用。如果输出数据存在于还未提交的响应缓冲中,内容必须在目标servletservice方法调用之前清空。如果响应已被提交,必须抛出IllegalStateException异常。

 

暴露给目标servletrequest对象的path元素必须映射用来获得RequestDispatcher的路径。

 

唯一例外是如果RequestDispatcher是通过getNamedDispatcher方法获得的,这种情况下,request对象的path元素必须必须映射最初的请求。

 

RequestDispatcher接口的forward方法返回之前,servlet容器必须发送,提交并关闭响应内容。

 

8.4.1 query字符串

请求转发机制负责在转发(forward)或包含(include)请求时传递query字符串。

 

8.5 错误处理

如果requesDispatcher的目标的servlet抛出ServletExceptionIOException类型运行时异常或checked异常,应当将它传递给调用servlet。所有其它异常应当包装成ServletException异常,并且异常的根在传递之前设置为原始异常。

 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值