您的位置:首页 > 编程语言 > Java开发

自定义标签分页

2013-11-25 11:28 302 查看
为了管理分页,包括条件查询分页。用一个自定义标签方式,是一个很好的方案。
NewPage.java 定义一个分页类
package com.oa.util.newpage;
import java.util.List;
/**
*
* @author geQ
* 分页类
* @param <T>
*/
public class NewPage<T> {
//需要获取参数有:  每页条数,当前页,总条数
private int pageSize;//每页条数
private int firstPage = 1;//首页
private int previousPage;//上一页
private int currentPage;//当前页
private int nextPage;//下一页
private int lastPage;//尾页
private int pageCount;//总页数
private int totalCount;//总条数
private List<T> list;//只用来存放当前页要现实的数据内容记录
//一键设置其他参数...
public void setOthers(){
//计算总页数   pageCount
this.pageCount = (this.totalCount-1)/this.pageSize+1;
//下一页
if((this.currentPage+1)<=this.pageCount){
this.nextPage = this.currentPage+1;
}else{
this.nextPage = this.currentPage;
}
//上一页
if(this.currentPage>1){
this.previousPage = this.currentPage-1;
}else{
this.previousPage = this.currentPage;
}
//设置尾页
this.lastPage = this.pageCount;
}
//快捷设置初始化参数,也可以用其他单个的设置,参数依次为:当前页,每页条数,总条数
public void setFast(int currentPage,int pageSize,int total){
this.currentPage = currentPage;
this.pageSize = pageSize;
this.totalCount = total;
setOthers();
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getFirstPage() {
return firstPage;
}
public void setFirstPage(int firstPage) {
this.firstPage = firstPage;
}
public int getPreviousPage() {
return previousPage;
}
public void setPreviousPage(int previousPage) {
this.previousPage = previousPage;
}
public int getCurrentPage() {
return currentPage;
}
public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
}
public int getNextPage() {
return nextPage;
}
public void setNextPage(int nextPage) {
this.nextPage = nextPage;
}
public int getLastPage() {
return lastPage;
}
public void setLastPage(int lastPage) {
this.lastPage = lastPage;
}
public int getPageCount() {
return pageCount;
}
public void setPageCount(int pageCount) {
this.pageCount = pageCount;
}
public int getTotalCount() {
return totalCount;
}
public void setTotalCount(int totalCount) {
this.totalCount = totalCount;
}
public List<T> getList() {
return list;
}
public void setList(List<T> list) {
this.list = list;
}
}
定义一个标签核心类PagerTag.java
package com.oa.util.newpage;
import java.io.IOException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;
public class PagerTag extends TagSupport{
/**
*
*/
private static final long serialVersionUID = 1L;
private String url;//请求的action
private int pageSize;//每页的条数
private int currentPage;//当前页
private int pageCount;//总页数
private int totalCount;//总条数
private String param;//接受参数的键数组

public String getParam() {
return param;
}
public void setParam(String param) {
this.param = param;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getCurrentPage() {
return currentPage;
}
public void setCurrentPage(int currentPage) {
this.currentPage = currentPage;
}
public int getPageCount() {
return pageCount;
}
public void setPageCount(int pageCount) {
this.pageCount = pageCount;
}
public int getTotalCount() {
return totalCount;
}
public void setTotalCount(int totalCount) {
this.totalCount = totalCount;
}
public int doEndTag() throws JspException{
return this.EVAL_PAGE;
}
public int doStartTag() throws JspException{
HttpServletRequest request = (HttpServletRequest)pageContext.getRequest();
String path = request.getSession().getServletContext().getRealPath("\\");
JspWriter jw = pageContext.getOut();
StringBuilder sb = new StringBuilder();//拼写输出的HTML文本
sb.append("<div style='display:none'>\r\n")
.append("<form action='"+url+"' method='post' id='myFormPageTag'>\r\n")
.append("<input type='text' name='pageSize' id=\"_pageSize\" value=''/>\r\n")//将得到的每页条数记入form
.append("<input type='text' name='currentPage' id=\"_current\" value=''/>\r\n")//将得到的当前页记入form
.append("<input type='text' name='pageCount' id=\"_pageCount\" value='"+pageCount+"'/>\r\n")//将得到的总页数记入form
.append("<input type='text' name='totalCount' id=\"_totalCount\" value='"+totalCount+"'/>\r\n");//将得到的总条数记入form
if(param!=null){
String [] keyValue = param.split(";");
for (int i = 0,len=keyValue.length; i < len; i++) {
if(!keyValue[i].equals("")){
if(keyValue[i].split("=").length==1){
sb.append("<input type='text' name='"+keyValue[i].split("=")[0]+"' value=''/>\r\n");//将参数循环记入form
}else{
sb.append("<input type='text' name='"+keyValue[i].split("=")[0]+"' value='"+keyValue[i].split("=")[1]+"'/>\r\n");//将参数循环记入form
}
}
}
}
sb.append("</form></div>\r\n");
/*
* 分页代码的html文本
*
*/
System.out.println();
//显示首页
sb.append("<a href=\"javascript:submitMyPage('"+pageSize+"','"+1+"')\">首页</a>\r\n");
//如果当前页大于1,输出前页文本
if(this.currentPage>1)
sb.append("<a href=\"javascript:submitMyPage('"+pageSize+"','"+(this.currentPage-1)+"')\">前页</a>\r\n");
//从当前页前两页开始显示
if(this.currentPage-2>0)
sb.append("<a href=\"javascript:submitMyPage('"+pageSize+"','"+(this.currentPage-2)+"')\">"+(this.currentPage-2)+"</a>\r\n");
//当前页前一页
if(this.currentPage>1)
sb.append("<a href=\"javascript:submitMyPage('"+pageSize+"','"+(this.currentPage-1)+"')\">"+(this.currentPage-1)+"</a>\r\n");
//当前页
sb.append("<a href=\"javascript:submitMyPage('"+pageSize+"','"+(this.currentPage)+"')\"><font color='red'>"+(this.currentPage)+"</font></a>\r\n");
//当前页的 后页大于总页数时显示
if(this.currentPage+1<=pageCount)
sb.append("<a href=\"javascript:submitMyPage('"+pageSize+"','"+(this.currentPage+1)+"')\">"+(this.currentPage+1)+"</a>\r\n");
//当前页的 后两页大于总页数时显示
if(this.currentPage+2<=pageCount)
sb.append("<a href=\"javascript:submitMyPage('"+pageSize+"','"+(this.currentPage+2)+"')\">"+(this.currentPage+2)+"</a>\r\n");
//当前页+1大于总页数时显示
if(this.currentPage+1<=pageCount)
sb.append("<a href=\"javascript:submitMyPage('"+pageSize+"','"+(this.currentPage+1)+"')\">后页</a>\r\n");
//显示尾页
sb.append("<a href=\"javascript:submitMyPage('"+pageSize+"','"+pageCount+"')\">尾页</a>\r\n");
sb.append("<span class='zt1'>每页<span class=\"bai\">")
.append("<select onchange=\"selectPagesize(this)\" id=\"pageSize\">\r\n");
for (int i = 5; i <=50; i+=5) {
sb.append("<option value='"+i+"'>"+i+"</option>\r\n");
}
sb.append("</select></span>条 \r\n")
.append("共"+pageCount+"页 共"+totalCount+"条\r\n")
.append("跳转到<img src=\"page\\pageImage\\control_start.png\" width=\"16\" height=\"16\"  border=\"0\"/>\r\n")
.append("<input type=\"text\" value=\""+currentPage+"\" style=\"width:20\" size=\"2\" id=\"current\"/>\r\n")
.append("<img src=\".\\page\\pageImage\\control_end.png\" width=\"16\" border=\"0\" height=\"16\"           .append("<img src=\".\\page\\pageImage\\Shortkey.png\" width=\"16\" height=\"16\" title=\"go\"  border=\"0\"/>\r\n")
.append("</span>");
/*
* 对分页的css样式控制
*/
sb.append("<style type=\"text/css\">\r\n");
sb.append("a:LINK {\r\n"+
"color: #000000;\r\n"+
"}\r\n"+
"a:VISITED {\r\n"+
"color: #000000;\r\n"+
"}\r\n"+
"a{\r\n"+
"cursor: pointer;\r\n"+
"text-decoration: none\r\n"+
"}\r\n" +
".zt1{\r\n"+
"font-size: 14px; \r\n"+
"color: #333333; \r\n" +
"font-style:微软雅黑"+
"} \r\n" +
".bai{\r\n"+
"font-size: 12px;\r\n" +
"line-height: 20px;\r\n"+
"color: #333333;\r\n"+
"}\r\n");
sb.append("</style>\r\n");
/*
* 对分页的js控制
* $submitMyPage方法进行页面跳转
* selectPagesize方法进行每页条数的选择
* jump方法进行页面的静态调整
* go方法跳转所输入页面
*/
sb.append("<script language=\"javascript\" src=\""+path+"page\\jquery-1.7.2.min.js\"></script>\r\n");
sb.append("<script language=\"javascript\">\r\n");
sb.append("function submitMyPage(pageSize,currentPage){\r\n" +
"$('#_pageSize').val(pageSize);\r\n"+
"$('#_current').val(currentPage);\r\n"+
"document.getElementById('myFormPageTag').submit();\r\n"+
"}\r\n"+
"function selectPagesize(obj){\r\n"+
"$('#_pageSize').val(obj.value);\r\n" +
"document.getElementById('myFormPageTag').submit();\r\n"+
"}\r\n"+
"function jump(num,pageCount){\r\n"+
"var currentNum = $(\"#current\").val();\r\n"+
"   $(\"#current\").val(parseInt(currentNum, 10)+parseInt(num, 10));\r\n"+
"   if($(\"#current\").val()<=1){\r\n"+
"       $(\"#current\").val(1);\r\n"+
"   }\r\n"+
"   if($(\"#current\").val()>=pageCount){\r\n"+
"       $(\"#current\").val(pageCount);\r\n"+
"   }\r\n"+
"}\r\n"+
"function go(pageSize){\r\n" +
"$('#_pageSize').val(pageSize);\r\n"+
"$('#_current').val($(\"#current\").val());\r\n"+
"document.getElementById('myFormPageTag').submit();\r\n"+
"}\r\n" +
"window. +
"$('#pageSize').val("+pageSize+");\r\n" +
"}\r\n" +
"");
sb.append("</script>");
try {
jw.print(sb.toString());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return this.SKIP_BODY;
}
}
写一个pageTag.tld文件,将文件放到web-inf下
<?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 http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"> <tlib-version>1.0</tlib-version>
<short-name>p</short-name>
<uri>http://pagetld</uri>
<tag>
<name>page</name>
<tag-class>com.oa.util.newpage.PagerTag</tag-class>
<body-content>empty</body-content>
<attribute>
<name>url</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
<type>java.lang.String</type>
</attribute>
<attribute>
<name>pageSize</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
<type>java.lang.Integer</type>
</attribute>
<attribute>
<name>currentPage</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
<type>java.lang.Integer</type>
</attribute>
<attribute>
<name>pageCount</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
<type>java.lang.Integer</type>
</attribute>
<attribute>
<name>totalCount</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
<type>java.lang.Integer</type>
</attribute>
<attribute>
<name>param</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
<type>java.lang.String</type>
</attribute>
</tag>
</taglib>
定义一个分页dao
package com.oa.dao.newPage.daoImp;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import com.oa.dao.newPage.daoInter.NewPageDaoInter;
import com.oa.util.newpage.NewPage;
/**
* A data access object (DAO) providing persistence and search support for
* PersonnelContract entities. Transaction control of the save(), update() and
* delete() operations can directly support Spring container-managed
* transactions or they can be augmented to handle user-managed Spring
* transactions. Each of these methods provides additional information for how
* to configure it for the desired type of transaction control.
*
* @see com.oa.model.zz.PersonnelContract
* @author MyEclipse Persistence Tools
* @param <T>
*/
@SuppressWarnings("unchecked")
public class NewPageDao<T> extends HibernateDaoSupport implements NewPageDaoInter{
private static final Logger log = LoggerFactory
.getLogger(NewPageDao.class);

public List<T> findBySql(String sql) {
Session session = this.getHibernateTemplate().getSessionFactory().openSession();
List<T> list = session.createQuery(sql).list();
return list;
}
/*
* 查询以及分页
*/
public long totalCount(String sql){
List<Long> list = getHibernateTemplate().find(sql);
return list.get(0);
}
public NewPage<T> findAll(String sql1,String sql2,String currentPage,String pageSize){
int totalNum = (int)totalCount(sql1);
Session session = this.getHibernateTemplate().getSessionFactory().openSession();
NewPage<T> page = new NewPage<T>();
if(currentPage==null||currentPage.equals("")){
currentPage = "1";
}
if(pageSize==null||pageSize.equals("")){
pageSize = "10";
}
Transaction tx = session.beginTransaction();
page.setFast(Integer.parseInt(currentPage), Integer.parseInt(pageSize), totalNum);
Query query = session.createQuery(sql2);
query.setFirstResult((Integer.parseInt(currentPage)-1)*Integer.parseInt(pageSize));
query.setMaxResults(Integer.parseInt(pageSize));
page.setList((List<T>)query.list());
tx.commit();
session.close();
return page;
}
}
导入jq库文件
使用说明:
1、将 pageTag.tld 文件放到web-inf下。
2、newPage为封装好的baseDao.其中包含了dao的接口与实现。将此文件根据个人情况放入src下即可。
3、将page文件夹放到webroot下即可。里边主要是分页的图片以及jquery库文件
4、NewPage.java是对分页的具体的封装。根据个人情况放入src下的包即可。
5、PagerTag.java是分页的核心文件,将此文件放入工程下的src/com/oa/util/newpage即可。
刚导入工程可能有个别文件报错,将文件中对类的引用的包进行修改即可。
最后在jsp页面上面导入标签:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>这个是c标签
<%@ taglib prefix="p" uri="http://pagetld" %>这个为自定义的分页标签

在你需要分页的地方写上标签:
<p:page totalCount="${page.totalCount}" pageSize="${page.pageSize}" pageCount="${page.pageCount}" url="${url}" currentPage="${page.currentPage}"/>
此标签需要 在action传参数:总条数:totalCount,每页条数:pageSize,需要跳转的action;url.当前页:currentPage,总页数:pageCount,
如果需要条件查询:在标签内加入param属性:例如
<p:page totalCount="${page.totalCount}" pageSize="${page.pageSize}" pageCount="${page.pageCount}" url="${url}" currentPage="${page.currentPage}" param="name=zhangsan;age=14"/>
以key=value;key=value进行传值。

附件:http://down.51cto.com/data/2363784
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息