本文参考文章:http://blog.csdn.net/qjyong/article/details/3240303

一、标签处理类:

package cn.conris.sys.form;

import java.io.IOException;
import java.util.Enumeration; import javax.servlet.http.HttpServletRequest;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport; import cn.conris.sys.utils.PropertyUtil; public class PageTag extends TagSupport {
/**
* 版本
*/
private static final long serialVersionUID = 1L; private int pageSize = PropertyUtil.getPageSize(); // 每页要显示的记录数
private int pageNo = PropertyUtil.getPageNumber(); // 页号
private int recordCount; // 总记录数
private String 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;
}
public void setUrl(String url) {
this.url = url;
}
// 主要的逻辑
@Override
public int doStartTag() throws JspException {
if(recordCount == 0){
return super.doStartTag();
} // 总页数
int pageCount = (recordCount + pageSize - 1) / pageSize;
// 页号越界处理
if (pageNo > pageCount) {
pageNo = pageCount;
}
if (pageNo < 1) {
pageNo = 1;
} StringBuilder sb = new StringBuilder(); sb.append("<form name='pageController' id='pageController' action='' method='post'>&nbsp")
.append("<input type='hidden' id='pageNo' name='pageNo' value='" + pageNo + "' />&nbsp"); //------------------------------------ 获取所有請求中的参数
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 (null != value && !"".equals(value)) {
pageNo = Integer.parseInt(value);
}
continue;
}
sb.append("<input type='hidden' name='")
.append(name)
.append("' value='")
.append(value)
.append("'/>&nbsp");
}
//---------------------------------------------------- sb.append(" 共" + pageCount + "页&nbsp&nbsp")
.append("当前第" + pageNo + "页 &nbsp&nbsp")
.append("共" + recordCount + "条 &nbsp&nbsp"); if (pageNo == 1) {
sb.append("首页");
sb.append(" ");
sb.append("上一页&nbsp");
} else {
sb.append("<a href='#' onclick='turnOverPage(1)'>首页</a>&nbsp");
sb.append(" ");
sb.append("<a href='#' onclick='turnOverPage(")
.append((pageNo - 1)).append(")'>上一页</a>&nbsp");
}
sb.append(" ");
if (pageNo == pageCount) {
sb.append("下一页");
sb.append(" ");
sb.append("尾页&nbsp");
} else {
sb.append("<a href='#' onclick='turnOverPage(")
.append((pageNo + 1)).append(")'>下一页</a>&nbsp");
sb.append(" ");
sb.append("<a href='#' onclick='turnOverPage(").append(pageCount)
.append(")'>尾页</a>&nbsp");
} sb.append(" 跳到<select style='width:80px;' onChange='turnOverPage(this.value)'>&nbsp");
for (int i = 1; i <= pageCount; i++) {
if (i == pageNo) {
sb.append(" <option value='")
.append(i)
.append("' selected='selected'>第")
.append(i)
.append("页</option>&nbsp");
} else {
sb.append(" <option value='")
.append(i)
.append("'>第")
.append(i)
.append("页</option>&nbsp");
}
}
sb.append("</select>&nbsp");
sb.append(" &nbsp");
sb.append("</form>&nbsp"); // 生成提交表单的JS
sb.append("<script language='javascript'>");
// sb.append(" //翻页函数/t/n");
sb.append(" function turnOverPage(no){");
sb.append(" var form = document.pageController;");
// sb.append(" //页号越界处理");
sb.append(" if(no").append(">").append(pageCount).append(") {");
sb.append(" no=").append(pageCount).append(";");
sb.append(" }");
sb.append(" if(no").append("< 1){");
sb.append(" no=1;");
sb.append(" }");
sb.append(" form.").append("pageNo").append(".value=no;");
sb.append(" form.action='").append(url).append("';");
sb.append(" form.submit();");
sb.append(" }");
sb.append("</script>"); try {
pageContext.getOut().println(sb.toString());
} catch (IOException e) {
e.printStackTrace();
} return super.doStartTag();
}
}

二、标签库描述文件:

<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.0" 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 web-jsptaglibrary_2_0.xsd">
<tlib-version>2.0</tlib-version>
<short-name>my</short-name>
<uri>http://conris/ModelSystem</uri>
<tag>
<description>通用分页标签</description>
<name>pager</name>
<tag-class>cn.conris.sys.form.PageTag</tag-class>
<body-content>empty</body-content>
<attribute>
<name>pageNo</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>recordCount</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>pageSize</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>url</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>

三、PropertyUtil工具类:

package cn.conris.sys.utils;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties; public class PropertyUtil {
private static Properties p = new Properties();
private static InputStream inputStream = null;
static {
inputStream = PropertyUtil.class
.getResourceAsStream("/page.properties");
try {
p.load(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
} public static int getPageSize() {
return Integer.parseInt(p.getProperty("pageSize"));
} public static int getPageNumber() {
return Integer.parseInt(p.getProperty("pageNumber"));
} public static void main(String[] args) {
System.out.println(getPageSize());
}
}

四、page.properties配置文件:

pageSize=5
pageNumber=1

五、action方法:

/**
* @Title: findAllPlaneLibrary
* @Description: 查询所有飞机实体
* @param @return 跳转到/entity_list.jsp
* @return String 返回类型
* @throws
*/
public String findAllPlaneLibrary() {
try {
/** 查询飞机类型 **/
List<EntityLibrary> entityLibraryList = entityLibraryService
.findEntityLibraryByBelongsLibrarycode("1000001");
request.setAttribute("entityLibraryList", entityLibraryList);
/**分页条件查询**/
/**获取查询参数**/
String name = planeLibrary.getName();
String type = planeLibrary.getType();
List<PlaneLibrary> planeLibraryList = planeLibraryService.findAll(name,type,speedStart,speedEnd);
String pageNoStr = request.getParameter("pageNo");
int pageNo = PropertyUtil.getPageNumber();
if (pageNoStr != null && !pageNoStr.equals("")) {
pageNo = Integer.parseInt(pageNoStr);
} int recordCount = planeLibraryList.size();
int pageSize = PropertyUtil.getPageSize();
int startNo = (pageNo - 1) * pageSize; List<PlaneLibrary> result = null;
if (recordCount <= pageSize) {
result = planeLibraryList;
} else {
if (startNo + pageSize > recordCount) {
result = planeLibraryList.subList(startNo, recordCount);
} else {
result = planeLibraryList.subList(startNo, startNo
+ pageSize);
}
}
if (planeLibraryList != null && planeLibraryList.size() > 0) {
request.setAttribute("result", result);
request.setAttribute("recordCount", recordCount);
request.setAttribute("pageNo", pageNo);
request.setAttribute("pageSize", pageSize);
request.setAttribute("name", name);
request.setAttribute("type", type);
request.setAttribute("speedStart", speedStart);
request.setAttribute("speedEnd", speedEnd);
}
} catch (Exception e) {
e.fillInStackTrace();
}
return "findAllPlaneLibrary";
}

七、Jsp页面配置

添加引用:

<%@ taglib uri="/mytaglib" prefix="mytag"%>

遍历查询结果集合:

<s:iterator value="#request.result" id="planeLibrary" status="i">
<tr>
<td class="center_td"><s:property value="#i.index+1" /></td>
<td><a href="#"><img class="thumbnails" alt="#"
src="../<s:property value="#planeLibrary.imagepath"/>" width="64px"
height="64px" /> <s:property value="#planeLibrary.name" /> </a></td>
<td><s:property value="#planeLibrary.type" /></td>
<td><s:property value="#planeLibrary.speed" /></td>
<td><s:property value="#planeLibrary.bombload" /></td>
<td>4200</td>
<td>
<div class="btn-group">
<a href="../html/entity_view.html" class="btn" title="查看"><i
class="icon-file"></i> </a> <a href="../html/entity_add.html"
class="btn" title="修改"><i class="icon-pencil"></i> </a> <a
class="btn" title="删除"><i class="icon-remove"></i> </a>
</div>
</td>
</tr>
</s:iterator>

查询条件回显:

<form class="form-search" action="planeLibrary_findAllPlaneLibrary.action" method="post">
飞机名称: <input type="text" class="input-medium span2" name="name" value="<s:property value="#request.name"/>">&nbsp;&nbsp;
飞机类型: <select class="drop_down" name="type">
<option value="全部">全部</option>
<s:iterator value="#request.entityLibraryList" id="extendAttribute">
<s:if test="#request.type == #extendAttribute.name">
<option selected="selected" value="<s:property value="#extendAttribute.name"/>"><s:property value="#extendAttribute.name"/></option>
</s:if>
<s:else>
<option value="<s:property value="#extendAttribute.name"/>"><s:property value="#extendAttribute.name"/></option>
</s:else>
</s:iterator>
</select>&nbsp;&nbsp; 航速: <input type="text" name="speedStart" value="<s:property value="#request.speedStart"/>" class="input-medium span2">&nbsp;&nbsp;
~ <input name="speedEnd" type="text" value="<s:property value="#request.speedEnd"/>" class="input-medium span2">
<button type="submit" class="btn">
<i class="icon-search"></i> 搜索
</button>
</form>

添加分页条:

<div class="pagination pagination-centered">
<mytag:pager pageNo="${pageNo}" recordCount="${recordCount}"
pageSize="${pageSize}" url="planeLibrary_findAllPlaneLibrary.action" />
</div>

八、注意

该分页标签支持条件查询分页(需要将查询条件回显到jsp页面),点击分页条会对该条件进行分页显示。

原理:点击分页条时,标签会将JSP页面中的所有文本框和下拉列表框转化成form表单提交。

SSH自定义分页标签的更多相关文章

  1. Struts2自定义标签4自定义分页标签

    第一步:webroot/web-inf下的str.tld文件 <?xml version="1.0" encoding="UTF-8"?> < ...

  2. Java自定义分页标签的实现

    主要字段含义: 页号 pagaNo页面大小 pageSize总记录条数 recordCount计算本次一共分多少页 myPageSize页号显示开始 start 页号显示结束 end PageTag需 ...

  3. 自定义分页标签,并使分页标签能获得url中的参数

    如题,要实现一个分页功能,其次,要让分页标签“智能一点”,在分页时能自动带上url后面的参数 <tag> <description>分页标签</description&g ...

  4. Django 中的自定义分页标签

    目录结构: 1.在应用下,migrations的同级目录创建templatetags目录(主要两个文件,包含__init__.py) 2.创建分页标签(pagetag.py) #!/usr/bin/e ...

  5. (转)java web自定义分页标签

    转载至http://liuxi1024.iteye.com/blog/707784 效果如图: 1.JSP规范1.1版本后增加了自定义标签库.实现自定义标签的步骤 (1)开发自定义标签处理类. (2) ...

  6. NET Core-TagHelper实现分页标签

    这里将要和大家分享的是学习总结使用TagHelper实现分页标签,之前分享过一篇使用HtmlHelper扩展了一个分页写法地址可以点击这里http://www.cnblogs.com/wangrudo ...

  7. SSH自定义标签

     一.标签处理类:package cn.conris.sys.form; import java.io.IOException; import java.util.Enumeration; impor ...

  8. Python之路【第十九篇】自定义分页实现(模块化)

    自定义分页 1.目的&环境准备 目的把分页写成一个模块的方式然后在需要分页的地方直接调用模块就行了. 环境准备Django中生成一个APP并且注册,配置URL&Views 配置URL ...

  9. C# DataGridView自定义分页控件

    好些日子不仔细写C#代码了,现在主要是Java项目,C#.Net相关项目不多了,有点手生了,以下代码不足之处望各位提出建议和批评. 近日闲来无事想研究一下自定义控件,虽然之前也看过,那也仅限于皮毛,粗 ...

随机推荐

  1. asp.net文本编辑器FCKeditor使用方法详解

    文本编辑器的使用: 1.FCKeditor的官方网站是:http://www.fckeditor.net/download  目前最新的FCKeditor.Net_2.6.9版本. 请在此页下载:ht ...

  2. poj 2709

    http://poj.org/problem?id=2709 题意:就是那个老师需要n瓶颜色的墨水,和1瓶颜色的灰色的墨水,但是灰色的墨水没得卖,只能由三种颜色相同的墨水混合而成,但是3瓶50ML的墨 ...

  3. 【转】Oracle数据库中Sequence的用法

    在Oracle数据库中,sequence等同于序列号,每次取的时候sequence会自动增加,一般会作用于需要按序列号排序的地方. 1.Create Sequence (注释:你需要有CREATE S ...

  4. @SuppressWarnings注解

    简介:java.lang.SuppressWarnings是J2SE 5.0中标准的Annotation之一.可以标注在类.字段.方法.参数.构造方法,以及局部变量上.作用:告诉编译器忽略指定的警告, ...

  5. UESTC 1215 (思维题 旋转)

    Secrete Master Plan Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Othe ...

  6. HDU 4334 Trouble (暴力)

    Trouble Time Limit: 5000MS   Memory Limit: 32768KB   64bit IO Format: %I64d & %I64u Submit Statu ...

  7. July 31st, Week 32nd Sunday, 2016

    If you wept for the missing sunset, you would miss all the shining stars. 如果你为错过夕阳而哭泣,那你有可能也会错过灿烂的星空 ...

  8. 考前复习(codevs 2837)

    2837 考前复习  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Description Aiden马上要考试了,可他 ...

  9. Session入门

    Session是运行在服务器的,不可造假,例如:医生需要一个私人账本,记录病人编号和身份的对应关系.由于身份证无法造假,所以能够保证信息不被假冒.两点:身份证无法造假,这个身份证就可以唯一标识这个用户 ...

  10. kmv xml 文件配置vnc 端口冲突 会无法启动

    <graphics type=' autoport='no' listen='0.0.0.0'> 如果有多个虛机用相同vnc port的话,只能有一个可以启动,所以vnc port号是唯一 ...