本例简单地实现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. Codeforces 526F Pudding Monsters - CDQ分治 - 桶排序

    In this problem you will meet the simplified model of game Pudding Monsters. An important process in ...

  2. Auth组件,Forms组件

    一.Auth组件默认auth_user表常用操作 #1.配置settings,使django与数据库连接 DATABASES = { 'default': { 'ENGINE': 'django.db ...

  3. 【Python56--爬取妹子图】

    爬取网站的思路 第一步:首先分析爬取网站的连接地址特性,发现翻页图片的时候连接:http://www.mmjpg.com/mm/1570  ,http://www.mmjpg.com/mm/1569, ...

  4. Oracle错误——ORA-12704:字符集不匹配

    错误 在查询使用coalesce把字符串进行转换时,报错ORA-12704:字符集不匹配 如下图 解决方法 在网上找了很多方法,有使用Translate转换的:有使用to_char()的,经过测试不符 ...

  5. tp框架中的一些疑点知识-1

    tp默认的编码是utf-8 Runtime中的Cache和Logs都是分模块的,因为在应用app下可以有多个模块,但是 公共模块和Runtime模块只有一个, 所以, Runtime要包含各个模块的内 ...

  6. Custom Quality Profiles in SonarQube

    https://medium.com/ltunes/custom-quality-profiles-in-sonarqube-part-1-8754348b9369 Creating Custom Q ...

  7. C# DataTable.Compute()用法

    DataTable.Compute()用法 2010-04-07 11:28 一.DataTable.Compute()方法說明如下 作用:          计算用来传递筛选条件的当前行上的给定表达 ...

  8. 用原型封装一个操作DOM的例子

    <script> // 一句话 在构造函数里面写属性 在原型里面写方法 function Elem(d){ this.even=document.getElementById(d); } ...

  9. 使用closest替换parent

    尽量不要使用parent去获取DOM元素,如下代码: var $activeRows = $this.parent().parent().children(".active"); ...

  10. 操作 frames 框架下的 dom 内容。

    2016-12-30 框架名: var obj=$(window.frames["wangpan"].document).find("a[menu=download_on ...