昨天学了一天的自定义标签,大概了解了其原理,就写了一个实现简单分页的程序。

1.它是基于我自己写的分页类(Pager)的,其代码如下:

package com.neusoft.training.database.oe;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts.action.ActionForm;

/**
 * <p>Description: 获得一个page,用于分页。</p>
 * @author  <a href="mailto: chengtj@neusoft.com">程天俊</a>
 * @version $Revision: 1.3 $
 */
public class Pager
{
    /**
     * <p>Discription:查询的总行数</p>
     */
    private int totalRows;

/**
     * <p>Discription:每页显示的记录数</p>
     */
    private int pageSize = 10;

/**
     * <p>Discription:现在所在的页数</p>
     */
    private int currentPage;

/**
     * <p>Discription:总页数</p>
     */
    private int totalPages;

/**
     * <p>Discription:本页的开始行</p>
     */
    private int startRow;
   
    /**
     * <p>Discription:存放查询条件,一般是ActionForm类型的form</p>
     */
    private ActionForm form;

/**
     * <p>Discription:构造一个无参的pager对象</p>
     * @coustructor 方法.
     */
    public Pager()
    {
        this.currentPage = 1;
        this.startRow = 0;
    }
   
    /**
     * <p>Discription:根据request(pagesize和pagemethod)和totalrows设置pager对象的属性</p>
     * @coustructor 方法.
     */
    public void checkRequest(HttpServletRequest httpServletRequest)
    {
        String pageSizep = httpServletRequest.getParameter("pageSize");
        if (pageSizep != null)
        {
            this.pageSize=Integer.parseInt(pageSizep);
        }
       
       
       
        this.totalPages = this.totalRows / this.pageSize;
        int mod = this.totalRows % this.pageSize;
        if (mod > 0)
        {
            this.totalPages++;
        }
       
       
        String currentPage = httpServletRequest.getParameter("currentPage");
        if (currentPage != null)
        {
            this.refresh(Integer.parseInt(currentPage));  
        }
       
        String pagerMethod = httpServletRequest.getParameter("pageMethod");

if (pagerMethod != null)
        {
            if (pagerMethod.equals("first"))
            {
                this.first();
            }
            else if (pagerMethod.equals("previous"))
            {
                this.previous();
            }
            else if (pagerMethod.equals("next"))
            {
                this.next();
            }
            else if (pagerMethod.equals("last"))
            {
                this.last();
            }
        }
    }
  
    /**
     * <p>Discription:获得pager的开始行</p>
     * @return
     * @author:程天俊
     * @update:[日期YYYY-MM-DD] [更改人姓名][变更描述]
     */
    public int getStartRow()
    {
        return startRow;
    }

/**
     * <p>Discription:获得pager的总行数</p>
     * @return
     * @author:程天俊
     * @update:[日期YYYY-MM-DD] [更改人姓名][变更描述]
     */
    public int getTotalPages()
    {
        return totalPages;
    }

/**
     * <p>Discription:获得pager的当前页</p>
     * @return
     * @author:程天俊
     * @update:[日期YYYY-MM-DD] [更改人姓名][变更描述]
     */
    public int getCurrentPage()
    {
        return currentPage;
    }

/**
     * <p>Discription:获得pager的每页显示的记录数</p>
     * @return
     * @author:程天俊
     * @update:[日期YYYY-MM-DD] [更改人姓名][变更描述]
     */
    public int getPageSize()
    {
        return pageSize;
    }

/**
     * <p>Discription:设置pager的总记录数</p>
     * @return
     * @author:程天俊
     * @update:[日期YYYY-MM-DD] [更改人姓名][变更描述]
     */
    public void setTotalRows(int totalRows)
    {
        this.totalRows = totalRows;
    }

/**
     * <p>Discription:设置pager的开始行</p>
     * @return
     * @author:程天俊
     * @update:[日期YYYY-MM-DD] [更改人姓名][变更描述]
     */
    public void setStartRow(int startRow)
    {
        this.startRow = startRow;
    }

/**
     * <p>Discription:设置pager的总页数</p>
     * @return
     * @author:程天俊
     * @update:[日期YYYY-MM-DD] [更改人姓名][变更描述]
     */
    public void setTotalPages(int totalPages)
    {
        this.totalPages = totalPages;
    }

/**
     * <p>Discription:设置pager的当前页</p>
     * @return
     * @author:程天俊
     * @update:[日期YYYY-MM-DD] [更改人姓名][变更描述]
     */
    public void setCurrentPage(int currentPage)
    {
        this.currentPage = currentPage;
    }

/**
     * <p>Discription:设置pager的每页显示的记录数</p>
     * @return
     * @author:程天俊
     * @update:[日期YYYY-MM-DD] [更改人姓名][变更描述]
     */
    public void setPageSize(int pageSize)
    {
        this.pageSize = pageSize;
    }

/**
     * <p>Discription:设置pager的总记录数</p>
     * @return
     * @author:程天俊
     * @update:[日期YYYY-MM-DD] [更改人姓名][变更描述]
     */
    public int getTotalRows()
    {
        return totalRows;
    }

/**
     * <p>Discription:设置pager的首页执行的操作</p>
     * @return
     * @author:程天俊
     * @update:[日期YYYY-MM-DD] [更改人姓名][变更描述]
     */
    public void first()
    {
        currentPage = 1;
        startRow = 0;
    }

/**
     * <p>Discription:设置pager的上一页执行的操作</p>
     * @return
     * @author:程天俊
     * @update:[日期YYYY-MM-DD] [更改人姓名][变更描述]
     */
    public void previous()
    {
        if (currentPage == 1)
        {
            return;
        }
        currentPage--;
        startRow = (currentPage - 1) * pageSize;
    }

/**
     * <p>Discription:设置pager的下一页执行的操作</p>
     * @return
     * @author:程天俊
     * @update:[日期YYYY-MM-DD] [更改人姓名][变更描述]
     */
    public void next()
    {
        if (currentPage < totalPages)
        {
            currentPage++;
        }
        startRow = (currentPage - 1) * pageSize;
    }

/**
     * <p>Discription:设置pager的末页执行的操作</p>
     * @return
     * @author:程天俊
     * @update:[日期YYYY-MM-DD] [更改人姓名][变更描述]
     */
    public void last()
    {
        currentPage = totalPages;
        startRow = (currentPage - 1) * pageSize;
    }

/**
     * <p>Discription:刷新pager的当前页</p>
     * @return
     * @author:程天俊
     * @update:[日期YYYY-MM-DD] [更改人姓名][变更描述]
     */
    public void refresh(int _currentPage)
    {
        currentPage = _currentPage;
        if (currentPage > totalPages)
        {
            last();
        }
    }

public ActionForm getForm()
    {
        return form;
    }

public void setForm(ActionForm form)
    {
        this.form = form;
    }
}
2.获得一个pager的方法,其用法用下:

public Pager getComPager(HttpServletRequest request,
            CommodityTypeForm commodityTypeForm) throws SQLException,
            IllegalAccessException, InvocationTargetException
    {
        Connection conn = DBPool.getPool().getConnection();
        CommodityTypeDao commodityTypeDao = new CommodityTypeDao();
        commodityTypeDao.setConn(conn);
       
        CommodityType commodityType = new CommodityType();
        BeanUtils.copyProperties(commodityType, commodityTypeForm);
        int totalRows = commodityTypeDao.getRows(commodityType);

//创建一个Pager对象,并设置其属性
        Pager pager = new Pager();
        pager.setForm(commodityTypeForm);
        pager.setTotalRows(totalRows);
        pager.checkRequest(request);

if (conn != null)
        {
            conn.close();
        }
        return pager;
    }

3.根据获得的Pager对象去查询记录(主要是在action中用其查询条件form,pagesize和startrow):

if (comTypeId == null)

//如果request中没有form对象来判断是不是分页查询,是就从session中取出Pager对象
            {
                commodityPager = (Pager) request.getSession().getAttribute(
                        "commodityPager");
                commodityPager.checkRequest(request);
                request.getSession().setAttribute("commodityPager", commodityPager);
            }
            else//否则就把用管理类中的方法重新获得一个Pager对象
            {
                commodityPager = commodityTypeManager.getComPager1(request,
                        commodityTypeForm);
                request.getSession().setAttribute("commodityPager", commodityPager);
            }

//根据获得的Pager对象,查询出要显示的记录(list)

commodityResultList = commodityTypeManager.getComTypeListPage(
                    (CommodityTypeForm) (commodityPager.getForm()),                  commodityPager.getPageSize(),
                    commodityPager.getStartRow());

//页面要用的信息

request.setAttribute("PAGER", commodityPager);
        request.setAttribute("commodityresultlist", commodityResultList);

4.开始写自定义标签,其主要是显示上一页,下一页等操作,而要输出的list是在页面上用<logic:iteator>l输出到页面的,书写自定义标签的步骤如下:

(1)创建标签处理类(ChengPage):

package com.neusoft.training.common;

import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;

import com.neusoft.training.database.oe.Pager;

import java.io.*;

public class ChengPage extends TagSupport
{

/**
     * <p>Discription:[字段功能描述]</p>
     */
    private static final long serialVersionUID = 1L;

String url;

Pager pager;

//自定义标签的两个属性

public String getUrl()
    {
        return url;
    }

public void setUrl(String url)
    {
        this.url = url;
    }

public Pager getPager()
    {
        return pager;
    }

public void setPager(Pager pager)
    {
        this.pager = pager;
    }

public int doStartTag() throws JspException
    {
        try
        {
            String pageString = "";
            if (this.getPager() != null)
            {
                if (pager.getCurrentPage() != 1)
                {
                    pageString += "<a href=/""
                            + url
                            + ".do?method=doQuery&pageMethod=first"
                            + "/"><img src=/"../images/fir.bmp/" alt=/"首页/"></a>";

//.do?method=doQuery&pageMethod=first等要根据自己的路径填写
//带<img>的等要根据自己的路径填写

pageString += "<a href=/""
                            + url
                            + ".do?method=doQuery&pageMethod=previous"
                            + "/"><img src=/"../images/pre.bmp/" alt=/"上一页/"></a>";
                    if (pager.getCurrentPage() == pager.getTotalPages())
                    {
                        pageString += "<img src=/"../images/next2.bmp/" alt=/"下一页/">";
                        pageString += "<img src=/"../images/last2.bmp/" alt=/"尾页/">";
                    }
                    else
                    {
                        pageString += "<a href=/""
                                + url
                                + ".do?method=doQuery&pageMethod=next"
                                + "/"><img src=/"../images/next.bmp/" alt=/"下一页/"></a>";
                        pageString += "<a href=/""
                                + url
                                + ".do?method=doQuery&pageMethod=last"
                                + "/"><img src=/"../images/last.bmp/" alt=/"尾页/"></a>";
                    }
                }
                else
                {
                    pageString += "<img src=/"../images/fir2.bmp/" alt=/"首页/">";
                    pageString += "<img src=/"../images/pre2.bmp/" alt=/"上一页/">";
                    if (pager.getCurrentPage() == pager.getTotalPages())
                    {
                        pageString += "<img src=/"../images/next2.bmp/" alt=/"下一页/">";
                        pageString += "<img src=/"../images/last2.bmp/" alt=/"尾页/">";
                    }
                    else
                    {
                        pageString += "<a href=/""
                                + url
                                + ".do?method=doQuery&pageMethod=next"
                                + "/"><img src=/"../images/next.bmp/" alt=/"下一页/"></a>";
                        pageString += "<a href=/""
                                + url
                                + ".do?method=doQuery&pageMethod=last"
                                + "/"><img src=/"../images/last.bmp/" alt=/"尾页/"></a>";
                    }
                }

pageString += "<img src=/"../images/go.png/" alt=/"goto/""
                        + "οnclick=/"gotopage('pagenum','"
                        + url
                        + "')/">"
                        + "<input type=/"text/" name=/"pagenum/" id=/"pagenum/""
                        + "style=/"width: 20px/" value=/""
                        + pager.getCurrentPage() + "/" />/"
                        + pager.getTotalPages() + "页&nbsp;&nbsp;";
                pageString += "共" + pager.getTotalRows() + "条记录&nbsp;&nbsp;";
                pageString += "当前显示第" + (pager.getStartRow() + 1) + "条到";

if ((pager.getStartRow() + 10) <= pager.getTotalRows())
                {
                    pageString += pager.getStartRow() + 10;
                }
                else
                {
                    pageString += pager.getTotalRows();
                }
                pageString += "条记录";
            }
            pageContext.getOut().write(pageString);
        }
        catch (IOException e)
        {
            System.out.println("Page Tag Error :" + e);
        }
        return super.doStartTag();
    }
}
(2)配置自定义标签,先在WEB-INF下建一个ctj-page.tld,其内容如下:

<?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd"
     version="2.0">
   
     <description>My Taglib by JavaWorld.com.tw</description>
     <tlib-version>1.0</tlib-version>
     <jsp-version>2.0</jsp-version>
     <short-name>PageTest</short-name>
     <uri></uri>
     <small-icon></small-icon>
   
     <tag>
       <description>Example:Hello</description>
       <name>page</name>
       <tag-class>com.neusoft.training.common.ChengPage</tag-class>
       <body-content>empty</body-content>
      <attribute>
         <name>url</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
      <attribute>
         <name>pager</name>
         <required>false</required>
         <rtexprvalue>true</rtexprvalue>
      </attribute>
    </tag>
</taglib>

(3)在页面上引用自定义标签:

<%@ taglib uri="/WEB-INF/ctj-page.tld" prefix="ctj" %>

<logic:iterate id="equchange" name="changeresultlist">

//这里输出查询到的记录

</logic:iterate>

//显示上一页、下一页等

<ctj:page  url="/OASystem1/equipmentchange" pager="${PAGER}"/>

(4)效果如下:

①初始页面如下:

②点击“查询”按钮后的页面如下:

③点击“下一页”后的页面:

jsp中用自定义标签实现简单的分页相关推荐

  1. jsp tag 自定义标签实现按钮的显示

    前些天在一个项目中做了一个最基本的权限管理(标准的权限结构,用户-角色-菜单),后来需要精确地控制到按钮就想到了使用自定义标签(jsp tag)来处理按钮的显示与隐藏. 下面是我参考网上的资料自己写的 ...

  2. java程序设计颜志军_JSP 自定义标签之一 简单实例

    在JSP中使用自定义标签可以达到这样的目的,事实上,我们所熟知的各类框架基本上都是通过自定义标签的形式来实现的. 通过使用自定义标签,我们可以将实现复杂的逻辑在页面用简单的标签来加以展示.下面我们来实 ...

  3. JSP自定义标签之简单标签入门

    在sun官方文档上有下面这样一段话. 官方文档声明 public interface SimpleTag extends JspTag Interface for defining Simple Ta ...

  4. java自定义标签简单_JSP 自定义标签之一 简单实例

    在jsp中使用自定义标签可以达到这样的目的,事实上,我们所熟知的各类框架基本上都是通过自定义标签的形式来实现的. 通过使用自定义标签,我们可以将实现复杂的逻辑在页面用简单的标签来加以展示.下面我们来实 ...

  5. 如何在JSP里自定义标签

    自定义标签是用户定义的JSP语言元素.当JSP页面包含一个自定义标签时将被转化为servlet,标签转化为对被 称为tag handler的对象的操作,即当servlet执行时Web containe ...

  6. jsp 如何自定义标签

    数据库里存储的是long型的时间,现在想输出到jsp页面,由于使用的是jstl标签,而要显示的是可读的时间类型,找来找去有个fmt:formatDate可以转化,但是只能转date型,long型则不可 ...

  7. jsp使用自定义标签taglib分页系列——SearchForm - cao_david的专栏 - CSDNBlog

    导读: package com.adroit.nidus.taglib.html; import org.apache.struts.validator.ValidatorForm; /** * Ti ...

  8. jsp中用java写标签id_jsp中自定义标签用法实例分析

    本文实例讲述了jsp中自定义标签用法.分享给大家供大家参考.具体如下: 这里简单的写了一个自定义标签,自己定义标签的好处就是在jsp页面中可以使用自己定义的功能,完全与Java代码分离 1. tld文 ...

  9. JSP自定义标签开发与打包

    前言:最近用到JSP的自定义标签,于是到网上寻找资料,结果发现很多的网上教程要么不全要么就是步骤流程错误,尤其是将自定义标签打jar包这一过程,按照网上的教程操作,结果被坑惨了,所以才有现在这一篇博文 ...

最新文章

  1. android 拍照空指针,空指针异常时嵌入照片中的Android
  2. 【留用】C#的一些好的书籍
  3. 梁戈碧:促数据中心转型 释放数据洞察力
  4. [转]easyui datagrid 批量编辑和提交
  5. VS2005 解决应用程序配置不正确,程序无法启动问题
  6. 【Redis学习】Transaction事务管理
  7. oracle确实表达式,ORACLE正规表达式
  8. 发布:偶写的NHibernate代码生成器
  9. CVPR 2021 3D视觉相关最新进展分享
  10. 微服务——最热门的架构
  11. 吴恩达机器学习 12.异常检测
  12. 局域网ip扫描工具_Network Kit X for Mac(网络检测工具箱)
  13. python风控建模_风控建模之特征筛选与建模(python)
  14. 微信小程序开源框架wxSortPickerView:微信小程序首字母排序选择表
  15. 单片机中断程序详解(转)
  16. 感觉现在的技术圈越来越像娱乐圈了
  17. 小程序设置appId
  18. 苹果端手机微信页面长按图片无法保存的解决方案
  19. 二极管选型-二极管参数介绍
  20. 局域网唤醒计算机,电脑远程开机_局域网唤醒电脑 | 茶杯猫

热门文章

  1. cocos2dx中CCTableView乱位问题歪解
  2. VMware虚拟机ubuntu显示屏幕太小解决问题
  3. 网络图片URL转化为Bitmap对象
  4. 用php实现日历输出,php 实现日历
  5. Sqli-labs之Less-11和Less-12
  6. luogu2161 SHOI2009 会场预约
  7. 千亿大数据处理能力是如何炼成的?
  8. 关于近视眼手术网友的评价
  9. 微信公众号开发教程[002]-配置
  10. 中英文说明书丨 AbFluor 488 细胞凋亡检测试剂盒