简易的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>

修改的效果图


至此,基本的登录注册【增,查询】就做完了,还有修改、删除,后期有时间了会更新

posted @ 2020-10-24 23:13  san只松鼠  阅读(613)  评论(0)    收藏  举报