在上一篇文章中,我们完成了一个简单的ssm项目——一个用户管理系统,包括了用户的登录以及信息的增删改查,今天我们会在昨日基础上,进一步扩展功能。
分页功能+搜索功能
1、首先要创建一个分页的实体类。每一页,都相当于一个集合,可以放很多条数据,另外每一页还要规定展示多少条数据,也就是分页的尺寸。对于一个分页的实体类,我们还需要知道总的页数,以及总的数据条数,因此,实体类设计如下:
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;
}
@Override
public String toString() {
return "PageInfo{" +
"list=" + list +
", size=" + size +
", totalPage=" + totalPage +
", totalCount=" + totalCount +
", currentPage=" + currentPage +
'}';
}
}
2、在UserDao中定义“得到数据库表中数据条数”的方法,考虑到之后所要实现的搜索功能,我们在该方法中加入限制:
//得到数据库表中数据条数
int getTotalCount(@Param("username") String username);
3、根据Dao的方法要求,更新UserMapper.xml中的sql命令
<select id="getTotalCount" resultType="int">
select count(*) from test2
<if test="username!=null and username!=''">
where username like concat("%",#{username},"%")
</if>
</select>
此部分用到的是模糊查询
模糊查询的意义在于使用搜索功能时,能通过输入的内容查询到所有符合条件的内容:
此时,我们可以考虑到,是否能将这个模糊查询与原本的add(findAll)相结合,在搜索框中没有输入查询条件时,将所有用户信息展现在界面上
<select id="findAll" resultType="user">
select * from test2
<if test="username!=null and username!=''">
where username like concat("%",#{username},"%")
</if>
limit #{start},5
</select>
limit #{start},5 表示从开始搜索的地方,搜5条
对应的Dao中原有的findAll方法也改成:
//用户管理,
// List<User> findAll();
List<User> findAll(@Param("start")int start,@Param("username")String username);
4、修改UserService定义的方法,将原来的findAll方法改为:
PageInfo<User> findAll(int currentPage,String username);
并在UserServiceImpl中进行实现
@Override
public PageInfo<User> findAll(int currentPage, String username) {
PageInfo<User> pageInfo=new PageInfo<>();
pageInfo.setSize(5);
int tc=userDao.getTotalCount(username);//tc是totalCount的简写,查询数据的总数
pageInfo.setCurrentPage(tc);
int tp=(int)Math.ceil(tc/5.0);//tp为totalPages,查询数据总页数
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;
}
/*
@Override
public List<User> findAll() {
return userDao.findAll();
}
*/
5、进入到Controller中,对原有findAll进行修改:
/*
@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){
PageInfo<User> pageInfo=userService.findAll(currentPage,username);
ModelAndView mv=new ModelAndView();
mv.addObject("pageInfo",pageInfo);
mv.setViewName("user-list");
return mv;
}
但是光这样改,如果运行是会出错的,因为在之前的findAll中,我们设定了mv中加入的是user,对应的前端设计时也是users:
但是现在我们改成了pageInfo,因此修改:
<c:forEach items="${pageInfo.list}" var="user">
并且,我们要实现分页,就需要在界面上加上对应的翻页的按钮,前端部分按钮设计如下:
<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>
<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>
6、翻页效果:
7、搜索功能演示,搜索框中输入l,得到所有以l开头的用户信息。
改进
上述我们已经基本实现了搜索和翻页,但是如果查询出来的用户大于5个点击下一页,发现出现的是所有人的下一页,因此我们需要进行改进
修改controller:
@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;
}
页码显示
原本设计的界面上,是没有显示页码的,仅有四个按钮“首页”“上一页”“下一页”“尾页”
现在要想显示页数,可以在前端上修改代码:
</div>
<!-- /.box-footer-->
<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>
可以看到界面中出现了页数按钮,同样可以通过点击页数直接跳转到目标页面。