用户管理系统

1. 综合练习

实现管理员登录,对用户信息进行增删改查的小项目

1.1 简单功能

1. 登录

登录功能输入用户名密验证码,表单信息会提交到loginServlet进行登录校验,成功则跳转到首页,失败则返回失败信息。

2. 首页列表查询

点击查询,会跳转到findUserByPageServlet,这个Servlet主要功能是查询总记录数据findTotalCount()和分页信息数据findByPage(),然后转发到前端做显示。

3. 添加

点击添加联系人按钮,跳转到add.jsp页面,填写信息后点击提交,会将form表单填写的所有信息传递给AddUserServlet进行处理。

AddUserServlet主要操作:

  1. 设置编码setCharacterEncoding("utf-8")
  2. 获取所有请求参数request.getParameterMap()
  3. 使用BeanUtils.populate将请求参数封装成User对象
  4. 调用serviceaddUser(User user)方法完成保存
  5. 跳转回查询界面

UserService业务层主要进行保存操作。

UserDao数据访问层,封装了对数据库的所有操作。

title

4. 删除

点击删除按钮,会将这条数据的ID获取,封装在请求头里面传递给后台

DelUserServlet主要操作:

  1. 获取要删除的用户ID,getParameter
  2. 调用servicedelUser(String id)方法完成删除
  3. 跳转回查询页面

title

5. 修改

修改用到了两个Servlet进行处理。首先点击修改按钮,会将用户ID传递随请求头传递给findUserServlet

findUserServlet主要操作:

  1. 获取用户ID
  2. 根据ID查询用户信息findUser(id),返回一个User对象
  3. 将User对象存入request
  4. 转发到update.jsp

update.jsp页面主要操作:

  1. 从request域中获取User对象的数据
  2. 使用EL表达式将所有数据回写到页面里。${user.xxx}
  3. 将获取的ID值填入隐藏域值,以确定修改用户。<input type="hidden" name="id" value="${user.id}">
  4. 点击提交,提交表单信息到UpdateUserServlet进行处理。

UpdateUserServlet主要操作:

  1. 设置编码
  2. 获取表单数据,并封装成User对象
  3. 调用Service方法updateUser(User user),将User对象传入,完成修改
  4. 跳转回查询页面

title

1.2 复杂功能

1. 删除选中

点击删除选中按钮,主要问题就是要先获取选中的用户条目,在将这些选中条目的ID提交到后台进行批量删除操作。

1.1 获取选中条目的ID,通过form表单提交到后台。
/*
为删除选中按钮绑定单击事件,提交每个条目复选框的值(该值就是条目的ID)
1. 给每一个条目添加checkbox,值是条目对应的ID
2. 获取当前页面的所有复选框标签,然后遍历,判断其是否有checked属性,有则允许提交表单
3. 提交form表单
*/
window.onload = function () {
    // 为删除选中绑定单击事件
    document.getElementById("delSelected").onclick = function () {
        if (confirm("确定要删除所有选中的信息么?")){
            var flag = false;
            // 判断是否有选中信息
            var cbs = document.getElementsByName("uid");
            for (var i = 0; i < cbs.length; i++) {
                if(cbs[i].checked){ // 如果有任何一个信息被选中(checkbox.checked返回布尔值,表示是否被选中)
                    flag = true; // 允许提交
                    break;
                }
            }
            if (flag)//判断是否允许提交
                // 使用提交方法提交信息到后台
                document.getElementById("form").submit();
        }
    }
}
/*
全选/全不选功能JS代码
1. 在表头单元格添加一个复选框
2. 获取该复选框标签对象
3. 为该对象绑定单击事件,点击就获取所有的复选框对象,然后遍历,设置这些复选框的checked=this.checked。(this:就是当前复选框对象,即'firstCB')
*/
document.getElementById("firstCB").onclick = function () {
    // 获取列表所有的cb
    var cbs = document.getElementsByName("uid");
    // 遍历
    for (var i = 0; i < cbs.length; i++) {
        // 设置这些cbs[i]的checked状态等于firstCB.checked
        cbs[i].checked = this.checked;
    }
}
1.2 后台DelSelectedServlet主要操作
  1. 获取请求参数的ID数组。getParameterValues()
  2. 调用servicedelUser(String[] ids)进行批量删除。该方法会对id数组进行遍历,然后调用daodelUser(Int id)方法操作数据库进行删除。
  3. 全部删除完毕,跳转回查询页面。

title

2. 分页查询

2.1 好处:

  1. 减轻服务器内存的开销
  2. 提升用户的体验

2.2 分析

前端需要传递给后台的信息主要有两个,当前页码currentPage和每页显示条数rows

  1. 当前页码currentPage:需要查询数据库得到总记录数totalCount=select count(*) from user;,然后通过三元运算符totalCount % rows == 0 ? totalCount / rows:totalCount / rows + 1计算出totalPage总页码。将总页码数返回给前端页面做进一步处理
  2. 每页显示条数rows:自定义的条数。

当第一次访问findUserByPageServlet时,后台会做两次SQL查询,查询总记录数和当前分页数据,然后全部封装进PageBean对象,存入request返回。前端接受到这个对象,会在分页查询功能区遍历该对象,进行当前页码计算,以确定有多少分页。当用户点击不同分页时,会将当前页码返回给findUserByPageServlet做进一步的查询操作。

<%--分页查询部分代码,遍历生成li,有多少页就会生成多少li--%>
<c:forEach begin="1" end="${userPage.totalPage}" var="i">
    <c:if test="${userPage.currentPage == i}"> <%--如果服务器返回的页码等于当前页码,则将按钮激活--%>
        <li class="active"><a href="${pageContext.request.contextPath}/findUserByPageServlet?currentPage=${i}&name=${condition.name[0]}&address=${condition.address[0]}&email=${condition.email[0]}">${i}</a></li>
    </c:if>
    <c:if test="${userPage.currentPage != i}"> <%--如果服务器返回的页码不等于当前页码,则正常显示--%>
        <li><a href="${pageContext.request.contextPath}/findUserByPageServlet?currentPage=${i}&name=${condition.name[0]}&address=${condition.address[0]}&email=${condition.email[0]}">${i}</a></li>
    </c:if>
</c:forEach>

title
findUserByPageServlet主要操作:

  1. 接受请求参数,获取当前页码和每页显示条目数
  2. 调用servicefindUserByPage(currentPage,rows,condition)方法查询数据,返回PageBean对象,里面封装了当前分页数据对象。
  3. PageBean对象存入request域中
  4. 转发到list.jsp进行显示

findUserByPage()方法主要功能:

  1. 创建一个空的PageBean对象
  2. 设置当前页码属性和显示条目属性
  3. 调用daofindTotalCount()方法查询总记录数,并设置进PageBean
  4. 计算开始索引start = (currentPage - 1) * rows,然后调用daofindByPage(start,rows)方法查询当前分页数据集合。
  5. 计算总页码数,并设置。
  6. 返回PageBean对象

findTotalCount方法功能:

  1. 定义模板初始化sql。select count(*) from user where 1 = 1
  2. 遍历条件map,获取其值
  3. 如果值不为空或null,则拼接sql字符串,同时将对应值传入list集合。
  4. 使用queryForObject()方法查询出总记录数,并返回

findByPage方法功能:

  1. 定义初始化sql。
  2. 遍历条件map,获取其值
  3. 如果值不为空或null,则拼接sql字符串,同时将对应值传入list集合。
  4. 将分页查询添加进sql字符串。limit ?,?
  5. 将分页查询参数值添加入参数集合中。params.add(start); params.add(rows);
  6. 使用query查询数据,返回分页数据对象集合。

title

3. 复杂条件查询

前端主要就是要将复杂条件查询的数据通过表单参数提交到后台,后台获取参数map后,调用方法查询数据,返回当前分页数据。将PageBean和条件参数map存入request,交给前端做进一步处理。

title

项目成果

用户信息管理系统

更新日志

6月26号

完成了项目主体内容,前后端数据交互进行复杂条件查询,分页查询,增加用户,删除用户,批量删除等功能。

6月27号

  1. 学习了filter过滤器,编写了过滤器实现访问权限控制。即访问除了登录相关页面以外的页面或者资源,会先进行判断用户是否登录,登录则放行,未登录则转发到登录页面。
  2. 将前端分页查询到的内容用户编号显示,进行了唯一操作。即查询到10个用户,第一页会显示编号1~5的用户,第二页显示5~10用户。

7月1号

将复杂条件搜索框整合为了一个,实现了输入查询条件,显示符合条件的用户信息。其主要难点在于数据传递和SQL语句的编写。


  转载请注明: Zero的博客 用户管理系统

 上一篇
Filter和Listener Filter和Listener
1. Filter:过滤器Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,Web开发人员通过Filter技术,对Web服务器管理的所有Web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行
2019-06-27
下一篇 
'2019.6.24' '2019.6.24'
咕咕咕! 最近一直在做一个Web端小项目:用户管理系统 昨天也买了腾讯的云服务器,打算这两天就把项目部署一下。 然后Web阶段的学习预计六月底能结束,可以开始总结知识点,复习一下了。
2019-06-24 Zero
  目录