自定义标签通用分页

 

自定义标签分页源代码

 

第一步:创建一个计算分页总数和生成分页脚本的类;PageControllerTag.java

 

源代码如下:

package org.luojs.tag;

 

import java.io.IOException;

import java.util.Enumeration;

 

import javax.servlet.http.HttpServletRequest;

import javax.servlet.jsp.JspException;

import javax.servlet.jsp.tagext.BodyTagSupport;

 

public class PageControllerTag extends BodyTagSupport {

 

       /** 每页显示的记录数(标签的属性) */

       private int pageSize = 5;

 

       /** 目的地(标签的属性) */

       private String gotoURI;

 

       /** 总记录数名 */

       public static final String TOTAL = "total";

 

       /** 当前页号名 */

       public static final String PAGNENO = "pageNo";

 

       /** 每页要显示的记录数名 */

       public static final String RECORDCOUNT = "pageSize";

 

       /** 目的地名 */

       public static final String GOTOURI = "gotoURI";

 

       // 标签处理程序

       public int doStartTag() throws JspException {

              /** 当前页号(从请求对象中得到) */

              int pageNo = 1;

              /** 总记录数(从请求对象中得到) */

              int total = 0;

              /** 总页数(计算得出) */

              int totalPage = 1;

 

              HttpServletRequest request = (HttpServletRequest) pageContext

                            .getRequest();

 

              // 要输出到页面的HTML文本

              StringBuffer sb = new StringBuffer();

 

              sb.append("/r/n<form method='post' action='' ").append(

                            "name='pageController'>/r/n");

 

              // 获取所有提交的参数(包括查询条件参数)

              Enumeration enumeration = request.getParameterNames();

              String name = null;

              String value = null;

              while (enumeration.hasMoreElements()) {

                     name = (String) enumeration.nextElement();

                     value = request.getParameter(name);

 

                     if (name.equals(RECORDCOUNT)) {

                            continue;

                     }

                     // 从请求对象中获取要跳转到的页号

                     if (name.equals(PAGNENO)) {

                            if (null != value && !"".equals(value)) {

                                   pageNo = Integer.parseInt(value);

                            }

                            continue;

                     }

 

                     sb.append("<input type='hidden' name='").append(name).append(

                                   "' value='").append(value).append("'/>/r/n");

              }

 

              // 把当前页号设置成请求参数

             

              sb.append("<input type='hidden' name='").append(PAGNENO).append(

                            "' value='").append(pageNo).append("'/>/r/n");

 

              // 从请求对象中获取总记录数

              String tot = (String) request.getAttribute(TOTAL);

              if (null != tot && !"".equals(tot)) {

                     total = Integer.parseInt(tot);

              }

              // 计算总页数

              totalPage = getTotalPage(total);

 

              System.out.println("total-->" + total);

 

              sb.append("<br/>/r/n");

              sb

                            .append("&nbsp;/r/n");

              sb.append(" ").append(totalPage).append(" &nbsp;&nbsp;当前第 ").append(pageNo)

                            .append(" /r/n");

              sb

                            .append("&nbsp;/r/n");

              if (pageNo == 1) {

                     sb.append("首页");

                     sb.append("&nbsp;");

                     sb.append("上一页/r/n");

 

              } else {

                     sb.append("<a href='#' οnclick='turnOverPage(1)'>首页</a>/r/n");

                     sb.append("&nbsp;");

                     sb.append("<a href='#' οnclick='turnOverPage(")

                                   .append((pageNo - 1)).append(")'>上一页</a>/r/n");

              }

 

              sb.append("&nbsp;");

              if (pageNo == totalPage) {

                     sb.append("下一页");

                     sb.append("&nbsp;");

                     sb.append("尾页/r/n");

 

              } else {

                     sb.append("<a href='#' οnclick='turnOverPage(")

                                   .append((pageNo + 1)).append(")'>下一页</a>/r/n");

                     sb.append("&nbsp;");

                     sb.append("<a href='#' οnclick='turnOverPage(").append(totalPage)

                                   .append(")'>尾页</a>/r/n");

              }

 

              sb.append("&nbsp;");

 

              sb.append("跳转到<select onChange='turnOverPage(this.value)'>/r/n");

 

              for (int i = 1; i <= totalPage; i++) {

                     if (i == pageNo) {

                            sb.append("  <option value='").append(i).append("' selected>")

                                          .append(i).append("</option>/r/n");

                     } else {

                            sb.append("  <option value='").append(i).append("'>")

                                          .append(i).append("</option>/r/n");

                     }

              }

              sb.append("</select>/r/n");

              sb.append("&nbsp;/r/n");

              sb.append("</form>/r/n");

 

              // 生成提交表单的JS

              sb.append("<script language='javascript'>/r/n");

              sb.append("  function turnOverPage(no){/r/n");

              sb.append("    var form = document.pageController;/r/n");

              sb.append("    //页号越界处理/r/n");

              sb.append("    if(no").append(">").append(totalPage).append(") {/r/n");

              sb.append("        no=").append(totalPage).append(";/r/n");

              sb.append("    }/r/n");

              sb.append("    if(no").append("<=0){/r/n");

              sb.append("        no=1;/r/n");

              sb.append("    }/r/n");

              sb.append("    form.").append(PAGNENO).append(".value=no;/r/n");

              sb.append("    form.action='").append(gotoURI).append("';/r/n");

              sb.append("    form.submit();/r/n");

              sb.append("  }/r/n");

              sb.append("</script>/r/n");

 

              try {

                     pageContext.getOut().println(sb.toString());

              } catch (IOException e) {

 

                     e.printStackTrace();

              }

              return super.doStartTag();

       }

 

       public String getGotoURI() {

              return gotoURI;

       }

 

       public void setGotoURI(String gotoURI) {

              this.gotoURI = gotoURI;

       }

 

       public int getPageSize() {

              return pageSize;

       }

 

       public void setPageSize(int pageSize) {

              this.pageSize = pageSize;

       }

 

       /**

        * 根据总记录数得到总页数

        *

        * @return int 总页数

        */

       private int getTotalPage(int total) {

              int totalPage = 1;

              if (total == 0) {

                     totalPage = 1;

              } else {

                     totalPage = (total % pageSize == 0) ? (total / pageSize) : (total

                                   / pageSize + 1);

              }

 

              return totalPage;

       }

}

 

第二步;编写标签描述符文件。标签文件luojspage.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 http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" version="2.0">

  <tlib-version>0.9</tlib-version>

  <short-name>myCustomerTag</short-name>

  <uri>http://www.luojs.cn</uri>

  <tag>

    <name>pageTag</name>

    <tag-class>org.luojs.tag.PageControllerTag</tag-class>

    <body-content>scriptless</body-content>

    <attribute>

      <name>pageSize</name>

      <required>true</required>

      <rtexprvalue>true</rtexprvalue>

    </attribute>

    <attribute>

      <name>gotoURI</name>

      <required>true</required>

      <rtexprvalue>true</rtexprvalue>

    </attribute>

  </tag>

</taglib>

第三步,调用

     调用时,需要如下步骤

1,设置每页要显示的记录数,并保存到请求对象中(必须步骤)

       int pageSize = 20;

       request.setAttribute("pageSize", pageSize);

    2,获取当前页号(必须步骤)

       String pageNo = request.getParameter("pageNo");

    3,利用这两个参数进行数据查询

       ...。。。。。

    4,在请求中设置的总记录数(必须步骤)

       request.setAttribute("total", “一共有多少数据”);

 

第四步; jsp页面上调用

       在页面上调用时,只需导入自定义标签和引入标签脚本,其中,在脚本代码中,pageSize=” 每页显示的记录数.” gotoURL=” 要提交的路径

      <%@ taglib uri="http://www.luojs.cn" prefix="luojs"%>

 

<luojs:pageTag pageSize="${requestScope.pageSize}" gotoURI="longin.do?path=index"/>

小提示:在页面上调用时,会给我们自动生成一个隐藏的from表单来封装分页脚本提交的数据

五;一个简单的小demo演示分页效果,

1,新建PageControllerTag.java

   Copy上面第一步的代码:

2,编写标签文件luojspage.tld

Copy上面第二步的代码:

3,调用分页

(1)       查询数据的方法(这里用的hibernatehql语句进行查询)

 public List getPage(final String sql, int pageId, final int pageSize) {

 

              System.out.println("yo  wcomecome you 1");

              final int firstId = (pageId - 1) * pageSize;

 

              Query query = this.getHibernateTemplate().getSessionFactory()

                            .getCurrentSession().createQuery(sql);

              query.setFirstResult(firstId);

              query.setMaxResults(pageSize);

              List list = query.list();

              return list;

       }

 

(2)       actionservlet中调用查询数据的方法

int pageSize = 3; //设置每页要显示的条数

              request.setAttribute("pageSize", new Integer(pageSize));

             

              String pageNo = request.getParameter("pageNo");// 获取当前页号

              if (pageNo == null)

                     pageNo = "1";            

              int pagenum = Integer.parseInt(pageNo); //

              // 利用这两参数进行数据查询

              List listUser = user.getPage("from User", pagenum, pageSize);

        //获取中的记录数

              int size = user.serverSearchById(0, 0).size();

              request.setAttribute("total", size + ""); //总条数 

              request.setAttribute("listUser", listUser);

              return mapping.findForward("succ");

 

4,页面代码

<%@ page language="java" pageEncoding="gbk"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<%@ taglib uri="http://www.luojs.cn" prefix="luojs"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

  <head>  

    <title>分页测试</title>

  </head>

  <body>

    <h2>This is my Struts page. </h2><br>

   <h4>Worcome ${name }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="longin.do?path=toadds">add User</a></h4> <hr/>

   <table width="650px" border="1" background="#fffff" align="center" cellpadding="0" cellspacing="0" bordercolor="#cccfff" bgcolor="#ffffff">

  <caption>

    User info

  </caption>

  <tr bgcolor="#99ffcc">

    <th scope="col">id</th>

    <th scope="col">UserName</th>

    <th scope="col">PassWord</th>

    <th scope="col">Update</th>

    <th scope="col">Del</th>

  </tr>

  <c:forEach items="${listUser}" var="user">

  <tr>

    <td>${user.id }</td>

    <td>${user.username}</td>

    <td>${user.password }</td>

    <td>&nbsp;<a href="longin.do?path=toupdate&id=${user.id }">update</a>&nbsp;</td>

    <td>&nbsp;<a href="longin.do?path=del&id=${user.id }" onClick="return(confirm(' delete this is user'));">delete</a>&nbsp;</td>

  </tr>

 </c:forEach>

</table>

<table border="0" align="center"><tr><td>

<luojs:pageTag pageSize="${requestScope.pageSize}" gotoURI="longin.do?path=index"/>

</td></tr></table>

  </body>

</html>

 

5,页面效果:

效果请参见 分页效果图

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值