在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对象中。