作者:OnlyLoveVivian 來源:https://blog.csdn.net/OnlyLoveVivian/article/details/73928067
web應用啟動做了什么?
讀取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))(具體對應的執(zhí)行順序也是如此) - 原理及過程 1)應用在服務器上啟動,容器按上述順序自動讀取web.xml中的參數(shù) 2)容器創(chuàng)建一個上下文對象,即ServletContext,整個web應用共享這個對象 3)容器將讀取到的context-param配置參數(shù)轉化為鍵值對,封裝到ServletContext 4)創(chuàng)建監(jiān)聽器對象(Servlet容器實例化所有監(jiān)聽器,回調無參構造方法,調用init初始化方法) 5)創(chuàng)建過濾器對象(Servlet容器實例化所有過濾器,回調無參構造方法,調用init初始化方法) 注意:此時只是web應用啟動時的讀取文件以及初始化階段,客戶端沒有發(fā)送的請求的情況下不會有其他任何操作
瀏覽器到服務器解析?
A.瀏覽器發(fā)送請求到服務器
1.在瀏覽器地址欄輸入請求地址,瀏覽器解析請求URL,解析出IP地址等信息(域名解析)
2.解析后的URL信息封裝成HTTP報文
3.瀏覽器創(chuàng)建一個socket調用send()方法將HTTP報文發(fā)送到服務器(以流的方式)
B.服務器接收到瀏覽器請求
1.web容器也會創(chuàng)建一個socket并且調用receive()方法接收瀏覽器發(fā)送過來的HTTP報文(攜帶有IP地址,請求參數(shù)等信息)
2.服務器解析請求信息,將請求到的靜態(tài)或動態(tài)資源利用sokcet調用send()方法發(fā)送給瀏覽器
3.瀏覽器利用sokcet調用receive()方法接收服務器端發(fā)送的資源,例如html,jsp等
4.瀏覽器解析資源,有可能進行再次請求(例如請求css/js等文件資源),遇到有html或jsp代碼將對腳本標簽進行渲染
jsp?
什么是jsp?
jsp是一種運行在服務器端的腳本語言,是一種軟件開發(fā)者可以動態(tài)響應給客戶端的web網頁技術標準。
jsp運行原理及過程?
-本質上jsp只是一個帶有.jsp后綴的腳本語言文件,并不能直接在jvm(虛擬機)上運行,所以需要將其轉換為一個Servlet類,才能通過jvm解釋執(zhí)行:
1)客戶端發(fā)送請求到服務器,web容器通過jsp引擎將jsp文件轉換為一個Servlet類源文件(.JAVA)(如果是第一次訪問或jsp文件被修改過,那么將會重新轉換為一個新的Servlet類)
2)轉換過來的Servlet類進一步被java編譯器編譯成字節(jié)碼文件(.class)
3)字節(jié)碼文件被系統(tǒng)類加載器裝載到jvm上,開始初始化、執(zhí)行
Servlet?
什么是Servlet?
Java Servlet 是運行在 Web 服務器或應用服務器上的程序,它是作為來自 Web 瀏覽器或其他 HTTP 客戶端的請求和 HTTP 服務器上的數(shù)據庫或應用程序之間的中間層。
Servlet創(chuàng)建?
1. 創(chuàng)建一個類,實現(xiàn)HttpServlet接口(HttpServlet繼承于GenericServlet,GenericServlet(實現(xiàn)類)繼承于Servlet接口)
2. 右鍵—新建Servlet(選擇配置文件還是注解虛擬路徑)
3. 重寫doGet()和doPost()方法處理請求
Servlet運行原理?
1. Servlet沒有main方法不能直接獨立運行。所以需要依賴于web容器(如Tomcat),由這個容器來控制servlet從創(chuàng)建到銷毀的過程
2.容器啟動的時候,只會讀取xml配置文件,如果不發(fā)生請求servlet是不會被加載運行的
3.客戶端第一次發(fā)送請求,服務器接收到請求后,解析請求參數(shù)并封裝成該請求對應的HttpServletRequest和HttpServletResponse對象以給容器使用
4.根據URL匹配容器中的servlet實例,若沒有容器將創(chuàng)建和實例化一個servlet,若有則進入下一步(實例化之前類加載器將字節(jié)碼文件加載過來)
5.容器調用servlet實例的init()方法完成初始化工作
6.調用service方法處理請求,判斷請求方式是get還是post,再調用業(yè)務邏輯層的方法完成數(shù)據交互
7.將請求資源響應給客戶端
8.服務器關閉(或者更新servlet文件),servlet實例調用destroy()方法,servlet實例被銷毀
Servlet生命周期?
1.當servlet實例調用init()方法實例化的時候,servlet的生命周期開始
2.當servlet實例調用destroy()方法的時候,servlet被銷毀,生命周期結束
注意
- 1.servlet實例只會被加載一次,init()方法、destroy()方法也只會被調用一次
- 2.只有創(chuàng)建的對象會每請求一次就會創(chuàng)建一對(requset和response)
- 3.如果需要在實例被創(chuàng)建和加載的時候就完成初始化,則可以如下設置參數(shù)
@requires_authorization <servlet> <servlet-name>類名</servlet-name> <servlet-class>包名.類名</servlet-class> <load-on-startup>優(yōu)先級別(數(shù)字)</load-on-startup> </servlet>
- 4.對于某些servlet沒有元素,但又想提前初始化則可以進行上述配置,否則需要配置參數(shù)
- 5.get和post請求
a. get請求只能以字符串形式傳遞參數(shù)名和值,直接跟在URL后,安全性差;post請求在請求頭中,較為安全,并且傳遞數(shù)據沒有限制
b. get傳輸數(shù)據量較??;post傳輸數(shù)據量大
c. get請求服務器接收效果不好,不能判斷是否完成發(fā)送;post方式是先發(fā)送長度,可以判斷是否發(fā)送完成