標籤:order 小結 並且 app title ref encode bsp 設定
需求:設計一個注冊網頁用於錄入username和登入password。並將資料傳入server並顯示出來。
1、前言:網頁提交的 get 和 post 兩種方式。
(1)對於get提交方式,以本文中範例為例。server接收到的完整資訊為:
</pre><pre name="code" class="java"><span style="font-size:14px;">GET /?username=admin&password=admin HTTP/1.1(要求標頭和請求體在一起)Accept(表示可以接受的類型): application/x-shockwave-flash, image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*Accept-Language: zh-cn(表示接收的為中文)User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; InfoPath.2)Accept-Encoding(接收編碼): gzip(壓縮程式), deflateHost: 192.168.3.100:10000(server的IP及port號)Connection: Keep-Alive(保持串連)</span>
我們發送的實質資料(username=admin&password=666)稱為請求體,其他的稱為要求標頭,能夠發現get方式是將請求體放在了要求標頭內部。由於要求標頭和請求體就像文章的標題和內容一樣。標題必然不能有太多資料,而內容資料大小卻沒有限制。
所以要求標頭資料容量非常小。一般僅僅有8k,所以假設將請求體放在要求標頭內部時。不能用於傳輸圖片、音頻、視頻等大型資料,而放在要求標頭外部則對資料大小沒有限制。
所以能得出 get 方式提交特點為:資料有限制,可是由於放在了要求標頭,首先被提交。所以提交速度非常快這個和網路傳輸中的UDP協議(請猛點這裡)特點非常類似。
get方式提交另一個缺點就是:被提交的內容會在地址欄中顯示。如:
(2)對於 post 提交方式,以本文中範例為例,server接收到的完整資訊為:
<span style="font-size:14px;">POST / HTTP/1.1(我是要求標頭開始)Accept: application/x-shockwave-flash, image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-ms-application, application/x-ms-xbap, application/vnd.ms-xpsdocument, application/xaml+xml, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*Accept-Language: zh-cnUser-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; InfoPath.2)Content-Type: application/x-www-form-urlencodedAccept-Encoding: gzip, deflateHost: 192.168.3.100:10000Content-Length: 29Connection: Keep-AliveCache-Control: no-cache(我是要求標頭結束)username=admin&password=admin(我是請求體)</span>
能夠看見,post方式中要求標頭和請求體是分開的,中間隔了兩個空行(說明隔了兩個“ / r / n”。這將是後面server提取請求體內容的重要根據) 。由於請求體中的資料大小沒有限制。所以post提交方式的特點為:
特點:傳輸資料大小無限制,可是傳輸速度慢。並且沒有地址欄暴露使用者資訊的缺陷。
2、設計網頁
<span style="font-size:14px;"><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN""http://www.w3.org/TR/html4/loose.dtd"><html xmlns="http://www.w3.org/1999/xhtml"> <span style="font-family: Arial, Helvetica, sans-serif;"><!-- 這個頁面的頭部表示了w3c的規範資訊。 --></span> <head> <meta http-equiv="Content-Type" content="text/html; charset=GBK" /> <title>使用者登入</title> </head> <body> <form action="http://192.168.3.100:888888" method="post"> //表示將要訪問IP地址為<span style="font-family: Arial, Helvetica, sans-serif;">192.168.3.100的server上port為888888的應用程式,這裡設定為post 方式提交</span><table border="1" align="center" width="40%"><caption>使用者登入</caption><tr><td>使用者名稱:</td><td><input type="text" name="username" id="username" /> //文字框用於輸入文本</td></tr><tr><td>密碼:</td><td><input type="password" name="password" id="password" /> //密碼框用於輸入密碼</td></tr><tr><td>郵箱:</td><td><input type="text" name="email" id="email" /> </td></tr><tr><td colspan="2" align="center"> //合并兩列,格式為置中<input type="submit" value="登入" /> //提交button,值設為登入 <input type="reset" value="重設" /> //重設button</td></tr></table> </form> </body></html></span>
實現網頁效果為:
3、自己定義server(如果我輸入的username為admin。password為666)
<span style="font-size:14px;">public class LoginServer {public static void main(String[] args) throws IOException {// 建立serverSocket對象,port設定為888888ServerSocket ss = new ServerSocket(888888);// 監聽client串連Socket s = ss.accept();System.out.println("串連成功"); //假設有對象成功串連到server。輸出資訊提示// 擷取輸入資料流InputStream is = s.getInputStream();byte[] bys = new byte[1024]; //用字元數組接收,大小設定為1024位元組int len = is.read(bys); //定義len為每次實際讀到的內容長度String data = new String(bys, 0, len); //由於是post方式提交,所以此處得到的data內容是標題1中post方式提交server得到的完整資料狀態//由於post提交,請求體通過連續兩次的\r\n和要求標頭隔開,而我們須要的資料是請求體。所以我們擷取請求體內容步驟為:int index = data.indexOf("\r\n\r\n"); //<span style="font-family: Arial, Helvetica, sans-serif;">首先擷取連續兩次的\r\n的索引位置</span>String newData = data.substring(index+4); //獲得請求體。此時newData實際內容為:<span style="font-family: Arial, Helvetica, sans-serif;">username=admin&password=666</span>//將請求體分解String username = getParameter("username",newData); //調用<span style="font-family: Arial, Helvetica, sans-serif;">getParameter方法擷取newData中的username內容</span>String password = getParameter("password",newData); //<span style="font-family: Arial, Helvetica, sans-serif;">調用</span><span style="font-family: Arial, Helvetica, sans-serif;">getParameter方法擷取newData中的password內容</span>String email = getParameter("email",newData); //<span style="font-family: Arial, Helvetica, sans-serif;">調用</span><span style="font-family: Arial, Helvetica, sans-serif;">getParameter方法擷取newData中的email內容</span>//擷取輸出資料流。在網頁中返回資訊PrintWriter pw = new PrintWriter(s.getOutputStream(),true); //得到列印流對象pw.println("使用者登入成功<br/>"); //在網頁中輸出登陸成功提示pw.println("使用者名稱是:<font color=red>"+username+"</font><br/>"); //顯示使用者注冊名pw.println("密碼是:"+password+"<br/>"); //顯示使用者注冊密碼pw.println("郵箱是:"+email+"<br/>"); //顯示使用者注冊郵箱pw.close(); //關閉列印流對象,由於server須要全天候處於開啟狀態。所以不關閉socket對象}private static String getParameter(String key, String newData) { //自己定義getParameter方法。用於擷取請求體中的對象String[] datas = newData.split("&"); //將資料按&分為兩部分並存入datas數組中,當中datas[0]=(username=admin)。datas[1]=(password=666)for(String data : datas){ //增強for遍曆datas數組//username=adminString[] keyAndValue = data.split("="); //根據“=”進行資料拆分if(keyAndValue[0].equals(key)){ //根據傳入參數進行匹配return keyAndValue[1];}}return null; //假設沒有則返回null}}</span>
小結:網頁資料提交主要有get和post兩種方式。其各有利弊。get主要特點為速度快。容量小;post主要特點為速度慢,容量大。另外。在進行資料傳送之前,要注意首先保證server已經開啟並處於監聽狀態。
設計網頁錄入資訊與自己定義server資料接收