分析自定义数据分页标签的案例,上传分析过程。
2012-11-20 20:04
344 查看
第一步:建立一个标签文件: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(" 共<strong>" + recordCount + "</strong>项,<strong>"
+ pageCount + "</strong>页: \r\n");
if (pageNo == 1) {
sb.append("<span class='disabled'>« 上一页</span>\r\n");
} else {
sb
.append("<a href='javascript:void(null)' Xonclick='turnOverPage("
+ (pageNo - 1) + ")'>« 上一页</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("…\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("…\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'>下一页 » </span>\r\n");
} else {
sb
.append("<a href='javascript:void(null)' Xonclick='turnOverPage("
+ (pageNo + 1) + ")'>« 下一页</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>
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(" 共<strong>" + recordCount + "</strong>项,<strong>"
+ pageCount + "</strong>页: \r\n");
if (pageNo == 1) {
sb.append("<span class='disabled'>« 上一页</span>\r\n");
} else {
sb
.append("<a href='javascript:void(null)' Xonclick='turnOverPage("
+ (pageNo - 1) + ")'>« 上一页</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("…\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("…\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'>下一页 » </span>\r\n");
} else {
sb
.append("<a href='javascript:void(null)' Xonclick='turnOverPage("
+ (pageNo + 1) + ")'>« 下一页</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>
相关文章推荐
- 分析自定义数据分页标签的案例
- 我也来秀一个FreeMarker自定义的数据分页标签及使用示例
- JSP自定义分页标签TAG全过程
- 我也来秀一个FreeMarker自定义的数据分页标签及使用示例
- JSP自定义分页标签TAG全过程
- 使用JDBC连接MySQL数据库--典型案例分析(八)----实现员工数据的分页查询
- 第十五天3月10日之JDBC案例、分页技术、大数据(文本、图片)存储、批处理和存储过程的调用
- 自定义数据分页标签
- STRUTS2自定义分页标签及过程中的问题
- FreeMarker自定义的数据分页标签及使用示例
- 深入分析JavaWeb Item25 -- 自定义标签开发案例和打包自定义标签库
- 深入分析JavaWeb 25 -- 自定义标签开发案例和打包自定义标签库
- 翻动100万级的数据(自定义的MSSQL分页查询过程)
- raid数据恢复案例之:服务器Raid5磁盘阵列数据恢复过程
- ASP.NET存储过程自定义分页详解 (转)
- Launcher3源码分析 — 数据加载过程
- 一个高效的数据分页的存储过程 可以轻松应付百万数据
- android4.0.1 webkit video 标签播放过程分析
- GridView自定义分页的四种存储过程
- Wireshark和Fiddler分析Android中的TLS协议包数据(附带案例样本)