doget和dopost的區別


doget和dopost的區別

get和post是http協議的兩種方法,另外還有head, delete等 

這兩種方法有本質的區別,get只有一個流,參數附加在url后,大小個數有嚴格限制且只能是字符串。post的參數是通過另外的流傳遞的,不通過url,所以可以很大,也可以傳遞二進制數據,如文件的上傳。 

在servlet開發中,以doGet()和doPost()分別處理get和post方法。 
首先判斷請求時是get還是post,如果是get就調用doGet(), 如果是post就調用doPost()。都會執行這個方法。 

1.doGet
GET 調用用於獲取服務器信息,並將其做為響應返回給客戶端。當經由Web瀏覽器或通過HTML、JSP直接訪問Servlet的URL時,一般用GET調用。 GET調用在URL里顯示正傳送給SERVLET的數據,這在系統的安全方面可能帶來一些問題,比如用戶登錄,表單里的用戶名和密碼需要發送到服務器端, 若使用Get調用,就會在瀏覽器的URL中顯示用戶名和密碼。
例:
jsp頁代碼:
<form action="/doGet_servlet" name=”form1” method="get">
………
<input type="text" name="name1">
………
</form>
servlet代碼:
public class doGet_servlet extends HttpServlet {
  public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException {
      request.setCaracterEncoding(“gb2312”);//漢字轉碼
      PrintWriter out = response.getWriter();
      out.println("The Parameter are :"+request.getParameter("name1"));
  }
}
這樣提交表單后,參數會自動添加到瀏覽器地址欄中,帶來安全性問題。

2.doPost
它用於客戶端把數據傳送到服務器端,也會有副作用。但好處是可以隱藏傳送給服務器的任何數據。Post適合發送大量的數據。
例:
jsp頁代碼:
<form action="/doPostt_servlet" name=”form2” method="post">
………
<textarea name="name2" cols="50" rows="10"></textarea>
………
</form>
servlet代碼:
public class doPostt_servlet extends HttpServlet {
  public void doPost(HttpServletRequest request,HttpServletResponse esponse) throws IOException,ServletException {
      request.setCaracterEncoding(“gb2312”);//漢字轉碼
      PrintWriter out = response.getWriter();
      out.println("The Parameter are :"+request.getParameter("name2"));
  }
}

3.可以把方法寫在doGet()方法中,在doPost()方法中調用執行,這樣,無論你提交的是post還是get方法都可以執行
例如:
jsp頁代碼:
<form action="/servlet" name=”form” method="post">
………
<input type="text" name="name1">
………
</form>
servlet代碼:
public class servlet extends HttpServlet {
  public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException {
      request.setCaracterEncoding(“gb2312”);//漢字轉碼
      PrintWriter out = response.getWriter();
      out.println("The Parameter are :"+request.getParameter("name1"));
  }

  public void doPost(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException {
      this.goGet(request,response);//調用doGet()方法
  }
}
另外,HttpServlet處理客戶端請求方式還有doPut、doDelete、doTrace、doHead、doOptions,但使用的比較少。 


1、安全

GET調用在URL里顯示正傳送給SERVLET的數據,這在系統的安全方面可能帶來問題,例如用戶名和密碼等

POST就可以在一定程度上解決此類問題

2、服務器接收方式

服務器隨機接受GET方法的數據,一旦斷電等原因,服務器也不知道信息是否發送完畢

而POST方法,服務器先接受數據信息的長度,然后再接受數據

3、form運行方式

當form框里面的method為get時,執行doGet方法
當form框里面的method為post時,執行doPost方法

4、容量限制

GET方法后面的信息量字節大小不要超過1.3K,而Post則沒有限制

最后說明的是:

你可以用service()來實現,它包含了doget和dopost ;service方法是接口中的方法,servlet容器把所有請求發送到該方法,該方法默認行為是轉發http請求到doXXX方法中,如果你重載了該方法,默認操作被覆蓋,不再進行轉發操作!

service()是在javax.servlet.Servlet接口中定義的,   在   javax.servlet.GenericServlet  
    中實現了這個接口,   而   doGet/doPost   則是在   javax.servlet.http.HttpServlet   中實現的,   javax.servlet.http.HttpServlet   是   javax.servlet.GenericServlet   的子類.  
   
  所有可以這樣理解,   其實所有的請求均首先由   service()   進行處理,   而在   javax.servlet.http.HttpServlet   的   service()   方法中,   主要做的事情就是判斷請求類型是   Get   還是   Post,   然后調用對應的   doGet/doPost   執行.

 

  

Serlvet接口只定義了一個服務方法就是service,而HttpServlet類實現了該方法並且要求調用下列的方法之一:
doGet:處理GET請求
doPost:處理POST請求
當發出客戶端請求的時候,調用service 方法並傳遞一個請求和響應對象。Servlet首先判斷該請求是GET 操作還是POST 操作。然后它調用下面的一個方法:doGet 或 doPost。如果請求是GET就調用doGet方法,如果請求是POST就調用doPost方法。doGet和doPost都接受請求 (HttpServletRequest)和響應(HttpServletResponse)。

get和post這是http協議的兩種方法,另外還有head, delete等
這兩種方法有本質的區別,get只有一個流,參數附加在url后,大小個數有嚴格限制且只能是字符串。post的參數是通過另外的流傳遞的,不通過url,所以可以很大,也可以傳遞二進制數據,如文件的上傳。
在servlet開發中,以doGet()和doPost()分別處理get和post方法。
另外還有一個doService(), 它是一個調度方法,當一個請求發生時,首先執行doService(),不管是get還是post。在HttpServlet這個基類中實現了一個角度, 首先判斷是請求時get還是post,如果是get就調用doGet(), 如果是post就調用doPost()。你也可以直接過載doService()方法,這樣你可以不管是get還是post。都會執行這個方法。

service()是在javax.servlet.Servlet接口中定義的, 在 javax.servlet.GenericServlet 中實現了這個接口, 而 doGet/doPost 則是在 javax.servlet.http.HttpServlet 中實現的, javax.servlet.http.HttpServlet 是 javax.servlet.GenericServlet 的子類. 所有可以這樣理解, 其實所有的請求均首先由 service() 進行處理, 而在 javax.servlet.http.HttpServlet 的 service() 方法中, 主要做的事情就是判斷請求類型是 Get 還是 Post, 然后調用對應的 doGet/doPost 執行.

doGet:處理GET請求 doPost:處理POST請求 doPut:處理PUT請求 doDelete:處理DELETE請求 doHead:處理HEAD請求 doOptions:處理OPTIONS請求 doTrace:處理TRACE請求 通常情況下,在開發基於HTTP的servlet時,開發者只需要關心doGet和doPost方法,其它的方法需要開發者非常的熟悉HTTP編程,因此 這些方法被認為是高級方法。 而通常情況下,我們實現的servlet都是從HttpServlet擴展而來。 doPut和doDelete方法允許開發者支持HTTP/1.1的對應特性; doHead是一個已經實現的方法,它將執行doGet但是僅僅向客戶端返回doGet應該向客戶端返回的頭部的內容; doOptions方法自動的返回servlet所直接支持的HTTP方法信息; doTrace方法返回TRACE請求中的所有頭部信息。 對於那些僅僅支持HTTP/1.0的容器而言,只有doGet, doHead 和 doPost方法被使用,因為HTTP/1

service()是在javax.servlet.Servlet接口中定義的, 在 javax.servlet.GenericServlet 中實現了這個接口, 而 doGet/doPost 則是在 javax.servlet.http.HttpServlet 中實現的, javax.servlet.http.HttpServlet 是 javax.servlet.GenericServlet 的子類. 所有可以這樣理解, 其實所有的請求均首先由 service() 進行處理, 而在 javax.servlet.http.HttpServlet 的 service() 方法中, 主要做的事情就是判斷請求類型是 Get 還是 Post, 然后調用對應的 doGet/doPost 執行,doGet在地址欄中顯示請求的內容,doPost隱藏.
其時說來很簡單,在servlet中doPost方法里還是調用了doGet方法,所以在創建servlet時可以不要doPost方法,但在做大型項目涉及密碼的傳送時doPost方法會更安全些,通常情況下二者沒什么區別。

繼一下:

下面主要介紹javax.servlet.http提供的HTTP Servlet應用編程接口。

HTTP Servlet 使用一個 HTML 表格來發送和接收數據。要創建一個 HTTP Servlet,請擴展 HttpServlet 類,該類是用專門的方法來處理 HTML 表格的 GenericServlet 的一個子類。 HTML 表單是由和標記定義的。表單中典型地包含輸入字段(如文本輸入字段、復選框、單選按鈕和選擇列表)和用於提交數據的按鈕。當提交信息時,它們還指定服務器 應執行哪一個Servlet(或其它的程序)。 HttpServlet 類包含 init()、destroy()、service() 等方法。其中 init() 和 destroy() 方法是繼承的。

(1) init() 方法

在 Servlet 的生命期中,僅執行一次 init() 方法。它是在服務器裝入 Servlet 時執行的。 可以配置服務器,以在啟動服務器或客戶機首次訪問 Servlet 時裝入 Servlet。 無論有多少客戶機訪問 Servlet,都不會重復執行 init() 。

缺省的 init() 方法通常是符合要求的,但也可以用定制 init() 方法來覆蓋它,典型的是管理服務器端資源。 例如,可能編寫一個定制 init() 來只用於一次裝入 GIF 圖像,改進 Servlet 返回 GIF 圖像和含有多個客戶機請求的性能。另一個示例是初始化數據庫連接。缺省的 init() 方法設置了 Servlet 的初始化參數,並用它的 ServletConfig 對象參數來啟動配置, 因此所有覆蓋 init() 方法的 Servlet 應調用 super.init() 以確保仍然執行這些任務。在調用 service() 方法之前,應確保已完成了 init() 方法。

(2) service() 方法

service() 方法是 Servlet 的核心。每當一個客戶請求一個HttpServlet 對象,該對象的service() 方法就要被調用,而且傳遞給這個方法一個"請求"(ServletRequest)對象和一個"響應"(ServletResponse)對象作為參數。 在 HttpServlet 中已存在 service() 方法。缺省的服務功能是調用與 HTTP 請求的方法相應的 do 功能。例如, 如果 HTTP 請求方法為 GET,則缺省情況下就調用 doGet() 。Servlet 應該為 Servlet 支持的 HTTP 方法覆蓋 do 功能。因為 HttpServlet.service() 方法會檢查請求方法是否調用了適當的處理方法,不必要覆蓋 service() 方法。只需覆蓋相應的 do 方法就可以了。

當一個客戶通過HTML 表單發出一個HTTP POST請求時,doPost()方法被調用。與POST請求相關的參數作為一個單獨的HTTP 請求從瀏覽器發送到服務器。當需要修改服務器端的數據時,應該使用doPost()方法。

當一個客戶通過HTML 表單發出一個HTTP GET請求或直接請求一個URL時,doGet()方法被調用。與GET請求相關的參數添加到URL的后面,並與這個請求一起發送。當不會修改服務器端的數據時,應該使用doGet()方法。

Servlet的響應可以是下列幾種類型:

一個輸出流,瀏覽器根據它的內容類型(如text/HTML)進行解釋。

一個HTTP錯誤響應, 重定向到另一個URL、servlet、JSP。

(3) destroy() 方法

destroy() 方法僅執行一次,即在服務器停止且卸裝Servlet 時執行該方法。典型的,將 Servlet 作為服務器進程的一部分來關閉。缺省的 destroy() 方法通常是符合要求的,但也可以覆蓋它,典型的是管理服務器端資源。例如,如果 Servlet 在運行時會累計統計數據,則可以編寫一個 destroy() 方法,該方法用於在未裝入 Servlet 時將統計數字保存在文件中。另一個示例是關閉數據庫連接。

當服務器卸裝 Servlet 時,將在所有 service() 方法調用完成后,或在指定的時間間隔過后調用 destroy() 方法。一個Servlet 在運行service() 方法時可能會產生其它的線程,因此請確認在調用 destroy() 方法時,這些線程已終止或完成。

(4) GetServletConfig()方法

GetServletConfig()方法返回一個 ServletConfig 對象,該對象用來返回初始化參數和ServletContext。ServletContext 接口提供有關servlet 的環境信息。

(5) GetServletInfo()方法

GetServletInfo()方法是一個可選的方法,它提供有關servlet 的信息,如作者、版本、版權。

當服務器調用sevlet 的Service()、doGet()和doPost()這三個方法時,均需要 "請求"和"響應"對象作為參數。"請求"對象提供有關請求的信息,而"響應"對象提供了一個將響應信息返回給瀏覽器的一個通信途徑。

javax.servlet 軟件包中的相關類為ServletResponse和ServletRequest,而javax.servlet.http 軟件包中的相關類為HttpServletRequest 和 HttpServletResponse。

Servlet 通過這些對象與服務器通信並最終與客戶機通信。Servlet 能通過調用"請求"對象的方法獲知客戶機環境,服務器環境的信息和所有由客戶機提供的信息。Servlet 可以調用"響應"對象的方法發送響應,該響應是准備發回客戶機的。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM