- 浏览: 18891 次
- 性别:
- 来自: 深圳
最新评论
-
laitaogood:
引用* "spring-aop" (~32 ...
关于spring包的详解 (转至http://lukec.javaeye.com/blog/170933http://lukec.javaeye.com/bl) -
useryouyou:
xiongfhvk 写道很不错,搭建系统框架的时候正好需要这些 ...
关于spring包的详解 (转至http://lukec.javaeye.com/blog/170933http://lukec.javaeye.com/bl) -
useryouyou:
hbhdhaibin 写道3q 谢谢
关于spring包的详解 (转至http://lukec.javaeye.com/blog/170933http://lukec.javaeye.com/bl) -
hbhdhaibin:
3q
关于spring包的详解 (转至http://lukec.javaeye.com/blog/170933http://lukec.javaeye.com/bl) -
caoyangx:
你说的好像是老版本的吧?
关于spring包的详解 (转至http://lukec.javaeye.com/blog/170933http://lukec.javaeye.com/bl)
---------------------------------------------------------------------
先是一个page的bean:
package com.leatherstore.other; public class Page { /** 是否有上一页 */ private boolean hasPrePage; /** 是否有下一页 */ private boolean hasNextPage; /** 每页的数量 */ private int everyPage; /** 总页数 */ private int totalPage; /** 当前页*/ private int currentPage; /** 起始点 */ private int beginIndex; /** 总记录数*/ private int totalCount; /** * @return totalCount */ public int getTotalCount() { return totalCount; } /** * @param totalCount 要设置的 totalCount */ public void setTotalCount(int totalCount) { this.totalCount = totalCount; } /** The default constructor */ public Page(){ } /** construct the page by everyPage * @param everyPage * */ public Page(int everyPage){ this.everyPage = everyPage; } /** The whole constructor */ public Page(boolean hasPrePage, boolean hasNextPage, int everyPage, int totalPage, int currentPage, int beginIndex,int totalCount) { this.hasPrePage = hasPrePage; this.hasNextPage = hasNextPage; this.everyPage = everyPage; this.totalPage = totalPage; this.currentPage = currentPage; this.beginIndex = beginIndex; this.totalCount = totalCount; } /** * @return * Returns the beginIndex. */ public int getBeginIndex() { return beginIndex; } /** * @param beginIndex * The beginIndex to set. */ public void setBeginIndex(int beginIndex) { this.beginIndex = beginIndex; } /** * @return * Returns the currentPage. */ public int getCurrentPage() { return currentPage; } /** * @param currentPage * The currentPage to set. */ public void setCurrentPage(int currentPage) { this.currentPage = currentPage; } /** * @return * Returns the everyPage. */ public int getEveryPage() { return everyPage; } /** * @param everyPage * The everyPage to set. */ public void setEveryPage(int everyPage) { this.everyPage = everyPage; } /** * @return * Returns the hasNextPage. */ public boolean getHasNextPage() { return hasNextPage; } /** * @param hasNextPage * The hasNextPage to set. */ public void setHasNextPage(boolean hasNextPage) { this.hasNextPage = hasNextPage; } /** * @return * Returns the hasPrePage. */ public boolean getHasPrePage() { return hasPrePage; } /** * @param hasPrePage * The hasPrePage to set. */ public void setHasPrePage(boolean hasPrePage) { this.hasPrePage = hasPrePage; } /** * @return Returns the totalPage. * */ public int getTotalPage() { return totalPage; } /** * @param totalPage * The totalPage to set. */ public void setTotalPage(int totalPage) { this.totalPage = totalPage; } } 然后构建一个page的工厂PageUtil: package com.leatherstore.other; public class PageUtil { /** * Use the origin page to create a new page * * @param page * @param totalRecords * @return */ public static Page createPage(Page page, int totalRecords) { return createPage(page.getEveryPage(), page.getCurrentPage(), totalRecords); } /** * the basic page utils not including exception handler * * @param everyPage * @param currentPage * @param totalRecords * @return page */ public static Page createPage(int everyPage, int currentPage, int totalRecords) { everyPage = getEveryPage(everyPage); currentPage = getCurrentPage(currentPage); int beginIndex = getBeginIndex(everyPage, currentPage); int totalPage = getTotalPage(everyPage, totalRecords); boolean hasNextPage = hasNextPage(currentPage, totalPage); boolean hasPrePage = hasPrePage(currentPage); return new Page(hasPrePage, hasNextPage, everyPage, totalPage, currentPage, beginIndex, totalRecords); } private static int getEveryPage(int everyPage) { return everyPage == 0 ? 10 : everyPage; } private static int getCurrentPage(int currentPage) { return currentPage == 0 ? 1 : currentPage; } private static int getBeginIndex(int everyPage, int currentPage) { return (currentPage - 1) * everyPage; } private static int getTotalPage(int everyPage, int totalRecords) { int totalPage = 0; if (totalRecords % everyPage == 0) totalPage = totalRecords / everyPage; else totalPage = totalRecords / everyPage + 1; return totalPage; } private static boolean hasPrePage(int currentPage) { return currentPage == 1 ? false : true; } private static boolean hasNextPage(int currentPage, int totalPage) { return currentPage == totalPage || totalPage == 0 ? false : true; } } 然后建一个专用的bean: package com.leatherstore.hibernate.domain; import java.util.List; import com.leatherstore.other.Page; public class Result { private Page page; //分页信息 private List content; //每页显示的集合 /** * The default constructor */ public Result() { super(); } /** * The constructor using fields * * @param page * @param content */ public Result(Page page, List content) { this.page = page; this.content = content; } /** * @return Returns the content. */ public List getContent() { return content; } /** * @return Returns the page. */ public Page getPage() { return page; } /** * @param content * The content to set. */ public void setContent(List content) { this.content = content; } /** * @param page * The page to set. */ public void setPage(Page page) { this.page = page; } } 然后在数据访问层写两个方法: ProductDAO: public List getProductByPage(Page page); public int getProductCount(); //返回数据的总数 ProductDAO的接口实现ProductDAOImpl: //为了在spring里统一编程风格:我用的回调的方法 public List getProductByPage(final Page page) { return this.getHibernateTemplate().executeFind(new HibernateCallback(){ public Object doInHibernate(Session session) throws HibernateException, SQLException { Query query=session.createQuery("from Productinfo"); query.setFirstResult(page.getBeginIndex()); //hibernate分页的精髓 呵呵 query.setMaxResults(page.getEveryPage()); return query.list(); } }); } public int getProductCount() { List list=this.getHibernateTemplate().find("select count(*) from Productinfo"); return ((Integer)list.iterator().next()).intValue(); } 然后是业务层: IProduct: public Result listProduct(Page page); 然后IProduct接口的实现:IProductImpl: private ProductDAO productDAO; public void setProductDAO(ProductDAO productDAO){ this.productDAO=productDAO; } public Result listProduct(Page page) { int totalRecords = this.productDAO.getProductCount(); page = PageUtil.createPage(page, totalRecords); List products = this.productDAO.getProductByPage(page); return new Result(page, products); } 然后再代理层: ProductProxy: IProduct pro=(IProduct)AppContext.getInstance().getappcontext().getBean("productServicewithTran"); public Result productlist(Page page){ try{ return pro.listProduct(page); }catch(DataAccessException ex){ ex.printStackTrace(); return null; } } 呵呵 终于到productAction啦 显示前方法的代码 Page page = new Page(); //实例化一个page对象 page.setEveryPage(10); //设置每页显示的条数 page.setCurrentPage(1); //为第一页 Result result = pdp.productlist(page); request.setAttribute("page", pageinfo); request.setAttribute("productlist", list); return mapping.findForward("showProduct"); 接着就是jsp页面了 <logic:iterate id="product" name="productlist"> //中间迭代所要显示的数据 </logic:iterate> <tr> <td width="80" height="30"> </td> <logic:equal value="true" name="page" property="hasPrePage"> <td width="150" height="30"><div align="right"><a href="../product.do?method=showProductByTag&index=first&msg=${msg }">首页</a></div></td> <td width="80" height="30"><div align="center"><a href="../product.do?method=showProductByTag&index=prew&pageno=${page.currentPage -1}&msg=${msg }">上一页</a></div></td> </logic:equal> <logic:notEqual value="true" name="page" property="hasPrePage"> <td width="150" height="30"><div align="right">首页</div></td> <td width="80" height="30"><div align="center">上一页</div></td> </logic:notEqual> <logic:equal value="true" name="page" property="hasNextPage"> <td width="80" height="30"><div align="center"><a href="../product.do?method=showProductByTag&index=next&pageno=${page.currentPage +1 }&msg=${msg }">下一页</a></div></td> <td width="80" height="30"><div align="center"><a href="../product.do?method=showProductByTag&index=end&pageno=${page.totalPage }&msg=${msg }">尾页</a></div></td> </logic:equal> <logic:notEqual value="true" name="page" property="hasNextPage"> <td width="80" height="30"><div align="center">下一页</div></td> <td width="80" height="30"><div align="center">尾页</div></td> </logic:notEqual> <td height="30" colspan="3"><div align="center">页次${page.currentPage }/${page.totalPage } 共${page.totalCount }条记录</div> <div align="center"></div></td> </tr> 可以显示相应的页面信息 然后productAction里面的showProductByTag代码如下: Page page = new Page(); page.setEveryPage(10); String pagemark = request.getParameter("goto"); if (pagemark == null) { String state = request.getParameter("index"); String pageno = request.getParameter("pageno"); System.out.println("pageno=" + pageno); if ("first".equals(state)) { page.setCurrentPage(1); Result result = pdp.productlist(page); request.setAttribute("page", result.getPage()); request.setAttribute("productlist", result.getContent()); } else if ("prew".equals(state)) { page.setCurrentPage(Integer.parseInt(pageno)); Result result = pdp.productlist(page); request.setAttribute("page", result.getPage()); request.setAttribute("productlist", result.getContent()); } else if ("next".equals(state)) { page.setCurrentPage(Integer.parseInt(pageno)); Result result = pdp.productlist(page); request.setAttribute("page", result.getPage()); request.setAttribute("productlist", result.getContent()); } else if ("end".equals(state)) { page.setCurrentPage(Integer.parseInt(pageno)); Result result = pdp.productlist(page); request.setAttribute("page", result.getPage()); request.setAttribute("productlist", result.getContent()); } } else { page.setCurrentPage(Integer.parseInt(pagemark)); Result result = pdp.productlist(page); request.setAttribute("page", result.getPage()); request.setAttribute("productlist", result.getContent()); } return mapping.findForward("showProduct");
-------------------------------------------------------------------
SSH的分页网上有不少的例子,有利用session的,有利用分页组件的。我几个师兄原来搞的SSH项目也有一个成熟的分页插件。
具体业务实现类中的分页方法:
public List get*****(int pageNO){ DetachedCriteria dc = DetachedCriteria.forClass(****.class); List list=*****Dao.getList(dc,pageNO,15); int a = 0; if (list.equals(null)){a=1;} return list; } public PageBean getBean(int pageNO) { ***** jg; DetachedCriteria dc = DetachedCriteria.forClass(*****.class); PageBean pb=collegeDao.getPageBean(dc,pageNO,15); return pb; } 然后是一个PageBean的工具类,负责创建分页属性和基本逻辑。 然后是页面的bean获取输出信息及分页属性。 我觉得单纯的拷贝,自己用的不是很顺手。于是自己也搞了一个,个人认为可以清晰的分层,实现这个分页。分层还是传统的SSH七层结构。 SSH结构思想参考我的另一篇随笔SSH思想之我见! 下面是分页思想,一个初始化方法和一个分页实现方法: 分页的util类: package com.sy.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 //管理员service层接口 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 //管理员service层实现类 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 //管理员action实现类 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 <%@ page language="java" pageEncoding="UTF-8"%> <!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}"/>" onclick="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>
----------------------------------------------------------------------
相关推荐
SSH分页_完整例子 SSH分页_完整例子 SSH分页_完整例子
SSH分页 分页 通用分页 struts2分页
这是我的一个分页的小例子.以便不记得的时候使用
ssh分页 ssh分页ssh分页ssh分页ssh分页ssh分页
ssh分页例子ssh分页例子ssh分页例子ssh分页例子
SSH+ExtJs分页小例子
好强大的ssh分页,封装的很好,适合初学者研究下,可以更快帮助初学者掌握分页机制,学起来不是很容易,但是当你学会了就豁然开朗,其他的分页直接可以藐视了,哈。。。我就是这样学过来的 有相关教程:...
分页啊,分页啊。 我找了好久的SSH分页,没找到,只好自个写啦。
SSH分页组件SSH分页组件SSH分页组件SSH分页组件
SSH 通用分页插件 可以用以所有的数据分页 带有条件查询
SSH分页技术详解与实例,有注释,能够看懂每一步,若再实际项目中用到,只需根据实际情况更改几处既可
ssh 分页代码ssh 分页代码ssh 分页代码ssh 分页代码ssh 分页代码ssh 分页代码ssh 分页代码ssh 分页代码ssh 分页代码
这个一个关于String+Spring+Hibernate框架,可以分页显示的实例代码.
分页程序是web不可缺少的功能,下面讲一下如何在ssh下创建分页程序。 该分页在优点为:pager的功能配置都在基类,子类使用分页功能极容易,方便进行开发。 缺点:功能复杂
简单,高效的ssh分页源码,请依照资源说明操作
SSH+Mysql无刷新分页实例,导入数据库,运行即可
ssh 分页显示 多行多列 ssh 分页显示 多行多列
按照 文档中的的内容轻松实现SSH分页,文档中包含 了 分页bean。直接复制即可使用。有详细的类和方法说明。
SSH实现分页实例
ssh 分页组件,含使用示例,可直接使用,适用mysql,不支持oracle