1. 程式人生 > >05.HTTP程式設計實戰:高校資訊查詢平臺之登入模組

05.HTTP程式設計實戰:高校資訊查詢平臺之登入模組

     在瞭解了Android的HTTP應用程式設計相關知識後,我們通過一個例項來進一步深化基於HTTP協議的Android客戶端應用的開發,即模擬高效資訊查詢平臺例項。該APP應用作為高校資訊查詢客戶端,可以完成使用者的註冊、登入,資訊查詢、資料的下載與上傳等功能,整體開發流程圖如下:
基礎知識: 一、登入模組服務端 1.(MyEclipse)src/../DBUtil.java:資料庫工具類(JDBC,連結資料庫)     由於高效資訊查詢平臺客戶端訪問的是伺服器MySQL資料庫,首先,需在MyEclipse建立一個Java Web工程並建立一個數據庫工具類DBUtil.java,然後將MySQL資料庫驅動"mysql-connector-java-3.1.11-bin.jar"拷貝到該工程目錄下(假設MySQL資料庫在伺服器主機已經安裝配置好)。
資料庫工具類主要完成以下功能:     (1)載入資料庫驅動,建立Java Web應用與MySQ資料庫之間的連線;     (2)實現解析SQL語句,且訪問資料庫相關方法(如登入時查詢資料庫資料);
  1. package com.jiangdongguo.login;  
  2. import java.sql.Connection;  
  3. import java.sql.DriverManager;  
  4. import java.sql.SQLException;  
  5. import com.mysql.jdbc.PreparedStatement;  
  6. import com.mysql.jdbc.ResultSet;  
  7. /*訪問資料庫工具類:獲取資料庫連結*/  
  8. public class DBUtil {  
  9.     private String dbName = "ServerDatabase";   //資料庫名  
  10.     private String url="jdbc:mysql://localhost:3306/"+dbName;//URI 
  11.     private String user="root";                       //MySQL資料庫root賬戶  
  12.     private String psd="111111";                  //MySQL賬戶密碼  
  13.     private
     PreparedStatement ps;                 
  14.     private ResultSet result;  
  15.     //獲取資料庫連結的方法getConn()  
  16.     private Connection conn;                      
  17.     public Connection getConn()  
  18.     {         
  19.         try {  
  20.             Class.forName("com.mysql.jdbc.Driver");             //根據字串new一個例項,Class類為類裝載器
  21.             conn=DriverManager.getConnection(url,user,psd); //獲取資料庫連結,傳入引數:資料庫名稱、賬戶名、密碼  
  22.         } catch (Exception e) {  
  23.             e.printStackTrace();  
  24.         }  
  25.         return conn;      
  26.     }  
  27.     //查詢資料庫業務邏輯 
  28.     public boolean checkUser(String sql,String[] args)  
  29.     {  
  30.         boolean flag=false;  
  31.         conn=getConn();     //獲得資料庫連結  
  32.         try {  
  33.             ps=(PreparedStatement) conn.prepareStatement(sql);  
  34.             if(args!=null)  //對sql語句每個佔位符賦值  
  35.             {  
  36.                 for(int i=0;i<args.length;i++)  
  37.                     ps.setString(i+1, args[i]);  
  38.                 result=(ResultSet) ps.executeQuery();   //執行sql查詢語句,並返回結果集
  39.                 if(result.next())                                      //遍歷結果集,如果存在傳遞過來的資料(欄位)的記錄返回true
  40.                 {  
  41.                     flag=true;  
  42.                 }  
  43.             }  
  44.         } catch (SQLException e) {  
  45.             e.printStackTrace();  
  46.         }         
  47.         return flag;          
  48.     }  
  49. }  
2.(MyEclipse)src/../LoginServlet.java:Servlet(Java Web應用的Servlet)     Servlet(Server+let)是在伺服器上執行的小程式,具有獨立於平臺和協議的特性,可以生成動態的web頁面,用於處理及響應客戶端的請求,擔當客戶請求(web瀏覽器或其他HTTP客戶程式)與伺服器響應(HTTP伺服器上的資料庫或應用程式)的中間層Servlet實質上是個特殊的Java類,該類繼承於Servley或其子類(如HttpServlet),Servlet用於處理和響應客戶端的請求,Servlet提供了不同的方法用於響應客戶端請求。通常客戶端的請求只有GET和POST兩種,Servlet為了響應這兩種請求,只需重寫doGet()和doPost()兩個方法即可。 為登入模組建立一個LoginServlet類  功能: ①重寫響應客戶端的GET請求方法獲取客戶端登入模組傳遞到伺服器的資料;               例項化資料庫工具類,建立Java Web應用與資料庫的連線並傳遞查詢資料庫的sql語句(登入功能的具體實現);
原始碼:
  1. package com.jiangdongguo.login;  
  2. import java.io.IOException;  
  3. import java.io.PrintWriter;  
  4. import javax.servlet.ServletException;  
  5. import javax.servlet.http.HttpServlet;  
  6. import javax.servlet.http.HttpServletRequest;  
  7. import javax.servlet.http.HttpServletResponse;  
  8. //查詢伺服器資料庫中的資料  
  9. public class LoginServlet extends HttpServlet {  
  10.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
  11.             throws ServletException, IOException {  
  12.         response.setContentType("text/html");           //設定返回型別為網頁形式  
  13.         PrintWriter out = response.getWriter();         //輸出  
  14.         String name = request.getParameter("username"); //獲取請求傳入的引數-使用者名稱資訊  
  15.         String psd = request.getParameter("psd");       //              -密碼  
  16.         System.out.println("username="+name+"psd="+psd);  //列印獲取的客戶端資料到Tomcat觀察視窗
  17.         //使用MySql資料庫  
  18.         DBUtil dbUtil = new DBUtil();  
  19.         boolean result=dbUtil.checkUser("select * from users where user_name=? and user_psd=?"new String[]{name,psd});  
  20.         out.print(result);  
  21.     }  
  22.     public void doPost(HttpServletRequest request, HttpServletResponse response)  
  23.             throws ServletException, IOException {  
  24.         this.doGet(request, response);  
  25.     }  
3.測試Java Web應用程式 (1)安裝Tomcat伺服器 (2)在Tomcat中部署Java Web應用   Tomcat安裝目錄下的conf資料夾下的Server.xml, 在該檔案的倒數第四行即</host>標籤之上,新增如下程式碼。
    ◆path虛擬路徑,啟動Tomcat後,可通過http://localhost:8080/login/來訪問該專案中的相關頁面;                    ◆docBase:Servlet專案根目錄所在路徑,是本機上的一個絕對路徑,即Java Web應用所存放的位置,需要定位到WebRoot目錄下;       ◆reloadable:設定為"true",表示修改Servlet檔案後,不需要重啟伺服器就可以實現頁面的同步更新 (3)在瀏覽器中輸入:http://localhost:8080/,點選"Manager App"        注:在Applications欄目,檢視Path列是否包含"/login"(path=/login在部署Java web時設定),否則,說明部署不成功 (4)啟動Tomcat:雙擊bin目錄下的Tomcat7.exe(Tomcat觀察視窗) (5)測試     點選"/login"進入web應用,瀏覽器中輸入"http://localhost:8080/login/LoginServlet?username=jiangdongguo&psd=111"作為客戶端訪問伺服器,觀察如下: A.假如資料庫存在("username=jiangdongguo","psd=111")記錄,網頁介面顯示"true"且Tomcat觀察視窗顯示接"username=jiangdongguo","psd=111",則說明Java Web應用(伺服器端)開發成功,且訪問MySQL資料庫成功。 B.假如資料庫存在("username=jiangdongguo","psd=111")記錄,網頁介面顯示"false"且Tomcat觀察視窗顯示接"username=jiangdongguo","psd=111",則說明Java Web應用(伺服器端)開發成功,且訪問MySQL資料庫成功。      否則,說明Java Web應用開發不成功,或者,連線MySQL資料失敗。 二、登入模組客戶端
1.(Eclipse)src/.../LoginActivity.java:客戶端主UI (1)登入:通過子執行緒呼叫doGet()方法,向伺服器傳送GET請求並獲取伺服器返回的響應資料; (2)註冊:跳轉至註冊模組UI介面; (3)重置:清空登入資訊;
  1. package com.example.http_client; 
  2. import android.app.Activity;  
  3. import android.content.Intent;  
  4. import android.os.Bundle;  
  5. import android.os.Handler;  
  6. import android.os.Message;  
  7. import android.view.View;  
  8. import android.view.View.OnClickListener;  
  9. import android.widget.Button;  
  10. import android.widget.EditText;  
  11. import android.widget.Toast;  
  12. public class LoginActivity extends Activity {  
  13.     private EditText userName;  
  14.     private EditText password;  
  15.     private Button loginBtn;  
  16.     private Button registerBtn;  
  17.     private Button resetBtn;  
  18.     private void init()  
  19.     {  
  20.         userName = (EditText)findViewById(R.id.uername);  
  21.         password= (EditText)findViewById(R.id.password);  
  22.         registerBtn= (Button)findViewById(R.id.registerLogin);  
  23.         resetBtn=(Button)findViewById(R.id.resetLogin);  
  24.          loginBtn=(Button)findViewById(R.id.Login);  
  25.     }  
  26.     @Override  
  27.     protected void onCreate(Bundle savedInstanceState) {  
  28.         super.onCreate(savedInstanceState);  
  29.         setContentView(R.layout.login);  
  30.         init();     //初始化控制元件  
  31.         /*1.登入按鈕業務邏輯 
  32.          *      當用戶點選登入按鈕後,應用訪問伺服器資料庫,若存在使用者資訊,則跳轉至個人使用者介面UserActivity*/  
  33.         loginBtn.setOnClickListener(new OnClickListener() { 
  34.                 public void onClick(View v)  
  35.                 {  
  36.                     //1.建立一個Handler類物件,並重寫handleMessage()方法  
  37.                     final Handler myHandler=new Handler(){  
  38.                         public void handleMessage(Message msg) {  
  39.                             String response=(String)msg.obj;                //讀取obj傳送過來的訊息    
  40.                             if("true".equals(response))     //a.使用者存在,跳轉至個人使用者介面  
  41.                             {  
  42.                                 Intent intent=new Intent();  
  43.                                 intent.setClass(LoginActivity.this, UserActivity.class);      
  44.                                 startActivity(intent);  
  45.                             }  
  46.                             else                                        //b.如果伺服器返回false,說明使用者資訊不存在或者填寫錯誤  
  47.                             {  
  48.                                 Toast.makeText(LoginActivity.this"使用者名稱或密碼不正確,請重新輸                                
  49.                                                                                                                     入!",Toast.LENGTH_SHORT).show();  
  50.                             }  
  51.                         }  
  52.                     };  
  53.                 //2.建立一個子執行緒  
  54.                 //當伺服器沒有開啟時應用會異常終止,這裡我們需要處理這個異常防止程式異常退出  
  55.                 new Thread(new Runnable(){  
  56.                     public void run() {  
  57.                         LoginToServer login = new LoginToServer();  
  58.                                 String result=login.doGet(userName.getText().toString().trim(), password.getText().toString().trim());    
  59.                                 Message msg=new Message();  
  60.                                 msg.obj=result; //將響應資訊儲存到obj中  
  61.                                 myHandler.sendMessage(msg); 
  62.                         }             
  63.                     }).start();  
  64.             }     
  65.         });  
  66.         /*2.註冊按鈕業務邏輯 
  67.          *  當用戶點選註冊按鈕後,應用跳轉至RegisterActivity註冊介面*/  
  68.         registerBtn.setOnClickListener(new OnClickListener() {  
  69.             public void onClick(View v) {  
  70.                 Intent intent=new Intent();  
  71.                 intent.setClass(LoginActivity.this, RegisterActivity.class);      
  72.                 startActivity(intent);  
  73.             }  
  74.         });  
  75.         /*3.重置按鈕業務邏輯 
  76.          *      即清空使用者名稱和密碼輸入框內容*/  
  77.         resetBtn.setOnClickListener(new OnClickListener() {  
  78.             public void onClick(View v) {  
  79.                 userName.setText("");  
  80.                 password.setText("");  
  81.             }  
  82.         });  
  83.     }  
注:伺服器響應資料為"true". 2.(Eclipse)src/.../LoginToServer.java:doGet()方法具體實現類
功能:用於客戶端向伺服器實現傳送GET請求/POST請求的具體實現類
  1. package com.example.http_client;  
  2. import java.io.BufferedReader;  
  3. import java.io.IOException;  
  4. import java.io.InputStream;  
  5. import java.io.InputStreamReader;  
  6. import org.apache.http.HttpEntity;  
  7. import org.apache.http.HttpResponse;  
  8. import org.apache.http.HttpStatus;  
  9. import org.apache.http.client.HttpClient;  
  10. import org.apache.http.client.methods.HttpGet;  
  11. import org.apache.http.impl.client.DefaultHttpClient;  
  12. public class LoginToServer {  
  13.     private String url="http://10.0.2.2:8080/login/LoginServlet";       //訪問伺服器資源的URL地址  
  14.     String result="";         
  15.     /*doGet方法 
  16.      * 作用:實現客戶端向伺服器傳送GET請求*/  
  17.     public String doGet(String name,String psd)  
  18.     {  
  19.         HttpClient httpClient = new DefaultHttpClient();            //客戶端例項  
  20.         String urlStr=url+"?username="+name+"&psd="+psd;            //給UIL裝載請求資料  
  21.         HttpGet getRequest=new HttpGet(urlStr);                     //例項化HttpGet,代表Get請求  
  22.         try {  
  23.             HttpResponse response = httpClient.execute(getRequest);//傳送Get請求,並獲取響應  
  24.             if(response.getStatusLine().getStatusCode() == HttpStatus.SC_OK)  
  25.             {  
  26.                 HttpEntity entity=response.getEntity();     //獲取響應資訊實體  
  27.                 InputStream is= entity.getContent(); //h.執行HttpEntity的getContent方法,獲取對應的輸入流  
  28.                 BufferedReader br = new BufferedReader(new InputStreamReader(is));
  29.                                                      //i.讀取輸入流中的內容,並以字串的形式返回        
  30.                 String readLine = null;  
  31.                 while((