一,寫好服務器端
在eclipse或其它javaee開發工具中新建一個web項目(我這里的項目名是:Android),建一個servlet(我這里的servlet名是:LoginServlet),模擬實現數據庫,對安卓請求的數據判斷,並返回(封裝為json,需要json有解析json的jar包哦),servlet核心代碼如下:
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { number++; System.out.println("已經進入... ,第"+number+"次"); request.setCharacterEncoding("utf-8"); String name=""; String password = ""; name = request.getParameter("name"); password = request.getParameter("password"); String result = ""; //模擬數據庫獲取數據並判斷 if ("yyc".equals(name)&&"123456".equals(password)) { result="success"; }else{ result = "error"; } JSONObject jsonObject = new JSONObject(); jsonObject.put("result", result); response.getWriter().print(jsonObject); }
寫完了就可以發布在Tomcat服務器上(我們這里就寫一個servlet就足夠了),在瀏覽器中,訪問試試,看不能訪問,免得影響后續步驟的操作。測試鏈接,如:http://127.0.0.1:8080/Android/servlet/LoginServlet?name=yyc&password=123456
二、Android布局文件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <EditText android:id="@+id/nameEdit" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="點擊輸入用戶名" android:inputType="text" /> <EditText android:id="@+id/passwordEdit" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="點擊輸入密碼" android:inputType="numberPassword" /> <Button android:id="@+id/login" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="登錄(HttpClient)" /> <Button android:id="@+id/login1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="登錄(HttpURLConnection)" /> </LinearLayout>
從布局文件中可以看出寫了兩個輸入框,一個輸入用戶名,一個輸密碼,兩個按鈕,一個用於測試HttpClient通信,一個用於測試HttpURLConnection通信。我們先來實現HttpClient吧。
三、用HttpClient實現登陸認證(不建議)
在這之前,先在Android模擬器的瀏覽器中,訪問剛剛的地址,測試能不能訪問,不要影響我們后面的程序。注意:這時不能通過localhost來訪問了,通過ip,cmd輸入ipconfig可以查看ip地址。
現在高版本的android要使用HttpClient的話,要在build.gradle(app)中的android標簽中添加:useLibrary 'org.apache.http.legacy',由於我們要訪問網絡,我們需要設置網絡權限:在AndroidManifest.xml中加入網絡權限:<uses-permission android:name="android.permission.INTERNET"/>
在android studio中新建一個類:HttpUtilsHttpClient
public class HttpUtilsHttpClient { //1.創建HttpClient對象 private static HttpClient httpClient = new DefaultHttpClient(); public static String BASE_URL= "http://你的ip地址:8080/Android"; /** * GET方式 * @param url * @return */ public static String getRequest(String url){ String result = ""; //2.創建HttpGet對象 HttpGet httpGet= new HttpGet(url); try { //3.發送Get請求 HttpResponse response = httpClient.execute(httpGet); if (response.getStatusLine().getStatusCode() == 200){ //4.獲取服務器返回的數據 HttpEntity entity = response.getEntity(); result = EntityUtils.toString(entity); } } catch (IOException e) { e.printStackTrace(); } return result ; } public static String postRequest(String url,Map<String,String> params){ String result = ""; HttpPost httpPost = new HttpPost(url); List<NameValuePair> parameters = new ArrayList<>(); for (Map.Entry<String,String> entry: params.entrySet()) { NameValuePair pair = new BasicNameValuePair(entry.getKey(),entry.getValue()); parameters.add(pair); } try { httpPost.setEntity(new UrlEncodedFormEntity(parameters,"utf-8")); HttpResponse response = httpClient.execute(httpPost); if (response.getStatusLine().getStatusCode() == 200){ //4.獲取服務器返回的數據 HttpEntity entity = response.getEntity(); result = EntityUtils.toString(entity); } }catch (IOException e) { e.printStackTrace(); } return result; } }
這個類總共兩個方法getRequest故名思意就是Get請求,postRequest就是post方式請求,由於我們要傳參數(name和password),我們這里真正使用的是post請求。參數保存在一個map集合中。執行后返回String類型的參數,其實就是json字符串。
然后在MainActivity中調用PostRequest方法(設置url和參數),並對放回的String字符串(json)解析,做出相應的表現(Toast成功或者失敗);
private void loginButtonHttpClientOption() { loginButtonHttpClient.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { new Thread(new Runnable() { @Override public void run() { String url=HttpUtilsHttpClient.BASE_URL+"/servlet/LoginServlet"; Map<String ,String > params = new HashMap<String, String>(); String name=nameEdit.getText().toString(); String password=passwordEdit.getText().toString(); params.put("name",name); params.put("password",password); //請求,返回json String result = HttpUtilsHttpClient.postRequest(url, params); Message msg = new Message(); msg.what=0x11; Bundle data=new Bundle(); data.putString("result",result); msg.setData(data); hander.sendMessage(msg); } Handler hander = new Handler(){ @Override public void handleMessage(Message msg) { if (msg.what==0x11){ Bundle data = msg.getData(); String key = data.getString("result");//得到json返回的json數據 // Toast.makeText(MainActivity.this,key,Toast.LENGTH_LONG).show(); try { JSONObject json= new JSONObject(key); String result = (String) json.get("result"); if ("success".equals(result)){ Toast.makeText(MainActivity.this,"登錄成功",Toast.LENGTH_LONG).show(); }else if("error".equals(result)){ Toast.makeText(MainActivity.this,"登錄失敗",Toast.LENGTH_LONG).show(); } } catch (JSONException e) { e.printStackTrace(); } } } }; }).start(); } }); }
loginButtonHttpClientOption這個方法主要就是一個按鈕的點擊事件監聽,設置url、獲取EditText中的值后封裝在map中后,我們就可以請求http了(調用HttpUtilsHttpClient.postRequest(url, params);)。
而Handler的作用是一般情況下,在主線程中我們綁定了Handler,並在事件觸發上面創建新的線程用於完成某些耗時的操作(我們這里用線程訪問了網絡),當子線程中的工作完成之后,會對Handler發送一個完成的信號,
而Handler接收到信號后,就進行主UI界面的更新操作(我們這里直接判斷並Toast)。對Handler和線程不理解的話,可以去百度搜搜其它技術貼看看。
四、使用HttpURLConnection實現登錄驗證(建議)
安卓建議我們使用這種方式,我們也不用修改build文件了,但還是需要在AndroidManifest.xml文件中加入網絡權限:<uses-permission android:name="android.permission.INTERNET"/>
新建類:HttpUtilsHttpURLConnection
public class HttpUtilsHttpURLConnection {
public static String BASE_URL= "http://你的ip地址:8080/Android";
/*
* urlStr:網址
* parms:提交數據
* return:網頁源碼
* */
public static String getContextByHttp(String urlStr,Map<String,String> parms){
StringBuilder sb = new StringBuilder();
try{
URL url = new URL(urlStr);
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
connection.setRequestMethod("POST");
connection.setReadTimeout(5000);
connection.setConnectTimeout(5000);
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setInstanceFollowRedirects(true);
OutputStream outputStream = connection.getOutputStream();
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream,"UTF-8"));
writer.write(getStringFromOutput(parms));
writer.flush();
writer.close();
outputStream.close();
if(connection.getResponseCode() == HttpURLConnection.HTTP_OK){
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String temp;
while((temp = reader.readLine()) != null){
sb.append(temp);
}
reader.close();
}else{
return "connection error:" + connection.getResponseCode();
}
connection.disconnect();
}catch (Exception e){
return e.toString();
}
return sb.toString();
}
/**
* 將map轉換成key1=value1&key2=value2的形式
* @param map
* @return
* @throws UnsupportedEncodingException
*/
private static String getStringFromOutput(Map<String,String> map) throws UnsupportedEncodingException {
StringBuilder sb = new StringBuilder();
boolean isFirst = true;
for(Map.Entry<String,String> entry:map.entrySet()){
if(isFirst)
isFirst = false;
else
sb.append("&");
sb.append(URLEncoder.encode(entry.getKey(),"UTF-8"));
sb.append("=");
sb.append(URLEncoder.encode(entry.getValue(),"UTF-8"));
}
return sb.toString();
}
}
這個和上面講的那個HeepClient也沒多大區別,有異曲同工之妙嘛。仔細店看看就懂了。
點擊事件監聽代碼:
這和上面的那個點擊事件也是一樣的啦,沒什么好說的。同樣的是設置url、獲取EditText中的值后封裝在map中后,請求http。返回數據並解析。
private void loginButtonHttpURLConnectionOption() { loginButtonHttpURLConnection.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { new Thread(new Runnable() { @Override public void run() { String url=HttpUtilsHttpURLConnection.BASE_URL+"/servlet/LoginServlet"; Map<String, String> params = new HashMap<String, String>(); String name=nameEdit.getText().toString(); String password=passwordEdit.getText().toString(); params.put("name",name); params.put("password",password); String result = HttpUtilsHttpURLConnection.getContextByHttp(url,params); Message msg = new Message(); msg.what=0x12; Bundle data=new Bundle(); data.putString("result",result); msg.setData(data); hander.sendMessage(msg); } Handler hander = new Handler(){ @Override public void handleMessage(Message msg) { if (msg.what==0x12){ Bundle data = msg.getData(); String key = data.getString("result");//得到json返回的json // Toast.makeText(MainActivity.this,key,Toast.LENGTH_LONG).show(); try { JSONObject json= new JSONObject(key); String result = (String) json.get("result"); if ("success".equals(result)){ Toast.makeText(MainActivity.this,"登錄成功",Toast.LENGTH_LONG).show(); }else if("error".equals(result)){ Toast.makeText(MainActivity.this,"登錄失敗",Toast.LENGTH_LONG).show(); } } catch (JSONException e) { e.printStackTrace(); } } } }; }).start(); } }); }
效果圖:
成功: 失敗:
最后貼上MainActivity的所有代碼:

1 package com.yyc.webservice; 2 3 import android.os.Handler; 4 import android.os.Message; 5 import android.support.v7.app.AppCompatActivity; 6 import android.os.Bundle; 7 import android.view.View; 8 import android.widget.Button; 9 import android.widget.EditText; 10 import android.widget.Toast; 11 12 import org.json.JSONException; 13 import org.json.JSONObject; 14 15 import java.util.HashMap; 16 import java.util.Map; 17 18 public class MainActivity extends AppCompatActivity { 19 20 private EditText nameEdit,passwordEdit; 21 private Button loginButtonHttpClient,loginButtonHttpURLConnection; 22 @Override 23 protected void onCreate(Bundle savedInstanceState) { 24 super.onCreate(savedInstanceState); 25 setContentView(R.layout.activity_main); 26 27 init(); 28 loginButtonHttpClientOption(); 29 loginButtonHttpURLConnectionOption(); 30 31 32 } 33 34 private void loginButtonHttpURLConnectionOption() { 35 loginButtonHttpURLConnection.setOnClickListener(new View.OnClickListener() { 36 @Override 37 public void onClick(View v) { 38 new Thread(new Runnable() { 39 @Override 40 public void run() { 41 String url=HttpUtilsHttpURLConnection.BASE_URL+"/servlet/LoginServlet"; 42 Map<String, String> params = new HashMap<String, String>(); 43 String name=nameEdit.getText().toString(); 44 String password=passwordEdit.getText().toString(); 45 params.put("name",name); 46 params.put("password",password); 47 48 String result = HttpUtilsHttpURLConnection.getContextByHttp(url,params); 49 50 Message msg = new Message(); 51 msg.what=0x12; 52 Bundle data=new Bundle(); 53 data.putString("result",result); 54 msg.setData(data); 55 56 57 hander.sendMessage(msg); 58 } 59 60 Handler hander = new Handler(){ 61 @Override 62 public void handleMessage(Message msg) { 63 if (msg.what==0x12){ 64 Bundle data = msg.getData(); 65 String key = data.getString("result");//得到json返回的json 66 // Toast.makeText(MainActivity.this,key,Toast.LENGTH_LONG).show(); 67 try { 68 JSONObject json= new JSONObject(key); 69 String result = (String) json.get("result"); 70 if ("success".equals(result)){ 71 Toast.makeText(MainActivity.this,"登錄成功",Toast.LENGTH_LONG).show(); 72 }else if("error".equals(result)){ 73 Toast.makeText(MainActivity.this,"登錄失敗",Toast.LENGTH_LONG).show(); 74 } 75 } catch (JSONException e) { 76 e.printStackTrace(); 77 } 78 } 79 } 80 }; 81 }).start(); 82 } 83 }); 84 } 85 86 private void loginButtonHttpClientOption() { 87 loginButtonHttpClient.setOnClickListener(new View.OnClickListener() { 88 @Override 89 public void onClick(View v) { 90 new Thread(new Runnable() { 91 @Override 92 public void run() { 93 String url=HttpUtilsHttpClient.BASE_URL+"/servlet/LoginServlet"; 94 Map<String ,String > params = new HashMap<String, String>(); 95 String name=nameEdit.getText().toString(); 96 String password=passwordEdit.getText().toString(); 97 params.put("name",name); 98 params.put("password",password); 99 //請求,返回json 100 String result = HttpUtilsHttpClient.postRequest(url, params); 101 Message msg = new Message(); 102 msg.what=0x11; 103 Bundle data=new Bundle(); 104 data.putString("result",result); 105 msg.setData(data); 106 107 108 hander.sendMessage(msg); 109 } 110 111 Handler hander = new Handler(){ 112 @Override 113 public void handleMessage(Message msg) { 114 if (msg.what==0x11){ 115 Bundle data = msg.getData(); 116 String key = data.getString("result");//得到json返回的json 117 // Toast.makeText(MainActivity.this,key,Toast.LENGTH_LONG).show(); 118 try { 119 JSONObject json= new JSONObject(key); 120 String result = (String) json.get("result"); 121 if ("success".equals(result)){ 122 Toast.makeText(MainActivity.this,"登錄成功",Toast.LENGTH_LONG).show(); 123 }else if("error".equals(result)){ 124 Toast.makeText(MainActivity.this,"登錄失敗",Toast.LENGTH_LONG).show(); 125 } 126 } catch (JSONException e) { 127 e.printStackTrace(); 128 } 129 } 130 } 131 }; 132 }).start(); 133 } 134 }); 135 } 136 137 private void init() { 138 nameEdit = (EditText) findViewById(R.id.nameEdit); 139 passwordEdit = (EditText) findViewById(R.id.passwordEdit); 140 loginButtonHttpClient = (Button) findViewById(R.id.login); 141 loginButtonHttpURLConnection= (Button) findViewById(R.id.login1); 142 } 143 }
有任何問題可以加小編微信一起討論哦:java_squirrel