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

Java/SSH分页组件

2015-10-14 14:03 621 查看
转自:http://wilr.iteye.com/blog/1441536

由于项目中分页风格多样化,而分页又是项目中必不可少的,为统一项目分页风格,在上次封装的分页的组件找不到的的情况下,重新封装了一下分页组件,特意分享给大家,也防止再次丢失!

1.分页html/CSS代码及素材准备

请参考我的博客《div+css分页条》


http://wilr.iteye.com/blog/1208045

2.分页组件实体bean类

Java代码


package wilr.utils.paging.domain;

import java.io.Serializable;

import java.util.List;

/**

* @project paging

* @path wilr.utils.paging.domain

* @desc SSH版通用分页标签

* @author Wilr

* @QQ:545881075

* @time 2012-2-28 上午12:01:18

*/

public class Page implements Serializable {

private static final long serialVersionUID = 1L;

/**

* 每页显示条数 默认显示10条

*/

private Integer pageSize = 10;

/**

* 总条数

*/

private Integer totalCount = 0;

/**

* 总页数

*/

private Integer totalPage = 0;

/**

* 当前页

*/

private Integer currentPage = 1;

/**

* 起始索引

*/

private Integer startIndex = 0;

/**

* 分页条件

*/

private String condition;

/**

* 查询的返回值

*/

private List<?> objList;

/**

* 排序

*/

private String orderBy;

/**

* 查询对象名称或表名/或查询语句

*/

private String objName;

/**

* 需要查询的字段

*/

private String queryField;

public Page(Integer totalCount,List<?> objList, Integer currentPage) {

super();

this.totalCount = totalCount;

this.objList = objList;

this.currentPage = currentPage;

}

public Page(Integer pageSize, String condition, List<?> objList,

String orderBy, String objName) {

super();

this.pageSize = pageSize;

this.condition = condition;

this.objList = objList;

this.orderBy = orderBy;

this.objName = objName;

}

public Page(Integer pageSize, String objName) {

super();

this.pageSize = pageSize;

this.objName = objName;

}

public Page(){}

public Integer getPageSize() {

return pageSize;

}

public void setPageSize(Integer pageSize) {

this.pageSize = pageSize;

}

public Integer getTotalCount() {

return totalCount;

}

public void setTotalCount(Integer totalCount) {

this.totalCount = totalCount;

}

public Integer getTotalPage() {

totalPage=totalCount % pageSize == 0 ? (totalCount / pageSize): (totalCount / pageSize + 1);

return totalPage;

}

public void setTotalPage(Integer totalPage) {

this.totalPage = totalPage;

}

public Integer getCurrentPage() {

return currentPage;

}

public void setCurrentPage(Integer currentPage) {

if (currentPage <= 0)

currentPage = 1;

this.currentPage = currentPage;

}

public Integer getStartIndex() {

startIndex=this.pageSize * (this.currentPage - 1);

return startIndex;

}

public void setStartIndex(Integer startIndex) {

this.startIndex =startIndex;

}

public String getCondition() {

return condition;

}

public void setCondition(String condition) {

this.condition = condition;

}

public List<?> getObjList() {

return objList;

}

public void setObjList(List<?> objList) {

this.objList = objList;

}

public String getOrderBy() {

return orderBy;

}

public void setOrderBy(String orderBy) {

this.orderBy = orderBy;

}

public String getObjName() {

return objName;

}

public void setObjName(String objName) {

this.objName = objName;

}

public String getQueryField() {

return queryField;

}

public void setQueryField(String queryField) {

this.queryField = queryField;

}

}

3.标签实现类

Java代码


package wilr.utils.paging.taglib;

import java.io.Serializable;

import javax.servlet.jsp.JspException;

import javax.servlet.jsp.tagext.TagSupport;

import wilr.utils.paging.domain.Page;

/**

* @project paging

* @path wilr.utils.paging.taglib

* @desc 分页标签

* @author Wilr

* @QQ:545881075

* @time 2012-2-28 上午12:02:21

*/

public class PagingTag extends TagSupport implements Serializable {

private static final long serialVersionUID = 1L;

/**

* 是否显示改变页数下拉框

*/

private boolean skipCount = true;

/**

* 是否显示跳页输入框

*/

private boolean jumpText = true;

/**

* 是否显示上/下一页按钮

*/

private boolean prevPage = true;

/**

* 是否显示首/尾页按钮

*/

private boolean startPage = true;

/**

* 是否显示遍历页

*/

private boolean forPage = true;

/**

* 是否显示当前页和总页数

*/

private boolean showCurAndSum = true;

/**

* 是否启用刷新

*/

private boolean refresh=true;

/**

* 分页实体对象

*/

private Page page;

/**

*请求URL

*/

private String url;

public boolean isSkipCount() {

return skipCount;

}

public void setSkipCount(boolean skipCount) {

this.skipCount = skipCount;

}

public boolean isJumpText() {

return jumpText;

}

public void setJumpText(boolean jumpText) {

this.jumpText = jumpText;

}

public boolean isPrevPage() {

return prevPage;

}

public void setPrevPage(boolean prevPage) {

this.prevPage = prevPage;

}

public boolean isStartPage() {

return startPage;

}

public void setStartPage(boolean startPage) {

this.startPage = startPage;

}

public boolean isForPage() {

return forPage;

}

public void setForPage(boolean forPage) {

this.forPage = forPage;

}

public boolean isShowCurAndSum() {

return showCurAndSum;

}

public void setShowCurAndSum(boolean showCurAndSum) {

this.showCurAndSum = showCurAndSum;

}

public boolean isRefresh() {

return refresh;

}

public void setRefresh(boolean refresh) {

this.refresh = refresh;

}

public Page getPage() {

return page;

}

public void setPage(Page page) {

this.page = page;

}

public String getUrl() {

return url;

}

public void setUrl(String url) {

this.url = url;

}

/**

* 输出分页标签

*/

public int doStartTag() throws JspException {

try {

if(page!=null){

long currentPage=page.getCurrentPage(); //获得当前页面

long totalPage=page.getTotalPage(); //获得总页数

StringBuilder builder=new StringBuilder("<script type='text/javascript'>");

builder.append("function loadPage(pagenum){var url='"+url+"?page.currentPage='+pagenum;self.location.href=url}");

builder.append("function jumpPage(){var jumpPageNum=document.getElementById('jump_page_num').value;");

builder.append("if(jumpPageNum.length<=0){alert('请填写要跳转的页面值!');return false;}");

builder.append("if(!(/^[1-9]\\d*$/).test(jumpPageNum)){alert('跳转页面值只能填写正整数');return false;}");

builder.append("if(jumpPageNum>"+page.getTotalPage()+"){alert('跳转的页数大于总页数!');return false;}");

builder.append("var url='"+url+"?page.currentPage='+jumpPageNum;self.location.href=url }");

builder.append("function refreshPage(){self.location.href='"+url+"';}");

builder.append("</script>");

builder.append("<div class='page'><ul>");

//如果当前页面为第一页

if(currentPage==1){

if(startPage)

builder.append("<li class='start_off'></li>");

if(prevPage)

builder.append("<li class='first_off'></li>");

}

//当前页面不是第一页

else{

if(startPage)

builder.append("<li class='start' onclick='javascript:loadPage(\"1\");'></li>");

if(prevPage)

builder.append("<li class='first' onclick='javascript:loadPage(\""+(page.getCurrentPage()-1)+"\");'></li>");

}

//判断是否显示google风格的分页

if(forPage && totalPage>0){

builder.append("<li>");

builder.append("<div class='pagenumber'>");

builder.append("<ul>");

builder.append("<li class='fleft'></li>");

/**

* 每次只取9页

*/

for(long pagenum=1;pagenum<=page.getTotalPage();pagenum++){

if(page.getCurrentPage()<5 && pagenum<10){

if(pagenum==page.getCurrentPage())

builder.append("<li class='nowPage' title='第"+pagenum+"页'>"+pagenum+"</li>");

else

builder.append("<li class='fcenter' title='第"+pagenum+"页'><a href='"+url+"?page.currentPage="+pagenum+"'>"+pagenum+"</a></li>");

}else{

//页面大于5以后,当前页位于中间

if(pagenum>page.getCurrentPage()-5 && pagenum<page.getCurrentPage()+5){

if(pagenum==page.getCurrentPage())

builder.append("<li class='nowPage' title='第"+pagenum+"页'>"+pagenum+"</li>");

else

builder.append("<li class='fcenter' title='第"+pagenum+"页'><a href='"+url+"?page.currentPage="+pagenum+"'>"+pagenum+"</a></li>");

}

}

}

builder.append("<li class='fright'></li>");

builder.append("</ul>");

builder.append("</div>");

builder.append("</li>");

}

//如果当前页面为尾页

if(currentPage==totalPage || totalPage<=0){

if(prevPage)

builder.append("<li class='next_off'></li>");

if(startPage)

builder.append("<li class='end_off'></li>");

}

//当前页面不是尾页

else{

if(prevPage)

builder.append("<li class='next' onclick='javascript:loadPage(\""+(page.getCurrentPage()+1)+"\");'></li>");

if(startPage)

builder.append("<li class='end' onclick='javascript:loadPage(\""+page.getTotalPage()+"\");'></li>");

}

/* 先屏蔽

//如果启用页面显示页数选择 这里启用5 10 15 20供用户选择

if(skipCount){

builder.append("<li>");

builder.append("<select class='rounded' name='page.pageSize'");

builder.append("<option value='5'>5条/页</option>");

builder.append("<option value='10' selected='selected'>10条/页</option>");

builder.append("<option value='15'>15条/页</option>");

builder.append("<option value='20'>20条/页</option>");

builder.append("</select>");

builder.append("</li>");

}*/

//如果启用页面跳转

if(jumpText && totalPage>0){

builder.append("<li>");

builder.append("<input type='text' size='5' name='page.currentPage' id='jump_page_num' class='rounded jumpInput'>");

builder.append("</li>");

builder.append("<li class='jump' onclick='javascript:jumpPage();'></li>");

}

//如启用总页数显示

if(showCurAndSum){

builder.append("<li class='pageInfo'>共<span>"+page.getTotalCount()+"</span>条/共<span>"+page.getTotalPage()+"</span>页</li>");

}

if(refresh){

builder.append("<li class='refresh' title='刷新' onclick='javascript:refreshPage();'></li>");

}

builder.append("</ul></div>");

super.pageContext.getOut().print(builder.toString());

}

} catch (Exception e) {

e.printStackTrace();

}

return SKIP_BODY;

}

}

4.标签配置

Xml代码


<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"

"http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">

<taglib>

<tlib-version>1.0</tlib-version>

<jsp-version>1.2</jsp-version>

<short-name>w</short-name>

<uri>http://wilr.iteye.com</uri>

<display-name>分页通用标签</display-name>

<tag>

<name>p</name>

<tag-class>wilr.utils.paging.taglib.PagingTag</tag-class>

<attribute>

<name>skipCount</name>

<required>false</required>

<rtexprvalue>true</rtexprvalue>

<type>boolean</type>

<description>是否显示条数选择</description>

</attribute>

<attribute>

<name>jumpText</name>

<required>false</required>

<rtexprvalue>true</rtexprvalue>

<type>boolean</type>

<description>是否显示跳页输入</description>

</attribute>

<attribute>

<name>prevPage</name>

<required>false</required>

<rtexprvalue>true</rtexprvalue>

<type>boolean</type>

<description>是否显示上/下一页</description>

</attribute>

<attribute>

<name>startPage</name>

<required>false</required>

<rtexprvalue>true</rtexprvalue>

<type>boolean</type>

<description>是否显示首/尾页</description>

</attribute>

<attribute>

<name>forPage</name>

<required>false</required>

<rtexprvalue>true</rtexprvalue>

<type>boolean</type>

<description>是否使用循环输出页</description>

</attribute>

<attribute>

<name>showCurAndSum</name>

<required>false</required>

<rtexprvalue>true</rtexprvalue>

<type>boolean</type>

<description>是否显示总页/总条数</description>

</attribute>

<attribute>

<name>refresh</name>

<required>false</required>

<rtexprvalue>true</rtexprvalue>

<type>boolean</type>

<description>是否可以刷新</description>

</attribute>

<attribute>

<name>url</name>

<required>true</required>

<rtexprvalue>true</rtexprvalue>

<type>String</type>

<description>请求URL</description>

</attribute>

<attribute>

<name>page</name>

<required>true</required>

<rtexprvalue>true</rtexprvalue>

<description>分页对象</description>

</attribute>

</tag>

</taglib>

5.分页数据持久层实例工厂

Java代码


package wilr.utils.paging.factory;

import wilr.utils.paging.domain.Page;

/**

* @project paging

* @path wilr.utils.paging.factory

* @desc 分页组件接口工厂

* @author Wilr

* @QQ:545881075

* @time 2012-2-29 上午10:08:16

*/

public interface PagingFactory {

/**

* @project paging

* @path wilr.utils.paging.factory

* @desc 查询对象条数

* @author Wilr

* @QQ:545881075

* @time 2012-2-29 上午10:08:49

* @param page 分页对象

* @return

*/

public Integer queryObjCount(Page page);

/**

* @project paging

* @path wilr.utils.paging.factory

* @desc 查询对象

* @author Wilr

* @QQ:545881075

* @time 2012-2-29 上午10:08:49

* @param page 分页对象

* @return

*/

public Page queryObjList(Page page);

}

6.分页组件持久层实例工厂实现类(这里采用Spring注解方式,有需求的朋友可以自己修改)

Java代码


package wilr.utils.paging.factory.impl;

import javax.annotation.Resource;

import org.hibernate.Query;

import org.hibernate.SessionFactory;

import org.springframework.stereotype.Service;

import org.springframework.transaction.annotation.Propagation;

import org.springframework.transaction.annotation.Transactional;

import wilr.utils.paging.domain.Page;

import wilr.utils.paging.factory.PagingFactory;

@Service

@Transactional

public class PagingFactoryImpl implements PagingFactory {

@Resource SessionFactory factory;

@Transactional(propagation=Propagation.NOT_SUPPORTED)

public Integer queryObjCount(Page page) {

StringBuffer queryHQL=new StringBuffer("SELECT COUNT(*) FROM "+page.getObjName());

//如果查询条件不为空

if(page.getCondition()!=null && !page.getCondition().trim().equals(""))

queryHQL.append(" WHERE "+page.getCondition());

//如果排序不为空

if(page.getOrderBy()!=null && !page.getOrderBy().trim().equals(""))

queryHQL.append(" order by "+page.getOrderBy());

return Integer.parseInt(factory.getCurrentSession().createQuery(queryHQL.toString()).uniqueResult().toString());

}

@Transactional(propagation=Propagation.NOT_SUPPORTED)

public Page queryObjList(Page page) {

StringBuffer queryHQL=new StringBuffer();

if(page.getQueryField()!=null && !page.getQueryField().trim().equals(""))

queryHQL.append("SELECT "+page.getQueryField()+" FROM "+page.getObjName());

else

queryHQL.append("FROM "+page.getObjName());

if(page.getCondition()!=null && !page.getCondition().trim().equals(""))

queryHQL.append(" WHERE "+page.getCondition());

if(page.getOrderBy()!=null)

queryHQL.append(" order by "+page.getOrderBy());

System.out.println(queryHQL.toString());

Query query=factory.getCurrentSession().createQuery(queryHQL.toString());

query.setFirstResult(page.getStartIndex());

query.setMaxResults(page.getPageSize());

page.setTotalCount(this.queryObjCount(page));

page.setObjList(query.list());

return page;

}

}

7.Service或Action使用Demo

7.1 注入分页数据持久层工厂

Java代码


@Resource PagingFactory factory;

7.2 声明分页主键实体对象Page并get set

Java代码


private Page page;

public Page getPage() {return page;}

public void setPage(Page page) {this.page = page;}

7.3 方法调用

Java代码


if(page==null)page=new Page();

//对象名称

page.setObjName("Demo t");

//条件

page.setCondition("t.id>0");

//排序

page.setOrderBy("t.id desc");

//每页显示条数(默认10)

page.setPageSize(15);

//查询属性(为空查询所有)

page.setQueryField("t.id,t.name');

//调用工厂获得数据

page=factory.queryObjList(page);

8.页面使用(css相关可参考第1条查看我的博客获得)

8.1 引入标签

Xml代码


<%@ taglib prefix="w" uri="http://wilr.iteye.com"%>

8.2 引入CSS

Html代码


<link rel="stylesheet" type="text/css" href="${path}/paging/paging.css">

8.3 使用标签

Java代码


<w:p url="${path}/test!loadDemoList.action" page="${page}"></w:p>

8.3页面调用数据

Html代码


<s:if test="page.objList==null || page.objList.size==0">

无信息!

</s:if>

<s:else>

<s:iterator value="page.objList" id="demo">

${demo.id}--${demo.name}

</s:iterator>

</s:else>

需要JSON数据可在Action中如下处理:

Java代码


JSONArray.fromObject(page.getObjList());

标签全部结束,将工厂、实体、标签打包,以后就可以通用。呵呵!!!!欢迎大家交流和提出宝贵的意见

!!!

附:标签参数说明:

Html代码


必选参数

url:查询列表的action访问路径。

page:分页对象。从actiong中得到。

可选参数:

forPage:是否显示多页风格(类似google),值:true/false 默认为:true

jumpText:是否可以输入跳转页,值:true/false 默认为:true

prevPage:是否显示上/下一页,值:true/false 默认为:true

prevPage:是否显示上/下一页,值:true/false 默认为:true

startPage:是否显示首/尾页,值:true/false 默认为:true

showCurAndSum:是否显示总条数和总页数,值:true/false 默认为:true

refresh:是否启用刷新,值:true/false 默认为 true
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: