設計模式:適配器模式(從一個接口態轉成另外一種接口),裝飾器模式(擴展示有接口的功能)html
常見的編碼:ASCII(128),ISO-8859-1(256),GB2312,GBK,GB18030,UTF-16,UTF-8java
編碼解碼
web中涉及的編碼:web
JS編碼:js文件的編碼與html的編碼不一致,因此默認設置下charset。encodeUrlComponent 兩次編碼解碼spring
多語言支持:Nginx 增長一個多語言轉換。sql
JVM體系結構:chrome
經過模擬一個計算機達到計算機所具備的功能:指令集,計算單元,尋址,寄存器,存儲。後端
類加載,執行引擎(解釋執行,JIT本地執行,寄存器執行)不一樣的jvm實現不一樣,內存區,本地方法調用設計模式
JVM工做機制瀏覽器
基於棧的工做機制:與平臺無關,指令緊湊,減小數據量spring-mvc
物理內存與虛擬內存:虛擬內存與物理內存 n:1 當一個虛擬內存不活躍時,會將該映射的物理內存移到磁盤文件中(頁面文件)。
內核空間與用戶空間,
Java內存組件:堆,線程,類and類加載,NIO,JNI
JVM內存結構:寄存器,堆,棧,方法區,常量池
JVM內存分配:靜態分配,堆分配,棧分配
JVM內存回收:根對象沒法到達的對象能夠回收(垃圾檢測),分代垃圾回收 y,s1,s2,old,perm
serial collector,parallel collector,cms collector
cms針對old和perm區,minor gc採用多線程
DisableExplicitGC,System.gc().變成空調,沒有釋放NIO,須要改爲 ExplicitGCInvokesConcurrent
direct memory 分析工具 sjdrectmem
Servlet容器:tomcat的啓動類 XX.startup.Tomcat,一個web應用對應一個StandardContext容器,添加的listener繼承了lifecyclelistener接口
globalwebXml>webfragement.xml>web.xml;Servlet被包裝成StandardWrapper
Servlet實例:DefaultServlet和JspServlet
Servlet體系結構:採用門面設計模式拿到該拿的數據
Servlet如何工做:經過 XX.http.mapper 找到對應的wrapper容器,必需要要執行filter鏈
Servlet中的listener:ServletContextListener在啓動後不能再添加新的,spring 的ContextLoadListener實現了該listener,初始化spring容器
Filter如何工做:多個filter串成一個FilterChain,url匹配:精確匹配,路勁匹配,後綴匹配
session與cookie是爲了保持用戶與後端服務器的交互狀態,cookie的數量與大小有限制
理解cookie:不超過50個,大小不超過4095
理解session:standardsession對象持久化到session.ser中,必須調用sevlet容器的stop方法,request.getSession() 建立
cookie安全與壓縮:cookie可修改(失效時間,加密,結合瀏覽器或ip特色的惟一key,httpOnly),有安全隱患,能夠採用gzip和deflate進行壓縮突破存儲限制,減小帶寬
分佈式session框架:應用可寫的session項和cookie項統一管理,session分佈式緩存存儲,InputHttpSession
跳轉應用,sessionId在全部域名下都寫入cookie中,另外根據用戶的私密信息生成惟一key(好比請求ip,證書文件,瀏覽器信息)。
表單重複提交:每次請求是帶上一個token,校驗token和session中的是否一致,請求後disable按鈕
多端session統一:cookie和session要統一,拿統一的session,二維碼掃碼登陸:PC定時拉取該二維碼登陸有沒有登陸,手機掃完以後,發送二維碼信息,用戶的sessionid,發送到服務,標誌校驗經過,把sessionid發送到終點,惟一信息。
tomcat的整體設計:
connector和container,container對應多個service,一個service能夠設置多個connector
connector負責請求數據和返回數據的封裝成request和response,處理這個請求由container完成
tomcat5中默認的connector是coyote。
container是責任鏈模式,包含engine>host>context>Wrapper,容器能夠在backgroudprocess中定義週期性的事件,
其餘組件:security,logger,session,mbeans,naming
門面模式
不能將本身的數據過多的暴露出去,經過一層門面進行限制,httprequest和httprequestfacade
觀察者模式
由 subject,concretesubject,observer組成,
LifecycleEvent定義主題,LifecycleSupport管理event和observer的關係
命令模式
把發出命令的責任和執行命令的責任分開 command,invoker,receiver組成,HttpProcessor和ContainerBase
責任鏈模式
責任鏈模式就是不少對象與對象的家引用造成一條鏈,例如tomcat中的pipeline和valve。
Jetty的基本架構:全部的擴展組件都做爲handler添加到server中,有handlerwrapper和handlercollection構成
Jetty的啓動過程:handler有父子關係,啓動註冊在jmx上的mbean,最後啓動connector
接受請求:基於http請求:connectorendpoint,ajp請求:基於ajp13parser上完成,NIO處理:監聽和處理分開
處理請求:ServletHolder 是 Servlet的裝飾類,添加到handler中
與Jboss集成:基於ajp集成
與tomcat的比較:短生命週期的鏈接採用tomcat,長鏈接採用jetty
spring的骨骼架構:核心爲bean,core,context,core是發現,創建和維護bean之間關係的幫助類,context是最終管理平臺,bean是業務模型。
核心組件:bean:BeanFactory,BeanDefinition,
ApplicationContext:繼承beanfactory和resourceloader,core:資源的訪問方式,context的資源加載,解析和描述委託給resolver
BeanFactoryPostProcessor和BeanPostProcessor:beanfactory和bean初始化時執行。
InitializingBean和DisposableBean 分佈在bean實例建立和銷燬時調用。
FactoryBean:不是預設的球模型,由用戶自定義
AOP的特性:繼承FactoryBean,以及月java Proxy實現動態代理
代理模式:爲實際對象建立代理對象,實際執行時,能夠增長一些對原對象的額外操做。
策略模式:完成某個操做有多種實現,根據不一樣場景選擇不一樣的實現,例如動態代理有cglib,jdk proxy等多種實現。
mvc的整體設計:dispatchServlet是核心,實現8個功能:initMultipartResolver 處理文件上傳;initLocalResolver 處理應用的國際化;initThemeResolver:定義一個主題;initHandlerMappings,請求映射關係;initHandlerAdapters,根據handler類型定義不一樣的處理規則;initHandlerExceptionsResolvers:handler出錯時統一處理;initRequestToViewNameTranslator;initViewResolver
control的整體設計:HandlerMapping和HandlerAdapters兩個組件提供,handlerMapping管理url與handler的對應關係,全部的interceptor必須實現HandlerInterceptor。HandlerAdapter幫助定義各類handler,默認提供4種。
整個調用從dispatch的doService方法開始。
Model設計:頁面渲染須要的參數存儲在modelmao中
view設計:InternalResourceViewResolver create和render頁面。
模板模式:大的邏輯已經定義,業務只須要實現一些具體步驟,例如spring的abstractview
將固定不變的腳本ibatis配置實現。
類層次結構:交互類型的框架 client,executor,session
設計策略:parametermap和resultmap,typehandler負責類型轉換
運行原理:session負責事務管理
sql解析:配置文件解析成statement
對象映射:DataExchange和AccessPlan實現真正的數據映射
工廠模式:DataExchangeFactory,DataSourceFactory。
整體架構:主要由app、context、runtime一些輔助類,暴露使用的有Velocity和VelocityEngine,context封裝了渲染所需的變量
解析:解析成JTree
事件處理:判空,include,取值$
經常使用優化:減小樹節點數量,
與jsp比較:ParserController將jsp編譯成servlet,jsp依賴servlet環境,編譯執行velocity反射執行
合成模式:部分總體模式,部分和總體都實現一個方法,來實現子處理
解釋器模式:將必定格式的文本解釋成特定的數據結構,將vm解釋成AST抽象語法樹。
現實存在的問題:頁面大,cpu壓力大,臨時對象多,gc影響大,空白字符多,浪費帶寬
高效的模板引擎:將velocity編譯java類,將反射變成直接調用,字符輸出改爲字節輸出
其餘方法:去掉非中文空格,壓縮tab和換行,合併相同的數據,異步渲染。
java的QPS上萬很難。
動靜區分
靜態化方案選擇
問題:是否一致性hash,是否使用esi,是否使用物理機,誰來壓縮,網卡選擇
共享cache,與應用拆分,進行回源
失效:時間驅動被動失效,主動失效:監控變化,java發佈,vm發佈
cdn化,cdn分佈全國,主動發purge給cache失效,二級cdn。
解決什麼問題,現有框架是否不能解決,是否是比其餘方案好
須要簡化開發的框架。
框架設計原則:ocp(開閉原則,擴展開放,修改關閉),LSP(里氏代換,凡是父類能用的地方,子類皆能夠);
DIP(依賴倒轉)依賴抽象,不依賴於具體,ISP(接口隔離):接口儘量單一,CARP(合成/聚合複用原則)儘量聚合/合成使用,不使用繼承。LOD(迪米特原則),一個對象應到對其餘對象細節儘量少的瞭解。
減小程序的封裝程度
簡單的程序複雜化
減小翻譯的代價
變的轉爲不變的