Android+Servlet+MySql+JSON实现简单的数据查询操作--C/S架构

时间:2023-03-08 22:04:41

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

1、本例演示截图:

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

Android+Servlet+MySql+JSON实现简单的数据查询操作--C/S架构

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

Android+Servlet+MySql+JSON实现简单的数据查询操作--C/S架构

2、数据模型:

Android+Servlet+MySql+JSON实现简单的数据查询操作--C/S架构

3、客户端:

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

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

Android+Servlet+MySql+JSON实现简单的数据查询操作--C/S架构

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什么的还得多向大家学习……)