zoukankan      html  css  js  c++  java
  • 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:

    Package
     1 public class MainActivity extends AppCompatActivity implements View.OnClickListener {
     2 
     3     private EditText stu_number, stu_name;
     4     private Button btn_search;
     5     private OkHttpClient okhttpClient;
     6     private String stu_number_txt;
     7 
     8 
     9     @Override
    10     protected void onCreate(Bundle savedInstanceState) {
    11         super.onCreate(savedInstanceState);
    12         setContentView(R.layout.activity_main);
    13         initView();
    14     }
    15 
    16     public void initView() {
    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     @Override
    24     public void onClick(View view) {
    25         if (view.getId() == R.id.btn_search) {
    26             //获取输入的学号
    27             stu_number_txt = stu_number.getText().toString();
    28             new Thread(new Runnable() {
    29                 @Override
    30                 public void run() {
    31                     sendRequest(stu_number_txt);
    32                 }
    33             }).start();
    34 
    35         }
    36     }
    37 
    38     private void sendRequest(String stu_number_txt) {
    39         Map map = new HashMap();
    40         map.put("stu_number", stu_number_txt);
    41         JSONObject jsonObject = new JSONObject(map);
    42         String jsonString = jsonObject.toString();
    43 //        Log.d("这将JSON对象转换为json字符串", jsonString);
    44         RequestBody body = RequestBody.create(null, jsonString);//以字符串方式
    45         okhttpClient = new OkHttpClient();
    46         final Request request = new Request.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(new Callback() {
    52             @Override
    53             public void onFailure(Call call, IOException e) {
    54                 runOnUiThread(new Runnable() {
    55                     @Override
    56                     public void run() {
    57                         Toast.makeText(MainActivity.this, "连接失败!", Toast.LENGTH_SHORT).show();
    58                     }
    59                 });
    60                 e.printStackTrace();
    61             }
    62 
    63             @Override
    64             public void onResponse(Call call, Response response) throws IOException {
    65 //                runOnUiThread(new Runnable() {
    66 //                    @Override
    67 //                    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 = new JSONObject(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(final String response) {
    84         runOnUiThread(new Runnable() {
    85             @Override
    86             /**
    87              * 实时更新,数据库信息改变时,客户端内容发生改变
    88              */
    89             public void run() {
    90                 stu_name.setText(response);
    91             }
    92         });
    93     }
    94 }

    服务器端:

    ConnDb.java:

     1 package com.thanlon.dao;
     2 
     3 import java.sql.*;
     4 
     5 public class ConnDb {
     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     public Connection conn() {
    12         try {
    13             Class.forName(driverName);
    14             try {
    15                 Connection conn = DriverManager.getConnection(url,username,password);
    16                 return conn;
    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 package Test;
     2 
     3 import org.junit.Test;
     4 
     5 import com.thanlon.dao.ConnDb;
     6 
     7 public class TestConn {
     8     /**
     9      * 测试能否正常连接数据库
    10      */
    11     @Test
    12     public void TestConnDb() {
    13         ConnDb connDb = new ConnDb();
    14         System.out.println(connDb.conn());
    15     }
    16 }

    SearchServlet.java:

     1 package com.thanlon.servlet;
     2 
     3 import java.io.BufferedReader;
     4 import java.io.IOException;
     5 import java.io.PrintWriter;
     6 
     7 import javax.servlet.ServletException;
     8 import javax.servlet.http.HttpServlet;
     9 import javax.servlet.http.HttpServletRequest;
    10 import javax.servlet.http.HttpServletResponse;
    11 
    12 import com.thanlon.services.SearchNameServices;
    13 
    14 import net.sf.json.JSONObject;
    15 
    16 public class SearchServlet extends HttpServlet {
    17     @Override
    18     protected void doPost(HttpServletRequest request,
    19             HttpServletResponse response) throws ServletException, 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     @Override
    52     protected void doGet(HttpServletRequest request,
    53             HttpServletResponse response) throws ServletException, IOException {
    54         // TODO Auto-generated method stub
    55         // 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 package com.thanlon.services;
     2 
     3 import java.sql.PreparedStatement;
     4 import java.sql.ResultSet;
     5 import java.sql.SQLException;
     6 
     7 import javax.naming.spi.DirStateFactory.Result;
     8 import javax.validation.constraints.Null;
     9 
    10 import com.thanlon.dao.ConnDb;
    11 
    12 public class SearchNameServices {
    13 
    14     public static String selectNameInfo(String stu_number){
    15         String stu_nameString = null;
    16         String sql = "select *from student  where  stu_number = '"+stu_number+"'";
    17         ConnDb connDb = new ConnDb();
    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                 return stu_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什么的还得多向大家学习……)

  • 相关阅读:
    微信小程序购物商城系统开发系列-目录结构
    微信小程序购物商城系统开发系列-工具篇
    如何用js获取浏览器URL中查询字符串的参数
    Search for a Range
    Search in Rotated Sorted Array
    permutation递归方法
    Permutations
    next permutation
    4Sum
    3Sum Closest
  • 原文地址:https://www.cnblogs.com/qikeyishu/p/9155273.html
Copyright © 2011-2022 走看看