1.Servlet规范为Web组件之间的协作提供了两种途径
2.web组件包含哪些,目标组件都可以为Servlet,jsp或者HTML文档.
3.源组件和目标组件共享一个ServletRequest对象和ServletResponse对象
http://hi.baidu.com/java_thinker/item/bf580a59856987c4d2e10c34
一个Servlet对象无法获得另一个Servlet对象的引用
Web应用在响应客户端的一个请求时,有可能相应过程很复杂,需要多个Web组件共同协作,才能生成响应结果,经管一个Servlet对象无法直接调用另一个Servlet对象的service方法,但Servlet规范为Web组件之间的协作提供了两种途径.
1.请求转发:Servlet(源组件)先对客户端请求做一些预处理的操作,然后把请求转发给其他Web组件(目标组件)来完成包括生成响应结果在内的后续操作.
2.包含:Servlet(源组件)把其他Web组件(目标组件)生成的响应结果包含到自身的响应结果中.
请求转发和包含有以下共同点:
1.源组件和目标组件处理的都是同一个客户请求,源组件和目标组件共享一个ServletRequest对象和ServletResponse对象.
2.目标组件都可以为Servlet,jsp或者HTML文档.
3.都依赖Servlet.servlet.RequestDispatcher接口
4.forward()方法:将请求转发给目标组件
public void forward(ServletRequest request,ServletResponse response)throws ServletException,java.io.IOException
5.include()方法:包含目标组件的响应结果
public void include(ServletRequest request,ServletResponse response)throws ServletException,java.io.IOException
当Servlet源组件在调用RequestDispatcher的forward()或者include()方法时,都要把当前的ServletRequest对象和ServletResponse对象作为参数传给forward()或者include(),使得源组件和目标组件共享一个ServletResponse和ServletRequest对象.
两种获得RequestDispatcher的对象方法:
1.调用ServletContext的getRequestDispatcher(String path)方法,path指定目标组件的路径,使用的是绝对路径,即以符号"/“开头的路径,”/“表示当前Web应用的URL入口;
2.调用ServletRequest的getRequestDispatcher(String path)方法,path指定目标组件的路径,使用的相对路径,即相对于当前的源Servlet组件的路径,不以符号”/"开头
包含与请求转发相比,前者有以下的特点:
1.源组件与被包含的目标组件的输出数据都会被添加到响应结果中;
2.在目标组件中对响应状态代码或者响应头所做的修改会被忽略.
请求范围:
对于Web应用范围 是指整个Web应用的生命周期,Web应用范围与ServletContext对象的生命周期对应,Web应用范围内的共享数据作为ServletContext对象的属性而存在,在Web组件只要共享一个ServletContext对象,也就能共享Web应用范围内的共享数据.
对于请求范围 是指服务器端响应一次客户请求的过程,从Servlet容器接收到一个客户请求开始,到返回响应结果结束.在具体实现上,请求范围与ServletRequst和ServletResponse对象的声明周期结束.Servlet容器每次接收到一个客户请求,都会先创建一个针对与该请求的ServletRequest和ServletResponse对象,然后把这两个对象作为参数传递给相应Servlet服务方法,当容器把本次响应结果返回给客户,ServletRequest对象和ServletResponse对象的生命周期就结束了.
当源组件和目标组件之间为请求转发关系或者包含关系时,对于每一次客户请求,它们都共享同一个ServletRequest对象和ServletResponse对象,因此源组件和目标组件能共享请求范围内的共享数据.
对于客户端的每一次请求,Servlet容器都会创建一个ServletResponse和ServletRequest对象.