How Tomcat Works之第十二章之invoke方法

来源:互联网 发布:生化危机人工智能红后 编辑:程序博客网 时间:2024/06/02 20:18

在Tomcat 4中,StandardContext的invoke方法由相关联的连接器调用或者如果StandardContext是一个主机的子容器,由host的invoke方法调用。StandardContext的invoke方法先检查应用的重载是否发生。如果是的,就等到应用的重新载入完成为止。之后调用它父类invoke方法,Containerbase。下面显示了StandardContext类的invoke方法。


getPaused方法返回paused属性的返回值,如果应用正在重新载入,这个属性值为true。应用重新载入在下一部分讨论。

 

在Tomcat 5 中,StandardContext不提供invoke方法的实现而是调用父类ContainerBase的invoke方法。应用重载的检查由StandardContextValue的invoke方法完成。

 

StandardContextMapper

 

对于每个到来的请求,将调用StandardContext的pipeline的基本值的invoke方法。StandardContext的基本值由StandardContextValue类表示。StandardContextValue的invoke方法的首先需要做的是获取处理这个请求的wrapper。

 

在 Tomcat 4中,StandardContextValue实例在维护的StandardContext中搜索。StandardContextValue使用上下文的mapper来找到一个合适的wrapper。一旦获取了wrapper,就调用wrapper的invoke方法。在找出StandardContextValue做什么之前,这一部分展示了mapper组件的介绍。

 

 

ContainerBase类,StandardContext的父类,定义了addDefaultMapper方法来添加一个默认的额mapper。


StandardContext类在start方法中调用addDefaultMapper方法,并传递了mapperClass变量。

 

Public synchronized void start() throws lifecycleException{

 

      If(ok){

           Try{

             addDefaultMapper(this.mapperClass);

          }

 

}

 

 

StandardContext类定义了mapperClass变量,

 

Private  String  mapperClass = “org.apache.catalina.core.StandardContextMapper”;

 

稍后你必须调用mapper的setContainer方法使一个mapper与一个容器关联。StandardContextMapper类是org.apache.catalina.Mapper接口的实现类。StandardContextMapper只能与一个context关联,用setContainer方法指定。


在一个mapper中最重要的事情是一个map,将返回一个子容器来处理一个HTTP请求。方法签名如下:

 

Public Container map(Request request,Response response);

 

在StandardContextMapper中,map返回一个处理请求的wrapper。如果没有合适的wrapper返回,map方法返回为null。

 

StandardContextValue实例为每个到来的请求调用context的mapper方法,并传递一个org.apache.catalina.Request对象。Map方法(在父类ContainerBase中)首先为一个特别的协议获取一个mapper,这里通过调用findMapper方法,之后调用mapper的map方法。


StandardContextMapper的map方法首先指定了要被映射的上下文关联的URI:


之后获取一个wrapper,并要满足以下规则:





你可能会问,上下文为何有这样的信息作为servlet映射。回顾第十一章的BootStrap类添加了两个servlet映射给StandardContext。






它也添加了wrapper作为context的子容器




Tomcat 5移除了Mapper接口及其相关类。实际上,实际上,StandardContextValue类的invoke方法从请求对象中获取了适合的wrapper。


指明了mapper信息封装在request对象中。


0 0