Android+Servlet+MySql+JSON实现简单的数据查询操作--C/S架构
本例简单地实现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:
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架构的更多相关文章
- 关于pgsql 的json 和jsonb 的数据查询操作笔记整理
关于pgsql 的json 和jsonb 的数据处理笔记 1. json 和jsonb 区别两者从用户操作的角度来说没有区别,区别主要是存储和读取的系统处理(预处理)和耗时方面有区别.json写入快, ...
- 我的EntityFramework(2):简单的数据查询
原文:我的EntityFramework(2):简单的数据查询 在上一篇博文中,已经搭建了基本的框架,接下来就进行简单的数据查询,这里主要用了Linq 常见的数据集查询 var companyList ...
- MongoDB源码分析——mongod数据查询操作
源码版本为MongoDB 2.6分支 Edit mongod数据查询操作 在mongod的初始化过程中说过,服务端接收到客户端消息后调用MyMessageHandler::process函数处理消息. ...
- MySQL/MariaDB数据库的多表查询操作
MySQL/MariaDB数据库的多表查询操作 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.单表查询小试牛刀 [root@node105.yinzhengjie.org.cn ...
- mySQL 教程 第4章 数据查询
mySQL运算符 这些运算符在SQL查询中用得到. 算数运算符 + 加 - 减 * 乘 / DIV 除 % MOD 取余数 比较运算符 = 等于 <> != 不等于 < <= ...
- [Python实战] 功能简单的数据查询及可视化系统
前言 数据时代,数据的多源集成和快速检索查询是第一步,配上数据分析及可视化才能算窥得大数据一角. 创建这个项目的主要目的一是对前期工作的一些总结,二是提升自己. 这里简单介绍一下sqlpro这个项目的 ...
- C#参数化执行SQL语句,防止漏洞攻击本文以MySql为例【20151108非查询操作】
为什么要参数化执行SQL语句呢? 一个作用就是可以防止用户注入漏洞. 简单举个列子吧. 比如账号密码登入,如果不用参数, 写的简单点吧,就写从数据库查找到id和pw与用户输入一样的数据吧 sql:se ...
- 基于jsp+servlet图书管理系统之后台用户信息查询操作
上一篇的博客写的是插入操作,且附有源码和数据库,这篇博客写的是查询操作,附有从头至尾写的代码(详细的注释)和数据库! 此次查询操作的源码和数据库:http://download.csdn.net/de ...
- mongo数据查询操作
本文来源于 :Stephen Liu 1. 基本查询: 构造查询数据. > db.test.findOne() { "_id" : Ob ...
随机推荐
- C# 反射小结
废话不多说,直接上代码. 1.typeof(类名):它是一个运算符 eg_1:Type type = typeof(int) ; eg_2:public class Student { Type ty ...
- 抠图|计蒜客2019蓝桥杯省赛 B 组模拟赛(一)
样例输入: 3 4 5 1 0 0 0 1 1 0 1 0 1 1 0 1 0 1 1 0 0 0 1 5 6 1 1 1 1 1 1 1 0 1 0 1 1 1 0 1 0 1 1 1 0 0 0 ...
- FJNU2018低程A 逃跑路线(Lucas + 中国剩余定理 + LGV定理)题解
题目描述 n个人在w*h的监狱里面想要逃跑,已知他们的同伙在坐标(bi,h)接应他们,他们现在被关在(ai,1)现在他们必须要到同伙那里才有逃出去的机会,这n个人又很蠢只会从(x,y)->(x+ ...
- try里Response.end()问题
问题 在xxx.aspx.cs中处理异步请求,大致代码如下: 但会发现始终会进catch. 原因 Response.End()会引发ThreadAbortException. 解决方案 使用HttpC ...
- HDU 5727 Necklace(全排列+二分图匹配)
http://acm.split.hdu.edu.cn/showproblem.php?pid=5727 题意:现在有n个阳珠子和n个阴珠子,现在要把它们串成项链,要求是阴阳珠子间隔串,但是有些阴阳珠 ...
- Python cmd中输入'pip' 不是内部或外部命令,也不是可运行的程序或批处理文件。
配置一下环境变量,找到 添加一下Scripts文件夹的路径,如:这是我的路径C:\Users\ck\AppData\Local\Programs\Python\Python36 就是你python的安 ...
- 怎样更新CentOS6.5的yum源
将yum源设置为国内yum源,可以提升软件包安装和更新的速度,同时避免一些常见软件版本无法找到. 国内源:可以使用wget获取或者直接下载 网易: CentOS5: http://mirrors.16 ...
- libxml2_ZC积累
1.Qt5.3.2(VS2010 OpenGL) 1.1.查找节点的 带NameSpace的属性 参考网址:https://stackoverflow.com/questions/7872413/ho ...
- Spring 的@@Autowired 和 @Qualifier注释
@Autowired spring2.1中允许用户通过@Autowired注解对Bean的属性变量.属性Setter方法以及构造方法进行标注,配合AutowiredAnnotationBeanProc ...
- Android开发 打开已存在的项目(以虹软人脸识别sdk的demo为例)
详细流程参考博客https://blog.csdn.net/z979451341/article/details/79468785 个人遇到的问题与注意点 1.下载Demo后忘记修改appid和sdk ...
