在用SSM实现CRUD的基础上添加搜索和分页功能
添加的功能是在之前的开发基础上添加的分页和查询功能,使用SSM实现基础的CRUD功能,本次的分页功能主要由后端逻辑代码实现。
1 功能描述和效果展示
之前开发的项目仅仅实现了对数据库的crud功能,查询显示的数据很多的话会一直拉长滑动条
在增加分页功能之后界面更加友好,一齐开发了搜索功能
2 本次开发用到的jsp界面
目前的jsp界面是用中软的老师分享的现成的jsp资源,已征得老师允许放入个人博客展示。
文件目录如下
这部分代码可以通过点击我 获取。
3 功能开发
分页功能是通过后端逻辑实现的,而非前端的组件
(1)实体类 PageInfo
在bean目录下新建一个PageInfo实体类,用来存放每一页显示的信息、和分页的一些参数和属性
package com.tengshan.bean;
import java.util.List;
public class PageInfo<T> { //定义为泛型
private List<T> list; //每一页用一个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目录下的接口
List<User> findAll(@Param("start")int start,@Param("username")String username);
这行代码替换掉之前的findAll方法,此处的@Param注解是用在dao文件中,用于与mapper文件中的sql语句字段对应,将此处的参数传到sql语句里。同时我们修改UserMapper里面的sql语句为
<select id="findAll" resultType="user">
select * from user_ssm
<if test="username!=null and username!=''">
where username like concat("%",#{username},"%")
</if>
limit #{start},8
</select>
替换掉以前findAll的sql语句,之后再在service业务处理层替换同样操作的接口方法,再在impl调用dao目录下的方法实现功能。
PageInfo<User> findAll(int currentPage,String username);//将findAll修改和搜索功能共用
在impl中进行一个逻辑判断,当点击下一页到达最后一页继续currentPage+1时,设置currentPage为totalPage,同理将左边界设置为1,
这里的state用来表示当前页面的第一条数据在数据库中的位置,在state往后的8条数据将会被显示在页面中。再通过userDao将state和username传到sql语句中进行查询,并将查询到的结果存储在userList中
@Override
public PageInfo<User> findAll(int currentPage, String username) {
PageInfo<User> pageInfo = new PageInfo<>();
pageInfo.setSize(8);//每页长度 和 userMapper中一致 每一页显示5条
int totalCount = userDao.getTotalCount(username); //查询总长度
pageInfo.setTotalCount(totalCount);
int totalPage = (int)(totalCount/pageInfo.getSize()) + 1;
pageInfo.setTotalPage(totalPage);
if(currentPage<1){
pageInfo.setCurrentPage(1);
}else if(currentPage>totalPage){
pageInfo.setCurrentPage(totalPage);
}else{
pageInfo.setCurrentPage(currentPage);
}
int start = (pageInfo.getCurrentPage()-1)*pageInfo.getSize(); //开始查询的数
List<User> userList = userDao.findAll(start,username);
pageInfo.setList(userList);
return pageInfo;
}
之后修改控制器代码如下,同样也是替换掉之前的findAll方法
@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);//将username保存到session中
}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;
}
这里传入了四个参数,默认值为1的当前界面,username,默认值为0的标识符以及一个存储信息的session,运行过程如下图
最后修改jsp文件,需要修改pages目录下的user-list.jsp
先将原先遍历user用于展示的user改为遍历存放在pageInfo中的list
<c:forEach items="${pageInfo.list}" var="user">
再在当前的section下添加按钮
<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}" aria-lable="Previous">上一页</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}" aria-lable="Previous">下一页</a></li>
<li><a href="/user/findAll.do?currentPage=${pageInfo.totalPage}" aria-lable="Previous">尾页</a></li>
</ul>
</div>
添加位置
最后运行登陆或直接通过http://localhost:8080/user/findAll.do查看界面