servlet+mvc实现分页显示列表页
来源:互联网 发布:windows hello好用吗 编辑:程序博客网 时间:2024/06/04 20:21
实现分页显示有好多种方法,有客户端显示的用JS,有服务端分页的。在此我对服务端的分页功能进行叙述
先展示下我的项目的目录结构:
标准的MVC模式,现在我的分页步骤是从jsp调用servlet,通过servlet调用对应的service类,service类去调用dao类
1、先看下页面中的调用方式:
<div>当前${requestScope.pageBean.currentPage}/${requestScope.pageBean.totalPage }页 <a href="${pageContext.request.contextPath}/SenInfoManagerServlet?method=showSenInfo¤tPage=1">首页</a> <a href="${pageContext.request.contextPath }/SenInfoManagerServlet?method=showSenInfo¤tPage=${requestScope.pageBean.currentPage-1}">上一页</a> <a href="${pageContext.request.contextPath }/SenInfoManagerServlet?method=showSenInfo¤tPage=${requestScope.pageBean.currentPage+1}">下一页</a> <a href="${pageContext.request.contextPath }/SenInfoManagerServlet?method=showSenInfo¤tPage=${requestScope.pageBean.totalPage}">尾页</a> </div>
定义了当前页,首页,上一页,下一页,尾页等方式。通过调用对应的servlet及currentPage,totalPage等参数,传递对应的pageBean数据
2、再看下servlet调用时的代码:
private void showSenInfo(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{ try { String currPage = request.getParameter("currentPage"); if(currPage == null || "".equals(currPage.trim())) { currPage = "1"; //第一次访问,设置当前页为1 } int currentPage = Integer.parseInt(currPage); PageBean<SenInfo> pageBean = new PageBean<SenInfo>(); pageBean.setCurrentPage(currentPage); List<SenInfo> pageData = senInfoService.getAllSenInfo(pageBean); request.setAttribute("senInfoList",pageData); request.setAttribute("pageBean", pageBean); uri = request.getRequestDispatcher("/manager/senInfoManager.jsp"); WebUtils.goTo(request,response,uri); }catch(Exception e) { LogUtils.getLogger(SenInfoManagerServlet.class.getName(), "error", e.toString()); } }
此方法获取当前页参数,其中对应的PageBean类是我定义的翻页的Model类,下面看PageBean对应的设计代码:
public class PageBean<T> { private int currentPage = 1; //当前页,默认显示第一页 private int pageCount = 10; //每页显示的行数(查询返回的行数) private int totalCount; //总记录数 private int totalPage; //总页数= 总记录数/每页显示的行数(+1) private List<T> pageData; // 分页查询到的数据 public int getCurrentPage() { return currentPage; } public void setCurrentPage(int currentPage) { this.currentPage = currentPage; } public int getPageCount() { return pageCount; } public void setPageCount(int pageCount) { this.pageCount = pageCount; } public int getTotalCount() { return totalCount; } public void setTotalCount(int totalCount) { this.totalCount = totalCount; } public int getTotalPage() { if(totalCount % pageCount == 0) { totalPage = totalCount / pageCount; }else { totalPage = totalCount / pageCount +1; } return totalPage; } public void setTotalPage(int totalPage) { this.totalPage = totalPage; } public List<T> getPageData() { return pageData; } public void setPageData(List<T> pageData) { this.pageData = pageData; }}
在此分页类中设置了当前页currentPage,每页显示的总行数pageCount,总记录数totalCount,分页查询到的数据列表。
3、通过service调用dao类不再展示,其中service类没做其他任何操作,直接调用的dao类,现在看看dao类的设计代码:
先获取总数目:
/** * 获取总数目 */ @Override public int getTotalCount() { StringBuilder sb = new StringBuilder(); sb.append(" SELECT"); sb.append(" count(*) "); sb.append(" FROM "); sb.append(" senInfo"); try { Long count = qr.query(sb.toString(), new ScalarHandler<Long>()); return count.intValue(); }catch(Exception e) { LogUtils.getLogger(SenInfoDao.class.getName(), "error", e.toString()); } return 0; }
再获取每页对应的数据:
QueryRunner qr = DBUtils.getQueryRunner(); @Override public List<SenInfo> getAllSenInfo(PageBean<SenInfo> pageBean) { int totalCount = this.getTotalCount(); pageBean.setTotalCount(totalCount); if(pageBean.getCurrentPage() <= 0) { pageBean.setCurrentPage(1); }else if(pageBean.getCurrentPage() > pageBean.getTotalPage()) { pageBean.setCurrentPage(pageBean.getTotalPage()); } //获取当前页:计算查询的起始行,返回的行数 int currentPage = pageBean.getCurrentPage(); int index = (currentPage - 1) * pageBean.getPageCount(); //查询起始行 int count = pageBean.getPageCount(); //每页显示的行数 List<Object> list = new ArrayList<Object>(); StringBuilder sb = new StringBuilder(); sb.append(" SELECT"); sb.append(" *"); sb.append(" FROM "); sb.append(" senInfo "); sb.append(" limit ?,? "); list.add(index); list.add(count); List<SenInfo> pageData = null; try { //根据当前页,查询当前页数据(一页数据) if(index >= 0) { pageData = qr.query(sb.toString(), new BeanListHandler<SenInfo>(SenInfo.class),list.toArray()); pageBean.setPageData(pageData); System.out.println("数据:"+pageData.toString()); } }catch(Exception e) { LogUtils.getLogger(SenInfoDao.class.getName(), "error", e.toString()); } return pageData; }
其中的实质内容在于mysql的语句,mysql分页语句如下:
Select * from 表名 limit startrow,pagesize
(Pagesize为每页显示的记录条数)
附:数据库分页查询语句:
1.oracle数据库分页 select * from (select a.*,rownum rc from 表名 where rownum<=endrow) a where a.rc>=startrow2.DB2数据库分页 Select * from (select rownumber() over() as rc,a.* from (select * from 表名 order by列名) as a) where rc between startrow and endrow3.SQL Server 2000数据库分页 Select top pagesize * from 表名 where 列名 not in(select top pagesize*page 列名 from 表名 order by列名) order by列名4.SQL Server 2005数据库分页 Select * from (select 列名,row_number() over(order by 列名1) as 别名from 表名) as t where t.列名1>=startrow and t.列名1<=endrow5.MySQL数据库分页 Select * from 表名 limit startrow,pagesize (Pagesize为每页显示的记录条数)6.PostgreSQL数据库分页 Select * from 表名 limit pagesize,offset startrow (Pagesize为每页显示的记录条数)
总结:上述标准展示了MVC的调用方法,具体代码就不再过多显示。
代码有何不懂,可以跟帖回问。仅供参考!
阅读全文
0 0
- servlet+mvc实现分页显示列表页
- MVC分层+JDBC+数据库+Servlet实现JSP文件上传和显示+模糊查询+分页
- servlet实现的页码显示分页
- Servlet——实现数据分页显示
- Django前端实现列表分页显示
- MVC 列表分页 Partial内容页
- 【Servlet】【ajax】分页显示
- 分页显示列表实例
- MVC数据列表显示
- servlet与javabean实现长文本数据分页显示
- servlet+JDBC实现登录 增删查改 分页显示
- 织梦列表页分页错位(分页显示竖排)
- 【Struts2】用Struts2实现列表显示和分页功能
- Servlet监听-------------例子:显示在线列表,实现踢人功能
- jquery列表页悬浮显示图片 分页显示
- servlet 实现分页
- Mysql+servlet实现分页
- 通过servlet实现分页
- 初识arm
- 普及练习场 贪心 合并果子
- 【Spring+SpringMVC+MyBatis深入学习及搭建】05.动态sql
- hdoj 1084 What Is Your Grade?(sort函数按规则排序结构体数组)
- 文章标题
- servlet+mvc实现分页显示列表页
- 用百度地图的API画多边形,并在多边形中加入文本标注
- 前端案例--纯css动画transform视距3D旋转
- js 页面history.back()返回上一页,ios 不重新加载ready的解决办法
- Unity API——Application类的详解(二):数据文件路径
- C语言中调用LUA(1)
- leetcode-698. Partition to K Equal Sum Subsets
- 理解偏差、方差
- RabbitMQ 之七 TTL与Dead lettering