jsp+mysql+servlet实现的简易登录注册功能(详细讲解)
前言
在经过一周的jsp的学习后,今天来做一个简单的过程梳理和总结,本人是小白,有问题望大佬指正。
一、jsp是什么?
JSP(Java Server Pages),即Java服务器界面,是指:
●在HTML页面中嵌入Java脚本代码(不支持过多镶嵌)
●由应用服务器中的JSP引擎来编译和执行嵌入的Java脚本代码
●然后将生成的整个页面信息返回给客户端
二、使用的工具
1.运用的编译器:eclipse 2020版
2.数据库:Mysql 5.7.20
三、具体步骤
1.数据库建表
代码如下(我使用的是Navicat可视化工具):
/*
Navicat Premium Data Transfer
Source Server : localhost_3306
Source Server Type : MySQL
Source Server Version : 50720
Source Host : localhost:3306
Source Schema : test_db
Target Server Type : MySQL
Target Server Version : 50720
File Encoding : 65001
Date: 05/02/2021 20:40:47
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`username` char(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`password` char(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
`brithday` datetime(6) NOT NULL,
`sex` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
2.编写HTML代码
因为代码内容过于简单,又习惯了html页面,所以没有转换成jsp。
1.index.html页面代码如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>index</title>
</head>
<body>
<a href="logon.html"><button>登录</button><br></a><br>
<a href="register.html"><button>注册</button></a>
</body>
</html>
2.logon.html页面代码如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="logon" method="post">
账号:<input type="text" name="username">
密码:<input type="password" name="password">
<input type="submit" value="登录"><input type="reset" value="重置">
</form>
</body>
</html>
3.register.html代码如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="User" method="post">
用户名:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
生日:<input type="date" name="brithday"><br>
性别:<input type="radio" name="sex" value="男">男<input type="radio" name="sex" value="女">女<br>
<input type="submit" value="注册"><input type="reset" value="重置">
</form>
</body>
</html>
4.successful.html代码如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>图书页面</title>
</head>
<body>
登陆成功
</body>
</html>
3.编写java代码(因为内容比较简单,所以没有采用三层结构的样式)
1.在开始之前,先建立数据库工具类
MysqlTool.java代码如下
package com.mysqlDao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class MysqlTool {
//定义数据库参数
private static String URL="jdbc:mysql://localhost:3306/test_db?serverTimezone=Asia/Shanghai";
private static String USER="root";
private static String PASSWORD="root";
//创建连接对象,载体,结果集对象
private static Connection conn=null;
private static PreparedStatement ps=null;
private static ResultSet rs=null;
//创建连接对象,可以直接在实例化前加载,使用静态方法
static{
try {
conn=DriverManager.getConnection(URL, USER, PASSWORD);
System.out.println(conn.isClosed()==false? "数据库连接成功":"数据库连接失败");
} catch (SQLException e) {
e.printStackTrace();
}
}
public int update(String sql,Object[] objects){
int a=0;
try {
//创建sql载体
ps=conn.prepareStatement(sql);
//给占位符赋值
for(int i=0;i<objects.length;i++){
ps.setObject(i+1, objects[i]);
}
//操作SQL语句
a=ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
return a;
}
public ResultSet query(String sql,Object[] objects){
try {
ps=conn.prepareStatement(sql);
//给占位符赋值
for(int i=0;i<objects.length;i++){
ps.setObject(i+1, objects[i]);
}
rs=ps.executeQuery();
} catch (SQLException e) {
e.printStackTrace();
}
return rs;
}
public void close(){ //关闭数据库
try {
if(rs!=null){
rs.close();
}
if(ps!=null){
ps.close();
}
if(conn!=null)
{
conn.close();
System.out.println("数据库已关闭");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
2.logon.java代码如下:
package com.mysql.test;
import myuserform.Userform;
import java.io.IOException;
import java.sql.ResultSet;
import java.sql.SQLException;
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 javax.servlet.http.HttpSession;
import com.mysqlDao.MysqlTool;
@WebServlet("/logon")
public class logon extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
MysqlTool to=new MysqlTool();
String username=request.getParameter("username");
String password=request.getParameter("password");
if(username==null&&password==null){
//重新登录
System.out.println("账号或密码错误!");
response.sendRedirect("logon.html");
}else{
String sql="select * from user where username=? and password=?";
Object[] objs={username,password};
ResultSet rs= to.query(sql, objs);
try {
if(rs.next()){
//登陆成功,使用对象存储所查询到的对应账号信息
Userform uf=new Userform();
uf.setId(rs.getInt(1));
uf.setUsername(rs.getString(2));
uf.setPassword(rs.getString(3));
uf.setBirthday(rs.getDate(4));
uf.setSex(rs.getString(5));
//1.使用request把对象打包到userinformation并发送数据
request.setAttribute("userinformation", uf);
//2.通过session把对象打包
HttpSession session=request.getSession();
session.setAttribute("userinformation", uf);
//登陆成功,跳转到success页面
System.out.println("登陆成功!!");
response.sendRedirect("scessful.html");
}else{
System.out.println("账号或密码错误!");
response.sendRedirect("logon.html");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
3.差点忘了构造方法了,放在下面
package myuserform;
import java.util.Date;
public class Userform {
private int id;
private String username;
private String password;
private Date birthday;
private String sex;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
4.注册页面代码如下(user.java)
package com.mysql.test;
import java.io.IOException;
import java.sql.ResultSet;
import java.sql.SQLException;
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.mysqlDao.MysqlTool;
import myuserform.Userform;
/**
* Servlet implementation class demo_servlet
*/
@WebServlet("/User")
public class User extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置请求的字符集
request.setCharacterEncoding("utf-8");
//设置相应的文本类型
response.setContentType("text/html;charset=utf-8");
//数据库工具类
MysqlTool to=new MysqlTool();
String username=request.getParameter("username");
String password=request.getParameter("password");
String brithday=request.getParameter("brithday");
String sex=request.getParameter("sex");
if(username==null||password==null||brithday==null||sex==null){
response.sendRedirect("index.html");
}else{
System.out.println(username+"\t"+password+"\t"+brithday+"\t"+sex);
String sql1="select id from user where username=?";
Object[] objs1={username};
ResultSet rs=to.query(sql1, objs1);
try {
if(rs.next()){
response.sendRedirect("register.html");
}else{
String sql2="insert into user(username,password,brithday,sex)values(?,?,?,?)";
Object[] objs2={username,password,brithday,sex};
int a=to.update(sql2,objs2);
if(a>0){
response.sendRedirect("index.html");
}else{
response.sendRedirect("register.html");
}
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
5.文件的结构如下所示:
总结
1.在第一次运行的时候报错
这是8080端口占用的问题,先用管理员身份打开CMD,然后通过以下两步实现关闭。
1.查看8080端口占用情况
netstat -o -n -a | findstr :8080
2.根据PID杀死当前占用端口号的进程:
taskkill /F /PID ****
如下:
第二次运行:

ok,成功!(因为只是学习交流,所以没有设计到加密的模块,本人也是新手,欢迎大佬评论交流指正)
注意点
1.数据库的连接所使用的驱动Jar包会有所区别,Mysql 5和Mysql 8 有较明显的区别。
2.在doget和dopost方法中,一定得看清请求方式,或者选取以下方式,在doget方法中直接调用dopost方法。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
3.路由的连接一定得正确,要不然很容易404。
版权声明:本文为qq_45852452原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。