05.HTTP程式設計實戰:高校資訊查詢平臺之登入模組
阿新 • • 發佈:2019-01-25
在瞭解了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語句,且訪問資料庫相關方法(如登入時查詢資料庫資料);
原始碼:
◆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)重置:清空登入資訊;
功能:用於客戶端向伺服器實現傳送GET請求/POST請求的具體實現類
基礎知識: 一、登入模組服務端 1.(MyEclipse)src/../DBUtil.java:資料庫工具類(JDBC,連結資料庫) 由於高效資訊查詢平臺客戶端訪問的是伺服器MySQL資料庫,首先,需在MyEclipse建立一個Java Web工程並建立一個數據庫工具類DBUtil.java,然後將MySQL資料庫驅動"mysql-connector-java-3.1.11-bin.jar"拷貝到該工程目錄下(假設MySQL資料庫在伺服器主機已經安裝配置好)。
- package com.jiangdongguo.login;
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.SQLException;
- import com.mysql.jdbc.PreparedStatement;
- import com.mysql.jdbc.ResultSet;
- /*訪問資料庫工具類:獲取資料庫連結*/
- public class DBUtil {
- private String dbName = "ServerDatabase"; //資料庫名
- private String url="jdbc:mysql://localhost:3306/"+dbName;//URI
- private String user="root"; //MySQL資料庫root賬戶
- private String psd="111111"; //MySQL賬戶密碼
- private
- private ResultSet result;
- //獲取資料庫連結的方法getConn()
- private Connection conn;
- public Connection getConn()
- {
- try {
- Class.forName("com.mysql.jdbc.Driver"); //根據字串new一個例項,Class類為類裝載器
- conn=DriverManager.getConnection(url,user,psd); //獲取資料庫連結,傳入引數:資料庫名稱、賬戶名、密碼
- } catch (Exception e) {
- e.printStackTrace();
- }
- return conn;
- }
- //查詢資料庫業務邏輯
- public boolean checkUser(String sql,String[] args)
- {
- boolean flag=false;
- conn=getConn(); //獲得資料庫連結
- try {
- ps=(PreparedStatement) conn.prepareStatement(sql);
- if(args!=null) //對sql語句每個佔位符賦值
- {
- for(int i=0;i<args.length;i++)
- ps.setString(i+1, args[i]);
- result=(ResultSet) ps.executeQuery(); //執行sql查詢語句,並返回結果集
- if(result.next()) //遍歷結果集,如果存在傳遞過來的資料(欄位)的記錄返回true
- {
- flag=true;
- }
- }
- } catch (SQLException e) {
- e.printStackTrace();
- }
- return flag;
- }
- }
原始碼:
- package com.jiangdongguo.login;
- import java.io.IOException;
- import java.io.PrintWriter;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- //查詢伺服器資料庫中的資料
- public class LoginServlet extends HttpServlet {
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- response.setContentType("text/html"); //設定返回型別為網頁形式
- PrintWriter out = response.getWriter(); //輸出
- String name = request.getParameter("username"); //獲取請求傳入的引數-使用者名稱資訊
- String psd = request.getParameter("psd"); // -密碼
- System.out.println("username="+name+"psd="+psd); //列印獲取的客戶端資料到Tomcat觀察視窗
- //使用MySql資料庫
- DBUtil dbUtil = new DBUtil();
- boolean result=dbUtil.checkUser("select * from users where user_name=? and user_psd=?", new String[]{name,psd});
- out.print(result);
- }
- public void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- this.doGet(request, response);
- }
- }
◆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)重置:清空登入資訊;
- package com.example.http_client;
- import android.app.Activity;
- import android.content.Intent;
- import android.os.Bundle;
- import android.os.Handler;
- import android.os.Message;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import android.widget.EditText;
- import android.widget.Toast;
- public class LoginActivity extends Activity {
- private EditText userName;
- private EditText password;
- private Button loginBtn;
- private Button registerBtn;
- private Button resetBtn;
- private void init()
- {
- userName = (EditText)findViewById(R.id.uername);
- password= (EditText)findViewById(R.id.password);
- registerBtn= (Button)findViewById(R.id.registerLogin);
- resetBtn=(Button)findViewById(R.id.resetLogin);
- loginBtn=(Button)findViewById(R.id.Login);
- }
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.login);
- init(); //初始化控制元件
- /*1.登入按鈕業務邏輯
- * 當用戶點選登入按鈕後,應用訪問伺服器資料庫,若存在使用者資訊,則跳轉至個人使用者介面UserActivity*/
- loginBtn.setOnClickListener(new OnClickListener() {
- public void onClick(View v)
- {
- //1.建立一個Handler類物件,並重寫handleMessage()方法
- final Handler myHandler=new Handler(){
- public void handleMessage(Message msg) {
- String response=(String)msg.obj; //讀取obj傳送過來的訊息
- if("true".equals(response)) //a.使用者存在,跳轉至個人使用者介面
- {
- Intent intent=new Intent();
- intent.setClass(LoginActivity.this, UserActivity.class);
- startActivity(intent);
- }
- else //b.如果伺服器返回false,說明使用者資訊不存在或者填寫錯誤
- {
- Toast.makeText(LoginActivity.this, "使用者名稱或密碼不正確,請重新輸
- 入!",Toast.LENGTH_SHORT).show();
- }
- }
- };
- //2.建立一個子執行緒
- //當伺服器沒有開啟時應用會異常終止,這裡我們需要處理這個異常防止程式異常退出
- new Thread(new Runnable(){
- public void run() {
- LoginToServer login = new LoginToServer();
- String result=login.doGet(userName.getText().toString().trim(), password.getText().toString().trim());
- Message msg=new Message();
- msg.obj=result; //將響應資訊儲存到obj中
- myHandler.sendMessage(msg);
- }
- }).start();
- }
- });
- /*2.註冊按鈕業務邏輯
- * 當用戶點選註冊按鈕後,應用跳轉至RegisterActivity註冊介面*/
- registerBtn.setOnClickListener(new OnClickListener() {
- public void onClick(View v) {
- Intent intent=new Intent();
- intent.setClass(LoginActivity.this, RegisterActivity.class);
- startActivity(intent);
- }
- });
- /*3.重置按鈕業務邏輯
- * 即清空使用者名稱和密碼輸入框內容*/
- resetBtn.setOnClickListener(new OnClickListener() {
- public void onClick(View v) {
- userName.setText("");
- password.setText("");
- }
- });
- }
- }
功能:用於客戶端向伺服器實現傳送GET請求/POST請求的具體實現類
- package com.example.http_client;
- import java.io.BufferedReader;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.InputStreamReader;
- import org.apache.http.HttpEntity;
- import org.apache.http.HttpResponse;
- import org.apache.http.HttpStatus;
- import org.apache.http.client.HttpClient;
- import org.apache.http.client.methods.HttpGet;
- import org.apache.http.impl.client.DefaultHttpClient;
- public class LoginToServer {
- private String url="http://10.0.2.2:8080/login/LoginServlet"; //訪問伺服器資源的URL地址
- String result="";
- /*doGet方法
- * 作用:實現客戶端向伺服器傳送GET請求*/
- public String doGet(String name,String psd)
- {
- HttpClient httpClient = new DefaultHttpClient(); //客戶端例項
- String urlStr=url+"?username="+name+"&psd="+psd; //給UIL裝載請求資料
- HttpGet getRequest=new HttpGet(urlStr); //例項化HttpGet,代表Get請求
- try {
- HttpResponse response = httpClient.execute(getRequest);//傳送Get請求,並獲取響應
- if(response.getStatusLine().getStatusCode() == HttpStatus.SC_OK)
- {
- HttpEntity entity=response.getEntity(); //獲取響應資訊實體
- InputStream is= entity.getContent(); //h.執行HttpEntity的getContent方法,獲取對應的輸入流
- BufferedReader br = new BufferedReader(new InputStreamReader(is));
- //i.讀取輸入流中的內容,並以字串的形式返回
- String readLine = null;
- while((