您的位置:首页 > 其它

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

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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: