简介:    

   在前些天写的项目中用到了Android与Tomcat服务器的数据交互,即“通过HttpClient的方式向服务器发送请求,服务器的Servlet接收并执行数据处理(从数据库中提取数据),最后返回给Android平台,平台解析”的过程。

 

配置:

    服务器:Apache Tomcat v8.0

    语言版本:Java 1.8.0_66

    编译环境:Eclipse

                    Android Studio

    调用jar包:httpclient-4.2.5,httpcore-4.2.4 //HttpClient父类

                     gson-2.2.4 //封装,解析json数据

                     mysql-connector-java-5.1.37-bin //用于连接Mysql数据库

 

服务器搭建:

    Eclipse新建动态Web项目(Dynamic Web Project)并且在项目中构建简单的登陆页面,用于测试数据库连接性,代码如下:

 

<%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncoding="UTF-8"%>Insert title here
用户名
密码

 

    前段页面构建完成,下面来搭建服务器,在Java Resources下的src文件夹中新建com.DBTool包,用作数据池来连接数据库,在包中建立DBUtil类实现功能,代码如下:

 

package com.DBTool;import java.sql.Connection;import java.sql.DriverManager;import java.sql.*;public class DBUtil {private static String url="jdbc:mysql://localhost:3306/demodatabase";private static String driverClass="com.mysql.jdbc.Driver";private static String username="root";private static String password="root";private static Connection conn;//装载驱动static{try{Class.forName(driverClass);}catch(ClassNotFoundException e){e.printStackTrace();}}//获取数据库连接public static Connection getConnection(){try{conn=DriverManager.getConnection(url,username,password);}catch(SQLException e){e.printStackTrace();}return conn;}//建立数据库连接public static void main(String[] args){Connection conn=DBUtil.getConnection();if(conn==null){System.out.println("数据库连接失败!");}}//关闭数据库连接public static void Clse(){if(conn!=null){try{conn.close();}catch(SQLException e){e.printStackTrace();}}}}

 

    在Java Resources下的src文件夹中新建com.Servlet包,用于存放Servlet文件,也就是用来实现功能的服务器文件,在包中建立Login类,此为Servlet类。

    此时在Login类中会自动生成doGet和doPost两种方法,我们对doPost方法中的代码进行删改和添加,来实现登陆功能:

 

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String ID = request.getParameter("ID"); //用于接收前段输入的ID值,此处参数须和input控件的name值一致        String PW= request.getParameter("PW");//用于接收前段输入的PW值,此处参数须和input控件的name值一致        boolean type=false;//用于判断账号和密码是否与数据库中查询结果一致        response.setContentType("text/html; charset=UTF-8");        PrintWriter out = response.getWriter();        try        {        Connection con=DBUtil.getConnection();        Statement stmt=con.createStatement();String sql="select * from demodatabase.demotable where uid="+ID+" and pwd="+PW;ResultSet rs=stmt.executeQuery(sql);    while(rs.next())    {    type=true;    }        }        catch(Exception ex)        {        ex.printStackTrace();        }        finally        {        DBUtil.Close();        out.print(type);        out.flush();        out.close();        }}

    最后,在WebContent下的WEB-INF文件夹下加入xml文件来连接servlet与jsp前端:

 

 

<?xml version="1.0" encoding="UTF-8"?>      Login    com.Servlet.Login        Login    /Login  

   运行服务器,测试是否成功搭建

Android与服务端数据交互 Apache Tomcat + MySQL_第1张图片Android与服务端数据交互 Apache Tomcat + MySQL_第2张图片

    返回值为true,证明服务器工作流程正确,然后开始进行Android平台的作业。

 

Android平台登录模块:

    打开Android Studio,新建空项目(Blank Activity),随便布个局,搭建登录界面:

    (布局代码在Demo里)

Android与服务端数据交互 Apache Tomcat + MySQL_第3张图片

 

    打开MainActivity,开始编辑功能代码,在这之前需要先在lib文件夹中加入第三方jar包httpclient-4.2.5和httpcore-4.2.4,并且Add As Library。

   在onCreate方法中开始加入代码:

        1.获取登录按钮,加入监听事件,在监听事件中获取所输入的账号和密码,调用SendByHttpClient方法处理:

 

 protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        Button button=(Button)findViewById(R.id.Login);        button.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                EditText uid=(EditText)findViewById(R.id.username);                EditText pwd=(EditText)findViewById(R.id.password);                String id=uid.getText().toString().trim();                String pw=pwd.getText().toString().trim();                SendByHttpClient(id,pw);            }        });    }

 

  在onCreate方法外编写SendByHttpClient方法,其中包含id和pw两个String变量:

 

public void SendByHttpClient(final String id, final String pw){        new Thread(new Runnable() {            @Override            public void run() {                try {                    HttpClient httpclient=new DefaultHttpClient();                    HttpPost httpPost=new HttpPost("http://192.168.191.1:8080/HttpClientDemo/Login");//服务器地址,指向Servlet                    List params=new ArrayList();//将id和pw装入list                    params.add(new BasicNameValuePair("ID",id));                    params.add(new BasicNameValuePair("PW",pw));                    final UrlEncodedFormEntity entity=new UrlEncodedFormEntity(params,"utf-8");//以UTF-8格式发送                    httpPost.setEntity(entity);                    HttpResponse httpResponse= httpclient.execute(httpPost);                    if(httpResponse.getStatusLine().getStatusCode()==200)//在200毫秒之内接收到返回值                    {                        HttpEntity entity1=httpResponse.getEntity();                        String response=EntityUtils.toString(entity1, "utf-8");//以UTF-8格式解析                        Message message=new Message();                        message.what=USER_LOGIN;                        message.obj=response;                        handler.sendMessage(message);使用Message传递消息给线程                    }                }                catch (Exception e) {                    e.printStackTrace();                }            }        }).start();    }

    编写线程,Message接收值,并给予显示:

 

 

public static final int SHOW_RESPONSE=1;    public Handler handler=new Handler() {        public void handleMessage(Message msg)        {            switch (msg.what){                case SHOW_RESPONSE:                    String response=(String)msg.obj;                    Toast.makeText(MainActivity.this, response, Toast.LENGTH_SHORT).show();                    break;                default:                    break;            }        }    };

     最后在AndroidManifest.xml中加入 允许连接网络 的代码:

 

 

   结束战斗,测试结果:

Android与服务端数据交互 Apache Tomcat + MySQL_第4张图片

 

注:

 

            1.PO主采用的是真机调试,也就是服务器所在的计算机开wifi,用手机去连接,然后在http那里填写的是无线局域网适配器的ip地址即可。

               查询方法:在CMD中输入ipconfig即可查看

         2.完成代码后如果在Build时遇到报错问题有可能是因为多个jar包同时指向一个log文件所致,

               可以在Gradele Scripts里的build.gradle(Module:app)中,找到buildTypes方法的下方添加以下代码解决:

 

packagingOptions {        exclude 'META-INF/LICENSE.txt'        exclude 'META-INF/NOTICE.txt'    }

 

 

 

 

 

          最后,附上Demo的下载链接:http://download.csdn.net/detail/qq_14923661/9391639

          黑心的CS弟N,给我偷摸涨价,度娘网盘 https://pan.baidu.com/s/1aPgZSlvhPQuS5md6QOuD7w

   

 

更多相关文章

  1. android 测试项目出现 Test run failed: No test results 的解决
  2. android TextView 的setTextSize方法的使用
  3. Android Drawer(抽屜)的使用(二)常用的方法:
  4. Android 退出应用程序的实现方法
  5. 关于Android LinearLayout添加分隔线的方法
  6. 原创:Android的sqlite数据库需上传服务器,进行更新保存
  7. Android ScrollView初始位置不在顶部的解决方法
  8. 解决Android横竖屏切换数据丢失问题的方法

随机推荐

  1. Android(安卓)用户自定义对话框
  2. Android(安卓)使用自定义SVG
  3. Android(安卓)指定SD卡上一首歌作为程序
  4. android UiAutomator自定义快速调试类
  5. Android(安卓)用adb pull或push 拷贝手机
  6. Android登录功能实现
  7. Android给图片加文字和图片水印
  8. Android进阶之如何实现国际化和各国Value
  9. Android(安卓)四大核心组件
  10. WebView简介(加速加载篇)