MVC模式实现分页功能
MVC模式使得应用程序的输入输出处理分割开来。本文是在MVC模式下为实现了的图书管理系统增加一个分页功能,以满足个性化的需求而且不需要大规模地修改代码。
效果:
点击首页
点击下一页
第一步:在接口里增加两个方法,
public Interface BookService{ // ................................ ................................. int getRecordSize(); List<Book> getBookListByPage(int pageNow,int pageSize); }
a、上面的接口有很多方法,用。。。。。表示,本次添加这两个方法,来实现分页的目的。
b、接口里面的方法都是public abstract 的,可以省略不写。
c、第一个方法是得到记录数,从表中查找;第二个方法是得到某一页的记录数,它必须提供当前是第几页(pageNow),pageSize(每页的记录条数)。来得到对应的,List集合。(注意不要用set集合,因为它是无序的)
第二步:在实现接口的类里面实现这两个方法
public class BookServiceImpl implements BookService{ Dbconnection db=new Dbconnection(); ResultSet rs=null; public int getRecordSize() {//使用sql语句得到记录数 // TODO Auto-generated method stub int count=0; String strSql="select count(*) from bookbiao2"; rs=db.executeQuery(strSql); try { while(rs.next()){ count=rs.getInt(1); break; } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return count; } public List<Book> getBookListByPage(int pageNow, int pageSize) { // TODO Auto-generated method stub List<Book> books=new ArrayList<Book>(); String strSql="select top "+pageSize+" * from bookbiao2 where " +"bookID not in (select top "+(pageNow-1)*pageSize+" bookID from bookbiao2)"; rs=db.executeQuery(strSql); try { while(rs.next()){ Book book=new Book(); book.setBookID(rs.getInt("BookID")); book.setIsbn(rs.getString("Isbn")); book.setTitle(rs.getString("Title")); book.setPrice(rs.getString("Price")); books.add(book); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return books; } //实现其它方法 。。。。。。。。 。。。。。。。。。 }
分析
a、成员变量,是ResultSet。多条记录,可以查api文档。类似于android
SQLite里面的cursour一样。
b、Dbconnection是一个工具类,它实现了用jdbc连接数据库的方法。而jdbc是sun公司提供的规范,sqlserver实现了这些规范(我们在使用eclipse连数据库时要加载驱动)。
c、getRecordSize(),通过rs.next对记录遍历,统计出了记录的多少。
d、getBookListByPage(int pageNow, int pageSize)
sql语句的解读为在bookbiao选择前pageSize行,且主键bookid不在前pagenow-1行里。
3、接下来,在核心代码实现后就要关心如果在界面层里操作,然后你的操作会返回到核心代码里进行处理了。(利用struts2框架,也近似与MVC)
a、jsp页面里,有四个链接
<a href='<s:url action="Page" ><s:param name="pageNow" value="1"/></s:url>'>首页</a> <a href='<s:url action="Page" ><s:param name="pageNow" value="pageNow-1"/></s:url>'>上一页</a> <a href='<s:url action="Page" ><s:param name="pageNow" value="pageNow+1"/></s:url>'>下一页</a> <a href='<s:url action="Page" ><s:param name="pageNow" value="pageCount"/></s:url>'>末页</a>
b、struts2.xml
<action name="Page" class="com.lin.test.BookManagementAction" method="getBooksByPage"> <result name="success" >/boolcurp/BookList.jsp</result> <result name="fail">/error.jsp</result> </action>
解读为:点击某个链接,会到Action为Page里的struts2.xml里查找,并且传递出了一个参数,最后找到对应的方法处理,界面也会跳转到result节点给的路径。名字必须统一为pageNow这样在java代码里才能保证是对同一个数据进行操作。而value的值也很好理解:首页,上一页,下一页,末页。
c、最后需要的就是在BookManagementAction里面完成struts2里面给Page的处理方法getBooksByPage
package com.lin.test; public class BookManagementAction{ int pageSize=3;//每一页显示了集团记录 int recordSize=0;//这个表一共有多少条记录 int pageCount=0;//一共有多少页 int pageNow=1;//当前是第几页 public int getPageCount() { return pageCount; } public void setPageCount(int pageCount) { this.pageCount = pageCount; } public int getPageNow() { return pageNow; } public void setPageNow(int pageNow) { this.pageNow = pageNow; } public String getBooksByPage(){ recordSize=bs.getRecordSize();// if(recordSize*pageSize==0){//通过总记录和每页的记录数,得到页数 pageCount=recordSize/pageSize; }else{ pageCount=recordSize/pageSize+1; } if(pageNow<1){//防止越界 pageNow=1; } if(pageNow>pageCount){ pageNow=pageCount; } booksList=bs.getBookListByPage(pageNow,pageSize); if(booksList.size()!=0){ str="success"; } return str; } }
分析:pageNow和pageCount,是在jsp里引入了的,所以设计getset方法,里面的代码应该很好理解。