Servlet实现简单的前后端交互
首先前后端交互是啥呢?
在我的理解中大概是这样的:
简单的讲就是数据的交换
接下来我们来看看应该要怎么实现这个简单的交互:
1、首先我们前端先不写静态页面,直接在url上将请求的参数放上去 2、后端要做的首先就是连接数据库,如果数据库不连,那么就是两个憨憨在傻笑 3、接受前端请求的参数,将请求的参数进行数据库查询 4、后端将结果返回给前端,就完成了一个交互
数据库:
数据库语句如下:
建表:
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请求:
注意多个参数间用&&连接 这里的8080是我的端口号,name=123和passwd=123是前后端定义的请求参数,毕竟前后端没有心有灵犀一点通,告诉后端,前端需要的是查询该用户名和密码是否存在。
Servlet实现前后端交互,是需要在idea里面配置Tomat的 我现在突然明白为啥以前看别人程序也没报错就是跑不了,Servlet不写主函数,主函数在tomcat内,没有在idea配置Tomcat,一切都是季!
想配置的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中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()方法,返回一个查询的结果集。
还有这里的resp是相应的请求回复,我们要将查询的结果返回前端,需要用resq的getWriter()方法
最后去看看前端的数据拿到了没有
最后总结一个容易遇到的问题:
看到出现Java.lang.String的时候,我猜测应该是有冲突,这个时候可以鼠标放在String上同时按住ctrl,去看看是不是引用到自己想要的东西
比如我这里是有一个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;
@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();
}
}
}
如有疑问,请留言讨论。
|