博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 通过Web服务器与Mysql数据库交互
阅读量:4216 次
发布时间:2019-05-26

本文共 10307 字,大约阅读时间需要 34 分钟。

之前一直没时间回复大家,抱歉,现在已经把Demo放在Github上面了。

欢迎star

https://github.com/Tianweidadada/LoginDemoReposity

 

一、主要内容

    以手机登录为例,实现与数据库交互。

                

        分成两个项目:前端(android 简易界面),后端(数据库操作)

 

二、开发工具

    android studio 3.1, eclipse(支持web),Mysql数据库, android手机(one plus 3)

 

 

 

三、安装Mysql

              

    1 自行下载安装,并在cmd窗口测试是否成功。

    2下载Navicat (一种可视化工具帮助建立数据库,表等操作)

    3下载mysql-connector-java-5.1.45(版本不一定一样,这是连接数据库的同一接口)

四、下载并配置Tomcat

    1到apche官网下载 : apache-tomcat-8.5.28 

    2

 

五、搭建web服务器

 

    1建立web工程:

            在eclipse下新建工程Dynamic Web Project(建立过程网上很多)

    2把之前下载的mysql-connector-java-5.1.45放在工程的WebContent->WEB-INF->lib下面

    并把这个包:mysql-connector-java-5.1.45-bin.jar 加入到路径中(右键BuildPath->configur )

 

 

此外 当我只加了这么一个路径时候发现还是报错:

 java连接mysql :No Suitable Driver Found For Jdbc 

之后我又添加到了一个路径:在上面快捷工具栏(图标那里)找见 Run Configuritions 把刚才的jar包再次添加这样就解决了这个错误(如果直接加入jar包后没有问题就最好了)

    

3、控制台下找到Servers 

下面有Tomcat v8.5 右键打开 找到Properties 进入

 

 

    

   打开Properties后是这样

 

 

注意到 Switch Location

这里把路径设置为你下载好的Tomcat 目录

 

 

之后在项目下面看Servers多出了下面的一行

并选择右侧红线圈住的那个选项 保存设置

(这里做了这么多是为了使用自己的Tomcat ,系统也自带了Tomcat 插件,不过我还是喜欢用自己下载的)

 

 

最后、在Java Resource下面 新建servlet(右键 选择建立servlet  其中 servlet名字 就默认设置为/UserServlet)

 

服务器基本搭建完成了,可以输入 http://localhost:8080/LoginDemo/UserServlet 检验一下

其中LoginDemo改为你的项目名称,UserServlet为刚才建立的servlet名

 

 

六、后端代码实现:

 

 

1、连接数据库(数据库与表自行建立)这里使用我的数据库名为logindemo

这里连接的都是固定的操作,只是数据库名字,账号,密码不一样罢了

package com.zhangwei.util;/** * Created by zhangwei on 2018/3/8. */import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;public class DBUtil{    private static Connection conn;    private static final String URL = "jdbc:mysql://127.0.0.1:3306/logindemo";//数据库名字改为你的    private static final String USERNAME = "root";//改为你的    private static final String PASSWORD = "123";//改为你的    static{        try{            Class.forName("com.mysql.jdbc.Driver");        }        catch (Exception e) {            e.printStackTrace();        }    }    public static Connection getConn(){        try{            conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);        }        catch (Exception e) {            e.printStackTrace();        }        return conn;    }    public static void closeConn(){        if(conn != null){            try {                conn.close();            } catch (SQLException e) {                e.printStackTrace();            }        }    }}

 

2、数据库操作处理登录验证

package com.zhangwei.dao;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import com.zhangwei.entity.UserInfo;import com.zhangwei.util.DBUtil;public class UserDAO {		public boolean queryUser(UserInfo userinfo){		Connection conn = DBUtil.getConn();		String sql="select * from t_user where username=? and password=?";				try {			PreparedStatement ps = conn.prepareStatement(sql);			ps.setString(1, userinfo.getUsername());			ps.setString(2, userinfo.getPassword());			ResultSet rs = ps.executeQuery();			if(rs.next()){				return true;			}else{				return false;			}		} catch (SQLException e) {			e.printStackTrace();			return false;		}finally{			DBUtil.closeConn();		}			}}

 

 

3、在Java Resource下面 新建servlet(右键 选择建立servlet  其中 servlet名字 就默认设置为/UserServlet)

package com.zhangwei.servlet;import java.io.IOException;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 com.zhangwei.service.UserService;/** * Servlet implementation class UserServlet */@WebServlet("/UserServlet")public class UserServlet extends HttpServlet {	private static final long serialVersionUID = 1L;	UserService userService = new UserService();		protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {		this.doPost(request, response);	}	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {		request.setCharacterEncoding("utf-8");		response.setCharacterEncoding("utf-8");		response.setContentType("text/plain;charset = utf-8");		response.setHeader("Content-type", "text/html;charset=utf-8");		String username = request.getParameter("username");		String password = request.getParameter("password");		if(userService.login(username, password)) {			response.getOutputStream().write(("登录成功...\n用户: " + username + "\n密码: " + password).getBytes("utf-8"));		}		else {			response.getOutputStream().write(("登录失败...\n请检查用户名和密码是否正确").getBytes("utf-8"));		}	}}

 

这里的UserService用于查询操作

 

package com.zhangwei.service;import com.zhangwei.dao.UserDAO;import com.zhangwei.entity.UserInfo;public class UserService {		UserDAO userDAO = new UserDAO();	public boolean login(String username, String password) {		UserInfo userInfo = new UserInfo();		userInfo.setUsername(username);		userInfo.setPassword(password);		return userDAO.queryUser(userInfo);	}	}

 

七、android 端操作

 

 

1简单的界面 用于反馈

 

package com.zhangwei.logindemo;import android.os.Build;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.TextView;import android.widget.Toast;import com.zhangwei.logindemo.service.LoginService;public class MainActivity extends AppCompatActivity implements View.OnClickListener{    private Button sendRequest;    private TextView showResponse;    private EditText etUsername;    private EditText etPassword;  //  private EditText etResult;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initView();    }    private void initView(){        sendRequest = (Button)findViewById(R.id.send_request);        showResponse = (TextView) findViewById(R.id.tv_show_response);        etUsername = (EditText)findViewById(R.id.et_username);        etPassword = (EditText)findViewById(R.id.et_password);        sendRequest.setOnClickListener(this);    }    @Override    public void onClick(View v){        switch (v.getId()){            case R.id.send_request:                Toast.makeText(this,"正在提交请求",Toast.LENGTH_LONG).show();                new Thread(new Runnable() {                    @Override                    public void run() {                        String username = etUsername.getText().toString();                        String password = etPassword.getText().toString();                        //final String response = LoginService.loginByGet(username,password);                        final String  response = LoginService.loginByPost(username,password);                        if(response != null){                            showResponse(response);                        }else{                            showResponse("请求失败....");                        }                    }                }).start();        }    }    private void showResponse(final  String response){        runOnUiThread(new Runnable() {            @Override            public void run() {                showResponse.setText(response);            }        });    }}

 

2、android 发送服务器请求

 

package com.zhangwei.logindemo.service;/** * Created by zhangwei on 2018/3/10. */import com.zhangwei.logindemo.Util.StreamTools;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.HttpURLConnection;import java.net.MalformedURLException;import java.net.ProtocolException;import java.net.URL;import java.net.URLEncoder;/*该类演示了四种方法提交数据到服务器,并将服务器解析后的数据以字符串的形式返回*/public class LoginService {    /**     *     * @param username     * @param password     * @return     */    public static String loginByGet(String username,String password){        try {            //提交数据到服务器            //拼装路径            String path = "http://192.168.19.115:8080/LoginDemo/UserServlet?username="                    + URLEncoder.encode(username,"UTF-8") + "&password=" + URLEncoder.encode(password,"UTF-8");            URL url = new URL(path);            HttpURLConnection conn = (HttpURLConnection) url.openConnection();//打开连接            conn.setRequestMethod("GET");//设置请求方式为get            conn.setConnectTimeout(5000);//设置连接超时时间为5秒            int code = conn.getResponseCode();//获得请求码            if(code == 200){                InputStream is = conn.getInputStream();                String text = StreamTools.readInputStream(is);                return text;            }else{                return null;            }//            return null;        } catch (Exception e) {            e.printStackTrace();        }        return null;    }//这里提交的路径一定要写准确,填写你当前所在局域网的ip + 项目名 + Servlet Url    public static String loginByPost(String username,String password){        try {            String path = "http://192.168.19.115:8080/LoginDemo/UserServlet";            URL url = new URL(path);            HttpURLConnection conn =  (HttpURLConnection) url.openConnection();            conn.setConnectTimeout(8000);            conn.setReadTimeout(8000);            conn.setRequestMethod("POST");            String data = "username="+URLEncoder.encode(username)+"&password="                    +URLEncoder.encode(password);            System.out.println(data);            conn.setRequestProperty("Content=Type", "application/x-wwww-form-urlencoded");            conn.setRequestProperty("Content-length", data.length()+"");            conn.setDoOutput(true);            OutputStream os = conn.getOutputStream();            os.write(data.getBytes());            int code = conn.getResponseCode();            if (code == 200) {                InputStream is = conn.getInputStream();                String text = StreamTools.readInputStream(is);                return text;            }else {                return null;            }        } catch (MalformedURLException e) {            // TODO Auto-generated catch block            e.printStackTrace();            System.out.println("111111");        } catch (ProtocolException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }        return null;    }}

 

1、不能使用翻墙软件,因为此时ip在国外。

2、需要手机与电脑连接同一局域网(wifi热点就可以)

 

 

3、关闭防火墙(不关闭也可以,但是需要配置入栈规则,让8080端口可以被访问),索性还是直接关了防火墙(关后如果没反应重启一下)

4、需要在AndroidManifest.xml里面添加网络权限

 

 

以上几点很重要,必不可少,我就是在这上面吃了大亏。

 

八、在eclipse下启动服务器 右键项目 下面找到  Run  as ->Run on server 

然后 切换到Android studio 把app运行到手机上

 

 

你可能感兴趣的文章
人工智能学习笔记——科学计算库Numpy
查看>>
Python学习笔记——面向对象2
查看>>
Web前端学习笔记——Canvas 01
查看>>
Python学习笔记——文件操作、综合应用
查看>>
Python学习笔记——函数
查看>>
Python学习笔记——字符串、列表、元组、字典
查看>>
Python学习笔记——判断语句和循环语句
查看>>
Python学习笔记——Python和基础知识
查看>>
Python学习笔记——知识强化
查看>>
人工智能学习笔记——数据分析处理库Pandas
查看>>
基于STM32F103的Max30100心率、血氧检测代码
查看>>
人工智能学习笔记——可视化库matplotlib
查看>>
人工智能学习笔记——可视化库Seaborn
查看>>
人工智能学习笔记——线性回归算法
查看>>
Web前端学习笔记——Canvas 03
查看>>
人工智能学习笔记——梯度下降算法
查看>>
人工智能学习笔记——逻辑回归算法
查看>>
两小时学会Git玩转Github
查看>>
Allegro学习笔记——焊盘概念
查看>>
Allegro学习笔记——Group_Class和Subclass
查看>>