我們都知道java是動態語言,用java開發的語言必須運行在web容器內,最常用的是tomcat,在開發web項目是還經常用到開源框架如JSF、struts、spring等,但當一個web應用部署啓動時都涉及那些過程以及那些主要類確知之甚少,下文只有分析,tomcat、jsf、struts、sping等重要組件的啓動過程及主類。
1 tomcat
博文TOMCAT原理以及處理HTTP請求的過程、ContextPath ServletPath中已經詳細的介紹了tomcat的各個組件,及url請求的處理過程,這裏不再詳述
只需記住,tomcat會爲每一個web應用創建一個Context容器,同時爲每個servlet創建一個wrapper容器。
1.1 - Context /tomcat中實現了一個StandardContent
一個Context對應於一個Web Application,一個Web Application由一個或者多個Servlet組成
Context在創建的時候將根據配置文件$CATALINA_HOME/conf/web.xml和$WEBAPP_HOME/WEB-INF/web.xml載入Servlet類
當Context獲得請求時,將在自己的映射表(mapping table)中尋找相匹配的Servlet類
如果找到,則執行該類,獲得請求的迴應,並返回
此外StandardContent還必須關聯一個session管理器。在tomcat中管理器主要是管理StandardSession,這個類繼承了servlet.http.HttpSession接口
此外我們知道tomcat在接到http請求時會創建request和response,在tomcat中會轉爲servletrequest和servletresponse對象,並在調用servlet的service方法的時候作爲參賽傳入。
StandardContext的start方法進行初始如果想了解更多關於StandardContext請看博文tomcat中StandardContext
注意這裏的standardContext對象是容器中的用於完成web應用的部署的。與ServletContext是不同的概念沒有可比性。
1.2 web.xml中的配置項
Servlet、filter、listener,servlet-mapping等,
2 servlet
2.1httpservlet
servlet是javaEE規範,我們自己寫一個servlet部署到web容器的時候必須繼承httpservlet類。類中定義瞭如init、service、doget、dopost等方法。
2.2 ServletContent:
ServletContext接口表示一個web應用的上下文。可以想象成一個web一個能用的共享數據區域,該區域保存整個web共享數據。
1.1 Servlet容器何時創建ServeltContext接口實現類
當一個web應用啓動的時候,就會創建該ServletContext接口的實現類。我們可以在根據需求,讀寫ServletContext這個web共享區的數據,那麼如何獲得ServletContext這個實例呢?下面提供了兩種方法
1.2 如何獲得ServletContext接口實例
方法1:
可以通過ServletConfig接口的getServletContext()方法獲得
方法2:
通過GenericServlet抽象類的getServletContext()方法獲得,不過這個方法其實也是調用了ServletConfig的getServletContext()方法
2.3ServletConfig
容器初始化一個servlet時,會爲這個servlet建一個唯一的ServletConfig。容器從DD讀出Servlet初始化參數,並把這些參數交給ServletConfig,然後把ServletConfig傳遞給servlet的init(ServletConfig config)方法。也就是說容器只有在創建servlet實例時纔會讀DD文件中的init-param,並且在servlet一生中只讀一次。
在實際應用過程中,爲了便於修改我們並不希望直接把某一變量硬編碼到servlet類中,這個時候就會用到ServletConfig接口。我們可以把某些變量放在DD(web.xml)中,這樣如果我們要修改某一值,可以直接改動DD文件即可。
在這裏我們來看看ServletConfig中的方法:
getInitParameter(String name):根據給定的初始化參數,返回匹配的初始化參數值。
getInitParameterNames():返回一個Enumeration對象,裏面包含了所有的初始化參數。
getServletContext():返回一個servletContext()對象.
getServletName():返回servlet的名字,即web.xml中的<servlet-name>的子元素的值。如果沒有配置這個子元素,則返回servlet類的名字。
2.4 HttpSession
httpsession代表了一個Session回話,在tomcat中Session管理器用於維護Session,可以調用request.getsession方法得當session
2.5 HttpServletrequest與HttpServletresponse
代表了與一個客戶端的一次request請求和response返回,這兩個對象首先由tomcat創建,然後包裝成HttpServletrequest與HttpServletresponse對象傳給Servlet
3 JSF框架
JSF框架的主要實現類是javax.faces.webapp.FacesServlet,這個實現類作爲一個servlet在web.xml中配置,所有的請求都映射到這個servlet來進行處理。FacesServlet在MVC中作爲控制器部分,主要是FacesContextFactory來產生一個FacesContext的實例,之後再獲得生命週期實例,進行生命週期狀態處理。具體的生命週期請看博文:JSF生命週期總結
4 struts2
struts2的主要實現類是org.apache.struts2.dispatcher.FilterDispatcher,這個類是作爲一個Filter在web.xml中配置的。
5 spring
spring的主要實現類是org.springframework.web.context.ContextLoaderListener,在web.xml中作爲一個listener配置的