Android學習筆記20:Http協議及Java Web編程


  在Android學習過程中,碰到很多地方需要使用到網絡編程相關的東西。很可惜以前沒接觸過網絡編程相關的知識,但是為了能夠繼續深入的學習Android開發,只好從頭開始一點一點學起,希望能夠補充一些關於網絡編程的知識。

  首先,需要搭建網絡編程的開發編譯環境,這里選擇了MyEclipse和Tomcat作為開發的平台。關於如何下載、安裝以及配置MyEclipse和Tomcat,可以參考百度文庫《Java Web開發環境的安裝與配置》(http://wenku.baidu.com/view/9673f831eefdc8d376ee325f.html),講解的非常詳細,按照上面的手順一步步的安裝,應該沒有問題。

  如何使用MyEclipse和Tomcat開發工具,在上述文檔中也有簡單提及。不過,還是讓我們在實戰中慢慢摸索吧。

1.Http協議簡介

  Http(超文本傳輸協議)用於傳送www方式的數據。www基於客戶端/服務器模型,由Web瀏覽器和Web服務器構成,兩者之間采用Http進行通信。

  Http協議采用請求/響應模型,是基於TCP/IP協議之上的協議,是Web瀏覽器和Web服務器之間的應用層協議,是通用的、無狀態的面向對象的協議。

1.1Http協議工作原理

  Web瀏覽器和Web服務器之間是如何建立連接的呢?主要是通過以下四個步驟實現的。

  第一步,在客戶端的瀏覽器中獲取用戶的輸入內容。

  第二步,瀏覽器得到網址后,內部會將域名發送到DNS上,進行域名解析,得到它的IP地址之后就會鏈接到對應的服務器上,從瀏覽器到服務器端口使用的是TCP/IP協議來完成的。

  第三步,使用Socket套接字來實現TCP/IP協議。

  第四步,服務器的80端口監聽客戶端的鏈接,完成客戶端到服務器的連接。

  上述四個步驟的具體實現過程如圖1所示。而在Internet內部可以通過三種方式來實現發送和接收數據,分別是Http協議、FTP協議和TCP/IP協議。

圖1 瀏覽器連接服務器內部原理圖

  由圖1可以看出,服務器返回客戶端的內容有三種形式,分別是:

  (1)以Html代碼的形式返回。

  (2)以xml字符串的形式返回,在Android開發中經常使用這種形式。

  (3)以Json數據形式返回,從網絡流量的角度考慮,Json方式要比xml方式好一些,且便於解析。

1.2Http協議請求體

  客戶端向服務器發送一個請求,請求體中一般包含了請求方法(post或get)、URL、協議版本、請求修飾符、客戶信息和內容的類似MIME的消息結構等。

  Http協議請求體的內容如圖2所示

圖2 Http協議請求體內容

1.3Http協議響應體

  服務器回應客戶端的請求,以一個狀態行作為響應,響應體的內容包括消息協議的版本、成功或錯誤編碼、服務器信息以及實體內容等。

  Http協議響應體的內容如圖3所示。

圖3 Http協議響應體內容

 

2.Java Web實例

  學習了Http協議的相關知識之后,就可以動手做一個簡單的Java Web實例了。

  因為是第一次進行Java Web的開發,所以雖然是一個簡單的實例,我還是會詳細的記錄開發過程中的每一步,算是當作備忘錄吧。

2.1新建工程

  運行MyEclipse軟件之后,選擇菜單欄的“File”,再選擇“New”,然后選擇“Web Project”,就會彈出如圖4所示的“New Web Project”對話框。

圖4 New Web Project對話框

  在如圖4所示的“New Web Project”對話框中,需要在Project Name后的輸入框中輸入項目名稱,比如“myhttpnew”,然后還需要勾選“Java EE 5.0”,最后點擊“Finish”按鈕即可完成創建。

  創建完成后,在左側的邊框欄中即可顯示出項目的資源目錄結構,如圖5所示。

圖5 項目資源目錄

2.2修改index.jsp文件

  雙擊打開index.jsp文件,可以看到其源代碼如下:

View Code
 1 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
 2 %>
 3 
 4 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 5 <html>
 6   <head>
 7     <base href="<%=basePath%>">
 8     
 9     <title>My JSP 'index.jsp' starting page</title>
10     <meta http-equiv="pragma" content="no-cache">
11     <meta http-equiv="cache-control" content="no-cache">
12     <meta http-equiv="expires" content="0">    
13     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
14     <meta http-equiv="description" content="This is my page">
15     <!--
16     <link rel="stylesheet" type="text/css" href="styles.css">
17     -->
18   </head>
19   
20   <body>
21     This is my JSP page. <br>
22   </body>
23 </html>

  這段代碼是一個基礎的Java Web框架,我們可以對其進行適當修改,就可以做一個簡單的Web網頁了。需要修改的地方有pageEncoding以及<head>和<body>中的部分內容,修改后的源碼如下: 

View Code
 1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
 2 <%
 3 String path = request.getContextPath();
 4 %>
 5 
 6 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 7 <html>
 8   <head>
 9     
10     <title>測試HTTP協議體的內容</title>
11     <meta http-equiv="pragma" content="no-cache">
12     <meta http-equiv="cache-control" content="no-cache">
13     <meta http-equiv="expires" content="0">    
14     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
15     <meta http-equiv="description" content="This is my page">
16     <!--
17     <link rel="stylesheet" type="text/css" href="styles.css">
18     -->
19   </head>
20   
21   <body>
22       <form name="form1" action="" method="post">
23           用戶名<input type="text" name="username" value=""/><br/>
24           密&nbsp;&nbsp;碼<input type="password" name="password" value=""/><br/>
25           <input type="submit" name="submit" value="提交"/>
26       </form>
27   </body>
28 </html>

  在修改后的代碼中,指定了編碼方式為“utf-8”,設置了網頁標題為“測試HTTP協議體的內容”。最重要的是改變了<body>中的內容,增添了“用戶名”輸入框和“密碼”輸入框以及一個“提交”按鈕。

  打開並運行Tomcat,在瀏覽器中輸入“localhost:8080/myhttpnew”,即可看到程序的運行效果如圖6所示。

圖6 網頁預覽效果

  在圖6所示的網頁中,我們可以輸入用戶名和密碼,並點擊“提交”,但是網頁不會有任何的響應,因為還缺少服務器回應客戶端請求的操作,所以我們還需要添加一些代碼來完成服務器對客戶端的請求所做出的回應。

2.3服務器回應客戶端請求

  為了方便管理代碼,可以新建一個包,然后將代碼放在指定的包當中。

  在src目錄上單擊鼠標右鍵,選擇“New”,再選擇“Package”,彈出如圖7所示的“New Java Package”對話框。

圖7 New Java Package對話框

  在圖7所示的“New Java Package”對話框中,需要在Name后的輸入框中輸入包名,比如“com.login.manager”,然后點擊“Finish”,完成包的創建,可以看到在src目錄的下面多了一條目錄結構“com.login.manager”。

  緊接着,我們還需要創建一個Servlet,用來完成服務器回應客戶端的代碼的實現。

  在目錄結構“com.login.manager”上單擊鼠標右鍵,選擇“New”,再選擇“Servlet”,將彈出如圖8所示的“Create a New Servlet”對話框。

圖8 Create a New Servlet對話框

  在圖8所示的“Create a New Servlet”對話框中,在Name后面的輸入框中輸入新建的類名,比如“LoginAction”,並且該類是繼承自“javax.servlet.http.HttpServlet”的,然后點擊“Next”,彈出如圖9所示的“Create a New Servlet”對話框。

圖9 Create a New Servlet對話框2

  直接點擊“Finish”按鈕,完成Servlet的創建。創建完成后,將在目錄“com.login.manager”下新增一個文件“LoginAction.java”,這正是我們所創建的用來完成服務器回應客戶端的代碼的實現的文件。

  打開LoginAction.java文件,可以看到其源碼如下:

View Code
 1 package com.login.manager;
 2 
 3 import java.io.IOException;
 4 import java.io.PrintWriter;
 5 
 6 import javax.servlet.ServletException;
 7 import javax.servlet.http.HttpServlet;
 8 import javax.servlet.http.HttpServletRequest;
 9 import javax.servlet.http.HttpServletResponse;
10 
11 public class LoginAction extends HttpServlet {
12 
13     /**
14      * Constructor of the object.
15      */
16     public LoginAction() {
17         super();
18     }
19 
20     /**
21      * Destruction of the servlet. <br>
22      */
23     public void destroy() {
24         super.destroy(); // Just puts "destroy" string in log
25         // Put your code here
26     }
27 
28     /**
29      * The doGet method of the servlet. <br>
30      *
31      * This method is called when a form has its tag value method equals to get.
32      * 
33      * @param request the request send by the client to the server
34      * @param response the response send by the server to the client
35      * @throws ServletException if an error occurred
36      * @throws IOException if an error occurred
37      */
38     public void doGet(HttpServletRequest request, HttpServletResponse response)
39             throws ServletException, IOException {
40 
41         response.setContentType("text/html");
42         PrintWriter out = response.getWriter();
43         out
44                 .println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
45         out.println("<HTML>");
46         out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
47         out.println("  <BODY>");
48         out.print("    This is ");
49         out.print(this.getClass());
50         out.println(", using the GET method");
51         out.println("  </BODY>");
52         out.println("</HTML>");
53         out.flush();
54         out.close();
55     }
56 
57     /**
58      * The doPost method of the servlet. <br>
59      *
60      * This method is called when a form has its tag value method equals to post.
61      * 
62      * @param request the request send by the client to the server
63      * @param response the response send by the server to the client
64      * @throws ServletException if an error occurred
65      * @throws IOException if an error occurred
66      */
67     public void doPost(HttpServletRequest request, HttpServletResponse response)
68             throws ServletException, IOException {
69 
70         response.setContentType("text/html");
71         PrintWriter out = response.getWriter();
72         out
73                 .println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
74         out.println("<HTML>");
75         out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");
76         out.println("  <BODY>");
77         out.print("    This is ");
78         out.print(this.getClass());
79         out.println(", using the POST method");
80         out.println("  </BODY>");
81         out.println("</HTML>");
82         out.flush();
83         out.close();
84     }
85 
86     /**
87      * Initialization of the servlet. <br>
88      *
89      * @throws ServletException if an error occurs
90      */
91     public void init() throws ServletException {
92         // Put your code here
93     }
94 
95 }

  在這里,我們只需要修改其中的doPost()方法即可,修改后的doPost()方法源碼如下所示:

View Code
 1     /**
 2      * The doPost method of the servlet. <br>
 3      *
 4      * This method is called when a form has its tag value method equals to post.
 5      * 
 6      * @param request the request send by the client to the server
 7      * @param response the response send by the server to the client
 8      * @throws ServletException if an error occurred
 9      * @throws IOException if an error occurred
10      */
11     public void doPost(HttpServletRequest request, HttpServletResponse response)
12             throws ServletException, IOException {
13 
14         response.setContentType("text/html");
15         PrintWriter out = response.getWriter();
16         
17         String username = request.getParameter("username");
18         String password = request.getParameter("password");
19         
20         if(username.equals("admin") && password.equals("123")) {
21             //表示服務器端返回的結果
22             out.print("login is success!");
23         }else {
24             out.print("用戶名或密碼不正確!");
25         }
26         
27         out.flush();
28         out.close();
29     }

  除此之外,我們還需要修改index.jsp文件中的<body>標簽下的<form>標簽中的action=""為action="<%=path%>/servlet/LoginAction",即指定響應執行的路徑。

  重新啟動Tomcat,並在圖6所示的網頁中輸入用戶名“admin”,密碼“123”,點擊“提交”之后,即可看到服務器響應了客戶端的請求,並給出了相應的回應信息“login is success!”,如圖10所示。

圖10 服務器響應結果

  至此,我們就完成了一個簡單的Java Web實例。

 

  備注:本博文根據《老羅Android開發視頻教程》android之Http協議編程第一集學習總結而得。《老羅Android開發視頻教程》網址http://www.verycd.com/topics/2929580/

 


免責聲明!

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



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