android開發怎麼少的了後端(中)
阿新 • • 發佈:2019-01-06
序言:上一篇中我們講了簡單後端開發所必須的一些工具以及講解,如果你還沒有了解的話,請移步
今天給大家帶來的是客戶端與伺服器端的通訊,話不多說,直接上例子:
今天我們實現一個註冊的功能,客戶端的介面編寫神馬的咱就不在這浪費時間了,我這也直接寫好了,一個最簡單的註冊和登入介面:
介面寫好之後,接下來咱們就去弄介面了。
首先,先把資料庫搞好,上一篇介紹的兩個mysql的軟體還是很好用的,不用寫資料庫語句就能直接建立表,當然了,你也可以使用建表語句來建立,開心就好!
好了表建立好了。
接下來我們開啟eclipse j2ee,新建一個web工程
然後在src下建立三個包,一個放Servlet,一個放mysql的工具類,一個放物件;
- 這裡我們採用jdbc連線,沒有jdbc包的請看這邊:點我下載JDBC jar包
- 因為我們要將結果以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,成功了,接下來我們去資料庫裡面看看,有沒有那條記錄:
肯定是有的啦!這樣,我們就成功的寫完了一個小型的註冊介面,是不是忍不住想趕緊試一下呢?