SSH:Struts2.2+Hibernate3.6+Spring3.1分页示例

参考资料
1 ssh分页(多个例子)
http://useryouyou.iteye.com/blog/593954
2 ssh2分页例子
http://459104018-qq-com.iteye.com/blog/467196
3 ssh2分页
http://blog.csdn.net/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图片
SSH:Struts2.2+Hibernate3.6+Spring3.1分页示例_第1张图片
2 工程代码图片
SSH:Struts2.2+Hibernate3.6+Spring3.1分页示例_第2张图片
3 page.jar图片
SSH:Struts2.2+Hibernate3.6+Spring3.1分页示例_第3张图片
三 此示例是在:
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 = "&nbsp;&nbsp;";
	
	
	
	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 = "&nbsp;&nbsp;";	
	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}页&nbsp;
		<c:choose>
			<c:when test="${page.hasPrePage eq false}">
 			    &lt&lt首页&nbsp;&lt上页&nbsp;
 			</c:when>
			<c:otherwise>
				<a href="${pathurl}?&pageAction=first${urlParams}">&lt&lt首页&nbsp;</a>&nbsp;
				<a href="${pathurl}?pageAction=previous${urlParams}" />&lt上一页</a>
			</c:otherwise>
		</c:choose>
		&nbsp;||&nbsp;
		<c:choose>
			<c:when test="${page.hasNextPage eq false}">
 			    &nbsp;下页&gt&nbsp;尾页&gt&gt
 			</c:when>
			<c:otherwise>
				<a href="${pathurl}?&pageAction=next${urlParams}">下一页&gt&nbsp;</a>&nbsp;
				<a href="${pathurl}?pageAction=last${urlParams}" />末页&gt&gt</a>
			</c:otherwise>
		</c:choose>
		&nbsp;
		<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>
		&nbsp;
		每页显示:<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&currentPage='+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>

你可能感兴趣的:(sql,Hibernate,ssh,C#,ITeye)