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

序言:上一篇中咱們講了簡單後端開發所必須的一些工具以及講解,若是你尚未了解的話,請移步android開發怎麼少的了後端(上)

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

界面寫好以後,接下來我們就去弄接口了。mysql

首先,先把數據庫搞好,上一篇介紹的兩個mysql的軟件仍是很好用的,不用寫數據庫語句就能直接建立表,固然了,你也可使用建表語句來建立,開心就好!

好了表建立好了。android

接下來咱們打開eclipse j2ee,新建一個web工程

而後在src下建立三個包,一個放Servlet,一個放mysql的工具類,一個放對象;web

  1. 這裏咱們採用jdbc鏈接,沒有jdbc包的請看這邊:點我下載JDBC jar包
  2. 由於咱們要將結果以json的形式傳給客戶端,因此咱們還須要一個gson的包,沒有gson包的請看這邊:點我下載gson jar包

而後咱們開始寫數據庫的工具類:sql

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());
		}
	}
}
複製代碼

注:上述的數據庫語句不要寫錯了,該空格的地方不要省地方,不然的話會報錯的數據庫

好了,到此咱們的數據庫的工具類就寫好了,若是不太懂的能夠看註釋,應該能夠看懂json

接下來咱們要寫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基類對象,以下:eclipse

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;
	}
}
複製代碼

看請求的url:http://localhost:8080/MyWeb/RegisterServlet

咦!怎麼報404的錯了,什麼鬼呢,別急>_<我們參數尚未傳呢:

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

的確是有的,好,如今數據是能夠出來了,可是咱們須要到客戶端去請求,看看是否是也能夠請求呢?

首先,請求的url再也不是http://localhost:8080/MyWeb/RegisterServlet,由於手機不能識別localhost,咱們換成電腦的IP地址,例如個人電腦ip地址爲:192.168.0.106,因此,如今請求的url變成了http://192.168.0.106:8080/MyWeb/RegisterServlet,而後參數分別是usernamepassword

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,成功了,接下來咱們去數據庫裏面看看,有沒有那條記錄:

確定是有的啦!這樣,咱們就成功的寫完了一個小型的註冊接口,是否是忍不住想趕忙試一下呢?

公衆號:Android技術經驗分享
相關文章
相關標籤/搜索