java第二十九天(Http協議&Servlet)

Http協議

1.安裝抓包工具HttpWatch(IE插件)

    直接安裝,桌面是沒有東西出來的,打開IE瀏覽器,右鍵勾選全部顯示;欄,點工具http watch professional出現如下界面表示已經安裝好css

2.http使用HttpWatch抓包

用IE瀏覽器打開tomcat首頁html

  • examples--servelet example --- request paramaters請求參數----excute---編輯數據提交
  • 再打開這個界面,輸入數據,點提交以後點rcord捕獲再點record下面第一行的彩色區---下方stream查看對接細節

3.Http請求數據解釋

請求數據包含三個內容:請求行,請求頭,請求體
	請求行:Post/Examples/Servlets/RequestParametersExamples/Http/1.1
		post  請求方式,以postqu提交數據
		/Examples/Servlets/RequestParametersExamples 服務器請求的地址路徑 
		Http/1.1  協議版本

	請求頭:
		accept                客戶端向服務器表示支持什麼類型的數據
		Referer               真正請求的地址路徑  全路徑
		Accept-Language       支持語言格式
		User-Agent            用戶代理向服務器代表當前來訪的客戶端信息
		Content-type          提交的數據類型  form表單數據
		Accept-Ecording:gzip,deflate       壓縮算法
		Host                  主機地址
		Content-length        數據長度
		Connection:keep-Alive 保持鏈接
		Cache-Control         對緩存的操做

	請求體:瀏覽器真正發送給服務器的東西
		發送的數據實現是key=value,若是存在多個數據那麼使用&

4.Http響應數據解析

響應解析也包含三個部分:響應行,響應頭,響應體
	響應行:Http/1.1 200 ok
		Http/1.1  協議版本
		200       表示狀態碼
			200              成功正常處理,獲得數據
			403:for bidden   拒絕訪問
			404:Not Found    
			500              服務器異常
		ok        對應狀態碼

	響應頭:
		servlet               服務器類型  Tomcat
		Content-type          提交的數據類型  form表單數據
		Content-length        數據長度
		Date                  通信的日期,響應的時間

5.GET請求和POST請求的區別

1.   請求路徑不一樣:
	post   url後面不跟任何數據
	get    url地址後面跟上數據
2.   帶上的數據不一樣:
	post   使用流的方式寫數據
	get    在地址欄上跟數據
3.   post使用流寫數據因此必定須要Content-length來講明數據長度

4.   安全性:
	post  使用流的方式寫數據,不在地址欄上,安全性高,通常提交數據到服務器使用post,並且沒有限制數據大小
	get   在地址欄後跟數據,不安全,應用於從服務器獲取且客戶端不須要提交數據的時候 ,帶的數據有限:1kb

web資源

(服務器可以返回的一切東西均可以看做是web資源)
在http協議當中,規定了請求和響應雙方,客戶端和服務器端,與web相關的資源

有兩種分類java

  • 靜態資源 html 、 js 、 css
  • 動態資源 servlet/jsp

Servlet(重中之重)

Servlet是啥Servlet是啥

- 其實就是一個Java程序,運行在咱們的web服務器上,用於接受和響應客戶端的http請求

- 更多的是配合動態資源來作,當靜態資源也須要使用到servlet,只不過是Toomcat裏面已經定義好了一個DefaultServlet

Servlet初次使用 HelloServlet

  1. 寫一個工程,要有一個服務器web

  2. 測試運行servlet算法

    • 新建一個類實現servlet接口瀏覽器

      在Java Resources下面的src中新建一個類實現servlet接口實現方法,本次用方法sevice()舉例 緩存

    • 配置Servlet,在WEB-INF下的web.xml中寫如下內容,用意:告訴服務器咱們的應用有這麼些servlettomcat

      <!-- 向Tomcat報告,這個應用裏面有這個Servlet,名字叫作HelloServlet,具體的路徑是s20190711.mine.servlet.HelloServlet-->
        <servlet>
      	<servlet-name>HelloServlet</servlet-name>
      	<servlet-class>s20190711.mine.servlet.HelloServlet</servlet-class>
        </servlet>
        <!-- 註冊Servlet映射,
      		servlet-name:找到上面註冊的具體的servlet,
      		url-pattern:在地址欄上的path,注意以/開頭不然報錯 -->
        <servlet-mapping>
      	<servlet-name>HelloServlet</servlet-name>
      	<url-pattern>/a</url-pattern>
        </servlet-mapping>

  3. 從新將工程右鍵發送到servlet,在地址欄上輸入http://localhost:8080/項目名稱/a ,查看console結果以下圖表示成功 安全

問題記錄:建立web工程下的web-inf中沒有web.xml,緣由建立的過程當中一鍵finish就沒有,若是一直點next會出現建立的同時自動建立web.xml;解決:右鍵工程找到 java EE Tools 中的generate deployment descripter stub點擊,這個時候打開web-inf中就有web.xml服務器

Servlet執行過程

  1. 找到tomcat應用
  1. 找到項目
  1. 找到項目中的web.xml,而後再裏面找到url-pattern有沒有哪個內容是/a
  1. 找到servlet-mapping中那個servlet-name[HelloServlet]
  1. 找到上面定義的servlet元素中的servlet-name中的[HelloServlet]
  1. 找到下面定義的servlet-class而後開始建立類的實例
  1. 繼而執行該servlet中的service方法

Servlet通用寫法

因爲繼承servlet接口要實現的方法太多了,而實際只用一個service方法,所以能夠看看servlet下面的實現類,httpservlet

  1. 定義一個類繼承httpservlet,(這裏能夠複寫service方法於運行servlet),

  2. 推薦複寫doGet方法和doPost方法

    由於父類httpservlet中有service方法且方法中判斷請求是post或者get分別執行dopost、doget,這是servlet的通用寫法
     這裏注意若是有出現拋異常能夠去掉方法中的super.doPost(req, resp);和super.doGet(req, resp);
  3. 配置Servlet,在WEB-INF下的web.xml中

  4. 從新將工程右鍵發送到servlet,在地址欄上輸入http://localhost:8080/HelloServlet/HelloServlet1 ,查看console結果

    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 HelloServlet1 extends HttpServlet{
    		/*
    		 * @Override protected void service(HttpServletRequest req, HttpServletResponse
    		 * resp) throws ServletException, IOException { super.service(req, resp); }
    		 */
    		@Override
    		protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    			super.doGet(req, resp);
    			System.out.println("get請求helloservlet");
    		}
    
    		@Override
    		protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    			super.doPost(req, resp);
    			System.out.println("post請求helloservlet");
    		}
    	}
    <servlet>
    		<servlet-name>HelloServlet1</servlet-name>
    		<servlet-class>s20190711.mine.servlet.HelloServlet1</servlet-class>
    	  </servlet>
    	  <servlet-mapping>
    		<servlet-name>HelloServlet1</servlet-name>
    		<url-pattern>/HelloServlet1</url-pattern>
    	  </servlet-mapping>

servlet的生命週期

  • 生命週期

從建立到銷燬的一段時間

  • 生命週期方法

從建立到銷燬,所調用的那些方法。

生命週期方法

是指,熊對象的建立到銷燬必定會執行的方法,doget和dopost不是生命週期方法

  • init方法

    在建立該servlet的實例就執行該方法init()初始化,默認狀況下是初次訪問servlet時就建立實例,init方法只會執行一次

  • service方法

    只要客戶端來請求就會執行service方法,service()方法能夠被執行不少次,一次請求對應一次service的調用

  • destroy方法

    servlet銷燬的時候執行destroy方法:
    	1. 該項目從tomcat中移除
    	2. 正常關閉服務器  tomcat-bin-shutdown

提早初始化:

由於初次訪問可能會在init方法中停留過久時間,能夠將初始化時間提早

因此在配置web.xml中servlet元素下再加一句,這裏的數字越小初始化越早,通常不寫負數從2開始,發佈到servlet的時候就會提早調用init方法而不是訪問的時候

<load-on startup>2<load-on startup>

ServletConfig 配置對象

ServletConfig 能夠獲取servlet在配置的一些信息

獲得ServletConfig 對象:getServletConfig(),專門用於配置servlet的信息

獲取到的是配置servlet裏面的servlet-name的文本內容:getservletname

能夠獲取具體的某一個參數:getInitParameter()

//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);
	}

爲啥須要ServletConfig

將來咱們本身開發一些應用,使用到了一些技術或者一些代碼。可是有人寫出來;了,他的diamagnetic放置在本身的servlet類裏面

恰好這個servlet裏面須要一個數字或者叫作變量值,可是這個值不能是固定的,因此要求使用到這個servlet的公司在註冊這個servlet的時候,必需要在web.xml裏面聲明 init-params

總結:

  • Http協議

    1. 使用httpwatch抓包看一看http請求背後的細節
      2. 基本瞭解 請求和響應的數據內容
      	請求行、請求頭、請求體
      	響應行、響應頭、響應體
      3. get和post區別
  • Servlet

    會使用簡單的servlet
      	寫一個類實現接口servlet
      	配置servlet
      	訪問servlet
    
      servlet生命週期
      	init 一次  建立對象,默認初次訪問胡總和經過配置提早
      	service 屢次,一次請求對應一次service
      	destroy 一次 銷燬的時候 從服務器移除或者正常關閉
    
      ServletConfig
      	獲取配置的信息,params
相關文章
相關標籤/搜索