在Android學習過程中,碰到很多地方需要使用到網路編程相關的東西。很可惜以前沒接觸過網路編程相關的知識,但是為了能夠繼續深入的學習Android開發,只好從頭開始一點一點學起,希望能夠補充一些關於網路編程的知識。
講解的非常詳細,按照上面的手順一步步的安裝,應該沒有問題。
如何使用MyEclipse和Tomcat開發工具,在上述文檔中也有簡單提及。不過,還是讓我們在實戰中慢慢摸索吧。
1.Http協議簡介
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 密 碼<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執行個體。