作者:OnlyLoveVivian 來源:https://blog.csdn.net/OnlyLoveVivian/article/details/73928067
web應(yīng)用啟動(dòng)做了什么?
讀取web.xml文件
- web.xml常用配置參數(shù):
1).context-param(上下文參數(shù)) 2).listener(監(jiān)聽器配置參數(shù)) 3).filter(過濾器配置參數(shù)) 4).servle(servlet頁面參數(shù)) 5).其他 - 讀取順序:1)>>>2)>>>3)>>>4)(5))(具體對(duì)應(yīng)的執(zhí)行順序也是如此) - 原理及過程 1)應(yīng)用在服務(wù)器上啟動(dòng),容器按上述順序自動(dòng)讀取web.xml中的參數(shù) 2)容器創(chuàng)建一個(gè)上下文對(duì)象,即ServletContext,整個(gè)web應(yīng)用共享這個(gè)對(duì)象 3)容器將讀取到的context-param配置參數(shù)轉(zhuǎn)化為鍵值對(duì),封裝到ServletContext 4)創(chuàng)建監(jiān)聽器對(duì)象(Servlet容器實(shí)例化所有監(jiān)聽器,回調(diào)無參構(gòu)造方法,調(diào)用init初始化方法) 5)創(chuàng)建過濾器對(duì)象(Servlet容器實(shí)例化所有過濾器,回調(diào)無參構(gòu)造方法,調(diào)用init初始化方法) 注意:此時(shí)只是web應(yīng)用啟動(dòng)時(shí)的讀取文件以及初始化階段,客戶端沒有發(fā)送的請(qǐng)求的情況下不會(huì)有其他任何操作
瀏覽器到服務(wù)器解析?
A.瀏覽器發(fā)送請(qǐng)求到服務(wù)器
1.在瀏覽器地址欄輸入請(qǐng)求地址,瀏覽器解析請(qǐng)求URL,解析出IP地址等信息(域名解析)
2.解析后的URL信息封裝成HTTP報(bào)文
3.瀏覽器創(chuàng)建一個(gè)socket調(diào)用send()方法將HTTP報(bào)文發(fā)送到服務(wù)器(以流的方式)
B.服務(wù)器接收到瀏覽器請(qǐng)求
1.web容器也會(huì)創(chuàng)建一個(gè)socket并且調(diào)用receive()方法接收瀏覽器發(fā)送過來的HTTP報(bào)文(攜帶有IP地址,請(qǐng)求參數(shù)等信息)
2.服務(wù)器解析請(qǐng)求信息,將請(qǐng)求到的靜態(tài)或動(dòng)態(tài)資源利用sokcet調(diào)用send()方法發(fā)送給瀏覽器
3.瀏覽器利用sokcet調(diào)用receive()方法接收服務(wù)器端發(fā)送的資源,例如html,jsp等
4.瀏覽器解析資源,有可能進(jìn)行再次請(qǐng)求(例如請(qǐng)求css/js等文件資源),遇到有html或jsp代碼將對(duì)腳本標(biāo)簽進(jìn)行渲染
jsp?
什么是jsp?
jsp是一種運(yùn)行在服務(wù)器端的腳本語言,是一種軟件開發(fā)者可以動(dòng)態(tài)響應(yīng)給客戶端的web網(wǎng)頁技術(shù)標(biāo)準(zhǔn)。
jsp運(yùn)行原理及過程?
-本質(zhì)上jsp只是一個(gè)帶有.jsp后綴的腳本語言文件,并不能直接在jvm(虛擬機(jī))上運(yùn)行,所以需要將其轉(zhuǎn)換為一個(gè)Servlet類,才能通過jvm解釋執(zhí)行:
1)客戶端發(fā)送請(qǐng)求到服務(wù)器,web容器通過jsp引擎將jsp文件轉(zhuǎn)換為一個(gè)Servlet類源文件(.JAVA)(如果是第一次訪問或jsp文件被修改過,那么將會(huì)重新轉(zhuǎn)換為一個(gè)新的Servlet類)
2)轉(zhuǎn)換過來的Servlet類進(jìn)一步被java編譯器編譯成字節(jié)碼文件(.class)
3)字節(jié)碼文件被系統(tǒng)類加載器裝載到j(luò)vm上,開始初始化、執(zhí)行

Servlet?
什么是Servlet?
Java Servlet 是運(yùn)行在 Web 服務(wù)器或應(yīng)用服務(wù)器上的程序,它是作為來自 Web 瀏覽器或其他 HTTP 客戶端的請(qǐng)求和 HTTP 服務(wù)器上的數(shù)據(jù)庫或應(yīng)用程序之間的中間層。
Servlet創(chuàng)建?
1. 創(chuàng)建一個(gè)類,實(shí)現(xiàn)HttpServlet接口(HttpServlet繼承于GenericServlet,GenericServlet(實(shí)現(xiàn)類)繼承于Servlet接口)
2. 右鍵—新建Servlet(選擇配置文件還是注解虛擬路徑)
3. 重寫doGet()和doPost()方法處理請(qǐng)求
Servlet運(yùn)行原理?
1. Servlet沒有main方法不能直接獨(dú)立運(yùn)行。所以需要依賴于web容器(如Tomcat),由這個(gè)容器來控制servlet從創(chuàng)建到銷毀的過程
2.容器啟動(dòng)的時(shí)候,只會(huì)讀取xml配置文件,如果不發(fā)生請(qǐng)求servlet是不會(huì)被加載運(yùn)行的
3.客戶端第一次發(fā)送請(qǐng)求,服務(wù)器接收到請(qǐng)求后,解析請(qǐng)求參數(shù)并封裝成該請(qǐng)求對(duì)應(yīng)的HttpServletRequest和HttpServletResponse對(duì)象以給容器使用
4.根據(jù)URL匹配容器中的servlet實(shí)例,若沒有容器將創(chuàng)建和實(shí)例化一個(gè)servlet,若有則進(jìn)入下一步(實(shí)例化之前類加載器將字節(jié)碼文件加載過來)
5.容器調(diào)用servlet實(shí)例的init()方法完成初始化工作
6.調(diào)用service方法處理請(qǐng)求,判斷請(qǐng)求方式是get還是post,再調(diào)用業(yè)務(wù)邏輯層的方法完成數(shù)據(jù)交互
7.將請(qǐng)求資源響應(yīng)給客戶端
8.服務(wù)器關(guān)閉(或者更新servlet文件),servlet實(shí)例調(diào)用destroy()方法,servlet實(shí)例被銷毀

Servlet生命周期?
1.當(dāng)servlet實(shí)例調(diào)用init()方法實(shí)例化的時(shí)候,servlet的生命周期開始
2.當(dāng)servlet實(shí)例調(diào)用destroy()方法的時(shí)候,servlet被銷毀,生命周期結(jié)束
注意
- 1.servlet實(shí)例只會(huì)被加載一次,init()方法、destroy()方法也只會(huì)被調(diào)用一次
- 2.只有創(chuàng)建的對(duì)象會(huì)每請(qǐng)求一次就會(huì)創(chuàng)建一對(duì)(requset和response)
- 3.如果需要在實(shí)例被創(chuàng)建和加載的時(shí)候就完成初始化,則可以如下設(shè)置參數(shù)
@requires_authorization <servlet> <servlet-name>類名</servlet-name> <servlet-class>包名.類名</servlet-class> <load-on-startup>優(yōu)先級(jí)別(數(shù)字)</load-on-startup> </servlet>
- 4.對(duì)于某些servlet沒有元素,但又想提前初始化則可以進(jìn)行上述配置,否則需要配置參數(shù)
- 5.get和post請(qǐng)求
a. get請(qǐng)求只能以字符串形式傳遞參數(shù)名和值,直接跟在URL后,安全性差;post請(qǐng)求在請(qǐng)求頭中,較為安全,并且傳遞數(shù)據(jù)沒有限制
b. get傳輸數(shù)據(jù)量較小;post傳輸數(shù)據(jù)量大
c. get請(qǐng)求服務(wù)器接收效果不好,不能判斷是否完成發(fā)送;post方式是先發(fā)送長(zhǎng)度,可以判斷是否發(fā)送完成