A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  • server.xml中默认设置为
<Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true">
  • 1

如此设置则会自动加载webapps下的文件夹或者war包;

  • 或者自行配置Context
<Context docBase="/xxxxx" path="/xxxx"  reloadable="true" ></Context>
  • 1

如此则会加载指定context。

一、配置Host的appBase则可自动加载appBase文件夹下的应用

(1)观察StandardHost的startInternal方法

startInternal() -> super.startInternal() -> setState(LifecycleState.STARTING) -> setStateInternal() -> fireLifecycleEvent(lifecycleEvent, data)
  • 1

StandardHost在启动时会通知所有listener它的启动状态,而StandardHost有一个默认listener是HostConfig,所以会调用到HostConfig的lifecycleEvent方法。

(2)观察HostConfig的lifecycleEvent方法

lifecycleEvent() -> start() -> deployApps() -> deployDirectories() -> es.submit(new DeployDirectory(this, cn, dir))
  • 1

对于每一个文件夹,提交了一个部署任务。

(3)观察DeployDirectory的run方法

run() -> config.deployDirectory(cn, dir)
  • 1

部署任务中会调用HostConfig的方法进行实际的部署操作,在此方法中会构造Context,并使用addChild方法加入到Host中。

二、自行配置Context

如果配置了Context,则在解析server.xml时会创建Context对象并使用addChild方法加入到Host中。

三、加载web.xml

一个Context对应一个web应用,而一个web应用应该有一个web.xml
观察StandardContext的startInternal方法

startInternal()  -> fireLifecycleEvent(Lifecycle.CONFIGURE_START_EVENT, null)                 -> child.start()                 -> mergeParameters()                 -> listenerStart() -> setApplicationEventListeners()                                    -> setApplicationLifecycleListeners()                 -> filterStart()                 -> loadOnStartup(findChildren())
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

(1)fireLifecycleEvent
StandardContext默认会被添加ContextConfig(Llistener),此时会通知到它,观察ContextConfig的lifecycleEvent方法。

configureStart() -> webConfig() -> webXmlParser.parseWebXml()                                -> configureContext(webXml)
  • 1
  • 2

此处会使用digester读取web.xml并设置到StandardContext里。

(2)mergeParameters
步骤(1)中会将web.xml中的context-param元素设置到context的parameters里,此处则是把parameters设置到servletContext里。

(3)启动listener
步骤(1)中会将web.xml中的listener元素设置到context的applicationListeners里,
此处则取出listener类名,创建实例,并将listener分为两类
eventlistener:ServletRequestAttributeListener、ServletRequestListener、HttpSessionIdListener、HttpSessionAttributeListener
lifecyclelistener:ServletContextListener、HttpSessionListener
对于ServletContextListener,会调用listener.contextInitialized(event)

(4)启动filter
步骤(1)中会将web.xml中的filter元素设置到filter的filterdef里,此处则会实例化filter设置到filterConfigs里。

(5)启动servlet
步骤(1)中会将web.xml中的servlet元素封装成wrapper并调用addChild方法设置到Context里,
此处则会检查是否需要loadonstartup,如果需要则load。

【转载】原文地址:https://blog.csdn.net/lblblblblzdx/article/details/80946526


3 个回复

倒序浏览
回复 使用道具 举报
回复 使用道具 举报
赞一个
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马