1、实现的思路整理
采用分页式显示的话,首先需要一个用来保存这些分页和用户数据的新实体类,这个类中需要保存的数据有:用户信息列、一页中显示的用户信息条数、用户信息总条数,页总数和当前页数;然后我们需要考虑到之前实现的在主页面进行信息显示的函数就要进行相应的修改了:默认显示第一页的内容等;最后在在前端页面补上相应的操作按钮即可。
实现搜索功能,我们只需要在Mapper中写好数据库的查询语句,将对应的信息列表返回即可。
2、代码实现
①、定义PageInfo实体类,其中包含有如下元素
private List<T> list; private int size; private int totalPage; private int totalCount; private int currentPage;
get和set函数实现使用默认的即可
②、修改DAO接口中已经定义过的findAll接口,并将分页和搜索功能统一在这个接口中;然后再定义一个用来获取总信息数的接口
List<User> findAll(@Param("start") int start,@Param("username") String username); //分页与搜索功能统一设计;获取总行数 int getTotalCount(@Param("username") String username);
③、在Service接口中同样修改findALL接口,然后在Service类中进行具体实现
@Override public PageInfo<User> findAll(int currentPage, String username) { PageInfo<User> pageInfo =new PageInfo<>(); pageInfo.setSize(5); //tc为查询到的数据的总行数 int tc =userDao.getTotalCount(username); pageInfo.setTotalCount(tc); //tp为总的页数 int tp=(int)Math.ceil(tc/5.0); pageInfo.setTotalPage(tp); if (currentPage<1){ pageInfo.setCurrentPage(1); }else if (currentPage>tp) { pageInfo.setCurrentPage(tp); }else{ pageInfo.setCurrentPage(currentPage); } //-1之后第一页的数据从0开始搜(0,5,10,15.....) int start=(pageInfo.getCurrentPage()-1)*5; List<User> userList=userDao.findAll(start,username); pageInfo.setList(userList); return pageInfo; }
④、在Controller类中也修改findAll的前后端交互逻辑
@RequestMapping("/findAll.do") public ModelAndView findAll(@RequestParam(defaultValue = "1")int currentPage, String username, @RequestParam(defaultValue = "0")int type, HttpSession session){ //实现查询时点击翻页不被被主页覆盖 if (type==1)//对应user-list第123行 { //赋值 session.setAttribute("searchName",username); }else { //取值 username=(String) session.getAttribute("searchName"); } //显示所有人 PageInfo<User> pageInfo=userService.findAll(currentPage,username); ModelAndView mv=new ModelAndView(); mv.addObject("pageInfo",pageInfo); mv.setViewName("user-list"); return mv; }
其中type对应的是在user-list.jsp文件中的定义的类型,使用type进行分类可以解决点击分页显示内容仍为主页内容的BUG
<form action="${pageContext.request.contextPath}/user/findAll.do?type=1" method="post">
⑤、在Mapper.xml中实现数据库的模糊搜索的语句功能
<select id="findAll" resultType="user"> select *from tb_user <if test="username!=null and username!='' "> <!-- 模糊搜索 --> where username like concat("%",#{username},"%") </if> -- 五个记录为一组 limit #{start},5 </select> <select id="getTotalCount" resultType="int"> select count(*) from tb_user <if test="username!=null and username!='' "> <!-- 模糊搜索 --> where username like concat("%",#{username},"%") </if> </select>
⑥、在前端样式中补上分页操作按钮实现
<%-- 添加的分页按钮--%> <div class="box-tools pull-right"> <ul class="pagination"> <li><a href="/user/findAll.do" aria-lable="Previous">首页</a></li> <li><a href="/user/findAll.do?currentPage=${pageInfo.currentPage-1}" >上一页</a></li> <c:forEach begin="1" end="${pageInfo.totalPage}" var="pageNum"> <li><a href="/user/findAll.do?currentPage=${pageNum}">${pageNum}</a></li> </c:forEach> <li><a href="/user/findAll.do?currentPage=${pageInfo.currentPage+1}" >下一页</a></li> <li><a href="/user/findAll.do?currentPage=${pageInfo.totalPage}" aria-lable="Next">尾页</a></li> </ul> </div>
3、进行功能测试
实现分页功能
实现查找功能