1. 程式人生 > >android開發怎麼少的了後端(中)

android開發怎麼少的了後端(中)

序言:上一篇中我們講了簡單後端開發所必須的一些工具以及講解,如果你還沒有了解的話,請移步

今天給大家帶來的是客戶端與伺服器端的通訊,話不多說,直接上例子:
今天我們實現一個註冊的功能,客戶端的介面編寫神馬的咱就不在這浪費時間了,我這也直接寫好了,一個最簡單的註冊和登入介面:

介面寫好之後,接下來咱們就去弄介面了。

首先,先把資料庫搞好,上一篇介紹的兩個mysql的軟體還是很好用的,不用寫資料庫語句就能直接建立表,當然了,你也可以使用建表語句來建立,開心就好!

好了表建立好了。

接下來我們開啟eclipse j2ee,新建一個web工程

然後在src下建立三個包,一個放Servlet,一個放mysql的工具類,一個放物件;

  1. 這裡我們採用jdbc連線,沒有jdbc包的請看這邊:點我下載JDBC jar包
  2. 因為我們要將結果以json的形式傳給客戶端,所以我們還需要一個gson的包,沒有gson包的請看這邊:點我下載gson jar包

然後我們開始寫資料庫的工具類:

public class DBUtils {
    private Connection conn;
    private String url = "jdbc:mysql://127.0.0.1:3306/Login"; // 指定連線資料庫的URL
    private String user = "root"; // 指定連線資料庫的使用者名稱
    private String password = "1002"; // 指定連線資料庫的密碼

    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 {
            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());
        }
    }
}

注:上述的資料庫語句不要寫錯了,該空格的地方不要省地方,否則的話會報錯的

好了,到此我們的資料庫的工具類就寫好了,如果不太懂的可以看註釋,應該可以看懂

接下來我們要寫Servlet了

偷個懶,我們直接寫doPost()方法,在doGet()方法中也執行doPost()方法

protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    String username = request.getParameter("username"); // 獲取客戶端傳過來的引數
    String password = request.getParameter("password");

    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(); // 關閉資料庫連線
}

好了,Servlet也寫好了,然後我們可以執行一下:

至於回傳給客戶端的json基類物件,如下:

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;
    }
}

咦!怎麼報404的錯了,什麼鬼呢,別急>_<咱們引數還沒有傳呢:

這就對了!此處應該有掌聲������至於中文亂碼,下文我會來解釋;我們再來看看資料庫,看看是不是有一條新的記錄呢:

的確是有的,好,現在資料是可以出來了,但是我們需要到客戶端去請求,看看是不是也可以請求呢?

android客戶端的請求方法在這裡我也不詳細介紹了,相信大家應該都會,在這裡我用的是簡單易懂的asynchttpclient進行請求的,稍微進行了一下封裝:

    String url = "http://192.168.0.106:8080/MyWeb/RegisterServlet";
    RequestParams params = new RequestParams();
    params.put("username", arEtUsername.getText().toString());
    params.put("password", arEtPassword.getText().toString());
    RequestUtils.ClientPost(url, params, new NetCallBack() {
        @Override
        public void onMySuccess(byte[] response) {
             Lod.d(TAG,"register success and json---->"+new String(response));
             Toast.makeText(this,"json="+new String(response),Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onMyFailure(byte[] response, Throwable throwable) {
            Log.e(TAG,new String(response)+"\n"+ throwable.toString());
        }
    });

好,來看看我們的效果吧!

咦!!!怎麼會是亂碼呢?原來是沒有設定請求頭部的編碼,我們來看:

response.setHeader("Content-Type", "text/html;charset=UTF-8");

只需要在doPost()方法中加上這一句就可以了,下面來看:

OK,成功了,接下來我們去資料庫裡面看看,有沒有那條記錄:

肯定是有的啦!這樣,我們就成功的寫完了一個小型的註冊介面,是不是忍不住想趕緊試一下呢?