Tomcat + Servlet 实现Android后端开发,实现一个简单的注册功能
这只是一个简单的测试项目,具体实现还需要自己学习,为创建Android后端项目提供一个思路,目前网上大多教程的开发环境都是Eclipse EE 或者过时很久,这是基于其他的教程所编写的一个开发流程,留作记录。

1.准备工作

开发工具:Android Studio + IDEA 2020
JDK版本: jdk11
数据库:MySQL 8.0.22
数据库可视化软件:Navicat Premium 15
服务器:Tomcat 10

(1)App写出基础框架
用异步任务发送Http请求,用get和post方法
(2)配置上述软件的环境变量

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项目依赖

3.编写Servlet代码

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本地服务器,点击部署,选择添加工件,点击确定保存


4.运行项目

如果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服务器的访问就没有问题了,接下来是数据库的连接

4.编写数据库代码

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数据库也就连接成功

更多相关文章

  1. android so库、jar包生成和使用
  2. 【Android问题】Android导入一个工程时提示 Invalid project des
  3. [转]Android(安卓)adb不是内部或外部命令 问题解决
  4. android 项目R文件丢失解决办法
  5. android登录tomcat服务器并查找数据库的内容
  6. React Native Android入门实战及深入源码分析系列(2)——React Nat
  7. 64位WIN7下Android(安卓)开发环境搭建(SDK Manager闪退,无法更新sd
  8. Android导入项目后没有jar无法运行解决办法
  9. 最新Android(安卓)SDK_API_开发包_离线包_下载

随机推荐

  1. Android(安卓)Camera Framework层分析
  2. android完全退出程序的几种方式
  3. Android中的资源与国际化
  4. Android - 数据存储
  5. Android-webview访问本地HTML5及本地HTML
  6. Android(安卓)中判断是否存在虚拟按键
  7. Android原生(Native)C开发之一 环境搭建
  8. android实现推送实践
  9. android+XML使用
  10. android 如何使用Parcelable接口