Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 04_android入門_采用HttpURLConnection的GET方式實現登陸案例

04_android入門_采用HttpURLConnection的GET方式實現登陸案例

編輯:關於Android編程

1.概述

每個 HttpURLConnection 實例都可用於生成單個請求,但是其他實例可以透明地共享連接到 HTTP 服務器的基礎網絡。請求後在 HttpURLConnection 的 InputStream 或 OutputStream 上調用 close() 方法可以釋放與此實例關聯的網絡資源,但對共享的持久連接沒有任何影響。如果在調用 disconnect() 時持久連接空閒,則可能關閉基礎套接字。

2.在03_android入門_采用RelativeLayout實現登陸界面效果的案例繼續完善 效果如下:

\ \

點擊登陸按鈕 在服務器的控制台看到的結果<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+PGltZyBzcmM9"/uploadfile/Collfiles/20140523/2014052309114461.jpg" alt="\">

在點擊登陸按鈕之前,先通過eclipse中所帶的LogCat的工具,點擊

\

+號 彈出對話框

\

添加過濾的名稱和過濾的標識 點擊ok完成。

當點擊登陸按鈕之後即可在LogCat中看到執行的結果

\

當你輸入錯誤的用戶名和密碼的時候你可以看到如下效果

\

3.具體LoginActivity代碼的實現如下:(備注:在代碼中我添加了詳細的注釋請仔細閱讀)

package www.csdn.net.lesson03;

import java.io.ByteArrayOutputStream;
import java.io.InputStream;

import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;

import android.app.Activity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

public class LoginActivity extends Activity {

	// 聲明控件對象
	private EditText et_name, et_pass;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		// 設置顯示的視圖
		setContentView(R.layout.activity_login);
		// 通過 findViewById(id)方法獲取用戶名的控件對象
		et_name = (EditText) findViewById(R.id.et_name);
		// 通過 findViewById(id)方法獲取用戶密碼的控件對象
		et_pass = (EditText) findViewById(R.id.et_pass);

	}

	/**
	 * 通過android:onClick="login"指定的方法 , 要求這個方法中接受你點擊控件對象的參數v
	 * 
	 * @param v
	 */
	public void login(View v) {
		// 獲取點擊控件的id
		int id = v.getId();
		// 根據id進行判斷進行怎麼樣的處理
		switch (id) {
		// 登陸事件的處理
		case R.id.btn_login:
			// 獲取用戶名
			final String userName = et_name.getText().toString();
			// 獲取用戶密碼
			final String userPass = et_pass.getText().toString();
			if (TextUtils.isEmpty(userName) || TextUtils.isEmpty(userPass)) {
				Toast.makeText(this, "用戶名或者密碼不能為空", Toast.LENGTH_LONG).show();
			} else {
				System.out
						.println("----------------------發送請求到服務器----------------------");
				// 訪問網絡 (需要一個網絡的權限) 
				// 訪問網絡(耗時的操作) 避免阻塞主線程(UI) 需要開啟新的子線程來處理
				new Thread() {
					public void run() {
						// 調用loginByGet方法
						loginByGet(userName, userPass);

					};
				}.start();
			}

			break;

		default:
			break;
		}

	}

	/**
	 * 通過GET方式發送的請求
	 * 
	 * @param userName
	 * @param userPass
	 */
	public void loginByGet(String userName, String userPass) {

		try {
			// 設置請求的地址 通過URLEncoder.encode(String s, String enc)
			// 使用指定的編碼機制將字符串轉換為 application/x-www-form-urlencoded 格式
			String spec = "http://172.16.237.200:8080/video/login.do?username="
					+ URLEncoder.encode(userName, "UTF-8") + "&userpass="
					+ URLEncoder.encode(userPass, "UTF-8");
			// 根據地址創建URL對象(網絡訪問的url)
			URL url = new URL(spec);
			// url.openConnection()打開網絡鏈接
			HttpURLConnection urlConnection = (HttpURLConnection) url
					.openConnection();
			urlConnection.setRequestMethod("GET");// 設置請求的方式
			urlConnection.setReadTimeout(5000);// 設置超時的時間
			urlConnection.setConnectTimeout(5000);// 設置鏈接超時的時間
			// 設置請求的頭
			urlConnection
					.setRequestProperty("User-Agent",
							"Mozilla/5.0 (Windows NT 6.3; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0");
			// 獲取響應的狀態碼 404 200 505 302
			if (urlConnection.getResponseCode() == 200) {
				// 獲取響應的輸入流對象
				InputStream is = urlConnection.getInputStream();

				// 創建字節輸出流對象
				ByteArrayOutputStream os = new ByteArrayOutputStream();
				// 定義讀取的長度
				int len = 0;
				// 定義緩沖區
				byte buffer[] = new byte[1024];
				// 按照緩沖區的大小,循環讀取
				while ((len = is.read(buffer)) != -1) {
					// 根據讀取的長度寫入到os對象中
					os.write(buffer, 0, len);
				}
				// 釋放資源
				is.close();
				os.close();
				// 返回字符串
				String result = new String(os.toByteArray());
				System.out.println("***************" + result
						+ "******************");
			} else {
				System.out.println("------------------鏈接失敗-----------------");
			}

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

4.項目清單文件(AndroidManifest.xml)




    
    
    

    
        
            
                
                
            
        
    



5.關於服務器中我僅寫一個Servlet進行處理相應的請求處理

package www.csdn.net.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LoginServlet extends HttpServlet {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//獲取請求的參數值
		String userName = request.getParameter("username");
		String userPass = request.getParameter("userpass");
		
		System.out.println("在沒有轉碼之前的"+userName+"---"+userPass);
		//GET方式的請求亂碼處理
		userName = new String(userName.getBytes("ISO8859-1"),"UTF-8");
		userPass = new String(userPass.getBytes("ISO8859-1"),"UTF-8");

		System.out.println("在轉碼之後---"+userName+"---"+userPass);
		if("陳紅軍".equals(userName)&&"123".equals(userPass)){
			//響應登陸成功的信息
			response.getOutputStream().write("登陸成功".getBytes()); 
		}else{
			//相應登陸失敗的信息
			response.getOutputStream().write("登陸失敗".getBytes());
		}
		
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		this.doGet(request, response);
	}

}
對應的web.xml文件的配置是:



  video
  
  
    
    LoginServlet
    LoginServlet
    www.csdn.net.servlet.LoginServlet
  
  
  
    LoginServlet
    /login.do
  
  

6.關於程序中學生經常出現的bug分析

6.1.忘記在項目清單文件中添加訪問網絡的權限.

  
    
那麼程序運行的時候會出現如下bug

\

6.2.在按鈕點擊的事件處理中直接調用

loginByGet(userName, userPass);
方法沒有在子線程中調用
loginByGet(userName, userPass);
方法 就會出現如下bug

\

bug說明:在android4.0以後的版本中要想發送一個網絡的請求,就必須把這個請求寫在子線程中,否則就會出現如上的bug

6.3.在發送網路的請求的時候把請求的地址:

http://172.16.237.200:8080/video/login.do
寫成了

http://localhost:8080/video/login.do或者http://127.0.0.1:8080/video/login.do

就會出現如下bug:

\\


以上理解之後請同學們思考怎麼把返回的數據寫在下圖的位置尼

\


  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved