之前一直没时间回复大家,抱歉,现在已经把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(建立过程网上很多)
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运行到手机上