前面的文章分析了StandardEngine,这里来分析一下由Engine对象来管理的另外一种对象吧:Host。。
一般情况下,在tomcat中都是默认使用StandardHost类型。。。这里先来看看在catalina是如何配置创建StandardHost对象的吧:
//创建host对象
digester.addObjectCreate(prefix + "Host",
"org.apache.catalina.core.StandardHost", //创建host对象的配置
"className");
digester.addSetProperties(prefix + "Host");
digester.addRule(prefix + "Host",
new CopyParentClassLoaderRule()); //会将host的parentClassloader设置为engine的,engine被设置为sharedloader
digester.addRule(prefix + "Host", //为host设置配置的监听
new LifecycleListenerRule
("org.apache.catalina.startup.HostConfig", //这个算是比较重要的吧,在里面会具体的创建context啥的
"hostConfigClass"));
digester.addSetNext(prefix + "Host",
"addChild",
"org.apache.catalina.Container"); // 在engine上面调用addChild方法,用于添加当前的host到engine上面去
这部分具体的涉及到Host对象的创建,第一个是具体的创建要用的host对象,也就是StandardHost对象,接着是指定为host设置的parentclassLoader为engine的parentClassLoader,在前面的文章中,我们知道engine的parentClassLoader会被设置为sharedLoader,所以这里host对象的parentClassLoader也会被设置为sharedLoader。。
然后还有比较重要的配置项吧,为StandardHost对象添加lifecycle的监听器,为HostConfig类型的对象。。它是比较重要的吧,因为它会具体的负责对context的创建,启动啥的。。这个一会再来说吧。。
然后就最后调用engine的addChild方法将当前host对象添加到engine上面去了。。。
好啦,到这里怎样创建host对象应该算是知道了吧。。。那么接下来来看看host接口是如何定义的吧:
public interface Host extends Container {
//host的一些事件的定义,添加别名,移除别名啥的
public static final String ADD_ALIAS_EVENT = "addAlias";
public static final String REMOVE_ALIAS_EVENT = "removeAlias";
public String getXmlBase(); //当前host对象的配置文件的路径,这个文件不一定存在吧 /conf/enginename/hostname/
public void setXmlBase(String xmlBase);
public File getConfigBaseFile(); //当前host的配置xml文件
public String getAppBase(); //当前host的app在什么地方
public File getAppBaseFile(); //获取app的放的目录的文件引用
public void setAppBase(String appBase); //设置app存放的路径
public boolean getAutoDeploy(); //是否自动部署
public void setAutoDeploy(boolean autoDeploy); //是否自动部署
public String getConfigClass(); //用于监听context的listener的类型
public void setConfigClass(String configClass);
public boolean getDeployOnStartup(); //启动的时候部署?
public void setDeployOnStartup(boolean deployOnStartup);
public String getDeployIgnore();
public Pattern getDeployIgnorePattern(); //context名字匹配用的正则表达式
public void setDeployIgnore(String deployIgnore);
public ExecutorService getStartStopExecutor(); //用于启动和停止子container(也就是context)的executor
public boolean getCreateDirs(); //如果是ture的话,那么会尝试为应用程序和host的配置创建文件夹
public void setCreateDirs(boolean createDirs);
public boolean getUndeployOldVersions(); //是否自动卸载程序的老版本
public void setUndeployOldVersions(boolean undeployOldVersions);
public void addAlias(String alias); //为当前host添加别名
public String[] findAliases(); //获取当前host的所有别名
public void removeAlias(String alias); //移除一个别名
}
接口定义稍微长一些吧,不过也还挺简单的,主要是一些配置,别名什么的管理,这个具体看上面的注释应该能比较的清楚吧。
好啦,接下来来看看StandardHost是怎么实现的吧,先来看看简单的继承体系:
这个应该算是很简单的吧,首先也是一个容器。。。然后实现了host接口。。。这里来看看它的构造函数吧:
public StandardHost() {
super();
pipeline.setBasic(new StandardHostValve()); //设置basic
}
没做什么事情吧,无非是在pipeline上面添加了一个basic的valve对象。。。接下来再来看看一些重要的属性的定义吧:
private String[] aliases = new String[0]; //当前host对象的别名的数组
private final Object aliasesLock = new Object(); //锁
private String appBase = "webapps"; //默认的app的路径是tomcat根路径下的webapps文件夹
private volatile File appBaseFile = null; //引用这个文件夹
private String xmlBase = null; //xml配置文件