这是一个小型的数据交互案例,即Android手机客户端和后台服务器交互(数据库mysql)

服务器端

首先服务器端数据库(用户名root密码123456),db_student.sql数据库表userinfo(用户名admin,密码123)

访问数据库的工具类DBManager.java

package com.jdbc.db;import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** 负责访问数据库的工具类* @author liuya**/
public class DBManager {//数据库的用户名和密码private final String USERNAME="root";private final String PSWD="123456";//数据库驱动private final String DRIVER="com.mysql.jdbc.Driver";private final String URL="jdbc:mysql://localhost:3306/db_student";private Connection connection;//连接数据库private PreparedStatement pstmt;//采用预编译的sql语句执行添加、删除、修改和查询的功能,效率高private ResultSet rs;//查询返回的结果集合private static DBManager instance;private DBManager() {// TODO Auto-generated constructor stubtry {Class.forName(DRIVER);} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public void getConnection(){try {connection=DriverManager.getConnection(URL, USERNAME, PSWD);} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}/*** 使用单例模式获得数据库的访问对象:保证数据的安全性* @return*/public static DBManager getInstance(){if(instance==null){instance=new DBManager();}return instance;}/*** 释放连接*/public void releaseConn(){if(rs!=null){try {rs.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}if(pstmt!=null){try {pstmt.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}if(connection!=null){try {connection.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}/*** 功能:对数据库表的增加删除和修改功能* @param sql* @param params* @return* @throws SQLException*/public boolean updateBySql(String sql,List<Object> params) throws SQLException{boolean flag=false;pstmt=connection.prepareStatement(sql);int index=1;if(params!=null&&!params.isEmpty()){for(int i=0;i<params.size();i++){pstmt.setObject(index++, params.get(i));}}int count=pstmt.executeUpdate();flag=count>0?true:false;return flag;}/*** 使用Java的反射机制封装查询,查询返回单条记录* @param sql* @param params* @param cls* @return* @throws Exception*/public<T> T querySingleResultRef(String sql,List<Object>params,Class<T> cls) throws Exception{T t=null;pstmt=connection.prepareStatement(sql);int index=1;if(params!=null&&!params.isEmpty()){for(int i=0;i<params.size();i++){pstmt.setObject(index++, params.get(i));}}//查询结果rs=pstmt.executeQuery();ResultSetMetaData metaData=rs.getMetaData();int cols_len=metaData.getColumnCount();if(rs.next()){t=cls.newInstance();for(int i=0;i<cols_len;i++){String cols_name=metaData.getColumnName(i+1);Object cols_value=rs.getObject(cols_name);if(cols_value==null){cols_value="";}Field field=cls.getDeclaredField(cols_name);field.setAccessible(true);field.set(t, cols_value);}}return t;}/*** 使用java的反射机制封装查询,查询返回多条记录* * @param sql* @param params* @param cls* @return* @throws Exception*/public<T> List<T> queryMultResultRef(String sql,List<Object> params,Class<T>cls) throws Exception{List<T> list=new ArrayList<T>();pstmt=connection.prepareStatement(sql);int index=1;if(params!=null&&!params.isEmpty()){for(int i=0;i<params.size();i++){pstmt.setObject(index++, params.get(i));}}rs=pstmt.executeQuery();ResultSetMetaData metaData=rs.getMetaData();int cols_len=metaData.getColumnCount();while(rs.next()){T t=cls.newInstance();for(int i=0;i<cols_len;i++){String cols_name=metaData.getColumnName(i+1);Object cols_value=rs.getObject(cols_name);if(cols_value==null){cols_value="";}Field field=cls.getDeclaredField(cols_name);field.setAccessible(true);field.set(t, cols_value);}list.add(t);}return list;}/*** 使用封装查询,查询返回一个Map表示一行记录* @param sql* @param params* @return* @throws SQLException*/public Map<String, Object> querySingleMap(String sql,List<Object> params) throws SQLException{Map<String, Object> map=new HashMap<String, Object>();pstmt=connection.prepareStatement(sql);int index = 1;if (params != null && !params.isEmpty()) {for (int i = 0; i < params.size(); i++) {pstmt.setObject(index++, params.get(i));}}rs = pstmt.executeQuery();ResultSetMetaData metaData = rs.getMetaData();int cols_len = metaData.getColumnCount();while (rs.next()) {for (int i = 0; i < cols_len; i++) {String key = metaData.getColumnName(i + 1);Object value = rs.getObject(key);if (value == null) {value = "";}map.put(key, value);}}return map;}/*** 使用封装查询,查询返回一个List<Map<String, Object>>表示多行记录* @param sql* @param params* @return* @throws SQLException*/public List<Map<String, Object>> queryMultMap(String sql,List<Object> params) throws SQLException{List<Map<String, Object>> list=new ArrayList<Map<String,Object>>();pstmt=connection.prepareStatement(sql);int index = 1;if (params != null && !params.isEmpty()) {for (int i = 0; i < params.size(); i++) {pstmt.setObject(index++, params.get(i));}}rs = pstmt.executeQuery();ResultSetMetaData metaData = rs.getMetaData();int cols_len = metaData.getColumnCount();while (rs.next()) {Map<String, Object> map = new HashMap<String, Object>();for (int i = 0; i < cols_len; i++) {String key = metaData.getColumnName(i + 1);Object value = rs.getObject(key);if (value == null) {value = "";}map.put(key, value);}list.add(map);}return list;}
}

一、开发服务器端

①创建登录LoginService.java(接口interface)

package com.android.login;import java.util.List;//判断用户是否存在
public interface LoginService {public boolean isUserExitLogin(List<Object> params);
}

②声明LoginDao.java实现 LoginService.java

package com.android.login;import java.sql.SQLException;
import java.util.List;
import java.util.Map;import com.jdbc.db.DBManager;public class LoginDao implements LoginService {private DBManager manager;public LoginDao() {// TODO Auto-generated constructor stubmanager=DBManager.getInstance();}@Overridepublic boolean isUserExitLogin(List<Object> params) {// TODO Auto-generated method stubString sql="select * from userinfo where username=? and password=?";manager.getConnection();Map<String, Object> map=null;boolean flag=false;try {map=manager.querySingleMap(sql, params);flag=map.isEmpty()?false:true;} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}return flag;}}

③给手机客户端提供一个接口(Servlet)LoginAction

package com.android.login;import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import net.sf.json.JSONSerializer;/*** Servlet implementation class LoginAction*/
@WebServlet("/LoginAction")
public class LoginAction extends HttpServlet {private static final long serialVersionUID = 1L;private LoginService service;@Overridepublic void init() throws ServletException {// TODO Auto-generated method stubsuper.init();service=new LoginDao();}/*** @see HttpServlet#HttpServlet()*/public LoginAction() {super();// TODO Auto-generated constructor stub}/*** @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)*/protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubthis.doPost(request, response);}/*** @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)*/protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubresponse.setContentType("text/html;charset=utf-8");request.setCharacterEncoding("utf-8");response.setCharacterEncoding("utf-8");PrintWriter writer = response.getWriter();String username=request.getParameter("username");String password=request.getParameter("password");List<Object> params=new ArrayList<Object>();params.add(username);params.add(password);boolean flag=service.isUserExitLogin(params);if(flag){ResultMessage message=new ResultMessage(1,"登录成功");Map<String, Object>map=new HashMap<String, Object>();map.put("result", message);String jsonString=JSONSerializer.toJSON(map).toString();writer.println(jsonString);}writer.flush();writer.close();}}

④创建对象ResultMessage.java

package com.android.login;public class ResultMessage {private int resultCode;// 结果码private String resultMessage;// 结果信息public int getResultCode() {return resultCode;}public void setResultCode(int resultCode) {this.resultCode = resultCode;}public String getResultMessage() {return resultMessage;}public void setResultMessage(String resultMessage) {this.resultMessage = resultMessage;}public ResultMessage() {// TODO Auto-generated constructor stub}public ResultMessage(int resultCode, String resultMessage) {super();this.resultCode = resultCode;this.resultMessage = resultMessage;}
}

二、开发手机客户端(简单登录)

①在activity_main.xml设置界面如下,在清单文件中加网络授权:Permissions->Add->Uses Permission->ok->在右边的name中查找INTERNET


②在MainActivity.java中实例化控件

③创建工具类HttpUtils.java

package com.example.android_httppost_login.http;import java.util.ArrayList;
import java.util.List;
import java.util.Map;import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;public class HttpUtils {public HttpUtils() {// TODO Auto-generated constructor stub}/*** * @param path* @param params 模拟http表单数据* @param encode* @return*/public static String sendPostMethod(String path,Map<String, Object> params,String encoding){HttpClient httpClient=new DefaultHttpClient();HttpPost httpPost=new HttpPost(path);String result="";List<BasicNameValuePair> parameters=new ArrayList<BasicNameValuePair>();try {if(params!=null&&!params.isEmpty()){for(Map.Entry<String, Object> entry:params.entrySet()){String name=entry.getKey();//String value=URLEncoder.encode( entry.getValue().toString(),encoding);//如果出现乱码问题,则修改String value=entry.getValue().toString();BasicNameValuePair valuePair=new BasicNameValuePair(name, value);parameters.add(valuePair);}}UrlEncodedFormEntity encodedFormEntity=new UrlEncodedFormEntity(parameters,encoding);//纯文本表单,不包含文件httpPost.setEntity(encodedFormEntity);HttpResponse httpResponse=httpClient.execute(httpPost);if(httpResponse.getStatusLine().getStatusCode()==200){result=EntityUtils.toString(httpResponse.getEntity(), encoding);}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}return result;}
}

④创建ResultMessage.java状态码类

package com.example.android_httppost_login.domain;public class ResultMessage {private int resultCode;// 结果码private String resultMessage;// 结果信息public int getResultCode() {return resultCode;}public void setResultCode(int resultCode) {this.resultCode = resultCode;}public String getResultMessage() {return resultMessage;}public void setResultMessage(String resultMessage) {this.resultMessage = resultMessage;}public ResultMessage() {// TODO Auto-generated constructor stub}public ResultMessage(int resultCode, String resultMessage) {super();this.resultCode = resultCode;this.resultMessage = resultMessage;}
}

⑤创建json字符串解析工具类JsonTools.java

package com.example.android_httppost_login.json;import org.json.JSONObject;import com.example.android_httppost_login.domain.ResultMessage;public class JsonTools {public JsonTools() {// TODO Auto-generated constructor stub}/*** {"result":{"resultCode":1,"resultMessage":"登录成功"}} * @param jsonString* @return*/public static ResultMessage getResultMessage(String jsonString){ResultMessage message=null;try {JSONObject sourceObject=new JSONObject(jsonString);JSONObject jsonObject=sourceObject.getJSONObject("result");message=new ResultMessage();message.setResultCode(jsonObject.getInt("resultCode"));message.setResultMessage(jsonObject.getString("resultMessage"));} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}return message;}
}

⑥在MainActivity.java处理(用异步任务处理post请求)

package com.example.android_httppost_login;import java.util.HashMap;
import java.util.Map;import com.example.android_httppost_login.domain.ResultMessage;
import com.example.android_httppost_login.http.HttpUtils;
import com.example.android_httppost_login.json.JsonTools;import android.support.v7.app.ActionBarActivity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;public class MainActivity extends ActionBarActivity {private Button btn;private EditText usernameEdt;private EditText passwordEdt;private ProgressDialog dialog;private final String LOGIN_PATH="http://192.168.1.100:8080/Httppost_Web/LoginAction";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);btn=(Button) this.findViewById(R.id.button1);usernameEdt=(EditText) this.findViewById(R.id.editText1);passwordEdt=(EditText) this.findViewById(R.id.editText2);dialog=new ProgressDialog(this);dialog.setTitle("提示");dialog.setMessage("正在登录,请稍候...");btn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubString name_value=usernameEdt.getText().toString().trim();String pswd_value=passwordEdt.getText().toString().trim();Map<String, String> params=new HashMap<String, String>();params.put("url", LOGIN_PATH);params.put("username", name_value);params.put("password", pswd_value);try {String result=new LoginAsyncTask().execute(params).get();ResultMessage message=JsonTools.getResultMessage(result);if(message.getResultCode()==1){Toast.makeText(MainActivity.this, message.getResultMessage(), 1).show();Intent intent=new Intent(MainActivity.this,NextActivity.class);startActivity(intent);}System.out.println("--->>"+result);} catch (Exception e) {// TODO: handle exception}}});}class LoginAsyncTask extends AsyncTask<Map<String, String>, Void, String>{@Overrideprotected void onPreExecute() {// TODO Auto-generated method stubsuper.onPreExecute();dialog.show();}@Overrideprotected String doInBackground(Map<String, String>... params) {// TODO Auto-generated method stubMap<String, String> map=params[0];//表单数据Map<String, Object> params2=new HashMap<String, Object>();params2.put("username", map.get("username"));params2.put("password", map.get("password"));String result=HttpUtils.sendPostMethod(map.get("url"), params2, "utf-8");return result;}@Overrideprotected void onPostExecute(String result) {// TODO Auto-generated method stubsuper.onPostExecute(result);dialog.dismiss();}}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {// Handle action bar item clicks here. The action bar will// automatically handle clicks on the Home/Up button, so long// as you specify a parent activity in AndroidManifest.xml.int id = item.getItemId();if (id == R.id.action_settings) {return true;}return super.onOptionsItemSelected(item);}
}

Android之使用HttpPost提交数据到服务器(Android手机客户端和后台服务器交互)相关推荐

  1. 江苏有线门户网站服务器地址,江苏有线手机客户端的登录服务器

    江苏有线手机客户端的登录服务器 内容精选 换一换 云游戏作为游戏行业的热门发展方向,通过视频流化的方式面向玩家提供免下载,脱离手机性能的一种游戏服务方式,其本身包含了PC游戏的流化和移动游戏的流化.云 ...

  2. 远程PLC监控调试,PLC通用中转服务器,多客户端tcp中转服务器源代码

    远程PLC监控调试,PLC通用中转服务器,多客户端tcp中转服务器源代码,socket多线程并发通讯,对接多路plc串口WIFI模块实现远程调试程序.支持各种串口服务器以及tcp以太网转发器硬件. 编 ...

  3. 远程PLC监控调试,PLC通用中转服务器,多客户端tcp中转 服务器源代码,socket多线程并发通讯

    远程PLC监控调试,PLC通用中转服务器,多客户端tcp中转 服务器源代码,socket多线程并发通讯, 对接多路plc串口WIFI模块实现远程调试程序.支持各种串口服务器以及tcp以太网转发器硬件.

  4. 远程PLC监控调试,PLC通用中转服务器,多客户端tcp中转服务器源代码,socket多线程并发通讯,对接多路plc串口WIFI模块实现远程调试程序

    远程PLC监控调试,PLC通用中转服务器,多客户端tcp中转服务器源代码,socket多线程并发通讯,对接多路plc串口WIFI模块实现远程调试程序. 支持各种串口服务器以及tcp以太网转发器硬件. ...

  5. Android笔记 采用httpclient提交数据到服务器demo

    本例建立在上篇日志基础之上web端代码不变 布局文件增加了两个按钮 httpclient相对于普通get post提交方式优势在于不需手动指定传输的编码集 避免了乱码 </pre>< ...

  6. Android笔记 get方式提交数据到服务器 避免乱码 demo

    http://download.csdn.net/detail/u011109881/8042001源代码 根据传智播客张泽华视频54-57写出 文中加粗的是解决乱码问题 A web端 1login. ...

  7. Android客户端与后台服务器的数据交互

    Android客户端与服务器的数据交互 这是今年7月份时在一家公司实训时自己做的一个小项目,仅仅是一个简单的模拟Android客户端与服务器的数据交互,中间会有串口通信,以及利用JDBC连接Mysql ...

  8. Android使用Put方式提交数据

    前一阵子,公司有个api接口必须使用put方式请求提交数据,但是在java中put方式的使用相当少,网上几乎很难找到相应的例子,摸索了一阵子,终于搞定了,下面分享给大家: 1.四种http请求方式作用 ...

  9. HTTP---Post提交数据的几种类型

    参考:https://www.cnblogs.com/yaojyhappy/p/9447160.html Http Header里的Content-Type一般有这三种: application/x- ...

最新文章

  1. 干货!神经网络原来是这样和数学挂钩的
  2. 关于类中的引用、常量、静态常量的初始化
  3. sizeof()浅解
  4. MyBatis复习(六):MyBatis二级缓存
  5. 如何在Raspberry Pi上安装Fedora 25
  6. 国内电动车召回12万辆有余 电池衰减和充电故障成头号问题
  7. mysql 表上线_腾讯云上线数据库 MySQL 8.0 版
  8. 揭秘设计模式:策略模式(Strategy)的枚举(Enum)实现
  9. 听飞狐聊JavaScript设计模式系列07
  10. 十行代码训练sklearn七种分类算法
  11. pandas.DataFrame.sample随机抽样
  12. apr内存池简单应用
  13. 一个牛人的经历---北京八年——从极度贫困到财务自由
  14. 外贸最全出口流程,外贸必看基础知识
  15. 【每日一读】SWOPE:Efficient Approximate Algorithms for Empirical Entropy and Mutual Information
  16. Verilog实现之任意分频电路
  17. RTK固定解什么意思
  18. 四羧基锌酞菁(ZnC4Pc),Zn-taPc 的荧光激发光谱介绍,齐岳生物供应酞菁材料
  19. 计算机应用基础试题操作题,计算机应用基础期末考试操作题.doc
  20. 最小公约数(大整数乘除法,C++)

热门文章

  1. 常用的Linux 系统监控工具
  2. 开启CSDN消息免打扰
  3. Web of science以及中国知网学术论文爬取教程(附代码)
  4. html 苹果 地图,pdrLocationIos0508.html
  5. 不懂APS系统?十个问答让你瞬间了解APS高级计划与排程系统
  6. 【经典】一个大数据学习的解决方案
  7. 2021-01-22学习记录 || 通过二维数组初始化窗体并进行代码重构
  8. excel小技巧(一)统计单元格中3的个数
  9. PC微信hook学习笔记(一)—— 获取个人信息
  10. 【编程题】【Scratch一级】2019.12 飞向太空