我写的一个自定义分页标签
来源:互联网 发布:手机淘宝怎么认证 编辑:程序博客网 时间:2024/05/21 08:39
一、标签处理类:还是采用继承自BodyTagSupport(其实继承自TageSupport也行),而没有采用SimpleTagSupport(?)
package org.qiujy.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;
/**
* 自定义分页标签
* 1.从表单中获得全部查询条件参数,生成对应的<input type=hidden>以备下次提交查询条件参数及值.
* 2.把当前页号(pageNo)设置成了请求参数,以便后台程序可以获得该值进行时时从数据数据库查询相应要显示的数据
* 3.使用举例:
* a) 后台程序:
* //设置每页要显示的记录数,并保存到请求对象中(必须步骤)
* int pageSize = 20;
* request.setAttribute("pageSize", pageSize);
* //获取当前页号(必须步骤)
* String pageNo = request.getParameter("pageNo");
* //利用这两参数进行数据查询
* ...
* // 支持分页而在请求中设置的总记录数(必须步骤)
* request.setAttribute("total", size + "");
*
*
* b) 页面首先导入标签库: <%@ taglib uri="http://www.qiujy.cn" prefix="q"%>
* c) 页面使用标签: <q:pageTag recordCount="每页显示的记录数" gotoURI="要跳转到的目的地"/>
*
* @author qiujy
*
*/
public class PageControllerTag extends BodyTagSupport {
/** 每页显示的记录数(标签的属性) */
private int pageSize = 20;
/** 目的地(标签的属性) */
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);
System.out.println("from request pageNo====>" + pageNo);
}
continue;
}
sb.append("<input type='hidden' name='").append(name).append(
"' value='").append(value).append("'/>/r/n");
}
//把当前页号设置成请求参数
System.out.println("tag:pageNo=====>" + pageNo);
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("<hr width='97%'/>/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("<input type='text' name='").append(PAGNENO).append(
// "' size='3' maxlength='3'/>/r/n");
// sb.append("<input type='button' value='GO'").append(
// "onclick='turnOverPage(pageNo.value)'/>/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;
}
}
二、标签库描述文件:
<?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.qiujy.cn</uri>
<tag>
<name>pageTag</name>
<tag-class>org.qiujy.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>
三、页面使用:(由于是采用jsp2.0版本,所以不用在web.xml中声明tld文件了)
<%@ page contentType="text/html; charset=utf-8" %>
<%@ taglib uri="WEB-INF/c.tld" prefix="c"%>
<%@ taglib uri="WEB-INF/fn.tld" prefix="fn"%>
<%@ taglib uri="WEB-INF/fmt.tld" prefix="fmt"%>
<%@ taglib uri="http://www.qiujy.cn" prefix="q"%>
<html>
<head>
<title>博雅博客</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="StyleSheet" type="text/css" href="images/mystyle.css">
</head>
<body>
<jsp:include flush="true" page="./templet/header.jsp"/>
<table border="1" width="900" bordercolor="#FCD447" align="center">
<tr>
<td width="10%" valign="top">
<!-- 导航栏开始 -->
<table cellspacing="0" cellpadding="0" width="150" border="0">
<tbody>
<tr>
<td>
<table cellspacing="0" cellpadding="0" width="150" border="0">
<tbody>
<tr>
<td colspan="2" height="5">
<img src="./images/default_icon.jpg" alt="logo" >
</td>
</tr>
</tbody>
<tr>
<td>
<jsp:include flush="true" page="./templet/navigationbar.jsp"/>
</td>
</tr>
</table>
</td>
</tr>
</tbody>
</table>
<!-- 导航栏结束 -->
</td>
<td width="90%" valign="top">
<table width="100%">
<tr>
<td><font color="#FF0000"><b>查询关键字:${keyword} 相关文章 ${total} 篇</b></font>
</td>
</tr>
<c:forEach var="art" items="${requestScope.artList}" end="9">
<tr>
<td>
<table width="100%">
<tr>
<td><b>* <a href="articleDetail.do?id=${art.id}" class="a02">${art.title}</a> ...
<fmt:formatDate value="${art.pubTime}" pattern="yyyy-MM-dd"/></b></td>
</tr>
<tr>
<td>
<b>摘要:</b>${art.summary}
</td>
</tr>
</table>
</td>
</tr>
</c:forEach>
<tr>
<td><q:pageTag pageSize="${requestScope.pageSize}" gotoURI="searchArticle.do"/></td>
</tr>
</table>
</td>
</table>
<jsp:include flush="true" page="./templet/footer.jsp" />
</body>
</html>
- 我写的一个自定义分页标签
- 一个仿javaeye的自定义分页标签
- 我也来秀一个FreeMarker自定义的数据分页标签及使用示例
- 我也来秀一个FreeMarker自定义的数据分页标签及使用示例
- 如何写一个自定义标签
- 一个相当好的自定义标签---分页(一)
- 一个相当好的自定义标签---分页(二)
- C#自己写的一个自定义分页控件
- 如何用自定义标签写一个查询数据库的Table?
- 简单的自定义标签--分页标签
- jstl自定义标签(如何写一个自定义标签)
- 我的sql自定义分页
- 自己写的一个分页
- 自定义的一个分页类
- struts2下的分页与自定义标签
- 分析自定义数据分页标签的案例
- JAVA 自定义 分页 标签 的实现
- 基于mybatis 自定义标签分页的实现
- 请问通常java程序员做一年薪水是做少呢?
- (转)调用Java编译器API编译Java
- TinyMail研究—邮件的表示与解析
- 解决Oracle XDB与Tomcat等的8080端口的冲突
- test
- 我写的一个自定义分页标签
- java查询分页技术(1)
- Jdk和Tomcat的安装与配置
- 用WriteProcessMemory做进程注入
- java查询分页技术(2)
- 编译reactos
- 看穿面试这件事儿……
- c#文件操作
- Jive论坛系统完整分析(1)