android开发怎么少的了后端(中)

序言:上一篇中我们讲了简单后端开发所必须的一些工具以及讲解,如果你还没有了解的话,请移步android开发怎么少的了后端(上)

今天给大家带来的是客户端与服务器端的通信,话不多说,直接上例子:
今天我们实现一个注册的功能,客户端的界面编写神马的咱就不在这浪费时间了,我这也直接写好了,一个最简单的注册和登录界面:

界面写好之后,接下来咱们就去弄接口了。

首先,先把数据库搞好,上一篇介绍的两个mysql的软件还是很好用的,不用写数据库语句就能直接创建表,当然了,你也可以使用建表语句来创建,开心就好!

好了表创建好了。

接下来我们打开eclipse j2ee,新建一个web工程

然后在src下创建三个包,一个放Servlet,一个放mysql的工具类,一个放对象;

  1. 这里我们采用jdbc连接,没有jdbc包的请自行下载
  2. 因为我们要将结果以json的形式传给客户端,所以我们还需要一个gson的包,没有gson包的请自行下载

然后我们开始写数据库的工具类:

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

看请求的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,成功了,接下来我们去数据库里面看看,有没有那条记录:

肯定是有的啦!这样,我们就成功的写完了一个小型的注册接口,是不是忍不住想赶紧试一下呢?

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容