1. 程式人生 > >Get與Post區別與範例講解

Get與Post區別與範例講解

一、 J2EE WEB應用檔案目錄結構

Java Web應用由一組靜態HTML頁、Servlet、JSP和其他相關的class組成,它們一起構成一個大的工程專案。每種元件在Web應用中都有固定的存放目錄。Web應用的配置資訊存放在web.xml檔案中。在釋出某些元件(如Servlet)時,必須在web.xml檔案中新增相應的配置資訊
Java Web應用程式必須使用規範的目錄結構

1. 應用程式根目錄,可以取任意的名字,所有的HTML、JSP檔案都放在這個目錄下
  1.1 WEB-INF目錄: 必須目錄
    1.1.1 web.xml: Web應用部署描述檔案,必須檔案
    1.1.2 classes目錄:
      1) 用於存放單個*.classes位元組碼檔案,Servlet類檔案也存放在這個目錄下
    1.1.3 lib目錄:
      1) 存放第三方類庫檔案,即打包後的JAR檔案
    1.1.4 TLD檔案: 標籤庫描述檔案
  1.2 其他靜態檔案:
    1.2.1 HTML
    1.2.2 CSS
    1.2.3 JavaScript
    1.2.4 圖片等
  1.3 *.jsp: 存放任意多個JSP頁面


很多情況下,需要傳遞一些資訊,從瀏覽器到 Web 伺服器,最終到後臺程式。瀏覽器使用兩種方法可將這些資訊傳遞到 Web 伺服器,分別為 GET 方法和 POST 方法。

二、GET 方法

GET 方法向頁面請求傳送已編碼的使用者資訊。頁面和已編碼的資訊中間用 ? 字元分隔,如下所示:


http://www.test.com/hello?key1=value1&key2=value2

GET 方法是預設的從瀏覽器向 Web 伺服器傳遞資訊的方法,它會產生一個很長的字串,出現在瀏覽器的位址列中。如果您要向伺服器傳遞的是密碼或其他的敏感資訊,請不要使用 GET 方法。GET 方法有大小限制:請求字串中最多隻能有 1024 個字元。

這些資訊使用 QUERY_STRING 頭傳遞,並可以通過 QUERY_STRING 環境變數訪問,Servlet 使用 doGet() 方法處理這種型別的請求。

三、POST 方法

另一個向後臺程式傳遞資訊的比較可靠的方法是 POST 方法。POST 方法打包資訊的方式與 GET 方法基本相同,但是 POST 方法不是把資訊作為 URL 中 ? 字元後的文字字串進行傳送,而是把這些資訊作為一個單獨的訊息。訊息以標準輸出的形式傳到後臺程式,您可以解析和使用這些標準輸出。Servlet 使用 doPost() 方法處理這種型別的請求。

四、使用 Servlet 讀取表單資料

Servlet 處理表單資料,這些資料會根據不同的情況使用不同的方法自動解析:

  • getParameter():您可以呼叫 request.getParameter() 方法來獲取表單引數的值。
  • getParameterValues():如果引數出現一次以上,則呼叫該方法,並返回多個值,例如複選框。
  • getParameterNames():如果您想要得到當前請求中的所有引數的完整列表,則呼叫該方法。

五、二者區別

    首先:Post傳輸資料時,不需要在URL中顯示出來,而Get方法要在URL中顯示。 
    其次:Post傳輸的資料量大,可以達到2M,而Get方法由於受到URL長度限制,只能傳遞大約1024位元組. 
    再次:Post就是為了將資料傳送到伺服器段,Get就是為了從伺服器段取得資料.而Get之所以也能傳送資料,只是用來設計告訴伺服器,你到底需要什麼樣的資料.Post的資訊作為http請求的內容,而Get是在Http頭部傳輸的。


六、再說Servlet中的GET和POST之間的區別

        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。都會執行這個方法。

GET和POST的本質區別是什麼?
        使用GET,form中的資料將編碼到url中,而使用POST的form中的資料則在http協議的header中傳輸。在使用上,當且僅當請求冪等(字面意思是請求任意次返回同樣的結果,本質是請求本身不會改變伺服器資料和狀態)時使用GET,當請求會改變伺服器資料或狀態時(更新資料,上傳檔案),應該使用POST。
區別使用GET,POST意義何在?
重複訪問使用GET方法請求的頁面,瀏覽器會使用快取處理後續請求。使用POST方法的form提交時,瀏覽器基於POST將產生永久改變的假設,將讓使用者進行提交確認。當編成人員正確的使用GET,POST後,瀏覽器會給出很好的快取配合,時響應速度更快。
在form提交階段的差別
form提交的第一步是建立資料集,並根據ENCTYPE對資料集進行編碼。ENCTYPE有兩個值:multipart/form-data,application/x-www-form-urlencoded(預設值),前者可同時用於GET,POST,後者只用於POST。然後進行資料傳輸--對於GET方法,資料集使用content type application/x-www-form-urlencoded編碼並附在url後面,在這種模式下,資料嚴格限制為ASCII碼;對於POST,使用content type編碼字符集並將其構造成訊息傳送。
在伺服器處理部分的差別
原則上,除理GET和POST請求是沒有分別的。但由於資料通過不同的方法編碼,需要有不同的解碼機制。所以,方法變化將導致處理請求的程式碼變化。比如對於cgi,處理GET時通過環境變數獲得引數,處理POST請求時則通過標準輸入(stdin) 獲得資料。

從使用經驗,我們有如下總結:
1、get是把引數資料佇列加到提交表單的ACTION屬性所指的URL中,值和表單內各個欄位一一對應,在URL中可以看到。post是通過HTTP post機制,將表單內各個欄位與其內容放置在HTML HEADER內一起傳送到ACTION屬性所指的URL地址。使用者看不到這個過程。
2、對於get方式,伺服器端用Request.QueryString獲取變數的值,對於post方式,伺服器端用Request.Form獲取提交的資料。兩種方式的引數都可以用Request來獲得。
3、get傳送的資料量較小,不能大於2KB。post傳送的資料量較大,一般被預設為不受限制。但理論上,IIS4中最大量為80KB,IIS5中為100KB。
4、get安全性非常低,post安全性較高。
5、<form method="get" action="a.asp?b=b">跟<form method="get" action="a.asp">是一樣的,也就是說,action頁面後邊帶的引數列表會被忽視;而<form method="post" action="a.asp?b=b">跟<form method="post" action="a.asp">是不一樣的。

七、使用範例

在eclipse新建一個web工程,取名隨便,然後新增web.xml   index.jsp、還有servlet..結構如下:


GetServlet.java程式碼如下:

doGet

	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=UTF-8");
		PrintWriter out = response.getWriter();
		String name1 = request.getParameter("name1");
		String price1 = request.getParameter("price1");

		out.println("<HTML>");
		out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
		out.println("  <BODY>");
		out.print("    This is ");
		out.print(this.getClass());
		out.println(", using the POST method");
		out.println("<br></br>");
		out.println("名稱:"+name1);
		out.println("<br></br>");
		out.println("價格:"+price1);
		out.println("  </BODY>");
		out.println("</HTML>");
		out.flush();
		out.close();

	}
doPost
	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=UTF-8");
		PrintWriter out = response.getWriter();
		String name2 = request.getParameter("name2");
		String price2 = request.getParameter("price2");
		out.println("<HTML>");
		out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
		out.println("  <BODY>");
		out.print("    This is ");
		out.print(this.getClass());
		out.println(", using the POST method");
		out.println("<br></br>");
		out.println("名稱:"+name2);
		out.println("<br></br>");
		out.println("價格:"+price2);
		out.println("  </BODY>");
		out.println("</HTML>");
		out.flush();
		out.close();
	}

index.jsp:

<%@ page language="java" contentType="text/html" pageEncoding="UTF-8"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Insert title here</title>
</head>
<body>
	<form action="servlet/GetServlet" method="GET">
		名稱: <input type=text name=name1 value=""> 
		價格: <input type=text name=price1 value=""><br> 
		<input type="submit" value="您採用了GET方式提交"> <br> 
	</form>
	--------------------------------這是分割線-------------------------------------
	<br></br>
    <form action="servlet/GetServlet" method="POST">
		名稱: <input type=text name=name2 value=""> 
		價格: <input type=text name=price2 value=""><br> 
		<input type="submit" value="您採用了POST方式提交"> 
	</form>
</body>
</html>

web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
	<!-- 配置初始開啟的頁面 -->
	<welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  <servlet>
     <!-- 類名 -->
    <servlet-name>GetServlet</servlet-name>
    <!-- 所在的包 -->
    <servlet-class>com.mucfc.chapter0.GetServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>GetServlet</servlet-name>
    <!-- 訪問的網址 -->
    <url-pattern>/servlet/GetServlet</url-pattern>
    </servlet-mapping>
</web-app>
然後就是運行了:

用get提交

用post提交