Web项目实现翻页
一.创建封装每一页内容的类PageInfo
1.PageInfo应该有的成员变量这些:
private List<T> list;
private int size;
private int totalPage;
private int totalCount;
private int currentPage;
其中list是user类的一个集合,用于存储本页显示的user对象。size原来存储每页的最大记录数,用totalPage存储总页数。totalCount来记录总共有多少条记录,随后使用currentPage来记录当前在哪个页面。
2.使用Alt+insert补齐代码并重写toSting方法
二.Dao层定义并实现新接口
1.在UserDao中定义相关接口:
List<User> findAll(@Param("start") int start,@Param("username") String username);
int getTotalCount(@Param("username") String username);
2.在UserMapper.xml中实现相关接口:
<select id="getTotalCount" parameterType="String" resultType="int">
select count(*) from tb_user
<if test="username!=null and username!=''">
where username like concat("%",#{username},"%")
</if>
</select>
<select id="findAll" parameterType="String" resultType="user">
select * from tb_user
<if test="username!=null and username!=''">
where username like concat("%",#{username},"%")
</if>
limit #{start},5
三.Service层定义并实现新接口
1.在UserService中定义相关接口:
PageInfo<User>findAll(int currentPage,String username);
这个方法兼容两个操作,无论是选择某个关键词进行检索,还是直接将所有玩家遍历出来,他们要进行操作的SQL都是相似的,只不过检索关键词要用WHERE语句指定条件
2.实现新接口接口:
@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);
}
int start = (pageInfo.getCurrentPage()-1)*5;
if(start<0){
start=0;
}
List<User> userList=userDao.findAll(start,username);
pageInfo.setList(userList);
return pageInfo;
}
这里的findAll方法通过调研userDao中的方法得到数据库中的数据,首先通过pageInfo.setSize(5);方法来指定每页的数据记录数,然后通过
userDao.getTotalCount(username)来获取符合查询条件的记录数,并且以此可以计算出应该划分为多少页,同时通过指定页码和索引关键词来在数据库中查询5行数据,最后把得到的所有信息封装到pageInfo中返回
三.UserController处理用户请求
@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("serachName");
}
PageInfo<User> pageInfo=userService.findAll(currentPage,username);
ModelAndView mv=new ModelAndView();
//键值对
mv.addObject("pageInfo",pageInfo);
//跳转页面
mv.setViewName("user-list");
return mv;
}
为什么会传递进来一个type变量呢这是因为如图的翻页的几个按钮是通用的,不管是查询某个关键词的用户的信息后得到的结果页还是展示所有用户的信息的结果页都是使用的这几个按钮。
为了区分这两种可能,如下图,在点击查询按钮是还会传递type=1,这会告诉后端是在进行查询操作
在进行查询操作的时候,通过以下语句来锁定向数据库中查找数据的时候的关键词,在这种情况下,每次点击下一页得到的不会被定向到查询全部玩家的页面去
if(type==1){
session.setAttribute("searchName",username);
}
else {
username=(String)session.getAttribute("serachName");
}
直到再次查询,再次查询是又会带上type参数,会重写查询词