一 服務器準備:html
本文使用Tomcat 6作服務器。java
本文搭建服務器端使用MyEclipse 10。android
首先準備好Tomcat 6與MyEclipse 10,而且將服務器配置到MyEclipse中,對於長期作JavaWeb的同窗來講,固然知道了,在此不作贅述了。git
新建Web項目MyDemo,代碼以下:github
而後在項目中新建一個Servlet,具體以下:web
Login.java:apache
1 package cn.clear.demo; 2 3 import java.io.IOException; 4 5 import javax.servlet.ServletException; 6 import javax.servlet.http.HttpServlet; 7 import javax.servlet.http.HttpServletRequest; 8 import javax.servlet.http.HttpServletResponse; 9 10 public class Login extends HttpServlet { 11 12 public void doGet(HttpServletRequest request, HttpServletResponse response) 13 throws ServletException, IOException { 14 System.out.println("這是get請求"); 15 response.setContentType("text/html;charset=utf-8"); 16 String userName = request.getParameter("username"); 17 String userPass = request.getParameter("userpass"); 18 System.out.println(userName + " " + userPass); 19 if (userName != null || userPass != null) { 20 if (userName.equals("clear") && userPass.equals("123456")) { 21 response.getWriter().write("恭喜" + userName + "登錄成功!"); 22 } else { 23 response.getWriter().write("用戶名或者密碼錯誤!"); 24 } 25 } else { 26 response.getWriter().write("用戶名或者密碼爲空!"); 27 } 28 29 } 30 31 public void doPost(HttpServletRequest request, HttpServletResponse response) 32 throws ServletException, IOException { 33 System.out.println("這是post請求"); 34 response.setContentType("text/html;charset=utf-8"); 35 String userName = request.getParameter("username"); 36 String userPass = request.getParameter("userpass"); 37 System.out.println(userName + " " + userPass); 38 if (userName != null || userPass != null) { 39 if (userName.equals("clear") && userPass.equals("123456")) { 40 response.getWriter().write("恭喜" + userName + "登錄成功!"); 41 } else { 42 response.getWriter().write("用戶名或者密碼錯誤!"); 43 } 44 } else { 45 response.getWriter().write("用戶名或者密碼爲空!"); 46 } 47 48 } 49 50 }
web.xml:瀏覽器
1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app version="2.5" 3 xmlns="http://java.sun.com/xml/ns/javaee" 4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 5 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 6 http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 7 <display-name></display-name> 8 <servlet> 9 <servlet-name>Login</servlet-name> 10 <servlet-class>cn.clear.demo.Login</servlet-class> 11 </servlet> 12 13 <servlet-mapping> 14 <servlet-name>Login</servlet-name> 15 <url-pattern>/login</url-pattern> 16 </servlet-mapping> 17 <welcome-file-list> 18 <welcome-file>index.jsp</welcome-file> 19 </welcome-file-list> 20 </web-app>
啓動服務器,使用http://10.0.1.72:8080/MyDemo/login訪問,若是成功,此時MyEclipse的Console中將會顯示:服務器
這是get請求網絡
null null
瀏覽器將顯示:用戶名或者密碼爲空!
這是由於咱們沒有使用傳入任何參數。可是已經成功搭建並啓動好一個簡單的服務器。若是在瀏覽器地址欄中加入參數訪問的話http://10.0.1.72:8080/MyDemo/login?username=clear&userpass=123456
則Console中會打印:
這是get請求
clear 123456
瀏覽器顯示:恭喜clear登錄成功!
表示咱們的服務器接收參數和一系列交互是沒有問題的。那麼下面就能夠搭建Android客戶端代碼了。
二 客戶端:
準備好android開發環境,我這裏使用的開發工具是android studio。
Sdk版本以下:
新建項目LoginDemo,讓它自動生成MainActivity.java與activity_main.xml:
加入android-async-http框架jar包(具體請去https://github.com/loopj/android-async-http下載):android-async-http-1.4.7.jar
修改activity_main.xml中的代碼,具體以下:
1 <TableLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 xmlns:tools="http://schemas.android.com/tools" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:stretchColumns="1"> 6 7 <TableRow> 8 <TextView 9 android:layout_width="wrap_content" 10 android:layout_height="wrap_content" 11 android:textSize="20dp" 12 android:textColor="#ff7b09ff" 13 android:text="用戶名:"/> 14 <EditText 15 android:id="@+id/et_name" 16 android:layout_width="0dp" 17 android:layout_height="wrap_content" 18 android:layout_weight="1" 19 android:textColorHint="#ffabb3ff" 20 android:hint="請輸入您的用戶名"/> 21 </TableRow> 22 <TableRow> 23 <TextView 24 android:layout_width="wrap_content" 25 android:layout_height="wrap_content" 26 android:textSize="20dp" 27 android:textColor="#ff7b09ff" 28 android:text="密 碼:"/> 29 <EditText 30 android:id="@+id/et_pass" 31 android:layout_width="0dp" 32 android:layout_height="wrap_content" 33 android:layout_weight="1" 34 android:inputType="textPassword" 35 android:textColorHint="#ffabb3ff" 36 android:hint="請輸入您的密碼"/> 37 </TableRow> 38 <TableRow > 39 <Button 40 android:id="@+id/login" 41 android:onClick="login" 42 android:layout_height="wrap_content" 43 android:layout_span="2" 44 android:text="登錄"/> 45 </TableRow> 46 <TextView 47 android:id="@+id/result" 48 android:layout_width="match_parent" 49 android:layout_height="wrap_content" 50 android:gravity="center" 51 android:text="內容顯示區"/> 52 53 </TableLayout>
這樣創建一個登錄界面:
修改MainActivity.java的代碼:
1 package com.app.logindemo; 2 3 import android.app.Activity; 4 import android.os.Bundle; 5 import android.text.TextUtils; 6 import android.util.Log; 7 import android.view.View; 8 import android.view.Window; 9 import android.widget.EditText; 10 import android.widget.TextView; 11 import android.widget.Toast; 12 13 import com.loopj.android.http.AsyncHttpClient; 14 import com.loopj.android.http.AsyncHttpResponseHandler; 15 import com.loopj.android.http.RequestParams; 16 17 import org.apache.http.Header; 18 19 20 public class MainActivity extends Activity { 21 22 private EditText et_name,et_pass; 23 private TextView tv_result; 24 25 @Override 26 protected void onCreate(Bundle savedInstanceState) { 27 28 super.onCreate(savedInstanceState); 29 requestWindowFeature(Window.FEATURE_NO_TITLE); 30 setContentView(R.layout.activity_main); 31 32 //獲取控件的對象 33 et_name = (EditText) findViewById(R.id.et_name); 34 et_pass = (EditText) findViewById(R.id.et_pass); 35 tv_result = (TextView) findViewById(R.id.result); 36 37 } 38 39 //點擊登錄按鈕事件 40 public void login(View v){ 41 42 int id = v.getId(); 43 switch (id){ 44 case R.id.login: 45 //獲取用戶名和密碼 46 String userName = et_name.getText().toString(); 47 String userPass = et_pass.getText().toString(); 48 49 if (TextUtils.isEmpty(userName.trim()) || TextUtils.isEmpty(userPass.trim())){ 50 Toast.makeText(this,"用戶名或者密碼不能爲空",Toast.LENGTH_LONG).show(); 51 }else{ 52 //若是用戶名和密碼已經輸入,則進入如下方法 53 loginByAsyncHttpClientPost(userName, userPass); 54 //loginByAsyncHttpClientGet(userName,userPass); 55 } 56 break; 57 } 58 } 59 //post請求 60 private void loginByAsyncHttpClientPost(String userName, String userPass) { 61 //建立異步請求對象 62 AsyncHttpClient client = new AsyncHttpClient(); 63 //輸入要請求的url 64 String url = "http://10.0.1.72:8080/MyDemo/login?"; 65 //String url = "http://www.baidu.com"; 66 //請求的參數對象 67 RequestParams params = new RequestParams(); 68 //將參數加入到參數對象中 69 params.put("username",userName); 70 params.put("userpass",userPass); 71 //進行post請求 72 client.post(url, params, new AsyncHttpResponseHandler() { 73 //若是成功 74 @Override 75 public void onSuccess(int i, Header[] headers, byte[] bytes) { 76 //i表明狀態碼 77 if (i == 200){ 78 tv_result.setText(new String(bytes)); 79 } 80 } 81 //若是失敗 82 @Override 83 public void onFailure(int i, Header[] headers, byte[] bytes, Throwable throwable) { 84 //打印異常信息 85 throwable.printStackTrace(); 86 } 87 }); 88 89 } 90 //get請求 91 private void loginByAsyncHttpClientGet(String userName, String userPass) { 92 93 AsyncHttpClient client = new AsyncHttpClient(); 94 //String url = "http://www.baidu.com"; 95 String url = "http://10.0.1.72:8080/MyDemo/login?"; 96 97 RequestParams params = new RequestParams(); 98 params.put("username",userName); 99 params.put("userpass",userPass); 100 101 client.get(url, params, new AsyncHttpResponseHandler() { 102 @Override 103 public void onSuccess(int i, Header[] headers, byte[] bytes) { 104 105 Log.d("請求響應碼",i+""); 106 for (int ii = 0; ii < headers.length;ii++){ 107 Header header = headers[ii]; 108 Log.d("values","header name:"+header.getName()+" value:"+header.getValue()); 109 } 110 tv_result.setText(new String(bytes)); 111 } 112 113 @Override 114 public void onFailure(int i, Header[] headers, byte[] bytes, Throwable throwable) { 115 throwable.printStackTrace(); 116 } 117 }); 118 } 119 120 }
上面代碼53行和54行依次進行測試。
在AndroidManifest.xml中要加入網絡訪問受權,具體代碼以下:
1 <?xml version="1.0" encoding="utf-8"?> 2 <manifest xmlns:android="http://schemas.android.com/apk/res/android" 3 package="com.app.logindemo" > 4 <!--網絡受權--> 5 <uses-permission android:name="android.permission.INTERNET"/> 6 7 <application 8 android:allowBackup="true" 9 android:icon="@mipmap/ic_launcher" 10 android:label="@string/app_name" 11 android:theme="@style/AppTheme" > 12 <activity 13 android:name=".MainActivity" 14 android:label="@string/app_name" > 15 <intent-filter> 16 <action android:name="android.intent.action.MAIN" /> 17 18 <category android:name="android.intent.category.LAUNCHER" /> 19 </intent-filter> 20 </activity> 21 </application> 22 23 </manifest>
全部代碼都完成後啓動模擬器會跳轉到上圖界面:
不輸入用戶名和密碼,則會提示「用戶名或密碼不能爲空」
隨便輸入一個用戶名和密碼,點擊登錄會提示:
同時在MyECLipse中Console會打印:
這是post請求
sdfdsf sdfdfs
輸入正確的用戶名clear和密碼123456,則界面會顯示:
這樣就實現了android客戶端與服務端的數據交互,是否是很開心。
在此注意必定要進行網絡受權,不然會報錯且訪問不了服務器。