您的位置:首页 > 其它

自定义标签通用分页

2008-12-19 03:32 344 查看
[/b]
自定义标签分页源代码[/b][/b]
[/b]
第一步:[/b]创建一个计算分页总数和生成分页脚本的类;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(" /r/n");
sb.append("共 ").append(totalPage).append(" 页  当前第 ").append(pageNo)
.append(" 页/r/n");
sb
.append(" /r/n");
if (pageNo == 1) {
sb.append("首页");
sb.append(" ");
sb.append("上一页/r/n");

} else {
sb.append("<a href='#' onclick='turnOverPage(1)'>首页</a>/r/n");
sb.append(" ");
sb.append("<a href='#' onclick='turnOverPage(")
.append((pageNo - 1)).append(")'>上一页</a>/r/n");
}

sb.append(" ");
if (pageNo == totalPage) {
sb.append("下一页");
sb.append(" ");
sb.append("尾页/r/n");

} else {
sb.append("<a href='#' onclick='turnOverPage(")
.append((pageNo + 1)).append(")'>下一页</a>/r/n");
sb.append(" ");
sb.append("<a href='#' onclick='turnOverPage(").append(totalPage)
.append(")'>尾页</a>/r/n");
}

sb.append(" ");

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(" /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;
}
}
[/b]
第二步;[/b]编写标签描述符文件。标签文件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>
第三步[/b],调用
调用时,需要如下步骤
1,设置每页要显示的记录数,并保存到请求对象中(必须步骤)
int pageSize = 20; [/b]
request.setAttribute("pageSize", pageSize);
2,获取当前页号(必须步骤)
String pageNo = request.getParameter("pageNo");
3,利用这两个参数进行数据查询
...。。。。。
4,在请求中设置的总记录数(必须步骤)
request.setAttribute("total", “一共有多少数据”);
[/b]
第四步[/b]; 在jsp页面上调用
在页面上调用时,只需导入自定义标签和引入标签脚本,其中,在脚本代码中,pageSize=” 每页显示的记录数.” gotoURL=” 要提交的路径”
<%@ taglib uri="http://www.luojs.cn" prefix="luojs"%>

<luojs:pageTag pageSize="${requestScope.pageSize}" gotoURI="longin.do?path=index"/>
小提示:在页面上调用时,会给我们自动生成一个隐藏的from表单来封装分页脚本提交的数据
五;一个简单的小[/b]demo[/b]演示分页效果,[/b][/b]
1,新建PageControllerTag.java
Copy上面第一步的代码:
2,编写标签文件luojspage.tld
Copy上面第二步的代码:
3,调用分页
(1) 查询数据的方法(这里用的hibernate的hql语句进行查询)
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) 在action或servlet中调用查询数据的方法
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 }      <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> <a href="longin.do?path=toupdate&id=${user.id }">update</a> </td>
<td> <a href="longin.do?path=del&id=${user.id }" onClick="return(confirm(' delete this is user?'));">delete</a> </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,页面效果:
效果请参见 分页效果图
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: