Javaweb项目案例:一个简单的用户管理系统实现

简介: 1.项目背景我们来设计一个简单的用户管理系统,具有查看用户,添加用户,删除用户,更新用户的所有功能,并能支持分页显示,以及通过关键词模糊查询的🎈本项目采用Druid数据库连接池注意:JDBC和DAO部分本文不予演示,请自行完成此部分代码的编写🛍️




1.项目背景


我们来设计一个简单的用户管理系统,具有查看用户,添加用户,删除用户,更新用户的所有功能,并能支持分页显示,以及通过关键词模糊查询的🎈


本项目采用Druid数据库连接池


注意:JDBC和DAO部分本文不予演示,请自行完成此部分代码的编写🛍️


2.展示用户列表


模板页面,showuser.html


<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>用户列表</title>
</head>
<style>
    table {
        width: 80%;
        border-color: white;
    }
    table tr {
        line-height: 30px;
        border-color: white;
    }
    table tr:FIRST-CHILD {
        background: #f2f2f2;
    }
    table tr:nth-child(even) {
        background: #d5eeeb;
    }
</style>
<script type="text/javascript">
    /**
     * 删除用户
     * @param uid 用户ID信息
     */
    function delUser(uid) {
        if (confirm('是否确认删除?')) {
            window.location.href = 'del.do?id=' + uid;
        }
    }
    /**
     * 获取某一页的用户数据
     * @param pageNo 页码
     */
    function page(pageNo) {
        if (pageNo > 0) {
            window.location.href = 'showuser?pageNo=' + pageNo;
        }
    }
</script>
<body>
<form action="showuser" method="post">
    <input type="hidden" name="oper" value="search">
    查找关键字:<input type="text" name="keyword" th:value="${session.keyword}">
    <button type="submit">提 交</button>
</form>
<table>
    <tbody>
    <tr align="center">
        <td>用户名</td>
        <td>学校</td>
        <td>删除内容</td>
        <td>添加内容</td>
    </tr>
    <tr align="center" th:if="${#lists.isEmpty(session.userList)}">
        <td>没有啦</td>
        <td>没有啦</td>
        <td>没有啦</td>
        <td>没有啦</td>
    </tr>
    <tr align="center" th:unless="${#lists.isEmpty(session.userList)}" th:each="user : ${session.userList}">
        <td><a th:text="${user.username}" th:href="@{/edit.do(uid=${user.id})}"></a></td>
        <td><a th:text="${user.school}" th:href="@{/edit.do(uid=${user.id})}"></a></td>
        <td><a th:onclick="|delUser(${user.id})|">删除</a></td>
        <td><a th:href="@{/add.html}">添加</a></td>
    </tr>
    </tbody>
</table>
<!--分页-->
<div>
    <input type="button" value="首 页" th:onclick="|page(1)|">
    <input type="button" value="上一页" th:onclick="|page(${session.pageNo - 1})|">
    <input type="button" value="下一页" th:onclick="|page(${session.pageNo + 1})|">
    <input type="button" value="尾 页" th:onclick="|page(${session.totalPageNo})|">
</div>
</body>
</html>


ShowUserServlet:


import jdbc.dao.UserDAO;
import jdbc.domain.User;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.List;
/**
 * 使用Thymeleaf渲染页面展示user列表
 */
@WebServlet("/showuser")
public class ShowUserServlet extends ViewBaseServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("UTF-8");
        HttpSession session = req.getSession();
        int pageNo = 1;
        // 如果oper为null,说明是通过表单查询按钮点击过来的
        // 如果oper是null,说明不是通过表单查询按钮点击过来的
        String oper = req.getParameter("oper");
        String keyword = null;
        if ("search".equals(oper)) {
            pageNo = 1;
            keyword = req.getParameter("keyword");
            if (keyword == null) {
                keyword = "";
            }
            session.setAttribute("keyword", keyword);
        } else {
            String pageNoStr = req.getParameter("pageNo");
            if (pageNoStr != null) {
                pageNo = Integer.parseInt(pageNoStr);
            }
            Object keywordObj = session.getAttribute("keyword");
            if (keywordObj != null) {
                keyword = (String) keywordObj;
            } else {
                keyword = "";
            }
        }
        // 将页码保存到session作用域
        session.setAttribute("pageNo", pageNo);
        UserDAO userDAO = new UserDAO();
        List<User> userList = userDAO.getUserListByPageAndKeyword(pageNo, keyword);
        // 将userList放到session 作用域
        session.setAttribute("userList", userList);
        // 得到用户总数
        long userCount = userDAO.getUserCount(keyword);
        // 得到页数
        long totalPageNo = userCount / 5 + 1;
        session.setAttribute("totalPageNo", totalPageNo);
        // 注意:物理视图名称 = view-prefix + view-suffix
        // 这里结合xml文件拼接也就是/showuser.html
        super.processTemplate("showuser", req, resp);
    }
}


3.添加用户


add.html


<!-- user表添加页面 -->
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
  <meta charset="UTF-8">
  <title>用户添加页面</title>
</head>
<style>
  * {
    margin: 0;
    padding: 0;
  }
  /*渐变背景样式*/
  body {
    height: 100vh;
    width: 100%;
    overflow: hidden;
    background-image: linear-gradient(125deg, #F44336, #E91E63, #9C27B0, #3F51B5, #2196F3);
    background-size: 400%;
    font-family: "montserrat";
    animation: bganimation 15s infinite;
  }
  @keyframes bganimation {
    0% {
      background-position: 0% 50%;
    }
    50% {
      background-position: 100% 50%;
    }
    100% {
      background-position: 0% 50%;
    }
  }
  /*表单样式*/
  .form {
    width: 85%;
    max-width: 600px;
    /* max-height:700px;
    */
    background-color: rgba(255, 255, 255, .05);
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    padding: 40px;
    border-radius: 10px;
    box-shadow: 0 0 5px #000;
    text-align: center;
    font-family: "微软雅黑";
    color: #fff;
  }
  /*表单标题样式*/
  .form h1 {
    margin-top: 0;
    font-weight: 200;
  }
  .form .txtb {
    border: 1px solid #aaa;
    margin: 8px 0;
    padding: 12px 18px;
    border-radius: 10px;
  }
  .txtb label {
    display: block;
    text-align: left;
    color: #fff;
    font-size: 14px;
  }
  /*输入框样式*/
  .txtb input, .txtb textarea {
    width: 100%;
    background: none;
    border: none;
    outline: none;
    margin-top: 6px;
    font-size: 18px;
    color: #fff;
  }
  /*备注框样式*/
  .txtb textarea {
    max-height: 300px;
  }
  /*提交按钮样式*/
  .btn {
    display: block;
    /* background-color:rgba(156,39,176,.5);
    */
    padding: 14px 0;
    color: #fff;
    cursor: pointer;
    margin-top: 8px;
    width: 100%;
    border: 1px solid #aaa;
    border-radius: 10px;
  }
</style>
<body>
<div class="form">
  <form action="add.do" method="post">
    <h1>用户信息添加</h1>
    <div class="txtb">
      <label for="">用户名:</label>
      <input type="text" placeholder="请输入用户名" name="username"
             th:value="${userInfo.username}"></div>
    <div class="txtb">
      <label for="">密码:</label>
      <input type="text" placeholder="请输入密码" name="password"
             th:value="${userInfo.password}"></div>
    <div class="txtb">
      <label for="">学校:</label>
      <input type="text" placeholder="请输入学校" name="school"
             th:value="${userInfo.school}">
    </div>
    <div class="txtb">
      <label for="">备注:</label>
      <textarea name="shit" id=""></textarea>
    </div>
    <input type="submit" value="提 交" class="btn" style="color: #E91E63">
  </form>
</div>
</body>
</html>


AddUserServlet:


import jdbc.dao.UserDAO;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
 * 向User表中添加数据
 */
@WebServlet("/add.do")
public class AddUserServlet extends ViewBaseServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("UTF-8");
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        String school = req.getParameter("school");
        UserDAO userDAO = new UserDAO();
        userDAO.addUserNoId(username, password, school);
        resp.sendRedirect("showuser");
    }
}


4.删除用户


DelServlet:


import jdbc.dao.UserDAO;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
 * 根据ID删除用户
 */
@WebServlet("/del.do")
public class DelServlet extends ViewBaseServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        int id = Integer.parseInt(req.getParameter("id"));
        UserDAO userDAO = new UserDAO();
        userDAO.delUser(id);
        resp.sendRedirect("showuser");
    }
}


5.修改用户


edit.html:


<!-- user表编辑页面 -->
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>用户编辑页面</title>
</head>
<style>
    * {
        margin: 0;
        padding: 0;
    }
    /*渐变背景样式*/
    body {
        height: 100vh;
        width: 100%;
        overflow: hidden;
        background-image: linear-gradient(125deg, #F44336, #E91E63, #9C27B0, #3F51B5, #2196F3);
        background-size: 400%;
        font-family: "montserrat";
        animation: bganimation 15s infinite;
    }
    @keyframes bganimation {
        0% {
            background-position: 0% 50%;
        }
        50% {
            background-position: 100% 50%;
        }
        100% {
            background-position: 0% 50%;
        }
    }
    /*表单样式*/
    .form {
        width: 85%;
        max-width: 600px;
        /* max-height:700px;
        */
        background-color: rgba(255, 255, 255, .05);
        position: absolute;
        top: 50%;
        left: 50%;
        transform: translate(-50%, -50%);
        padding: 40px;
        border-radius: 10px;
        box-shadow: 0 0 5px #000;
        text-align: center;
        font-family: "微软雅黑";
        color: #fff;
    }
    /*表单标题样式*/
    .form h1 {
        margin-top: 0;
        font-weight: 200;
    }
    .form .txtb {
        border: 1px solid #aaa;
        margin: 8px 0;
        padding: 12px 18px;
        border-radius: 10px;
    }
    .txtb label {
        display: block;
        text-align: left;
        color: #fff;
        font-size: 14px;
    }
    /*输入框样式*/
    .txtb input, .txtb textarea {
        width: 100%;
        background: none;
        border: none;
        outline: none;
        margin-top: 6px;
        font-size: 18px;
        color: #fff;
    }
    /*备注框样式*/
    .txtb textarea {
        max-height: 300px;
    }
    /*提交按钮样式*/
    .btn {
        display: block;
        /* background-color:rgba(156,39,176,.5);
        */
        padding: 14px 0;
        color: #fff;
        cursor: pointer;
        margin-top: 8px;
        width: 100%;
        border: 1px solid #aaa;
        border-radius: 10px;
    }
</style>
<body>
<div class="form">
    <form th:action="@{/update.do}" method="post">
        <h1>用户信息修改</h1>
        <!--隐藏传递用户ID信息,使用隐藏域-->
        <input type="hidden" name="id" th:value="${userInfo.id}">
        <div class="txtb">
            <label for="">用户名:</label>
            <input type="text" placeholder="请输入用户名" name="username"
                   th:value="${userInfo.username}"></div>
        <div class="txtb">
            <label for="">密码:</label>
            <input type="text" placeholder="请输入密码" name="password"
                   th:value="${userInfo.password}"></div>
        <div class="txtb">
            <label for="">学校:</label>
            <input type="text" placeholder="请输入学校" name="school"
                   th:value="${userInfo.school}">
        </div>
        <div class="txtb">
            <label for="">备注:</label>
            <textarea name="shit" id=""></textarea>
        </div>
        <input type="submit" value="提 交" class="btn" style="color: #E91E63">
    </form>
</div>
</body>
</html>


EditServlet:


import jdbc.dao.UserDAO;
import jdbc.domain.User;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
 * 编辑user表中的数据
 */
@WebServlet("/edit.do")
public class EditServlet extends ViewBaseServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String uidStr = req.getParameter("uid");
        if (uidStr != null && !"".equals(uidStr)) {
            int uid = Integer.parseInt(uidStr);
            UserDAO userDAO = new UserDAO();
            User user = userDAO.getUserById(uid);
            // 保存到request作用域
            req.setAttribute("userInfo", user);
            super.processTemplate("edit", req, resp);
        }
    }
}


6.界面展示


展示用户列表:(此页面支持分页,模糊查询,修改,删除,添加)🤤



用户信息修改:(用户信息添加类似)🍔


目录
相关文章
|
5天前
|
Java Maven
java项目中jar启动执行日志报错:no main manifest attribute, in /www/wwwroot/snow-server/z-server.jar-jar打包的大小明显小于正常大小如何解决
在Java项目中,启动jar包时遇到“no main manifest attribute”错误,且打包大小明显偏小。常见原因包括:1) Maven配置中跳过主程序打包;2) 缺少Manifest文件或Main-Class属性。解决方案如下:
java项目中jar启动执行日志报错:no main manifest attribute, in /www/wwwroot/snow-server/z-server.jar-jar打包的大小明显小于正常大小如何解决
|
1天前
|
存储 Java BI
java怎么统计每个项目下的每个类别的数据
通过本文,我们详细介绍了如何在Java中统计每个项目下的每个类别的数据,包括数据模型设计、数据存储和统计方法。通过定义 `Category`和 `Project`类,并使用 `ProjectManager`类进行管理,可以轻松实现项目和类别的数据统计。希望本文能够帮助您理解和实现类似的统计需求。
34 17
|
23天前
|
NoSQL Java 关系型数据库
Liunx部署java项目Tomcat、Redis、Mysql教程
本文详细介绍了如何在 Linux 服务器上安装和配置 Tomcat、MySQL 和 Redis,并部署 Java 项目。通过这些步骤,您可以搭建一个高效稳定的 Java 应用运行环境。希望本文能为您在实际操作中提供有价值的参考。
111 26
|
2月前
|
XML Java 测试技术
从零开始学 Maven:简化 Java 项目的构建与管理
Maven 是一个由 Apache 软件基金会开发的项目管理和构建自动化工具。它主要用在 Java 项目中,但也可以用于其他类型的项目。
59 1
从零开始学 Maven:简化 Java 项目的构建与管理
|
2月前
|
设计模式 消息中间件 搜索推荐
Java 设计模式——观察者模式:从优衣库不使用新疆棉事件看系统的动态响应
【11月更文挑战第17天】观察者模式是一种行为设计模式,定义了一对多的依赖关系,使多个观察者对象能直接监听并响应某一主题对象的状态变化。本文介绍了观察者模式的基本概念、商业系统中的应用实例,如优衣库事件中各相关方的动态响应,以及模式的优势和实际系统设计中的应用建议,包括事件驱动架构和消息队列的使用。
|
2月前
|
Java
Java项目中高精度数值计算:为何BigDecimal优于Double
在Java项目开发中,涉及金额计算、面积计算等高精度数值操作时,应选择 `BigDecimal` 而非 `Double`。`BigDecimal` 提供任意精度的小数运算、多种舍入模式和良好的可读性,确保计算结果的准确性和可靠性。例如,在金额计算中,`BigDecimal` 可以精确到小数点后两位,而 `Double` 可能因精度问题导致结果不准确。
|
Java
Java中需要注意的一些案例
Java中需要注意的一些案例
124 0
|
8天前
|
Java
Java—多线程实现生产消费者
本文介绍了多线程实现生产消费者模式的三个版本。Version1包含四个类:`Producer`(生产者)、`Consumer`(消费者)、`Resource`(公共资源)和`TestMain`(测试类)。通过`synchronized`和`wait/notify`机制控制线程同步,但存在多个生产者或消费者时可能出现多次生产和消费的问题。 Version2将`if`改为`while`,解决了多次生产和消费的问题,但仍可能因`notify()`随机唤醒线程而导致死锁。因此,引入了`notifyAll()`来唤醒所有等待线程,但这会带来性能问题。
Java—多线程实现生产消费者
|
10天前
|
安全 Java Kotlin
Java多线程——synchronized、volatile 保障可见性
Java多线程中,`synchronized` 和 `volatile` 关键字用于保障可见性。`synchronized` 保证原子性、可见性和有序性,通过锁机制确保线程安全;`volatile` 仅保证可见性和有序性,不保证原子性。代码示例展示了如何使用 `synchronized` 和 `volatile` 解决主线程无法感知子线程修改共享变量的问题。总结:`volatile` 确保不同线程对共享变量操作的可见性,使一个线程修改后,其他线程能立即看到最新值。