MVC模式实现分页功能



 

    MVC模式使得应用程序的输入输出处理分割开来。本文是在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方法,里面的代码应该很好理解。

  

    

相关推荐