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方法,里面的代码应该很好理解。