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版权协议,转载请附上原文出处链接和本声明。