在ssm项目中基本都会遇到信息管理,经常用到的一个功能是列表的翻页功能和搜索功能。这里就用户信息系统作简单介绍。
设计页面信息
要得到一个页面基本的信息。应该要知道一个页面最大能有几条信息,总共有多少页,总共有多少条信息以及当前是第几页。可以设计如下属性:
public class PageInfo<T> {
private List<T> list;
private int size;
private int totalPage;
private int totalCount;
private int currentPage;
getter() setter()...
}
设计数据库操作
既然是分页显示,就不是一次性显示全部的内容了。用limit语句从数据库中取出指定范围的元素。
这里可以在select的时候就加入模糊匹配。用数据库自带的通配符就可以实现:
重新设计dao层的findAll接口这里findAll就是返回某一页的数据了:
List<User> findAll(@Param("start") int start,@Param("username") String username);
<select id="findAll" resultType="user">
select * from user_tb
<if test="username!=null and username!= '' ">
where username like concat("%",#{username},"%")
</if>
limit ${start},5
</select>
编写服务层方法
根据传入的信息,构造一个pageInfo对象并传出。
总页数可以通过dao.getTotalCount()得出,用户信息列表可以通过dao.findAll()得出。根据dao层信息整合得到pageInfo
@Override
public PageInfo<User> findAll(int currentPage, String username) {
PageInfo<User> pageInfo=new PageInfo<>();
pageInfo.setSize(5);
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);
}
//0,5
int start=(pageInfo.getCurrentPage()-1)*5;
List<User> userList=userDao.findAll(start,username);
pageInfo.setList(userList);
return pageInfo;
}
编写控制层方法
注意这里传入的参数。在session中暂时存储当前的搜索名字。如果不存,在搜索的时候调用findAll方法就不知道用户搜索的时候填入的信息了。这里的type就是用来指示是否是显示搜索。
@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");
}
PageInfo<User>pageInfo=userService.findAll(currentPage,username);
ModelAndView mv=new ModelAndView();
mv.addObject("pageInfo",pageInfo);
mv.setViewName("user-list");
return mv;
}
完善jsp页面
给jsp页面添加页数转换按键:
在按下不同的按键后,传入不同的页码数,调用controller层的findAll()方法。
<div class="box-tools pull-right">
<ul class="pagination">
<li><a href="/user/findAll.do" aria-label="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-label="Next">尾页</a></li>
</ul>
</div>
测试
翻页功能
搜索功能: