GVKun编程网logo

php自定义分页类(php实现分页)

16

本文将为您提供关于php自定义分页类的详细介绍,我们还将为您解释php实现分页的相关知识,同时,我们还将为您提供关于Cakephp3自定义分页、Django自定义分页类、java自定义分页工具(自定义

本文将为您提供关于php自定义分页类的详细介绍,我们还将为您解释php实现分页的相关知识,同时,我们还将为您提供关于Cakephp 3 自定义分页、Django 自定义分页类、java自定义分页工具(自定义分页工具类)、jsp自定义分页标签page的实用信息。

本文目录一览:

php自定义分页类(php实现分页)

php自定义分页类(php实现分页)

<?PHP
class Paging
{
    private $totalStrip;  //总条数
    private $pageStrip;   //每页条数
    private $totalPages;  //总页数
    private $url;         //当前页面的url
    private $NowPage;     //当前的页码
    private $aroundPage;  //当前页左右条数
    public function __construct($totalStrip,$pageStrip,$aroundPage)
    {
        $this->totalStrip = $totalStrip;           //总条数
        $this->pageStrip = $pageStrip??5;          //每页条数
        $this->totalPages = $this->getTotalPages();//总页数
        $this->url = $this->getUrl();              //当前页面的url
        $this->NowPage = $this->getNowPage();      //当前的页码
        $this->aroundPage = $aroundPage??2;        //当前页左右条数
    }
    //总页数
    private function getTotalPages()
    {
        return ceil($this->totalStrip/$this->pageStrip);
    }
    //当前页面的url
    private function getUrl()
    {
        return $_SERVER['REQUEST_SCHEME'].'://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'];
    }
    //当前的页码
    private function getNowPage()
    {
        return isset($_GET['page'])?$_GET['page']:1;
    }
    //首页
    private function firstPage()
    {
        return "<a href='{$this->url}?page=1'>首页</a>";
    }
    //上一页
    private function prevPage()
    {
        $prevPage = $this->NowPage - 1;
        return "<a href='{$this->url}?page={$prevPage}'>上一页</a>";
    }
    //当前页之前
    private function leftPage()
    {
        $str = '';
        for($i=$this->aroundPage; $i >= 1; $i--){
            $Page = $this->NowPage-$i;
            if($Page > 0){
                $str .= "<a href='{$this->url}?page=$Page'>$Page</a>";
            }

        }
        return $str;
    }
    //当前页
    private function toNowPage()
    {
        return "<a>$this->NowPage</a>";
    }
    //当前页之后
    private function rightPage()
    {
        $str = '';
        for($i=1; $i <= $this->aroundPage; $i++){
            $Page = $this->NowPage+$i;
            if($Page < $this->totalPages) {
                $str .= "<a href='{$this->url}?page=$Page'>$Page</a>";
            }
        }
        return $str;
    }
    //下一页
    private function nextPage()
    {
        $nextPage = $this->NowPage + 1;
        return "<a href='{$this->url}?page={$nextPage}'>下一页</a>";
    }
    //尾页
    private function lastPage()
    {
        return "<a href='{$this->url}?page=$this->totalPages'>尾页</a>";
    }
    public function show()
    {
        $str = "";
        if($this->NowPage > 1){
            $str .= $this->firstPage();
            $str .= $this->prevPage();
            $str .= $this->leftPage();
        }


        $str .= $this->toNowPage();
        if($this->NowPage < $this->totalPages){
            $str .= $this->rightPage();
            $str .= $this->nextPage();
            $str .= $this->lastPage();
        }

        return $str;
    }
}
//$a = new Paging(20,3,2);
//echo $a->show();

  

Cakephp 3 自定义分页

Cakephp 3 自定义分页

如何解决Cakephp 3 自定义分页?

使用 CakePHP 3.9。 我在单个查询中做了一个具有多个连接的页面,使其成为一个复杂的查询。 我想对该页面进行分页。 我尝试在一个模型中使用 paginate 和 paginateCount 函数,该函数在 CakePHP 2x 之前运行良好。 但它只给出主表结果,不包括连接。 任何成功解决此问题的人都请帮助我。

我的查询如下

SELECT
    Table1.*,Table2.*,Table3.*,Table4.* 
FROM
    (
        SELECT some columns 
        FROM some table 
        WHERE mulitple conditions 
    )
    as Table1 
LEFT JOIN
    (
        SELECT some columns 
        FROM some table 
        join another table 
        WHERE mulitple conditions
    )
    as Table2 
    ON Table1.column1 = Table2.column1 
LEFT JOIN
    (
        SELECT some columns 
        FROM some table 
        join another table 
        WHERE multiple conditions
    )
    as Table3 
    ON Table1.column1 = Table3.column1 
LEFT JOIN
    (
        SELECT some columns 
        FROM some table 
        join another table 
        WHERE multiple conditions
    )
    as Table4 
    ON Table1.column1 = Table4.column1

在 CakePHP2.x 中使用 paginate 和 paginateCount 函数进行自定义查询分页很简单,但我无法在 CakePHP3.x 中做同样的事情

有没有做这个 CakePHP3.x 的参考。

谢谢

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

Django 自定义分页类

Django 自定义分页类

分页类代码:

class Page(object):
''''''
自定义分页类
可以实现Django ORM数据的的分页展示
输出HTML代码:

使用说明:
from utils import mypage
page_obj = mypage.Page(total_num, current_page, ''publisher_list'')
publisher_list = data[page_obj.data_start:page_obj.data_end]
page_html = page_obj.page_html()

为了显示效果,show_page_num最好使用奇数
''''''

def __init__(self, total_num, current_page, url_prefix, per_page=10, show_page_num=9):
''''''

:param total_num: 数据总条数
:param current_page: 当前访问的页码
:param url_prefix: 分页代码里a标签的前缀
:param per_page: 每一页显示多少数据
:param show_page_num: 页面上最多显示多少个页码


''''''
self.total_num = total_num
self.url_prefix = url_prefix
self.per_page = per_page
self.show_page_num = show_page_num
# 根据传入的值计算当前页码左右放置多少个页码
self.half_show_page_num = self.show_page_num // 2
# 计算当前数据总共需要多少页码
total_page, more = divmod(self.total_num, self.per_page)
# 如果有余数就把页码加1
if more:
total_page += 1
self.total_page = total_page
# 数据有效性校验
try:
current_page = int(current_page)
except Exception as e:
current_page = 1
# 如果当前页码数大于总页码数,默认展示最后一页数据
if current_page > self.total_page:
current_page = self.total_page
# 如果当前页码小于1,默认展示第一页数据
if current_page < 1:
current_page = 1
self.current_page = current_page
# 计算页面上需要展示的页码范围
# 页码过小处理
if self.current_page - self.half_show_page_num <= 1:
page_start = 1
page_end = show_page_num
# 页码过大处理
elif self.current_page + self.half_show_page_num >= self.total_page:
page_end = self.total_page
page_start = self.total_page - self.show_page_num + 1
# 未超过正常范围
else:
page_start = self.current_page - self.half_show_page_num
page_end = self.current_page + self.half_show_page_num

# 计算得到的最终页码数
self.page_start = page_start
self.page_end = page_end
# 如果计算得到的页码数比总共需要展示页码数多,则把页码结束指定为总页码数
if self.page_end > self.total_page:
self.page_end = self.total_page

@property
def data_start(self):
''''''

:return: 返回当前页面应该从哪里开始切数据
''''''
return (self.current_page - 1) * self.per_page

@property
def data_end(self):
''''''

:return: 返回当前页面从哪里结束数据
''''''
return self.current_page * self.per_page

def page_html(self):
li_list = []
# 添加前面的nav和ul标签
li_list.append("""
<nav aria-label="Page navigation">
<ul>
""")
# 添加首页
li_list.append(''<li><a href="/{}/?page=1">首页</a></li>''.format(self.url_prefix))
# 添加上一页
if self.current_page <= 1: # 没有上一页
prev_html = ''<li><a aria-label="Previous"><span aria-hidden="true">&laquo;</span></a></li>''
else:
prev_html = ''<li><a href="/{}/?page={}" aria-label="Previous"><span aria-hidden="true">&laquo;</span></a></li>''.format(
self.url_prefix,
self.current_page - 1)
li_list.append(prev_html)
# 循环添加内部所有的页码
for i in range(self.page_start, self.page_end + 1):
if i == self.current_page:
tmp = ''<li><a href="/{0}/?page={1}">{1}</a></li>''.format(self.url_prefix, i)
else:
tmp = ''<li><a href="/{0}/?page={1}">{1}</a></li>''.format(self.url_prefix, i)
li_list.append(tmp)
# 添加下一页
if self.current_page >= self.total_page: # 表示没有下一页
next_html = ''<li><a aria-label="Previous"><span aria-hidden="true">&raquo;</span></a></li>''
else:
next_html = ''<li><a href="/{}/?page={}" aria-label="Previous"><span aria-hidden="true">&raquo;</span></a></li>''.format(
self.url_prefix, self.current_page + 1)
li_list.append(next_html)
# 添加尾页
li_list.append(''<li><a href="/{}/?page={}">尾页</a></li>''.format(self.url_prefix, self.total_page))
# 添加结尾nav和ul标签
li_list.append("""
</ul>
</nav>
""")
# 将生成的标签拼接成一个大字符串
page_html = ''''.join(li_list)
return page_html


导入文件后调用代码:
# 获取分页所需数据
total_num = data.count() # 获取数据总计条数
current_page = request.GET.get(''page'') # 获取当前页页码
url_prefix = request.path_info.strip(''/'') # 获取a标签所需参数


# 调用分页类
# 调用类传入参数生成实例
page_obj = mypage.Page(total_num, current_page, url_prefix, per_page=1)
# 按照分页所需数据对总数据进行分割获取当前页面所需展示的数据
data = data[page_obj.data_start:page_obj.data_end]
# 获取HTML代码
page_html = page_obj.page_html()


java自定义分页工具(自定义分页工具类)

java自定义分页工具(自定义分页工具类)

  1. 分页的工具类一直都不会写,没有理解里面几个属性的意思,趁这个时间看了一下别人写的分页工具类,然后自己也模仿写了一个分页的工具类,虽然有很多已经封装好了的分页工具,pagehelp什么的,但是如果不能用那个呢,还是要自己动手写一个分页工具类的。
    这里是原博主的链接
  2. 虽然现在有很多好用的框架,对分页进行支持,很简单的就把分页的效果做出来,但是如果手动实现分页效果又如何呢?
  3. (1)分页的思路
    首先我们得知道写分页代码时的思路,保持思路清晰,有步骤的进行,才能行云如水。先来看看分页的效果

    在这里插入图片描述


    这就是一个分页导航,其中能得到的数据有

totalRecord:总共员工数,数据库中总的记录数,这里有55条

totalPage:总页数,11页

pageSize:每页显示的记录数,这里可以看到每页显示5条

pageNum:当前页为第几页,比如图中就为第9页,因为9是没有超链接的,

start:总共能显示5页,让用户进行点击,7为起始页

end:11为能显示的尾页,也就是,如果用户点击第8页,那么start就为6,end就为10,每次都只有5页共点击查询。

每次能够得到对应页数所需要的5条数据,等等这些数据都要在jsp中显示出来,也就是说,每次都要从后台拿那么多数据过来进行显示,所以我们就想办法把这些数据封装在一个javabean当中,每次后台都将查询到的数据放入javabean对象中,我们只需要将该对象存入request作用域,然后在jsp页面中从域中获取需要的数据即可。
(2)创建PageBean存放数据
总共需要8个属性pageNum、pageSize、totalRecord、totalPage、startIndex、list、start、end,

pageNum、pageSize、totalRecord:通过构造方法就能得到。pageNum请求页面提交过来的参数,pageSize是自己设置的,totalRecord是查询数据库得到的
totalPage、startIndex、start、end是通过内部算法得出,
list需要通过查询数据库在通过set方式得到。

注意:该类使用泛型是为了不仅仅在这个项目中使用,在别的项目中也同样可以使用
PageBean.java 分页工具类

package com.onlinesearch.utils;
import java.util.List;

/**
 * 尝试写公共的分页工具
 * @author Mr.zhou
 */
public class PageBean<T> {

    // 已知数据
    private int pageNum; // 当前页的数据
    private int pageSize; // 每页显示的数据
    private int totalRecord; // 总的记录条数,通过查询数据得到

    // 需要计算的数据
    private int totalPage; // 总页数,通过pageSzie/totalRecord得到

    // 开始索引,也就是我们在数据库中要从第几行数据开始拿,有了startIndex和pageSize
    // 就知道了limit语句的两个数据,就能拿到每页能显示的数据了
    private int startIndex;

    // 将每页需要显示的数据放在list集合中
    private List<T> list;

    //分页显示的页数,比如页面显示的是1,2,3,4,5页,start就为1,end就为5,这个也是需要算过来的
    private int start;
    private int end;

    // 通过pageNum,pageSize,totalRecord可以获取totalRecord和startIndex
    // 通过构造方法初始化这些属性
    public PageBean(int pageNum, int pageSize, int totalRecord) {
        this.pageNum = pageNum;
        this.pageSize = pageSize;
        this.totalRecord = totalRecord;

        // 计算totalPage总页数
        if (totalRecord/pageSize == 0) {
            // 如果整除了,正好每页显示pageSize条数据,
            this.totalPage = totalRecord/pageSize;
        }else {
            // 如果不整除,需要另外添加一页来显示多余的数据
            this.totalPage = totalRecord/pageSize + 1;
        }

        //计算开始索引 公式就是(第几页-1)* 每页需要显示的数据
        this.startIndex = (pageNum-1)*pageSize;

        this.start = 1;
        this.end = 5;

        // 显示页数的算法
        // 显示5页
        // 如果总页数小于5条
        if (totalPage <= 5) {
            // 那么end就是总页数的值了
            this.end = this.totalPage;
        }else {
            // 如果总页数大于5条,那么就要根据当前页来判断start和end为多少了
            this.start = pageNum -2;
            this.end = pageNum + 2;
            if (start < 0) {
                // 如果当前页是第一页,或者第二页,就不按照这个规则了
                this.start = 1;
                this.end = 5;
            }
            if (end > this.totalPage) {
                // 如果当前页是倒数第二页或者倒数第一页,同样页不按照这个规则了
                this.end = totalPage;
                this.start = end - 5;
            }
        }
    }

    public int getPageNum() {
        return pageNum;
    }

    public void setPageNum(int pageNum) {
        this.pageNum = pageNum;
    }

    public int getPageSize() {
        return pageSize;
    }

    public void setPageSize(int pageSize) {
        this.pageSize = pageSize;
    }

    public int getTotalRecord() {
        return totalRecord;
    }

    public void setTotalRecord(int totalRecord) {
        this.totalRecord = totalRecord;
    }

    public int getTotalPage() {
        return totalPage;
    }

    public void setTotalPage(int totalPage) {
        this.totalPage = totalPage;
    }

    public int getStartIndex() {
        return startIndex;
    }

    public void setStartIndex(int startIndex) {
        this.startIndex = startIndex;
    }

    public List<T> getList() {
        return list;
    }

    public void setList(List<T> list) {
        this.list = list;
    }

    public int getStart() {
        return start;
    }

    public void setStart(int start) {
        this.start = start;
    }

    public int getEnd() {
        return end;
    }

    public void setEnd(int end) {
        this.end = end;
    }
}

User.java 实体类

package com.onlinesearch.pojo;

import lombok.Data;

/**
 * @author Mr.zhou
 */
@Data
public class User {
    private String id;
    private String name;
    private String age;
    private String sex;
    private String idCard;
}

先写一个mapper接口
UserMapper.java

package com.onlinesearch.mapper;

import com.onlinesearch.pojo.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

@Mapper
public interface UserMapper {

    /**
     * 获取全部用户
     * @return
     */
    List<User> findAllUser();

    /**
     * 分页获取用户数据
     * @param startIndex
     * @param pageSize
     * @return
     */
    List<User> findAll(@Param("startIndex") int startIndex, @Param("pageSize") int pageSize);
}

UserMapper.xml 文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.onlinesearch.mapper.UserMapper">

        <resultMap id="UserResultEntity" type="com.onlinesearch.pojo.User">
            <result column="id" property="id"/>
            <result column="name" property="name"/>
            <result column="age" property="age"/>
            <result column="sex" property="sex"/>
            <result column="idcard" property="idCard"/>
        </resultMap>

    <select id="findAll"  resultMap="UserResultEntity">
        select id,name,age,sex,idcard from tb_user limit #{startIndex},#{pageSize}
    </select>

    <select id="findAllUser" resultType="com.onlinesearch.pojo.User">
        select id,name,age,sex,idcard from tb_user
    </select>
</mapper>

UserService.java 接口

package com.onlinesearch.service;


import com.onlinesearch.utils.PageBean;
import com.onlinesearch.pojo.User;


/**
 * @author Mr.zhou
 */
public interface UserService {

    /**
     * 获取每页的用户数据
     * @param pageNum
     * @param pageSize
     * @return
     */
    PageBean<User> findAllUserWithPage(int pageNum, int pageSize);
}

UserServiceImpl.java 实现类

package com.onlinesearch.service.impl;

import com.onlinesearch.utils.PageBean;
import com.onlinesearch.service.UserService;
import com.onlinesearch.pojo.User;
import com.onlinesearch.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;


/**
 * @author Mr.zhou
 */
@Service
public class UserServiceImpl implements UserService {

    @Autowired(required = false)
    private UserMapper userMapper;

    @Override
    public PageBean<User> findAllUserWithPage(int pageNum,int pageSize) {
        // 在这里就要将PageBean里面的数据创建好(初始化好)然后将对象返回回去
        // 先从数据库中获取所有用户的全部数量,获得totalRecord
        List<User> allUser = userMapper.findAllUser();
        int totalRecord = allUser.size();
        // 有了三个初始工具,就能够创建PageBean对象了
        PageBean<User> pageBean = new PageBean<>(pageNum,pageSize,totalRecord);
        // 获取PageBean对象中的startIndex (从数据库中的第几行开始拿)
        int startIndex = pageBean.getStartIndex();
        // 有了startIndex和pageSize,就可以拿到每页的数据了
        pageBean.setList(userMapper.findAll(startIndex,pageSize));
        return pageBean;
    }
}

UserController.java 控制层

package com.onlinesearch.controller;

import com.onlinesearch.utils.PageBean;
import com.onlinesearch.service.UserService;
import com.onlinesearch.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@ResponseBody
@RequestMapping("test")
public class UserController {

    @Autowired
    private UserService userService;
    @RequestMapping("/test")
    public PageBean<User> test() {
        // 第一个参数是前端传过来的,表示第几页,第二个参数表示每页显示几条数据也可以从前端传过来
        // 只需要三个参数就可以实现分页了,总数(后端获得),第几页(前端传过来),每页的数量(前端传过来,也可以写死)
        PageBean<User> allUserWithPage = userService.findAllUserWithPage(2,5);
        // 可以返回json,也可以返回视图,将数据放到request中都行
        return allUserWithPage;
    }
}

最后结果:

在这里插入图片描述

jsp自定义分页标签page

jsp自定义分页标签page

日常工作项目里,分页是十分常见的,网上也有大把的分页插件,性能和美观程度都比较不错,但是有时候并不一定能满足我们的需求,因为大部分的分页插件都是在客户端分页,有的甚至需要你一次性查询出所有的数据放入内存,在内存进行分页,而且分也时,只是单纯分页只接受页码,并不能传入本页的某些参数到另一个页面做重新查询的条件,进而重新分页。

            

             根据jsp自定义分页标签的特性,我们可以定制自己的分页标签,更加方便开发中的使用,关于jsp的自定义标签,上篇已有详细的介绍说明,http://jackjobs.iteye.com/admin/blogs/1827385

 

             

              该页最下面的 分页栏,即是自定义的jsp的标签,我这里给的名字是<page:page pager="${requestScope.pb}" />,即只要引入它即可出现该分页栏,由于为了方便,样式可能不太好看,这个大家可以自己去调节。

 

                   下面我们开始实现这个page标签,首先新建一个web项目,并引入struts必要地几个jar包。新建一个包,取名为com.page.util,将page的三个实现类放在下面,分别是Pager.java,PagerHelp.java,PageTag.java,它们的实现分别如下:

 

Pager.java:

Java代码 
  1. /** 
  2.  * 保存分页信息的类 
  3.  *  
  4.  *  
  5.  */  
  6. public class Pager {  
  7.     private int totalRows; // 总行数  
  8.   
  9.     private int pageSize = 10// 每页显示的行数  
  10.   
  11.     private int currentPage; // 当前页号  
  12.   
  13.     private int totalPages; // 总页数  
  14.   
  15.     private int startRow; // 当前页在数据库中的起始行  
  16.   
  17.     private String linkUrl; // 要跳转的URL  
  18.   
  19.     public Pager() {  
  20.     }  
  21.   
  22.     public Pager(int _totalRows) {  
  23.         totalRows = _totalRows;  
  24.         totalPages = totalRows / pageSize;  
  25.         int mod = totalRows % pageSize;  
  26.         if (mod > 0) {  
  27.             totalPages++;  
  28.         }  
  29.         currentPage = 1;  
  30.         startRow = 0;  
  31.     }  
  32.   
  33.   
  34.     /** 
  35.      * 设定查询的起始行数 
  36.      *  
  37.      * @param currentPage 
  38.      */  
  39.   
  40.     public void setStart(int currentPage) {  
  41.         this.currentPage = currentPage;  
  42.         startRow = (currentPage - 1) * pageSize;  
  43.     }  
  44.   
  45.     public int getTotalRows() {  
  46.         return totalRows;  
  47.     }  
  48.   
  49.     public void setTotalRows(int totalRows) {  
  50.         this.totalRows = totalRows;  
  51.     }  
  52.   
  53.     public int getPageSize() {  
  54.         return pageSize;  
  55.     }  
  56.   
  57.     public void setPageSize(int pageSize) {  
  58.         this.pageSize = pageSize;  
  59.     }  
  60.   
  61.     public int getCurrentPage() {  
  62.         return currentPage;  
  63.     }  
  64.   
  65.     public void setCurrentPage(int currentPage) {  
  66.         this.currentPage = currentPage;  
  67.     }  
  68.   
  69.     public int getTotalPages() {  
  70.         return totalPages;  
  71.     }  
  72.   
  73.     public void setTotalPages(int totalPages) {  
  74.         this.totalPages = totalPages;  
  75.     }  
  76.   
  77.     public int getStartRow() {  
  78.         return startRow;  
  79.     }  
  80.   
  81.     public void setStartRow(int startRow) {  
  82.         this.startRow = startRow;  
  83.     }  
  84.   
  85.     public String getLinkUrl() {  
  86.         return linkUrl;  
  87.     }  
  88.   
  89.     public void setLinkUrl(String linkUrl) {  
  90.         this.linkUrl = linkUrl;  
  91.     }  
  92.   
  93. }  

 

PagerHelp.java:

Java代码 
  1. import javax.servlet.http.HttpServletRequest;  
  2.   
  3.   
  4. /** 
  5.  * 控制分页的类 
  6.  *  
  7.  *  
  8.  */  
  9. public class PagerHelper {  
  10.   
  11.     public static Pager getPager(HttpServletRequest req,  
  12.             int totalRows) {  
  13.   
  14.         // 定义pager对象,用于传到页面  
  15.         Pager pager = new Pager(totalRows);  
  16.   
  17.         // 从Request对象中获取当前页号  
  18.         String currentPage = req.getParameter("cpage");  
  19.   
  20.         // 如果当前页号为空,表示为首次查询该页  
  21.         // 如果不为空,则刷新pager对象,输入当前页号等信息  
  22.         if (currentPage != null) {  
  23.             pager.setStart(Integer.parseInt(currentPage));  
  24.         } else {  
  25.             pager.setStart(1);  
  26.         }  
  27.         return pager;  
  28.     }  
  29. }  

 

 

PageTag.java:

Java代码 
  1. import java.io.IOException;  
  2.   
  3. import javax.servlet.jsp.JspWriter;  
  4. import javax.servlet.jsp.tagext.TagSupport;  
  5.   
  6.   
  7. /** 
  8.  * 标签类 用于分页查询 
  9.  * 
  10.  */  
  11. public class PageTag extends TagSupport {  
  12.     /**   
  13.     *    
  14.     */  
  15.     private static final long serialVersionUID = 1L;  
  16.   
  17.     private Pager pager;  
  18.   
  19.     @SuppressWarnings("static-access")  
  20.     public int doStartTag() {  
  21.         ////标签开始时调用的方法  
  22.         try {  
  23.             JspWriter out = pageContext.getOut();  
  24.             if(pager==null){  
  25.                 out.print("没有记录");  
  26.                 out.flush();  
  27.                 return super.SKIP_BODY;  
  28.             }  
  29.               
  30.             out.print("第 " + pager.getCurrentPage() + " 页/共 "  
  31.                     + (pager.getTotalPages()) + " 页");  
  32.   
  33.             if (pager.getCurrentPage() == 1) {  
  34.                 out.print("[最首页]");  
  35.                 out.print("[上一页]");  
  36.             }  
  37.             if (pager.getCurrentPage() != 1) {  
  38.                 out.print("[<a href=''" + pager.getLinkUrl()  
  39.                         + "?cpage=1''>最首页</a>]");  
  40.                 out.print("[<a href=''" + pager.getLinkUrl() + "?cpage="  
  41.                         + (pager.getCurrentPage() - 1) + "''>上一页</a>]");  
  42.             }  
  43.   
  44.             for (int i = pager.getCurrentPage() - 3; i <= pager  
  45.                     .getCurrentPage() + 3; i++) {  
  46.                 if (i <= 0 || i > pager.getTotalPages()) {  
  47.                     continue;  
  48.                 }  
  49.                 if (i == pager.getCurrentPage()) {  
  50.                     out  
  51.                             .print("[<span color:#FF0000; border: 1px solid #cccccc; font-weight:bold; width:15px;text-align: center;''> "  
  52.                                     + i + " </span>]");  
  53.                 } else {  
  54.                     out.print("[<a href=''" + pager.getLinkUrl() + "?cpage="  
  55.                             + i + "''> " + i + " </a>]");  
  56.                 }  
  57.             }  
  58.             if (pager.getCurrentPage() == pager.getTotalPages()  
  59.                     || pager.getTotalPages() == 0) {  
  60.                 out.print("[下一页]");  
  61.                 out.print("[最末页]");  
  62.   
  63.             }  
  64.             if (pager.getCurrentPage() != pager.getTotalPages()  
  65.                     && pager.getTotalPages() != 0) {  
  66.                 out.print("[<a href=''" + pager.getLinkUrl() + "?cpage="  
  67.                         + (pager.getCurrentPage() + 1) + "''>下一页</a>]");  
  68.                 out.print("[<a href=''" + pager.getLinkUrl() + "?cpage="  
  69.                         + (pager.getTotalPages()) + "''>最末页</a>]");  
  70.             }  
  71.             out.flush();  
  72.         } catch (IOException ex) {  
  73.             ex.printStackTrace();  
  74.         }  
  75.         return super.SKIP_BODY;//表示不显示标签间的文字  
  76.     }  
  77.   
  78.     @SuppressWarnings("static-access")  
  79.     public int doEndTag() {  
  80.         //标签结束时调用的方法  
  81.         return super.EVAL_PAGE;//表示JSP页面继续运行  
  82.     }  
  83.   
  84.     public void setPager(Pager pager) {  
  85.         this.pager = pager;  
  86.     }  
  87.   
  88.     public Pager getPager() {  
  89.         return pager;  
  90.     }  
  91. }  

 

                          实现类的完成即是为了实现标签的功能,这里我们在WEB-INF下新建文件夹mytag,新建文件pagetag.tld,在这个文件里对你想要声明的自定义标签,并制定它的实现类,代码如下:

Tld代码 
  1. <!DOCTYPE taglib    
  2. PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"    
  3.    "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">   
  4. <taglib xmlns="http://java.sun.com/JSP/TagLibraryDescriptor">   
  5. <tlib-version>1.0</tlib-version>   
  6. <jsp-version>1.2</jsp-version>   
  7. <short-name>My Tags</short-name>   
  8. <tag>   
  9.     <name>page</name>   
  10.     <tag-class>com.page.util.PageTag</tag-class>  
  11.     <body-content>empty</body-content>   
  12.     <attribute>   
  13.       <name>pager</name>   
  14.       <required>true</required>   
  15.       <rtexprvalue>true</rtexprvalue>   
  16.       <type>com.page.util.Pager</type>  
  17.     </attribute>   
  18. </tag>   
  19. </taglib>   

 

                    至此,我们的自定义page分页标签业已全部实现了,下面我们就来模拟使用下,新建com.action.TestAction.java,代码如下:

Java代码 
  1. import java.util.ArrayList;  
  2. import java.util.List;  
  3.   
  4. import com.bean.TestBean;  
  5. import com.util.Pager;  
  6. import com.util.PagerHelper;  
  7.   
  8. public class TestAction extends BaseAction {  
  9.       
  10.     private static final long serialVersionUID = 5293541447709620793L;  
  11.     private List<TestBean> bList;  
  12.   
  13.     @Override  
  14.     public String execute() throws Exception {  
  15.         bList=new ArrayList<TestBean>();  
  16.         for (int i = 0; i < 100; i++) {  
  17.             bList.add(new TestBean(Long.parseLong(String.valueOf(i)), "person"+i, i+10+"岁", i+"@qq.com"));  
  18.         }  
  19.         int totalRow=bList.size();  
  20.         Pager pager=null;  
  21.         pager = PagerHelper.getPager(request, totalRow); // 初始化分页对象  
  22.         pager.setLinkUrl(request.getRequestURI()); // 设置跳转路径  
  23.         request.setAttribute("pb", pager); // 将分页信息保存在Request对象  
  24.           
  25.           
  26.         //模拟分页时,是要传递参数,模拟传入a,b。单纯分页时,则不需要该段的4行代码  
  27.         StringBuffer urlParam = new StringBuffer();  
  28.         urlParam.append("&a="+100);  
  29.         urlParam.append("&b="+200);  
  30.         request.setAttribute("urlParam", urlParam.toString());  
  31.   
  32.           
  33.         bList=bList.subList(pager.getStartRow(),pager.getStartRow()+10);  
  34.         return SUCCESS;  
  35.     }  
  36.   
  37.       
  38.       
  39.     public List<TestBean> getbList() {  
  40.         return bList;  
  41.     }  
  42.   
  43.     public void setbList(List<TestBean> bList) {  
  44.         this.bList = bList;  
  45.     }  
  46.       
  47.       
  48. }  

 

                    这个类模拟了数十条的分页数据,下面新建两个jsp页面,代码分页如下:

index.jsp:

Jsp代码 
  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
  2. <%  
  3. String path = request.getContextPath();  
  4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
  5. %>  
  6.   
  7. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  8. <html>  
  9.   <head>  
  10.     <base href="<%=basePath%>">  
  11.       
  12.     <title>My JSP ''index.jsp'' starting page</title>  
  13.     <meta http-equiv="pragma" content="no-cache">  
  14.     <meta http-equiv="cache-control" content="no-cache">  
  15.     <meta http-equiv="expires" content="0">      
  16.     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  
  17.     <meta http-equiv="description" content="This is my page">  
  18.     <!--  
  19.     <link rel="stylesheet" type="text/css" href="styles.css">  
  20.     -->  
  21.   </head>  
  22.     
  23.   <body>  
  24.     <a href="test.action">Test Go~~</a>  
  25.   </body>  
  26. </html>  

 

test.jsp:

Jsp代码 
  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
  2. <%@ taglib prefix="s" uri="/struts-tags" %>  
  3. <%@ taglib prefix="page" uri="../WEB-INF/config/mytag/pagetag.tld" %>  
  4.   
  5. <%  
  6. String path = request.getContextPath();  
  7. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
  8. %>  
  9.   
  10. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  11. <html>  
  12.   <head>  
  13.     <base href="<%=basePath%>">  
  14.       
  15.     <title>My JSP ''index.jsp'' starting page</title>  
  16.     <meta http-equiv="pragma" content="no-cache">  
  17.     <meta http-equiv="cache-control" content="no-cache">  
  18.     <meta http-equiv="expires" content="0">      
  19.     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  
  20.     <meta http-equiv="description" content="This is my page">  
  21.     <!--  
  22.     <link rel="stylesheet" type="text/css" href="styles.css">  
  23.     -->  
  24.       
  25.   <script type="text/javascript" src="../js/Pager.js"></script>  
  26.   </head>  
  27.     
  28.   <body>  
  29.   <div style="margin-left: 110px;">  
  30.     <table>  
  31.         <tr>  
  32.             <th colspan="4" ><p style="font-family: sans-serif;font-size: 20px">测试分页</p></th>  
  33.         </tr>  
  34.         <tr>  
  35.             <td width="80px">ID</td>  
  36.             <td width="80px">Name</td>  
  37.             <td width="80px">Age</td>  
  38.             <td width="80px">Email</td>  
  39.         </tr>  
  40.         <s:iterator value="bList">  
  41.             <tr>  
  42.                 <td width="80px"><s:property value="tId"/> </td>  
  43.                 <td width="80px"><s:property value="tName"/> </td>  
  44.                 <td width="80px"><s:property value="tAge"/> </td>  
  45.                 <td width="80px"><s:property value="tEmail"/> </td>  
  46.             </tr>  
  47.         </s:iterator>  
  48.     </table>  
  49.    
  50.   </div>  
  51.         <p style="margin-left: 17px">  
  52.             <page:page pager="${requestScope.pb}" />  
  53.         </p>  
  54.   </body>  
  55.   <script>  
  56.     Pager.setUrlParam("${urlParam}");  
  57. </script>   
  58. </html>  

 这个页面会使用到page标签,及在文件头引入所需的taglib,并引入Pager.js,该js的代码如下:

Js代码 
  1. /** 
  2.  * 分页操作对象 
  3.  */  
  4. var Pager = function(){  
  5.     return{  
  6.             setUrlParam: function(param)  
  7.             {  
  8.                 //为翻页标签链接增加显示flag参数  
  9.                 var obj=$(".pagerTarge > a");//获得分页标签下的所有<a>  
  10.                 //alert(obj.length);  
  11.                 if(obj!=null && obj.length>0)  
  12.                 {  
  13.                     for(var i=0;i<obj.length;i++)  
  14.                     {  
  15.                         var tempUrl=$(obj[i]).attr(''href'');  
  16.                         //添加flag  
  17.                         $(obj[i]).attr(''href'',tempUrl+param);  
  18.                     }  
  19.                 }  
  20.         }  
  21.     }  
  22. }();      

 

 

                至此,在web.xml和struts.xml中做好各项配置,启动服务器,键入localhost:8080/mytag/index.jsp,点击"Test Go~~"链接,即出现截图效果,如有报错,请根据错误检查各项配置。

 

               如果需要在分页时,在页面间传递参数,如以上action代码中模拟的a和b的话,即全部用stringbuffer拼接就可以了,我们右键test.jsp效果页面时,可以看到传递的参数url,如图:


关于php自定义分页类php实现分页的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于Cakephp 3 自定义分页、Django 自定义分页类、java自定义分页工具(自定义分页工具类)、jsp自定义分页标签page等相关知识的信息别忘了在本站进行查找喔。

本文标签: