Android後臺數據接口交互實現註冊功能

  首先,在ecplise裏面新建一個叫作TestServices的web工程。在WebContent--WEB-INF--libs文件夾下導入兩個jar包:mysql-connector-java-6.0.2和gson-2.3.1html

mysql-connector-java-6.0.2下載連接:https://pan.baidu.com/s/1eRMByB9ERVC_T51ZBw5Q8Q 提取碼: th9ljava

gson-2.3.1下載連接:https://pan.baidu.com/s/1NpYioUbOJTj8B1idDVupqQ 提取碼: 9ir9mysql

 

mysql數據庫表以下:android

 

源代碼以下:web

DBUtils.java:sql

package com.xhj.db;


import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;


public class DBUtils {
    private Connection conn;
    private String url = "jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC"; // 指定鏈接數據庫的URL
    private String user = "root"; // 指定鏈接數據庫的用戶名
    private String password = ""; // 指定鏈接數據庫的密碼
    private Statement sta;
    private ResultSet rs; // 打開數據庫鏈接


    public void openConnect() {
        try {
            // 加載數據庫驅動
            Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager.getConnection(url, user, password);// 建立數據庫鏈接
            if (conn != null) {
                System.out.println("數據庫鏈接成功"); // 鏈接成功的提示信息
            }
        } catch (Exception e) {
            System.out.println("ERROR: " + e.getMessage());
        }
    }


    // 得到查詢user表後的數據集
    public ResultSet getUser() {
        // 建立 statement對象
        try {
            sta = conn.createStatement(); // 執行SQL查詢語句
            rs = sta.executeQuery("select * from user");
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return rs;
    }


    // 判斷數據庫中是否存在某個用戶名及其密碼,註冊和登陸的時候判斷
    public boolean isExistInDB(String username, String password) {
        boolean isFlag = false; // 建立 statement對象
        try {
            System.out.println("判斷用戶名密碼");
            sta = conn.createStatement(); // 執行SQL查詢語句
            rs = sta.executeQuery("select * from user");// 得到結果集
            if (rs != null) {
                while (rs.next()) { // 遍歷結果集
                    if (rs.getString("user_name").equals(username)) {
                        if (rs.getString("user_pwd").equals(password)) {
                            isFlag = true;
                            break;
                        }
                    }
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
            isFlag = false;
        }
        return isFlag;


    }


    // 註冊 將用戶名和密碼插入到數據庫(id設置的是自增加的,所以不須要插入)
    public boolean insertDataToDB(String username, String password) {
        String sql = " insert into user ( user_name , user_pwd ) values ( " + "'" + username + "', " + "'" + password
                + "' )";
        try {
            sta = conn.createStatement();
            // 執行SQL查詢語句
            return sta.execute(sql);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return false;
    }


    // 關閉數據庫鏈接
    public void closeConnect() {
        try {
            if (rs != null) {
                rs.close();
            }
            if (sta != null) {
                sta.close();
            }
            if (conn != null) {
                conn.close();
            }
            System.out.println("關閉數據庫鏈接成功");
        } catch (SQLException e) {
            System.out.println("Error: " + e.getMessage());
        }
    }

}

 

BaseBean.java:數據庫

package com.xhj.domain;

public class BaseBean {
    private int code;
    private String msg;
    private Object data;


    public int getCode() {
        return code;
    }


    public void setCode(int code) {
        this.code = code;
    }


    public String getMsg() {
        return msg;
    }


    public void setMsg(String msg) {
        this.msg = msg;
    }


    public Object getData() {
        return data;
    }


    public void setData(Object data) {
        this.data = data;
    }

}

 

UserBean.java:json

package com.xhj.domain;

import java.io.Serializable;

public class UserBean implements Serializable{
    
    private int id;
    private String username;
    private String password;
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    

}

 

LoginDateServlet.java:數組

package com.xhj.servlet;


import java.io.IOException;
import java.sql.ResultSet;
import java.sql.SQLException;


import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


import com.google.gson.Gson;
import com.xhj.db.DBUtils;
import com.xhj.domain.BaseBean;
import com.xhj.domain.UserBean;


public class LoginDateServlet extends HttpServlet {


    
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request, response);
    }
    
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        System.out.println("request--->"+request.getRequestURL()+"===="+request.getParameterMap().toString());
        String username = request.getParameter("username"); // 獲取客戶端傳過來的參數
        String password = request.getParameter("password");
        response.setContentType("text/html;charset=utf-8");
        if (username == null || username.equals("") || password == null || password.equals("")) {
            System.out.println("用戶名或密碼爲空");
            return;
        } // 請求數據庫
        DBUtils dbUtils = new DBUtils();
        dbUtils.openConnect();
        // 打開數據庫鏈接
        BaseBean data = new BaseBean(); // 基類對象,回傳給客戶端的json對象
        UserBean userBean = new UserBean(); // user的對象
        if (dbUtils.isExistInDB(username, password)) {
            // 判斷帳號是否存在
            data.setCode(-1);
            data.setData(userBean);
            data.setMsg("該帳號已存在");
        } else if (!dbUtils.insertDataToDB(username, password)) {
            // 註冊成功
            data.setCode(0);
            data.setMsg("註冊成功!!");
            ResultSet rs = dbUtils.getUser();
            int id = -1;
            if (rs != null) {
                try {
                    while (rs.next()) {
                        if (rs.getString("user_name").equals(username) 
                                && rs.getString("user_pwd").equals(password)) {
                            id = rs.getInt("user_id");
                        }
                    }
                    userBean.setId(id);
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            userBean.setUsername(username);
            userBean.setPassword(password);
            data.setData(userBean);
        } else {
            // 註冊不成功,這裏錯誤沒有細分,都歸爲數據庫錯誤
            data.setCode(500);
            data.setData(userBean);
            data.setMsg("數據庫錯誤");
        }
        Gson gson = new Gson();
        String json = gson.toJson(data);
        // 將對象轉化成json字符串
        try {
            response.getWriter().println(json);
            // 將json數據傳給客戶端
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            response.getWriter().close(); // 關閉這個流,否則會發生錯誤的
        }
        dbUtils.closeConnect(); // 關閉數據庫鏈接}
    }
    

}

 

web.xml:緩存

<?xml version="1.0" encoding="UTF-8"?>
<web-app> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
    id="WebApp_ID" version="3.0">
  <display-name>TestServices</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  
    <servlet>
    <description>This is the description of my J2EE component</description>
    <display-name>This is the display name of my J2EE component</display-name>
        <servlet-name>LoginDateServlet</servlet-name>
    <servlet-class>com.xhj.servlet.LoginDateServlet</servlet-class>
  </servlet>


  <servlet-mapping>
    <servlet-name>LoginDateServlet</servlet-name>
    <url-pattern>/servlet/LoginDateServlet</url-pattern>
  </servlet-mapping>
  
</web-app>

   到這裏,點擊LoginDateServlet.java,運行一下

 由於咱們沒有傳輸用戶名和密碼,因此輸出用戶名或密碼爲空。

能夠這樣測試一下,在地址後面添加?username=123&password=123

能夠看到,註冊成功,數據已經保存到了數據庫中

 

 接下來須要在Android Studio裏面,新建一個叫作TestNet的工程

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.testnet.MainActivity">


    <EditText
        android:id="@+id/et_data_uname"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="請輸入用戶名:" />

    <EditText
        android:id="@+id/et_data_upass"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="請輸入密碼:"
        android:inputType="number" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="loginGET"
        android:text="註冊(GET)" />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="loginPOST"
        android:text="註冊(POST)" />
</LinearLayout>

 

activity_main.java:

package com.example.testnet;

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.EditText;

import androidx.appcompat.app.AppCompatActivity;

import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.HashMap;



public class MainActivity extends AppCompatActivity {

    String TAG = MainActivity.class.getCanonicalName();
    private EditText et_data_uname;
    private EditText et_data_upass;
    private HashMap<String, String> stringHashMap;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        et_data_uname = (EditText) findViewById(R.id.et_data_uname);
        et_data_upass = (EditText) findViewById(R.id.et_data_upass);
        stringHashMap = new HashMap<>();
    }


    public void loginGET(View view) {
        stringHashMap.put("username", et_data_uname.getText().toString());
        stringHashMap.put("password", et_data_upass.getText().toString());
        new Thread(getRun).start();

    }

    public void loginPOST(View view) {
        stringHashMap.put("username", et_data_uname.getText().toString());
        stringHashMap.put("password", et_data_upass.getText().toString());

        new Thread(postRun).start();
    }

    /**
     * get請求線程
     */
    Runnable getRun = new Runnable() {

        @Override
        public void run() {
            // TODO Auto-generated method stub
            requestGet(stringHashMap);
        }
    };
    /**
     * post請求線程
     */
    Runnable postRun = new Runnable() {

        @Override
        public void run() {
            // TODO Auto-generated method stub
            requestPost(stringHashMap);
        }
    };


    /**
     * get提交數據
     *
     * @param paramsMap
     */
    private void requestGet(HashMap<String, String> paramsMap) {
        try {
            String baseUrl = "http://10.0.2.2:8080/TestServices/servlet/LoginDateServlet?";
            StringBuilder tempParams = new StringBuilder();
            int pos = 0;
            for (String key : paramsMap.keySet()) {
                if (pos > 0) {
                    tempParams.append("&");
                }
                tempParams.append(String.format("%s=%s", key, URLEncoder.encode(paramsMap.get(key), "utf-8")));
                pos++;
            }

            Log.e(TAG,"params--get-->>"+tempParams.toString());
            String requestUrl = baseUrl + tempParams.toString();
            // 新建一個URL對象
            URL url = new URL(requestUrl);
            // 打開一個HttpURLConnection鏈接
            HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
            // 設置鏈接主機超時時間
            urlConn.setConnectTimeout(5 * 1000);
            //設置從主機讀取數據超時
            urlConn.setReadTimeout(5 * 1000);
            // 設置是否使用緩存  默認是true
            urlConn.setUseCaches(true);
            // 設置爲Post請求
            urlConn.setRequestMethod("GET");
            //urlConn設置請求頭信息
            //設置請求中的媒體類型信息。
            urlConn.setRequestProperty("Content-Type", "application/json");
            //設置客戶端與服務鏈接類型
            urlConn.addRequestProperty("Connection", "Keep-Alive");
            // 開始鏈接
            urlConn.connect();
            // 判斷請求是否成功
            if (urlConn.getResponseCode() == 200) {
                // 獲取返回的數據
                String result = streamToString(urlConn.getInputStream());
                Log.e(TAG, "Get方式請求成功,result--->" + result);
            } else {
                Log.e(TAG, "Get方式請求失敗");
            }
            // 關閉鏈接
            urlConn.disconnect();
        } catch (Exception e) {
            Log.e(TAG, e.toString());
        }
    }

    /**
     * post提交數據
     *
     * @param paramsMap
     */
    private void requestPost(HashMap<String, String> paramsMap) {
        try {
            String baseUrl = "http://10.0.2.2:8080/TestServices/servlet/LoginDateServlet";
            //合成參數
            StringBuilder tempParams = new StringBuilder();
            int pos = 0;
            for (String key : paramsMap.keySet()) {
                if (pos >0) {
                    tempParams.append("&");
                }
                tempParams.append(String.format("%s=%s", key, URLEncoder.encode(paramsMap.get(key), "utf-8")));
                pos++;
            }
            String params = tempParams.toString();
            Log.e(TAG,"params--post-->>"+params);
            // 請求的參數轉換爲byte數組
//            byte[] postData = params.getBytes();
            // 新建一個URL對象
            URL url = new URL(baseUrl);
            // 打開一個HttpURLConnection鏈接
            HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
            // 設置鏈接超時時間
            urlConn.setConnectTimeout(5 * 1000);
            //設置從主機讀取數據超時
            urlConn.setReadTimeout(5 * 1000);
            // Post請求必須設置容許輸出 默認false
            urlConn.setDoOutput(true);
            //設置請求容許輸入 默認是true
            urlConn.setDoInput(true);
            // Post請求不能使用緩存
            urlConn.setUseCaches(false);
            // 設置爲Post請求
            urlConn.setRequestMethod("POST");
            //設置本次鏈接是否自動處理重定向
            urlConn.setInstanceFollowRedirects(true);
            //配置請求Content-Type
//            urlConn.setRequestProperty("Content-Type", "application/json");//post請求不能設置這個
            // 開始鏈接
            urlConn.connect();

            // 發送請求參數
            PrintWriter dos = new PrintWriter(urlConn.getOutputStream());
            dos.write(params);
            dos.flush();
            dos.close();
            // 判斷請求是否成功
            if (urlConn.getResponseCode() == 200) {
                // 獲取返回的數據
                String result = streamToString(urlConn.getInputStream());
                Log.e(TAG, "Post方式請求成功,result--->" + result);
            } else {
                Log.e(TAG, "Post方式請求失敗");
            }
            // 關閉鏈接
            urlConn.disconnect();
        } catch (Exception e) {
            Log.e(TAG, e.toString());
        }
    }


    /**
     * 將輸入流轉換成字符串
     *
     * @param is 從網絡獲取的輸入流
     * @return
     */
    public String streamToString(InputStream is) {
        try {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            byte[] buffer = new byte[1024];
            int len = 0;
            while ((len = is.read(buffer)) != -1) {
                baos.write(buffer, 0, len);
            }
            baos.close();
            is.close();
            byte[] byteArray = baos.toByteArray();
            return new String(byteArray);
        } catch (Exception e) {
            Log.e(TAG, e.toString());
            return null;
        }
    }

    /**
     * 文件下載
     *
     * @param fileUrl
     */
    private void downloadFile(String fileUrl) {
        try {
            // 新建一個URL對象
            URL url = new URL(fileUrl);
            // 打開一個HttpURLConnection鏈接
            HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
            // 設置鏈接主機超時時間
            urlConn.setConnectTimeout(5 * 1000);
            //設置從主機讀取數據超時
            urlConn.setReadTimeout(5 * 1000);
            // 設置是否使用緩存  默認是true
            urlConn.setUseCaches(true);
            // 設置爲Post請求
            urlConn.setRequestMethod("GET");
            //urlConn設置請求頭信息
            //設置請求中的媒體類型信息。
            urlConn.setRequestProperty("Content-Type", "application/json");
            //設置客戶端與服務鏈接類型
            urlConn.addRequestProperty("Connection", "Keep-Alive");
            // 開始鏈接
            urlConn.connect();
            // 判斷請求是否成功
            if (urlConn.getResponseCode() == 200) {
                String filePath = "";//下載文件保存在本地的地址
                File descFile = new File(filePath);
                FileOutputStream fos = new FileOutputStream(descFile);
                ;
                byte[] buffer = new byte[1024];
                int len;
                InputStream inputStream = urlConn.getInputStream();
                while ((len = inputStream.read(buffer)) != -1) {
                    // 寫到本地
                    fos.write(buffer, 0, len);
                }
            } else {
                Log.e(TAG, "文件下載失敗");
            }
            // 關閉鏈接
            urlConn.disconnect();
        } catch (Exception e) {
            Log.e(TAG, e.toString());
        }
    }

    /**
     * 文件上傳
     *
     * @param filePath
     * @param paramsMap
     */
    private void upLoadFile(String filePath, HashMap<String, String> paramsMap) {
        try {
            String baseUrl = "https://xxx.com/uploadFile";
            File file = new File(filePath);
            //新建url對象
            URL url = new URL(baseUrl);
            //經過HttpURLConnection對象,向網絡地址發送請求
            HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
            //設置該鏈接容許讀取
            urlConn.setDoOutput(true);
            //設置該鏈接容許寫入
            urlConn.setDoInput(true);
            //設置不能適用緩存
            urlConn.setUseCaches(false);
            //設置鏈接超時時間
            urlConn.setConnectTimeout(5 * 1000);   //設置鏈接超時時間
            //設置讀取超時時間
            urlConn.setReadTimeout(5 * 1000);   //讀取超時
            //設置鏈接方法post
            urlConn.setRequestMethod("POST");
            //設置維持長鏈接
            urlConn.setRequestProperty("connection", "Keep-Alive");
            //設置文件字符集
            urlConn.setRequestProperty("Accept-Charset", "UTF-8");
            //設置文件類型
            urlConn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + "*****");
            String name = file.getName();
            DataOutputStream requestStream = new DataOutputStream(urlConn.getOutputStream());
            requestStream.writeBytes("--" + "*****" + "\r\n");
            //發送文件參數信息
            StringBuilder tempParams = new StringBuilder();
            tempParams.append("Content-Disposition: form-data; name=\"" + name + "\"; filename=\"" + name + "\"; ");
            int pos = 0;
            int size = paramsMap.size();
            for (String key : paramsMap.keySet()) {
                tempParams.append(String.format("%s=\"%s\"", key, paramsMap.get(key), "utf-8"));
                if (pos < size - 1) {
                    tempParams.append("; ");
                }
                pos++;
            }
            tempParams.append("\r\n");
            tempParams.append("Content-Type: application/octet-stream\r\n");
            tempParams.append("\r\n");
            String params = tempParams.toString();
            requestStream.writeBytes(params);
            //發送文件數據
            FileInputStream fileInput = new FileInputStream(file);
            int bytesRead;
            byte[] buffer = new byte[1024];
            DataInputStream in = new DataInputStream(new FileInputStream(file));
            while ((bytesRead = in.read(buffer)) != -1) {
                requestStream.write(buffer, 0, bytesRead);
            }
            requestStream.writeBytes("\r\n");
            requestStream.flush();
            requestStream.writeBytes("--" + "*****" + "--" + "\r\n");
            requestStream.flush();
            fileInput.close();
            int statusCode = urlConn.getResponseCode();
            if (statusCode == 200) {
                // 獲取返回的數據
                String result = streamToString(urlConn.getInputStream());
                Log.e(TAG, "上傳成功,result--->" + result);
            } else {
                Log.e(TAG, "上傳失敗");
            }
        } catch (IOException e) {
            Log.e(TAG, e.toString());
        }
    }


}

在TestNet--app--src--main--AndroidMainifest.xml中添加

<uses-permission android:name="android.permission.INTERNET" />

 

參考文章:http://www.javashuo.com/article/p-ullzuktc-nm.html

相關文章
相關標籤/搜索