android开发怎么少的了后端(中)
来源:互联网 发布:2017年网络新词口头禅 编辑:程序博客网 时间:2024/04/30 08:55
序言:上一篇中我们讲了简单后端开发所必须的一些工具以及讲解,如果你还没有了解的话,请移步android开发怎么少的了后端(上)
今天给大家带来的是客户端与服务器端的通信,话不多说,直接上例子:
今天我们实现一个注册的功能,客户端的界面编写神马的咱就不在这浪费时间了,我这也直接写好了,一个最简单的注册和登录界面:
界面写好之后,接下来咱们就去弄接口了。
首先,先把数据库搞好,上一篇介绍的两个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; }}
看请求的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,然后参数分别是username和password。
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开发怎么少的了后端(中)
- android开发怎么少的了后端(上)
- android开发怎么少的了后端(下)
- 以后的日子少了番茄会怎么过?
- proc*c 开发的交流怎么这么少
- 这怎么可能(少了一块)
- 做Web开发,怎能少的了JQuery?
- Android开发-后端Model_Service
- android studio中Bmob后端云集成开发
- 少了些夜凉如水的感觉
- 知道的太少了
- 少了撕心裂肺的痛楚
- WEB开发中“前端”和“后端”的区别
- 实际中前后端开发数据交互是怎么样的
- 我的分怎么那么少呢?
- 怎么偶的分这么少啊
- Android:android sdk源码中怎么没有httpclient的源码了
- Zend_Cache的前端和后端怎么设置
- css布局:等高布局
- oracle与sqlserver处理判断字段是否为空
- IntelliJ IDEA 2016.2与webstorm破解方法
- [转]【坐在马桶看算法】算法1:最快最简单的排序——桶排序--作者:ahalei
- 创建/销毁线程操作示例
- android开发怎么少的了后端(中)
- LInux基础学习1
- HBase中的表一般特点
- CSS div垂直居中
- oracle提高查询效率的34条方法
- Java中float/double取值范围与精度
- layoutSubviews总结
- java基础学习总结:向上转型
- 七牛云存储之 Java 创建存储空间