ssh Struts2.2+Hibernate3.6+Spring3.1+oracle 分页示例

参考资料 
1 ssh分页(多个例子) 
http://useryouyou.iteye.com/blog/593954  
2 ssh2分页例子 
http://459104018-qq-com.iteye.com/blog/467196  
3 ssh2分页 
http://blog.youkuaiyun.com/shmily2038/archive/2009/12/28/5090044.aspx  
注意事项:  
此示例是在:Struts2.2+Spring3.1+Hibernate3.6整合(登录示例及CRUD操作)基础上加的分页功能: 
http://liuzidong.iteye.com/blog/935493  
实现功能: 分页,排序,设置每页显示多少条,转到第多少页  
调用说明: 
1  导入只需要:com.liuzd.page包下的类或者将page.jar加入WEB-INF/lib下也行^_^ 
2  Struts2前台类实现: BaseAction父类 
3  在子类方法中调用父类提供的方法: 
   Page page = executePage(querySql,totalCount," id desc "); 
   需要传递三个参数就行了: querySql(查询sql语句), totalCount(总行数), 
    " id desc "(排序的列名与排序方式) 
4 返回分页数据
List<User> users = this.userService.getUserListByPage(page); 
5 在spring配置文件中请保持有: jdbcTemplate与hibernateTemplate这二个Bean的名字,否则dbUtil类不能使用
6 具体可参见:四的说明
 
一 运行环境:XP+Myeclipse6.6+WebLogic92+Oracle10g 
二 工程相关图片: 
1 DEMO图片 

2 工程代码图片 
 
3 page.jar图片 
 
三 此示例是在: 
Struts2.2+Spring3.1+Hibernate3.6整合(登录示例及CRUD操作)基础上加的分页功能: 
http://liuzidong.iteye.com/blog/935493 ,jar包在此页面中下载 
四 关注类及页面: 
1 BaseAction类(可能你在项目有其它的父类要使用,只要关注这个类中的: protected Page executePage(String querySql,Long totalCount,String columnNameDescOrAsc)方法就行了,方法中的参数不用修改,它来自于page.jsp,你可拷贝这个方法到你的父类中就实现了分页功能,分页类详见注释) 
2 UserAction子类(只关注:方法:userList()中的调用方式) 
3 UserDAOImpl类(关注方法:public List<User> getUserListByPage(final Page page) )
 

4 userList.jsp页面

<%@ taglib uri="/WEB-INF/c.tld" prefix="c"%>  
<c:set var="page" value="${sessionScope.page}" /> 

在排序处: 

<font color='red'>${page.sortName eq "username" ? page.sortInfo :page.defaultInfo}</font>  

在下面加上: 

<jsp:include page="/page/page.jsp">  
    <jsp:param name="url" value="userAction!userList.action" />  
    <!-- 演示传值:要用%26 -->  
    <jsp:param name="urlParams" value="%26age=2" />  
</jsp:include>  

四 要关注的类与页面 

1 BaseAction.java 

package com.liuzd.common;  
  
import java.util.Map;  
  
import javax.servlet.http.HttpServletRequest;  
  
import org.apache.struts2.ServletActionContext;  
import org.apache.struts2.interceptor.SessionAware;  
  
import com.liuzd.page.Page;  
import com.liuzd.page.PageUtil;  
import com.liuzd.page.PageState;  
import com.opensymphony.xwork2.ActionContext;  
import com.opensymphony.xwork2.ActionSupport;  
  
/** 
 * 基本Struts2的分页父类 
 * @author liuzd 
 * @version 1.0 2011-05-12 
 * @since JDK1.5 
 * */  
public class BaseAction extends ActionSupport implements SessionAware{  
      
    private static final long serialVersionUID = 1L;  
      
    public void setSession(Map<String, Object> sessionMap) {        
          
    }     
      
    protected Map<String,Object> getMapSession(){  
        return  (Map<String,Object>)ActionContext.getContext().getSession();  
    }  
      
    protected Object getMapSessionGet(String key){  
        return  getMapSession().get(key);  
    }  
      
    protected void setMapSessionPut(String key,Object value){  
         getMapSession().put(key, value);  
    }  
      
    /*** 
     * 获取请求对象 
     * */  
    protected HttpServletRequest getRequest(){  
        return ServletActionContext.getRequest ();   
    }  
      
    /*** 
     * 获取会话对象 
     * */  
    protected javax.servlet.http.HttpSession getSession(){  
        return getRequest().getSession();   
    }  
      
    /*** 
     * 设置请求参数 
     * */  
    protected void setRequestAttribute(String attribute,Object attrValue){  
        getRequest().setAttribute(attribute, attrValue);  
    }  
      
    /*** 
     * 获取请求参数 
     * */  
    protected Object getRequestAttribute(String attribute){  
        return getRequest().getAttribute(attribute);  
    }     
      
    /*** 
     * 设置Session参数与值 
     * */  
    protected void setSessionAttribute(String attribute,Object attrValue){  
        getSession().setAttribute(attribute, attrValue);  
    }  
      
    /*** 
     * 获取Session参数与值 
     * */  
    protected Object getSessionAttribute(String attribute){  
        return getSession().getAttribute(attribute);  
    }     
      
      
    /** 
     * oracel的三层分页语句     
     * 子类在展现数据前,进行分页计算! 
     * @param querySql  查询的SQL语句,未进行分页 
     * @param totalCount 根据查询SQL获取的总条数 
     * @param columnNameDescOrAsc 列名+排序方式 : ID DESC or ASC 
     */  
    protected Page executePage(String querySql,Long totalCount,String columnNameDescOrAsc){  
        String oracleSql = PageUtil.createQuerySql(querySql,columnNameDescOrAsc);  
        if(null == totalCount){  
            totalCount = 0L;  
        }  
        /**页面状态,这个状态是分页自带的,与业务无关*/  
        String pageAction = getRequest().getParameter("pageAction");  
        String value = null;  
        /**获取下标判断分页状态*/  
        int index = PageState.getOrdinal(pageAction);  
        if(0 == index){  
            /**每页显示多少条*/  
            value = getRequest().getParameter("everyPage");       
        }     
          
        Page page = null;         
        /** 
         * index < 1 只有二种状态 
         * 1 当首次调用时,分页状态类中没有值为 NULL 返回 -1 
         * 2 当页面设置每页显示多少条: index=0,当每页显示多少条时,分页类要重新计算 
         * */  
        if(index < 1){             
            page = PageUtil.inintPage(oracleSql,totalCount,index,value,getPage());  
        }else{    
            /** 
             * 当页面排序时 
             * */  
            if(5 == index){  
                value = getRequest().getParameter("sortName");  
            /** 
             * 到指定多少页 
             * */  
            }else if(6 == index){  
                value = getRequest().getParameter("currentPage");                 
            }  
            page = PageUtil.execPage(index,value,getPage());  
        }  
        setSession(page);  
        return page;  
    }  
      
    private Page getPage() {  
        Page page = (Page)getSession().getAttribute(PageUtil.SESSION_PAGE_KEY);  
        if(page == null){  
            page = new Page();  
        }  
        return page;          
    }     
      
    private void setSession(Page page) {  
        getSession().setAttribute(PageUtil.SESSION_PAGE_KEY,page);        
    }     
} 

2 UserAction.java 

package com.liuzd.s2sh.web;  
  
import java.util.List;  
  
import javax.annotation.Resource;  
  
import org.springframework.context.annotation.Scope;  
import org.springframework.stereotype.Component;  
  
import com.liuzd.common.BaseAction;  
import com.liuzd.common.DbUtils;  
import com.liuzd.page.Page;  
import com.liuzd.s2sh.entity.User;  
import com.liuzd.s2sh.service.UserService;  
  
@Component("u")  
@Scope("prototype")  
public class UserAction extends BaseAction {  
  
    private static final long serialVersionUID = 1L;  
      
    private String message = null;  
  
    private User user = null;  
  
    private String action = null;  
  
    public String getAction() {  
        return action;  
    }  
  
    public void setAction(String action) {  
        this.action = action;  
    }  
  
    public User getUser() {  
        return user;  
    }  
  
    public void setUser(User user) {  
        this.user = user;  
    }  
  
    @Override  
    public String execute() throws Exception {  
        System.out.println("user: " + user);  
  
        User dbUser = this.userService.checkUserExits(user);  
        if (null != dbUser) {  
            message = "用户: " + user.getUsername() + "登录成功";  
            System.out.println(message);  
            getMapSession().put("sessionUser", dbUser);  
            return userList();  
            //return "success";  
        }  
        message = "用户: " + user.getUsername() + "登录失败";  
        return "fail";  
    }  
  
    public String loadUser() {  
        action = "update";  
        message = "编辑用户信息";  
        User loadUser = new User();  
        loadUser.setId(user.getId());  
        user = this.userService.getUserByUid(loadUser);  
        this.getRequest().setAttribute("myname", "天涯海角");  
        this.getMapSession().put("mysex", "男");  
        System.out.println("loaduser: " + user);  
        return "user";  
    }  
  
    public String addUser() {  
        action = "add";  
        return "user";  
    }  
  
    public String saveUser() {  
        this.userService.addUser(user);  
        return "user";  
    }  
  
    public String delUser() {  
        action = "del";  
        this.userService.delUser(user);  
        return userList();  
    }  
  
    public String editUser() {  
        System.out.println("action: " + action + ",编辑用户: " + user);  
        if ("update".equals(action)) {  
            this.userService.editUser(user);  
        } else if ("add".equals(action)) {  
            saveUser();  
        }  
        return userList();  
    }  
      
    public String getMessage() {  
        return message;  
    }  
  
    public void setMessage(String message) {  
        this.message = message;  
    }  
  
    private UserService userService = null;  
    private DbUtils dbUtil = null;  
      
    public String userList() {    
        //因为Hibernate分页的性能问题,使用原生sql来解决  
        String querySql = "select * from users where 1=1 ";  
        //用jdbc查询总条数          
        Long totalCount = getDbUtil().getCountByQuerySql(querySql);       
        //调用父类方法进行分页参数相关计算        
        Page page = executePage(querySql,totalCount," id desc ");         
        //返回分页数据          
        List<User> users = this.userService.getUserListByPage(page);            
        getRequest().setAttribute("userList",users);  
        return "userList";  
    }         
      
  
    public UserService getUserService() {  
        return userService;  
    }  
    @Resource  
    public void setUserService(UserService userService) {  
        this.userService = userService;  
    }     
  
    public DbUtils getDbUtil() {  
        return dbUtil;  
    }  
      
    @Resource  
    public void setDbUtil(DbUtils dbUtil) {  
        this.dbUtil = dbUtil;  
    }  
  
} 

3 UserDAOImpl.java 

package com.liuzd.s2sh.dao.impl;  
  
import java.sql.SQLException;  
import java.util.List;  
  
import javax.annotation.Resource;  
  
import org.hibernate.HibernateException;  
import org.hibernate.Query;  
import org.hibernate.Session;  
import org.springframework.orm.hibernate3.HibernateCallback;  
import org.springframework.orm.hibernate3.HibernateTemplate;  
import org.springframework.stereotype.Component;  
  
import com.liuzd.page.Page;  
import com.liuzd.s2sh.dao.UserDAO;  
import com.liuzd.s2sh.entity.User;  
  
@Component("userDao")  
public class UserDAOImpl implements UserDAO {  
  
    private HibernateTemplate hibernateTemplate;  
  
    public HibernateTemplate getHibernateTemplate() {  
        return hibernateTemplate;  
    }  
  
    @Resource  
    public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {  
        this.hibernateTemplate = hibernateTemplate;  
    }  
  
    @SuppressWarnings("unchecked")  
    public User getUserByUserIdAndUserNameExits(User user) {  
        List<User> users = hibernateTemplate  
                .find("from User u where u.username = '" + user.getUsername()  
                        + "' and u.password='" + user.getPassword() + "'");  
  
        if (users != null && users.size() > 0) {  
            return users.get(0);  
        }  
        return null;  
    }  
  
    public void saveUser(User user) {  
        this.hibernateTemplate.save(user);  
    }  
  
    public void delUser(User user) {  
        User delUser = getUser(user);  
        this.hibernateTemplate.delete(delUser);  
    }  
  
    @SuppressWarnings("unchecked")  
    public List<User> finUserAll() {  
        return this.hibernateTemplate.find("from User");  
    }  
  
    public User getUser(User user) {  
        return this.hibernateTemplate.get(User.class, user.getId());  
    }  
  
    public void updateUser(User user) {  
        this.hibernateTemplate.update(user);  
    }  
      
  
    @SuppressWarnings("unchecked")  
    public Long getUserCount() {          
        List list = this.getHibernateTemplate().find("select count(*) from User");  
        return ((Long) list.iterator().next());  
    }  
      
    public Long getUserCount(String querySql) {       
        return (Long) getHibernateTemplate().find(querySql).iterator().next();  
    }  
  
    @SuppressWarnings("unchecked")  
    public List<User> getUserListByPage(final Page page) {  
        return this.getHibernateTemplate().executeFind(new HibernateCallback() {  
        public Object doInHibernate(Session session)  
            throws HibernateException, SQLException {  
                /*Query query = session.createQuery("from User");                
                //性能问题所在 
                query.setFirstResult(page.getBeginIndex());  
                query.setMaxResults(page.getEveryPage());                
                return query.list();*/  
              
                /*  .add(Restrictions.gt("id", 2)) //greater than = id > 2 
                     .add(Restrictions.lt("id", 8)) //little than = id < 8 
                     .add(Restrictions.like("title", "t_")) 
                     .createCriteria("category") 
                     .add(Restrictions.between("id", 3, 5)) //category.id >= 3 and category.id <=5 
                      
                   .add(Expression.ge("age", new Integer(20)); 
                   .addOrder( Order.asc("name") ) 
                   .addOrder( Order.desc("age") ) 
                   .setMaxResults(50) 
                   .list(); 
                  
                  
                   .add( Property.forName("name").like("F%") ) 
                   .addOrder( Property.forName("name").asc() ) 
                   .addOrder( Property.forName("age").desc() ) 
                   .setMaxResults(50) 
                   .list(); 
                 * */  
              
                /*Criteria c = session.createCriteria(User.class); 
                String sortName = page.getSortName(); 
                if(StringUtils.isNotEmpty(sortName)){ 
                    if("asc".equals(page.getSortState())){ 
                        c.addOrder(org.hibernate.criterion.Order.asc(sortName));                         
                    }else{ 
                        c.addOrder(org.hibernate.criterion.Order.desc(sortName));        
                    }                    
                } 
                c.setFirstResult(page.getBeginIndex()); 
                c.setMaxResults(page.getEveryPage()); 
                return c.list();*/  
                Query query = session.createSQLQuery(page.getQuerySql()).addEntity(User.class);  
                return query.list();  
            }  
        });       
    }  
} 

5  JSP引用 

<%@ page language="java" contentType="text/html; charset=UTF-8"  pageEncoding="UTF-8"%>  
<%@ taglib prefix="s" uri="/struts-tags"%>  
<%@ taglib uri="/WEB-INF/c.tld" prefix="c"%>  
<c:set var="page" value="${sessionScope.page}" />  
<html>  
    <head>  
        <title>用户集合</title>  
    </head>  
  
    <body>  
        <table width="60%" border="1" cellpadding="0" align="center">  
            <thead>  
                <tr>  
                    <th style="cursor: hand;" title="按姓名进行排序" onclick="sortPage('username')" valign="top">  
                        姓名<font color='red'>${page.sortName eq "username" ? page.sortInfo : page.defaultInfo}</font>  
                    </th>  
                    <th style="cursor: hand;" title="按年龄进行排序" onclick="sortPage('age')" valign="top">  
                        年龄<font color='red'>${page.sortName eq "age" ? page.sortInfo : page.defaultInfo}</font>  
                    </th>  
                    <th style="cursor: hand;" title="按性别进行排序" onclick="sortPage('sex')" valign="top">  
                        性别<font color='red'>${page.sortName eq "sex" ? page.sortInfo : page.defaultInfo}</font>  
                    </th>  
                    <th style="cursor: hand;" title="按地址进行排序" onclick="sortPage('address')" valign="top">  
                        地址<font color='red'>${page.sortName eq "address" ? page.sortInfo : page.defaultInfo}</font>  
                    </th>  
                    <th style="cursor: hand;" >  
                        操作  
                    </th>  
                </tr>  
            </thead>  
            <tbody>  
                <!--   
                  <s:iterator value="#request.userList" status="status" >  
                    <tr align="center">         
                      <td><s:property value="username"/></td>  
                      <td><s:property value="age"/></td>  
                      <td><s:property value="sex"/></td>  
                      <td><s:property value="address"/></td>       
                      <td>  
                        <s:a href="userAction!addUser.action">添加</s:a> | <s:a href="userAction!loadUser.action?user.id=%{id}">编辑</s:a> |      
                        <a href="<s:url action="userAction!delUser.action"><s:param name="user.id" value="id"/></s:url>">删除</a>         
                      </td>  
                    </tr>  
                 </s:iterator>    
                -->  
  
                <c:forEach items="${requestScope.userList}" var="user">  
                    <tr align="center">  
                        <td>  
                            ${user.username}  
                        </td>  
                        <td>  
                            ${user.age}  
                        </td>  
                        <td>  
                            ${user.sex eq 1 ? "男" : user.sex eq 2 ? "女" : "未知"}  
                        </td>  
                        <td>  
                            ${user.address}  
                        </td>  
                        <td>  
                            <a  
                                href="${pageContext.request.contextPath}/userAction!addUser.action">添加</a>  
                            |  
                            <a  
                                href="${pageContext.request.contextPath}/userAction!loadUser.action?user.id=${user.id}">编辑</a>  
                            |  
                            <a  
                                href="${pageContext.request.contextPath}/userAction!delUser.action?user.id=${user.id}">删除</a>  
                        </td>  
                    </tr>  
                </c:forEach>  
  
                <jsp:include page="page.jsp">  
                    <jsp:param name="url" value="userAction!userList.action" />  
                    <!-- 演示传值:要用%26 -->  
                    <jsp:param name="urlParams" value="%26age=2" />  
                </jsp:include>  
  
            </tbody>  
        </table>  
        <br>  
        <a href="${pageContext.request.contextPath}/Login.jsp">返回</a>  
        <br>  
        <s:debug></s:debug>  
    </body>  
</html>

五 你不需要关注的分页类与JSP页面,可在附件下载jar与源码 
1 Page.java 

package com.liuzd.page;  
  
import org.apache.commons.lang3.StringUtils;  
import org.apache.commons.lang3.builder.ToStringBuilder;  
  
/** 
 * 分页类 
 * @author liuzd 
 * @version 1.0 2011-05-12 
 * @since JDK1.5 
 * */  
public class Page implements java.io.Serializable{  
      
    private static final long serialVersionUID = 1L;  
    //前一页  
    private Boolean hasPrePage;  
    //后一页  
    private Boolean hasNextPage;  
    //每页显示多少条:默认10条  
    private Long everyPage = 10L;  
    //总页数  
    private Long totalPage;  
    //当前第多少页:默认第1页  
    private Long currentPage = 1L;  
    //开始下标  
    private Long beginIndex;  
    //结束下标  
    private Long endinIndex;  
    //总共多少条  
    private Long totalCount;  
    //查询结果集语句  
    private String querySql;  
    //未进行分页的语句  
    private String initQuerySql;  
    //排序列名  
    private String sortName;      
    //排序状态  
    private String sortState;     
    //排序信息  
    private String sortInfo;  
    //是否排序  
    private Boolean sort;  
    private String defaultInfo = "  ";  
      
      
      
    public String getDefaultInfo() {  
        return defaultInfo;  
    }  
  
    public void setDefaultInfo(String defaultInfo) {  
        this.defaultInfo = defaultInfo;  
    }  
  
    public String getSortInfo() {  
        return sortInfo;  
    }  
  
    public void setSortInfo(String sortInfo) {  
        this.sortInfo = sortInfo;  
    }  
  
    public String getSortName() {  
        return sortName;  
    }  
  
    public void setSortName(String sortName) {  
        setPageSortState(sortName);       
    }  
  
    public String getSortState() {  
        return sortState;  
    }  
  
    public void setSortState(String sortState) {  
        this.sortState = sortState;  
    }  
  
    public String getQuerySql() {  
        return querySql;  
    }  
  
    public void setQuerySql(String querySql) {  
        this.querySql = querySql;  
    }  
  
    public Page() {  
    }  
  
    /** 
     * 常用,用于计算分页 
     * */  
    public Page(Long totalRecords){       
        this.totalCount = totalRecords;  
        setTotalPage(getTotalPage(totalRecords));       
    }  
      
    /** 
     * 设置每页显示多少条时使用 
     * */  
    public Page(Long everyPage,Long totalRecords){    
        this.everyPage = everyPage;  
        this.totalCount = totalRecords;  
        setTotalPage(getTotalPage(totalRecords));       
    }  
      
    /** 
     * @param state   状态码 
     * @param value   到第多少页或者设置每页显示多少条或者为排序列名 
     */  
    public void pageState(int  index,String value) {                  
        sort = false;  
        switch (index) {  
        case 0 :setEveryPage(Long.parseLong(value));break;  
        case 1 :first();break;  
        case 2: previous();break;  
        case 3: next();break;  
        case 4: last();break;  
        case 5: sort = true;sort(value);break;  
        case 6 ://到指定第多少页  
            setCurrentPage(Long.parseLong(value));  
            break;            
        }  
    }  
  
    /** 
     * 最前一页 
     */  
    private void first() {  
        currentPage = 1L;  
    }  
  
    private void previous() {  
        currentPage--;  
    }  
  
    private void next() {  
        currentPage++;  
    }  
  
    private void last() {  
        currentPage = totalPage;  
    }  
  
    private void sort(String sortName) {          
        //设置排序状态  
        setPageSortState(sortName);       
    }  
          
      
      
    /** 
     * 计算总页数 
     * */  
    private Long getTotalPage(Long totalRecords) {  
         Long totalPage = 0L;      
         if (totalRecords % everyPage == 0)  
           totalPage = totalRecords / everyPage;  
         else {  
           totalPage = totalRecords / everyPage + 1;  
         }  
         return totalPage;  
    }     
      
  
    public Long getBeginIndex() {  
        this.beginIndex = (currentPage - 1) * everyPage;  
        return this.beginIndex;  
    }  
  
    public void setBeginIndex(Long beginIndex) {  
        this.beginIndex = beginIndex;  
    }  
  
    public Long getCurrentPage() {  
        this.currentPage = currentPage == 0 ? 1 : currentPage;  
        return this.currentPage;  
    }  
  
    public void setCurrentPage(Long currentPage) {  
        if(0 == currentPage){  
            currentPage = 1L;  
        }  
        this.currentPage = currentPage;  
    }  
  
    public Long getEveryPage() {  
        this.everyPage = everyPage == 0 ? 10 : everyPage;  
        return this.everyPage;  
    }  
  
    public void setEveryPage(Long everyPage) {        
        this.everyPage = everyPage;  
    }  
  
    public Boolean getHasNextPage() {  
        this.hasNextPage = (currentPage != totalPage) && (totalPage != 0);  
        return this.hasNextPage;  
    }  
  
    public void setHasNextPage(Boolean hasNextPage) {  
        this.hasNextPage = hasNextPage;  
    }  
  
    public Boolean getHasPrePage() {  
        this.hasPrePage = currentPage != 1;  
        return this.hasPrePage;  
    }  
  
    public void setHasPrePage(Boolean hasPrePage) {  
        this.hasPrePage = hasPrePage;  
    }  
  
    public Long getTotalPage() {  
        return this.totalPage;  
    }  
  
    public void setTotalPage(Long totalPage) {  
        if(this.currentPage > totalPage){  
            this.currentPage = totalPage;  
        }  
        this.totalPage = totalPage;  
    }  
  
    public Long getTotalCount() {  
        return this.totalCount;  
    }  
  
    public void setTotalCount(Long totalCount) {  
        setTotalPage(getTotalPage(totalCount));    
        this.totalCount = totalCount;  
    }  
  
    @Override  
    public String toString() {  
        return ToStringBuilder.reflectionToString(this);  
    }  
      
    /** 
     * 设置排序状态 
     * */  
    private void setPageSortState(String newPageSortName){        
        //判断之前的排序字段是否为空  
        if(StringUtils.isEmpty(sortName)){  
            //默认排序为升序  
            this.sortState = PageUtil.ASC;        
            this.sortInfo = PageUtil.PAGE_ASC;                        
        }else{  
            if(StringUtils.equalsIgnoreCase(newPageSortName, sortName)){  
                //判断sortState排序状态值  
                if(StringUtils.equalsIgnoreCase(sortState, PageUtil.ASC)){  
                    this.sortState = PageUtil.DESC;  
                    this.sortInfo = PageUtil.PAGE_DESC;                               
                }else{  
                    this.sortState = PageUtil.ASC;  
                    this.sortInfo = PageUtil.PAGE_ASC;                    
                }                 
            }else{  
                //默认  
                this.sortState = PageUtil.ASC;        
                this.sortInfo = PageUtil.PAGE_ASC;  
            }  
        }  
        sortName = newPageSortName.toLowerCase();             
    }  
  
    public Boolean isSort() {  
        return sort;  
    }  
  
    public void setSort(Boolean sort) {  
        this.sort = sort;  
    }  
      
  
    public String getInitQuerySql() {  
        return initQuerySql;  
    }  
  
    public void setInitQuerySql(String initQuerySql) {  
        this.initQuerySql = initQuerySql;  
    }  
  
    public Long getEndinIndex() {  
        this.endinIndex = (currentPage) * everyPage;  
        return endinIndex;  
    }  
  
    public void setEndinIndex(Long endinIndex) {  
        this.endinIndex = endinIndex;  
    }     
}  

2 PageState.java 

package com.liuzd.page;  
  
import org.apache.commons.lang3.StringUtils;  
  
/** 
 * 分页状态类 
 * @author liuzd 
 * @version 1.0 2011-05-12 
 * @since JDK1.5 
 * */  
public enum PageState {  
      
    /** 
     * 设置每页显示多少条 
     * */  
    SETPAGE,  
    /** 
     * 首页 
     * */  
    FIRST,   
    /** 
     * 向前一页 
     * */  
    PREVIOUS,   
    /** 
     * 向后一页 
     * */  
    NEXT,   
    /** 
     * 末页 
     * */  
    LAST,   
    /** 
     * 排序 
     * */  
    SORT,  
    /** 
     * 到第多少页 
     * */  
    GOPAGE;  
  
      
    /** 
     * @param value 索引名称 
     * @return 返回索引下标 
     */  
    public static int getOrdinal(String value) {  
        int index = -1;  
        if (StringUtils.isEmpty(value)) {  
            return index;  
        }  
        String newValue = StringUtils.trim(value).toUpperCase();  
        try {  
            index = valueOf(newValue).ordinal();  
        } catch (IllegalArgumentException e) {}  
        return index;  
    }  
}  

3 PageUtil.java 

package com.liuzd.page;  
  
/** 
 * 分页工具类 
 * @author liuzd 
 * @version 1.0 2011-05-12 
 * @since JDK1.5 
 * */  
public class PageUtil {  
      
    public static final String ASC = "asc";  
    public static final String DESC = "desc";  
    public static final String PAGE_DESC = "↓";  
    public static final String PAGE_ASC = "↑";  
    public static final String PAGE_NULL = "  ";    
    public static final String SESSION_PAGE_KEY = "page";  
      
      
    /** 
     * @param querySql   查询SQL 
     * @param beginIndex 开始下标 
     * @param endinIndex 结束下标 
     * @return 
     */  
    public static String getPageQuerySql(String querySql,Long beginIndex, Long endinIndex) {  
        if(querySql.indexOf("where rn>") != -1 && querySql.indexOf("and rn<=") != -1){  
            return querySql.toUpperCase();  
        }  
        return new java.lang.StringBuffer().append(querySql).append(" where rn>").append(beginIndex).append(" and rn<=").append(endinIndex).toString().toUpperCase();  
    }     
  
    /** 
     * @param querySql    查询SQL 
     * @param orderByName 排序列名  
     * @return 
     */  
    @SuppressWarnings("unused")   
    public static String createQuerySql(String querySql, String orderByName) {  
        StringBuilder sql = new StringBuilder();  
        sql.append("select ttt.* from(select tt.*,rownum rn from(");  
        sql.append(querySql);  
        if (org.apache.commons.lang3.StringUtils.isNotEmpty(orderByName)) {  
            sql.append(" order by ").append(orderByName);  
        }  
        sql.append(" )tt)ttt ");  
        return sql.toString();  
    }  
      
    /** 
     * 取得排序名称+desc or asc 
     * @param querySql 查询SQL 
     * @return 返回查询语句 SELECT ... FROM TABLE  ORDER BY ID DESC 中的 ID DESC 
     */  
    public static String getSortDescOrAsc(String querySql) {  
        /**取得ordery by之前的查询字符串*/   
        querySql = querySql.toUpperCase();  
        String temp = "ORDER BY";                 
        int orderIndex = querySql.lastIndexOf(temp);      
        String newsql = querySql.substring(orderIndex);   
        String temp2 = ")";       
        int lastIndex = newsql.indexOf(temp2);    
        String orderByName = newsql.substring(temp.length(),lastIndex).trim();  
        return orderByName;  
    }     
      
    /** 
     * 初始化分页类 
     * @param initPageSql  未分页的查询SQL 
     * @param totalCount   总行数 
     * @param index        分页状态 
     * @param value        只有在设置每页显示多少条时,值不会NULL,其它为NULL 
     */  
    public  static Page inintPage(String initPageSql,Long totalCount,Integer index,String value,Page sessionPage){    
        Page page = null;  
        if(index < 0){  
             page = new Page(totalCount);  
        }else{  
             /**每页显示多少条*/  
             Long everPage = null == value ? 10 : Long.parseLong(value);  
             /**获取Session中的分页类,方便保存页面分页状态*/  
             page = sessionPage;               
             page.setEveryPage(everPage);  
             page.setTotalCount(totalCount);              
        }         
        page.setInitQuerySql(initPageSql);            
        /**对查询SQL进行分页计算*/  
        String querySql = getPageQuerySql(initPageSql,page.getBeginIndex(), page.getEndinIndex());  
        /**真正传递到后台执行获取分页数据的sql*/  
        page.setQuerySql(querySql);  
        /**保存到Session中*/  
        return page;          
    }  
      
      
  
      
    /** 
     * 当页点击:首页,前一页,后一页,末页,排序,到第多少页时进行分页操作 
     * @param index 分页状态 
     * @param value 排序字段名或者到第多少页 
     */  
    public static Page execPage(int  index,String value,Page sessionPage){        
          
        Page page = sessionPage;      
          
        /**调用方法进行分页计算*/  
        page.pageState(index,value);  
        /**未进行分页前的sql*/  
        String initPageSql = page.getInitQuerySql();  
        /**进行分页SQL组合*/  
        String  querySql = getPageQuerySql(initPageSql,page.getBeginIndex(), page.getEndinIndex());  
          
        /**替换排序列名*/  
        if (page.isSort() == true) {              
            String sortName = page.getSortName();  
            if (null != sortName) {  
                /**获取排序状态:值(desc or asc)*/  
                String descAsc = page.getSortState();             
                /**组合新的排序字段与状态*/  
                String sortNameDescAsc = (" " + sortName + " " + descAsc).toUpperCase();  
                /**返回之前的排序字段与状态*/  
                String getOldSortName = PageUtil.getSortDescOrAsc(querySql);  
                /**返回最新的排序字段与状态*/  
                querySql = querySql.replace(getOldSortName,sortNameDescAsc);  
            }  
        }  
        page.setQuerySql(querySql);  
        return page;          
    }  
  
} 

4 page.jsp 

<%@ page language="java" contentType="text/html; charset=UTF-8"  pageEncoding="UTF-8"%>  
<%@ taglib uri="/WEB-INF/c.tld" prefix="c"%>  
<c:set var="page" value="${sessionScope.page}" />  
<c:set var="path" value="${pageContext.request.contextPath}" />  
<c:set var="url" value="${param.url}" />  
<c:set var="urlParams" value="${param.urlParams}" />  
<c:set var="pathurl" value="${path}/${url}" />  
<tr>  
    <td colspan="5">  
        共${page.totalCount}条记录 共${page.totalPage}页 每页显示${page.everyPage}条  
        当前第${page.currentPage}页   
        <c:choose>  
            <c:when test="${page.hasPrePage eq false}">  
                <<首页 <上页   
            </c:when>  
            <c:otherwise>  
                <a href="${pathurl}?&pageAction=first${urlParams}"><<首页 </a>   
                <a href="${pathurl}?pageAction=previous${urlParams}" /><上一页</a>  
            </c:otherwise>  
        </c:choose>  
         ||   
        <c:choose>  
            <c:when test="${page.hasNextPage eq false}">  
                 下页> 尾页>>  
            </c:when>  
            <c:otherwise>  
                <a href="${pathurl}?&pageAction=next${urlParams}">下一页> </a>   
                <a href="${pathurl}?pageAction=last${urlParams}" />末页>></a>  
            </c:otherwise>  
        </c:choose>  
           
        <SELECT name="indexChange" id="indexChange"  
            onchange="getCurrentPage(this.value);">  
            <c:forEach var="index" begin="1" end="${page.totalPage}" step="1">  
                <option value="${index}" ${page.currentPage eq index ? "selected" : ""}>  
                    第${index}页  
                </option>  
            </c:forEach>  
        </SELECT>  
           
        每页显示:<select name="everyPage" id="everyPage" onchange="setEveryPage(this.value);">  
                   <c:forEach var="pageCount" begin="5" end="${page.totalCount}" step="5">                          
                        <option value="${pageCount}" ${page.everyPage eq pageCount ? "selected" : ""}>  
                            ${pageCount}条  
                        </option>  
                    </c:forEach>  
               </select>  
    </td>  
</tr>  
<div style='display: none'>  
    <a class=listlink id="indexPageHref" href='#'></a>  
</div>  
<script>  
function getCurrentPage(index){   
    var a = document.getElementById("indexPageHref");     
    a.href = '${pathurl}?pageAction=gopage¤tPage='+index+'${urlParams}';          
    a.setAttribute("onclick",'');            
    a.click("return false");     
}  
function setEveryPage(everyPage){     
    var a = document.getElementById("indexPageHref");  
    var currentPage = document.getElementById('indexChange').value;  
    a.href = '${pathurl}?pageAction=setpage&everyPage='+everyPage+'${urlParams}';         
    a.setAttribute("onclick",'');            
    a.click("return false");     
}  
function sortPage(sortName){      
    var a = document.getElementById("indexPageHref");     
    a.href = '${pathurl}?pageAction=sort&sortName='+sortName+'${urlParams}';        
    a.setAttribute("onclick",'');        
    a.click("return false");     
}  
</script> 


demo:http://download.youkuaiyun.com/detail/qilixiang012/8386561

转载自:http://liuzidong.iteye.com/blog/1042172

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值