前言
这是我学完JavaWeb后做的期末大作业,是一个用户管理系统,包括登录注册功能,对于列表的增、删、改、查功能,由于我也是参考的网上大佬的的代码,之后进行了一些修改,完成的这个新手项目,于是我也把这个项目源码放在这里供大家参考,同时也对这次学习做一个记录。
首先感谢大佬们的文章帮助,我把所参考的文章原文链接放在下面:
【Java学习】JSP + Servlet + JDBC + Mysql 实现增删改查_Tellsea的博客-CSDN博客_java jsp 实现增删改查
使用JSP+Servlet+MySQL实现登录注册功能【详细代码】_邵奈一的博客-CSDN博客
正题
项目运行截图
1.环境信息:
Eclipse IDE for Enterprise Java Developers Version: 2020-12 (4.18.0)
MySQL workbench: 8.0.29
Tomcat: 9.0
2.所使用到的导入包下载地址以及线上仓库引用:
JDBC jar包:在Eclipse中使用JDBC连接MySQL(mysql-connector-java-8.0.28版本)_鸭巴子嘎嘎嘎的博客-CSDN博客_eclipse配置jdbc连接mysql
JSTL jar包以及引用语句:JSP 标准标签库(JSTL) | 菜鸟教程
jQuery引用以及下载网站:https://www.jq22.com/jquery-info122#google_vignette
Bootstrap v3 引用以及网站:Bootstrap v3 中文文档 · Bootstrap 是最受欢迎的 HTML、CSS 和 JavaScript 框架,用于开发响应式布局、移动设备优先的 WEB 项目。 | Bootstrap 中文网
3.项目目录结构:
4.新建一个web项目
5.新建jsp文件
6.导入要使用的包
这里以mysql连接包举例,其他的类似,目录结构中其他两个包都是JSTL所用到的,我就导入了这三个包,都在上面的目录文件结构中列出了。
7.数据库表结构
8.源代码
(1)首页以及接口
index1.jsp
用户管理系统 /index1">首页/userInfoSave">添加用户/userInfoList">用户列表欢迎!
这是Tang的用户管理系统,使用了 JSP, JavaServlet, JDBC, MySQL, jQuery以及Bootstrap框架,基于MVC模式开发。
更多
IndexServlet.java
package Tang.servlet;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/** * 首页控制器 * @author TZQ * */@WebServlet("/index1")@SuppressWarnings("serial")public class IndexServlet extends HttpServlet {protected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException{req.getRequestDispatcher("/Index1.jsp").forward(req,resp);}protected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException{//req.getRequestDispatcher(req.getContextPath()+"index.jsp");this.doGet(req, resp);}}
MysqlUtils.java
package Tang.utils;import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;import java.util.List;import Tang.service.LoginInfoService;import Tang.service.UserInfoService;import Tang.service.impl.LoginInfoServiceImpl;import Tang.service.impl.UserInfoServiceImpl;import Tang.entity.LoginInfo;import Tang.entity.UserInfo;/** * MySQL连接工具类 * @author TZQ * */public class MysqlUtils {private static String url="jdbc:mysql://localhost:3306/javaweb";//连接地址private static String userName="root";//连接用户名private static String password="tzq";//连接密码private static Connection conn=null;//连接驱动public static Connection getConnection() {if(conn==null) {try {//com.mysql.jdbc.Driver是 mysql-connector-java 5版本中的//com.mysql.cj.jdbc.Driver是 mysql-connector-java 6版本及以上中的Class.forName("com.mysql.cj.jdbc.Driver"); conn=DriverManager.getConnection(url,userName,password);} catch(ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}return conn;}//测试public static void main(String[] args) {System.out.println(getConnection());LoginInfoService loginInfoService=new LoginInfoServiceImpl();LoginInfo user=new LoginInfo();user.setAccount("1");user.setPassword("2");loginInfoService.register(user);String account="1";String password="2";LoginInfo user1=loginInfoService.login(account, password);System.out.println(user1.toString());//UserInfoService userInfoService=new UserInfoServiceImpl();//UserInfo entity1=new UserInfo();//entity1.setName("芳华");//entity1.setPassword("rr36988");//entity1.setEmail("fh3236@123.com");//entity1.setAddress("天津");//userInfoService.saveUserInfo(entity1);//////List list=userInfoService.userInfoList();//list.forEach(entity ->{//System.out.println(entity);//});}}
UserInfo.java
package Tang.entity;/** * 用户实体类,也可以叫做bean * @author TZQ * */public class UserInfo {private int id;private String name;private String password;private String email;private String address;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}@Overridepublic String toString() {return "UserInfo [id=" + id + ", name=" + name + ", password=" + password + ", email=" + email + ", address="+ address + "]";}}
UserInfoService.java
package Tang.service;import java.util.List;import Tang.entity.UserInfo;/** * 用户接口 * @author TZQ * */public interface UserInfoService {//接口只写方法特征,而不实现,方法记得加括号否则会成为变量并报错"not have been initialized",未被初始化//查询所有用户List userInfoList();//新增用户void saveUserInfo(UserInfo entity);//根据id查询用户UserInfo getUserInfoById(int id);//根据id更新用户void updateUserInfoById(UserInfo entity);//根据id删除用户void deleteUserInfoById(int id);}
UserInfoServiceImpl.java
package Tang.service.impl;import Tang.service.UserInfoService;import java.util.List;import Tang.dao.UserInfoDao;import Tang.entity.UserInfo;/** * 用户接口实现类 * @author TZQ * */public class UserInfoServiceImpl implements UserInfoService {public List userInfoList(){return UserInfoDao.userInfoList();}@Overridepublic void saveUserInfo(UserInfo entity) {UserInfoDao.saveUserInfo(entity);//调用dao层的相关方法}@Overridepublic UserInfo getUserInfoById(int id) {return UserInfoDao.getUserInfoById(id);}@Overridepublic void updateUserInfoById(UserInfo entity) {UserInfoDao.updateUserInfoById(entity);}@Overridepublic void deleteUserInfoById(int id) {UserInfoDao.deleteUserInfoById(id);}}
UserInfoDao.java
package Tang.dao;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.util.ArrayList;import java.util.List;import Tang.entity.UserInfo;import Tang.utils.MysqlUtils;/** * 用户数据交互层 * @author TZQ * */public class UserInfoDao {public static List userInfoList() {List list=new ArrayList();Connection conn=MysqlUtils.getConnection();String sql="select * from user_info;";try {PreparedStatement pStatement=conn.prepareStatement(sql);ResultSet resultSet=pStatement.executeQuery();UserInfo entity=null;while(resultSet.next()) {entity=new UserInfo();entity.setId(resultSet.getInt("id"));entity.setName(resultSet.getString("name"));entity.setPassword(resultSet.getString("password"));entity.setEmail(resultSet.getString("email"));entity.setAddress(resultSet.getString("address"));list.add(entity);}resultSet.close(); //避免造成性能浪费pStatement.close();} catch (SQLException e) {e.printStackTrace();}return list;}public static void saveUserInfo(UserInfo entity) {//添加用户的sql语句String sql="insert into user_info(name,password,email,address) values(?,?,?,?);";Connection conn=MysqlUtils.getConnection();//得到数据库连接try {PreparedStatement pStatement=conn.prepareStatement(sql);//使用预处理方法执行sql语句//从实体类实例中得到相关数据并设置到sql语句的相关位置pStatement.setString(1, entity.getName());pStatement.setString(2, entity.getPassword());pStatement.setString(3, entity.getEmail());pStatement.setString(4, entity.getAddress());int count=pStatement.executeUpdate();//执行sql语句pStatement.close();//执行完成后执行该close方法,避免资源浪费} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public static UserInfo getUserInfoById(int id) {String sql="select U.id, U.name, U.password, U.email, U.address from user_info U where U.id= "+id+";";Connection conn=MysqlUtils.getConnection();UserInfo entity=null;try {PreparedStatement pStatement=conn.prepareStatement(sql);ResultSet resultSet=pStatement.executeQuery();while(resultSet.next()) {entity=new UserInfo();entity.setId(resultSet.getInt("id"));entity.setName(resultSet.getString("name"));entity.setPassword(resultSet.getString("password"));entity.setEmail(resultSet.getString("email"));entity.setAddress(resultSet.getString("address"));}resultSet.close(); //避免造成性能浪费pStatement.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}return entity;}public static void updateUserInfoById(UserInfo entity) {String sql="update user_info set name=?,password=?,email=?,address=? where id=?;";Connection conn=MysqlUtils.getConnection();try {PreparedStatement pStatement=conn.prepareStatement(sql);pStatement.setString(1, entity.getName());pStatement.setString(2, entity.getPassword());pStatement.setString(3, entity.getEmail());pStatement.setString(4, entity.getAddress());pStatement.setInt(5, entity.getId());pStatement.executeUpdate();pStatement.close();} catch (SQLException e) {e.printStackTrace();}}public static void deleteUserInfoById(int id) {String sql="delete from user_info where;";Connection conn=MysqlUtils.getConnection();try {PreparedStatement pStatement=conn.prepareStatement(sql);pStatement.executeUpdate();pStatement.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
(2)查看列表
UserInfoListServlet.java
package Tang.servlet;import java.io.IOException;import java.util.List;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 Tang.entity.UserInfo;import Tang.service.UserInfoService;import Tang.service.impl.UserInfoServiceImpl;/** * 用户列表控制器 * @author TZQ * MVC(视图层View,服务层Service,持久层Dao) *控制层(Servlet)->接口层(Service)->接口层实现类(ServiceImpL)->数据交互层(Dao) */@WebServlet("/userInfoList")@SuppressWarnings("serial")public class UserInfoListServlet extends HttpServlet {protected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException{this.doPost(req, resp);}protected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException{//查询出所有用户UserInfoService userInfoService=new UserInfoServiceImpl();List list=userInfoService.userInfoList();req.setAttribute("userInfoList", list);req.getRequestDispatcher("/user_info_list.jsp").forward(req, resp);}}
user_info_list.jsp
用户列表 /index1">首页/userInfoSave">添加用户/userInfoList">用户列表 序号 姓名 密码 邮箱 地址 ${status.index+1} ${entity.name } ${entity.password } ${entity.email } ${entity.address } /userInfoUpdate?id=${entity.id}">修改/userInfoDelete?id=${entity.id}">删除
(3)添加用户
UserInfoSaveServlet.java
package Tang.servlet;import java.io.IOException;import java.util.List;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 Tang.entity.UserInfo;import Tang.service.UserInfoService;import Tang.service.impl.UserInfoServiceImpl;/** *新增用户控制器 * @author TZQ * */@WebServlet("/userInfoSave")@SuppressWarnings("serial")public class UserInfoSaveServlet extends HttpServlet {protected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException{req.getRequestDispatcher("/user_info_save.jsp").forward(req, resp);}protected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException{//新增用户//req.getParameter方法从前端页面的name标签中拿到用户输入的数据,getBytes("ISO-8859-1"),"UTF-8"解决乱码问题String name=new String(req.getParameter("name").getBytes("ISO-8859-1"),"UTF-8");String password=req.getParameter("password");String email=req.getParameter("email");String address=new String(req.getParameter("address").getBytes("ISO-8859-1"),"UTF-8");//实例化一个用户对象,使用set方法将输入的数据设置给这个对象UserInfo entity=new UserInfo();entity.setName(name);entity.setPassword(password);entity.setEmail(email);entity.setAddress(address);UserInfoService userInfoService=new UserInfoServiceImpl();userInfoService.saveUserInfo(entity);//调用接口中的方法req.getRequestDispatcher("/userInfoList").forward(req, resp);//转发跳转//resp.sendRedirect("/userInfoList");//转发重定向}}
user_info_save.jsp
添加用户 /index1">首页/userInfoSave">添加用户/userInfoList">用户列表<form action="/userInfoSave" method="post">
(4)修改用户
UserInfoUpdateServlet.java
package Tang.servlet;import java.io.IOException;import java.util.List;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 Tang.entity.UserInfo;import Tang.service.UserInfoService;import Tang.service.impl.UserInfoServiceImpl;/** * 修改用户控制器 * @author TZQ * */@WebServlet("/userInfoUpdate")@SuppressWarnings("serial")public class UserInfoUpdateServlet extends HttpServlet {protected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException{//查询需要编辑的信息UserInfoService userInfoService=new UserInfoServiceImpl();UserInfo entity=userInfoService.getUserInfoById(Integer.parseInt(req.getParameter("id")));req.setAttribute("entity", entity);req.getRequestDispatcher("/user_info_update.jsp").forward(req, resp);}protected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException{int id=Integer.parseInt(req.getParameter("id"));String name=new String(req.getParameter("name").getBytes("ISO-8859-1"),"UTF-8");//解决乱码问题String password=req.getParameter("password");String email=req.getParameter("email");String address=new String(req.getParameter("address").getBytes("ISO-8859-1"),"UTF-8");UserInfo entity=new UserInfo();entity.setId(id);entity.setName(name);entity.setPassword(password);entity.setEmail(email);entity.setAddress(address);UserInfoService userInfoService=new UserInfoServiceImpl();userInfoService.updateUserInfoById(entity);req.getRequestDispatcher("/userInfoList").forward(req, resp);//resp.sendRedirect("/UserManagementTang/WebContent/user_info_update.jsp");//转发重定向}}
user_info_update.jsp
更新用户 /index1">首页/userInfoSave">添加用户/userInfoList">用户列表<form action="/userInfoUpdate" method="post">
(5)删除用户
UserInfoDeleteServlet.java
package Tang.servlet;import java.io.IOException;import java.util.List;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 Tang.entity.UserInfo;import Tang.service.UserInfoService;import Tang.service.impl.UserInfoServiceImpl;/** * 用户删除控制器 * @author TZQ * */@WebServlet("/userInfoDelete")@SuppressWarnings("serial")public class UserInfoDeleteServlet extends HttpServlet {protected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException{this.doPost(req, resp);}protected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException{//根据id删除UserInfoService userInfoService=new UserInfoServiceImpl();userInfoService.deleteUserInfoById(Integer.parseInt(req.getParameter("id")));req.getRequestDispatcher("/userInfoList").forward(req, resp);//resp.sendRedirect("/userInfoList");//转发重定向}}
(6)登录
LoginInfo.java
package Tang.entity;/** * 注册登录实体类 * @author TZQ * */public class LoginInfo {private String account;private String password;public String getAccount() {return account;}public void setAccount(String account) {this.account = account;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}@Overridepublic String toString() {return "LoginInfo [account=" + account + ", password=" + password + "]";}}
LoginInfoService.java
package Tang.service;import Tang.entity.LoginInfo;/** * 登录接口 * @author TZQ * */public interface LoginInfoService {LoginInfo login(String account, String password);void register(LoginInfo user);}
LoginInfoServiceImpl.java
package Tang.service.impl;import Tang.dao.LoginInfoDao;import Tang.entity.LoginInfo;import Tang.service.LoginInfoService;/** * 登录接口实现类 * @author TZQ * */public class LoginInfoServiceImpl implements LoginInfoService {@Overridepublic LoginInfo login(String account, String password) {return LoginInfoDao.login(account,password);}@Overridepublic void register(LoginInfo user) {LoginInfoDao.register(user);}}
LoginInfoDao.java
package Tang.dao;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import Tang.entity.LoginInfo;import Tang.utils.MysqlUtils;/** * 登录功能类 * @author TZQ * */public class LoginInfoDao {public static LoginInfo login(String account, String password) {String sql="select * from login_info where account="+"'"+account+"'"+" and password="+"'"+password+"'"+";";Connection conn=MysqlUtils.getConnection();LoginInfo user=new LoginInfo();try {PreparedStatement pStatement=conn.prepareStatement(sql);ResultSet resultSet=pStatement.executeQuery();if(resultSet.next()) {user.setAccount(resultSet.getString("account"));user.setPassword(resultSet.getString("password"));System.out.println(user+"登录成功!");}else {System.out.println("用户名或密码错误!");}resultSet.close();pStatement.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}return user;}public static void register(LoginInfo user) {String sql="insert into login_info(account,password) values(?,?);";Connection conn=MysqlUtils.getConnection();try {PreparedStatement pStatement=conn.prepareStatement(sql);pStatement.setString(1, user.getAccount());pStatement.setString(2, user.getPassword());pStatement.executeUpdate();pStatement.close();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
LoginServlet.java
package Tang.servlet;import java.io.IOException;import java.io.PrintWriter;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 Tang.entity.LoginInfo;import Tang.service.LoginInfoService;import Tang.service.impl.LoginInfoServiceImpl;/** * 登录控制器 * @author TZQ * */@WebServlet("/login")@SuppressWarnings("serial")public class LoginServlet extends HttpServlet {protected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException{req.getRequestDispatcher("/login.jsp").forward(req,resp);}protected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException{String account= req.getParameter("account");String password= req.getParameter("password");LoginInfoService loginInfoService=new LoginInfoServiceImpl();LoginInfo user=loginInfoService.login(account, password);if(user.getAccount()!=null) {req.getRequestDispatcher("/index1").forward(req,resp);}else {//这句话的意思,是让浏览器用utf8来解析返回的数据resp.setHeader("Content-type", "text/html;charset=UTF-8");//这句话的意思,是告诉servlet用UTF-8转码resp.setCharacterEncoding("UTF-8");//实现弹窗功能PrintWriter out=resp.getWriter();out.print("alert('用户名或密码错误,请重新输入!'); window.location='login.jsp';");out.flush();out.close();}}}
login.jsp
登录页面 用户登录 * {margin: 0;padding: 0;}html {height: 100%;}body {height: 100%;}.container {height: 100%;width:100%;background-color:#fbfbfb;}.login-wrapper {background-color:#cececf;opacity:0.9;width: 358px;height: 500px;border-radius: 15px;padding: 0 50px;position: relative;left: 50%;top: 46%;transform: translate(-50%, -50%);box-shadow:8px 8px 8px rgba(0,0,0,0.6);}.header {font-size: 30px;font-weight: bold;text-align: center;line-height: 200px;}.input-item {display: block;width: 100%;margin-bottom: 15px;border: 0;padding: 10px;border-bottom: 1px solid rgb(128, 125, 125);font-size: 15px;outline: none;border-radius: 4px;}.input-item:placeholder {text-transform: uppercase;}.msg {text-align: center;line-height: 88px;}a {text-decoration-line: none;}用户管理系统<form class="form-wrapper" action="/login" method="post">还没有账号?/register">注册
(7)注册
RegisterServlet.java
package Tang.servlet;import java.io.IOException;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 Tang.entity.LoginInfo;import Tang.service.LoginInfoService;import Tang.service.impl.LoginInfoServiceImpl;/** * 注册控制器 * @author TZQ * */@WebServlet("/register")@SuppressWarnings("serial")public class RegisterServlet extends HttpServlet {protected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException{req.getRequestDispatcher("/register.jsp").forward(req,resp);}protected void doPost(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException{String account= req.getParameter("account");String password= req.getParameter("password");LoginInfoService loginInfoService=new LoginInfoServiceImpl();LoginInfo user=new LoginInfo();user.setAccount(account);user.setPassword(password);loginInfoService.register(user);req.getRequestDispatcher("/login.jsp").forward(req,resp);}}
register.jsp
用户注册 用户注册 * {margin: 0;padding: 0;}html {height: 100%;}body {height: 100%;}.container {height: 100%;width:100%;background-color:#fbfbfb;}.login-wrapper {background-color:#cececf;opacity:0.9;width: 358px;height: 530px;border-radius: 15px;padding: 0 50px;position: relative;left: 50%;top: 46%;transform: translate(-50%, -50%);box-shadow:8px 8px 8px rgba(0,0,0,0.6);}.header {font-size: 25px;font-weight: bold;text-align: center;line-height: 170px;}.input-item {display: block;width: 100%;margin-bottom: 20px;border: 0;padding: 10px;border-bottom: 1px solid rgb(128, 125, 125);font-size: 15px;outline: none;border-radius: 4px;}.input-item:placeholder {text-transform: uppercase;}.msg {text-align: center;line-height: 88px;}a {text-decoration-line: none;}用户管理系统注册<form class="form-wrapper" action="/register" method="post">
结束
每个人的配置环境不一样遇到的问题也不一样,不是说代码原封不动的复制过去就能运行,遇到问题先百度。上面的代码还是建议跟着Tellsea大佬的教学视频敲一遍,原文链接已经在开头给出。