分析自定义数据分页标签的案例,上传分析过程。

本文介绍了一种自定义分页标签的方法,通过创建PagerTag类实现了分页数据计算与显示功能,并通过配置文件TagTest.tld声明标签属性,最终在JSP页面中实现了分页效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一步:建立一个标签文件:PagerTag.java,实现主要的分页数据计算,和页面分页样式的显示功能。该类实现TagSupport的继承。计算页面显示数据和页号越界处理。
 
import java.io.IOException;
import java.util.Enumeration;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.Tag;
import javax.servlet.jsp.tagext.TagSupport;
 
public class PagerTag extends TagSupport {
 
private static final long serialVersionUID = 1L;
 private String url;
private int pageSize = 10;
private int pageNo = 1;
private int recordCount;

public int doStartTag() throws JspException {
 
int pageCount = (recordCount + pageSize - 1) / pageSize;

StringBuilder sb = new StringBuilder();
 sb.append("\r\n<div class='pagination'>\r\n");
 if (recordCount == 0) {
 sb.append(" 没有可以显示的项目");
 } else {
 if (pageNo > pageCount) {
pageNo = pageCount;
 }
 if (pageNo < 1) {
 pageNo = 1;
 }
 sb.append("<form method='post' action='' name='qPagerForm'>\r\n");
 
HttpServletRequest request = (HttpServletRequest) pageContext
 .getRequest();
 Enumeration<String> enumeration = request.getParameterNames();
 String name = null;
String value = null;

while (enumeration.hasMoreElements()) {
 name = enumeration.nextElement();
 value = request.getParameter(name);
 
if (name.equals("pageNo")) {
 if (value != null && !value.equals("")) {
 pageNo = Integer.parseInt(value);
 }
 continue;
 }
 sb.append("<input type='hidden' name='" + name + "' value='"
 + value + "'/>\r\n");
 }
 
sb.append("<input type='hidden' name='" + "pageNo" + "' value='"
 + pageNo + "'/>\r\n");
 sb.append("&nbsp;共<strong>" + recordCount + "</strong>项,<strong>"
 + pageCount + "</strong>页:&nbsp;\r\n");
 

if (pageNo == 1) {
 sb.append("<span class='disabled'>&laquo;&nbsp;上一页</span>\r\n");
 } else {
 sb
 .append("<a href='javascript:void(null)' Xonclick='turnOverPage("
 + (pageNo - 1) + ")'>&laquo;&nbsp上一页</a>\r\n");
 }
 
int start = 1;
 if (this.pageNo > 4) {
 start = this.pageNo - 1;
 sb
 .append("<a href='javascript:void(null)' Xonclick='turnOverPage(1)'>1</a>\r\n");
 sb
 .append("<a href='javascript:void(null)' Xonclick='turnOverPage(2)'>2</a>\r\n");
 sb.append("&hellip;\r\n");
 }
 
int end = this.pageNo + 1;
 if (end > pageCount) {
 end = pageCount;
 }
 for (int i = start; i <= end; i++) {
 if (pageNo == i) {
sb.append("<span class='current'>" + i + "</span>\r\n");
 } else {
 sb
 .append("<a href='javascript:void(null)' Xonclick='turnOverPage("
 + i + ")'>" + i + "</a>\r\n");
 }
 }
 
if (end < pageCount - 2) {
 sb.append("&hellip;\r\n");
 }
 if (end < pageCount - 1) {
 sb
 .append("<a href='javascript:void(null)' Xonclick='turnOverPage("
 + (pageCount - 1)
 + ")'>"
 + (pageCount - 1)
 + "</a>\r\n");
 }
 if (end < pageCount) {
 sb
 .append("<a href='javascript:void(null)' Xonclick='turnOverPage("
 + pageCount + ")'>" + pageCount + "</a>\r\n");
 }
 

if (pageNo == pageCount) {
 sb
 .append("<span class='disabled'>下一页&nbsp;&raquo; </span>\r\n");
 } else {
 sb
 .append("<a href='javascript:void(null)' Xonclick='turnOverPage("
 + (pageNo + 1) + ")'>&laquo;&nbsp下一页</a>\r\n");
 }
 sb.append("</form>\r\n");
 sb.append("<script Xlanguage='javascript'>\r\n");
 sb.append("function turnOverPage(no){\r\n");
 sb.append("var qForm=document.qPagerForm;\r\n");
 sb.append("if(no>" + pageCount + "){no=" + pageCount + ";}");
 sb.append("if(no<1){no=1;}");
 sb.append("qForm.pageNo.value=no;\r\n");
 sb.append("qForm.action='" + url + "'\r\n");
 sb.append("qForm.submit();\r\n}</script>\r\n");
 }
 sb.append("</div>\r\n");
 try {
 pageContext.getOut().println(sb.toString());
 } catch (IOException e) {
 // TODO Auto-generated catch block
 e.printStackTrace();
 }
 return Tag.SKIP_BODY;
 }
 

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

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

public void setPageNo(int pageNo) {
 this.pageNo = pageNo;
 }
 

public void setRecordCount(int recordCount) {
 this.recordCount = recordCount;
 }
}
 

第二步: 写完标签类后,需要为该标签类申明好配置文件TagTest.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">
 <description>A tag library exercising SimpleTag handlers.</description>
 <tlib-version>1.0</tlib-version>
 <short-name>g</short-name>
 <uri>http://csdn.hbsi/pageTag</uri>
 <tag>
 
<name>pager</name>
 <tag-class>com.csdn.hbsi.tags.PagerTag</tag-class>
 <body-content>empty</body-content>
 <attribute>
 <name>pageNo</name>
 <required>true</required>
 <rtexprvalue>true</rtexprvalue>
 </attribute>
 <attribute>
 <name>pageSize</name>
 <required>true</required>
 <rtexprvalue>true</rtexprvalue>
 </attribute>
 <attribute>
 <name>recordCount</name>
 <required>true</required>
 <rtexprvalue>true</rtexprvalue>
 </attribute>
 <attribute>
 <name>url</name>
 <required>true</required>
 <rtexprvalue>true</rtexprvalue>
 </attribute>
 </tag>
 

</taglib>
 

第三步: 分页标签写完以后,就可以对查询的代码进行分页处理了,获取用户存储数据的集合信息及页数信息。这个部分一共由1个控TestPagerServlet处理。
 
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
 
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
public class TestPagerServlet extends HttpServlet {
 
private static final long serialVersionUID = 1L;
 
private List<String> datas;
 public static final int PAGER_PAGESIZE = 10;

public void doGet(HttpServletRequest request, HttpServletResponse response)
 throws ServletException, IOException {
 this.doPost(request, response);
 }
 
public void doPost(HttpServletRequest request, HttpServletResponse response)
 throws ServletException, IOException {
 request.setCharacterEncoding("UTF-8");
 
int recordCount = this.datas.size();

int pageNo = 1;
String pageNoStr = request.getParameter("pageNo");
 if (pageNoStr != null && !pageNoStr.equals("")) {
 pageNo = Integer.parseInt(pageNoStr);
 }
 

int start = (pageNo - 1) * PAGER_PAGESIZE;
int end = start + PAGER_PAGESIZE;
if (end > this.datas.size()) {
 end = this.datas.size();
 }
 List<String> result = this.datas.subList(start, end);


request.setAttribute("datas", result);
 request.setAttribute("pageNo", pageNo);
 request.setAttribute("pageSize", PAGER_PAGESIZE);
 request.setAttribute("recordCount", recordCount);
 

request.getRequestDispatcher("/pager.jsp").forward(request, response);
 
}
 

public void init() throws ServletException {
 
datas = new ArrayList<String>();
 for (int i = 1; i <= 123; i++) {
 datas.add("字符串" + i);
 }
 }
 
}
 

第四部:用pager.jsp文件进行分页标签样式和页面绑定。
 
<%@ page Xlanguage="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="http://csdn.hbsi/pageTag" prefix="q"%>
<%
 String path = request.getContextPath();
 String basePath = request.getScheme() + "://"
 + request.getServerName() + ":" + request.getServerPort()
 + path + "/";
%>
 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
 <head>
 <title>自定义分页标签使用示例</title>
 <style type="text/css">
body {
 margin-top: 20px;
 text-align: left;
 font-family: 宋体, Arial, Verdana;
 font-size: 13px;
 line-height: 150%;
 min-width: 800px;
 word-break: break-all;
}
 
/* 分页标签样式 */
.pagination {
 padding: 5px;
 float: right;
}
 
.pagination a,.pagination a:link,.pagination a:visited {
 padding: 2px 5px 2px 5px;
 margin: 2px;
 border: 1px solid #aaaadd;
 text-decoration: none;
 color: #006699;
}
 
.pagination a:hover,.pagination a:active {
 border: 1px solid #ff0000;
 color: #000;
 text-decoration: none;
}
 
.pagination span.current {
 padding: 2px 5px 2px 5px;
 margin: 2px;
 border: 1px solid #ff0000;
 font-weight: bold;
 background-color: #ff0000;
 color: #FFF;
}
 
.pagination span.disabled {
 padding: 2px 5px 2px 5px;
 margin: 2px;
 border: 1px solid #eee;
 color: #ddd;
}
</style>
 </head>
 

<body>
 <div style="margin: 0px auto; width: 700px">
 <div id="title">
 <h3>
 自定义标签使用实例
 </h3>
 <hr/>
 </div>
 <div id="data">
 <table border="1" width="600" align="center">
 <%
 List<String> datas = (List<String>) request.getAttribute("datas");
 for (String str : datas) {
 out.println("<tr><td>" + str + "<td><tr>");
 }
 %>
 
</table>
 </div>
 <q:pager pageNo="${pageNo}" pageSize="${pageSize}" recordCount="${recordCount}" url="TestPagerServlet"/>
 

</div>
 </body>
</html>
第五步:在index.jsp中进行测试连接

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
   
    <title>My JSP 'index.jsp' starting page</title>
 <meta http-equiv="pragma" content="no-cache">
 <meta http-equiv="cache-control" content="no-cache">
 <meta http-equiv="expires" content="0">   
 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
 <meta http-equiv="description" content="This is my page">
 <!--
 <link rel="stylesheet" type="text/css" href="styles.css">
 -->
  </head>
 
  <body>
    <a href="TestPagerServlet">测试链接</a>
  </body>
</html>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值