tomcat容器啓動過程

tomcat啓動過程:




1、tomcat可以部署多個web項目,可以說成tomcat容器
2、tomcat自檢,會讀取tomcat中web.xml,【自檢完:“initialization processed in xxx ms”】
3、tomcat自檢完畢後,出現:starting Engine:Apache Tomcat/8.0.23說明開始逐漸加載web項目,每個web項目的WEB-INF目錄下的web.xml。tomcat會爲此web項目分配一個servert context(servlert上下文),而且每一個web項目只有一個servletcontext上下文,上下文中維護的是map集合,實際上是一個容器存儲對象
3、servlet開始解析和執行web.xml:
(1)監聽器:servlet規範中定義的一種特殊的組件,用來監聽servlet容器產生 的事件,並做響應的處理
容器產生的事件有兩大類:
    生命週期相關的事件
    ServletRequestListener   request對象的監聽器
HttpSessionListener      session對象的監聽器
    sessionCreate方法,  當服務器創建session對象時就調用此方法
sessionDestroyed方法,當session對象銷燬時調用此方法
ServletContextListener   application對象的監聽器
            綁定數據相關的事件
    當調用了request對象,session對象,
  servletContext(application)對象的setAttribute方法
和removeAttribute方法時產生的事件
ServletRequestAttributeListener
   attributeAdded方法,當給調用request.setAttribute()方法時觸發此方法
   attributeRemoved方法,當requset中的對象被移除的時候調用此方法
   attributeReplaced方法,當request中的對象被替換的時候調用此方法
HttpSessionAttributeListener
   attributeAdded方法
   attributeRemoved方法
   attributeReplaced方法
ServletContextAttributeListener
   attributeAdded方法
   attributeRemoved方法
   attributeReplaced方法

   實現監聽器的步驟:
    1.新建一個java類要實現上面對應監聽器接口
    2.編寫對應方法的監聽邏輯
    3.在web.xml中,註冊監聽器<listener></listener>

(2)過濾器(Filter(接口)):過濾器就是servlet的一個特例
      a、什麼是過濾器:是servlet2.3規範中定義的一種小型的,可插入的
                web組件,用來攔截servlet容器的請求和響應過程
以便查看,提取或以某種方式操作正在客戶端和服務器
之間交換的數據,
過濾器通常是封裝了一些web功能的組件,這些功能很重要
但對於處理客戶端後發送響應來說不是決定性的
 b、 實現過濾器的步驟:
    1.創建一個java類,實現javax.servlet.Filter;接口
    2.在實現類中doFilter方法添加過濾或攔截的算法
3.在web.xml中添加<filter></filter><filter-mapping></filter-mapping>


 c、 過濾器初始化參數:
   容器啓動之後,會創建過濾器對象,然後會調用init方法,在init方法中
   讀取web.xml中的初始化參數(包括局部和全局),在執行doFilter方法前
   做數據初始化工作。
  
 d、 過濾器的優點:
    實現代碼的“可插拔性”,即增加或減少某個功能模塊,不會影響程序的
正常運行,可以將多個相同處理邏輯的模塊集中寫在過濾器裏,方便維護

  e、只要:在需求說明中有這樣的詞語,“過濾”,“攔截”,“代理”,
        “在原有功能基礎上添加新功能”,“在主業務之前,之後添加功能”
那麼,第一反應用代理模式實現,或(servlet filter)

   f、   過濾器的生命週期:當服務啓動時,會加載web.xml中的內容 如果文件中有<filter>項,那麼讀取<filter-class>節點中的內容,然後反射實例化對象,過濾器的的聲明週期開始。
    如果過濾器類不存在就無法反射,那麼就在服務器啓動時報異常生命週期開始後會自動調用init方法(只調用一次)        
    如果<url-patten>節點中放置的是/*,代表所有請求都要被此過濾器攔截,只要請求任何資源都會進入此過濾器的doFilter這個方法,在此方法中做相關檢測工作,如果檢測成功了,就 可以通過filterChain.doFilter(servletRequest,servletResponse);去尋找下一個過濾器,如果下一個過濾器不存在就直接訪問對應的資源        
    如果存在,就進入下一個過濾器的doFilter方法,執行完後,依次退回。當服務器正常停止的時候,會調用destroy方法,過濾器聲明週期結束。如果有多個過濾器就是過濾器鏈,執行順序跟web.xml的加載(生命週期)順序一樣  

(3)servlet:<load-startup>,聲明週期在啓動時就開始,但沒有工作,只有<url-pattern>*.do</url-pattern>(自定義url),只有請求帶有.do的url,servlet纔會工作,執行service方法。serlvet生命週期開始,會電泳init做初始化工作,會讀取加載解析spring-mvc.xml,說明spring mvc的容器出現了,出現initializing Spring FrameWorkServlet'dispatcher'.
spring mvc容器是spring容器的子容器,子容器中存放的是Controller的對象<context:component-scan base-package="com.tarena.controller"/>
可以掃描到以下註解的類
@Controller("userController")
@RequestMapping("user/")
而:
<!-- 解析註解 @RequestMapping,@ResponseBody 加在方法上,能直接解析到類的方法上-->
<mvc:annotation-driven></mvc:annotation-driven>

注意:經過測試,5.0.4版本的spring mvcd jar包不需要使用<mvc:annotation-driven></mvc:annotation-driven> ,因爲<context:component-scan/>已經包含了它,而4.3.7版本的卻不行,必須寫<mvc:annotation-driven>才能掃描到類上方法的url。


@Controller("userController_form")
@RequestMapping("user_form/")
public class UserController_Form {
	
	/**
	 * 
	 * @param userName  對應頁面中的表單元素中的input name="userName"
	 * @param userPassword對應頁面中的表單元素中的input name="userPassword"
	 * @return  ModelAndView對象給InternalResourceViewResolver 解析
	 */
	@RequestMapping(value="login1.do",method=RequestMethod.POST)
	public ModelAndView login1(String userName,
			                  String userPassword) {
		ModelAndView mv=new ModelAndView();
		//獲取頁面的數據,springmvc幫程序員已經做了
		System.out.println("userName="+userName+
				        "   userPassword="+userPassword);
		//由程序員自己實現具體的登錄業務
		boolean flag=true;
		
		//根據業務的返回結果做跳轉和綁定數據
		//根request.setAttribute("msg","登錄成功")
		mv.addObject("msg", "登錄成功");
		mv.setViewName("success");
		
		return mv;
	}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章