Java学习笔记_04_SSM编写的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参数,会重写查询词

四.演示效果:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值