2019年最新alexa排名前100w的域名
時(shí)間:2023-02-10 16:12:01 | 來源:建站知識(shí)
時(shí)間:2023-02-10 16:12:01 來源:建站知識(shí)
2019年最新alexa排名前100w的域名,文件格式是csv,第一列是域名的id,第二列是域名名稱; 更改分?jǐn)?shù)為3,不允許動(dòng)態(tài)調(diào)分
文件:n459.com/file/25127180-477232455以下內(nèi)容無關(guān):
-------------------------------------------分割線---------------------------------------------
最近工作中有部分整改老接口的任務(wù),大部分與Spring的攔截器,Tomcat相關(guān),改到一些底層的代碼發(fā)現(xiàn),對(duì)基礎(chǔ)J2EE的知識(shí)有些遺忘,需要頻繁查閱,索性從頭系統(tǒng)的整理一下Servlet和Filter的知識(shí)。
1|0Servlet是什么
Servlet(Server Applet)是 Java Servlet 的簡(jiǎn)稱,是使用 Java 語言編寫的運(yùn)行在服務(wù)器端的程序。具有獨(dú)立于平臺(tái)和協(xié)議的特性,主要功能在于交互式地瀏覽和生成數(shù)據(jù),生成動(dòng)態(tài)Web內(nèi)容。通常來說,Servlet 是指所有實(shí)現(xiàn)了 Servlet 接口的類。Servlet的主要工作流程如下圖:
Servlet 的請(qǐng)求首先會(huì)被 HTTP 服務(wù)器(如 Apache)接收,HTTP 服務(wù)器只負(fù)責(zé)靜態(tài) HTML 頁面的解析,而 Servlet 的請(qǐng)求會(huì)轉(zhuǎn)交給 Servlet 容器,Servlet 容器會(huì)根據(jù) web.xml 文件中的映射關(guān)系,調(diào)用相應(yīng)的 Servlet,Servlet 再將處理的結(jié)果返回給 Servlet 容器,并通過 HTTP 服務(wù)器將響應(yīng)傳輸給客戶端。
Servlet 主要用于處理客戶端傳來的 HTTP 請(qǐng)求,并返回一個(gè)響應(yīng),它能夠處理的請(qǐng)求有 doGet() 和 doPost() 等。 Servlet 由 Servlet 容器提供,Servlet 容器是指提供了 Servlet 功能的服務(wù)器(如 Tomcat)。 Servlet 容器會(huì)將 Servlet 動(dòng)態(tài)加載到服務(wù)器上,然后通過 HTTP 請(qǐng)求和 HTTP 應(yīng)與客戶端進(jìn)行交互。
2|0Servlet的相關(guān)類及接口
Sun 公司提供了一系列的接口和類用于 Servlet 技術(shù)的開發(fā),其中最重要的接口是 javax.servlet.Servlet。在 Servlet 接口中定義了 5 個(gè)抽象方法,具體如下表:
Servlet 接口中的五個(gè)方法,其中 init()、service() 和 destroy() 方法可以表現(xiàn) Servlet 的生命周期,它們會(huì)在某個(gè)特定的時(shí)刻被調(diào)用。 針對(duì) Servlet 的接口,Sun 公司提供了兩個(gè)默認(rèn)的接口實(shí)現(xiàn)類:
GenericServlet 和
HttpServlet。其中,
GenericServlet 是一個(gè)抽象類,該類為 Servlet 接口提供了部分實(shí)現(xiàn),它并沒有實(shí)現(xiàn) HTTP 請(qǐng)求處理。
HttpServlet 是
GenericServlet 的子類,它繼承了
GenericServlet 的所有方法,并且為 HTTP 請(qǐng)求中的 GET 和 POST 等類型提供了具體的操作方法。通常情況下,編寫的 Servlet 類都繼承自 HttpServlet,在開發(fā)中使用最多的也是 HttpServlet 對(duì)象。
3|0Servlet的生命周期
在java程序中,任何對(duì)象都有其生命周期,Servlet也不例外;
圖 中描述了 Servlet 的生命周期。Servlet容器加載之后,按照功能的不同,大致可以將 Servlet 的生命周期分為三個(gè)階段,分別是初始化階段、運(yùn)行階段和銷毀階段。
3|1初始化階段
當(dāng)客戶端向 Servlet 容器發(fā)出 HTTP 請(qǐng)求要求訪問 Servlet 時(shí),Servlet 容器首先會(huì)解析請(qǐng)求,檢查內(nèi)存中是否已經(jīng)有了該 Servlet 對(duì)象,如果有,則直接使用該 Servlet 對(duì)象,如果沒有,則創(chuàng)建 Servlet 實(shí)例對(duì)象,然后通過調(diào)用 init() 方法實(shí)現(xiàn) Servlet 的初始化工作。需要注意的是,在 Servlet 的整個(gè)生命周期內(nèi),它的 init() 方法只能被調(diào)用一次。
3|2運(yùn)行階段
這是 Servlet 生命周期中最重要的階段,在這個(gè)階段中,Servlet 容器會(huì)為這個(gè)請(qǐng)求創(chuàng)建代表 HTTP 請(qǐng)求的 ServletRequest 對(duì)象和代表 HTTP 響應(yīng)的 ServletResponse 對(duì)象,然后將它們作為參數(shù)傳遞給 Servlet 的 service() 方法。 service() 方法從 ServletRequest 對(duì)象中獲得客戶請(qǐng)求信息并處理該請(qǐng)求,通過 ServletResponse 對(duì)象生成響應(yīng)結(jié)果。 在 Servlet 的整個(gè)生命周期內(nèi),對(duì)于 Servlet 的每一次訪問請(qǐng)求,Servlet 容器都會(huì)調(diào)用一次 Servlet 的 service() 方法,并且創(chuàng)建新的 ServletRequest 和 ServletResponse 對(duì)象,也就是說,service() 方法在 Servlet 的整個(gè)生命周期中會(huì)被調(diào)用多次。
3|3銷毀階段
當(dāng)服務(wù)器關(guān)閉或 Web 應(yīng)用被移除出容器時(shí),Servlet 隨著 Web 應(yīng)用的關(guān)閉而銷毀。在銷毀 Servlet 之前,Servlet 容器會(huì)調(diào)用 Servlet 的 destroy() 方法,以便讓 Servlet 對(duì)象釋放它所占用的資源。在 Servlet 的整個(gè)生命周期中,destroy() 方法也只能被調(diào)用一次。 在這里,Servlet 對(duì)象一旦創(chuàng)建就會(huì)駐留在內(nèi)存中等待客戶端的訪問,直到服務(wù)器關(guān)閉或 Web 應(yīng)用被移除出容器時(shí),Servlet 對(duì)象才會(huì)銷毀。
4|0Servlet作用位置及主要工作流程
Servlet 的每次請(qǐng)求,Web 服務(wù)器在調(diào)用 service() 方法之前,都會(huì)創(chuàng)建 HttpServletRequest 和
HttpServletResponse 對(duì)象。其中,
HttpServletRequest 對(duì)象用于封裝 HTTP 請(qǐng)求消息,簡(jiǎn)稱 request 對(duì)象。
HttpServletResponse 對(duì)象用于封裝 HTTP 響應(yīng)消息,簡(jiǎn)稱 response 對(duì)象(后面會(huì)詳細(xì)介紹該部分)。詳細(xì)流程見下圖:
根據(jù)圖中可見,當(dāng)瀏覽器中發(fā)生了請(qǐng)求事件,
- 會(huì)向 Web 服務(wù)器發(fā)送了一個(gè) HTTP 請(qǐng)求;
- Web 服務(wù)器根據(jù)收到的請(qǐng)求,會(huì)先創(chuàng)建一個(gè) HttpServletRequest 和 HttpServletResponse 對(duì)象,然后再調(diào)用相應(yīng)的 Servlet 程序。
- 在 Servlet 程序運(yùn)行時(shí),它首先會(huì)從 HttpServletRequest 對(duì)象中讀取數(shù)據(jù)信息,然后通過 service() 方法處理請(qǐng)求消息,并將處理后的響應(yīng)數(shù)據(jù)寫入到 HttpServletResponse 對(duì)象中。最后,Web 服務(wù)器會(huì)從 HttpServletResponse 對(duì)象中讀取到響應(yīng)數(shù)據(jù),并發(fā)送給瀏覽器。
注:在 Web 服務(wù)器運(yùn)行階段,每個(gè) Servlet 都只會(huì)創(chuàng)建一個(gè)實(shí)例對(duì)象,針對(duì)每次 HTTP 請(qǐng)求,Web 服務(wù)器都會(huì)調(diào)用所請(qǐng)求 Servlet 實(shí)例的 service(HttpServletRequest request,HttpServletResponse response)方法,并重新創(chuàng)建一個(gè) request 對(duì)象和一個(gè) response 對(duì)象。
5|0HttpServletRequest基礎(chǔ)
5|1關(guān)于Request對(duì)象
前面講了很多關(guān)于request對(duì)象的信息,下面就來詳細(xì)說一下request對(duì)象。在網(wǎng)絡(luò)中,我們的數(shù)據(jù)都是基于協(xié)議傳輸?shù)?,在web應(yīng)用中,流通最多的就是http協(xié)議,
一個(gè)瀏覽器請(qǐng)求web服務(wù)器,其實(shí)本質(zhì)是向web服務(wù)器發(fā)送一個(gè)http請(qǐng)求,而web服務(wù)器為了能更好的在web應(yīng)用中使用這個(gè)http,就封裝了一個(gè)HttpServletRequest的類,并為此建立了一系列的方法及方案來創(chuàng)建request對(duì)象;
HttpServletRequest 接口繼承自 ServletRequest 接口,其主要作用是封裝 HTTP 請(qǐng)求消息。由于 HTTP 請(qǐng)求消息分為請(qǐng)求行、請(qǐng)求消息頭和請(qǐng)求消息體三部分。因此,在 HttpServletRequest 接口中定義了獲取請(qǐng)求行、請(qǐng)求頭和請(qǐng)求消息體的相關(guān)方法。
當(dāng)訪問 Servlet 時(shí),所有請(qǐng)求消息將被封裝到 HttpServletRequest 對(duì)象中,請(qǐng)求消息的請(qǐng)求行中包含請(qǐng)求方法、請(qǐng)求資源名、請(qǐng)求路徑等信息,為了獲取這些信息,HttpServletRequest 接口定義了一系列方法,如下表所示:
獲取請(qǐng)求行信息的常用方法方法聲明功能描述String getMethod()該方法用于獲取 HTTP 請(qǐng)求消息中的請(qǐng)求方式(如 GET、POST 等)String getRequestURI()該方法用于獲取請(qǐng)求行中的資源名稱部分即位于 URL 的主機(jī)和端門之后、參數(shù)部分之前的部分String getQueryString()該方法用于獲取請(qǐng)求行中的參數(shù)部分,也就是資源路徑后問號(hào)(?)以后的所有內(nèi)容String getContextPath()該方法用于獲取請(qǐng)求 URL 中屬于 Web 應(yīng)用程序的路徑,這個(gè)路徑以 / 開頭,表示相對(duì)于整個(gè) Web 站點(diǎn)的根目錄,路徑結(jié)尾不含 /。如果請(qǐng)求 URL 屬于 Web 站點(diǎn)的根目錄,那么返回結(jié)果為空字符串("")String getServletPath()該方法用于獲取 Servlet 的名稱或 Servlet 所映射的路徑String getRemoteAddr()該方法用于獲取請(qǐng)求客戶端的 IP 地址,其格式類似于 192.168.0.3String getRemoteHost()該方法用于獲取請(qǐng)求客戶端的完整主機(jī)名,其格式類似于
http://pcl.mengma.com。需要注意的是,如果無法解析出客戶機(jī)的完整主機(jī)名,那么該方法將會(huì)返回客戶端的 IP 地址int getRemotePort()該方法用于獲取請(qǐng)求客戶端網(wǎng)絡(luò)連接的端口號(hào)String getLocaIAddr()該方法用于獲取 Web 服務(wù)器上接收當(dāng)前請(qǐng)求網(wǎng)絡(luò)連接的 IP 地址String getLocalName() 該方法用于獲取 Web 服務(wù)器上接收當(dāng)前網(wǎng)絡(luò)連接 IP 所對(duì)應(yīng)的主機(jī)名int getLocalPort()該方法用于獲取 Web 服務(wù)器上接收當(dāng)前網(wǎng)絡(luò)連接的端口號(hào)String getServerName()該方法用于獲取當(dāng)前請(qǐng)求所指向的主機(jī)名,即 HTTP 請(qǐng)求消息中 Host 頭字段所對(duì)應(yīng)的主機(jī)名部分int gctServcrPort()該方法用于獲取當(dāng)前請(qǐng)求所連接的服務(wù)器端口號(hào),即 HTTP 請(qǐng)求消息中 Host 頭字段所對(duì)應(yīng)的端口號(hào)部分StringBuffcr getRequestURL()該方法用于獲取客戶端發(fā)出請(qǐng)求時(shí)的完整 URL,包括協(xié)議、服務(wù)器名、端口號(hào)、 資源路徑等信息,但不包括后面的査詢參數(shù)部分。注意,getRequcstURL() 方法返冋的結(jié)果是 StringBuffer 類型,而不是 String 類型,這樣更便于對(duì)結(jié)果進(jìn)行修改
獲取請(qǐng)求消息頭的方法方法聲明功能描述String getHeader(String name)該方法用于獲取一個(gè)指定頭字段的值,如果請(qǐng)求消息中沒有包含指定的頭字段,則 getHeader() 方法返回 null;如果請(qǐng)求消息中包含多個(gè)指定名稱的頭字段,則 getHeader() 方法返回其中第一個(gè)頭字段的值Enumeration getHeaders(String name) 該方法返回一個(gè) Enumeration 集合對(duì)象,該集合對(duì)象由請(qǐng)求消息中出現(xiàn)的某個(gè)指定名稱的所有頭字段值組成。在多數(shù)情況下,一個(gè)頭字段名在請(qǐng)求消息中只出現(xiàn)一次,但有時(shí)可能會(huì)出現(xiàn)多次Enumeration getHeaderNames()該方法用于獲取一個(gè)包含所有請(qǐng)求頭字段的 Enumeration 對(duì)象int getIntHeader(String name)該方法用于獲取指定名稱的頭字段,并且將其值轉(zhuǎn)為 int 類型。需要注意的是,如果指定名稱的頭字段不存在,則返回值為 -1;如果獲取到的頭字段的值不能轉(zhuǎn)為 int 類型,則將發(fā)生 NumberFormatException 異常long getDateHeader(String name)該方法用于獲取指定頭字段的值,并將其按 GMT 時(shí)間格式轉(zhuǎn)換為一個(gè)代表日期/時(shí)間的長(zhǎng)整數(shù),該長(zhǎng)整數(shù)是自 1970 年 1 月 1 日 0 時(shí) 0 分 0 秒算起的以毫秒為單位的時(shí)間值String getContentType()該方法用于獲取 Content-Type 頭字段的值,結(jié)果為 String 類型int getContentLength()該方法用于獲取 Content-Length 頭字段的值,結(jié)果為 int 類型String getCharacterEncoding()該方法用于返回請(qǐng)求消息的實(shí)體部分的字符集編碼,通常是從 Content-Type 頭字段中進(jìn)行提取,結(jié)果為 String 類型
5|2請(qǐng)求轉(zhuǎn)發(fā)
當(dāng)一個(gè) Web 資源收到客戶端的請(qǐng)求后,如果希望服務(wù)器通知另外一個(gè)資源處理請(qǐng)求,可以通過RequestDispatcher 對(duì)象來解決, ServletRequest 接口中定義了一個(gè)獲取 RequestDispatcher 對(duì)象的方法。
- RequestDispatcher getRequestDispatcher (String path)
返回封裝了某條路徑所指定資源的 RequestDispatcher 對(duì)象。其中,參數(shù) path 必須以“/”開頭,用于表示當(dāng)前 Web 應(yīng)用的根目錄。需要注意的是,WEB-INF 目錄中的內(nèi)容對(duì) RequestDispatcher 對(duì)象也是可見的。因此,傳遞給 getRequestDispatcher(String path) 方法的資源可以是 WEB-INF 目錄中的文件RequestDispatcher 接口定義了兩個(gè)相關(guān)方法。
6|0HttpServletResponse基礎(chǔ)
6|1關(guān)于Response對(duì)象
HttpServletnse 接口繼承自 ServletResponse 接口,主要用于封裝 HTTP 響應(yīng)消息。由于 HTTP 響應(yīng)消息分為狀態(tài)行、響應(yīng)消息頭、消息體三部分。因此,在 HttpServletResponse 接口中定義了向客戶端發(fā)送響應(yīng)狀態(tài)碼、響應(yīng)消息頭、響應(yīng)消息體的方法。
當(dāng) Servlet 向客戶端回送響應(yīng)消息時(shí),需要在響應(yīng)消息中
設(shè)置狀態(tài)碼。因此,HttpServletResponse 接口定義了兩個(gè)發(fā)送狀態(tài)碼的方法。
1)setStatus(int status)方法
該方法用于設(shè)置 HTTP 響應(yīng)消息的狀態(tài)碼,并生成響應(yīng)狀態(tài)行。由于響應(yīng)狀態(tài)行中的狀態(tài)描述信息直接與狀態(tài)碼相關(guān),而 HTTP 版本由服務(wù)器確定,因此,只要通過 setStatus(int status)方法設(shè)置了狀態(tài)碼,即可實(shí)現(xiàn)狀態(tài)行的發(fā)送。需要注意的是,在正常情況下,Web 服務(wù)器會(huì)默認(rèn)產(chǎn)生一個(gè)狀態(tài)碼為 200 的狀態(tài)行。
2)sendError(int sc)方法
Servlet 向客戶端發(fā)送的響應(yīng)消息中包含
響應(yīng)頭字段,由于 HTTP 協(xié)議的響應(yīng)頭字段有很多種,因此,HttpServletResponse 接口定義了一系列設(shè)置 HTTP 響應(yīng)頭字段的方法。
于在 HTTP 響應(yīng)消息中,大量的數(shù)據(jù)都是通過
響應(yīng)消息體傳遞的,因此,ServletResponse 遵循以 I/O 流傳遞大量數(shù)據(jù)的設(shè)計(jì)理念。在發(fā)送響應(yīng)消息體時(shí),定義了兩個(gè)與輸出流相關(guān)的方法。
1)getOutputStream() 方法
該方法所獲取的字節(jié)輸出流對(duì)象為 ServletOutputStream 類型。由于 ServletOutputStream是OutputStream 的子類,它可以直接輸出字節(jié)數(shù)組中的二進(jìn)制數(shù)據(jù)。因此,要想輸出二進(jìn)制格式的響應(yīng)正文,就需要使用 getOutputStream() 方法。
2)getWriter() 方法
該方法所獲取的字符輸出流對(duì)象為 PrintWriter 類型。由于 PrintWriter 類型的對(duì)象可以直接輸出字符文本內(nèi)容,因此,要想輸出內(nèi)容全部為字符文本的網(wǎng)頁文檔,則需要使用 getWriter() 方法。 注意:雖然 response 對(duì)象的 getOutputStream() 和 getWriter() 方法都可以發(fā)送響應(yīng)消息體,但是,它們之間互相排斥,不可同時(shí)使用,否則會(huì)發(fā)生 IllegalStateException 異常。
6|2請(qǐng)求重定向
在某些情況下,針對(duì)客戶端的請(qǐng)求,一個(gè) Servlet 類可能無法完成全部工作。這時(shí),可以使用請(qǐng)求重定向完成這一工作。 請(qǐng)求重定向指 Web 服務(wù)器接收到客戶端的請(qǐng)求后,可能由于某些條件的限制,不能訪問當(dāng)前請(qǐng)求 URL 所指向的 Web 資源,而是指定了一個(gè)新的資源路徑,讓客戶端重新發(fā)送請(qǐng)求。
為了實(shí)現(xiàn)請(qǐng)求重定向,HttpServletResponse 接口定義了一個(gè) sendRedirect() 方法,該方法用于生成 302 響應(yīng)碼和 Location 響應(yīng)頭,從而通知客戶端重新訪問 Location 響應(yīng)頭中指定的 URL
sendRedirect() 方法的工作原理如圖
當(dāng)客戶端訪問 Servlet1 時(shí),由于在 Servlet1 中調(diào)用了 sendRedirect() 方法將請(qǐng)求重定向到 Servlet2,因此,瀏覽器收到 Servlet1 的響應(yīng)消息后,立刻向 Servlet2 發(fā)送請(qǐng)求,Servlet2 對(duì)請(qǐng)求處理完畢后,再將響應(yīng)消息回送給客戶端瀏覽器并顯示。