本例简单地实现Android客户端与服务器端交互,主要是通过客户端输入内容(学号)提交到服务器端,服务器端与数据库交互去查询相应信息(姓名)。根据这个做个完整的安卓登录是没问题的。本例数据库服务器都采用本地,测试时Android客户端与服务端在同一网络中!

1、本例演示截图:

当输入错误的学号(与数据库不匹配),显示查无此人

当输入正确的学号时,显示学号对应的学生姓名:

2、数据模型:

3、客户端:

本例客户端发送请求给服务器端,附带JSON格式字符串(学号{"stu_number":"123456789"}),当然这是最简单的JSON格式。

4、服务器端:(项目目录)

ConnDb.java:返回连接对象,通过测试类TextConn.java可测试与数据库连接是否正常。

SearchNameServices.java:业务类、核心类,处理与数据库交互的逻辑问题,返回从数据库获取的结果

SearchServlet.java:servlet类,将客户端请求的数据返回给客户端,可以对数据做处理,回传给客户端(这里将获取的用户名进行封装,转换成JSON格式字符串来传送)

5、核心代码

Android客户端:

MainActivity.java:

Package
 public class MainActivity extends AppCompatActivity implements View.OnClickListener {

     private EditText stu_number, stu_name;
private Button btn_search;
private OkHttpClient okhttpClient;
private String stu_number_txt; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
} public void initView() {
btn_search = (Button) findViewById(R.id.btn_search);
stu_number = (EditText) findViewById(R.id.stu_number);
stu_name = (EditText) findViewById(R.id.stu_name);
btn_search.setOnClickListener(this);
} @Override
public void onClick(View view) {
if (view.getId() == R.id.btn_search) {
//获取输入的学号
stu_number_txt = stu_number.getText().toString();
new Thread(new Runnable() {
@Override
public void run() {
sendRequest(stu_number_txt);
}
}).start(); }
} private void sendRequest(String stu_number_txt) {
Map map = new HashMap();
map.put("stu_number", stu_number_txt);
JSONObject jsonObject = new JSONObject(map);
String jsonString = jsonObject.toString();
// Log.d("这将JSON对象转换为json字符串", jsonString);
RequestBody body = RequestBody.create(null, jsonString);//以字符串方式
okhttpClient = new OkHttpClient();
final Request request = new Request.Builder()
.url("http://192.168.43.218:8080/AndroidServerDemo/SearchServlet")
.post(body)
.build();
Call call = okhttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, "连接失败!", Toast.LENGTH_SHORT).show();
}
});
e.printStackTrace();
} @Override
public void onResponse(Call call, Response response) throws IOException {
// runOnUiThread(new Runnable() {
// @Override
// public void run() {
// Toast.makeText(MainActivity.this,"连接成功!",Toast.LENGTH_SHORT).show();
// }
// });
String res = response.body().string();//获取到传过来的字符串
try {
JSONObject jsonObj = new JSONObject(res);
String stu_name = jsonObj.getString("stu_name");
showRequestResult(stu_name);
} catch (JSONException e) {
e.printStackTrace();
}
}
});
} private void showRequestResult(final String response) {
runOnUiThread(new Runnable() {
@Override
/**
* 实时更新,数据库信息改变时,客户端内容发生改变
*/
public void run() {
stu_name.setText(response);
}
});
}
}

服务器端:

ConnDb.java:

 package com.thanlon.dao;

 import java.sql.*;

 public class ConnDb {
private String driverName = "com.mysql.jdbc.Driver";
private String username = "root";
private String password = "123456";
private String url = "jdbc:mysql://localhost:3306/androidDb"; public Connection conn() {
try {
Class.forName(driverName);
try {
Connection conn = DriverManager.getConnection(url,username,password);
return conn;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("连接数据库失败!");
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("加载驱动失败!");
}
return null;
}
}

TextConn.java:

 package Test;

 import org.junit.Test;

 import com.thanlon.dao.ConnDb;

 public class TestConn {
/**
* 测试能否正常连接数据库
*/
@Test
public void TestConnDb() {
ConnDb connDb = new ConnDb();
System.out.println(connDb.conn());
}
}

SearchServlet.java:

 package com.thanlon.servlet;

 import java.io.BufferedReader;
import java.io.IOException;
import java.io.PrintWriter; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import com.thanlon.services.SearchNameServices; import net.sf.json.JSONObject; public class SearchServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.setContentType("text/html;charset=utf-8");
// System.out.println("连接成功反馈");// 测试是否成功连接
StringBuffer json1 = new StringBuffer();// 字符流
String line = null;
BufferedReader reader = request.getReader();// 读取流
while ((line = reader.readLine()) != null) {
json1.append(line);// 接受的是JSON格式
} System.out.println(json1);//得到的是JSON格式
// System.out.println(json1.toString());//得到的是字符串,虽然控制台输出一样
// 把得到的字符串封装为JSON,再获取里面的传过来用户名
JSONObject jsonObject = JSONObject.fromObject(json1.toString());
String stu_number = jsonObject.getString("stu_number");
System.out.println(stu_number); // 连接本地数据库(采用MySql数据库 )
String stuName = SearchNameServices.selectNameInfo(stu_number);
System.out.println(stuName); PrintWriter out = response.getWriter();
// out.write(stuName);//本直接返回查到的姓名,在Android客户端显示就行,这里还是封装成JSON格式发送吧 String stu_name_json = "{\"stu_name\":\""+stuName+"\"}";//组装json格式的字符串来传送
System.out.println(stu_name_json);
out.write(stu_name_json);
out.flush();
out.close();
} @Override
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
// super.doGet(req, resp); response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.flush();
out.close();
}
}

SearchNameServices.java:

 package com.thanlon.services;

 import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException; import javax.naming.spi.DirStateFactory.Result;
import javax.validation.constraints.Null; import com.thanlon.dao.ConnDb; public class SearchNameServices { public static String selectNameInfo(String stu_number){
String stu_nameString = null;
String sql = "select *from student where stu_number = '"+stu_number+"'";
ConnDb connDb = new ConnDb();
try {
// 执行SQL语句
PreparedStatement ps = connDb.conn().prepareStatement(sql);
ResultSet rs = ps.executeQuery();
if (rs.next()) {
stu_nameString =rs.getString("stu_name");
return stu_nameString;
}else {
return stu_nameString="查无此人";
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("执行SQL语句出错!");
}
return null;
}
}

附:个人网站www.nxl123.cn(后台采用Python Flask框架搭建,2019年1月1日将升级完成并正式启用。哎,本人是学生狗呢!网站做的不好希望大家多多提意见或建议吧!?别骂我,打我就好,嘿嘿!……以后SEO什么的还得多向大家学习……)

Android+Servlet+MySql+JSON实现简单的数据查询操作--C/S架构的更多相关文章

  1. 关于pgsql 的json 和jsonb 的数据查询操作笔记整理

    关于pgsql 的json 和jsonb 的数据处理笔记 1. json 和jsonb 区别两者从用户操作的角度来说没有区别,区别主要是存储和读取的系统处理(预处理)和耗时方面有区别.json写入快, ...

  2. 我的EntityFramework(2):简单的数据查询

    原文:我的EntityFramework(2):简单的数据查询 在上一篇博文中,已经搭建了基本的框架,接下来就进行简单的数据查询,这里主要用了Linq 常见的数据集查询 var companyList ...

  3. MongoDB源码分析——mongod数据查询操作

    源码版本为MongoDB 2.6分支 Edit mongod数据查询操作 在mongod的初始化过程中说过,服务端接收到客户端消息后调用MyMessageHandler::process函数处理消息. ...

  4. MySQL/MariaDB数据库的多表查询操作

    MySQL/MariaDB数据库的多表查询操作 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.单表查询小试牛刀 [root@node105.yinzhengjie.org.cn ...

  5. mySQL 教程 第4章 数据查询

    mySQL运算符 这些运算符在SQL查询中用得到. 算数运算符 + 加 - 减 * 乘 / DIV 除 % MOD 取余数 比较运算符 = 等于 <> != 不等于 < <= ...

  6. [Python实战] 功能简单的数据查询及可视化系统

    前言 数据时代,数据的多源集成和快速检索查询是第一步,配上数据分析及可视化才能算窥得大数据一角. 创建这个项目的主要目的一是对前期工作的一些总结,二是提升自己. 这里简单介绍一下sqlpro这个项目的 ...

  7. C#参数化执行SQL语句,防止漏洞攻击本文以MySql为例【20151108非查询操作】

    为什么要参数化执行SQL语句呢? 一个作用就是可以防止用户注入漏洞. 简单举个列子吧. 比如账号密码登入,如果不用参数, 写的简单点吧,就写从数据库查找到id和pw与用户输入一样的数据吧 sql:se ...

  8. 基于jsp+servlet图书管理系统之后台用户信息查询操作

    上一篇的博客写的是插入操作,且附有源码和数据库,这篇博客写的是查询操作,附有从头至尾写的代码(详细的注释)和数据库! 此次查询操作的源码和数据库:http://download.csdn.net/de ...

  9. mongo数据查询操作

    本文来源于 :Stephen Liu 1.  基本查询:     构造查询数据.    > db.test.findOne()    {         "_id" : Ob ...

随机推荐

  1. 尚硅谷面试第一季-12Linux常用服务类相关命令

    课堂重点: 实操命令及运行结果: (centos 6) service network status chkconfig --list chkconfig --level 5 network off ...

  2. ibus-libpinyin 无法选择除第一个外的候选词

    其实不只一个人遇到这问题 https://github.com/libpinyin/ibus-libpinyin/issues/127 临时可用的解决办法是: 清理libpinyin的cache目录相 ...

  3. SP10707 COT2 - Count on a tree II 莫队

    链接 https://vjudge.net/problem/SPOJ-COT2 https://www.luogu.org/problemnew/show/SP10707 思路 dfs欧拉序转化为普通 ...

  4. 【做题】arc072_f-Dam——维护下凸包

    题意:有一个容量为\(L\)的水库,每天晚上可以放任意体积的水.每天早上会有一定温度和体积的水流入水库,且要保证流入水之后水的总体积不能超过\(L\).令体积分别为\(V_1,V_2\),温度分别为\ ...

  5. (zhuan) Paper Collection of Multi-Agent Reinforcement Learning (MARL)

    this blog from: https://github.com/LantaoYu/MARL-Papers Paper Collection of Multi-Agent Reinforcemen ...

  6. Java基础 【Math、Random、System、BigInteger、BigDecimal、Date、Calendar等常用类的使用】

    学习的这几个类  是日常工作中经常要使用到的类 Math 类包含用于执行基本数序运算的方法,如初等指数.对数.平方根和 三角函数. 成员方法 1.public static int abs(int a ...

  7. 【Hadoop 分布式部署 十 一: NameNode HA 自动故障转移】

    问题描述:    上一篇就是NameNode 的HA 部署完成,但是存在问题,问题是如果 主NameNode的节点宕机了,还是需要人工去使用命令来切换NameNode的Acitve 这样很不方便,所以 ...

  8. Images之管理image

    Manage images The easiest way to make your images available for use by others inside or outside your ...

  9. CSS sprites

    CSS Sprites在国内很多人叫css精灵,是一种网页图片应用处理方式. 优点: 它允许你将一个页面涉及到的所有零星图片都包含到一张大图中去,这样一来,当访问该页面时,载入的图片就不会像以前那样一 ...

  10. 项目Alpha冲刺--3/10

    项目Alpha冲刺--3/10 1.团队信息 团队名称:基于云的胜利冲锋队 成员信息 队员学号 队员姓名 个人博客地址 备注 221500201 孙文慈 https://www.cnblogs.com ...