Java面試題整理html
一、SpringMVC的執行流程前端
- 用戶發送請求至前端控制器DispatcherServlet
- DispatcherServlet收到請求調用HandlerMapping處理器映射器。
- 處理器映射器找到具體的處理器,生成處理器對象及處理器攔截器(若是有則生成)一併返回給DispatcherServlet。
- DispatcherServlet調用HandlerAdapter處理器適配器
- HandlerAdapter通過適配調用具體的處理器(Controller,也叫後端控制器)。
- Controller執行完成返回ModelAndView
- HandlerAdapter將controller執行結果ModelAndView返回給DispatcherServlet
- DispatcherServlet將ModelAndView傳給ViewReslover視圖解析器
- ViewReslover解析後返回具體View
- DispatcherServlet根據View進行渲染視圖(即將模型數據填充至視圖中)。
- DispatcherServlet響應用戶
二、JVM內存溢出具體指哪些內存溢出?都會拋出什麼異常?java
- JVM管理兩種類型的內存,堆和非堆。堆是在 Java 虛擬機啓動時建立的。簡單來講堆就是留給開發人員使用的;非堆就是JVM留給本身用的,運行期內GC不會釋放其空間。
- 堆內存的分配使用
-Xms
和-Xmx
兩個參數指定,默認值分別是系統內存的1/64
和1/4
。默認空餘堆內存小於40%
時,JVM就會增大堆直到-Xmx
的最大限制;空餘堆內存大於70%
時,JVM會減小堆直到-Xms
的最小限制。所以服務器通常設置-Xms、 -Xmx
相等以免在每次GC 後調整堆的大小。通常的要將-Xms
和-Xmx
選項設置爲相同,而-Xmn
爲1/4
的-Xmx
值,建議堆的最大值設置爲可用內存的最大值的80%
。堆的最大值受限於系統使用的物理內存。- 非堆內存也叫永久保留區域,用於存放
Class
和Meta
信息。
三、String類爲何是不可變類?面試
- 緩存池
- hashcode
- 多線程中不肯定值
四、經常使用JVM設置參數有哪些?redis
- -Xms 設置JVM最小可用內存
- -Xmx 設置JVM最大可用內存
- -Xmn 設置年輕代大小
- -Xss 設置每一個線程的堆棧大小(在相同物理內存下,減少這個值能生成更多的線程。可是也不能無限生成,最多3000~5000個)
- -XX:NewRatio 設置年輕代(包括Eden和兩個Survivor區)與年老代的比值。(設置爲4,則年輕代與年老代所佔比值爲1:4,年輕代佔整個堆棧的1/5)
- -XX:SurvivorRatio 設置年輕代中Eden區與Survivor區的大小比值(設置爲4,則兩個Survivor區與一個Eden區的比值爲2:4,一個Survivor區佔整個年輕代的1/6)
- -XX:MaxPermSize 設置持久代大小
- -XX:MaxTenuringThreshold 設置垃圾最大年齡(若是設置爲0的話,則年輕代對象不通過Survivor區,直接進入年老代。對於年老代比較多的應用,能夠提升效率.若是將此值設置爲一個較大值,則年輕代對象會在Survivor區進行屢次複製,這樣能夠增長對象再年輕代的存活時間,增長在年輕代即被回收的概論)
五、談談Spring事物傳播特性算法
REQUIRED
若是存在一個事務,則支持當前事務。若是沒有事務則開啓一個新的事務MANDATORY
支持當前事務,若是當前沒有事務,就拋出異常NEVER
以非事務方式執行,若是當前存在事務,則拋出異常NOT_SUPPORTED
以非事務方式執行操做,若是當前存在事務,就把當前事務掛起REQUIRES_NEW
新建事務,若是當前存在事務,把當前事務掛起SUPPORTS
支持當前事務,若是當前沒有事務,就以非事務方式執行NESTED
支持當前事務,新增Save Point點,與當前事務同步提交或回滾。
嵌套事務一個很是重要的概念就是內層事務依賴於外層事務。外層事務失敗時,會回滾內層事務所作的動做。而內層事務操做失敗並不會引發外層事務的回滾NESTED
與REQUIRES_NEW
的區別 ?
- 它們很是 相似,都像一個嵌套事務,若是不存在一個活動的事務,都會開啓一個新的事務。
- 使用
PROPAGATION_REQUIRES_NEW
時,內層事務與外層事務就像兩個獨立的事務同樣,一旦內層事務進行了提交後,外層事務不能對其進行回滾。兩個事務互不影響。兩個事務不是一個真正的嵌套事務。同時它須要JTA
事務管理器的支持。- 使用
PROPAGATION_NESTED
時,外層事務的回滾能夠引發內層事務的回滾。而內層事務的異常並不會致使外層事務的回滾,它是一個真正的嵌套事務。
六、MySql索引的類型和實現方式?sql
七、Tomcat請求的處理流程?shell
八、如何防止Sql注入?數據庫
‘or 1 = 1 –
sql
拼接九、談談HashMap、ConcurrnetHashMapjson
HashMap
null
key和 null
valuefail-fast
機制,多線程修改會產生ConcurrentModificationException
)Hashtable
和Collections.synchronizedMap(hashMap)
,不過這兩個方案基本上是對讀寫進行加鎖操做,一個線程在讀寫元素,其他線程必須等待,性能可想而知。ConcurrnetHashMap 佔小狼的博客
不容許null
的key和value
Jdk1.7
jdk1.8
拋棄了Segment
分段鎖機制。利用CAS
+Synchronized
來保證併發更新的安全,底層採用數組+鏈表+紅黑樹的存儲結構;
Node[] table:默認爲null,初始化發生在第一次插入操做(initTable
方法),默認大小爲16
的數組,用來存儲Node節點數據,擴容時大小老是2的冪次方
nextTable:默認爲null,擴容時新生成的數組,其大小爲原數組的兩倍;
sizeCtl :默認爲0,用來控制table的初始化和擴容操做;
Node:保存key
,value
及key
的hash
值的數據結構。其中value
和next
都用volatile
修飾,保證併發的可見性。
class Node<K,V> implements Map.Entry<K,V> { final int hash; final K key; volatile V val; volatile Node<K,V> next; ...... }
table初始化
Unsafe.compareAndSwapInt
方法去修改sizeCtl的值爲-1
,有且只有一個線程可以修改爲功,其它線程經過Thread.yield()讓出CPU時間片等待table初始化完成。put
操做
CAS
+synchronized
實現併發插入或更新操做spread
方法計算hashcode值(n - 1) & hash
定位table
數組索引位置Unsafe.getObjectVolatile
方法獲取table
中對應的索引到元素fnull
,說明table
中這個位置第一次插入元素,利用Unsafe.compareAndSwapObject
方法插入Node節點。若是CAS成功,說明Node節點已經插入,隨後addCount(1L, binCount)
方法會檢查當前容量是否須要進行擴容。若是CAS失敗,說明有其它線程提早插入了節點,自旋從新嘗試
在這個位置插入節點。十、JVM GC(minor gc,full gc)
JVM垃圾算法:
- 引用計數法(循環引用問題)
- 可達性分析(思路就是經過一系列名爲GC Roots**的對象做爲起始點,從這些節點開始向下搜索,搜索所走過的路徑稱爲引用鏈(Reference Chain),當一個對象到GC Roots沒有任何引用鏈相連時,則證實此對象是不可用的)。Java中能夠被做爲GC Roots中的對象有:
- 虛擬機棧(棧楨中的本地變量表)中的引用的對象
- 方法區中的類靜態屬性引用的對象
- 方法區中的常量引用的對象
- 本地方法棧中JNI(Native方法)的引用的對象
垃圾回收算法:
- 標記-清除算法(Mark-Sweep) 【會產生大量碎片】
- 複製算法(Copying) 【內存被壓縮一半,效率低】
- 標記-整理算法(Mark-Compact) 【將存活對象移向內存的一端。而後清除端邊界外的對象】
- 分代收集算法(Generational Collection)
- 新生代(複製算法,年齡>15就被移動到老生代中)
- Eden
- Survivor 0(From),Survivor 1(To)
- Young GC ,也叫 Minor GC
- 觸發條件:
- 新生代採用「空閒指針」的方式來控制GC觸發,指針保持最後一個在新生代分配的對象位置,當有新的對象要分配內存時,用於檢查空間是否足夠,不夠就觸發GC
- 老生代(標記-整理算法,通常通過2次以上標記)
- Full GC ,也叫Major GC
- 觸發條件:
- 老生代空間不足(避免建立過大對象)
- Pemanet Generation空間不足 (增大Perm Gen空間,避免太多靜態對象)
- GC後晉升到老生代的平均大小大於老生代剩餘空間 (控制好新生代和舊生代的比例)
- 手動調用System.gc();(垃圾回收不要手動觸發,儘可能依靠JVM自身的機制)
垃圾回收器 :
[參考文章]:
十一、什麼CAS,什麼是ABA問題,如何解決?
- CAS(Compare and Swap),比較並交換,實現併發算法時經常使用到的一種技術
- CAS的思想很簡單:三個參數,一個當前內存值V、舊的預期值A、即將更新的值B,當且僅當預期值A和內存值V相同時,將內存值修改成B並返回true,不然什麼都不作,並返回false。
- 若是變量V初次讀取的時候是A,而且在準備賦值的時候檢查到它仍然是A。若是在這段期間曾經被改爲B,而後又改回A,那CAS操做就會誤認爲它歷來沒有被修改過。針對這種狀況,java併發包中提供了一個帶有標記的原子引用類
AtomicStampedReference
,它能夠經過控制變量值的版原本保證CAS的正確性。
十二、Spring中的IOC和AOP是如何實現的?
- IOC是使用Java的反射機制實現的
- AOP是根據動態代理機制實現的
1三、什麼是SpringBeans?
具體說來,它是被Spring框架容器初始化、配置和管理的對象。
1四、說說Dubbo的內部實現原理?
1五、瞭解Netty麼?
1六、說說什麼是NIO、AIO?
1七、經常使用的設計模式及好處?
1八、Java IO中常用的類?
1九、瞭解Java中的線程池麼?
20、Java中都有哪些鎖?
2一、MySql數據庫都有哪些引擎?它們的區別是什麼?
2二、談談MySql索引的類型和實現方式?
- 惟一索引 惟一索引是不容許其中任何兩行具備相同索引值的索引。當現有數據中存在重複的鍵值時,大多數數據庫不容許將新建立的惟一索引與表一塊兒保存。數據庫還可能防止添加將在表中建立重複鍵值的新數據。例如,若是在employee表中職員的姓(lname)上建立了惟一索引,則任何兩個員工都不能同姓。
- 主鍵索引 數據庫表常常有一列或列組合,其值惟一標識表中的每一行。該列稱爲表的主鍵。 在數據庫關係圖中爲表定義主鍵將自動建立主鍵索引,主鍵索引是惟一索引的特定類型。該索引要求主鍵中的每一個值都惟一。當在查詢中使用主鍵索引時,它還容許對數據的快速訪問。
- 彙集索引 在彙集索引中,表中行的物理順序與鍵值的邏輯(索引)順序相同。一個表只能包含一個彙集索引。
2三、MySql慢查詢如何定位和優化?
2四、JVM內置了哪些垃圾回收器?
2五、什麼是Fail-Fast、Fail-Safe模式?
2六、說說ThreadLocal
2七、知道volatile關鍵字麼?
- 內存可見性
- 禁止指令重排
- 不能保證原子性
內存可見性:通俗來講就是,線程A對一個volatile變量的修改,對於其它線程來講是可見的,即線程每次獲取volatile變量的值都是最新的。
不能保證原子性
操做普通變量的流程
讀操做會優先讀取工做內存的數據,若是工做內存中不存在,則從主內存中拷貝一份數據到工做內存中;寫操做只會修改工做內存的副本數據,這種狀況下,其它線程就沒法讀取變量的最新值。
volatile關鍵字修飾的變量
對於volatile變量,讀操做時JMM會把工做內存中對應的值設爲無效,要求線程從主內存中讀取數據;寫操做時JMM會把工做內存中對應的數據刷新到主內存中,這種狀況下,其它線程就能夠讀取變量的最新值。
2八、synchronized關鍵字
2九、使用過SpringCloud麼?
30、知道AQS(同步器)麼?
3一、Spring事物的隔離級別?
3二、MyBatis的執行流程?
3三、Linux經常使用命令
3四、Redis的數據類型、經常使用命令和使用場景?
Redis
經常使用的數據類型有:String
、List
、Set
、Sorted Set
、Hash
- 操做
KEY
經常使用命令:
DEL
key 若是存在刪除鍵DUMP
key 返回存儲在指定鍵的值的序列化版本EXISTS
key 此命令檢查該鍵是否存在EXPIRE
key seconds 指定鍵的過時時間EXPIREAT
key timestamp 指定的鍵過時時間。在這裏,時間是在Unix時間戳格式PEXPIRE
key milliseconds 設置鍵以毫秒爲單位到期PEXPIREAT
key milliseconds-timestamp 設置鍵在Unix時間戳指定爲毫秒到期KEYS
pattern 查找與指定模式匹配的全部鍵MOVE
key db 移動鍵到另外一個數據庫PERSIST
key 移除過時的鍵PTTL
key 以毫秒爲單位獲取剩餘時間的到期鍵。TTL
key 獲取鍵到期的剩餘時間。RANDOMKEY
從Redis返回隨機鍵RENAME
key newkey 更改鍵的名稱RENAMENX
key newkey 重命名鍵,若是新的鍵不存在TYPE
key 返回存儲在鍵的數據類型的值。- String
- 使用場景:普通單值存儲、
JSON
格式存儲、數字存儲- 經常使用命令:
SET
、GET
、MSET
、MGET
、SETEX
、SETNX
、INCR
、INCRBY
、APPEND
- List 【雙向鏈表,列表的最大長度爲2^32 - 1,也即每一個列表支持超過40億個元素】
- 使用場景:關注列表、粉絲列表。輕量級消息隊列,生產者
push
,消費者pop/bpop
。- 經常使用命令:
BLPOP
BLPOP key1 [key2 ] timeout
取出並獲取列表中的第一個元素,或阻塞,直到有可用BRPOP
BRPOP key1 [key2 ] timeout
取出並獲取列表中的最後一個元素,或阻塞,直到有可用BRPOPLPUSH
BRPOPLPUSH source destination timeout
從列表中彈出一個值,它推到另外一個列表並返回它;或阻塞,直到有可用LINDEX
LINDEX key index
從一個列表其索引獲取對應的元素LINSERT
LINSERT key BEFORE|AFTER pivot value
在列表中的其餘元素以後或以前插入一個元素LLEN
LLEN key
獲取列表的長度LPOP
LPOP key
獲取並取出列表中的第一個元素LPUSH
LPUSH key value1 [value2]
在前面加上一個或多個值的列表LPUSHX
LPUSHX key value
在前面加上一個值列表,僅當列表中存在LRANGE
LRANGE key start stop
從一個列表獲取各類元素LREM
LREM key count value
從列表中刪除元素LSET
LSET key index value
在列表中的索引設置一個元素的值LTRIM
LTRIM key start stop
修剪列表到指定的範圍內RPOP
RPOP key
取出並獲取列表中的最後一個元素RPOPLPUSH
RPOPLPUSH source destination
刪除最後一個元素的列表,將其附加到另外一個列表並返回它RPUSH
RPUSH key value1 [value2]
添加一個或多個值到列表RPUSHX
RPUSHX key value
添加一個值列表,僅當列表中存在- Hash【Redis Hash對應Value內部實際就是一個HashMap,這個Hash的成員比較少時Redis爲了節省內存會採用相似一維數組的方式來緊湊存儲,而不會採用真正的HashMap結構】
- 使用場景:假設有多個用戶及對應的用戶信息,能夠用來存儲以用戶ID爲key,將用戶信息序列化爲好比json格式作爲value進行保存
- 經常使用命令:
HDEL
HDEL key field[field...]
刪除對象的一個或幾個屬性域,不存在的屬性將被忽略HEXISTS
HEXISTS key field
查看對象是否存在該屬性域HGET
HGET key field
獲取對象中該field屬性域的值HGETALL
HGETALL key
獲取對象的全部屬性域和值HINCRBY
HINCRBY key field value
將該對象中指定域的值增長給定的value,原子自增操做,只能是integer的屬性值可使用HINCRBYFLOAT
HINCRBYFLOAT key field increment
將該對象中指定域的值增長給定的浮點數HKEYS
HKEYS key
獲取對象的全部屬性字段HVALS
HVALS key
獲取對象的全部屬性值HLEN
HLEN key
獲取對象的全部屬性字段的總數HMGET
HMGET key field[field...]
獲取對象的一個或多個指定字段的值HSET
HSET key field value
設置對象指定字段的值HMSET
HMSET key field value [field value ...]
同時設置對象中一個或多個字段的值HSETNX
HSETNX key field value
只在對象不存在指定的字段時才設置字段的值HSTRLEN
HSTRLEN key field
返回對象指定field的value的字符串長度,若是該對象或者field不存在,返回0.HSCAN
HSCAN key cursor [MATCH pattern][COUNT count]
相似SCAN
命令- Set
- 使用場景:微博應用中,每一個用戶關注的人存在一個集合中,就很容易實現求兩我的的共同好友功能。
- 經常使用命令:
SADD
SADD key member [member ...]
添加一個或者多個元素到集合(set)裏SACRD
SCARD key
獲取集合裏面的元素數量SDIFF
SDIFF key [key ...]
得到隊列不存在的元素SDIFFSTORE
SDIFFSTORE destination key [key ...]
得到隊列不存在的元素,並存儲在一個關鍵的結果集SINTER
SINTER key [key ...]
得到兩個集合的交集SINTERSTORE
SINTERSTORE destination key [key ...]
得到兩個集合的交集,並存儲在一個集合中SISMEMBER
SISMEMBER key member
肯定一個給定的值是一個集合的成員SMEMBERS
SMEMBERS key
獲取集合裏面的全部keySMOVE
SMOVE source destination member
移動集合裏面的一個key到另外一個集合SPOP
SPOP key [count]
獲取並刪除一個集合裏面的元素SRANDMEMBER
SRANDMEMBER key [count]
從集合裏面隨機獲取一個元素SREM
SREM key member [member ...]
從集合裏刪除一個或多個元素,不存在的元素會被忽略SUNION
SUNION key [key ...]
添加多個set元素SUNIONSTORE
SUNIONSTORE destination key [key ...]
合併set元素,並將結果存入新的set裏面SSCAN
SSCAN key cursor [MATCH pattern] [COUNT count]
迭代set
裏面的元素[參考連接]
3五、微服務中如何保證數據的一致性?
- 一、同步事件服務,經過發送同步消息通知來保證
- 二、異步事件服務
- 三、外部事件服務(額外的網絡通訊)
- 四、可靠事件通知(1. 事件的正確發送; 2. 事件的重複消費。)
- 五、業務補償機制(數據一致性的時效性很低,多個服務經常可能處於數據不一致的狀況。)
- 六、TCC(try、confirm、cancel)
3六、ZooKeeper的使用場景?
3七、經常使用數據結構及其實現?
3八、Docker/區塊鏈
3九、什麼狀況下會產生死鎖?
40、Redis有哪幾種數據淘汰策略?【redis 每服務客戶端執行一個命令的時候,會檢測使用的內存是否超額。若是超額,即進行數據淘汰。】
- volatile-lru:從已設置過時時間的數據集(server.db[i].expires)中挑選最近最少使用的數據淘汰
- volatile-ttl:從已設置過時時間的數據集(server.db[i].expires)中挑選將要過時的數據淘汰
- volatile-random:從已設置過時時間的數據集(server.db[i].expires)中任意選擇數據淘汰
- allkeys-lru:從數據集(server.db[i].dict)中挑選最近最少使用的數據淘汰
- allkeys-random:從數據集(server.db[i].dict)中任意選擇數據淘汰
- no-enviction(驅逐):禁止驅逐數據
4一、Redis一個字符串類型的值能存儲最大容量是多少?
- 根據Redis官網的說法,應該是521MBMB。其他的(list、set、hash)都是2的32次方。
4二、Redis集羣方案應該怎麼作?都有哪些方案?
4三、消息隊列的實現原理?
4四、說說類的加載順序?
- 父類的static靜態代碼塊
- 子類的static靜態代碼塊
- 類內部變量
- 靜態成員類
- 普通成員類
4五、併發包下都用過哪些類?
4六、Redis持久化方式?
4七、Linux下Redis安裝
- mkdir -p /usr/local/src/redis
- cd /usr/local/src/redis
- wget http://download.redis.io/releases/redis-2.8.11.tar.gz
- tar xzfredis-2.8.11.tar.gz
- cdredis-2.8.11
- make
- makeinstall
- 修改配置文件,使用redis後臺運行:
- vi /etc/redis.conf
- daemonize yes
- 啓動
- redis-server/etc/redis.conf
4八、Redis事物是如何實現的?
Redis事務一般會使用
MULTI,EXEC,WATCH
等命令來完成watch指令在redis事物中提供了CAS的行爲。爲了檢測被watch的keys在是否有多個clients同時改變引發衝突,這些keys將會被監控。若是至少有一個被監控的key在執行exec命令前被修改,整個事物不執行任何動做,從而保證原子性操做,而且執行exec會獲得null的結果。
4九、Redis主從、集羣?
50、TCP/IP三次握手、四次揮手
5一、流量控制與滑動窗口?
5二、什麼狀況下索引會失效?
5三、什麼是動態代理,都有哪些方式?
5四、知道一致性hash麼?
5五、數據庫的鎖(行鎖,表鎖,頁級鎖,意向鎖,讀鎖,寫鎖,悲觀鎖,樂觀鎖,以及加鎖的select sql方式)
5六、Java的線程模型?
使用一對一的線程模型實現的,一條Java線程就映射到一條輕量級進程之中。
Java線程調度:線程調度是指系統爲線程分配處理器使用權的過程
協同式調度
線程的執行時間由線程自己來控制,線程把本身的工做執行完了以後,要主動通知系統切換到另一個線程上。
搶佔式調度(Java使用的線程調度方式就是搶佔式調度)
那麼每一個線程將由系統來分配執行時間,線程的切換不禁線程自己來決定(在Java中,Thread.yield()可讓出執行時間,可是要獲取執行時間的話,線程自己是沒有什麼辦法的)
線程優先級(1-10,可設置,不靠譜)
Java線程的狀態
Java語言定義了5種線程狀態,在任意一個時間點,一個線程只能有且只有其中的一種狀態,這5種狀態分別以下。
新建(New):建立後還沒有啓動的線程處於這種狀態。
運行(Runable):Runable包括了操做系統線程狀態中的Running和Ready,也就是處於此狀態的線程有可能正在執行,也有可能正在等待着CPU爲它分配執行時間。
無限期等待(Waiting):處於這種狀態的線程不會被分配CPU執行時間,它們要等待被其餘線程顯式地喚醒。
如下方法會讓線程陷入無限期的等待狀態:
沒有設置Timeout參數的Object.wait()方法。
LockSupport.park()方法。
如下方法會讓線程進入限期等待狀態:
Thread.sleep()方法。
LockSupport.parkUntil()方法。
5七、Java中如何序列化一個對象?
//序列化: ObjectOutputStream os = new ObjectOutputStream( new FileOutputStream("C:/wxp.txt")); os.writeObject(user); os.close(); //反序列化 ObjectInputStream is = new ObjectInputStream( new FileInputStream("C:/wxp.txt")); User temp = (User) is.readObject();
5八、Java中多態的實現機制?
5九、數據庫三範式是什麼?
答案一:
答案二:
第一範式(1NF):
數據表中的每一列(字段),必須是不可拆分的最小單元,也就是確保每一列的原子性。
例如: userInfo: '山東省煙臺市 1318162008' 依照第一範式必須拆分紅userInfo: '山東省煙臺市' userTel: '1318162008'兩個字段
第二範式(2NF):
知足1NF後要求表中的全部列,都必需依賴於主鍵,而不能有 任何一列與主鍵沒有關係(一個表只描述一件事情)。例如:訂單表只能描述訂單相關的信息,因此全部的字段都必須與訂單ID相關。
產品表只能描述產品相關的信息,因此全部的字段都必須與產品ID相關。所以在同一張表中不能同時出現訂單信息與產品信息。
第三範式(3NF):
知足2NF後,要求:表中的每一列都要與主鍵直接相關,而不是間接相關(表中的每一列只能依賴於主鍵)
例如:訂單表中須要有客戶相關信息,在分離出客戶表以後,訂單表中只須要有一個用戶ID便可,而不能有其餘的客戶信息,由於其餘的用戶信息是直接關聯於用戶ID,而不是關聯於訂單ID。
60、數據庫ACID
6一、Redis高級應用及技巧
6二、MyBatis原理
6三、MQ的原理
6四、Tomcat Server處理一個http請求的過程
假設來自客戶的請求爲:
http://localhost:8080/wsota/wsota_index.jsp
1) 請求被髮送到本機端口8080,被在那裏偵聽的Coyote HTTP/1.1 Connector得到
2) Connector把該請求交給它所在的Service的Engine來處理,並等待來自Engine的迴應
3) Engine得到請求localhost/wsota/wsota_index.jsp,匹配它所擁有的全部虛擬主機Host
4) Engine匹配到名爲localhost的Host(即便匹配不到也把請求交給該Host處理,由於該Host被定義爲該Engine的默認主機)
5) localhost Host得到請求/wsota/wsota_index.jsp,匹配它所擁有的全部Context
6) Host匹配到路徑爲/wsota的Context(若是匹配不到就把該請求交給路徑名爲」"的Context去處理)
7) path=」/wsota」的Context得到請求/wsota_index.jsp,在它的mapping table中尋找對應的servlet
8) Context匹配到URL PATTERN爲*.jsp的servlet,對應於JspServlet類
9) 構造HttpServletRequest對象和HttpServletResponse對象,做爲參數調用JspServlet的doGet或doPost方法
10)Context把執行完了以後的HttpServletResponse對象返回給Host
11)Host把HttpServletResponse對象返回給Engine
12)Engine把HttpServletResponse對象返回給Connector
13)Connector把HttpServletResponse對象返回給客戶browser
6五、