ssm分页+搜索
包括基于ssm实现的表格分页及模糊查询功能(该项目基于Java开发学习.Day3)进行开发
创建实体类
在bean下创建pageInfo类。该类用于存储分页 需要展示的信息、每页展示的最大信息数、总页数、信息总数、当前页数
具体代码如下
package com.xxxxbt.bean;
import java.util.List;
public class PageInfo<T> {
private List<T> list;
private int size;
private int totalPage;
private int totalCount;
private int currentPage;
public List<T> getList() {
return list;
}
public void setList(List<T> list) {
this.list = list;
}
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
public int getTotalPage() {
return totalPage;
}
public void setTotalPage(int totalPage) {
this.totalPage = totalPage;
}
public int getTotalCount() {
return totalCount;
}
public void setTotalCount(int totalCount) {
this.totalCount = totalCount;
}
public int getCurrentPage() {
return currentPage;
}
public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
}
}
dao层
为实现新的分页功能,需要对原有的findAll方法进行一定程度的修改
// List<User> findAll();
List<User> findAll(@Param("start") int start,@Param("username")String username);
同时为了计算分页的总页数,还需获取数据库中满足查询信息的总数据量,为此添加如下代码
int getTotalCount(@Param("username") String username);
service层
UserService接口需要根据当前页和搜索条件获取PageInfo对象,因此进行如下修改
// List<User> findAll();
PageInfo<User> findAll(int currentPage,String username);
UserServiceImpl中添加了实现分页的具体逻辑。先利用getTotalCound查询满足username条件的数据,获取总数据行数,再获取目标分页内的具体数据,存储于pageInfo中进行返回。
// @Override
// public List<User> findAll() {
// return userDao.findAll();
// }
@Override
public PageInfo<User> findAll(int currentPage,String username) {
System.out.println("currentPage:"+currentPage);
PageInfo<User> pageInfo=new PageInfo<>();
pageInfo.setSize(5);
// tc为数据总行数
int tc=userDao.getTotalCount(username);
System.out.println(tc);
pageInfo.setTotalCount(tc);
// tp为总页数
int tp=(int)Math.ceil(tc/5.0);
System.out.println(tp);
pageInfo.setTotalCount(tp);
if(currentPage<1){
pageInfo.setCurrentPage(1);
}else if(currentPage>tp){
pageInfo.setCurrentPage(tp);
}else {
pageInfo.setCurrentPage(currentPage);
}
System.out.println("currentPage:"+currentPage);
int start=(pageInfo.getCurrentPage()-1)*5;
System.out.println("start:"+start);
List<User> userList = userDao.findAll(start, username);
pageInfo.setList(userList);
return pageInfo;
}
Controller层
处理 findAll 请求地址映射,其参数为:
currentPage 当前页(无则默认为1)
username 查询条件
type 点击搜索按钮为1,否则默认为1
session 状态
代码逻辑:当用户通过查询功能进行访问该地址时,将当前username存入session中,同时根据新的username进行查询;当用户通过非查询功能(如点击上下页跳转,或修改url中的参数)进行访问该地址时,即使当前查询框内的查询条件已经被更改,依旧按照session原有的username进行查询
// @RequestMapping("/findAll.do")
// public ModelAndView findAll(){
// List<User> users=userService.findAll();
// ModelAndView mv=new ModelAndView();
// mv.addObject("users",users);
// mv.setViewName("user-list");
// return mv;
// }
@RequestMapping("/findAll.do")
public ModelAndView findAll(@RequestParam(defaultValue = "1")int currentPage, String username, @RequestParam(defaultValue = "0")int type, HttpSession session){
if(type==1){
session.setAttribute("searchName",username);
}else {
username=(String) session.getAttribute("searchName");
}
System.out.println("currentPage:"+currentPage);
PageInfo<User> pageInfo=userService.findAll(currentPage,username);
ModelAndView mv=new ModelAndView();
mv.addObject("pageInfo",pageInfo);
mv.setViewName("user-list");
return mv;
}
在前端添加分页按钮
<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>