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

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

1、本例演示截图:

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

eb84b48f2d0b91dd40c128ad7f80dbff.png

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

26bc8de5a09ca21f7e277f57bbf426dd.png

2、数据模型:

286777c8218cadec2b61b4de647ed03c.png

3、客户端:

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

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

e9fdd67bb75b8bc74fb52ef867a747ad.png

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

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

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

5、核心代码

Android客户端:

MainActivity.java:

4cec3e16c8540842592ed9dc3412d224ba9.jpgPackage

1 public class MainActivity extends AppCompatActivity implementsView.OnClickListener {2

3 privateEditText stu_number, stu_name;4 privateButton btn_search;5 privateOkHttpClient okhttpClient;6 privateString stu_number_txt;7

8

9 @Override10 protected voidonCreate(Bundle savedInstanceState) {11 super.onCreate(savedInstanceState);12 setContentView(R.layout.activity_main);13 initView();14 }15

16 public voidinitView() {17 btn_search =(Button) findViewById(R.id.btn_search);18 stu_number =(EditText) findViewById(R.id.stu_number);19 stu_name =(EditText) findViewById(R.id.stu_name);20 btn_search.setOnClickListener(this);21 }22

23 @Override24 public voidonClick(View view) {25 if (view.getId() ==R.id.btn_search) {26 //获取输入的学号

27 stu_number_txt =stu_number.getText().toString();28 new Thread(newRunnable() {29 @Override30 public voidrun() {31 sendRequest(stu_number_txt);32 }33 }).start();34

35 }36 }37

38 private voidsendRequest(String stu_number_txt) {39 Map map = newHashMap();40 map.put("stu_number", stu_number_txt);41 JSONObject jsonObject = newJSONObject(map);42 String jsonString =jsonObject.toString();43 //Log.d("这将JSON对象转换为json字符串", jsonString);

44 RequestBody body = RequestBody.create(null, jsonString);//以字符串方式

45 okhttpClient = newOkHttpClient();46 final Request request = newRequest.Builder()47 .url("http://192.168.43.218:8080/AndroidServerDemo/SearchServlet")48 .post(body)49 .build();50 Call call =okhttpClient.newCall(request);51 call.enqueue(newCallback() {52 @Override53 public voidonFailure(Call call, IOException e) {54 runOnUiThread(newRunnable() {55 @Override56 public voidrun() {57 Toast.makeText(MainActivity.this, "连接失败!", Toast.LENGTH_SHORT).show();58 }59 });60 e.printStackTrace();61 }62

63 @Override64 public void onResponse(Call call, Response response) throwsIOException {65 //runOnUiThread(new Runnable() {66 //@Override67 //public void run() {68 //Toast.makeText(MainActivity.this,"连接成功!",Toast.LENGTH_SHORT).show();69 //}70 //});

71 String res = response.body().string();//获取到传过来的字符串

72 try{73 JSONObject jsonObj = newJSONObject(res);74 String stu_name = jsonObj.getString("stu_name");75 showRequestResult(stu_name);76 } catch(JSONException e) {77 e.printStackTrace();78 }79 }80 });81 }82

83 private void showRequestResult(finalString response) {84 runOnUiThread(newRunnable() {85 @Override86 /**

87 * 实时更新,数据库信息改变时,客户端内容发生改变88 */

89 public voidrun() {90 stu_name.setText(response);91 }92 });93 }94 }

服务器端:

ConnDb.java:

1 packagecom.thanlon.dao;2

3 import java.sql.*;4

5 public classConnDb {6 private String driverName = "com.mysql.jdbc.Driver";7 private String username = "root";8 private String password = "123456";9 private String url = "jdbc:mysql://localhost:3306/androidDb";10

11 publicConnection conn() {12 try{13 Class.forName(driverName);14 try{15 Connection conn =DriverManager.getConnection(url,username,password);16 returnconn;17 } catch(SQLException e) {18 //TODO Auto-generated catch block

19 e.printStackTrace();20 System.out.println("连接数据库失败!");21 }22 } catch(ClassNotFoundException e) {23 //TODO Auto-generated catch block

24 e.printStackTrace();25 System.out.println("加载驱动失败!");26 }27 return null;28 }29 }

TextConn.java:

1 packageTest;2

3 importorg.junit.Test;4

5 importcom.thanlon.dao.ConnDb;6

7 public classTestConn {8 /**

9 * 测试能否正常连接数据库10 */

11 @Test12 public voidTestConnDb() {13 ConnDb connDb = newConnDb();14 System.out.println(connDb.conn());15 }16 }

SearchServlet.java:

1 packagecom.thanlon.servlet;2

3 importjava.io.BufferedReader;4 importjava.io.IOException;5 importjava.io.PrintWriter;6

7 importjavax.servlet.ServletException;8 importjavax.servlet.http.HttpServlet;9 importjavax.servlet.http.HttpServletRequest;10 importjavax.servlet.http.HttpServletResponse;11

12 importcom.thanlon.services.SearchNameServices;13

14 importnet.sf.json.JSONObject;15

16 public class SearchServlet extendsHttpServlet {17 @Override18 protected voiddoPost(HttpServletRequest request,19 HttpServletResponse response) throwsServletException, IOException {20 //TODO Auto-generated method stub

21 response.setContentType("text/html;charset=utf-8");22 //System.out.println("连接成功反馈");//测试是否成功连接

23 StringBuffer json1 = new StringBuffer();//字符流

24 String line = null;25 BufferedReader reader = request.getReader();//读取流

26 while ((line = reader.readLine()) != null) {27 json1.append(line);//接受的是JSON格式

28 }29

30 System.out.println(json1);//得到的是JSON格式31 //System.out.println(json1.toString());//得到的是字符串,虽然控制台输出一样32 //把得到的字符串封装为JSON,再获取里面的传过来用户名

33 JSONObject jsonObject =JSONObject.fromObject(json1.toString());34 String stu_number = jsonObject.getString("stu_number");35 System.out.println(stu_number);36

37 //连接本地数据库(采用MySql数据库 )

38 String stuName =SearchNameServices.selectNameInfo(stu_number);39 System.out.println(stuName);40

41 PrintWriter out =response.getWriter();42 //out.write(stuName);//本直接返回查到的姓名,在Android客户端显示就行,这里还是封装成JSON格式发送吧

43

44 String stu_name_json = "{\"stu_name\":\""+stuName+"\"}";//组装json格式的字符串来传送

45 System.out.println(stu_name_json);46 out.write(stu_name_json);47 out.flush();48 out.close();49 }50

51 @Override52 protected voiddoGet(HttpServletRequest request,53 HttpServletResponse response) throwsServletException, IOException {54 //TODO Auto-generated method stub55 //super.doGet(req, resp);

56

57 response.setContentType("text/html;charset=utf-8");58 PrintWriter out =response.getWriter();59 out.flush();60 out.close();61 }62 }

SearchNameServices.java:

1 packagecom.thanlon.services;2

3 importjava.sql.PreparedStatement;4 importjava.sql.ResultSet;5 importjava.sql.SQLException;6

7 importjavax.naming.spi.DirStateFactory.Result;8 importjavax.validation.constraints.Null;9

10 importcom.thanlon.dao.ConnDb;11

12 public classSearchNameServices {13

14 public staticString selectNameInfo(String stu_number){15 String stu_nameString = null;16 String sql = "select *from student where stu_number = '"+stu_number+"'";17 ConnDb connDb = newConnDb();18 try{19 //执行SQL语句

20 PreparedStatement ps =connDb.conn().prepareStatement(sql);21 ResultSet rs =ps.executeQuery();22 if(rs.next()) {23 stu_nameString =rs.getString("stu_name");24 returnstu_nameString;25 }else{26 return stu_nameString="查无此人";27 }28 } catch(SQLException e) {29 //TODO Auto-generated catch block

30 e.printStackTrace();31 System.out.println("执行SQL语句出错!");32 }33 return null;34 }35 }

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值