????本文是我自己在秋招復習時的讀書筆記,整理的知識點,也是為了防止忘記,尊重勞動成果,轉載注明出處哦!如果你也喜歡,那就點個小心心,文末贊賞一杯豆奶吧,嘻嘻。 讓我們共同成長吧……
第一篇? 網站基礎知識
第1章? 網站架構及其演變過程
1.1? 軟件的三大類型
? ??????單機類型,CS類型,BS類型
1.2? ? 基礎架構并不簡單
? ? ? ? BS結構網絡傳輸的分解方式有兩種:一種是標準的OSI參考模型;另一種是TCP/IP參考模型。
? ? ? ? OSI參考模型:物理層、數據鏈路層、網絡層、傳輸層、會話層、表示層、應用層
????????TCP/IP參考模型:網絡接入層、網際互聯層、傳輸層、應用層
? ? ? ? 對于TCP/IP參考模型的4層的理解:
? ? ? ? BS結構中,網絡接入層沒有相應協議,網際互聯層是IP協議,傳輸層是TCP協議,應用層是HTTP協議。還用到了DNS協議。
1.3? 架構演變的起點
1.4? 海量數據的解決方案
????1.4.1? ? 緩存和頁面靜態化
? ? ? ? 緩存使用方式:通過程序直接保存在內存中和使用緩存框架。程序直接操作主要是使用Map,尤其是ConcurrentHashMap,常用的緩存框架有Ehcache、Memchache和Redis。緩存主要適用于數據變化不是很頻繁的情況,如果是定期失效的失效機制,實時性也不能要求太高。
? ? ? ? 頁面靜態化是將程序最后生成的頁面保存起來,頁面靜態化對數據量大、并發量高兩大問題都有好處。頁面靜態化可以在程序中使用模板技術生成,例如Freemarker、Velocity.也可以使用緩存服務器再應用服務器的上一層緩存生成的頁面,例如Nginx、Squid。
????1.4.2? 數據庫優化
? ? ? ? 常見的數據庫優化:表結構優化、SQL語句優化、分區和分表、索引優化、使用存儲過程代替直接操作、合理使用冗余。
? ? 1.4.3? ? 分離活躍數據
? ? 1.4.4? ? 批量讀取和延遲修改
? ? 1.4.5? ? 讀寫分離
? ? 1.4.6? 分布式數據庫
????1.4.7? ? NoSQL和Hadoop? ??
1.5? ? 高并發的解決方案
? ? 應用和靜態資源分離、頁面緩存、集群與分布式、反向代理、CDN
1.6? 底層的優化
1.7? 小結
第2章? ? 常見協議和標準
2.1? DNS協議
? ? ? ? DNS作用是將域名解析為IP.
2.2? ? TCP/IP協議與Socket
? ? ????TCP在傳輸之前會進行三次溝通,稱作“三次握手”,傳完數據斷開時要進行四次溝通,稱作“四次揮手”。TCP中的兩個序號和三個標志位的含義:
? ? ? ? seq:表示傳輸數據的序號。ack:表示確認號。ACK:確認位。SYN:同部位。FIN:終止位。
2.3? HTTP協議
? ? ? ? HTTP中的報文分為:請求報文、響應報文。這兩種類型都包括:首行、頭部和主體。
? ? ? ? 請求報文中的方法指:GET、HEAD、POST、PUT、DELETE,響應報文中的狀態碼分為5類:
2.4? ? Servlet與Java Web開發
? ? ? ? Servlet是J2EE標準的一部分,是JavaWeb開發的標準。Servlet的作用是對接收到的數據進行處理并生成要返回給客戶端的結果。要想使用Servlet需要相應的Servlet容器,常見的Servlet容器時Tomcat.
第3章? ? DNS的設置
第4章? ? Java中Socket的用法
? ? 本章介紹Java中的Socket的用法,Java中的Socket分為普通Socket和NioSocket兩種。
4.1? 普通Socket用法
? ? ? ? Java中的網絡通信通過Socket實現的,Socket分為ServerSocket和Socket兩大類。ServerSocket用于服務端,可以通過accept()方法監聽請求返回Socket,Socket用于具體完成數據傳輸。客戶端直接使用Socket發起請求并傳輸數據。
? ? ? ? ServerSocket的使用分為三步:
? ? ? ? 1)創建ServerSocket。
? ? ? ? 2)調用創建出來的ServerSocket的accept方法。
? ? ? ? 3)使用accept方法返回Socket與客戶端進行通信。
? ? ? ? Socket客戶端使用:創建一個Socket,和服務器進行通行,傳輸數據,釋放連接。
4.2? NioSocket的用法
? ? ? ? ServerSocketChannel和SocketCHannel,分別對應以前的ServerSocket和Socket。
? ? ? ? NioSocket中服務端的處理過程步驟:
? ? ? ? 1)創建ServerSocketChannel并設置相應采參數
? ? ? ? 2)創建Selector并注冊到ServerSocketChannel
? ? ? ? 3)調用Selector的select方法等待請求
? ? ? ? 4)Selector接收請求后使用selectedKeys返回SelectionKey集合
? ? ? ? 5)使用SelectionKey獲取到Channel、Selector和操作類型并進行具體的操作。
第5章? 自己動手實現HTTP協議
第6章? 詳解Servlet
? ? ? ? Servlet是Server+Applet的縮寫,表示一個服務器應用。Servlet是一套規范。按照此規范編寫的代碼就能在java的服務器上運行。
6.1? Servlet接口
? ? ? ? init方法:容器啟動時被容器調用,只會調用一次。
? ? ? ? getServletConfig方法:用于獲得ServletConfig.
? ? ? ? service方法:用于具體處理一次請求。
? ? ? ? getServletInfo方法:獲取一些Servlet相關信息,如作者、版權等。
? ? ? ? destroy方法:主要用于Servlet銷毀時釋放一些資源,只會調用一次。
? ? ? ? 在web.xml中定義Servlet時通過init-param標簽配置的參數就是通過Servlet來保存的。Tomcat中的Servletinit方法是在ocrg.apache.catalina.core.StandardWrapper的initServlet方法中調用的,ServletConfig傳入的是StandardWrapper自身的門面類StandardWrapperFacade。
? ? ? ? ServletConfig(Servlet級別)和ServletContext(Application級別)是最常見的傳遞初始化參數的。
6.2? GenericServlet
????????GenericServlet是Servlet的默認實現,主要做了三件事:實現ServletConfig接口,可以直接調用ServletConfig里面的方法;提供了無參的init方法;提供了log方法。
? ??????GenericServlet實現了ServletConfig,可以在需要用ServletConfig中的方法的時候可以直接調用,而不需要先獲取ServletConfig,不過底層還是使用ServletConfig進行調用。
? ???????GenericServlet實現了Servlet的init(ServletConfig? config)方法,現將config設置給了內部變量config,然后調用了無參的init()方法,這個方法是模板方法,子類可以通過覆蓋它來完成自己的初始化工作。
????????GenericServlet提供了2個log方法,一個記錄日志,一個記錄異常,具體實現是通過傳給ServletContext的日志實現的。
6.3? HttpServlet
? ??????HttpServlet是HTTP協議實現的Servlet的基類,HttpServlet主要重寫了service方法,首先將ServletRequest和ServletResponse轉換為了HttpServletRequest和HttpServletResponse,然后根據http請求的類型不同將請求路由到了不同的處理方法。
第7章 Tomcat分析
7.1? Tomcat的頂層結構及啟動過程
7.1.1? Tomcat的頂層結構
????????Tomcat最頂層的容器時Server,代表整個服務器,Server中包含至少一個Service,應用于具體提供服務。Service主要包含:Connector和Container。Connector用于處理連接相關的事情,并提供Socket與request、response的轉換;Container用于封裝和管理Servlet以及具體的request請求。一個Tomcat只有一個Server,一個Server可以包含多個Service,一個Service包含多個Connector,但只包含一個Container。
? ? ? ? Tomcat里的Server有Catalina來管理,里面有三個方法:load、start、stop,分別用來管理整個服務器的生命周期。Tomcat的入口main方法在Bootstrap中。
7.1.2? Bootstrap的啟動過程
? ? ? ? Bootstrap是Tomcat的入口,正常情況下Tomcat就是調用Bootstrap的main方法:
? ? ? ? main方法主要有兩部分內容:首先新建了Bootstrap,并執行init方法初始化;然后處理main方法傳入的命令,如果args參數為空,默認執行start方法。
? ? ? ? 在init方法中初始化了ClassLoader,并使用ClassLoader創建Catalina實例,然后賦值給catalinaDaemon變量。對start的處理,通過反射調用了Catalina的setAwait(true)、load(args)、start()三個方法。
7.1.3? Catalina的啟動過程
? ? ? ? 從前面可知,catalina的啟動主要是調用setAwait、load、start來完成的。setAwait用于設置Server啟動完成之后是否進入等待狀態標志;load用于加載配置文件,創建并初始化Server;start用于啟動服務器。
7.1.4? Server的啟動過程
? ??????Server接口中提供addService(Service service)、removeService(Service service)來添加和刪除Service,Server的init和start方法分別循環調用每個Service的init和start方法來啟動所有的Service。
? ? ? ? Server的默認實現是StandardServer,StandardServer繼承自LifecycleMBeanBase,LifecycleMBeanBasej繼承自LifecycleBase,init和start方法就在LifecycleBase中,LifecycleBase里的init和start又調用了initInternal和startInternal方法,這兩個方法是模板方法。所以調用StandardServer的init和start方法會執行StandardServer自己的initInternal和startInternal方法,這就是Tomcat生命周期的管理方式。
????????StandardServer還實現了await方法,Catalina中就是讓調用它的服務器進入等待執行狀態。
7.1.5? Service的啟動過程
? ? ? ? Service默認實現是:StandardService,繼承自LifecycleMBeanBasej,init和start方法最終會調用initInternal和startInternal方法.
? ? ? ? 現在整個Tomcat服務器就啟動了,整個啟動流程:
7.2? Tomcat的生命周期管理
7.2.1? Lifecycle接口
? ? ? ? Tomcat通過org.apache.catalina.Lifecycle接口統一管理生命周期,所有有生命周期的組件都需要實現Lifecycle接口。
7.2.2? LifecycleBase
? ??????LifecycleBase默認實現是org.apache.catalina.util.LifecycleBase,所有實現了生命周期的組件都直接或者間接的繼承LifecycleBase。LifecycleBase為Lifecycle里的接口方法提供了默認實現:監聽器管理使用LifecycleSupport類完成。
? ? ? ? 三個管理監聽器的方法:
? ? ? ? 四個生命周期方法:
????????兩個獲取當前狀態的方法:
7.3? Container
7.4? Pipeline-Value管道
7.5? Connector分析
第二篇? 俯視Spring MVC
第8章 Spring MVC之初體驗
? ? ? ? 本章主要介紹SpringMVC的環境搭建并簡單介紹使用方法。
8.1? 環境搭建
8.2? Spring MVC最簡單的配置
? ? ? ? 配置一共需要三步:在web.xml中配置Servlet;創建SpringMVC的xml文件;創建Controller和view。
8.2.1??在web.xml中配置Servlet
8.2.2??創建SpringMVC的xml文件
8.2.3? 創建Controller和view
8.3? 關聯sprin源代碼
第9章 創建SpringMVC之器
? ? ? ? 本章分析SpringMVC創建過程
9.1? 整體結構介紹
? ? ? ? Spring MVC中核心Servlet的繼承結構:
9.2? HttpServletBean
? ? ? ? 通過前面對Servlet的分析,可知道Servlet創建可以直接調用無參的init方法,HttpServletBean的init方法如下:
? ? ? ? 在HttpServletBean的init中,首先,將Servlet中配置的參數使用BeanWrapper設置到DispatcherServlet的相關屬性;然后調用模板方法initServletBean,子類通過該方法初始化。
9.3? FrameworkServlet
? ? ? ? 從HttpServletBean可知,FrameworkServlet的入口是initServletBean,
? ??????FrameworkServlet主要做了兩件事:初始化WebApplicationContext;初始化FrameworkServlet,initFrameworkServlet是個模板方法,子類可以覆蓋后在里面做一些初始化的工作,但是子類并沒有使用它。
? ? ? ? initWebApplicationContext方法做了三件事:1)獲取spring的根容器rootContext;? ? 2)設置WebApplicationContext并根據情況調用onRefresh方法;? ? 3)將WebApplicationContext設置到ServletContext中
????????獲取spring的根容器rootContext
? ? ? ? 默認情況下spring會將自己的容器設置成ServletContext的屬性,默認的根容器的key是org.springframwork.web.context.WebApplicationContext.ROOT,它的定義在org.springframwork.web.context.WebApplicationContext中。
? ? ? ?設置WebApplicationContext并根據情況調用onRefresh方法
? ? ? ? 設置WebApplicationContext方法有三:
? ? ? ? ? ? (1) 在構造方法中已經傳遞WebApplicationContext參數,這是只需要進行一些設置就可以了。
? ? ? ? ? ? (2)WebApplicationContext已經存在在ServletContext中,這時只需要配置Servlet時將ServletContext中的WebApplicationContext的name配置到contextAttribute屬性就可以了。例如ServletContext中有個叫haha的WebApplicationContext,可以如下設置:
? ? ? ? ? ? (3)自己創建一個WebApplicationContext。正常情況下使用的該方式。創建過程在createWebApplicationContext方法中,createWebApplicationContext內部有調用了configureAndRefreshWebApplicationContext方法:
? ? ? ? 需要注意的是,在configureAndRefreshWebApplicationContext方法中為wac添加了監聽器,
? ? ? ? SourceFilteringListener可以根據參數進行選擇,所以實際監聽的是ContextRefreshListener所監聽的事件。ContextRefreshListener是FramewoServlet的內部類,監聽ContextRefreshedEvent事件,
? ? ? ? 再回到initWebApplicationContext方法,可以看到后面根據refreshEvenReceived標志來判斷是否要運行onRefresh.
? ??????設置WebApplicationContext的三種方法中,第一種和第三種都已經refresh過了,只有第二種沒有,會調用onRefresh。onRefresh只會別調用一次,而DispatcherServlet正是通過重寫該方法實現初始化的。
????????將WebApplicationContext設置到ServletContext中
? ? ? ? 最后,根據publishContext標志判斷是否將創建出來的WebApplicationContext設置到ServletContext中。
9.4? DispatcherServlet
? ? ? ? onRefresh方法是DispatcherServlet的入口方法。
? ? ? ? initStrategies就是初始化9個組件,以LocalResolver為例分析具體的初始化方式:
需要注意的是,context指的是WebApplicationContext,而不是ServletContext。
? ? ? ? className來自classNames,calssNames又來自value,value來自defaultStragies.getProperty(key).
? ??????defaultStragies是DispatcherServlet類所在包下的DEFAULT_STRATEGES_PATH文件定義的屬性,值是DispatcherServlet.properties。
9.5? 小結
????????HttpServletBean:作用是將Servlet中配置的參數設置到相應的屬性
????????FreamworkServlet:初始化WebApplicationContext、初始化FreamworkServlet
????????DispatcherServlet:初始化自身的9個組件
第10章? SpringMVC之用
? ? ? ? 本章分析SpringMVC是如何運行的,是怎么處理請求的。首先分析HttpServletBean、FreamworkServlet和DispatcherServlet這三個Servlet,目的是明白Servlet容器將請求交
10.1? HttpServletBean
? ??????HttpServletBean在處理請求中沒有涉及相應的請求處理。
10.2? FrameworkServlet
? ? ? ? Servlet處理過程:從Servlet的service方法開始,然后再HttpServlet的service方法中根據不同類型將請求路由到doGet、doHead、doPost、doPut、doDelete、doOption、doTrace,并做了doHead、doOption、doTrace的默認實現。
? ??????FrameworkServlet重寫了service、doGet、doPost、doPut、doDelete、doOption、doTrace,在service增加了對PATCH類型的處理
? ? ? ? 以下是service和doGet的代碼:
? ? ? ? 由上可以看出,將請求合并到processRequest中。
????????LocaleContext:存放著Locale(本地化信息);RequestAttributes:是spring的一個接口,通過它可以get/set/removeAttribute,根據scope參數判斷操作request還是session,具體使用的是ServletRequestAttributes,ServletRequestAttributes里面封裝了request、response、session,通過get就可以獲得。
? ? ? ? LocaleContextHolder,是抽象類,里面的方法是static的,可以直接使用。
????????RequestContextHolder也是一樣的道理。
? ??????FrameworkServlet工作流程:首先,在service方法中添加對PATCH的處理,并將所需要自己處理的請求集中到processRequest進行統一處理。然后,processRequest將處理邏輯交給模板方法doService,在doService的的前后使用request獲取LocaleContexthe和RequestAttributes進行保存,處理完之后恢復。最后,發布ServletRequesthandledEvent事件。
10.3? DispatcherServlet
? ??????DispatcherServlet里面執行處理的入口方法是doService。doService將處理交給doDispatch進行具體處理,在doDispatch處理前doService做了一些事情:首先判斷是不是include請求,如果是則對request的Attribute做個快照備份,等doDispatch處理完之后進行還原,
????????對request設置的屬性中,前面4個屬性webApplicationContext、localeResolver、themeResolver和themeSource在Handler和view中使用。后面3個屬性都和flashMap相關,主要用于Redirect轉發是參數的傳遞。
? ? ? ? doDispatch的任務:(1)根據request找到Handler? ? (2)根據Handler找到對應的HandlerAdapter????(3)用HandlerAdapter處理Handler? ?(4)調用processDispatchResult方法處理上面處理之后的返回結果。
? ? ? ? Hanlder :處理器,直接對應MVC中的C.
? ? ? ? HandlerMapping :用來查找Handler.
? ? ? ? handlerAdapter :適配器,調用具體的Handler對請求進行處理。