Tomcat + Servlet 实现Android后端开发,实现一个简单的注册功能
这只是一个简单的测试项目,具体实现还需要自己学习,为创建Android后端项目提供一个思路,目前网上大多教程的开发环境都是Eclipse EE 或者过时很久,这是基于其他的教程所编写的一个开发流程,留作记录。
开发工具:Android Studio + IDEA 2020
JDK版本: jdk11
数据库:MySQL 8.0.22
数据库可视化软件:Navicat Premium 15
服务器:Tomcat 10
(1)App写出基础框架
用异步任务发送Http请求,用get和post方法
(2)配置上述软件的环境变量
1. 新建一个IDEA项目
选择Maven,从原型创建,选择webapp,然后Next创建(A simple Java web application)
2.自动生成的项目结构如下
右键main新建文件夹,同时创建两个文件夹,java文件夹用来放项目代码,resource文件夹用来放资源文件
3.修改pom.xml中的项目依赖
将Maven的jdk版本改为自己安装的jdk版本
UTF-8
11
11
在 dependencies中添加依赖mysql-connector-java,根据自己的mysql版本选择对应的版本
junit
junit
4.11
test
mysql
mysql-connector-java
8.0.22
点击右上角按钮,加载 Maven变更
4.添加项目依赖
打开项目结构,选择Tomcat项目依赖
1.在main/java文件夹下创建一个Servlet包,新建一个.class文件继承于HttpServlet并重写doGet和doPost方法
resp.setContentType(“text/html;charset=utf-8”); // 设置响应报文的编码格式,避免出现中文乱码的情况
package Servlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
public class TestServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String account = req.getParameter("account"); // 从 request 中获取名为 account 的参数的值
String password = req.getParameter("password"); // 从 request 中获取名为 password 的参数的值
System.out.println("account:" + account + "\npassword:" + password); // 打印出来看一看
String result = "";
if("abc".equals(account)
&& "123".equals(password)){ // 模拟登陆账号、密码验证
result = "Login Success! 成功了";
}else {
result = "Sorry! Account or password error.";
}
/* 这里我们只是模拟了一个最简单的业务逻辑,当然,你的实际业务可以相当复杂 */
resp.setContentType("text/html;charset=utf-8"); // 设置响应报文的编码格式
PrintWriter pw = resp.getWriter(); // 获取 response 的输出流
pw.println(result); // 通过输出流把业务逻辑的结果输出
pw.flush();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
2.在web.xml中添加Servlet
在url-pattern中一定注意加“/”,这是访问Servlet的路径
Archetype Created Web Application
test
Servlet.TestServlet
test
/test
3.编辑配置
点击左上角+号,选择Tomcat本地服务器,点击部署,选择添加工件,点击确定保存
如果Tomcat的log出现中文乱码,就打开tomcat安装目录的conf文件夹,打开logging.properties文件,将里面的编码格式改为GBK
服务器启动成功,会自动弹出初始网页,就是项目中的web.jsp,在地址栏输入:
http://localhost:8080/ss_war_exploded/test?account=abc&password=123
http://localhost:8080/ss_war_exploded/就是初始网页,后面跟/test就是访问上文所写的TestServlet,问号后面跟的是request参数
出现下面的文字表示访问成功
至此,Tomcat服务器的访问就没有问题了,接下来是数据库的连接
1.用Navicat连接MySQL数据库,写连接名,输入mysql的密码,测试连接,连接成功就确定保存
2.新建一个数据库fistmysql两个用户表user_login和user_info
user_info表
user_login表
3.在java文件夹下新建一个db包,新建一个DBUtil类,用来连接数据库
根据自己的mysql版本选择对应的Driver
可以参考菜鸟教程的连接方法:https://www.runoob.com/java/java-mysql-connect.html
package db;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DBUtil {
// table
public static final String TABLE_PASSWORD = "user_login";
public static final String TABLE_USERINFO = "user_info";
public static Connection getConnect() {
String url="jdbc:mysql://localhost:3306/fistmysql?&useSSL=false&serverTimezone=UTC"; // 数据库的Url
Connection connecter = null;
try {
Class.forName("com.mysql.cj.jdbc.Driver"); // java反射,固定写法
connecter = DriverManager.getConnection(url, "root", "1997");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
System.out.println("SQLException: " + e.getMessage());
System.out.println("SQLState: " + e.getSQLState());
System.out.println("VendorError: " + e.getErrorCode());
}
return connecter;
}
}
4.新建一个注册Servlet来测试数据库
package Servlet;
import db.DBUtil;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.HashMap;
public class RegisterServlet extends HttpServlet {
public RegisterServlet() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String account = request.getParameter("account"); // 从 request 中获取名为 account 的参数的值
String password = request.getParameter("password"); // 从 request 中获取名为 password 的参数的值
System.out.println("account:" + account + "\npassword:" + password); // 打印出来看一看
String resCode = "";
String resMsg = "";
String userId = "";
/* 这里我们做一个最简单的注册逻辑,当然,你的实际业务可以相当复杂 */
try {
Connection connect = DBUtil.getConnect();
Statement statement = connect.createStatement(); // Statement可以理解为数据库操作实例,对数据库的所有操作都通过它来实现
ResultSet result;
String sqlQuery = "select * from " + DBUtil.TABLE_PASSWORD + " where account='" + account + "'";
// 查询类操作返回一个ResultSet集合,没有查到结果时ResultSet的长度为0
result = statement.executeQuery(sqlQuery); // 先查询同样的账号(比如手机号)是否存在
if(result.next()){ // 已存在
resCode = "201";
resMsg = "该账号已注册,请使用此账号直接登录或使用其他账号注册";
userId = "";
} else { // 不存在
String sqlInsertPass = "insert into " + DBUtil.TABLE_PASSWORD + "(account,password) values('"+account+"','"+password+"')";
// 更新类操作返回一个int类型的值,代表该操作影响到的行数
int row1 = statement.executeUpdate(sqlInsertPass); // 插入帐号密码
if(row1 == 1){
String sqlQueryId = "select userId from " + DBUtil.TABLE_PASSWORD + " where account='" + account + "'";
ResultSet result2 = statement.executeQuery(sqlQueryId); // 查询新增记录的userId
if(result2.next()){
userId = result2.getInt("userId") + "";
}
String sqlInsertInfo = "insert into " + DBUtil.TABLE_USERINFO + "(userId) values('" + userId + "')";
int row2 = statement.executeUpdate(sqlInsertInfo); // 在用户信息表中插入刚注册的Id
if(row2 == 1){ // 两个表中都插入成功,从业务角度认定为注册成功
resCode = "100";
resMsg = "注册成功";
}
} else {
resCode = "202";
resMsg = "用户信息表插入错误";
userId = "";
}
}
} catch (SQLException e) {
e.printStackTrace();
}
HashMap map = new HashMap<>();
map.put("resCode", resCode);
map.put("resMsg", resMsg);
map.put("userId", userId);
response.setContentType("text/html;charset=utf-8"); // 设置响应报文的编码格式
PrintWriter pw = response.getWriter(); // 获取 response 的输出流
pw.println(map.toString()); // 通过输出流把业务逻辑的结果输出
pw.flush();
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
5.同样的,在web.xml中添加这个Servlet
Archetype Created Web Application
test
Servlet.TestServlet
register
Servlet.RegisterServlet
register
/reg
test
/test
6.运行项目,在浏览器输入
http://localhost:8080/ss_war_exploded/reg?account=root&password=123
注册成功,刷新一下Navicat中的数据,可以看到数据已经被添加到数据库中
再一次刷新浏览器,相当于再一次提交GET请求,对于同一个账号,就会注册失败
至此,mysql数据库也就连接成功