Android 通过Web服务器与Mysql数据库交互

之前一直没时间回复大家,抱歉,现在已经把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运行到手机上

 

 

  • 17
    点赞
  • 166
    收藏
    觉得还不错? 一键收藏
  • 14
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值