SSH超实用分页实现(原创开源)!
SSH的分页网上有不少的例子,有利用session的,有利用分页组件的。我几个师兄原来搞的SSH项目也有一个成熟的分页插件。具体业务实现类中的分页方法:publicListget*****(intpageNO){DetachedCriteriadc=DetachedCriteria.forClass(****...
SSH的分页网上有不少的例子,有利用session的,有利用分页组件的。我几个师兄原来搞的SSH项目也有一个成熟的分页插件。
具体业务实现类中的分页方法:
DetachedCriteria dc = DetachedCriteria.forClass( **** . class );
List list =***** Dao.getList(dc,pageNO, 15 );
int a = 0 ;
if (list.equals( null )){a = 1 ;}
return list;
}
{
***** jg;
DetachedCriteria dc = DetachedCriteria.forClass( ***** . class );
PageBean pb = collegeDao.getPageBean(dc,pageNO, 15 );
return pb;
}
然后是一个PageBean的工具类,负责创建分页属性和基本逻辑。
然后是页面的bean获取输出信息及分页属性。
我觉得单纯的拷贝,自己用的不是很顺手。于是自己也搞了一个,个人认为可以清晰的分层,实现这个分页。分层还是传统的SSH七层结构。
SSH结构思想参考我的另一篇随笔SSH思想之我见!
下面是分页思想,一个初始化方法和一个分页实现方法:
分页的util类:
import java.util.List;
@SuppressWarnings( " unchecked " )
public class Page {
private int pageSize;
private int totalPage;
private int rowCount;
private int currentPage;
private int prePage;
private int nextPage;
private boolean hasNextPage;
private boolean hasPreviousPage;
private List list;
public Page() {
this .pageSize = 10 ;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize( int pageSize) {
this .pageSize = pageSize;
}
public int getTotalPage() {
return totalPage;
}
public void setTotalPage( int totalPage) {
this .totalPage = totalPage;
}
public int getRowCount() {
return rowCount;
}
public void setRowCount( int rowCount) {
this .rowCount = rowCount;
}
public int getCurrentPage() {
return currentPage;
}
public void setCurrentPage( int currentPage) {
this .currentPage = currentPage;
}
public int getPrePage() {
return prePage;
}
public void setPrePage( int prePage) {
this .prePage = prePage;
}
public int getNextPage() {
return nextPage;
}
public void setNextPage( int nextPage) {
this .nextPage = nextPage;
}
public boolean isHasNextPage() {
return hasNextPage;
}
public void setHasNextPage( boolean hasNextPage) {
this .hasNextPage = hasNextPage;
}
public boolean isHasPreviousPage() {
return hasPreviousPage;
}
public void setHasPreviousPage( boolean hasPreviousPage) {
this .hasPreviousPage = hasPreviousPage;
}
public List getList() {
return list;
}
public void setList(List list) {
this .list = list;
}
}
分页的数据库操作和逻辑判断我把他单独用一个PageDaoImpl来实现:
* 施杨的分页daoimpl类
* */
package com.sy.dao.impl;
import java.sql.SQLException;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import com.sy.dao.BaseDao;
import com.sy.util.Page;
@SuppressWarnings( " unchecked " )
public class PageDaoImpl extends HibernateDaoSupport {
private String hql;
public Page page;
public int start;
public BaseDao dao;
public void setDao(BaseDao dao) {
this .dao = dao;
}
public void init( int start,String tableName){ // ͨ��init����ʵ����ij�ʼ��
page = new Page();
this .hql = " from " + tableName;
this .start = start;
setRowCount();
setTotalPage();
setCurrentPage();
setPrePage();
setNextPage();
setPreOrNextBoolean();
}
public int getRowCount(){
List list = dao.find(hql);
if (list.isEmpty()){
return 0 ;
}
return list.size();
}
public Page getPage(){
List list = (List)getHibernateTemplate().execute( new HibernateCallback(){
public Object doInHibernate(Session session) throws HibernateException, SQLException {
Query query = session.createQuery(hql);
query.setFirstResult(getStartIndex());
query.setMaxResults(page.getPageSize());
return query.list();
}
});
page.setList(list);
return page;
}
public void setPreOrNextBoolean() {
if (page.getCurrentPage() <= 1 ) {
page.setHasPreviousPage( false );
} else {
page.setHasPreviousPage( true );
}
if (page.getCurrentPage() >= page.getTotalPage()) {
page.setHasNextPage( false );
} else {
page.setHasNextPage( true );
}
}
public void setCurrentPage() {
if (start < 1 ) {
page.setCurrentPage( 1 );
}
if (start > page.getTotalPage()) {
page.setCurrentPage(page.getTotalPage());
}
page.setCurrentPage(start);
}
public void setPrePage() {
page.setPrePage(page.getCurrentPage() - 1 );
}
public void setNextPage() {
page.setNextPage(page.getCurrentPage() + 1 );
}
public void setTotalPage() {
int rowCount = getRowCount();
int pageSize = page.getPageSize();
if (rowCount > pageSize) {
if (rowCount % pageSize == 0 ) {
page.setTotalPage(rowCount / pageSize);
} else {
page.setTotalPage( 1 + (rowCount / pageSize));
}
} else {
page.setTotalPage( 1 );
}
}
public void setRowCount() {
page.setRowCount(getRowCount());
}
public int getStartIndex() {
int startIndex = 0 ;
if (start < 0 ) {
startIndex = 0 ;
} else {
if (start > page.getTotalPage()) {
startIndex = page.getPageSize() * (page.getTotalPage() - 1 );
} else {
startIndex = page.getPageSize() * (start - 1 );
}
}
return startIndex;
}
}
然后是业务层接口,举例AdminService.java
package com.sy.service;
import java.util.List;
import com.sy.util.Page;
import com.sy.vo.Admin;
public interface AdminService extends BaseService{
// 分页初始化
public void init( int pno);
// 分页实现
public Page getPage();
}
实现类AdminServiceImpl.java
package com.sy.service.impl;
import java.util.List;
import com.sy.dao.impl.AdminDaoImpl;
import com.sy.dao.impl.PageDaoImpl;
import com.sy.service.AdminService;
import com.sy.util.Page;
import com.sy.vo.Admin;
@SuppressWarnings( " unchecked " )
public class AdminServiceImpl extends BaseServiceImpl implements AdminService {
.
public Page getPage() {
return Pdao.getPage();
}
public void init( int pno) {
String tableName = " Admin " ;
Pdao.init(pno,tableName);
}
}
struts的action层AdminAction.java
package com.sy.action;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;
import com.sy.form.AdminForm;
import com.sy.form.LoginForm;
import com.sy.service.AdminService;
import com.sy.util.MD5;
import com.sy.util.Page;
import com.sy.vo.Admin;
@SuppressWarnings( " unchecked " )
public class AdminAction extends BaseAction {
.
// 查看管理员
public ActionForward listAdmins(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
AdminService as = (AdminService) super .getBean( " AdminService " );
int pno = ( new Integer(request.getParameter( " pno " ))).intValue();
as.init(pno);
Page myPage = as.getPage();
List myList = as.getPage().getList();
request.setAttribute( " myPage " , myPage);
request.setAttribute( " AdminList " , myList);
return mapping.findForward( " show " );
}
}
结构清晰,也很实用。
页面lookAdmin.jsp
<! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" >
<% @ taglib uri = " http://java.sun.com/jsp/jstl/core " prefix = " c " %>
<% @ taglib uri = " http://struts.apache.org/tags-bean " prefix = " bean " %>
<% @ taglib uri = " http://struts.apache.org/tags-html " prefix = " html " %>
<% @ taglib uri = " http://struts.apache.org/tags-logic " prefix = " logic " %>
<% @ taglib uri = " http://struts.apache.org/tags-tiles " prefix = " tiles " %>
< html >
< head >
< meta http-equiv ="Content-Language" content ="zh-cn" >
< meta http-equiv ="Content-Type" content ="text/html; charset=utf-8" >
< title > 施杨SSH新闻发布 </ title >
</ head >
< body >
< center >
< h3 >
查看管理员
</ h3 >
< br >
< a href ="./admin/addAdmin.jsp" > 添加管理员 </ a >
< br >
< a href ="./NewsPage2.do?pno=1" > 查看新闻 </ a >
< br >
< table border ="2" width ="600" >
< tr >
< td >
用户名
</ td >
< td >
密码
</ td >
< td >
操作
</ td >
</ tr >
< c:forEach items ="${requestScope['AdminList']}" var ="admin" >
< tr align ="center" >
< td width ="20%" height ="10" >< c:out value ="${admin.aname}" /></ td >
< td width ="20%" height ="10" >< c:out value ="${admin.apassword}" /></ td >
< td >
< a href ="./editAdmin.do?aid=<c:out value=" ${admin.aid}" /> ">修改 </ a >
< a href ="./deleteAdmin.do?aid=<c:out value=" ${admin.aid}" /> " οnclick="javascript:return confirm('您确定删除吗?')">删除 </ a >
</ td >
</ tr >
</ c:forEach >
</ table >
< table align ="center" width ="500" >
< tr >
< td align ="center" colspan ="10" >
< logic:present name ="myPage" >
< html:link page ="/AdminPage.do?pno=1" > 首页 </ html:link >
< logic:equal name ="myPage" property ="hasPreviousPage" value ="false" > 上一页 </ logic:equal >
< logic:equal name ="myPage" property ="hasPreviousPage" value ="true" >
< a href ="./AdminPage.do?pno=<bean:write name=" myPage" property ="prePage" /> ">上一页 </ a >
</ logic:equal >
每页 < bean:write name ="myPage" property ="pageSize" /> 条记录
共 < bean:write name ="myPage" property ="rowCount" /> 条记录
当前第( < bean:write name ="myPage" property ="currentPage" /> / < bean:write name ="myPage" property ="totalPage" /> )页
< logic:equal name ="myPage" property ="hasNextPage" value ="false" > 下一页 </ logic:equal >
< logic:equal name ="myPage" property ="hasNextPage" value ="true" >
< a href ="./AdminPage.do?pno=<bean:write name=" myPage" property ="nextPage" /> ">下一页 </ a >
</ logic:equal >
< a href ="./AdminPage.do?pno=<bean:write name='myPage' property='totalPage'/>" > 末页 </ a >
</ logic:present >
</ td >
</ tr >
</ table >
</ center >
</ body >
</ html >
本文转自施杨博客园博客,原文链接:http://www.cnblogs.com/shiyangxt/archive/2008/12/06/1349099.html,如需转载请自行联系原作者
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)