简易的JavaWeb登录注册功能
文件目录结构

在需要创建子文件夹的文件夹上面右键,选择New,平移过去,选择Directory

项目准备工作:
导包,数据库驱动,剩下两个包可以在tomcat安装目录,apache-tomcat-8.5.54\webapps\examples\WEB-INF\lib
数据库语句,建库,建表,插入测试数据
CREATE DATABASE USER
CREATE TABLE tbl_emp(
id INT(11) PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(255) NOT NULL,
PASSWORD VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL
)
INSERT INTO tbl_emp(username,PASSWORD,email) VALUES('aaa','111','aaaa'),
('sss','222','dddd'),('ddd','222','dddd'),('fff','222','ffff'),('ggg','222','gggg')
web.xml 配置servlet
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>UserServlet</servlet-name>
<!-- 想要使用哪个servlet,就用哪个类名的全类名 -->
<servlet-class>com.yuanwu.servlet.UserServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UserServlet</servlet-name>
<url-pattern>/action</url-pattern>
</servlet-mapping>
</web-app>
1、User.java【JavaBean】
package com.yuanwu.bean;
/**
* @Author YuanWu
* @ClassName User
* @Date 2020/10/24
**/
public class User {
private int id;
private String username;
private String password;
private String email;
public User() {
}
public User(int id, String username, String password, String email) {
this.id = id;
this.username = username;
this.password = password;
this.email = email;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", email='" + email + '\'' +
'}';
}
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 String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
2、UserDao.java
【dao层以及dao层实现类】是和数据库直接打交道的,sql语句,预编译等等
package com.yuanwu.dao;
import com.yuanwu.bean.User;
import java.util.List;
public interface UserDao {
//查询所有
public List<User> getAddSave();
//登录,
public User getByIdAndUserName(String email,String userName);
//注册
public boolean insertAll(User user);
//先把要修改的id,查询出来
public User updateBySave(User user);
//根据id修改
public User updateByIdSave(Integer id);
//删除
public boolean delByIdSave(Integer id);
}
2、1,UserDaoImpl.java
【实现接口】
package com.yuanwu.dao.Impl;
import com.yuanwu.bean.User;
import com.yuanwu.dao.UserDao;
import com.yuanwu.util.DBUtil;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
/**
* @Author YuanWu
* @ClassName UserDaoImpl
* @Date 2020/10/24
**/
public class UserDaoImpl implements UserDao {
List<User> userList = new ArrayList<>();
@Override
public List<User> getAddSave() {
Connection conn = DBUtil.getConn();
String sql = "select Id,username,password,email from tbl_emp";
try {
PreparedStatement pstm = conn.prepareStatement(sql);
ResultSet rs = pstm.executeQuery();
while (rs.next()){
User user = new User();
user.setId(rs.getInt("id"));
user.setUsername(rs.getString("username"));
user.setPassword(rs.getString("password"));
user.setEmail(rs.getString("email"));
userList.add(user);
}
return userList;
} catch (Exception e) {
e.printStackTrace();
}finally {
DBUtil.getClose();
}
return null;
}
@Override
public User getByIdAndUserName(String email, String userName) {
String sql = "select * from tbl_emp where email=? and username=?";
User user = null;
try {
Connection conn = DBUtil.getConn();
PreparedStatement pstm = conn.prepareStatement(sql);
pstm.setString(1,email);
pstm.setString(2,userName);
ResultSet rs = pstm.executeQuery();
while (rs.next()){
user = new User();
user.setId(rs.getInt("Id"));
user.setPassword(rs.getString("password"));
user.setEmail(rs.getString("email"));
user.setUsername(rs.getString("userName"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
DBUtil.getClose();
}
return user;
}
@Override
public boolean insertAll(User user) {
boolean flag = false;
String sql = "insert into tbl_emp(username,password,email) values(?,?,?)";
Connection conn = DBUtil.getConn();
try {
PreparedStatement pstm = conn.prepareStatement(sql);
pstm.setString(1, user.getUsername());
pstm.setString(2, user.getPassword());
pstm.setString(3, user.getEmail());
if (pstm.executeUpdate() >1){
flag = true;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
DBUtil.getClose();
}
return flag;
}
@Override
public User updateBySave(User user) {
String sql = "UPDATE tbl_emp SET username=?,PASSWORD=?,email=? WHERE Id=?";
Connection conn = DBUtil.getConn();
try {
PreparedStatement pstm = conn.prepareStatement(sql);
pstm.setString(1, user.getUsername());
pstm.setString(2,user.getPassword());
pstm.setString(3, user.getEmail());
pstm.setInt(4, user.getId());
pstm.executeUpdate();
System.out.println("成功");
} catch (Exception e) {
e.printStackTrace();
}finally {
DBUtil.getClose();
}
return user;
}
@Override
public User updateByIdSave(Integer id) {
String sql = "select * from tbl_emp where Id=?";
Connection conn = DBUtil.getConn();
User user = null;
try {
PreparedStatement pstm = conn.prepareStatement(sql);
pstm.setInt(1,id);
ResultSet rs = pstm.executeQuery();
while (rs.next()){
user = new User();
user.setId(rs.getInt("ID"));
user.setUsername(rs.getString("username"));
user.setPassword(rs.getString("password"));
user.setEmail(rs.getString("email"));
}
} catch (Exception e) {
e.printStackTrace();
}finally {
DBUtil.getClose();
}
return user;
}
@Override
public boolean delByIdSave(Integer id) {
String sql = "delete from tbl_emp where Id=?";
int row = 0;
boolean flag = false;
Connection conn = DBUtil.getConn();
try {
PreparedStatement pstm = conn.prepareStatement(sql);
pstm.setInt(1, id);
row = pstm.executeUpdate();
if (row > 0){
flag = true;
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
DBUtil.getClose();
}
return flag;
}
}
servlet
【相当于控制层controller】用户通过selvlet增删改查数据库,
BaseServlet.java
通过反射来减少if else的重复代码,
不过最好是所有的方法都用public修饰,可能会出现反射不到方法,出现异常
解决代码冗余,工具类
package com.yuanwu.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Method;
/**
* @Author YuanWu
* @ClassName BaseServlet
* @Date 2020/10/24
**/
public class BaseServlet extends HttpServlet {
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String action = req.getParameter("action");
System.out.println(action);
try {
Method method = this.getClass().getDeclaredMethod(action,HttpServletRequest.class,HttpServletResponse.class);
method.invoke(this,req,resp);
} catch (Exception e) {
e.printStackTrace();
}
}
}
UserServlet.java
这里有点问题,请求转发不能填写jsp文件名,只能填写请求方法action?action=querySave,不然的话查询所有的页面查询不到,有点问题,暂时没想到解决办法。可能学习的知识不够全面,学漏了;
package com.yuanwu.servlet;
import com.yuanwu.bean.User;
import com.yuanwu.dao.Impl.UserDaoImpl;
import com.yuanwu.dao.UserDao;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
/**
* @Author YuanWu
* @ClassName UserServlet
* @Date 2020/10/24
**/
public class UserServlet extends BaseServlet{
//全部查询
protected void querySave(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
UserDao userDao = new UserDaoImpl();
List list = userDao.getAddSave();
req.setAttribute("list",list);
req.getRequestDispatcher("/list.jsp").forward(req,resp);
}
//登录
protected void loginSave(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String email = req.getParameter("email");
String name = req.getParameter("username");
UserDao userDao = new UserDaoImpl();
User u = userDao.getByIdAndUserName(email,name);
if (u != null){
req.getSession().setAttribute("user",u);
req.getRequestDispatcher("/action?action=querySave").forward(req,resp);
// resp.sendRedirect("/action?action=querySave");
}else{
// req.getP
req.getSession().setAttribute("msg", "账号或者密码错误,请重新登录");
resp.sendRedirect("/login.jsp");
}
}
//注册
protected void registerSave(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
String password = req.getParameter("password");
String email = req.getParameter("email");
UserDao userDao = new UserDaoImpl();
User user = new User();
user.setUsername(username);
user.setPassword(password);
user.setEmail(email);
boolean flag = userDao.insertAll(user);
if (flag = true){
//sendRedirect
// resp.sendRedirect("/login,jsp");
req.getRequestDispatcher("/login.jsp").forward(req,resp);
}else {
req.getRequestDispatcher("/register").forward(req,resp);
}
}
//先根据id查询出想要修改的信息
protected void updateByIdSave(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String id = req.getParameter("id");
UserDao userDao = new UserDaoImpl();
User user = userDao.updateByIdSave(Integer.valueOf(id));
req.setAttribute("userId", user);
req.getRequestDispatcher("/update.jsp").forward(req,resp);
}
//修改
protected void updateByAllSave(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String id = req.getParameter("id");
String username = req.getParameter("username");
String password = req.getParameter("password");
String email = req.getParameter("email");
UserDao userDao = new UserDaoImpl();
User user = new User();
user.setId(Integer.parseInt(id));
user.setUsername(username);
user.setPassword(password);
user.setEmail(email);
try {
userDao.updateBySave(user);
} catch (Exception e) {
e.printStackTrace();
}
resp.sendRedirect(req.getContextPath()+"/action?action=querySave");
}
//删除
protected void deleteSave(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String id = req.getParameter("id");
UserDao userDao = new UserDaoImpl();
try {
userDao.delByIdSave(Integer.parseInt(id));
} catch (NumberFormatException e) {
e.printStackTrace();
}
resp.sendRedirect(req.getContextPath()+"/action?action=querySave");
}
}
UBUtil.java
工具类,将数据库连接封装起来,使用的时候,直接类名调用方法即可,因为用static修饰
不同的数据库,数据库驱动不同,数据库连接也不同,使用的时候按照自己数据库的要求填写。
这个数据库连接工具包其实还可以优化,
使用QueryRunner类(org.apache.commons.dbutils.QueryRunner),需要导入commons-dbutils-1.3.jar包,
package com.yuanwu.util;
import java.security.PrivateKey;
import java.sql.*;
/**
* @Author YuanWu
* @ClassName DBUtil
* @Date 2020/10/24
**/
public class DBUtil {
private static Connection conn;
private static PreparedStatement pstm;
private static ResultSet rs;
private static String url = "jdbc:mysql://localhost:3306/user?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8";
public static Connection getConn(){
try {
Class.forName("com.mysql.cj.jdbc.Driver");
conn= DriverManager.getConnection(url, "root", "123456");
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
public static void getClose(){
try {
if (rs != null){
rs.close();
}
if (pstm != null){
pstm.close();
}
if (conn != null){
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
index.jsp
这个是测试的,实际使用的时候没用到他
<%--
Created by IntelliJ IDEA.
User: Lenovo
Date: 2020/10/24
Time: 19:46
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<jsp:forward page="/login.jsp"></jsp:forward>
<%--
<html>
<head>
<title>$Title$</title>
</head>
<body>
<a href="/action?action=querySave">查询</a>
</body>
</html>
--%>
list.jsp
<%@ page import="java.util.Date" %>
<%@ page import="java.text.SimpleDateFormat" %><%--
Created by IntelliJ IDEA.
User: Lenovo
Date: 2020/10/24
Time: 20:05
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri = "http://java.sun.com/jsp/jstl/core" prefix = "c" %>
<html>
<head>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
<title>卢本伟NB</title>
</head>
<body>
<%
Date date = new Date();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String now = dateFormat.format(date);
%>
<h1>当前用户:${sessionScope.user.username},登录时间:<%=now%></h1>
<div>
<table class="table table-hover">
<thead>
<tr class="success">
<td>Id</td>
<td>user</td>
<td>password</td>
<td>email</td>
<td>操作</td>
</tr>
</thead>
<tbody>
<c:forEach items="${list}" var="user_list">
<tr>
<td>${user_list.id}</td>
<td>${user_list.username}</td>
<td>${user_list.password}</td>
<td>${user_list.email}</td>
<td>
<a href="/action?action=updateByIdSave&id=${user_list.id}"><button class="btn btn-primary">修改</button></a>
<a href="/action?action=deleteSave&id=${user_list.id}"><button class="btn btn-warning">删除</button></a>
</td>
</tr>
</c:forEach>
</tbody>
</table>
</div>
</body>
</html>
查询的效果图


login.jsp
<%--
Created by IntelliJ IDEA.
User: Lenovo
Date: 2020/10/24
Time: 20:14
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
<title>卢本伟NB</title>
</head>
<body>
<div style="width: 400px;height: 400px;margin-left: 100px;margin-top: 100px">
<h1>登录卢本伟广场</h1>
<form action="/action?action=loginSave" method="post">
<div class="form-group">
<label>Email address</label>
<input type="text" class="form-control" name="email">
</div>
<div class="form-group">
<label>User Name</label>
<input type="text" class="form-control" name="username">
</div>
<button type="submit" class="btn btn-primary">Submit</button>
</form>
<a href="register.jsp">
<button class="btn btn-primary">注册</button>
</a>
</div>
</body>
</html>
register.jsp
<%--
Created by IntelliJ IDEA.
User: Lenovo
Date: 2020/10/24
Time: 21:59
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
<title>卢本伟NB</title>
</head>
<body>
<h1>注册卢本伟广场</h1>
<div>
<form action="/action?action=registerSave" method="post">
<div>
<label>User Name</label>
<input type="text" class="form-control" name="username">
</div>
<div>
<label>Pass Word</label>
<input type="text" class="form-control" name="password">
</div>
<div>
<label>Email address</label>
<input type="text" class="form-control" name="email">
</div>
<button type="submit" class="btn btn-success">Submit</button>
</form>
</div>
</body>
</html>
update.jsp
<%--
Created by IntelliJ IDEA.
User: Lenovo
Date: 2020/10/25
Time: 17:37
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
<title>卢本伟NB</title>
</head>
<body>
<div>
<form action="/action?action=updateByAllSave" method="post">
<div>
<label>id</label>
<input name="id" class="form-control" readonly="readonly" value="${userId.id}">
</div>
<div>
<label>username</label>
<input name="username" class="form-control" value="${userId.username}">
</div>
<div>
<label>password</label>
<input name="password" class="form-control" value="${userId.password}">
</div>
<div>
<label>email</label>
<input name="email" class="form-control" value="${userId.email}">
</div>
<button class="btn btn-primary">修改</button>
<a href="${pageContext.request.contextPath}/action?action=querySave" class="btn btn-primary">返回</a>
</form>
</div>
</body>
</html>
修改的效果图



浙公网安备 33010602011771号