Servlet实现简单的前后端交互

Servlet实现简单的前后端交互

首先前后端交互是啥呢?

在我的理解中大概是这样的:

Servlet实现简单的前后端交互

简单的讲就是数据的交换

接下来我们来看看应该要怎么实现这个简单的交互:

1、首先我们前端先不写静态页面,直接在url上将请求的参数放上去
2、后端要做的首先就是连接数据库,如果数据库不连,那么就是两个憨憨在傻笑
3、接受前端请求的参数,将请求的参数进行数据库查询
4、后端将结果返回给前端,就完成了一个交互

数据库:

Servlet实现简单的前后端交互
数据库语句如下:

建表:
DROP TABLE IF EXISTS `stus`;
CREATE TABLE `stus`  (
  `id` int(0) NOT NULL AUTO_INCREMENT,
  `loginName` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  `loginPwd` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;


插入数据:
INSERT INTO `stus` VALUES (1, '123', '123');
INSERT INTO `stus` VALUES (2, '小明', '111');
INSERT INTO `stus` VALUES (3, 'xs', '111');

前端的url请求:

Servlet实现简单的前后端交互

注意多个参数间用&&连接
这里的8080是我的端口号,name=123和passwd=123是前后端定义的请求参数,毕竟前后端没有心有灵犀一点通,告诉后端,前端需要的是查询该用户名和密码是否存在。

Servlet实现前后端交互,是需要在idea里面配置Tomat的
我现在突然明白为啥以前看别人程序也没报错就是跑不了,Servlet不写主函数,主函数在tomcat内,没有在idea配置Tomcat,一切都是季!

Servlet实现简单的前后端交互
想配置的friend,请看这篇文章
[https://blog.csdn.net/weixin_50569789/article/details/119817928]

万事俱备现在开始写后端:

连接数据库

连接数据库用的是JDBC是需要导入jar包的
进入官网下载地址:
https://dev.mysql.com/downloads/connector/j/

 static {
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

这里需要注意一下数据库我用的是MySQL8版本的,所以是com.mysql.cj.jdbc.Driver,如果你是5版本的那么就是com.mysql.jdbc.Driver。
我们写 Class.forName(“com.mysql.cj.jdbc.Driver”)的目的,大家大抵都知道就是加载数据库的驱动,那么为什么要写这句话呢?

我个人的理解是我们通过jdbc连接数据库,例如我们想用一个类的某个方法,那么就要实例化new一个对象来调用方法或者属性。可是jdbc只是一个空的接口,还是new一个么,这个时候需要用具体的方法来加载实例化它。

    private static final String url = "jdbc:mysql://localhost:3306/vote?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC";
    private static final String userName = "root";
    private static final String passwd = "root";
	Connection conn = DriverManager.getConnection(url, userName, passwd);

这里的是数据库连接对象,比如说你要连接的数据库是哪一个,数据库的密码和用户名等信息

useSSL:MySQL在高版本需要指明是否进行SSL连接(useSSL的作用是保障Internet数据传输安全利用数据加密)

serverTimezone:这是时区时间,UTC代表的是全球统一的一个时间,在具体项目的时候要根据自己的时区设置时间,如在中国serverTimezone=Asia/Shanghai。其他的参数大家有兴趣自行查看。

后端如何拿到前端的请求呢?

Servlet实现简单的前后端交互

在Servlet中get方法的request就是前端的请求,这个请求是一个整体,你需要通过具体的方法和参数拿到你想要的参数。

 String pa = req.getParameter("name");
 String pa1 = req.getParameter("passwd");

拿到前端的参数,放到数据库进行查询

PreparedStatement ps = conn.prepareStatement("select * from stus where loginName =? and loginPwd =?;")
ps.setString(1, pa);
ps.setString(2, pa1);

这里推荐大家使用prepareStatement,好处是能够防止sql注入,当然是因为预编译的,对于批量处理可以提高一定效率。

返回前端请求的参数

PreparedStatement ps = conn.prepareStatement("select * from stus where loginName =? and loginPwd =?;")
ResultSet rs = ps.executeQuery();
while (rs.next()) {
      resp.getWriter().println("id:" + rs.getInt("id"));
      resp.getWriter().println("loginName:" + rs.getString("loginName"));
      resp.getWriter().println("loginPwd:" + rs.getString("loginPwd"));
            }

在这里大家可以看到,PreparedStatement预编译通过自己写的SQL语句再调用executeQuery()方法,返回一个查询的结果集。

Servlet实现简单的前后端交互
还有这里的resp是相应的请求回复,我们要将查询的结果返回前端,需要用resq的getWriter()方法
Servlet实现简单的前后端交互

最后去看看前端的数据拿到了没有

Servlet实现简单的前后端交互

最后总结一个容易遇到的问题:

Servlet实现简单的前后端交互
Servlet实现简单的前后端交互

看到出现Java.lang.String的时候,我猜测应该是有冲突,这个时候可以鼠标放在String上同时按住ctrl,去看看是不是引用到自己想要的东西

Servlet实现简单的前后端交互

比如我这里是有一个String自己建的类,当时是拿来测试的结果忘记删了,这里大家可以注意的一个点就是类名尽可能不要使用特殊的字符,很容易引起冲突导致程序报错

最后呢,贴上源代码,有兴趣的friends可以尝试一下哦

package com.example.demo.day1204;

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

/**
 * @Author:Yun
 * @Date:2021/12/23/15:20
 * @Description:
 **/
@WebServlet(name = "testHelloWorld", urlPatterns = "/hello")
public class HelloWord extends HttpServlet {
        private static final java.lang.String url = "jdbc:mysql://localhost:3306/vote?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC";
        private static final java.lang.String userName = "root";
        private static final java.lang.String passwd = "root";

    static {
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)  {
        resp.setHeader("Content-Type", "application/json;charset=UTF-8");
        String pa = req.getParameter("name");
        String pa1 = req.getParameter("passwd");
        try (
                Connection conn = DriverManager.getConnection(url, userName, passwd);
             PreparedStatement ps = conn.prepareStatement("select * from stus where loginName =? and loginPwd =?;"))
        {
            ps.setString(1, pa);
            ps.setString(2, pa1);
            ResultSet rs = ps.executeQuery();
            while (rs.next()) {
                resp.getWriter().println("id:" + rs.getInt("id"));
                resp.getWriter().println("loginName:" + rs.getString("loginName"));
                resp.getWriter().println("loginPwd:" + rs.getString("loginPwd"));
            }
            rs.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

如有疑问,请留言讨论。

上一篇:leetcod(20):有效的符号


下一篇:XOR加密