雙方在交互、通信的時候, 遵照的一種規範、規則。css
針對網絡上的客戶端 與 服務器端在執行http請求的時候,遵照的一種規範。 其實就是規定了客戶端在訪問服務器端的時候,要帶上哪些東西, 服務器端返回數據的時候,也要帶上什麼東西。html
版本java
1.0web
請求數據,服務器返回後, 將會斷開鏈接
1.1算法
請求數據,服務器返回後, 鏈接還會保持着。 除非服務器 | 客戶端 關掉。 有必定的時間限制,若是都空着這個鏈接,那麼後面會本身斷掉。
在地址欄中鍵入網絡地址 回車 或者是日常註冊的時候,點擊了註冊按鈕 , 瀏覽器都能顯示出來一些東西。那麼背地裏到底瀏覽器和服務器是怎麼通信。 它們都傳輸了哪些數據。瀏覽器
安裝抓包工具 HttpWatch (IE插件)緩存
打開tomcat. 輸入localhost:8080 打開首頁tomcat
在首頁上找到Example 字樣安全
6.x 和 7.x 的文檔頁面有所不一樣,可是隻要找到example就可以找到例子工程服務器
4.選擇 servlet 例子 ---> Request Parameter
接着點擊Request Parameters 的 Execute超連接
執行tomcat的例子,而後查看瀏覽器和 tomcat服務器的對接細節
請求的數據裏面包含三個部份內容 : 請求行 、 請求頭 、請求體
請求行
POST /examples/servlets/servlet/RequestParamExample HTTP/1.1 POST : 請求方式 ,以post去提交數據 /examples/servlets/servlet/RequestParamExample 請求的地址路徑 , 就是要訪問哪一個地方。 HTTP/1.1 協議版本
請求頭
Accept: application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, */* Referer: http://localhost:8080/examples/servlets/servlet/RequestParamExample Accept-Language: zh-CN User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E) Content-Type: application/x-www-form-urlencoded Accept-Encoding: gzip, deflate Host: localhost:8080 Content-Length: 31 Connection: Keep-Alive Cache-Control: no-cache Accept: 客戶端向服務器端表示,我能支持什麼類型的數據。 Referer : 真正請求的地址路徑,全路徑 Accept-Language: 支持語言格式 User-Agent: 用戶代理 向服務器代表,當前來訪的客戶端信息。 好比經過此信息把手機電腦登陸的同一個網頁進行不一樣顯示 Content-Type: 提交的數據類型。通過urlencoding編碼的form表單的數據 Accept-Encoding: gzip, deflate : 壓縮算法 。 Host : 主機地址 Content-Length: 數據長度 Connection : Keep-Alive 保持鏈接 Cache-Control : 對緩存的操做
請求體
瀏覽器真正發送給服務器的數據
發送的數據呈現的是key=value ,若是存在多個數據,那麼使用 & firstname=zhang&lastname=sansan
請求的數據裏面包含三個部份內容 : 響應行 、 響應頭 、響應體
HTTP/1.1 200 OK Server: Apache-Coyote/1.1 Content-Type: text/html;charset=ISO-8859-1 Content-Length: 673 Date: Fri, 17 Feb 2017 02:53:02 GMT ...這裏還有不少數據...
響應行
HTTP/1.1 200 OK 協議版本 狀態碼 我們此次交互究竟是什麼樣結果的一個code. 200 : 成功,正常處理,獲得數據。 403 : for bidden 拒絕 404 : Not Found 500 : 服務器異常 OK 對應前面的狀態碼
響應頭
Server: 服務器是哪種類型。 Tomcat Content-Type : 服務器返回給客戶端你的內容類型 Content-Length : 返回的數據長度 Date : 通信的日期,響應的時間
post
1. 數據是以流的方式寫過去,不會在地址欄上面顯示。 如今通常提交數據到服務器使用的都是POST 2. 以流的方式寫數據,因此數據沒有大小限制。
get
1. 會在地址欄後面拼接數據,因此有安全隱患。 通常從服務器獲取數據,而且客戶端也不用提交上面數據的時候,可使用GET 2. 可以帶的數據有限, 1kb大小
在http協議當中,規定了請求和響應雙方, 客戶端和服務器端。與web相關的資源。
有兩種分類
靜態資源
html 、 js、 css
動態資源
servlet/jsp
其實就是一個java程序,運行在咱們的web服務器上,用於接收和響應 客戶端的http請求。
更多的是配合動態資源來作。 固然靜態資源也須要使用到servlet,只不過是Tomcat裏面已經定義好了一個 DefaultServlet
得寫一個Web工程 , 要有一個服務器。
測試運行Web工程
1. 新建一個類, 實現Servlet接口 2. 配置Servlet , 用意: 告訴服務器,咱們的應用有這麼些個servlet。 在webContent/WEB-INF/web.xml裏面寫上如下內容。 <!-- 向tomcat報告, 我這個應用裏面有這個servlet, 名字叫作HelloServlet , 具體的路徑是com.itheima.servlet.HelloServlet --> <servlet> <servlet-name>HelloServlet</servlet-name> <servlet-class>com.itheima.servlet.HelloServlet</servlet-class> </servlet> <!-- 註冊servlet的映射。 servletName : 找到上面註冊的具體servlet, url-pattern: 在地址欄上的path 必定要以/打頭 --> <servlet-mapping> <servlet-name>HelloServlet</servlet-name> <url-pattern>/a</url-pattern> </servlet-mapping> 3. 在地址欄上輸入 http://localhost:8080/項目名稱/a
Servlet (接口) | | GenericServlet | | HttpServlet (用於處理http的請求)
從建立到銷燬的一段時間
從建立到銷燬,所調用的那些方法。
init方法
在建立該servlet的實例時,就執行該方法。 一個servlet只會初始化一次, init方法只會執行一次 默認狀況下是 : 初次訪問該servlet,纔會建立實例。
service方法
只要客戶端來了一個請求,那麼就執行這個方法了。 該方法能夠被執行不少次。 一次請求,對應一次service方法的調用
destroy方法
servlet銷燬的時候,就會執行該方法 1. 該項目從tomcat的裏面移除。 2. 正常關閉tomcat就會執行 shutdown.bat
doGet 和 doPost不算生命週期方法,所謂的生命週期方法是指,從對象的建立到銷燬必定會執行的方法, 可是這兩個方法,不必定會執行。
默認狀況下,只有在初次訪問servlet的時候,纔會執行init方法。 有的時候,咱們可能須要在這個方法裏面執行一些初始化工做,甚至是作一些比較耗時的邏輯。
那麼這個時候,初次訪問,可能會在init方法中逗留過久的時間。 那麼有沒有方法可讓這個初始化的時機提早一點。
在配置的時候, 使用load-on-startup元素來指定, 給定的數字越小,啓動的時機就越早。 通常不寫負數, 從2開始便可。
<servlet> <servlet-name>HelloServlet04</servlet-name> <servlet-class>com.itheima.servlet.HelloServlet04</servlet-class> <load-on-startup>2</load-on-startup> </servlet>
Servlet的配置,經過這個對象,能夠獲取servlet在配置的時候一些信息
先說 , 在寫怎麼用, 最後說有什麼用。
//1. 獲得servlet配置對象 專門用於在配置servlet的信息 ServletConfig config = getServletConfig(); //獲取到的是配置servlet裏面servlet-name 的文本內容 String servletName = config.getServletName(); System.out.println("servletName="+servletName); //二、。 能夠獲取具體的某一個參數。 String address = config.getInitParameter("address"); System.out.println("address="+address); //3.獲取全部的參數名稱 Enumeration<String> names = config.getInitParameterNames(); //遍歷取出全部的參數名稱 while (names.hasMoreElements()) { String key = (String) names.nextElement(); String value = config.getInitParameter(key); System.out.println("key==="+key + " value="+value); }
將來咱們本身開發的一些應用,使用到了一些技術,或者一些代碼,咱們不會。 可是有人寫出來了。它的代碼放置在了本身的servlet類裏面。
恰好這個servlet 裏面須要一個數字或者叫作變量值。 可是這個值不能是固定了。 因此要求使用到這個servlet的公司,在註冊servlet的時候,必需要在web.xml裏面,聲明init-params
在開發當中比較少用。
剛纔的這個實驗, 但願基礎好或者感興趣的同窗,回去本身作一下。
Http協議
1. 使用HttpWacht 抓包看一看http請求背後的細節。 2. 基本瞭解 請求和響應的數據內容 請求行、 請求頭 、請求體 響應行、響應頭、響應體 3. Get和Post的區別
Servlet【重點】
1. 會使用簡單的servlet 1.寫一個類,實現接口Servlet 2. 配置Servlet 3. 會訪問Setvlet 2. Servlet的生命週期 init 一次 建立對象 默認初次訪問就會調用或者能夠經過配置,讓它提早 load-on-startup service 屢次,一次請求對應一次service destory 一次 銷燬的時候 從服務器移除 或者 正常關閉服務器 3. ServletConfig 獲取配置的信息, params
HelloServlet
package com.itheima.servlet; import java.io.IOException; import javax.servlet.Servlet; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; public class HelloServlet implements Servlet{ public void service1(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException { System.out.println("helloServlet..."); } @Override public void destroy() { // TODO Auto-generated method stub } public ServletConfig getServletConfig1() { // TODO Auto-generated method stub return null; } @Override public String getServletInfo() { // TODO Auto-generated method stub return null; } public void init1(ServletConfig arg0) throws ServletException { // TODO Auto-generated method stub } @Override public ServletConfig getServletConfig() { // TODO Auto-generated method stub return null; } @Override public void init(ServletConfig arg0) throws ServletException { // TODO Auto-generated method stub } @Override public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException { // TODO Auto-generated method stub } }
HelloServlet02
package com.itheima.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class HelloServlet02 extends HttpServlet { //Get請求會來這個方法 @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("get---"); } //POST請求會來這個方法 @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("post----"); } }
HelloServlet03
package com.itheima.servlet; import java.io.IOException; import javax.servlet.Servlet; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServlet; /** * 該servlet 用於演示servlet的生命週期調用時機 */ public class HelloServlet03 implements Servlet{ //一、 //在建立該servlet的實例時,就執行該方法。 //一個servlet只會初始化一次, init方法只會執行一次 //默認狀況下是 : 初次訪問該servlet,纔會建立實例。 @Override public void init(ServletConfig config) throws ServletException { System.out.println("HelloServlet03 初始化..."); } //2. /* * 只要客戶端來了一個請求,那麼就執行這個方法了。 * 該方法能夠被執行不少次。 一次請求,對應一次service方法的調用 */ @Override public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { System.out.println("helloservlet03 service方法調用了"); } /** * servlet銷燬的時候,就會執行該方法 * * 1. 該項目從tomcat的裏面移除。 * 2. 正常關閉tomcat就會執行 shutdown.bat */ @Override public void destroy() { System.out.println("helloservlet03 destroy方法調用了"); } @Override public ServletConfig getServletConfig() { return null; } @Override public String getServletInfo() { // TODO Auto-generated method stub return null; } }
HelloServlet04
package com.itheima.servlet; import java.io.IOException; import javax.servlet.Servlet; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServlet; /** * 該servlet 用於讓servlet建立實例的時機提早。 */ public class HelloServlet04 implements Servlet{ //一、 //在建立該servlet的實例時,就執行該方法。 //一個servlet只會初始化一次, init方法只會執行一次 //默認狀況下是 : 初次訪問該servlet,纔會建立實例。 @Override public void init(ServletConfig config) throws ServletException { System.out.println("HelloServlet04 初始化..."); } //2. /* * 只要客戶端來了一個請求,那麼就執行這個方法了。 * 該方法能夠被執行不少次。 一次請求,對應一次service方法的調用 */ @Override public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { System.out.println("HelloServlet04 service方法調用了"); } /** * servlet銷燬的時候,就會執行該方法 * * 1. 該項目從tomcat的裏面移除。 * 2. 正常關閉tomcat就會執行 shutdown.bat */ @Override public void destroy() { System.out.println("HelloServlet04 destroy方法調用了"); } @Override public ServletConfig getServletConfig() { return null; } @Override public String getServletInfo() { // TODO Auto-generated method stub return null; } }
HelloServletConfig
package com.itheima.servlet; import java.io.IOException; import java.util.Enumeration; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class HelloServletConfig extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //ServletConfig 能夠獲取servlet在配置的一些信息 //1. 獲得servlet配置對象 專門用於在配置servlet的信息 ServletConfig config = getServletConfig(); //獲取到的是配置servlet裏面servlet-name 的文本內容 String servletName = config.getServletName(); System.out.println("servletName="+servletName); //二、。 能夠獲取具體的某一個參數。 String address = config.getInitParameter("address3333"); System.out.println("address="+address); System.out.println("----------------------------------"); //3.獲取全部的參數名稱 Enumeration<String> names = config.getInitParameterNames(); //遍歷取出全部的參數名稱 while (names.hasMoreElements()) { String key = (String) names.nextElement(); String value = config.getInitParameter(key); System.out.println("key==="+key + " value="+value); } } //來了post請求,就讓它去執行doGet方法 @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
package com.itheima.config; import java.io.IOException; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class SerlvetConfigDemo extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //1. 獲取該servlet配置的參數。 ServletConfig config = getServletConfig(); String number = config.getInitParameter("number"); if(number == null){ throw new IllegalArgumentException("servlet在配置的時候,必定要寫number這個參數。。"); }else{ System.out.println("number...."); } } private com.itheima.config.ServletConfig getServletConfig() { // TODO Auto-generated method stub return null; } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }