1. 程式人生 > >Get請求/Post請求與如何在Servlet中獲取請求資訊——day_07

Get請求/Post請求與如何在Servlet中獲取請求資訊——day_07

HTTP簡介

-WEB瀏覽器與WEB伺服器之間的一問一答的互動過程必須遵循一定的規則,這個規則就是HTTP協議
-HTTP是hypertext transfer protocol(超文字傳輸協議)的簡寫,它是TCP/IP協議集中的一個應用層協議,用於定義WEB瀏覽器與WEB伺服器之間交換資料的過程以及資料本身的格式。
-HTTP協議的版本有HTTP/1.0,HTTP/1.1,HTTP.NG

HTTP的會話方式

四個步驟:

Created with Raphaël 2.1.0客戶機客戶機伺服器伺服器建立連線傳送請求資訊回送響應資訊關閉連線

Get請求/Post請求

-1)使用getd方式傳遞引數:
-1.1在瀏覽器位址列中輸入某個URL地址或單擊網頁上的一個超連結時,瀏覽器發出的HTTP請求資訊的請求方式為GET.
-1.2如果網頁中的表單元素的method屬性被設定為“GET”,瀏覽器提交這個FORM表單時生成的HTTP請求訊息的請求方式為GET
-1.3使用GET請求方式給WEB伺服器傳遞引數的格式,

http://www.xxxx.xxx/xxxx?userName=xxx&password
-1.4使用GET方式傳送的資料量一般限制在1KB以下。
-2)使用POST方式傳遞引數:
-2.1POST請求方式主要用於向WEB伺服器端程式提交FORM表單中的資料。
-2.2POST方式將各個表單欄位元素及其資料作為HTTP訊息的實體內容傳送給WEB伺服器,傳送的資料量要比使用GET方式傳送的資料量大。

如何在Servlet中獲取請求資訊

-1).Servlet的service()方法用於應答請求:因為每次請求都會呼叫service()方法:
public void service(ServletRequest arg0, ServletResponse arg1)
throws ServletException, IOException {}
ServletRequest:封裝了請求資訊,可以從中獲取任何的請求資訊。
ServletResponse:封裝了響應資訊,如果想給使用者什麼響應。
這兩個介面的實現類都是伺服器給予實現的,並在伺服器呼叫service方法時傳入。
-2)ServletRequest:
-2.1)獲取請求引數的幾個常用方法:

public java.lang.String getParameter(java.lang.String name):
根據請求引數的名字,返回引數值。若請求引數有多個值(例如checkbox),該方法只能獲取到第一個提交的值
public java.util.Enumeration getParameterNames():
返回引數名對應的Enumeration 物件,類似於ServletConfig的getInitParameterNames()方法
public java.lang.String[] getParameterValues(java.lang.String name):
根據請求引數的名字,返回請求引數對應的字串陣列
Map getParameterMap():返回請求引數的鍵值: key;引數名,value:引數值,Sring陣列型別
-2.2)HttpServletRequest:
獲取請求的URI:
HttpServletRequest hrequest=(HttpServletRequest)arg0;
String uri=hrequest.getRequestURI();
System.out.println(uri);
獲取請求方式:
String method=hrequest.getMethod();
System.out.println(method);
若是一個GET請求,獲取請求引數對應的那個字串,即?後的那個字串:
String query=hrequest.getQueryString();
System.out.println(query);
獲取請求的Servlet的對映路徑:
String servletPath=hrequest.getServletPath();
System.out.println(servletPath);
-3)HttpServletRequest:是ServletRequest的子介面,針對於HTTP請求所定義,裡邊包含了大量獲取HTTP請求相關的方法。
-4)ServletReponse:封裝了響應的資訊,如果想給使用者什麼響應,具體可以使用該介面的方法實現。
4.1)getWriter():返回PrintWriter物件,呼叫物件的print()方法,將把printy()裡的引數直接列印使用者的瀏覽器上。
4.2)設定響應的內容型別:repond.setContentType(“application/msword”);
4.3)void sendRedirect(String location):請求的重定向(此方法在HttpSevletResponse中定義)
在web.xml檔案中設定兩個WEB應用的初始化引數,user,password.定義一個login.html,裡邊定義兩個請求欄位:user,password.傳送請求。再建立一個LoginSevlet,在其中獲取請求的user與password,比對其和web.xml檔案中定義的請求引數是否一致。若一致列印,響應:Hello.xxx
若不一致的話,響應:Sorry,xxxx.

GenericServlet:

-1)是一個Servlet,是Servlet介面和ServletConfig介面的實現類,但是一個抽象類,其中的service方法為抽象方法
-2)如果新建的Servlet程式直接繼承GenericServlet會使開發更簡潔。
-3)具體實現:
3.1在GenericServlet中聲明瞭ServletConfig型別的成員變數,在init(ServletConfig)方法中對其進行了初始化
3.2利用ServletConfig成員變數的方法實現了ServletConfig介面的方法。
3.3還定義了一個init()方法,在init(ServletConfig)方法中對其進行呼叫,子類可以直接覆蓋init(),在其中實現對Servlet的初始化
3.4不建議直接覆蓋init(ServletConfig),因為如果忘記編寫super(ServletConfig),而還是用ServletConfig介面的方法,則會出現空指標異常。
3.5.新建的init(){}並非Servlet的生命週期的方法,而init(ServletConfig)是生命週期相關的方法。

HttpServlet

-1)是一個Servlet,繼承自GenericServlet,針對於HTTP協議所定製。
-2)在service()方法中直接把ServletRequest和ServletResponse轉為HttpServletRequest和HttpServletResponse,並呼叫過載的service(HttpServletRequest,HttpServletResponse)
service(HttpServletRequest,HttpServletResponse)獲取了請求方式:request.getMethod().根據請求方式建立了doXxxx方法
-3)實際開發中,直接繼承HttpServlet,並根據請求方式複寫doXxxx(),方法介面
-4)好處:直接由針對性的覆蓋doXxxx()方法,直接使用HttpServletRequest和HttpServletResponse,不再需要強轉
小練習:
在MySQL資料庫中建立一個test_users資料表,新增3個欄位:id,user,password,並錄入幾條記錄。
定義一個login.html,裡邊定義兩個請求欄位:user,password,傳送請求到loginServlet,在建立一個LoginServlet(需要繼承自HttpServlet,並重寫doPost方法)在其中獲取請求的user,和password.
利用JDBC從test_users中查詢出有沒有和頁面輸入的user,password 對應的記錄。
SELECT count(id) FROM test_users WHERE user=? AND password=?
若有響應:Hello,xxxx 若沒有響應:Sorry,xxxx xxxx為user