参考资料
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图片
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>
- 原地址是 http://liuzidong.iteye.com/blog/1042172