转载自http://www.cnblogs.com/yzxk/p/4749440.html

一、开发环境的部署

程序结构:

android+servlet+service+mysql

仅供参考:能实现相关功能即可

操作系统:ubuntu 14.10

数据库:mysql-5.5    数据库工具:emma

服务器:tomcat      服务器工具:Myeclipse 10

安卓端:真机 android4.4  安卓端工具:eclipse+adt

注意:

程序调试过程可能会产生乱码,只需保持所有工具编码方式相同即可。

二、数据库设计

表名:student

视图:

 

三、服务器端设计

1、新建Web Project,命名为HelloWeb

2、项目结构图如下:

 LogLet类和RegLet类分别用于处理客户端的登陆和注册请求;Service类用于完成servlet对数据库的具体操作;DBManager类用于进行数据库基本操作;

 左侧是项目图,右侧是web.xml配置文件截图。

  

3、项目代码:

 DBManager.java

 <1> 单例模式构建DBManager对象;       

 <2> 定义数据库连接、关闭以及增删改查的基本操作,返回结果集。

package com.db;import java.sql.*;public class DBManager {// 数据库连接常量public static final String DRIVER = "com.mysql.jdbc.Driver";public static final String USER = "root";public static final String PASS = "root";public static final String URL = "jdbc:mysql://localhost:3306/test";// 静态成员,支持单态模式private static DBManager per = null;private Connection conn = null;private Statement stmt = null;// 单态模式-懒汉模式private DBManager() {}public static DBManager createInstance() {if (per == null) {per = new DBManager();per.initDB();}return per;}// 加载驱动public void initDB() {try {Class.forName("com.mysql.jdbc.Driver");} catch (Exception e) {e.printStackTrace();}}// 连接数据库,获取句柄+对象public void connectDB() {System.out.println("Connecting to database...");try {conn = DriverManager.getConnection(URL, USER, PASS);stmt = conn.createStatement();} catch (SQLException e) {e.printStackTrace();}System.out.println("SqlManager:Connect to database successful.");}// 关闭数据库 关闭对象,释放句柄public void closeDB() {System.out.println("Close connection to database..");try {stmt.close();conn.close();} catch (SQLException e) {e.printStackTrace();}System.out.println("Close connection successful");}// 查询public ResultSet executeQuery(String sql) {ResultSet rs = null;try {rs = stmt.executeQuery(sql);} catch (SQLException e) {e.printStackTrace();}return rs;}// 增添/删除/修改public int executeUpdate(String sql) {int ret = 0;try {ret = stmt.executeUpdate(sql);} catch (SQLException e) {e.printStackTrace();}return ret;}
}

Service.java

  写到这里,可以预见:下一个类会通过调用本类方法完成登陆/注册的服务。

package com.service;import java.sql.ResultSet;
import java.sql.SQLException;import com.db.DBManager;public class Service {public Boolean login(String username, String password) {// 获取Sql查询语句String logSql = "select * from user where username ='" + username+ "' and password ='" + password + "'";// 获取DB对象DBManager sql = DBManager.createInstance();sql.connectDB();// 操作DB对象try {ResultSet rs = sql.executeQuery(logSql);if (rs.next()) {sql.closeDB();return true;}} catch (SQLException e) {e.printStackTrace();}sql.closeDB();return false;}public Boolean register(String username, String password) {// 获取Sql查询语句String regSql = "insert into student values('"+ username+ "','"+ password+ "') ";// 获取DB对象DBManager sql = DBManager.createInstance();sql.connectDB();int ret = sql.executeUpdate(regSql);if (ret != 0) {sql.closeDB();return true;}sql.closeDB();return false;}
}

LogLet.java

  一个简单的Servlet,用于处理Http请求(get/post)。RegLet.java和该类近乎相同,此处省去~

package com.servlet;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.service.Service;public class LogLet extends HttpServlet {private static final long serialVersionUID = 369840050351775312L;public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 接收客户端信息String username = request.getParameter("username");username = new String(username.getBytes("ISO-8859-1"), "UTF-8");String password = request.getParameter("password");System.out.println(username + "--" + password);// 新建服务对象Service serv = new Service();// 验证处理boolean loged = serv.login(username, password);if (loged) {System.out.print("Succss");request.getSession().setAttribute("username", username);// response.sendRedirect("welcome.jsp");} else {System.out.print("Failed");}// 返回信息到客户端response.setCharacterEncoding("UTF-8");response.setContentType("text/html");PrintWriter out = response.getWriter();out.print("用户名:" + username);out.print("密码:" + password);out.flush();out.close();}public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {}}

四、客户端设计

1、新建Android App Project,命名为AndroidHTTPDemo

2、现在开始思考需要什么东西...

 <1> 登陆和注册页面:布局文件

   login.xml , register.xml

 <2> 登陆和注册页面对应的Activity组件,在activity中进行具体操作

   login.java , register.java

 <3> 能够实现Http以get/post方式通信的类

   WebService.java , WebServicePost.java

 <4> 网络通信权限

        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
           <uses-permission android:name="android.permission.INTERNET" />

    OK,项目结构出炉,右侧是Manifeast配置文件的主要内容

3、现在,我们开始关注具体的代码。

  <1> 首先要做的,登陆注册界面,这个不用多说。我直接放图,大致就是下面这个样子,大家可以按照自己爱好设计。

  

<2> 在服务器端编程时我们了解到:服务器端接收客户端发送的信息,对信息进行一系列处理后,最终信息返回到客户端。

  首先要想的,就是获取信息并发送出去,然后接收信息并显示出来。

 (网络服务由于耗时问题,放在主线程很可能由于网络故障导致ANR;所以要开辟子线程留给http网络服务。当然不使用主线程也可以,只是不推荐)

      

<3> Login.java 有三点需要注意

  第一个是检测网络状态,只能检测流量,无法检测wifi;

  第二个是在子线程中,不能更改主线程的页面值,这里用了handle解决。

  第三个是这里有get/post两种http请求方式,两个实现类,。

package com.httpdemo;import com.rxz.androidhttpdemo.R;
import com.web.WebService;
import com.web.WebServicePost;import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.os.Bundle;
import android.os.Handler;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;public class Login extends Activity implements OnClickListener {// 登陆按钮private Button logbtn;// 调试文本,注册文本private TextView infotv, regtv;// 显示用户名和密码
    EditText username, password;// 创建等待框private ProgressDialog dialog;// 返回的数据private String info;// 返回主线程更新数据private static Handler handler = new Handler();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.login);// 获取控件username = (EditText) findViewById(R.id.user);password = (EditText) findViewById(R.id.pass);logbtn = (Button) findViewById(R.id.login);regtv = (TextView) findViewById(R.id.register);infotv = (TextView) findViewById(R.id.info);// 设置按钮监听器logbtn.setOnClickListener(this);regtv.setOnClickListener(this);}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.login:// 检测网络,无法检测wifiif (!checkNetwork()) {Toast toast = Toast.makeText(Login.this,"网络未连接", Toast.LENGTH_SHORT);toast.setGravity(Gravity.CENTER, 0, 0);toast.show();break;}// 提示框dialog = new ProgressDialog(this);dialog.setTitle("提示");dialog.setMessage("正在登陆,请稍后...");dialog.setCancelable(false);dialog.show();// 创建子线程,分别进行Get和Post传输new Thread(new MyThread()).start();break;case R.id.register:Intent regItn = new Intent(Login.this, Register.class);// overridePendingTransition(anim_enter);
            startActivity(regItn);break;};}// 子线程接收数据,主线程修改数据public class MyThread implements Runnable {@Overridepublic void run() {info = WebService.executeHttpGet(username.getText().toString(), password.getText().toString());// info = WebServicePost.executeHttpPost(username.getText().toString(), password.getText().toString());handler.post(new Runnable() {@Overridepublic void run() {                    infotv.setText(info);dialog.dismiss();}});}}// 检测网络private boolean checkNetwork() {ConnectivityManager connManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);if (connManager.getActiveNetworkInfo() != null) {return connManager.getActiveNetworkInfo().isAvailable();}return false;}}

<4> WebService.java   

  这里的IP是你的服务器IP,不确定时看下是否能用手机ping工具ping通。

  ① 你的服务器端程序已发布到互联网:这好办,就是你的IP地址。

  ② 你是在本地电脑上,这要求你的真机和你的电脑在同一个局域网。两种较方便的方法:路由器/笔记本的无线网卡

   conn.setConnectTimeout(3000);需要设置超时时间,否则会执行默认超时时间,30s ?

package com.web;import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;public class WebService {private static String IP = "10.42.0.1:8080";// 通过Get方式获取HTTP服务器数据public static String executeHttpGet(String username, String password) {HttpURLConnection conn = null;InputStream is = null;try {// 用户名 密码// URL 地址String path = "http://" + IP + "/HelloWeb/LogLet";path = path + "?username=" + username + "&password=" + password;conn = (HttpURLConnection) new URL(path).openConnection();conn.setConnectTimeout(3000); // 设置超时时间conn.setReadTimeout(3000);conn.setDoInput(true);conn.setRequestMethod("GET"); // 设置获取信息方式conn.setRequestProperty("Charset", "UTF-8"); // 设置接收数据编码格式if (conn.getResponseCode() == 200) {is = conn.getInputStream();return parseInfo(is);}}catch (Exception e) {e.printStackTrace();} finally {// 意外退出时进行连接关闭保护if (conn != null) {conn.disconnect();}if (is != null) {try {is.close();} catch (IOException e) {e.printStackTrace();}}}return null;}// 将输入流转化为 String 型 private static String parseInfo(InputStream inStream) throws Exception {byte[] data = read(inStream);// 转化为字符串return new String(data, "UTF-8");}// 将输入流转化为byte型 public static byte[] read(InputStream inStream) throws Exception {ByteArrayOutputStream outputStream = new ByteArrayOutputStream();byte[] buffer = new byte[1024];int len = 0;while ((len = inStream.read(buffer)) != -1) {outputStream.write(buffer, 0, len);}inStream.close();return outputStream.toByteArray();}
}

<5> WebServicePost.java

package com.web;import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
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.params.CoreConnectionPNames;public class WebServicePost {private static String IP = "10.42.0.1:8080";// 通过 POST 方式获取HTTP服务器数据public static String executeHttpPost(String username, String password) {try {String path = "http://" + IP + "/HelloWeb/LogLet";// 发送指令和信息Map<String, String> params = new HashMap<String, String>();params.put("username", username);params.put("password", password);return sendPOSTRequest(path, params, "UTF-8");} catch (Exception e) {e.printStackTrace();}return null;}// 处理发送数据请求private static String sendPOSTRequest(String path, Map<String, String> params, String encoding) throws Exception {List<NameValuePair> pairs = new ArrayList<NameValuePair>();if (params != null && !params.isEmpty()) {for (Map.Entry<String, String> entry : params.entrySet()) {pairs.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));}}UrlEncodedFormEntity entity = new UrlEncodedFormEntity(pairs, encoding);HttpPost post = new HttpPost(path);post.setEntity(entity);DefaultHttpClient client = new DefaultHttpClient();// 请求超时client.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 5000);// 读取超时client.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, 5000);HttpResponse response = client.execute(post);// 判断是否成功收取信息if (response.getStatusLine().getStatusCode() == 200) {return getInfo(response);}// 未成功收取信息,返回空指针return null;}// 收取数据private static String getInfo(HttpResponse response) throws Exception {HttpEntity entity = response.getEntity();InputStream is = entity.getContent();// 将输入流转化为byte型byte[] data = WebService.read(is);// 转化为字符串return new String(data, "UTF-8");}
}

五、运行效果

  以上工作完成后,只需要讲服务器端发布到本地(附上--mysql-jdbc驱动地址--),安卓端发布到手机,确保局域网内部,ip正确,即可正常访问。

  客户端截图:测试成功

           

  服务器端截图:测试成功

  

Android APP连接 MySQL相关推荐

  1. android app数据电脑,Android APP连接电脑数据库(以SQL Server为例)

    Android APP 连接电脑SQL Server数据库 1. 原理 首先要使APP连接到电脑的数据库就要明白为什么能连接以及该怎么连接.Android为什么一直说自己是一个平台呢,因为它没有自己的 ...

  2. Android APP连接电脑数据库(以SQL Server为例)

    Android APP 连接电脑SQL Server数据库 1. 原理 首先要使APP连接到电脑的数据库就要明白为什么能连接以及该怎么连接.Android为什么一直说自己是一个平台呢,因为它没有自己的 ...

  3. Android App 连接ble蓝牙模块并进行通讯

    Android App 连接ble蓝牙模块并进行通讯 对于蓝牙的基础知识我在这里就不赘述了,直接来干货,讲解连接ble蓝牙模块并进行通讯,通讯使用广播模式,结尾附上一个项目的demo.精彩内容即将开始 ...

  4. Android中连接MySql数据库获取数据的简单实现

    文章目录 背景 demo布局 导入jar包 demo代码实现 权限设置 应用运行的结果 背景 一般情况下,Android与数据库中的数据进行交互都是通过调用api接口来实现的.但是今天我们就来尝试实现 ...

  5. Android studio连接MySQL并完成简单的登录注册功能

    近期需要完成一个Android项目,那先从与数据库交互最简单的登陆注册开始吧,现记录过程如下: 此篇文章的小demo主要涉及数据库的连接,以及相应信息的查找与插入. 我已将源码上传至GitHub: h ...

  6. android jdbc 连接mysql数据库,android怎么用JDBC方法连接mysql数据库

    2016-11-21 回答 用android程序去直连mysql数据库,觉得这样做不好,出于安全等方面考虑.数据库地址,用户名密码,查询sql什么的都存在程序里,很容易被反编译等方法看到. 建议把表示 ...

  7. android app连接打印机程序,Android App新增打印机支持 手机打印就是爽

    初次看到这个东西,可能会误人为是移动硬盘或某人的午餐盒,但实际上,这是一台PoGo3*4打印机,既然是打印机那就是用来打印的喽,可是连接线在什么地方?这玩意到底怎么用,谁来教教我? 其实很简单,一台P ...

  8. Android jdbc连接mysql报错解决方案 (Communications link failure)

    最近调试安卓连接mysql真是心态爆炸,快两天才搞出来.以下整理一些常见问题. 检查manifest文件里网络权限是否打开 检查数据库IP是否有问题(包括一些沙雕错误,比如是不是在ip首或尾多了个空格 ...

  9. Android studio 连接Mysql数据库

    android项目中的一些数据的存储通常可以放在数据库当中,因为数据库存储的数据比较大并且用起来也比较方便,我是在写学生宿舍管理系统时用到了数据库,在连接数据库的时候我也百度了许多方法,但都没有成功, ...

最新文章

  1. 谷歌医疗AI再遭重挫!自宫头牌App,副总裁也已离职
  2. 题库练习3(质因子、取近似值、合并表记录)
  3. GDCM:gdcm::Coder的测试程序
  4. ITK:向二进制图像添加噪声
  5. 自定义搜索框,带提示信息的搜索框
  6. print输出保存到txt
  7. 枚举类型转换成字符串
  8. android edittext最多输入,android 中如何限制 EditText 最大输入字符数
  9. Elasticsearch 嵌套类型nested
  10. HTML学生个人网站作业设计:宠物网站设计——萌宠有家(5页) HTML+CSS 简单DIV布局宠物介绍网页模板代码 DW学生个人网站制作成品下载
  11. 用matlab化简三角函数方程组,matlab化简三角函数 matlab怎么样化简三角函数?
  12. 什么软件测试显示器响应时间准,液晶响应时间测试系统
  13. 微信公众号关注自动回复内容php ci,如何实现微信公众号“一键关注”功能?运营神器...
  14. dell h330 不要做raid5 ,做raid0就可以了
  15. 如何查询论文和下载书籍
  16. 大数据之实战足球盘口、凯利、必发和预测结果分析
  17. 六年级计算机学习,小学六年级计算机学习教案(24页)-原创力文档
  18. 时间戳 与 Unix时间戳
  19. 上海外国语计算机科学与技术,外国语|上海
  20. java基于springboot医疗器材管理系统

热门文章

  1. pageX,pageY,screenX,screenY,clientX,和clientY,offsetX ,offsetY,layerX,layerY的使用 和 区别
  2. ElasticSearch--Field的使用
  3. 2022年餐饮行业的10大必看趋势
  4. spring boot实现验证码登录
  5. unity build-in管线中的PBR材质Shader分析研究
  6. 组装计算机主机算固定资产吗,​购买电脑配件组装电脑属于固定资产吗
  7. Kotlin Suppress 的非常规用法
  8. 团建游戏暴露的项目管理问题
  9. [FROM LUOGU]排兵布阵
  10. 泰坦尼克号幸存者逻辑回归预测