本文共 10307 字,大约阅读时间需要 34 分钟。
欢迎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运行到手机上